@@ -38,12 +38,22 @@ predicate associatedTypeParameterInherited(
3838 name = a .getName ( )
3939}
4040
41+ private predicate isNestedType ( Member m , Identifier nested , ClassLikeDeclaration parent ) {
42+ // exists(nested.getNameNode()) and
43+ // exists(Member m |
44+ exists ( parent .getNameNode ( ) ) and
45+ nested = m .getNameNode ( ) and
46+ m = parent .getAMemberIncludingExtensions ( )
47+ // )
48+ }
49+
4150cached
4251newtype TType =
4352 TClassLikeDeclarationType ( ClassLikeDeclaration c ) {
4453 CachedStage:: ref ( ) and
4554 exists ( c .getNameNode ( ) )
4655 } or
56+ TAliasType ( TypeAliasDeclaration alias ) or
4757 TClosureParameterPseudoType ( Parameter p ) {
4858 exists ( FunctionExpr fe |
4959 p = fe .getAParameter ( ) and
@@ -56,6 +66,14 @@ newtype TType =
5666 ) {
5767 associatedTypeParameter ( c , a , inherited )
5868 } or
69+ TParentTypeParameterType ( Member m ) {
70+ isNestedType ( m , _, _) and
71+ (
72+ exists ( m .( ClassLikeDeclaration ) .getNameNode ( ) )
73+ or
74+ m instanceof TypeAliasDeclaration
75+ )
76+ } or
5977 TUnknownType ( ) or
6078 TUnknownTypeTypeParameter ( int i ) { i in [ 0 .. 20 ] }
6179
@@ -78,7 +96,14 @@ abstract private class TypeImpl extends TType {
7896 * This includes both positional type parameters and synthetic type parameters,
7997 * such as associated types.
8098 */
81- TypeParameter getATypeParameter ( ) { result = this .getPositionalTypeParameter ( _) }
99+ TypeParameter getATypeParameter ( ) {
100+ result = this .getPositionalTypeParameter ( _)
101+ or
102+ exists ( Member m |
103+ result = TParentTypeParameterType ( m ) and
104+ isNestedType ( m , this .getNameNode ( ) , _)
105+ )
106+ }
82107
83108 /** Gets the name node of this type, if any. */
84109 abstract Identifier getNameNode ( ) ;
@@ -117,11 +142,29 @@ class ClassLikeDeclarationType extends TypeImpl, TClassLikeDeclarationType {
117142 result = TAssociatedTypeParameterType ( c , _, _)
118143 }
119144
120- override string toString ( ) { result = c .getName ( ) }
145+ override string toString ( ) { result = c .getQualifiedName ( ) }
121146
122147 override Location getLocation ( ) { result = c .getLocation ( ) }
123148}
124149
150+ class AliasType extends TypeImpl , TAliasType {
151+ TypeAliasDeclaration alias ;
152+
153+ AliasType ( ) { this = TAliasType ( alias ) }
154+
155+ TypeAliasDeclaration getTypeAliasDeclaration ( ) { result = alias }
156+
157+ override Identifier getNameNode ( ) { result = alias .getNameNode ( ) }
158+
159+ override TypeParameter getPositionalTypeParameter ( int i ) {
160+ result = TTypeParameterType ( alias .getTypeParameter ( i ) )
161+ }
162+
163+ override string toString ( ) { result = alias .getQualifiedName ( ) }
164+
165+ override Location getLocation ( ) { result = alias .getLocation ( ) }
166+ }
167+
125168/**
126169 * A pseudo type that does not correspond to any concrete type in the source code.
127170 */
@@ -159,13 +202,16 @@ class ClosureParameterPseudoType extends PseudoType, TClosureParameterPseudoType
159202
160203/** A type parameter. */
161204abstract class TypeParameter extends TypeImpl {
205+ abstract AstNode getScope ( ) ;
206+
162207 override TypeParameter getPositionalTypeParameter ( int i ) { none ( ) }
163208
164209 abstract AstNode getDeclaringItem ( ) ;
165210}
166211
167212private class IdAstNode =
168- @unified_type_parameter or @unified_class_like_declaration or @unified_associated_type_declaration;
213+ @unified_type_parameter or @unified_class_like_declaration or
214+ @unified_associated_type_declaration or @unified_member;
169215
170216private predicate id ( IdAstNode x , IdAstNode y ) { x = y }
171217
@@ -181,6 +227,12 @@ class TypeParameterType extends TypeParameter, TTypeParameterType {
181227
182228 Unified:: TypeParameter getTypeParameter ( ) { result = typeParam }
183229
230+ override AstNode getScope ( ) {
231+ result = typeParam .getParent ( )
232+ or
233+ result .( ClassLikeDeclaration ) .resolve ( ) .getEnclosingClassResolved * ( ) = typeParam .getParent ( )
234+ }
235+
184236 override ClassLikeDeclaration getDeclaringItem ( ) { typeParam = result .getATypeParameter ( ) }
185237
186238 override Identifier getNameNode ( ) { result = typeParam .getNameNode ( ) }
@@ -202,6 +254,8 @@ class AssociatedTypeParameterType extends TypeParameter, TAssociatedTypeParamete
202254
203255 Unified:: AssociatedTypeDeclaration getAssociatedTypeDeclaration ( ) { result = assocTypeDecl }
204256
257+ override AstNode getScope ( ) { result .( ClassLikeDeclaration ) .resolve ( ) = c }
258+
205259 override ClassLikeDeclaration getDeclaringItem ( ) { result = c }
206260
207261 override Identifier getNameNode ( ) { result = assocTypeDecl .getNameNode ( ) }
@@ -217,6 +271,35 @@ class AssociatedTypeParameterType extends TypeParameter, TAssociatedTypeParamete
217271 }
218272}
219273
274+ /**
275+ * A special type parameter used to represent the parent type of a nested class.
276+ */
277+ class ParentTypeParameterType extends TypeParameter , TParentTypeParameterType {
278+ private Member m ;
279+
280+ ParentTypeParameterType ( ) { this = TParentTypeParameterType ( m ) }
281+
282+ ClassLikeDeclaration getParent ( ) { isNestedType ( m , _, result ) }
283+
284+ Type getChild ( ) {
285+ result .( ClassLikeDeclarationType ) .getClassLikeDeclaration ( ) = m
286+ or
287+ result .( AliasType ) .getTypeAliasDeclaration ( ) = m
288+ }
289+
290+ Member getMember ( ) { result = m }
291+
292+ override AstNode getScope ( ) { none ( ) }
293+
294+ override Member getDeclaringItem ( ) { result = m }
295+
296+ override Identifier getNameNode ( ) { none ( ) }
297+
298+ override string toString ( ) { result = "(parent:" + m .getNameOrFallback ( ) + ")" }
299+
300+ override Location getLocation ( ) { result = m .getLocation ( ) }
301+ }
302+
220303/**
221304 * A type parameter of the special `UnknownType`.
222305 */
@@ -225,6 +308,8 @@ class UnknownTypeTypeParameter extends TypeParameter, TUnknownTypeTypeParameter
225308
226309 UnknownTypeTypeParameter ( ) { this = TUnknownTypeTypeParameter ( i ) }
227310
311+ override AstNode getScope ( ) { none ( ) }
312+
228313 override AstNode getDeclaringItem ( ) { none ( ) }
229314
230315 override Identifier getNameNode ( ) { none ( ) }
0 commit comments