From a4cb2b8f6f32586e070747b480cce481e53a45c8 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 21 Sep 2023 15:23:35 +0200 Subject: [PATCH] Java: fix extract method missing throws clause on string template and add test (IJ-CR-115108) GitOrigin-RevId: 5fcbd8eb55a8f03f1db1ce67daa850964dae63a4 --- .../intellij/codeInsight/ExceptionUtil.java | 6 ++--- .../StringTemplateExceptionJava21Preview.java | 21 ++++++++++++++++ ...gTemplateExceptionJava21Preview_after.java | 25 +++++++++++++++++++ ....java => StringTemplateJava21Preview.java} | 0 ...=> StringTemplateJava21Preview_after.java} | 0 .../java/refactoring/ExtractMethodTest.java | 8 ++++-- 6 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/refactoring/extractMethod/StringTemplateExceptionJava21Preview.java create mode 100644 java/java-tests/testData/refactoring/extractMethod/StringTemplateExceptionJava21Preview_after.java rename java/java-tests/testData/refactoring/extractMethod/{StringTemplate.java => StringTemplateJava21Preview.java} (100%) rename java/java-tests/testData/refactoring/extractMethod/{StringTemplate_after.java => StringTemplateJava21Preview_after.java} (100%) diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/ExceptionUtil.java b/java/java-psi-impl/src/com/intellij/codeInsight/ExceptionUtil.java index 91aef5388557..910a0d80499c 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/ExceptionUtil.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/ExceptionUtil.java @@ -799,14 +799,14 @@ public final class ExceptionUtil { public static HandlePlace getHandlePlace(@Nullable PsiElement element, @NotNull PsiClassType exceptionType, @Nullable PsiElement topElement) { - if (element == null || element.getParent() == topElement || element.getParent() == null) return HandlePlace.UNHANDLED; + if (element == null || element == topElement) return HandlePlace.UNHANDLED; + PsiElement parent = element.getParent(); + if (parent == null || parent == topElement) return HandlePlace.UNHANDLED; for (CustomExceptionHandler exceptionHandler : CustomExceptionHandler.KEY.getExtensionList()) { if (exceptionHandler.isHandled(element, exceptionType, topElement)) return HandlePlace.UNKNOWN; } - final PsiElement parent = element.getParent(); - if (parent instanceof PsiMethod) { PsiMethod method = (PsiMethod)parent; return HandlePlace.fromBoolean(isHandledByMethodThrowsClause(method, exceptionType)); diff --git a/java/java-tests/testData/refactoring/extractMethod/StringTemplateExceptionJava21Preview.java b/java/java-tests/testData/refactoring/extractMethod/StringTemplateExceptionJava21Preview.java new file mode 100644 index 000000000000..0c69ab3ea8a7 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/StringTemplateExceptionJava21Preview.java @@ -0,0 +1,21 @@ +package java.lang; +public interface StringTemplate { + Processor STR = null; + + @PreviewFeature(feature=PreviewFeature.Feature.STRING_TEMPLATES) + @FunctionalInterface + public interface Processor { + R process(StringTemplate stringTemplate) throws E; + } +} +class Main { + + class FailureException extends Exception {} + + public static void x(StringTemplate.Processor p, int i, int j) { + try { + String t = p."\{i} + \{j} = \{i + j}"; + } + catch (FailureException ignore) {} + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/StringTemplateExceptionJava21Preview_after.java b/java/java-tests/testData/refactoring/extractMethod/StringTemplateExceptionJava21Preview_after.java new file mode 100644 index 000000000000..0a4af344b6f7 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/StringTemplateExceptionJava21Preview_after.java @@ -0,0 +1,25 @@ +package java.lang; +public interface StringTemplate { + Processor STR = null; + + @PreviewFeature(feature=PreviewFeature.Feature.STRING_TEMPLATES) + @FunctionalInterface + public interface Processor { + R process(StringTemplate stringTemplate) throws E; + } +} +class Main { + + class FailureException extends Exception {} + + public static void x(StringTemplate.Processor p, int i, int j) { + try { + String t = newMethod(p, i, j); + } + catch (FailureException ignore) {} + } + + private static String newMethod(StringTemplate.Processor p, int i, int j) throws FailureException { + return p."\{i} + \{j} = \{i + j}"; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/StringTemplate.java b/java/java-tests/testData/refactoring/extractMethod/StringTemplateJava21Preview.java similarity index 100% rename from java/java-tests/testData/refactoring/extractMethod/StringTemplate.java rename to java/java-tests/testData/refactoring/extractMethod/StringTemplateJava21Preview.java diff --git a/java/java-tests/testData/refactoring/extractMethod/StringTemplate_after.java b/java/java-tests/testData/refactoring/extractMethod/StringTemplateJava21Preview_after.java similarity index 100% rename from java/java-tests/testData/refactoring/extractMethod/StringTemplate_after.java rename to java/java-tests/testData/refactoring/extractMethod/StringTemplateJava21Preview_after.java diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java index 13419c0dc15a..82860f9f880e 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java @@ -262,8 +262,12 @@ public class ExtractMethodTest extends LightJavaCodeInsightTestCase { doTestWithJava17(); } - public void testStringTemplate() throws Exception { - doTestWithLanguageLevel(LanguageLevel.JDK_21_PREVIEW); + public void testStringTemplateJava21Preview() throws Exception { + doTest(); + } + + public void testStringTemplateExceptionJava21Preview() throws Exception { + doTest(); } private void doTestWithJava17() throws Exception {