[java-highlighting] IDEA-324625 Highlight using non-final variable in guard

GitOrigin-RevId: 0cedf700c6960e15104409b9cc411e8a5bd15fea
This commit is contained in:
Mikhail Pyltsin
2023-07-11 19:12:17 +02:00
committed by intellij-monorepo-bot
parent 5237df5eb3
commit 6f2c4ec3f3
5 changed files with 30 additions and 169 deletions

View File

@@ -99,7 +99,7 @@ class Test {
// try-with-resources
try (<error descr="Variable used as a try-with-resources resource should be final or effectively final">in</error>) {
switch (o) {
case AutoCloseable ii when (<error descr="Variable used in guarded pattern should be final or effectively final">in</error> = ii) != null: break;
case AutoCloseable ii when (<error descr="Cannot assign a value to variable 'in', because it is declared outside the guard">in</error> = 1) != null: break;
default: break;
}
} catch (Exception e) {
@@ -171,4 +171,14 @@ class Test {
break;
}
}
public static void testWhenReassigned() {
Object object = "1234";
switch (object) {
case String s when <error descr="Variable used in guarded pattern should be final or effectively final">s</error>.length()==2 -> {
s = null;
}
default -> {
}
}
}
}

View File

@@ -1,159 +0,0 @@
import java.util.function.*;
class Test {
void test1(Object o, int mode) {
switch (o) {
case Integer i when i == <error descr="Variable used in guarded pattern should be final or effectively final">mode</error> -> System.out.println();
default -> {}
}
switch (o) {
case Integer i when (switch (o) {
case Integer ii when ii != <error descr="Variable used in guarded pattern should be final or effectively final">mode</error> -> 2;
default -> 1;
}) == <error descr="Variable used in guarded pattern should be final or effectively final">mode</error> -> System.out.println();
default -> {}
}
switch (o) {
case Integer i when (i = <error descr="Variable used in guarded pattern should be final or effectively final">mode</error>) > 0 -> System.out.println();
default -> {}
}
mode = 0;
}
void test2(Object o, final int mode) {
switch (o) {
case Integer i when (switch (<error descr="Variable used in guarded pattern should be final or effectively final">o</error>) {
case Integer ii when ii != mode -> 2;
default -> 1;
}) == mode -> o = null;
default -> {}
}
switch (o) {
case Integer i when (<error descr="Cannot assign a value to variable 'i', because it is declared outside the guard">i</error> = mode) > 0 -> System.out.println();
default -> {}
}
}
void test3(Object o, int mode) {
switch (o) {
case Integer i when i == mode -> System.out.println();
default -> {}
}
switch (o) {
case Integer i when (switch (o) {
case Integer ii when ii != mode -> 2;
default -> 1;
}) == mode -> System.out.println();
default -> {}
}
}
void testNested(Object o, Integer in) {
switch (o) {
case Integer mode when (<error descr="Cannot assign a value to variable 'mode', because it is declared outside the guard">mode</error> = 42) > 9:
switch (o) {
case Integer i when (i = <error descr="Variable used in guarded pattern should be final or effectively final">mode</error>) > 0 -> System.out.println();
default -> System.out.println();
}
default : break;
}
String str;
str = switch (o) {
case Integer mode when (<error descr="Cannot assign a value to variable 'mode', because it is declared outside the guard">mode</error> = 42) > 9 ->
switch (o) {
case Integer i when (i = <error descr="Variable used in guarded pattern should be final or effectively final">mode</error>) > 0 -> "";
default -> "";
};
default -> "";
};
str = switch (o) {
case Integer mode when (<error descr="Cannot assign a value to variable 'mode', because it is declared outside the guard">mode</error> = 42) > 9:
yield switch (o) {
case Integer i when (i = <error descr="Variable used in guarded pattern should be final or effectively final">mode</error>) > 0 -> "";
default -> "";
};
default: yield "";
};
// lambdas
str = switch (o) {
case Integer i when (i = <error descr="Variable used in guarded pattern should be final or effectively final">in</error>) > 0:
yield ((Function<Integer, String>)(x) -> (<error descr="Variable used in lambda expression should be final or effectively final">in</error> = 5) > 0 ? "" : null).apply(in);
default:
yield "";
};
Consumer<Integer> c = (mode) -> {
switch (o) {
case Integer i when (i = <error descr="Variable used in guarded pattern should be final or effectively final">in</error>) > 0 -> System.out.println();
default -> System.out.println();
}
<error descr="Variable used in lambda expression should be final or effectively final">in</error> = 1;
};
// try-with-resources
try (<error descr="Variable used as a try-with-resources resource should be final or effectively final">in</error>) {
switch (o) {
case AutoCloseable ii when (<error descr="Variable used in guarded pattern should be final or effectively final">in</error> = ii) != null: break;
default: break;
}
} catch (Exception e) {
}
// double nested
switch (o) {
case Integer mode when (<error descr="Cannot assign a value to variable 'mode', because it is declared outside the guard">mode</error> = 42) > 9:
switch (o) {
case Integer i -> {
switch (o) {
case Integer ii when ii > <error descr="Variable used in guarded pattern should be final or effectively final">mode</error>:
break;
default:
break;
}
}
default -> System.out.println();
}
default:
break;
}
str = switch (o) {
case Integer mode when (mode) > 9:
yield switch (o) {
case Integer i -> {
yield switch (o) {
case Integer ii when ii > mode: yield "";
default: yield "";
};
}
default -> "";
};
default: yield "";
};
}
void declaredInWhenExpression(Object obj) {
switch (obj) {
case Integer i when new Function<Integer, Boolean>() {
@Override
public Boolean apply(Integer integer) {
System.out.println(integer++);
int num = 0;
System.out.println(++num);
return true;
}
}.apply(42) -> {}
default -> {}
}
switch (obj) {
case Integer i when switch (i) {
case 1 -> {
int num = 0;
++num;
yield num;
}
default -> 42;
} == 42 -> {}
default -> {}
}
}
}

View File

@@ -35,13 +35,13 @@ class Main {
void nestedStatement(Object o, Object o2, int p) {
int m = 0;
switch (o) {
case Integer n when n < 1:
case Integer n when <error descr="Variable used in guarded pattern should be final or effectively final">n</error> < 1:
n ++;
case Integer n when n > 1:
switch(o2) {
case Integer <error descr="Variable 'm' is already defined in the scope">m</error> when m > 0:
case Integer <error descr="Variable 'm' is already defined in the scope">m</error> when <error descr="Variable used in guarded pattern should be final or effectively final">m</error> > 0:
m += n;
case Integer <error descr="Variable 'p' is already defined in the scope">p</error> when p > 0:
case Integer <error descr="Variable 'p' is already defined in the scope">p</error> when <error descr="Variable used in guarded pattern should be final or effectively final">p</error> > 0:
p += n + m;
break;
case Integer p1: