Skip to content

Commit 7eb1f4d

Browse files
committed
override default behavior of langium folding provider, so the first line of a block remains visible
1 parent a1e17a4 commit 7eb1f4d

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

src/language/ContextMapperDslModule.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { SemanticTokenProviderRegistry } from './semantictokens/SemanticTokenPro
1414
import { ContextMapperDslValidationRegistry } from './validation/ContextMapperDslValidationRegistry.js'
1515
import { ContextMapperValidationProviderRegistry } from './validation/ContextMapperValidationProviderRegistry.js'
1616
import { ContextMapperDslScopeProvider } from './references/ContextMapperDslScopeProvider.js'
17+
import { ContextMapperDslFoldingRangeProvider } from './folding/ContextMapperDslFoldingRageProvider.js'
1718

1819
/**
1920
* Declaration of custom services - add your own service classes here.
@@ -47,7 +48,8 @@ export const ContextMapperDslModule: Module<ContextMapperDslServices, ModuleType
4748
ValidationRegistry: (services) => new ContextMapperDslValidationRegistry(services)
4849
},
4950
lsp: {
50-
SemanticTokenProvider: (services) => new ContextMapperDslSemanticTokenProvider(services, semanticTokenProviderRegistry)
51+
SemanticTokenProvider: (services) => new ContextMapperDslSemanticTokenProvider(services, semanticTokenProviderRegistry),
52+
FoldingRangeProvider: (services) => new ContextMapperDslFoldingRangeProvider(services)
5153
},
5254
references: {
5355
ScopeProvider: (services) => new ContextMapperDslScopeProvider(services)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { DefaultFoldingRangeProvider } from 'langium/lsp'
2+
import { CstNode, LangiumDocument } from 'langium'
3+
import { FoldingRange } from 'vscode-languageserver-types'
4+
5+
export class ContextMapperDslFoldingRangeProvider extends DefaultFoldingRangeProvider {
6+
// modified version of DefaultFoldingRangeProvider#toFoldingRange
7+
protected override toFoldingRange (document: LangiumDocument, node: CstNode, kind?: string): FoldingRange | undefined {
8+
const range = node.range
9+
let start = range.start
10+
let end = range.end
11+
12+
// Don't generate foldings for nodes that are less than 3 lines
13+
if (end.line - start.line < 2) {
14+
return undefined
15+
}
16+
17+
if (!this.includeLastFoldingLine(node, kind)) { // checks if block is parenthesis/bracket/brace block
18+
// To prevent something like '...}' in the editor when a code block is collapsed, we want to still show the first line of a code block
19+
start = document.textDocument.positionAt(document.textDocument.offsetAt({ line: start.line + 1, character: 0 }) - 1)
20+
// As we don't want to hide the end token like 'if { ... --> } <--', we simply select the end of the previous line as the end position
21+
end = document.textDocument.positionAt(document.textDocument.offsetAt({ line: end.line, character: 0 }) - 1)
22+
}
23+
return FoldingRange.create(start.line, end.line, start.character, end.character, kind)
24+
}
25+
}

0 commit comments

Comments
 (0)