Thanks to visit codestin.com
Credit goes to chromium.googlesource.com

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"))));
+  }
 }