Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ protected void acceptInner(TreeVisitor visitor) {
if (visitor.visit(this)) {
leftOperand.accept(visitor);
rightOperand.accept(visitor);
pattern.accept(visitor);
}
visitor.endVisit(this);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@
import com.google.devtools.j2objc.types.GeneratedVariableElement;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashSet;
import java.util.Set;
import javax.lang.model.element.VariableElement;

/**
Expand All @@ -50,8 +48,6 @@ public class InstanceOfPatternRewriter extends UnitTreeVisitor {
private int tempCount;
private int patternCount;

private Set<VariableElement> patternVariables = new HashSet<>();

public InstanceOfPatternRewriter(CompilationUnit unit) {
super(unit);
}
Expand All @@ -67,14 +63,6 @@ public void endVisit(Block node) {
enclosingScopes.pop();
}

@Override
public void endVisit(SimpleName node) {
if (patternVariables.contains(node.getElement())) {
// Rename all existing access to the variable to the new name.
node.setIdentifier(nameTable.getVariableShortName((VariableElement) node.getElement()));
}
}

@Override
public void endVisit(InstanceofExpression node) {
if (node.getPattern() == null) {
Expand All @@ -89,7 +77,6 @@ public void endVisit(InstanceofExpression node) {
nameTable.setVariableName(
patternVariable,
nameTable.getVariableShortName(patternVariable) + "$pattern$" + patternCount++);
patternVariables.add(patternVariable);

// Generate a temporary variable to preserve evaluation semantics.
VariableElement tempVariable =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -368,10 +368,17 @@ private static boolean hasModifier(Element element, Modifier modifier) {
}

public static boolean isVariable(Element element) {
ElementKind kind = element.getKind();
return kind == ElementKind.FIELD || kind == ElementKind.LOCAL_VARIABLE
|| kind == ElementKind.PARAMETER || kind == ElementKind.EXCEPTION_PARAMETER
|| kind == ElementKind.RESOURCE_VARIABLE || kind == ElementKind.ENUM_CONSTANT;
return switch (element.getKind()) {
case FIELD,
LOCAL_VARIABLE,
PARAMETER,
EXCEPTION_PARAMETER,
RESOURCE_VARIABLE,
ENUM_CONSTANT,
BINDING_VARIABLE ->
true;
default -> false;
};
}

public static boolean isField(Element element) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2072,8 +2072,9 @@ public void testASTConversionSimpleSwitchExpressionWithPatternAndGuard() throws
ast,
"java.lang.String test( java.lang.String str){",
" java.lang.String msg;",
" if (JreIndexOfStr(str, {}, 0) instanceof java.lang.String "
+ "&& ((java.lang.String)JreIndexOfStr(str, {}, 0)).length() > 10) {",
" if (JreIndexOfStr(str, {}, 0) instanceof java.lang.String &&"
+ " ((java.lang.String)nil_chk(((java.lang.String)JreIndexOfStr(str, {},"
+ " 0)))).length() > 10) {",
" msg=JreStrcat($$, \"Long string: \", ((java.lang.String)JreIndexOfStr(str, {},"
+ " 0)));",
" }",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,11 @@ public void testIssue2580() throws IOException {
"id y = @\"Hello\";",
"if (x != nil && (tmp$0 = y, s$pattern$0 = [tmp$0 isKindOfClass:[NSString class]] ?"
+ " (NSString *) tmp$0 : nil, !JreStringEqualsEquals(s$pattern$0, nil))) {",
"int32_t i = [s$pattern$0 java_length];",
"int32_t i = [((NSString *) nil_chk(s$pattern$0)) java_length];",
"}",
"if (x != nil && ((tmp$1 = y, s$pattern$1 = [tmp$1 isKindOfClass:[NSString class]] ?"
+ " (NSString *) tmp$1 : nil, !JreStringEqualsEquals(s$pattern$1, nil)))) {",
" int32_t i = [s$pattern$1 java_length];",
" int32_t i = [((NSString *) nil_chk(s$pattern$1)) java_length];",
"}");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,41 +57,42 @@ public void testSwitchCaseWithInstanceOf() throws IOException {
public void testSwitchCaseWithOverlappingGuards() throws IOException {
testOnJava21OrAbove(
() -> {
String source =
String source =
"class Test {\n"
+ " void checkObject(Object obj) {\n"
+ " switch (obj) {\n"
// The > 25 test must still be tested before > 5.
+ " case String s when s.length() > 25 -> log(\"Long string\");\n"
+ " case String s when s.length() > 5 -> log(\"Medium string\");\n"
// Test without guard.
+ " case String s -> log(\"Short string\");\n"
// Test with different pattern, no guard.
+ " case Integer i -> log(\"An integer: \" + i);\n"
+ " default -> log(\"Something else\");\n"
+ " }\n"
+ " }\n"
+ " private static void log(String s) {\n"
+ " System.out.println(s);\n"
+ " }\n"
+ "}\n";
+ " void checkObject(Object obj) {\n"
+ " switch (obj) {\n"
// The > 25 test must still be tested before > 5.
+ " case String s when s.length() > 25 -> log(\"Long string\");\n"
+ " case String s when s.length() > 5 -> log(\"Medium string\");\n"
// Test without guard.
+ " case String s -> log(\"Short string\");\n"
// Test with different pattern, no guard.
+ " case Integer i -> log(\"An integer: \" + i);\n"
+ " default -> log(\"Something else\");\n"
+ " }\n"
+ " }\n"
+ " private static void log(String s) {\n"
+ " System.out.println(s);\n"
+ " }\n"
+ "}\n";
String translation = translateSourceFile(source, "Test", "Test.m");
assertTranslatedLines(translation,
"- (void)checkObjectWithId:(id)obj {",
assertTranslatedLines(
translation,
"- (void)checkObjectWithId:(id)obj {",
" if ([obj isKindOfClass:[NSString class]] && "
+ "[((NSString *) obj) java_length] > 25) {",
+ "[((NSString *) nil_chk(((NSString *) obj))) java_length] > 25) {",
" Test_logWithNSString_(@\"Long string\");",
" }",
" else if ([obj isKindOfClass:[NSString class]] && "
+ "[((NSString *) obj) java_length] > 5) {",
+ "[((NSString *) nil_chk(((NSString *) obj))) java_length] > 5) {",
" Test_logWithNSString_(@\"Medium string\");",
" }",
" else if ([obj isKindOfClass:[NSString class]]) {",
" Test_logWithNSString_(@\"Short string\");",
" }",
" else if ([obj isKindOfClass:[JavaLangInteger class]]) {",
" Test_logWithNSString_(JreStrcat(\"$@\", "
+ "@\"An integer: \", ((JavaLangInteger *) obj)));",
+ "@\"An integer: \", ((JavaLangInteger *) obj)));",
" }",
" else {",
" Test_logWithNSString_(@\"Something else\");",
Expand Down Expand Up @@ -124,14 +125,16 @@ public void testSwitchCaseWithStatements() throws IOException {
"NSString *s$pattern$0;",
"id tmp$0;",
"id o2 = @\"\";",
"if ([o isKindOfClass:[JavaLangInteger class]] && [((JavaLangInteger *) o) intValue]"
+ " == 0 && [((JavaLangInteger *) o) intValue] < 1 && (tmp$0 = o2, s$pattern$0 ="
+ " [tmp$0 isKindOfClass:[NSString class]] ? (NSString *) tmp$0 : nil,"
+ " !JreStringEqualsEquals(s$pattern$0, nil))) {",
"if ([o isKindOfClass:[JavaLangInteger class]] && [((JavaLangInteger *)"
+ " nil_chk(((JavaLangInteger *) o))) intValue] == 0 && [((JavaLangInteger *) o)"
+ " intValue] < 1 && (tmp$0 = o2, s$pattern$0 = [tmp$0 isKindOfClass:[NSString"
+ " class]] ? (NSString *) tmp$0 : nil, !JreStringEqualsEquals(s$pattern$0,"
+ " nil))) {",
" return @\"true\";",
"}",
"else if ([o isKindOfClass:[JavaLangInteger class]] && [((JavaLangInteger *) o)"
+ " intValue] == 0 || [((JavaLangInteger *) o) intValue] > 1) {",
"else if ([o isKindOfClass:[JavaLangInteger class]] && [((JavaLangInteger *)"
+ " nil_chk(((JavaLangInteger *) o))) intValue] == 0 || [((JavaLangInteger *) o)"
+ " intValue] > 1) {",
" return @\"second\";",
"}",
"else if ([o isKindOfClass:[NSObject class]]) {",
Expand Down