38
39 import javax.lang.model.element.Modifier;
40 import javax.lang.model.element.NestingKind;
41 import javax.tools.JavaFileManager;
42 import javax.tools.JavaFileObject;
43
44 import com.sun.tools.javac.comp.Annotate;
45 import com.sun.tools.javac.comp.Annotate.AnnotationTypeCompleter;
46 import com.sun.tools.javac.code.*;
47 import com.sun.tools.javac.code.Directive.*;
48 import com.sun.tools.javac.code.Lint.LintCategory;
49 import com.sun.tools.javac.code.Scope.WriteableScope;
50 import com.sun.tools.javac.code.Symbol.*;
51 import com.sun.tools.javac.code.Symtab;
52 import com.sun.tools.javac.code.Type.*;
53 import com.sun.tools.javac.comp.Annotate.AnnotationTypeMetadata;
54 import com.sun.tools.javac.file.BaseFileManager;
55 import com.sun.tools.javac.file.PathFileObject;
56 import com.sun.tools.javac.jvm.ClassFile.NameAndType;
57 import com.sun.tools.javac.jvm.ClassFile.Version;
58 import com.sun.tools.javac.util.*;
59 import com.sun.tools.javac.util.DefinedBy.Api;
60 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
61
62 import static com.sun.tools.javac.code.Flags.*;
63 import static com.sun.tools.javac.code.Kinds.Kind.*;
64 import static com.sun.tools.javac.code.TypeTag.ARRAY;
65 import static com.sun.tools.javac.code.TypeTag.CLASS;
66 import static com.sun.tools.javac.code.TypeTag.TYPEVAR;
67 import static com.sun.tools.javac.jvm.ClassFile.*;
68 import static com.sun.tools.javac.jvm.ClassFile.Version.*;
69
70 import static com.sun.tools.javac.main.Option.*;
71
72 /** This class provides operations to read a classfile into an internal
73 * representation. The internal representation is anchored in a
74 * ClassSymbol which contains in its scope symbol representations
75 * for all other definitions in the classfile. Top-level Classes themselves
76 * appear as members of the scopes of PackageSymbols.
77 *
78 * <p><b>This is NOT part of any supported API.
79 * If you write code that depends on this, you do so at your own risk.
80 * This code and its internal interfaces are subject to change or
81 * deletion without notice.</b>
82 */
83 public class ClassReader {
84 /** The context key for the class reader. */
85 protected static final Context.Key<ClassReader> classReaderKey = new Context.Key<>();
86
87 public static final int INITIAL_BUFFER_SIZE = 0x0fff0;
88
89 private final Annotate annotate;
90
219 if (instance == null)
220 instance = new ClassReader(context);
221 return instance;
222 }
223
224 /** Construct a new class reader. */
225 protected ClassReader(Context context) {
226 context.put(classReaderKey, this);
227 annotate = Annotate.instance(context);
228 names = Names.instance(context);
229 syms = Symtab.instance(context);
230 types = Types.instance(context);
231 fileManager = context.get(JavaFileManager.class);
232 if (fileManager == null)
233 throw new AssertionError("FileManager initialization error");
234 diagFactory = JCDiagnostic.Factory.instance(context);
235
236 log = Log.instance(context);
237
238 Options options = Options.instance(context);
239 verbose = options.isSet(VERBOSE);
240
241 Source source = Source.instance(context);
242 allowSimplifiedVarargs = source.allowSimplifiedVarargs();
243 allowModules = source.allowModules();
244
245 saveParameterNames = options.isSet(PARAMETERS);
246
247 profile = Profile.instance(context);
248
249 typevars = WriteableScope.create(syms.noSymbol);
250
251 lintClassfile = Lint.instance(context).isEnabled(LintCategory.CLASSFILE);
252
253 initAttributeReaders();
254 }
255
256 /** Add member to class unless it is synthetic.
257 */
258 private void enterMember(ClassSymbol c, Symbol sym) {
259 // Synthetic members are not entered -- reason lost to history (optimization?).
|
38
39 import javax.lang.model.element.Modifier;
40 import javax.lang.model.element.NestingKind;
41 import javax.tools.JavaFileManager;
42 import javax.tools.JavaFileObject;
43
44 import com.sun.tools.javac.comp.Annotate;
45 import com.sun.tools.javac.comp.Annotate.AnnotationTypeCompleter;
46 import com.sun.tools.javac.code.*;
47 import com.sun.tools.javac.code.Directive.*;
48 import com.sun.tools.javac.code.Lint.LintCategory;
49 import com.sun.tools.javac.code.Scope.WriteableScope;
50 import com.sun.tools.javac.code.Symbol.*;
51 import com.sun.tools.javac.code.Symtab;
52 import com.sun.tools.javac.code.Type.*;
53 import com.sun.tools.javac.comp.Annotate.AnnotationTypeMetadata;
54 import com.sun.tools.javac.file.BaseFileManager;
55 import com.sun.tools.javac.file.PathFileObject;
56 import com.sun.tools.javac.jvm.ClassFile.NameAndType;
57 import com.sun.tools.javac.jvm.ClassFile.Version;
58 import com.sun.tools.javac.main.Option;
59 import com.sun.tools.javac.util.*;
60 import com.sun.tools.javac.util.DefinedBy.Api;
61 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
62
63 import static com.sun.tools.javac.code.Flags.*;
64 import static com.sun.tools.javac.code.Kinds.Kind.*;
65 import static com.sun.tools.javac.code.TypeTag.ARRAY;
66 import static com.sun.tools.javac.code.TypeTag.CLASS;
67 import static com.sun.tools.javac.code.TypeTag.TYPEVAR;
68 import static com.sun.tools.javac.jvm.ClassFile.*;
69 import static com.sun.tools.javac.jvm.ClassFile.Version.*;
70
71 import static com.sun.tools.javac.main.Option.PARAMETERS;
72
73 /** This class provides operations to read a classfile into an internal
74 * representation. The internal representation is anchored in a
75 * ClassSymbol which contains in its scope symbol representations
76 * for all other definitions in the classfile. Top-level Classes themselves
77 * appear as members of the scopes of PackageSymbols.
78 *
79 * <p><b>This is NOT part of any supported API.
80 * If you write code that depends on this, you do so at your own risk.
81 * This code and its internal interfaces are subject to change or
82 * deletion without notice.</b>
83 */
84 public class ClassReader {
85 /** The context key for the class reader. */
86 protected static final Context.Key<ClassReader> classReaderKey = new Context.Key<>();
87
88 public static final int INITIAL_BUFFER_SIZE = 0x0fff0;
89
90 private final Annotate annotate;
91
220 if (instance == null)
221 instance = new ClassReader(context);
222 return instance;
223 }
224
225 /** Construct a new class reader. */
226 protected ClassReader(Context context) {
227 context.put(classReaderKey, this);
228 annotate = Annotate.instance(context);
229 names = Names.instance(context);
230 syms = Symtab.instance(context);
231 types = Types.instance(context);
232 fileManager = context.get(JavaFileManager.class);
233 if (fileManager == null)
234 throw new AssertionError("FileManager initialization error");
235 diagFactory = JCDiagnostic.Factory.instance(context);
236
237 log = Log.instance(context);
238
239 Options options = Options.instance(context);
240 verbose = options.isSet(Option.VERBOSE);
241
242 Source source = Source.instance(context);
243 allowSimplifiedVarargs = source.allowSimplifiedVarargs();
244 allowModules = source.allowModules();
245
246 saveParameterNames = options.isSet(PARAMETERS);
247
248 profile = Profile.instance(context);
249
250 typevars = WriteableScope.create(syms.noSymbol);
251
252 lintClassfile = Lint.instance(context).isEnabled(LintCategory.CLASSFILE);
253
254 initAttributeReaders();
255 }
256
257 /** Add member to class unless it is synthetic.
258 */
259 private void enterMember(ClassSymbol c, Symbol sym) {
260 // Synthetic members are not entered -- reason lost to history (optimization?).
|