Skip to content

Commit 334d83d

Browse files
committed
feat(lsp): Add completion for value type contraint references
1 parent 46420de commit 334d83d

File tree

1 file changed

+40
-1
lines changed

1 file changed

+40
-1
lines changed

libs/language-server/src/lib/lsp/jayvee-completion-provider.ts

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ import {
2020
DefaultCompletionProvider,
2121
type NextFeature,
2222
} from 'langium/lsp';
23-
import { CompletionItemKind, type Range } from 'vscode-languageserver';
23+
import {
24+
CompletionItemKind,
25+
type CompletionItemLabelDetails,
26+
type Range,
27+
} from 'vscode-languageserver';
2428

2529
import { type TypedObjectWrapper, type WrapperFactoryProvider } from '../ast';
2630
import {
@@ -29,12 +33,14 @@ import {
2933
type ImportDefinition,
3034
PropertyAssignment,
3135
type PropertyBody,
36+
type ValueTypeConstraintReference,
3237
ValueTypeReference,
3338
isBlockDefinition,
3439
isImportDefinition,
3540
isJayveeModel,
3641
isPropertyAssignment,
3742
isPropertyBody,
43+
isValueTypeConstraintReference,
3844
isValuetypeDefinition,
3945
} from '../ast/generated/ast';
4046
import {
@@ -77,6 +83,17 @@ export class JayveeCompletionProvider extends DefaultCompletionProvider {
7783
return this.completionForValuetype(context, acceptor);
7884
}
7985

86+
const isValueTypeConstraintReferenceCompletion =
87+
isValueTypeConstraintReference(astNode) &&
88+
next.property === 'attribute';
89+
if (isValueTypeConstraintReferenceCompletion) {
90+
return this.completionForValueTypeConstraintReference(
91+
astNode,
92+
context,
93+
acceptor,
94+
);
95+
}
96+
8097
const isFirstPropertyCompletion =
8198
isPropertyBody(astNode) && next.type === PropertyAssignment;
8299
const isOtherPropertyCompletion =
@@ -153,6 +170,28 @@ export class JayveeCompletionProvider extends DefaultCompletionProvider {
153170
});
154171
}
155172

173+
private completionForValueTypeConstraintReference(
174+
astNode: ValueTypeConstraintReference,
175+
context: CompletionContext,
176+
acceptor: CompletionAcceptor,
177+
) {
178+
const property = astNode.$container.attribute;
179+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
180+
if (property !== undefined && property.name !== undefined) {
181+
const proptertyTypeName = property.valueType.reference.ref?.name;
182+
const labelDetails: CompletionItemLabelDetails =
183+
proptertyTypeName !== undefined
184+
? { detail: ` oftype ${proptertyTypeName}` }
185+
: {};
186+
acceptor(context, {
187+
label: property.name,
188+
labelDetails: labelDetails,
189+
kind: CompletionItemKind.Reference,
190+
detail: '(valueType property)',
191+
});
192+
}
193+
}
194+
156195
private completionForPropertyName(
157196
astNode: PropertyBody | PropertyAssignment,
158197
context: CompletionContext,

0 commit comments

Comments
 (0)