diff --git a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java index 7f637234100c..60242005694c 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java @@ -516,7 +516,11 @@ public class RefactoringUtil { continue; } PsiElement anchor1 = getParentExpressionAnchorElement(occurrence); - if (anchor1 == null) return null; + + if (anchor1 == null) { + if (occurrence.isPhysical()) return null; + continue; + } if (anchor == null) { anchor = anchor1; @@ -549,6 +553,7 @@ public class RefactoringUtil { } } + if (anchor == null) return null; if (occurrences.length > 1 && anchor.getParent().getParent() instanceof PsiSwitchStatement) { PsiSwitchStatement switchStatement = (PsiSwitchStatement)anchor.getParent().getParent(); if (switchStatement.getBody().equals(anchor.getParent())) { diff --git a/java/java-tests/testData/refactoring/introduceConstant/PartialStringLiteralAnchorFromAnnotation.java b/java/java-tests/testData/refactoring/introduceConstant/PartialStringLiteralAnchorFromAnnotation.java new file mode 100644 index 000000000000..76b402c2118b --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceConstant/PartialStringLiteralAnchorFromAnnotation.java @@ -0,0 +1,14 @@ +@Model(usages = @Usage("${__REQUEST_PARAMETERS}")) +public class SomeClass { + + public String getModelName() { + return "__REQUEST_PARAMETERS"; + } +} + +@interface Model { + Usage usages(); +} +@interface Usage { + String value(); +} diff --git a/java/java-tests/testData/refactoring/introduceConstant/PartialStringLiteralAnchorFromAnnotation_after.java b/java/java-tests/testData/refactoring/introduceConstant/PartialStringLiteralAnchorFromAnnotation_after.java new file mode 100644 index 000000000000..983e0c3f52fd --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceConstant/PartialStringLiteralAnchorFromAnnotation_after.java @@ -0,0 +1,16 @@ +@Model(usages = @Usage("${" + SomeClass.xxx + "}")) +public class SomeClass { + + public static final String xxx = "__REQUEST_PARAMETERS"; + + public String getModelName() { + return xxx; + } +} + +@interface Model { + Usage usages(); +} +@interface Usage { + String value(); +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceConstantTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceConstantTest.java index 370435173444..3308baa4c78b 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceConstantTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceConstantTest.java @@ -91,6 +91,12 @@ public class IntroduceConstantTest extends LightCodeInsightTestCase { checkResultByFile(BASE_PATH + getTestName(false) + "_after.java"); } + public void testPartialStringLiteralAnchorFromAnnotation() throws Exception { + configureByFile(BASE_PATH + getTestName(false) + ".java"); + new MockIntroduceConstantHandler(null).invoke(getProject(), getEditor(), getFile(), null); + checkResultByFile(BASE_PATH + getTestName(false) + "_after.java"); + } + public void testIntroduceConstantFromThisCall() throws Exception { configureByFile(BASE_PATH + getTestName(false) + ".java"); new MockIntroduceConstantHandler(null).invoke(getProject(), getEditor(), getFile(), null);