@@ -13,6 +13,7 @@ import {
13
13
isSdsCallable ,
14
14
isSdsClass ,
15
15
isSdsEnum ,
16
+ isSdsEnumVariant ,
16
17
isSdsLambda ,
17
18
isSdsMemberAccess ,
18
19
isSdsMemberType ,
@@ -23,6 +24,7 @@ import {
23
24
isSdsReference ,
24
25
isSdsSegment ,
25
26
isSdsStatement ,
27
+ isSdsTypeArgument ,
26
28
isSdsYield ,
27
29
SdsDeclaration ,
28
30
SdsExpression ,
@@ -33,6 +35,7 @@ import {
33
35
SdsReference ,
34
36
SdsStatement ,
35
37
SdsType ,
38
+ SdsTypeArgument ,
36
39
SdsYield ,
37
40
} from '../generated/ast.js' ;
38
41
import {
@@ -42,6 +45,7 @@ import {
42
45
parametersOrEmpty ,
43
46
resultsOrEmpty ,
44
47
statementsOrEmpty ,
48
+ typeParametersOrEmpty ,
45
49
} from '../helpers/shortcuts.js' ;
46
50
import { isContainedIn } from '../helpers/ast.js' ;
47
51
import { isStatic } from '../helpers/checks.js' ;
@@ -62,6 +66,8 @@ export class SafeDsScopeProvider extends DefaultScopeProvider {
62
66
} else {
63
67
return this . getScopeForDirectReferenceTarget ( node ) ;
64
68
}
69
+ } else if ( isSdsTypeArgument ( node ) && context . property === 'typeParameter' ) {
70
+ return this . getScopeForTypeArgumentTypeParameter ( node ) ;
65
71
} else if ( isSdsYield ( node ) && context . property === 'result' ) {
66
72
return this . getScopeForYieldResult ( node ) ;
67
73
} else {
@@ -291,6 +297,25 @@ export class SafeDsScopeProvider extends DefaultScopeProvider {
291
297
}
292
298
}
293
299
300
+ private getScopeForTypeArgumentTypeParameter ( node : SdsTypeArgument ) : Scope {
301
+ const containingNamedType = getContainerOfType ( node , isSdsNamedType ) ;
302
+ if ( ! containingNamedType ) {
303
+ /* c8 ignore next 2 */
304
+ return EMPTY_SCOPE ;
305
+ }
306
+
307
+ const namedTypeDeclaration = containingNamedType . declaration . ref ;
308
+ if ( isSdsClass ( namedTypeDeclaration ) ) {
309
+ const typeParameters = typeParametersOrEmpty ( namedTypeDeclaration . typeParameterList ) ;
310
+ return this . createScopeForNodes ( typeParameters ) ;
311
+ } else if ( isSdsEnumVariant ( namedTypeDeclaration ) ) {
312
+ const typeParameters = typeParametersOrEmpty ( namedTypeDeclaration . typeParameterList ) ;
313
+ return this . createScopeForNodes ( typeParameters ) ;
314
+ } else {
315
+ return EMPTY_SCOPE ;
316
+ }
317
+ }
318
+
294
319
private getScopeForYieldResult ( node : SdsYield ) : Scope {
295
320
const containingSegment = getContainerOfType ( node , isSdsSegment ) ;
296
321
if ( ! containingSegment ) {
0 commit comments