11package com .sourcegraph .semanticdb_javac ;
22
3- import com .sun .tools .javac .code .Symbol ;
4-
53import javax .lang .model .element .Element ;
64import javax .lang .model .element .ElementKind ;
75import javax .lang .model .element .ExecutableElement ;
8- import java .util .*;
6+ import javax .lang .model .element .TypeElement ;
7+ import javax .lang .model .element .PackageElement ;
8+ import javax .lang .model .element .TypeParameterElement ;
9+ import javax .lang .model .element .VariableElement ;
10+ import javax .lang .model .element .QualifiedNameable ;
11+ import java .util .IdentityHashMap ;
12+ import java .util .ArrayList ;
913
1014import static com .sourcegraph .semanticdb_javac .Debugging .pprint ;
1115
1216/** Cache of SemanticDB symbols that can be referenced between files. */
1317public final class GlobalSymbolsCache {
1418
15- private final IdentityHashMap <Symbol , String > globals = new IdentityHashMap <>();
19+ private final IdentityHashMap <Element , String > globals = new IdentityHashMap <>();
1620 private final SemanticdbJavacOptions options ;
1721
1822 public GlobalSymbolsCache (SemanticdbJavacOptions options ) {
1923 this .options = options ;
2024 }
2125
22- public String semanticdbSymbol (Symbol sym , LocalSymbolsCache locals ) {
26+ public String semanticdbSymbol (Element sym , LocalSymbolsCache locals ) {
2327 String result = globals .get (sym );
2428 if (result != null ) return result ;
2529 String localResult = locals .get (sym );
@@ -31,33 +35,48 @@ public String semanticdbSymbol(Symbol sym, LocalSymbolsCache locals) {
3135 return result ;
3236 }
3337
34- public String semanticdbSymbol (Element element , LocalSymbolsCache locals ) {
35- return semanticdbSymbol ((Symbol ) element , locals );
36- }
37-
38- public boolean isNone (Symbol sym ) {
38+ public boolean isNone (Element sym ) {
3939 return sym == null ;
4040 }
4141
42- private String uncachedSemanticdbSymbol (Symbol sym , LocalSymbolsCache locals ) {
43- if ( isNone ( sym )) return SemanticdbSymbols . NONE ;
44- String owner = semanticdbSymbol ( sym . owner , locals ) ;
45- if (owner . equals ( SemanticdbSymbols . NONE )) {
42+ private String uncachedSemanticdbSymbol (Element sym , LocalSymbolsCache locals ) {
43+
44+ if ( isNone ( sym )) return SemanticdbSymbols . ROOT_PACKAGE ;
45+ if (sym instanceof PackageElement && (( PackageElement ) sym ). isUnnamed ())
4646 return SemanticdbSymbols .ROOT_PACKAGE ;
47- } else if (SemanticdbSymbols .isLocal (owner ) || isAnonymousClass (sym ) || isLocalVariable (sym )) {
47+ String owner = semanticdbSymbol (sym .getEnclosingElement (), locals );
48+
49+ if (SemanticdbSymbols .isLocal (owner ) || isAnonymousClass (sym ) || isLocalVariable (sym )) {
4850 return locals .put (sym );
4951 }
52+
53+ if (sym instanceof PackageElement ) {
54+ StringBuilder sb = new StringBuilder ();
55+ String qualifiedName = ((PackageElement ) sym ).getQualifiedName ().toString ();
56+ String [] names = qualifiedName .split ("\\ ." );
57+ for (String name : names ) {
58+ if (name .length () > 0 ) {
59+ SemanticdbSymbols .Descriptor desc =
60+ new SemanticdbSymbols .Descriptor (SemanticdbSymbols .Descriptor .Kind .Package , name );
61+ sb .append (desc .encode ());
62+ }
63+ }
64+
65+ return sb .toString ();
66+ }
5067 SemanticdbSymbols .Descriptor desc = semanticdbDescriptor (sym );
5168 if (options .verboseEnabled && desc .kind == SemanticdbSymbols .Descriptor .Kind .None ) {
52- pprint (sym .getQualifiedName ().toString ());
69+ if (sym instanceof QualifiedNameable )
70+ pprint (((QualifiedNameable ) sym ).getQualifiedName ().toString ());
71+ else pprint (sym .getSimpleName ().toString ());
5372 pprint (
5473 String .format (
5574 "sym: %s (%s - superclass %s)" , sym , sym .getClass (), sym .getClass ().getSuperclass ()));
5675 }
5776 return SemanticdbSymbols .global (owner , desc );
5877 }
5978
60- private boolean isLocalVariable (Symbol sym ) {
79+ private boolean isLocalVariable (Element sym ) {
6180 switch (sym .getKind ()) {
6281 case PARAMETER :
6382 case EXCEPTION_PARAMETER :
@@ -68,28 +87,25 @@ private boolean isLocalVariable(Symbol sym) {
6887 }
6988 }
7089
71- private boolean isAnonymousClass (Symbol sym ) {
72- return sym instanceof Symbol . ClassSymbol && sym .name . isEmpty () ;
90+ private boolean isAnonymousClass (Element sym ) {
91+ return sym instanceof TypeElement && sym .getSimpleName (). length () == 0 ;
7392 }
7493
75- private SemanticdbSymbols .Descriptor semanticdbDescriptor (Symbol sym ) {
76- if (sym instanceof Symbol . ClassSymbol ) {
94+ private SemanticdbSymbols .Descriptor semanticdbDescriptor (Element sym ) {
95+ if (sym instanceof TypeElement ) {
7796 return new SemanticdbSymbols .Descriptor (
78- SemanticdbSymbols .Descriptor .Kind .Type , sym .name .toString ());
79- } else if (sym instanceof Symbol . MethodSymbol ) {
97+ SemanticdbSymbols .Descriptor .Kind .Type , sym .getSimpleName () .toString ());
98+ } else if (sym instanceof ExecutableElement ) {
8099 return new SemanticdbSymbols .Descriptor (
81100 SemanticdbSymbols .Descriptor .Kind .Method ,
82- sym .name .toString (),
83- methodDisambiguator ((Symbol .MethodSymbol ) sym ));
84- } else if (sym instanceof Symbol .PackageSymbol ) {
85- return new SemanticdbSymbols .Descriptor (
86- SemanticdbSymbols .Descriptor .Kind .Package , sym .name .toString ());
87- } else if (sym instanceof Symbol .TypeVariableSymbol ) {
101+ sym .getSimpleName ().toString (),
102+ methodDisambiguator ((ExecutableElement ) sym ));
103+ } else if (sym instanceof TypeParameterElement ) {
88104 return new SemanticdbSymbols .Descriptor (
89- SemanticdbSymbols .Descriptor .Kind .TypeParameter , sym .name .toString ());
90- } else if (sym instanceof Symbol . VarSymbol ) {
105+ SemanticdbSymbols .Descriptor .Kind .TypeParameter , sym .getSimpleName () .toString ());
106+ } else if (sym instanceof VariableElement ) {
91107 return new SemanticdbSymbols .Descriptor (
92- SemanticdbSymbols .Descriptor .Kind .Term , sym .name .toString ());
108+ SemanticdbSymbols .Descriptor .Kind .Term , sym .getSimpleName () .toString ());
93109 } else {
94110 return SemanticdbSymbols .Descriptor .NONE ;
95111 }
@@ -113,11 +129,11 @@ private SemanticdbSymbols.Descriptor semanticdbDescriptor(Symbol sym) {
113129 * <p><a href="https://scalameta.org/docs/semanticdb/specification.html#symbol-2">Link to
114130 * SemanticDB spec</a>.
115131 */
116- private String methodDisambiguator (Symbol . MethodSymbol sym ) {
117- Iterable <? extends Element > elements = sym .owner .getEnclosedElements ();
132+ private String methodDisambiguator (ExecutableElement sym ) {
133+ Iterable <? extends Element > elements = sym .getEnclosingElement () .getEnclosedElements ();
118134 ArrayList <ExecutableElement > methods = new ArrayList <>();
119135 for (Element e : elements ) {
120- if (e instanceof ExecutableElement && e .getSimpleName () == sym .name ) {
136+ if (e instanceof ExecutableElement && e .getSimpleName () == sym .getSimpleName () ) {
121137 methods .add ((ExecutableElement ) e );
122138 }
123139 }
0 commit comments