Skip to content

Commit ecdcc8b

Browse files
authored
Merge pull request #23 from lstreckeisen/CMI-84-Write-Semantic-Token-Tests-for-Language-Server
add tests for semantic token generation
2 parents ccb1db0 + 248a856 commit ecdcc8b

33 files changed

+2696
-409
lines changed

src/language/context-mapper-dsl.langium

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@ grammar ContextMapperDsl
22

33
terminal ID: /[_a-zA-Z][\w_]*/;
44
terminal STRING: /"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/;
5-
terminal ML_COMMENT: /\/\*[\s\S]*?\*\//;
6-
terminal SL_COMMENT: /\/\/[^\n\r]*/;
75

86
terminal OPEN: '{';
97
terminal CLOSE: '}';
108

119
hidden terminal WS: /\s+/;
12-
hidden terminal HIDDEN_ML_COMMENT: ML_COMMENT;
13-
hidden terminal HIDDEN_SL_COMMENT: SL_COMMENT;
10+
hidden terminal ML_COMMENT: /\/\*[\s\S]*?\*\//;
11+
hidden terminal SL_COMMENT: /\/\/[^\n\r]*/;
1412

1513
entry ContextMappingModel:
1614
(
@@ -169,7 +167,7 @@ CustomerSupplierRelationship:
169167
(OPEN
170168
(
171169
('implementationTechnology' ('=')? implementationTechnology=STRING) &
172-
(('exposedAggregates' ('=')? upstreamExposedAggregates+=[Aggregate]) ("," upstreamExposedAggregates+=[Aggregate])* (exposedAggregatesComment=SL_COMMENT)?) &
170+
(('exposedAggregates' ('=')? upstreamExposedAggregates+=[Aggregate]) ("," upstreamExposedAggregates+=[Aggregate])*) &
173171
('downstreamRights' ('=')? downstreamGovernanceRights=DownstreamGovernanceRights)
174172
)
175173
CLOSE)?
@@ -182,8 +180,8 @@ Aggregate:
182180
(
183181
(('responsibilities' ('=')? responsibilities+=STRING) ("," responsibilities+=STRING)*) &
184182
(
185-
(('useCases' ('=')? userRequirements+=[UseCase]) ("," userRequirements+=[UseCase])*) |
186-
(('userStories' ('=')? userRequirements+=[UserStory]) ("," userRequirements+=[UserStory])*) |
183+
(('useCases' ('=')? useCases+=[UseCase]) ("," useCases+=[UseCase])*) |
184+
(('userStories' ('=')? userStories+=[UserStory]) ("," userStories+=[UserStory])*) |
187185
((('features' | 'userRequirements') ('=')? userRequirements+=[UserRequirement]) ("," userRequirements+=[UserRequirement])*)
188186
) &
189187
('owner' ('=')? owner=[BoundedContext]) &

src/language/semantictokens/HighlightingHelper.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ export function highlightKeyword (node: AstNode, acceptor: SemanticTokenAcceptor
1818
})
1919
}
2020

21+
export function highlightOperator (node: AstNode, acceptor: SemanticTokenAcceptor, operator: string) {
22+
acceptor({
23+
node,
24+
type: SemanticTokenTypes.operator,
25+
keyword: operator
26+
})
27+
}
28+
2129
export function highlightType (node: AstNode, acceptor: SemanticTokenAcceptor, property: string, modifiers: string[] = []) {
2230
acceptor({
2331
node,

src/language/semantictokens/boundedContext/AggregateSemanticTokenProvider.ts

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Aggregate, isAggregate, isUseCase, isUserRequirement, isUserStory } from '../../generated/ast.js'
1+
import { Aggregate, isAggregate } from '../../generated/ast.js'
22
import { SemanticTokenAcceptor } from 'langium/lsp'
33
import { SemanticTokenTypes } from 'vscode-languageserver-types'
44
import { highlightField, highlightString, highlightTypeDeclaration } from '../HighlightingHelper.js'
@@ -22,7 +22,15 @@ export class AggregateSemanticTokenProvider implements ContextMapperSemanticToke
2222
}
2323

2424
if (node.userRequirements.length > 0) {
25-
this.highlightUserRequirements(node, acceptor)
25+
highlightField(node, acceptor, ['userRequirements', 'features'], 'userRequirements', SemanticTokenTypes.type)
26+
}
27+
28+
if (node.useCases.length > 0) {
29+
highlightField(node, acceptor, ['useCases'], 'useCases', SemanticTokenTypes.type)
30+
}
31+
32+
if (node.userStories.length > 0) {
33+
highlightField(node, acceptor, ['userStories'], 'userStories', SemanticTokenTypes.type)
2634
}
2735

2836
if (node.owner) {
@@ -53,10 +61,6 @@ export class AggregateSemanticTokenProvider implements ContextMapperSemanticToke
5361
highlightField(node, acceptor, ['storageSimilarity'], 'storageSimilarity')
5462
}
5563

56-
if (node.storageSimilarity) {
57-
highlightField(node, acceptor, ['storageSimilarity'], 'storageSimilarity')
58-
}
59-
6064
if (node.securityCriticality) {
6165
highlightField(node, acceptor, ['securityCriticality'], 'securityCriticality')
6266
}
@@ -69,18 +73,4 @@ export class AggregateSemanticTokenProvider implements ContextMapperSemanticToke
6973
highlightField(node, acceptor, ['securityAccessGroup'], 'securityAccessGroup', SemanticTokenTypes.string)
7074
}
7175
}
72-
73-
private highlightUserRequirements (node: Aggregate, acceptor: SemanticTokenAcceptor) {
74-
const keywords = []
75-
if (isUseCase(node.userRequirements[0])) {
76-
keywords.push('useCases')
77-
} else if (isUserRequirement(node.userRequirements[0])) {
78-
keywords.push('userRequirements')
79-
keywords.push('features')
80-
} else if (isUserStory(node.userRequirements[0])) {
81-
keywords.push('userStories')
82-
}
83-
84-
highlightField(node, acceptor, keywords, 'userRequirements', SemanticTokenTypes.type)
85-
}
8676
}

0 commit comments

Comments
 (0)