@@ -31,5 +31,50 @@ class CompilationUnit extends Element, File {
31
31
*/
32
32
Module getModule ( ) { cumodule ( this , result ) }
33
33
34
+ /**
35
+ * Gets a type which is available by its simple name in this compilation unit.
36
+ * Reasons for this can be:
37
+ * - The type is declared in this compilation unit as top-level type
38
+ * - The type is imported
39
+ * - The type is declared in the same package as this compilation unit
40
+ * - The type is declared in the package `java.lang`
41
+ */
42
+ ClassOrInterface getATypeAvailableBySimpleName ( ) {
43
+ // See "Shadowing", https://docs.oracle.com/javase/specs/jls/se17/html/jls-6.html#jls-6.4.1
44
+ // Note: Currently the logic below does not consider shadowing and might have multiple results
45
+ // with the same type name
46
+ result .( TopLevelType ) .getCompilationUnit ( ) = this
47
+ or
48
+ exists ( ImportStaticTypeMember importDecl |
49
+ importDecl .getCompilationUnit ( ) = this and
50
+ result = importDecl .getATypeImport ( )
51
+ )
52
+ or
53
+ exists ( ImportType importDecl |
54
+ importDecl .getCompilationUnit ( ) = this and
55
+ result = importDecl .getImportedType ( )
56
+ )
57
+ or
58
+ exists ( ImportStaticOnDemand importDecl |
59
+ importDecl .getCompilationUnit ( ) = this and
60
+ result = importDecl .getATypeImport ( )
61
+ )
62
+ or
63
+ exists ( ImportOnDemandFromType importDecl |
64
+ importDecl .getCompilationUnit ( ) = this and
65
+ result = importDecl .getAnImport ( )
66
+ )
67
+ or
68
+ exists ( ImportOnDemandFromPackage importDecl |
69
+ importDecl .getCompilationUnit ( ) = this and
70
+ result = importDecl .getAnImport ( )
71
+ )
72
+ or
73
+ // From same package or java.lang, see https://docs.oracle.com/javase/specs/jls/se17/html/jls-7.html
74
+ result .( TopLevelType ) .getPackage ( ) = this .getPackage ( )
75
+ or
76
+ result .( TopLevelType ) .getPackage ( ) .hasName ( "java.lang" )
77
+ }
78
+
34
79
override string getAPrimaryQlClass ( ) { result = "CompilationUnit" }
35
80
}
0 commit comments