diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/VariableExtractor.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/VariableExtractor.java index 604b4fcc6d8b..0a16afa1505c 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/VariableExtractor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/VariableExtractor.java @@ -316,13 +316,18 @@ final class VariableExtractor { PsiExpression firstOccurrence = Collections.min(allOccurrences, Comparator.comparing(e -> e.getTextRange().getStartOffset())); if (HighlightingFeature.PATTERNS.isAvailable(anchor)) { PsiTypeCastExpression cast = ObjectUtils.tryCast(PsiUtil.skipParenthesizedExprDown(firstOccurrence), PsiTypeCastExpression.class); - if (cast != null && !(cast.getType() instanceof PsiPrimitiveType) && - !(PsiUtil.skipParenthesizedExprUp(firstOccurrence.getParent()) instanceof PsiExpressionStatement)) { - PsiInstanceOfExpression candidate = InstanceOfUtils.findPatternCandidate(cast); - if (candidate != null && allOccurrences.stream() - .map(occ -> ObjectUtils.tryCast(PsiUtil.skipParenthesizedExprDown(occ), PsiTypeCastExpression.class)) - .allMatch(occ -> occ != null && (occ == firstOccurrence || InstanceOfUtils.findPatternCandidate(occ) == candidate))) { - return candidate; + if (cast != null) { + PsiType castType = cast.getType(); + PsiExpression operand = cast.getOperand(); + if (castType != null && !(castType instanceof PsiPrimitiveType) && operand != null && operand.getType() != null && + !(castType.isAssignableFrom(operand.getType())) && + !(PsiUtil.skipParenthesizedExprUp(firstOccurrence.getParent()) instanceof PsiExpressionStatement)) { + PsiInstanceOfExpression candidate = InstanceOfUtils.findPatternCandidate(cast); + if (candidate != null && allOccurrences.stream() + .map(occ -> ObjectUtils.tryCast(PsiUtil.skipParenthesizedExprDown(occ), PsiTypeCastExpression.class)) + .allMatch(occ -> occ != null && (occ == firstOccurrence || InstanceOfUtils.findPatternCandidate(occ) == candidate))) { + return candidate; + } } } } diff --git a/java/java-tests/testData/refactoring/introduceVariable/PatternVariableDeclarationUpcastJava16.after.java b/java/java-tests/testData/refactoring/introduceVariable/PatternVariableDeclarationUpcastJava16.after.java new file mode 100644 index 000000000000..03feda50184a --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/PatternVariableDeclarationUpcastJava16.after.java @@ -0,0 +1,10 @@ +class A { + void test(String obj) { + if (obj instanceof String) { + var temp = obj; + if (temp.trim().isEmpty()) { + System.out.println("Found"); + } + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceVariable/PatternVariableDeclarationUpcastJava16.java b/java/java-tests/testData/refactoring/introduceVariable/PatternVariableDeclarationUpcastJava16.java new file mode 100644 index 000000000000..a034d8b72256 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/PatternVariableDeclarationUpcastJava16.java @@ -0,0 +1,7 @@ +class A { + void test(String obj) { + if (obj instanceof String && ((String)obj).trim().isEmpty()) { + System.out.println("Found"); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceVariableTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceVariableTest.java index 9fad0cbebece..b1a8d56379ec 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceVariableTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceVariableTest.java @@ -143,6 +143,9 @@ public class IntroduceVariableTest extends LightJavaCodeInsightTestCase { public void testPatternVariableDeclarationJava15Preview() { doTestWithVarType(new MockIntroduceVariableHandler("temp", true, false, false, JAVA_LANG_STRING)); } + public void testPatternVariableDeclarationUpcastJava16() { + doTestWithVarType(new MockIntroduceVariableHandler("temp", true, false, false, JAVA_LANG_STRING)); + } public void testPatternVariableDeclarationUsedInLocalJava15Preview() { doTest("temp", true, false, false, JAVA_LANG_STRING);} public void testPatternVariableDeclarationAfterIfJava15Preview() { doTest("temp", true, false, false, JAVA_LANG_STRING);} public void testNonPatternVariableDeclarationTwoBlocksJava15Preview() { doTest("temp", true, false, false, JAVA_LANG_STRING);}