提交 8b5d6838 编写于 作者: J jlahoda

8012929: Trees.getElement should work not only for declaration trees, but also for use-trees

Reviewed-by: jjg
Contributed-by: NDusan Balek &lt;dbalek@netbeans.org&gt;, Jan Lahoda <jlahoda@netbeans.org>
上级 91825753
...@@ -29,6 +29,7 @@ package com.sun.tools.doclint; ...@@ -29,6 +29,7 @@ package com.sun.tools.doclint;
import java.util.Set; import java.util.Set;
import javax.lang.model.element.Element; import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Modifier; import javax.lang.model.element.Modifier;
import javax.lang.model.type.TypeMirror; import javax.lang.model.type.TypeMirror;
...@@ -144,7 +145,7 @@ public class Env { ...@@ -144,7 +145,7 @@ public class Env {
AccessKind ak = null; AccessKind ak = null;
for (TreePath p = path; p != null; p = p.getParentPath()) { for (TreePath p = path; p != null; p = p.getParentPath()) {
Element e = trees.getElement(p); Element e = trees.getElement(p);
if (e != null) { if (e != null && e.getKind() != ElementKind.PACKAGE) {
ak = min(ak, AccessKind.of(e.getModifiers())); ak = min(ak, AccessKind.of(e.getModifiers()));
} }
} }
......
...@@ -333,11 +333,6 @@ public class JavacTrees extends DocTrees { ...@@ -333,11 +333,6 @@ public class JavacTrees extends DocTrees {
} }
} }
} }
} else if (tree.hasTag(Tag.TOPLEVEL)) {
JCCompilationUnit cu = (JCCompilationUnit) tree;
if (cu.sourcefile.isNameCompatible("package-info", JavaFileObject.Kind.SOURCE)) {
sym = cu.packge;
}
} }
} }
return sym; return sym;
......
...@@ -1338,7 +1338,7 @@ public class Attr extends JCTree.Visitor { ...@@ -1338,7 +1338,7 @@ public class Attr extends JCTree.Visitor {
//check that resource type cannot throw InterruptedException //check that resource type cannot throw InterruptedException
checkAutoCloseable(resource.pos(), localEnv, resource.type); checkAutoCloseable(resource.pos(), localEnv, resource.type);
VarSymbol var = (VarSymbol)TreeInfo.symbolFor(resource); VarSymbol var = ((JCVariableDecl) resource).sym;
var.setData(ElementKind.RESOURCE_VARIABLE); var.setData(ElementKind.RESOURCE_VARIABLE);
} else { } else {
attribTree(resource, tryEnv, twrResult); attribTree(resource, tryEnv, twrResult);
......
...@@ -763,14 +763,40 @@ public class TreeInfo { ...@@ -763,14 +763,40 @@ public class TreeInfo {
} }
public static Symbol symbolFor(JCTree node) { public static Symbol symbolFor(JCTree node) {
Symbol sym = symbolForImpl(node);
return sym != null ? sym.baseSymbol() : null;
}
private static Symbol symbolForImpl(JCTree node) {
node = skipParens(node); node = skipParens(node);
switch (node.getTag()) { switch (node.getTag()) {
case TOPLEVEL:
return ((JCCompilationUnit) node).packge;
case CLASSDEF: case CLASSDEF:
return ((JCClassDecl) node).sym; return ((JCClassDecl) node).sym;
case METHODDEF: case METHODDEF:
return ((JCMethodDecl) node).sym; return ((JCMethodDecl) node).sym;
case VARDEF: case VARDEF:
return ((JCVariableDecl) node).sym; return ((JCVariableDecl) node).sym;
case IDENT:
return ((JCIdent) node).sym;
case SELECT:
return ((JCFieldAccess) node).sym;
case REFERENCE:
return ((JCMemberReference) node).sym;
case NEWCLASS:
return ((JCNewClass) node).constructor;
case APPLY:
return symbolFor(((JCMethodInvocation) node).meth);
case TYPEAPPLY:
return symbolFor(((JCTypeApply) node).clazz);
case ANNOTATION:
case TYPE_ANNOTATION:
case TYPEPARAMETER:
if (node.type != null)
return node.type.tsym;
return null;
default: default:
return null; return null;
} }
......
/*
* Copyright (c) 2013, 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.
*/
/*
* @test
* @bug 8012929
* @summary Trees.getElement should work not only for declaration trees, but also for use-trees
* @build TestGetElementReference
* @run main TestGetElementReference
*/
import com.sun.source.tree.CompilationUnitTree;
import com.sun.source.tree.Tree;
import com.sun.source.util.*;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.lang.model.element.Element;
import javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class TestGetElementReference {
public static void main(String... args) throws IOException {
File source = new File(System.getProperty("test.src", "."), "TestGetElementReferenceData.java").getAbsoluteFile();
StandardJavaFileManager fm = ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null);
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
JavacTask ct = (JavacTask) ToolProvider.getSystemJavaCompiler().getTask(null, null, diagnostics, Arrays.asList("-Xjcov", "-source", "1.8"), null, fm.getJavaFileObjects(source));
Trees trees = Trees.instance(ct);
CompilationUnitTree cut = ct.parse().iterator().next();
ct.analyze();
for (Diagnostic<? extends JavaFileObject> d : diagnostics.getDiagnostics()) {
if (d.getKind() == Diagnostic.Kind.ERROR) {
throw new IllegalStateException("Should have been attributed without errors: " + diagnostics.getDiagnostics());
}
}
Pattern p = Pattern.compile("/\\*getElement:(.*?)\\*/");
Matcher m = p.matcher(cut.getSourceFile().getCharContent(false));
while (m.find()) {
TreePath tp = pathFor(trees, cut, m.start() - 1);
Element found = trees.getElement(tp);
String expected = m.group(1);
String actual = found != null ? found.getKind() + ":" + symbolToString(found) : "<null>";
if (!expected.equals(actual)) {
throw new IllegalStateException("expected=" + expected + "; actual=" + actual);
}
}
}
private static TreePath pathFor(final Trees trees, final CompilationUnitTree cut, final int pos) {
final TreePath[] result = new TreePath[1];
new TreePathScanner<Void, Void>() {
@Override public Void scan(Tree node, Void p) {
if ( node != null
&& trees.getSourcePositions().getStartPosition(cut, node) <= pos
&& pos <= trees.getSourcePositions().getEndPosition(cut, node)) {
result[0] = new TreePath(getCurrentPath(), node);
return super.scan(node, p);
}
return null;
}
}.scan(cut, null);
return result[0];
}
private static String symbolToString(Element el) {
switch (el.getKind()) {
case METHOD: return symbolToString(el.getEnclosingElement()) + "." + el.toString();
case CONSTRUCTOR: return symbolToString(el.getEnclosingElement().getEnclosingElement()) + "." + el.toString();
default:
return el.toString();
}
}
static class TestFileObject extends SimpleJavaFileObject {
private final String text;
public TestFileObject(String text) {
super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
this.text = text;
}
@Override public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return text;
}
}
}
/*
* Copyright (c) 2013, 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 test;
/*getElement:PACKAGE:test*/
import java.lang.annotation.*;
import static test.TestGetElementReferenceData.Sub.*;
public class TestGetElementReferenceData {
private static void test() {
StringBuilder/*getElement:CLASS:java.lang.StringBuilder*/ sb = new/*getElement:CONSTRUCTOR:java.lang.StringBuilder()*/ StringBuilder();
sb/*getElement:LOCAL_VARIABLE:sb*/.append/*getElement:METHOD:java.lang.StringBuilder.append(int)*/(0);
sb.reverse( /*getElement:METHOD:java.lang.StringBuilder.reverse()*/);
java.util.List< /*getElement:INTERFACE:java.util.List*/ String> l;
utility/*getElement:METHOD:test.TestGetElementReferenceData.Base.utility()*/();
target(TestGetElementReferenceData :: test/*getElement:METHOD:test.TestGetElementReferenceData.test()*/);
}
private static void target(Runnable r) { r.run(); }
public static class Base {
public static void utility() {}
}
public static class Sub extends @TypeAnnotation( /*getElement:ANNOTATION_TYPE:test.TestGetElementReferenceData.TypeAnnotation*/) Base {
}
@Deprecated( /*getElement:ANNOTATION_TYPE:java.lang.Deprecated*/)
public static class TypeParam<TT/*getElement:TYPE_PARAMETER:TT*/> {
}
@Target(ElementType.TYPE_USE)
@interface TypeAnnotation {
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册