Skip to content

Commit df8cded

Browse files
rlublecopybara-github
authored andcommitted
Add missing handling of binding variables in the visitors.
PiperOrigin-RevId: 824071484
1 parent 415328c commit df8cded

File tree

6 files changed

+44
-48
lines changed

6 files changed

+44
-48
lines changed

translator/src/main/java/com/google/devtools/j2objc/ast/InstanceofExpression.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ protected void acceptInner(TreeVisitor visitor) {
8383
if (visitor.visit(this)) {
8484
leftOperand.accept(visitor);
8585
rightOperand.accept(visitor);
86+
pattern.accept(visitor);
8687
}
8788
visitor.endVisit(this);
8889
}

translator/src/main/java/com/google/devtools/j2objc/translate/InstanceOfPatternRewriter.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@
3131
import com.google.devtools.j2objc.types.GeneratedVariableElement;
3232
import java.util.ArrayDeque;
3333
import java.util.Deque;
34-
import java.util.HashSet;
35-
import java.util.Set;
3634
import javax.lang.model.element.VariableElement;
3735

3836
/**
@@ -50,8 +48,6 @@ public class InstanceOfPatternRewriter extends UnitTreeVisitor {
5048
private int tempCount;
5149
private int patternCount;
5250

53-
private Set<VariableElement> patternVariables = new HashSet<>();
54-
5551
public InstanceOfPatternRewriter(CompilationUnit unit) {
5652
super(unit);
5753
}
@@ -67,14 +63,6 @@ public void endVisit(Block node) {
6763
enclosingScopes.pop();
6864
}
6965

70-
@Override
71-
public void endVisit(SimpleName node) {
72-
if (patternVariables.contains(node.getElement())) {
73-
// Rename all existing access to the variable to the new name.
74-
node.setIdentifier(nameTable.getVariableShortName((VariableElement) node.getElement()));
75-
}
76-
}
77-
7866
@Override
7967
public void endVisit(InstanceofExpression node) {
8068
if (node.getPattern() == null) {
@@ -89,7 +77,6 @@ public void endVisit(InstanceofExpression node) {
8977
nameTable.setVariableName(
9078
patternVariable,
9179
nameTable.getVariableShortName(patternVariable) + "$pattern$" + patternCount++);
92-
patternVariables.add(patternVariable);
9380

9481
// Generate a temporary variable to preserve evaluation semantics.
9582
VariableElement tempVariable =

translator/src/main/java/com/google/devtools/j2objc/util/ElementUtil.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -369,9 +369,13 @@ private static boolean hasModifier(Element element, Modifier modifier) {
369369

370370
public static boolean isVariable(Element element) {
371371
ElementKind kind = element.getKind();
372-
return kind == ElementKind.FIELD || kind == ElementKind.LOCAL_VARIABLE
373-
|| kind == ElementKind.PARAMETER || kind == ElementKind.EXCEPTION_PARAMETER
374-
|| kind == ElementKind.RESOURCE_VARIABLE || kind == ElementKind.ENUM_CONSTANT;
372+
return kind == ElementKind.FIELD
373+
|| kind == ElementKind.LOCAL_VARIABLE
374+
|| kind == ElementKind.PARAMETER
375+
|| kind == ElementKind.EXCEPTION_PARAMETER
376+
|| kind == ElementKind.RESOURCE_VARIABLE
377+
|| kind == ElementKind.ENUM_CONSTANT
378+
|| kind == ElementKind.BINDING_VARIABLE;
375379
}
376380

377381
public static boolean isField(Element element) {

translator/src/test/java/com/google/devtools/j2objc/gen/StatementGeneratorTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2072,8 +2072,9 @@ public void testASTConversionSimpleSwitchExpressionWithPatternAndGuard() throws
20722072
ast,
20732073
"java.lang.String test( java.lang.String str){",
20742074
" java.lang.String msg;",
2075-
" if (JreIndexOfStr(str, {}, 0) instanceof java.lang.String "
2076-
+ "&& ((java.lang.String)JreIndexOfStr(str, {}, 0)).length() > 10) {",
2075+
" if (JreIndexOfStr(str, {}, 0) instanceof java.lang.String &&"
2076+
+ " ((java.lang.String)nil_chk(((java.lang.String)JreIndexOfStr(str, {},"
2077+
+ " 0)))).length() > 10) {",
20772078
" msg=JreStrcat($$, \"Long string: \", ((java.lang.String)JreIndexOfStr(str, {},"
20782079
+ " 0)));",
20792080
" }",

translator/src/test/java/com/google/devtools/j2objc/translate/InstanceOfPatternRewriterTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,11 @@ public void testIssue2580() throws IOException {
9393
"id y = @\"Hello\";",
9494
"if (x != nil && (tmp$0 = y, s$pattern$0 = [tmp$0 isKindOfClass:[NSString class]] ?"
9595
+ " (NSString *) tmp$0 : nil, !JreStringEqualsEquals(s$pattern$0, nil))) {",
96-
"int32_t i = [s$pattern$0 java_length];",
96+
"int32_t i = [((NSString *) nil_chk(s$pattern$0)) java_length];",
9797
"}",
9898
"if (x != nil && ((tmp$1 = y, s$pattern$1 = [tmp$1 isKindOfClass:[NSString class]] ?"
9999
+ " (NSString *) tmp$1 : nil, !JreStringEqualsEquals(s$pattern$1, nil)))) {",
100-
" int32_t i = [s$pattern$1 java_length];",
100+
" int32_t i = [((NSString *) nil_chk(s$pattern$1)) java_length];",
101101
"}");
102102
}
103103
}

translator/src/test/java/com/google/devtools/j2objc/translate/SwitchCaseRewriterTest.java

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -57,41 +57,42 @@ public void testSwitchCaseWithInstanceOf() throws IOException {
5757
public void testSwitchCaseWithOverlappingGuards() throws IOException {
5858
testOnJava21OrAbove(
5959
() -> {
60-
String source =
60+
String source =
6161
"class Test {\n"
62-
+ " void checkObject(Object obj) {\n"
63-
+ " switch (obj) {\n"
64-
// The > 25 test must still be tested before > 5.
65-
+ " case String s when s.length() > 25 -> log(\"Long string\");\n"
66-
+ " case String s when s.length() > 5 -> log(\"Medium string\");\n"
67-
// Test without guard.
68-
+ " case String s -> log(\"Short string\");\n"
69-
// Test with different pattern, no guard.
70-
+ " case Integer i -> log(\"An integer: \" + i);\n"
71-
+ " default -> log(\"Something else\");\n"
72-
+ " }\n"
73-
+ " }\n"
74-
+ " private static void log(String s) {\n"
75-
+ " System.out.println(s);\n"
76-
+ " }\n"
77-
+ "}\n";
62+
+ " void checkObject(Object obj) {\n"
63+
+ " switch (obj) {\n"
64+
// The > 25 test must still be tested before > 5.
65+
+ " case String s when s.length() > 25 -> log(\"Long string\");\n"
66+
+ " case String s when s.length() > 5 -> log(\"Medium string\");\n"
67+
// Test without guard.
68+
+ " case String s -> log(\"Short string\");\n"
69+
// Test with different pattern, no guard.
70+
+ " case Integer i -> log(\"An integer: \" + i);\n"
71+
+ " default -> log(\"Something else\");\n"
72+
+ " }\n"
73+
+ " }\n"
74+
+ " private static void log(String s) {\n"
75+
+ " System.out.println(s);\n"
76+
+ " }\n"
77+
+ "}\n";
7878
String translation = translateSourceFile(source, "Test", "Test.m");
79-
assertTranslatedLines(translation,
80-
"- (void)checkObjectWithId:(id)obj {",
79+
assertTranslatedLines(
80+
translation,
81+
"- (void)checkObjectWithId:(id)obj {",
8182
" if ([obj isKindOfClass:[NSString class]] && "
82-
+ "[((NSString *) obj) java_length] > 25) {",
83+
+ "[((NSString *) nil_chk(((NSString *) obj))) java_length] > 25) {",
8384
" Test_logWithNSString_(@\"Long string\");",
8485
" }",
8586
" else if ([obj isKindOfClass:[NSString class]] && "
86-
+ "[((NSString *) obj) java_length] > 5) {",
87+
+ "[((NSString *) nil_chk(((NSString *) obj))) java_length] > 5) {",
8788
" Test_logWithNSString_(@\"Medium string\");",
8889
" }",
8990
" else if ([obj isKindOfClass:[NSString class]]) {",
9091
" Test_logWithNSString_(@\"Short string\");",
9192
" }",
9293
" else if ([obj isKindOfClass:[JavaLangInteger class]]) {",
9394
" Test_logWithNSString_(JreStrcat(\"$@\", "
94-
+ "@\"An integer: \", ((JavaLangInteger *) obj)));",
95+
+ "@\"An integer: \", ((JavaLangInteger *) obj)));",
9596
" }",
9697
" else {",
9798
" Test_logWithNSString_(@\"Something else\");",
@@ -124,14 +125,16 @@ public void testSwitchCaseWithStatements() throws IOException {
124125
"NSString *s$pattern$0;",
125126
"id tmp$0;",
126127
"id o2 = @\"\";",
127-
"if ([o isKindOfClass:[JavaLangInteger class]] && [((JavaLangInteger *) o) intValue]"
128-
+ " == 0 && [((JavaLangInteger *) o) intValue] < 1 && (tmp$0 = o2, s$pattern$0 ="
129-
+ " [tmp$0 isKindOfClass:[NSString class]] ? (NSString *) tmp$0 : nil,"
130-
+ " !JreStringEqualsEquals(s$pattern$0, nil))) {",
128+
"if ([o isKindOfClass:[JavaLangInteger class]] && [((JavaLangInteger *)"
129+
+ " nil_chk(((JavaLangInteger *) o))) intValue] == 0 && [((JavaLangInteger *) o)"
130+
+ " intValue] < 1 && (tmp$0 = o2, s$pattern$0 = [tmp$0 isKindOfClass:[NSString"
131+
+ " class]] ? (NSString *) tmp$0 : nil, !JreStringEqualsEquals(s$pattern$0,"
132+
+ " nil))) {",
131133
" return @\"true\";",
132134
"}",
133-
"else if ([o isKindOfClass:[JavaLangInteger class]] && [((JavaLangInteger *) o)"
134-
+ " intValue] == 0 || [((JavaLangInteger *) o) intValue] > 1) {",
135+
"else if ([o isKindOfClass:[JavaLangInteger class]] && [((JavaLangInteger *)"
136+
+ " nil_chk(((JavaLangInteger *) o))) intValue] == 0 || [((JavaLangInteger *) o)"
137+
+ " intValue] > 1) {",
135138
" return @\"second\";",
136139
"}",
137140
"else if ([o isKindOfClass:[NSObject class]]) {",

0 commit comments

Comments
 (0)