@@ -10,6 +10,7 @@ import {
1010 type LangiumDocument ,
1111 type LinkingError ,
1212 type Reference ,
13+ type ReferenceInfo ,
1314 interruptAndCheck ,
1415} from 'langium' ;
1516import { match } from 'ts-pattern' ;
@@ -93,31 +94,22 @@ export class ZModelLinker extends DefaultLinker {
9394 document . state = DocumentState . Linked ;
9495 }
9596
96- private linkReference (
97- container : AstNode ,
98- property : string ,
99- document : LangiumDocument ,
100- extraScopes : ScopeProvider [ ] ,
101- ) {
102- if ( this . resolveFromScopeProviders ( container , property , document , extraScopes ) ) {
97+ private linkReference ( refInfo : ReferenceInfo , document : LangiumDocument , extraScopes : ScopeProvider [ ] ) {
98+ if ( this . resolveFromScopeProviders ( refInfo . reference , document , extraScopes ) ) {
10399 return ;
104100 }
105-
106- const reference : DefaultReference = ( container as any ) [ property ] ;
107- this . doLink ( { reference, container, property } , document ) ;
101+ this . doLink ( refInfo , document ) ;
108102 }
109103
110104 //#endregion
111105
112106 //#region Expression type resolving
113107
114108 private resolveFromScopeProviders (
115- node : AstNode ,
116- property : string ,
109+ reference : DefaultReference ,
117110 document : LangiumDocument ,
118111 providers : ScopeProvider [ ] ,
119112 ) {
120- const reference : DefaultReference = ( node as any ) [ property ] ;
121113 for ( const provider of providers ) {
122114 const target = provider ( reference . $refText ) ;
123115 if ( target ) {
@@ -275,7 +267,7 @@ export class ZModelLinker extends DefaultLinker {
275267 }
276268
277269 private resolveInvocation ( node : InvocationExpr , document : LangiumDocument , extraScopes : ScopeProvider [ ] ) {
278- this . linkReference ( node , 'function' , document , extraScopes ) ;
270+ this . linkReference ( { reference : node . function , container : node , property : 'function' } , document , extraScopes ) ;
279271 node . args . forEach ( ( arg ) => this . resolve ( arg , document , extraScopes ) ) ;
280272 if ( node . function . ref ) {
281273 const funcDecl = node . function . ref as FunctionDecl ;
@@ -400,7 +392,7 @@ export class ZModelLinker extends DefaultLinker {
400392 if ( isArrayExpr ( node . value ) ) {
401393 node . value . items . forEach ( ( item ) => {
402394 if ( isReferenceExpr ( item ) ) {
403- const resolved = this . resolveFromScopeProviders ( item , ' target' , document , [ scopeProvider ] ) ;
395+ const resolved = this . resolveFromScopeProviders ( item . target , document , [ scopeProvider ] ) ;
404396 if ( resolved ) {
405397 this . resolveToDeclaredType ( item , ( resolved as DataField ) . type ) ;
406398 } else {
@@ -413,7 +405,7 @@ export class ZModelLinker extends DefaultLinker {
413405 this . resolveToBuiltinTypeOrDecl ( node . value , node . value . items [ 0 ] . $resolvedType . decl , true ) ;
414406 }
415407 } else if ( isReferenceExpr ( node . value ) ) {
416- const resolved = this . resolveFromScopeProviders ( node . value , ' target' , document , [ scopeProvider ] ) ;
408+ const resolved = this . resolveFromScopeProviders ( node . value . target , document , [ scopeProvider ] ) ;
417409 if ( resolved ) {
418410 this . resolveToDeclaredType ( node . value , ( resolved as DataField ) . type ) ;
419411 } else {
@@ -494,7 +486,9 @@ export class ZModelLinker extends DefaultLinker {
494486 }
495487
496488 private resolveDefault ( node : AstNode , document : LangiumDocument < AstNode > , extraScopes : ScopeProvider [ ] ) {
497- AstUtils . streamReferences ( node ) . forEach ( ( ref ) => this . doLink ( ref , document ) ) ;
489+ AstUtils . streamReferences ( node ) . forEach ( ( ref ) => {
490+ this . linkReference ( ref , document , extraScopes ) ;
491+ } ) ;
498492 for ( const child of AstUtils . streamContents ( node ) ) {
499493 this . resolve ( child , document , extraScopes ) ;
500494 }
0 commit comments