< prev index next >
test/langtools/tools/javac/api/TestGetScopeResult.java
Print this page
rev 60024 : imported patch 8248641
@@ -21,21 +21,22 @@
* questions.
*/
/*
* @test
- * @bug 8205418 8207229 8207230 8230847 8245786 8247334
+ * @bug 8205418 8207229 8207230 8230847 8245786 8247334 8248641
* @summary Test the outcomes from Trees.getScope
* @modules jdk.compiler/com.sun.tools.javac.api
* jdk.compiler/com.sun.tools.javac.comp
* jdk.compiler/com.sun.tools.javac.tree
* jdk.compiler/com.sun.tools.javac.util
*/
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import javax.lang.model.element.Element;
import javax.tools.JavaCompiler;
import javax.tools.SimpleJavaFileObject;
@@ -80,10 +81,11 @@
new TestGetScopeResult().testAnnotations();
new TestGetScopeResult().testAnnotationsLazy();
new TestGetScopeResult().testCircular();
new TestGetScopeResult().testRecord();
new TestGetScopeResult().testLocalRecordAnnotation();
+ new TestGetScopeResult().testRuleCases();
}
public void run() throws IOException {
String[] simpleLambda = {
"s:java.lang.String",
@@ -634,10 +636,89 @@
}
}
}
}
+ void testRuleCases() throws IOException {
+ JavacTool c = JavacTool.create();
+ try (StandardJavaFileManager fm = c.getStandardFileManager(null, null, null)) {
+ String code = """
+ class Test {
+ void t(int i) {
+ long local;
+ System.err.println(switch (i) {
+ case 0 -> {
+ String var;
+ int scopeHere;
+ yield "";
+ }
+ default -> {
+ String var;
+ int scopeHere;
+ yield "";
+ }
+ });
+ switch (i) {
+ case 0 -> {
+ String var;
+ int scopeHere;
+ }
+ default -> {
+ String var;
+ int scopeHere;
+ }
+ };
+ }
+ }
+ """;
+ class MyFileObject extends SimpleJavaFileObject {
+ MyFileObject() {
+ super(URI.create("myfo:///Test.java"), SOURCE);
+ }
+ @Override
+ public String getCharContent(boolean ignoreEncodingErrors) {
+ return code;
+ }
+ }
+ Context ctx = new Context();
+ TestAnalyzer.preRegister(ctx);
+ List<String> options = List.of("--enable-preview",
+ "-source", System.getProperty("java.specification.version"));
+ JavacTask t = (JavacTask) c.getTask(null, fm, null, options, null,
+ List.of(new MyFileObject()), ctx);
+ CompilationUnitTree cut = t.parse().iterator().next();
+ t.analyze();
+
+ List<List<String>> actual = new ArrayList<>();
+
+ new TreePathScanner<Void, Void>() {
+ @Override
+ public Void visitVariable(VariableTree node, Void p) {
+ if (node.getName().contentEquals("scopeHere")) {
+ Scope scope = Trees.instance(t).getScope(getCurrentPath());
+ actual.add(dumpScope(scope));
+ }
+ return super.visitVariable(node, p);
+ }
+ }.scan(cut, null);
+
+ List<List<String>> expected =
+ Collections.nCopies(4,
+ List.of("scopeHere:int",
+ "var:java.lang.String",
+ "local:long",
+ "i:int",
+ "super:java.lang.Object",
+ "this:Test"
+ ));
+
+ if (!expected.equals(actual)) {
+ throw new AssertionError("Unexpected Scope content: " + actual);
+ }
+ }
+ }
+
private List<String> dumpScope(Scope scope) {
List<String> content = new ArrayList<>();
while (scope.getEnclosingClass() != null) {
for (Element el : scope.getLocalElements()) {
content.add(el.getSimpleName() + ":" +el.asType().toString());
< prev index next >