Skip to content

Commit 75d445d

Browse files
cushonError Prone Team
authored andcommitted
Prepare refaster for changes to implicit lambda parameter types in JDK-8268850
After https://bugs.openjdk.org/browse/JDK-8268850, `VariableTree#getType` will return `null` for implicit lambda parameter types. This updates refaster to handle templating for lambda parameter types using the inferred `Type`, instead of relying on an AST node being present containing the inferred type. PiperOrigin-RevId: 876129207
1 parent 01c603a commit 75d445d

File tree

5 files changed

+72
-21
lines changed

5 files changed

+72
-21
lines changed

core/src/main/java/com/google/errorprone/refaster/UTemplater.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import static com.google.common.base.Preconditions.checkArgument;
2020
import static com.google.common.base.Preconditions.checkState;
21+
import static com.google.errorprone.util.ASTHelpers.getType;
2122
import static com.google.errorprone.util.ASTHelpers.hasAnnotation;
2223
import static com.google.errorprone.util.ASTHelpers.isStatic;
2324
import static com.google.errorprone.util.AnnotationNames.REPEATED_ANNOTATION;
@@ -765,7 +766,8 @@ public UWhileLoop visitWhileLoop(WhileLoopTree tree, Void v) {
765766
public UVariableDecl visitVariable(VariableTree tree, Void v) {
766767
return UVariableDecl.create(
767768
tree.getName(),
768-
templateType(tree.getType()),
769+
(tree.getType() == null) ? null : templateType(tree.getType()),
770+
template(getType(tree)),
769771
(tree.getInitializer() == null) ? null : template(tree.getInitializer()));
770772
}
771773

core/src/main/java/com/google/errorprone/refaster/UVariableDecl.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,21 +47,35 @@
4747
*/
4848
@AutoValue
4949
public abstract class UVariableDecl extends USimpleStatement implements VariableTree {
50+
public static UVariableDecl create(
51+
CharSequence identifier,
52+
UExpression type,
53+
@Nullable UType variableType,
54+
@Nullable UExpression initializer) {
55+
return new AutoValue_UVariableDecl(StringName.of(identifier), type, variableType, initializer);
56+
}
5057

5158
public static UVariableDecl create(
5259
CharSequence identifier, UExpression type, @Nullable UExpression initializer) {
53-
return new AutoValue_UVariableDecl(StringName.of(identifier), type, initializer);
60+
return create(identifier, type, null, initializer);
5461
}
5562

5663
public static UVariableDecl create(CharSequence identifier, UExpression type) {
57-
return create(identifier, type, null);
64+
return create(identifier, type, null, null);
65+
}
66+
67+
public static UVariableDecl create(
68+
CharSequence identifier, UExpression type, UType variableType) {
69+
return create(identifier, type, variableType, null);
5870
}
5971

6072
@Override
6173
public abstract StringName getName();
6274

6375
@Override
64-
public abstract UExpression getType();
76+
public abstract @Nullable UExpression getType();
77+
78+
public abstract @Nullable UType getVariableType();
6579

6680
@Override
6781
public abstract @Nullable UExpression getInitializer();
@@ -73,7 +87,10 @@ ULocalVarIdent.Key key() {
7387
@Override
7488
public Choice<Unifier> visitVariable(VariableTree decl, Unifier unifier) {
7589
return Choice.condition(unifier.getBinding(key()) == null, unifier)
76-
.flatMap(unifications(getType(), decl.getType()))
90+
.flatMap(
91+
getType() != null
92+
? unifications(getType(), decl.getType())
93+
: unifications(getVariableType(), ASTHelpers.getType(decl)))
7794
.flatMap(unifications(getInitializer(), decl.getInitializer()))
7895
.map(
7996
new Function<Unifier, Unifier>() {

core/src/test/java/com/google/errorprone/refaster/TemplatingTest.java

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,8 @@ public void doWhile() {
342342
.isEqualTo(
343343
BlockTemplate.create(
344344
ImmutableMap.of("str", UClassType.create("java.lang.String")),
345-
UVariableDecl.create("old", UPrimitiveTypeTree.INT, ULiteral.intLit(0)),
345+
UVariableDecl.create(
346+
"old", UPrimitiveTypeTree.INT, UPrimitiveType.INT, ULiteral.intLit(0)),
346347
UDoWhileLoop.create(
347348
UBlock.create(
348349
UExpressionStatement.create(
@@ -477,7 +478,10 @@ public void forLoop() {
477478
UForLoop.create(
478479
ImmutableList.of(
479480
UVariableDecl.create(
480-
"i", UPrimitiveTypeTree.INT, UFreeIdent.create("from"))),
481+
"i",
482+
UPrimitiveTypeTree.INT,
483+
UPrimitiveType.INT,
484+
UFreeIdent.create("from"))),
481485
UBinary.create(
482486
Kind.LESS_THAN, ULocalVarIdent.create("i"), UFreeIdent.create("to")),
483487
ImmutableList.of(
@@ -504,7 +508,10 @@ public void forLoopNoStep() {
504508
UForLoop.create(
505509
ImmutableList.of(
506510
UVariableDecl.create(
507-
"i", UPrimitiveTypeTree.INT, UFreeIdent.create("from"))),
511+
"i",
512+
UPrimitiveTypeTree.INT,
513+
UPrimitiveType.INT,
514+
UFreeIdent.create("from"))),
508515
UBinary.create(
509516
Kind.LESS_THAN, ULocalVarIdent.create("i"), UFreeIdent.create("to")),
510517
ImmutableList.<UExpressionStatement>of(),
@@ -529,7 +536,10 @@ public void forLoopNoCondition() {
529536
UForLoop.create(
530537
ImmutableList.of(
531538
UVariableDecl.create(
532-
"i", UPrimitiveTypeTree.INT, UFreeIdent.create("from"))),
539+
"i",
540+
UPrimitiveTypeTree.INT,
541+
UPrimitiveType.INT,
542+
UFreeIdent.create("from"))),
533543
null,
534544
ImmutableList.of(
535545
UExpressionStatement.create(
@@ -667,6 +677,7 @@ public void localVariable() {
667677
UVariableDecl.create(
668678
"list",
669679
UTypeApply.create("java.util.List", UTypeVarIdent.create("E")),
680+
UClassType.create("java.util.List", UTypeVar.create("E")),
670681
UNewClass.create(
671682
UTypeApply.create("java.util.ArrayList", UTypeVarIdent.create("E")),
672683
UFreeIdent.create("collection"))),
@@ -718,9 +729,10 @@ public void forEach() {
718729
.isEqualTo(
719730
BlockTemplate.create(
720731
ImmutableMap.of("array", UArrayType.create(UPrimitiveType.INT)),
721-
UVariableDecl.create("sum", UPrimitiveTypeTree.INT, ULiteral.intLit(0)),
732+
UVariableDecl.create(
733+
"sum", UPrimitiveTypeTree.INT, UPrimitiveType.INT, ULiteral.intLit(0)),
722734
UEnhancedForLoop.create(
723-
UVariableDecl.create("value", UPrimitiveTypeTree.INT),
735+
UVariableDecl.create("value", UPrimitiveTypeTree.INT, UPrimitiveType.INT),
724736
UFreeIdent.create("array"),
725737
UBlock.create(
726738
UExpressionStatement.create(
@@ -747,12 +759,14 @@ public void synchronizd() {
747759
.isEqualTo(
748760
BlockTemplate.create(
749761
ImmutableMap.of("array", UArrayType.create(UPrimitiveType.INT)),
750-
UVariableDecl.create("sum", UPrimitiveTypeTree.INT, ULiteral.intLit(0)),
762+
UVariableDecl.create(
763+
"sum", UPrimitiveTypeTree.INT, UPrimitiveType.INT, ULiteral.intLit(0)),
751764
USynchronized.create(
752765
UParens.create(UFreeIdent.create("array")),
753766
UBlock.create(
754767
UEnhancedForLoop.create(
755-
UVariableDecl.create("value", UPrimitiveTypeTree.INT),
768+
UVariableDecl.create(
769+
"value", UPrimitiveTypeTree.INT, UPrimitiveType.INT),
756770
UFreeIdent.create("array"),
757771
UBlock.create(
758772
UExpressionStatement.create(
@@ -814,9 +828,13 @@ public void anonymousClass() {
814828
UPrimitiveTypeTree.INT,
815829
ImmutableList.of(
816830
UVariableDecl.create(
817-
"a", UClassIdent.create("java.lang.String")),
831+
"a",
832+
UClassIdent.create("java.lang.String"),
833+
UClassType.create("java.lang.String")),
818834
UVariableDecl.create(
819-
"b", UClassIdent.create("java.lang.String"))),
835+
"b",
836+
UClassIdent.create("java.lang.String"),
837+
UClassType.create("java.lang.String"))),
820838
ImmutableList.<UExpression>of(),
821839
UBlock.create(
822840
UReturn.create(

core/src/test/java/com/google/errorprone/refaster/UEnhancedForLoopTest.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public void equality() {
3434
new EqualsTester()
3535
.addEqualityGroup(
3636
UEnhancedForLoop.create(
37-
UVariableDecl.create("c", UPrimitiveTypeTree.CHAR, null),
37+
UVariableDecl.create("c", UPrimitiveTypeTree.CHAR, UPrimitiveType.CHAR),
3838
UMethodInvocation.create(
3939
UMemberSelect.create(
4040
ULiteral.stringLit("foo"),
@@ -43,7 +43,10 @@ public void equality() {
4343
USkip.INSTANCE))
4444
.addEqualityGroup(
4545
UEnhancedForLoop.create(
46-
UVariableDecl.create("c", UClassIdent.create("java.lang.Character"), null),
46+
UVariableDecl.create(
47+
"c",
48+
UClassIdent.create("java.lang.Character"),
49+
UClassType.create("java.lang.Character")),
4750
UMethodInvocation.create(
4851
UMemberSelect.create(
4952
ULiteral.stringLit("foo"),
@@ -57,7 +60,7 @@ public void equality() {
5760
public void serialization() {
5861
SerializableTester.reserializeAndAssert(
5962
UEnhancedForLoop.create(
60-
UVariableDecl.create("c", UPrimitiveTypeTree.CHAR, null),
63+
UVariableDecl.create("c", UPrimitiveTypeTree.CHAR, UPrimitiveType.CHAR),
6164
UMethodInvocation.create(
6265
UMemberSelect.create(
6366
ULiteral.stringLit("foo"),

core/src/test/java/com/google/errorprone/refaster/UVariableDeclTest.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,24 @@ public class UVariableDeclTest {
3232
@Test
3333
public void equality() {
3434
new EqualsTester()
35-
.addEqualityGroup(UVariableDecl.create("foo", UClassIdent.create("java.lang.String"), null))
35+
.addEqualityGroup(
36+
UVariableDecl.create(
37+
"foo",
38+
UClassIdent.create("java.lang.String"),
39+
UClassType.create("java.lang.String")))
3640
.addEqualityGroup(
3741
UVariableDecl.create(
3842
"foo", UClassIdent.create("java.lang.String"), ULiteral.stringLit("bar")))
3943
.addEqualityGroup(
40-
UVariableDecl.create("foo", UClassIdent.create("java.lang.Integer"), null))
41-
.addEqualityGroup(UVariableDecl.create("baz", UClassIdent.create("java.lang.String"), null))
44+
UVariableDecl.create(
45+
"foo",
46+
UClassIdent.create("java.lang.Integer"),
47+
UClassType.create("java.lang.Integer")))
48+
.addEqualityGroup(
49+
UVariableDecl.create(
50+
"baz",
51+
UClassIdent.create("java.lang.String"),
52+
UClassType.create("java.lang.String")))
4253
.testEquals();
4354
}
4455

0 commit comments

Comments
 (0)