@@ -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
2529import { type TypedObjectWrapper , type WrapperFactoryProvider } from '../ast' ;
2630import {
@@ -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' ;
4046import {
@@ -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