# HG changeset patch # User jlahoda # Date 1409118240 -7200 # Node ID 2d24bda701dc488033af6c0ad6fba2571b0f44a4 # Parent 46aacfffd3b57c96259ea5480134af0ae536135a 8056061: Mark implementations of public interfaces with an annotation Summary: Adding @DefinedBy annotation to mark methods that implement public API methods; annotating the methods; adding a coding rules analyzer to enforce all such methods are annotated. Reviewed-by: jjg, mcimadamore, jfranck Contributed-by: jan.lahoda@oracle.com, jonathan.gibbons@oracle.com diff -r 46aacfffd3b5 -r 2d24bda701dc langtools/make/test/crules/DefinedByAnalyzer/Test.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/make/test/crules/DefinedByAnalyzer/Test.java Wed Aug 27 07:44:00 2014 +0200 @@ -0,0 +1,32 @@ +/**@test /nodynamiccopyright/ + * @compile/fail/ref=Test.out -Xplugin:coding_rules -XDrawDiagnostics Test.java + */ + +import com.sun.source.tree.CompilationUnitTree; +import com.sun.source.tree.Tree; +import com.sun.source.util.SourcePositions; +import com.sun.source.util.TaskEvent; +import com.sun.source.util.TaskListener; +import com.sun.tools.javac.util.DefinedBy; +import com.sun.tools.javac.util.DefinedBy.Api; + +public class Test implements SourcePositions, TaskListener { + @Override @DefinedBy(Api.COMPILER_TREE) + public long getStartPosition(CompilationUnitTree file, Tree tree) { + return 0; + } + @Override + public long getEndPosition(CompilationUnitTree file, Tree tree) { + return 0; + } + @DefinedBy(Api.COMPILER_TREE) + public long getEndPosition(Tree tree) { + return 0; + } + @Override @DefinedBy(Api.LANGUAGE_MODEL) + public void started(TaskEvent e) { + } + @Override @DefinedBy(Api.COMPILER_TREE) + public void finished(TaskEvent e) { + } +} diff -r 46aacfffd3b5 -r 2d24bda701dc langtools/make/test/crules/DefinedByAnalyzer/Test.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/make/test/crules/DefinedByAnalyzer/Test.out Wed Aug 27 07:44:00 2014 +0200 @@ -0,0 +1,4 @@ +Test.java:19:17: compiler.err.proc.messager: compiler.misc.crules.no.defined.by +Test.java:23:17: compiler.err.proc.messager: compiler.misc.crules.defined.by.no.api +Test.java:27:17: compiler.err.proc.messager: compiler.misc.crules.wrong.defined.by +3 errors diff -r 46aacfffd3b5 -r 2d24bda701dc langtools/make/tools/crules/AbstractCodingRulesAnalyzer.java --- a/langtools/make/tools/crules/AbstractCodingRulesAnalyzer.java Tue Aug 26 12:45:28 2014 +0100 +++ b/langtools/make/tools/crules/AbstractCodingRulesAnalyzer.java Wed Aug 27 07:44:00 2014 +0200 @@ -30,6 +30,8 @@ import com.sun.source.util.JavacTask; import com.sun.tools.javac.api.BasicJavacTask; import com.sun.tools.javac.code.Symtab; +import com.sun.tools.javac.model.JavacElements; +import com.sun.tools.javac.model.JavacTypes; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.TreeScanner; import com.sun.tools.javac.util.Context; @@ -49,6 +51,8 @@ private final Options options; protected final Messages messages; protected final Symtab syms; + protected final JavacElements elements; + protected final JavacTypes types; protected TreeScanner treeVisitor; protected Kind eventKind; @@ -61,6 +65,8 @@ diags = JCDiagnostic.Factory.instance(context); messages = new Messages(); syms = Symtab.instance(context); + elements = JavacElements.instance(context); + types = JavacTypes.instance(context); } protected class Messages { diff -r 46aacfffd3b5 -r 2d24bda701dc langtools/make/tools/crules/CodingRulesAnalyzerPlugin.java --- a/langtools/make/tools/crules/CodingRulesAnalyzerPlugin.java Tue Aug 26 12:45:28 2014 +0100 +++ b/langtools/make/tools/crules/CodingRulesAnalyzerPlugin.java Wed Aug 27 07:44:00 2014 +0200 @@ -41,6 +41,8 @@ import com.sun.tools.javac.api.BasicJavacTask; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.util.Context; +import com.sun.tools.javac.util.DefinedBy; +import com.sun.tools.javac.util.DefinedBy.Api; import com.sun.tools.javac.util.Log; public class CodingRulesAnalyzerPlugin implements Plugin { @@ -48,6 +50,7 @@ protected Log log; protected Trees trees; + @DefinedBy(Api.COMPILER_TREE) public void init(JavacTask task, String... args) { BasicJavacTask impl = (BasicJavacTask)task; Context context = impl.getContext(); @@ -55,7 +58,8 @@ trees = Trees.instance(task); task.addTaskListener(new PostAnalyzeTaskListener( new MutableFieldsAnalyzer(task), - new AssertCheckAnalyzer(task) + new AssertCheckAnalyzer(task), + new DefinedByAnalyzer(task) )); } @@ -74,10 +78,10 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public void started(TaskEvent taskEvent) {} - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public void finished(TaskEvent taskEvent) { List currentAnalyzers = this.analyzers.get(taskEvent.getKind()); @@ -99,7 +103,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public String getName() { return "coding_rules"; } diff -r 46aacfffd3b5 -r 2d24bda701dc langtools/make/tools/crules/DefinedByAnalyzer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/make/tools/crules/DefinedByAnalyzer.java Wed Aug 27 07:44:00 2014 +0200 @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package crules; + +import com.sun.source.util.JavacTask; +import com.sun.source.util.TaskEvent.Kind; +import com.sun.tools.javac.code.Symbol; +import com.sun.tools.javac.code.Symbol.MethodSymbol; +import com.sun.tools.javac.tree.JCTree.JCMethodDecl; +import com.sun.tools.javac.tree.TreeScanner; +import com.sun.tools.javac.util.DefinedBy; +import com.sun.tools.javac.util.DefinedBy.Api; + +/**This analyzer ensures that all method that implement a public supported API method are marked with + * {@link DefinedBy} annotation, and that methods that don't implement a public API are not marked + * using the annotation. + */ +public class DefinedByAnalyzer extends AbstractCodingRulesAnalyzer { + + public DefinedByAnalyzer(JavacTask task) { + super(task); + treeVisitor = new DefinedByVisitor(); + eventKind = Kind.ANALYZE; + } + + class DefinedByVisitor extends TreeScanner { + @Override + public void visitMethodDef(JCMethodDecl tree) { + if (!isAPIPackage(packageName(tree.sym))) { + boolean seenAPIPackage = false; + + for (MethodSymbol overridden : types.getOverriddenMethods(tree.sym)) { + String overriddenPackage = packageName(overridden); + + if (!isAPIPackage(overriddenPackage)) + continue; + + seenAPIPackage = true; + + DefinedBy definedBy = tree.sym.getAnnotation(DefinedBy.class); + + if (definedBy != null) { + String packageRoot = definedBy.value().packageRoot; + if (!overriddenPackage.startsWith(packageRoot)) { + messages.error(tree, "crules.wrong.defined.by"); + } + continue; + } + + messages.error(tree, "crules.no.defined.by"); + } + + if (!seenAPIPackage && tree.sym.getAnnotation(DefinedBy.class) != null) { + messages.error(tree, "crules.defined.by.no.api"); + } + } + + super.visitMethodDef(tree); + } + + private boolean isAPIPackage(String pack) { + for (Api api : Api.values()) { + if (pack.startsWith(api.packageRoot)) + return true; + } + + return false; + } + + private String packageName(Symbol sym) { + return elements.getPackageOf(sym).getQualifiedName().toString(); + } + } +} diff -r 46aacfffd3b5 -r 2d24bda701dc langtools/make/tools/crules/resources/crules.properties --- a/langtools/make/tools/crules/resources/crules.properties Tue Aug 26 12:45:28 2014 +0100 +++ b/langtools/make/tools/crules/resources/crules.properties Wed Aug 27 07:44:00 2014 +0200 @@ -28,3 +28,9 @@ Static variable {0} must be final crules.should.not.use.string.concatenation=\ Should not use string concatenation. +crules.no.defined.by=\ + This method implements a public API method, and should be marked with @DefinedBy. +crules.wrong.defined.by=\ + This method implements a public API method, and is marked with incorrect @DefinedBy. +crules.defined.by.no.api=\ + This method does not implement a public API method, and should not be marked with @DefinedBy. diff -r 46aacfffd3b5 -r 2d24bda701dc langtools/src/jdk.compiler/share/classes/com/sun/tools/doclint/Checker.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/doclint/Checker.java Tue Aug 26 12:45:28 2014 +0100 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/doclint/Checker.java Wed Aug 27 07:44:00 2014 +0200 @@ -81,6 +81,8 @@ import com.sun.source.util.TreePath; import com.sun.tools.doclint.HtmlTag.AttrKind; import com.sun.tools.javac.tree.DocPretty; +import com.sun.tools.javac.util.DefinedBy; +import com.sun.tools.javac.util.DefinedBy.Api; import com.sun.tools.javac.util.StringUtils; import static com.sun.tools.doclint.Messages.Group.*; @@ -213,7 +215,7 @@ env.messages.report(REFERENCE, Kind.WARNING, env.currPath.getLeaf(), code, args); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitDocComment(DocCommentTree tree, Void ignore) { super.visitDocComment(tree, ignore); for (TagStackItem tsi: tagStack) { @@ -230,7 +232,7 @@ // - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitText(TextTree tree, Void ignore) { if (hasNonWhitespace(tree)) { checkAllowsText(tree); @@ -239,7 +241,7 @@ return null; } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitEntity(EntityTree tree, Void ignore) { checkAllowsText(tree); markEnclosingTag(Flag.HAS_TEXT); @@ -273,7 +275,7 @@ // - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitStartElement(StartElementTree tree, Void ignore) { final Name treeName = tree.getName(); final HtmlTag t = HtmlTag.get(treeName); @@ -437,7 +439,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitEndElement(EndElementTree tree, Void ignore) { final Name treeName = tree.getName(); final HtmlTag t = HtmlTag.get(treeName); @@ -509,7 +511,7 @@ // - @Override @SuppressWarnings("fallthrough") + @Override @DefinedBy(Api.COMPILER_TREE) @SuppressWarnings("fallthrough") public Void visitAttribute(AttributeTree tree, Void ignore) { HtmlTag currTag = tagStack.peek().tag; if (currTag != null) { @@ -654,19 +656,19 @@ // - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitAuthor(AuthorTree tree, Void ignore) { warnIfEmpty(tree, tree.getName()); return super.visitAuthor(tree, ignore); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitDocRoot(DocRootTree tree, Void ignore) { markEnclosingTag(Flag.HAS_INLINE_TAG); return super.visitDocRoot(tree, ignore); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitInheritDoc(InheritDocTree tree, Void ignore) { markEnclosingTag(Flag.HAS_INLINE_TAG); // TODO: verify on overridden method @@ -674,7 +676,7 @@ return super.visitInheritDoc(tree, ignore); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitLink(LinkTree tree, Void ignore) { markEnclosingTag(Flag.HAS_INLINE_TAG); // simulate inline context on tag stack @@ -688,7 +690,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitLiteral(LiteralTree tree, Void ignore) { markEnclosingTag(Flag.HAS_INLINE_TAG); if (tree.getKind() == DocTree.Kind.CODE) { @@ -702,7 +704,7 @@ return super.visitLiteral(tree, ignore); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) @SuppressWarnings("fallthrough") public Void visitParam(ParamTree tree, Void ignore) { boolean typaram = tree.isTypeParameter(); @@ -748,7 +750,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitReference(ReferenceTree tree, Void ignore) { String sig = tree.getSignature(); if (sig.contains("<") || sig.contains(">")) @@ -760,7 +762,7 @@ return super.visitReference(tree, ignore); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitReturn(ReturnTree tree, Void ignore) { Element e = env.trees.getElement(env.currPath); if (e.getKind() != ElementKind.METHOD @@ -771,25 +773,25 @@ return super.visitReturn(tree, ignore); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitSerialData(SerialDataTree tree, Void ignore) { warnIfEmpty(tree, tree.getDescription()); return super.visitSerialData(tree, ignore); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitSerialField(SerialFieldTree tree, Void ignore) { warnIfEmpty(tree, tree.getDescription()); return super.visitSerialField(tree, ignore); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitSince(SinceTree tree, Void ignore) { warnIfEmpty(tree, tree.getBody()); return super.visitSince(tree, ignore); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitThrows(ThrowsTree tree, Void ignore) { ReferenceTree exName = tree.getExceptionName(); Element ex = env.trees.getElement(new DocTreePath(getCurrentPath(), exName)); @@ -845,13 +847,13 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitUnknownBlockTag(UnknownBlockTagTree tree, Void ignore) { checkUnknownTag(tree, tree.getTagName()); return super.visitUnknownBlockTag(tree, ignore); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitUnknownInlineTag(UnknownInlineTagTree tree, Void ignore) { checkUnknownTag(tree, tree.getTagName()); return super.visitUnknownInlineTag(tree, ignore); @@ -862,7 +864,7 @@ env.messages.error(SYNTAX, tree, "dc.tag.unknown", tagName); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitValue(ValueTree tree, Void ignore) { ReferenceTree ref = tree.getReference(); if (ref == null || ref.getSignature().isEmpty()) { @@ -891,13 +893,13 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitVersion(VersionTree tree, Void ignore) { warnIfEmpty(tree, tree.getBody()); return super.visitVersion(tree, ignore); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitErroneous(ErroneousTree tree, Void ignore) { env.messages.error(SYNTAX, tree, null, tree.getDiagnostic().getMessage(null)); return null; diff -r 46aacfffd3b5 -r 2d24bda701dc langtools/src/jdk.compiler/share/classes/com/sun/tools/doclint/DocLint.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/doclint/DocLint.java Tue Aug 26 12:45:28 2014 +0100 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/doclint/DocLint.java Wed Aug 27 07:44:00 2014 +0200 @@ -54,6 +54,8 @@ import com.sun.tools.javac.file.JavacFileManager; import com.sun.tools.javac.main.JavaCompiler; import com.sun.tools.javac.util.Context; +import com.sun.tools.javac.util.DefinedBy; +import com.sun.tools.javac.util.DefinedBy.Api; /** * Multi-function entry point for the doc check utility. @@ -244,12 +246,12 @@ // - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public String getName() { return "doclint"; } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public void init(JavacTask task, String... args) { init(task, args, true); } @@ -289,7 +291,7 @@ }; TaskListener tl = new TaskListener() { - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public void started(TaskEvent e) { switch (e.getKind()) { case ANALYZE: @@ -300,7 +302,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public void finished(TaskEvent e) { switch (e.getKind()) { case PARSE: @@ -348,25 +350,25 @@ static abstract class DeclScanner extends TreePathScanner { abstract void visitDecl(Tree tree, Name name); - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitPackage(PackageTree tree, Void ignore) { visitDecl(tree, null); return super.visitPackage(tree, ignore); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitClass(ClassTree tree, Void ignore) { visitDecl(tree, tree.getSimpleName()); return super.visitClass(tree, ignore); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitMethod(MethodTree tree, Void ignore) { visitDecl(tree, tree.getName()); //return super.visitMethod(tree, ignore); return null; } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Void visitVariable(VariableTree tree, Void ignore) { visitDecl(tree, tree.getName()); return super.visitVariable(tree, ignore); diff -r 46aacfffd3b5 -r 2d24bda701dc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/BasicJavacTask.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/BasicJavacTask.java Tue Aug 26 12:45:28 2014 +0100 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/BasicJavacTask.java Wed Aug 27 07:44:00 2014 +0200 @@ -49,6 +49,8 @@ import com.sun.tools.javac.processing.JavacProcessingEnvironment; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.util.Context; +import com.sun.tools.javac.util.DefinedBy; +import com.sun.tools.javac.util.DefinedBy.Api; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.Log; import com.sun.tools.javac.util.PropagatedException; @@ -79,22 +81,22 @@ context.put(JavacTask.class, this); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Iterable parse() { throw new IllegalStateException(); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Iterable analyze() { throw new IllegalStateException(); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Iterable generate() { throw new IllegalStateException(); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public void setTaskListener(TaskListener tl) { MultiTaskListener mtl = MultiTaskListener.instance(context); if (taskListener != null) @@ -104,13 +106,13 @@ taskListener = tl; } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public void addTaskListener(TaskListener taskListener) { MultiTaskListener mtl = MultiTaskListener.instance(context); mtl.add(taskListener); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public void removeTaskListener(TaskListener taskListener) { MultiTaskListener mtl = MultiTaskListener.instance(context); mtl.remove(taskListener); @@ -121,7 +123,7 @@ return mtl.getTaskListeners(); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public TypeMirror getTypeMirror(Iterable path) { // TODO: Should complete attribution if necessary Tree last = null; @@ -130,31 +132,31 @@ return ((JCTree)last).type; } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Elements getElements() { if (context == null) throw new IllegalStateException(); return JavacElements.instance(context); } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Types getTypes() { if (context == null) throw new IllegalStateException(); return JavacTypes.instance(context); } - @Override + @Override @DefinedBy(Api.COMPILER) public void setProcessors(Iterable processors) { throw new IllegalStateException(); } - @Override + @Override @DefinedBy(Api.COMPILER) public void setLocale(Locale locale) { throw new IllegalStateException(); } - @Override + @Override @DefinedBy(Api.COMPILER) public Boolean call() { throw new IllegalStateException(); } diff -r 46aacfffd3b5 -r 2d24bda701dc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/ClientCodeWrapper.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/ClientCodeWrapper.java Tue Aug 26 12:45:28 2014 +0100 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/ClientCodeWrapper.java Wed Aug 27 07:44:00 2014 +0200 @@ -60,6 +60,8 @@ import com.sun.source.util.TaskListener; import com.sun.tools.javac.util.ClientCodeException; import com.sun.tools.javac.util.Context; +import com.sun.tools.javac.util.DefinedBy; +import com.sun.tools.javac.util.DefinedBy.Api; import com.sun.tools.javac.util.JCDiagnostic; /** @@ -209,7 +211,7 @@ this.clientJavaFileManager = clientJavaFileManager; } - @Override + @Override @DefinedBy(Api.COMPILER) public ClassLoader getClassLoader(Location location) { try { return clientJavaFileManager.getClassLoader(location); @@ -220,7 +222,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public Iterable list(Location location, String packageName, Set kinds, boolean recurse) throws IOException { try { return wrapJavaFileObjects(clientJavaFileManager.list(location, packageName, kinds, recurse)); @@ -231,7 +233,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public String inferBinaryName(Location location, JavaFileObject file) { try { return clientJavaFileManager.inferBinaryName(location, unwrap(file)); @@ -242,7 +244,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public boolean isSameFile(FileObject a, FileObject b) { try { return clientJavaFileManager.isSameFile(unwrap(a), unwrap(b)); @@ -253,7 +255,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public boolean handleOption(String current, Iterator remaining) { try { return clientJavaFileManager.handleOption(current, remaining); @@ -264,7 +266,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public boolean hasLocation(Location location) { try { return clientJavaFileManager.hasLocation(location); @@ -275,7 +277,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public JavaFileObject getJavaFileForInput(Location location, String className, Kind kind) throws IOException { try { return wrap(clientJavaFileManager.getJavaFileForInput(location, className, kind)); @@ -286,7 +288,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public JavaFileObject getJavaFileForOutput(Location location, String className, Kind kind, FileObject sibling) throws IOException { try { return wrap(clientJavaFileManager.getJavaFileForOutput(location, className, kind, unwrap(sibling))); @@ -297,7 +299,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public FileObject getFileForInput(Location location, String packageName, String relativeName) throws IOException { try { return wrap(clientJavaFileManager.getFileForInput(location, packageName, relativeName)); @@ -308,7 +310,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public FileObject getFileForOutput(Location location, String packageName, String relativeName, FileObject sibling) throws IOException { try { return wrap(clientJavaFileManager.getFileForOutput(location, packageName, relativeName, unwrap(sibling))); @@ -319,7 +321,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public void flush() throws IOException { try { clientJavaFileManager.flush(); @@ -330,7 +332,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public void close() throws IOException { try { clientJavaFileManager.close(); @@ -341,7 +343,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public int isSupportedOption(String option) { try { return clientJavaFileManager.isSupportedOption(option); @@ -365,7 +367,7 @@ this.clientFileObject = clientFileObject; } - @Override + @Override @DefinedBy(Api.COMPILER) public URI toUri() { try { return clientFileObject.toUri(); @@ -376,7 +378,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public String getName() { try { return clientFileObject.getName(); @@ -387,7 +389,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public InputStream openInputStream() throws IOException { try { return clientFileObject.openInputStream(); @@ -398,7 +400,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public OutputStream openOutputStream() throws IOException { try { return clientFileObject.openOutputStream(); @@ -409,7 +411,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public Reader openReader(boolean ignoreEncodingErrors) throws IOException { try { return clientFileObject.openReader(ignoreEncodingErrors); @@ -420,7 +422,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException { try { return clientFileObject.getCharContent(ignoreEncodingErrors); @@ -431,7 +433,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public Writer openWriter() throws IOException { try { return clientFileObject.openWriter(); @@ -442,7 +444,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public long getLastModified() { try { return clientFileObject.getLastModified(); @@ -453,7 +455,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public boolean delete() { try { return clientFileObject.delete(); @@ -475,7 +477,7 @@ super(clientJavaFileObject); } - @Override + @Override @DefinedBy(Api.COMPILER) public Kind getKind() { try { return ((JavaFileObject)clientFileObject).getKind(); @@ -486,7 +488,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public boolean isNameCompatible(String simpleName, Kind kind) { try { return ((JavaFileObject)clientFileObject).isNameCompatible(simpleName, kind); @@ -497,7 +499,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public NestingKind getNestingKind() { try { return ((JavaFileObject)clientFileObject).getNestingKind(); @@ -508,7 +510,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER) public Modifier getAccessLevel() { try { return ((JavaFileObject)clientFileObject).getAccessLevel(); @@ -532,7 +534,7 @@ this.clientDiagnosticListener = clientDiagnosticListener; } - @Override + @Override @DefinedBy(Api.COMPILER) public void report(Diagnostic diagnostic) { try { clientDiagnosticListener.report(unwrap(diagnostic)); @@ -556,38 +558,47 @@ this.d = d; } + @DefinedBy(Api.COMPILER) public Diagnostic.Kind getKind() { return d.getKind(); } + @DefinedBy(Api.COMPILER) public JavaFileObject getSource() { return unwrap(d.getSource()); } + @DefinedBy(Api.COMPILER) public long getPosition() { return d.getPosition(); } + @DefinedBy(Api.COMPILER) public long getStartPosition() { return d.getStartPosition(); } + @DefinedBy(Api.COMPILER) public long getEndPosition() { return d.getEndPosition(); } + @DefinedBy(Api.COMPILER) public long getLineNumber() { return d.getLineNumber(); } + @DefinedBy(Api.COMPILER) public long getColumnNumber() { return d.getColumnNumber(); } + @DefinedBy(Api.COMPILER) public String getCode() { return d.getCode(); } + @DefinedBy(Api.COMPILER) public String getMessage(Locale locale) { return d.getMessage(locale); } @@ -605,7 +616,7 @@ this.clientTaskListener = clientTaskListener; } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public void started(TaskEvent ev) { try { clientTaskListener.started(ev); @@ -616,7 +627,7 @@ } } - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public void finished(TaskEvent ev) { try { clientTaskListener.finished(ev); diff -r 46aacfffd3b5 -r 2d24bda701dc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacScope.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacScope.java Tue Aug 26 12:45:28 2014 +0100 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacScope.java Wed Aug 27 07:44:00 2014 +0200 @@ -32,6 +32,8 @@ import com.sun.tools.javac.comp.AttrContext; import com.sun.tools.javac.comp.Env; +import com.sun.tools.javac.util.DefinedBy; +import com.sun.tools.javac.util.DefinedBy.Api; @@ -52,7 +54,7 @@ //the "top-level" scope needs to return both imported and defined elements //see test CheckLocalElements return new JavacScope(env) { - @Override + @Override @DefinedBy(Api.COMPILER_TREE) public Iterable getLocalElements() { return env.toplevel.namedImportScope.getSymbols(); } @@ -69,6 +71,7 @@ this.env = env; } + @DefinedBy(Api.COMPILER_TREE) public JavacScope getEnclosingScope() { if (env.outer != null && env.outer != env) { return create(env.outer); @@ -78,9 +81,11 @@ public boolean isStarImportScope() { return true; } + @DefinedBy(Api.COMPILER_TREE) public JavacScope getEnclosingScope() { return null; } + @DefinedBy(Api.COMPILER_TREE) public Iterable getLocalElements() { return env.toplevel.starImportScope.getSymbols(); } @@ -88,15 +93,18 @@ } } + @DefinedBy(Api.COMPILER_TREE) public TypeElement getEnclosingClass() { // hide the dummy class that javac uses to enclose the top level declarations return (env.outer == null || env.outer == env ? null : env.enclClass.sym); } + @DefinedBy(Api.COMPILER_TREE) public ExecutableElement getEnclosingMethod() { return (env.enclMethod == null ? null : env.enclMethod.sym); } + @DefinedBy(Api.COMPILER_TREE) public Iterable getLocalElements() { return env.info.getLocalElements(); } diff -r 46aacfffd3b5 -r 2d24bda701dc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java Tue Aug 26 12:45:28 2014 +0100 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java Wed Aug 27 07:44:00 2014 +0200 @@ -48,6 +48,7 @@ import com.sun.tools.javac.tree.JCTree.JCClassDecl; import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; import com.sun.tools.javac.util.*; +import com.sun.tools.javac.util.DefinedBy.Api; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.Log.PrefixKind; import com.sun.tools.javac.util.Log.WriterKind; @@ -77,7 +78,7 @@ args = Arguments.instance(context); } - @Override // @DefinedBy(COMPILER_API) + @Override @DefinedBy(Api.COMPILER) public Boolean call() { return doCall().isOK(); } @@ -102,7 +103,7 @@ } } - @Override // @DefinedBy(COMPILER_API) + @Override @DefinedBy(Api.COMPILER) public void setProcessors(Iterable processors) { processors.getClass(); // null check // not mt-safe @@ -111,7 +112,7 @@ this.processors = processors; } - @Override // @DefinedBy(COMPILER_API) + @Override @DefinedBy(Api.COMPILER) public void setLocale(Locale locale) { if (used.get()) throw new IllegalStateException(); @@ -206,7 +207,7 @@ notYetEntered = null; } - @Override // @DefinedBy(TREE_API) + @Override @DefinedBy(Api.COMPILER_TREE) public Iterable parse() { return handleExceptions(new Callable>() { @Override @@ -320,7 +321,7 @@ } } - @Override // @DefinedBy(TREE_API) + @Override @DefinedBy(Api.COMPILER_TREE) public Iterable analyze() { return handleExceptions(new Callable>() { @Override @@ -382,7 +383,7 @@ genList.addAll(queue); } - @Override // @DefinedBy(TREE_API) + @Override @DefinedBy(Api.COMPILER_TREE) public Iterable generate() { return handleExceptions(new Callable>() { @Override diff -r 46aacfffd3b5 -r 2d24bda701dc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTool.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTool.java Tue Aug 26 12:45:28 2014 +0100 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTool.java Wed Aug 27 07:44:00 2014 +0200 @@ -45,6 +45,8 @@ import com.sun.tools.javac.main.Option; import com.sun.tools.javac.util.ClientCodeException; import com.sun.tools.javac.util.Context; +import com.sun.tools.javac.util.DefinedBy; +import com.sun.tools.javac.util.DefinedBy.Api; import com.sun.tools.javac.util.Log; import com.sun.tools.javac.util.PropagatedException; @@ -78,7 +80,7 @@ return new JavacTool(); } - @Override // @DefinedBy(COMPILER_API) + @Override @DefinedBy(Api.COMPILER) public JavacFileManager getStandardFileManager( DiagnosticListener diagnosticListener, Locale locale, @@ -94,7 +96,7 @@ return new JavacFileManager(context, true, charset); } - @Override // @DefinedBy(COMPILER_API) + @Override @DefinedBy(Api.COMPILER) public JavacTask getTask(Writer out, JavaFileManager fileManager, DiagnosticListener diagnosticListener, @@ -165,7 +167,7 @@ } } - @Override // @DefinedBy(COMPILER_API) + @Override @DefinedBy(Api.COMPILER) public int run(InputStream in, OutputStream out, OutputStream err, String... arguments) { if (err == null) err = System.err; @@ -174,13 +176,13 @@ return com.sun.tools.javac.Main.compile(arguments, new PrintWriter(err, true)); } - @Override // @DefinedBy(COMPILER_API) + @Override @DefinedBy(Api.COMPILER) public Set getSourceVersions() { return Collections.unmodifiableSet(EnumSet.range(SourceVersion.RELEASE_3, SourceVersion.latest())); } - @Override // @DefinedBy(COMPILER_API) + @Override @DefinedBy(Api.COMPILER) public int isSupportedOption(String option) { Set