langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacElements.java
changeset 42824 89b14017e8d6
parent 42407 f3702cff2933
child 42826 563b42fc70ba
equal deleted inserted replaced
42823:58864b03c7b9 42824:89b14017e8d6
    23  * questions.
    23  * questions.
    24  */
    24  */
    25 
    25 
    26 package com.sun.tools.javac.model;
    26 package com.sun.tools.javac.model;
    27 
    27 
       
    28 import java.util.LinkedHashSet;
    28 import java.util.Map;
    29 import java.util.Map;
       
    30 import java.util.Set;
    29 
    31 
    30 import javax.lang.model.SourceVersion;
    32 import javax.lang.model.SourceVersion;
    31 import javax.lang.model.element.*;
    33 import javax.lang.model.element.*;
    32 import javax.lang.model.type.DeclaredType;
    34 import javax.lang.model.type.DeclaredType;
    33 import javax.lang.model.util.Elements;
    35 import javax.lang.model.util.Elements;
    52 import com.sun.tools.javac.util.DefinedBy.Api;
    54 import com.sun.tools.javac.util.DefinedBy.Api;
    53 import com.sun.tools.javac.util.Name;
    55 import com.sun.tools.javac.util.Name;
    54 import static com.sun.tools.javac.code.Kinds.Kind.*;
    56 import static com.sun.tools.javac.code.Kinds.Kind.*;
    55 import static com.sun.tools.javac.code.Scope.LookupKind.NON_RECURSIVE;
    57 import static com.sun.tools.javac.code.Scope.LookupKind.NON_RECURSIVE;
    56 import static com.sun.tools.javac.code.TypeTag.CLASS;
    58 import static com.sun.tools.javac.code.TypeTag.CLASS;
    57 import com.sun.tools.javac.comp.CompileStates;
       
    58 import com.sun.tools.javac.comp.CompileStates.CompileState;
       
    59 import com.sun.tools.javac.comp.Modules;
    59 import com.sun.tools.javac.comp.Modules;
       
    60 import com.sun.tools.javac.comp.Resolve;
       
    61 import com.sun.tools.javac.comp.Resolve.RecoveryLoadClass;
    60 import static com.sun.tools.javac.tree.JCTree.Tag.*;
    62 import static com.sun.tools.javac.tree.JCTree.Tag.*;
    61 
    63 
    62 /**
    64 /**
    63  * Utility methods for operating on program elements.
    65  * Utility methods for operating on program elements.
    64  *
    66  *
    73     private final Symtab syms;
    75     private final Symtab syms;
    74     private final Modules modules;
    76     private final Modules modules;
    75     private final Names names;
    77     private final Names names;
    76     private final Types types;
    78     private final Types types;
    77     private final Enter enter;
    79     private final Enter enter;
       
    80     private final Resolve resolve;
    78     private final JavacTaskImpl javacTaskImpl;
    81     private final JavacTaskImpl javacTaskImpl;
    79     private final CompileStates compileStates;
       
    80 
    82 
    81     public static JavacElements instance(Context context) {
    83     public static JavacElements instance(Context context) {
    82         JavacElements instance = context.get(JavacElements.class);
    84         JavacElements instance = context.get(JavacElements.class);
    83         if (instance == null)
    85         if (instance == null)
    84             instance = new JavacElements(context);
    86             instance = new JavacElements(context);
    91         syms = Symtab.instance(context);
    93         syms = Symtab.instance(context);
    92         modules = Modules.instance(context);
    94         modules = Modules.instance(context);
    93         names = Names.instance(context);
    95         names = Names.instance(context);
    94         types = Types.instance(context);
    96         types = Types.instance(context);
    95         enter = Enter.instance(context);
    97         enter = Enter.instance(context);
       
    98         resolve = Resolve.instance(context);
    96         JavacTask t = context.get(JavacTask.class);
    99         JavacTask t = context.get(JavacTask.class);
    97         javacTaskImpl = t instanceof JavacTaskImpl ? (JavacTaskImpl) t : null;
   100         javacTaskImpl = t instanceof JavacTaskImpl ? (JavacTaskImpl) t : null;
    98         compileStates = CompileStates.instance(context);
       
    99     }
   101     }
   100 
   102 
   101     @Override @DefinedBy(Api.LANGUAGE_MODEL)
   103     @Override @DefinedBy(Api.LANGUAGE_MODEL)
   102     public ModuleSymbol getModuleElement(CharSequence name) {
   104     public ModuleSymbol getModuleElement(CharSequence name) {
   103         ensureEntered("getModuleElement");
   105         ensureEntered("getModuleElement");
       
   106         if (modules.getDefaultModule() == syms.noModule)
       
   107             return null;
   104         String strName = name.toString();
   108         String strName = name.toString();
   105         if (strName.equals(""))
   109         if (strName.equals(""))
   106             return syms.unnamedModule;
   110             return syms.unnamedModule;
   107         return modules.getObservableModule(names.fromString(strName));
   111         return modules.getObservableModule(names.fromString(strName));
   108     }
   112     }
   109 
   113 
   110     @Override @DefinedBy(Api.LANGUAGE_MODEL)
   114     @Override @DefinedBy(Api.LANGUAGE_MODEL)
   111     public PackageSymbol getPackageElement(CharSequence name) {
   115     public PackageSymbol getPackageElement(CharSequence name) {
   112         ensureEntered("getPackageElement");
   116         return doGetPackageElement(null, name);
   113         return getPackageElement(modules.getDefaultModule(), name);
       
   114     }
   117     }
   115 
   118 
   116     @Override @DefinedBy(Api.LANGUAGE_MODEL)
   119     @Override @DefinedBy(Api.LANGUAGE_MODEL)
   117     public PackageSymbol getPackageElement(ModuleElement module, CharSequence name) {
   120     public PackageSymbol getPackageElement(ModuleElement module, CharSequence name) {
   118         String strName = name.toString();
   121         module.getClass();
   119         if (strName.equals(""))
   122         return doGetPackageElement(module, name);
       
   123     }
       
   124 
       
   125     private PackageSymbol doGetPackageElement(ModuleElement module, CharSequence name) {
       
   126         ensureEntered("getPackageElement");
       
   127         if (name.length() == 0)
   120             return syms.unnamedModule.unnamedPackage;
   128             return syms.unnamedModule.unnamedPackage;
   121         return SourceVersion.isName(strName)
   129         return doGetElement(module, name, PackageSymbol.class);
   122             ? nameToSymbol((ModuleSymbol) module, strName, PackageSymbol.class)
       
   123             : null;
       
   124     }
   130     }
   125 
   131 
   126     @Override @DefinedBy(Api.LANGUAGE_MODEL)
   132     @Override @DefinedBy(Api.LANGUAGE_MODEL)
   127     public ClassSymbol getTypeElement(CharSequence name) {
   133     public ClassSymbol getTypeElement(CharSequence name) {
   128         ensureEntered("getTypeElement");
   134         return doGetTypeElement(null, name);
   129         return getTypeElement(modules.getDefaultModule(), name);
       
   130     }
   135     }
   131 
   136 
   132     @Override @DefinedBy(Api.LANGUAGE_MODEL)
   137     @Override @DefinedBy(Api.LANGUAGE_MODEL)
   133     public ClassSymbol getTypeElement(ModuleElement module, CharSequence name) {
   138     public ClassSymbol getTypeElement(ModuleElement module, CharSequence name) {
       
   139         module.getClass();
       
   140 
       
   141         return doGetTypeElement(module, name);
       
   142     }
       
   143 
       
   144     private ClassSymbol doGetTypeElement(ModuleElement module, CharSequence name) {
       
   145         ensureEntered("getTypeElement");
       
   146         return doGetElement(module, name, ClassSymbol.class);
       
   147     }
       
   148 
       
   149     private <S extends Symbol> S doGetElement(ModuleElement module, CharSequence name, Class<S> clazz) {
   134         String strName = name.toString();
   150         String strName = name.toString();
   135         return SourceVersion.isName(strName)
   151         if (!SourceVersion.isName(strName)) {
   136             ? nameToSymbol((ModuleSymbol) module, strName, ClassSymbol.class)
   152             return null;
   137             : null;
   153         }
       
   154         if (module == null) {
       
   155             return unboundNameToSymbol(strName, clazz);
       
   156         } else {
       
   157             return nameToSymbol((ModuleSymbol) module, strName, clazz);
       
   158         }
       
   159     }
       
   160 
       
   161     private <S extends Symbol> S unboundNameToSymbol(String nameStr, Class<S> clazz) {
       
   162         if (modules.getDefaultModule() == syms.noModule) { //not a modular mode:
       
   163             return nameToSymbol(syms.noModule, nameStr, clazz);
       
   164         }
       
   165 
       
   166         RecoveryLoadClass prevRecoveryLoadClass = resolve.setRecoveryLoadClass((env, name) -> null);
       
   167         try {
       
   168             Set<S> found = new LinkedHashSet<>();
       
   169 
       
   170             for (ModuleSymbol msym : modules.allModules()) {
       
   171                 S sym = nameToSymbol(msym, nameStr, clazz);
       
   172 
       
   173                 if (sym != null) {
       
   174                     found.add(sym);
       
   175                 }
       
   176             }
       
   177 
       
   178             if (found.size() == 1) {
       
   179                 return found.iterator().next();
       
   180             } else {
       
   181                 //not found, or more than one element found:
       
   182                 return null;
       
   183             }
       
   184         } finally {
       
   185             resolve.setRecoveryLoadClass(prevRecoveryLoadClass);
       
   186         }
   138     }
   187     }
   139 
   188 
   140     /**
   189     /**
   141      * Returns a symbol given the type's or package's canonical name,
   190      * Returns a symbol given the type's or package's canonical name,
   142      * or null if the name isn't found.
   191      * or null if the name isn't found.
   367     }
   416     }
   368 
   417 
   369     @DefinedBy(Api.LANGUAGE_MODEL)
   418     @DefinedBy(Api.LANGUAGE_MODEL)
   370     public ModuleElement getModuleOf(Element e) {
   419     public ModuleElement getModuleOf(Element e) {
   371         Symbol sym = cast(Symbol.class, e);
   420         Symbol sym = cast(Symbol.class, e);
       
   421         if (modules.getDefaultModule() == syms.noModule)
       
   422             return null;
   372         return (sym.kind == MDL) ? ((ModuleElement) e) : sym.packge().modle;
   423         return (sym.kind == MDL) ? ((ModuleElement) e) : sym.packge().modle;
   373     }
   424     }
   374 
   425 
   375     @DefinedBy(Api.LANGUAGE_MODEL)
   426     @DefinedBy(Api.LANGUAGE_MODEL)
   376     public boolean isDeprecated(Element e) {
   427     public boolean isDeprecated(Element e) {