Handle new AST nodes for `var` types in refaster After https://bugs.openjdk.org/browse/JDK-8268850, VariableTree#getType will return null for implicit lambda parameter types. PiperOrigin-RevId: 923440562
diff --git a/core/src/main/java/com/google/errorprone/refaster/UTemplater.java b/core/src/main/java/com/google/errorprone/refaster/UTemplater.java index c974176..842df0d 100644 --- a/core/src/main/java/com/google/errorprone/refaster/UTemplater.java +++ b/core/src/main/java/com/google/errorprone/refaster/UTemplater.java
@@ -766,7 +766,7 @@ public UVariableDecl visitVariable(VariableTree tree, Void v) { return UVariableDecl.create( tree.getName(), - (tree.getType() == null) ? null : templateType(tree.getType()), + UVariableDecl.isVarType(tree) ? null : templateType(tree.getType()), template(getType(tree)), (tree.getInitializer() == null) ? null : template(tree.getInitializer())); }
diff --git a/core/src/main/java/com/google/errorprone/refaster/UVariableDecl.java b/core/src/main/java/com/google/errorprone/refaster/UVariableDecl.java index 7d497e4..d57828a 100644 --- a/core/src/main/java/com/google/errorprone/refaster/UVariableDecl.java +++ b/core/src/main/java/com/google/errorprone/refaster/UVariableDecl.java
@@ -23,6 +23,7 @@ import com.google.errorprone.util.ASTHelpers; import com.sun.source.tree.ExpressionTree; import com.sun.source.tree.ModifiersTree; +import com.sun.source.tree.Tree; import com.sun.source.tree.TreeVisitor; import com.sun.source.tree.VariableTree; import com.sun.tools.javac.tree.JCTree.JCModifiers; @@ -84,11 +85,16 @@ return new ULocalVarIdent.Key(getName()); } + static boolean isVarType(VariableTree tree) { + Tree type = tree.getType(); + return type == null || type.getKind().name().equals("VAR_TYPE"); + } + @Override public Choice<Unifier> visitVariable(VariableTree decl, Unifier unifier) { return Choice.condition(unifier.getBinding(key()) == null, unifier) .flatMap( - (getType() != null && decl.getType() != null) + (getType() != null && !isVarType(decl)) ? unifications(getType(), decl.getType()) : unifications(getVariableType(), ASTHelpers.getType(decl))) .flatMap(unifications(getInitializer(), decl.getInitializer()))
diff --git a/core/src/test/java/com/google/errorprone/refaster/TemplatingTest.java b/core/src/test/java/com/google/errorprone/refaster/TemplatingTest.java index 64b9a7c..68cabbb 100644 --- a/core/src/test/java/com/google/errorprone/refaster/TemplatingTest.java +++ b/core/src/test/java/com/google/errorprone/refaster/TemplatingTest.java
@@ -847,4 +847,28 @@ UClassType.create("java.lang.String"))), ULocalVarIdent.create("b"))))))))))); } + + @Test + public void localVariableWithVar() { + compile( + """ + class LocalVariableExample { + public void example(String str) { + var x = str; + } + } + """); + assertThat(UTemplater.createTemplate(context, getMethodDeclaration("example"))) + .isEqualTo( + BlockTemplate.create( + ImmutableMap.of("str", UClassType.create("java.lang.String")), + UVariableDecl.create( + "x", + // https://bugs.openjdk.org/browse/JDK-8268850 + Runtime.version().feature() >= 27 + ? null + : UClassIdent.create("java.lang.String"), + UClassType.create("java.lang.String"), + UFreeIdent.create("str")))); + } }