From 7463ed3c9b377e26493d1ed27673a0417ebb1d3c Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 25 Apr 2013 11:18:47 +0200 Subject: [PATCH] inline: accept to inline constant from library (IDEA-106167) --- .../inline/InlineConstantFieldHandler.java | 11 +++++++---- .../inline/InlineConstantFieldProcessor.java | 19 ++++++++++++++----- .../ConstantFromLibrary.java | 5 +++++ .../ConstantFromLibrary.java.after | 5 +++++ .../inline/InlineConstantFieldTest.java | 13 +++++++------ 5 files changed, 38 insertions(+), 15 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineConstantField/ConstantFromLibrary.java create mode 100644 java/java-tests/testData/refactoring/inlineConstantField/ConstantFromLibrary.java.after diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineConstantFieldHandler.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineConstantFieldHandler.java index 78b8beb65084..f6aed373693e 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineConstantFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineConstantFieldHandler.java @@ -40,7 +40,7 @@ public class InlineConstantFieldHandler extends JavaInlineActionHandler { } public void inlineElement(Project project, Editor editor, PsiElement element) { - final PsiField field = (PsiField) element; + final PsiField field = (PsiField) element.getNavigationElement(); if (!field.hasInitializer()) { String message = RefactoringBundle.message("no.initializer.present.for.the.field"); @@ -84,11 +84,14 @@ public class InlineConstantFieldHandler extends JavaInlineActionHandler { } PsiReference reference = editor != null ? TargetElementUtilBase.findReference(editor, editor.getCaretModel().getOffset()) : null; - if (reference != null && !field.equals(reference.resolve())) { - reference = null; + if (reference != null) { + final PsiElement resolve = reference.resolve(); + if (resolve != null && !field.equals(resolve.getNavigationElement())) { + reference = null; + } } - if (!CommonRefactoringUtil.checkReadOnlyStatus(project, field)) return; + if ((!(element instanceof PsiCompiledElement) || reference == null) && !CommonRefactoringUtil.checkReadOnlyStatus(project, field)) return; PsiReferenceExpression refExpression = reference instanceof PsiReferenceExpression ? (PsiReferenceExpression)reference : null; InlineFieldDialog dialog = new InlineFieldDialog(project, field, refExpression); dialog.show(); diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineConstantFieldProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineConstantFieldProcessor.java index fe1e30842e64..bcf0b354990f 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineConstantFieldProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineConstantFieldProcessor.java @@ -15,7 +15,6 @@ */ package com.intellij.refactoring.inline; -import com.intellij.codeInsight.ChangeContextUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; @@ -36,9 +35,7 @@ import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; +import java.util.*; /** * @author ven @@ -170,7 +167,9 @@ public class InlineConstantFieldProcessor extends BaseRefactoringProcessor { private void inlineExpressionUsage(PsiExpression expr, final PsiConstantEvaluationHelper evalHelper, PsiExpression initializer1) throws IncorrectOperationException { - myField.normalizeDeclaration(); + if (myField.isWritable()) { + myField.normalizeDeclaration(); + } if (expr instanceof PsiReferenceExpression) { PsiExpression qExpression = ((PsiReferenceExpression)expr).getQualifierExpression(); if (qExpression != null) { @@ -265,4 +264,14 @@ public class InlineConstantFieldProcessor extends BaseRefactoringProcessor { return PsiUtil.isAccessedForWriting(expr); } + + @NotNull + protected Collection getElementsToWrite(@NotNull final UsageViewDescriptor descriptor) { + if (myInlineThisOnly) { + return Collections.singletonList(myRefExpr); + } + else { + return super.getElementsToWrite(descriptor); + } + } } diff --git a/java/java-tests/testData/refactoring/inlineConstantField/ConstantFromLibrary.java b/java/java-tests/testData/refactoring/inlineConstantField/ConstantFromLibrary.java new file mode 100644 index 000000000000..a81ae39bf957 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineConstantField/ConstantFromLibrary.java @@ -0,0 +1,5 @@ +import java.io.File; + +public class Test { + private static final String c = File.separator; +} diff --git a/java/java-tests/testData/refactoring/inlineConstantField/ConstantFromLibrary.java.after b/java/java-tests/testData/refactoring/inlineConstantField/ConstantFromLibrary.java.after new file mode 100644 index 000000000000..18d3b4adb5de --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineConstantField/ConstantFromLibrary.java.after @@ -0,0 +1,5 @@ +import java.io.File; + +public class Test { + private static final String c = "" + File.separatorChar; +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineConstantFieldTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineConstantFieldTest.java index 970195b6ddb8..de7c3ccc1839 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineConstantFieldTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineConstantFieldTest.java @@ -2,10 +2,7 @@ package com.intellij.refactoring.inline; import com.intellij.JavaTestUtil; import com.intellij.codeInsight.TargetElementUtilBase; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiField; -import com.intellij.psi.PsiReference; -import com.intellij.psi.PsiReferenceExpression; +import com.intellij.psi.*; import com.intellij.refactoring.LightRefactoringTestCase; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -37,6 +34,10 @@ public class InlineConstantFieldTest extends LightRefactoringTestCase { doTest(); } + public void testConstantFromLibrary() throws Exception { + doTest(); + } + private void doTest() throws Exception { String name = getTestName(false); @NonNls String fileName = "/refactoring/inlineConstantField/" + name + ".java"; @@ -51,7 +52,7 @@ public class InlineConstantFieldTest extends LightRefactoringTestCase { final PsiReference ref = myFile.findReferenceAt(myEditor.getCaretModel().getOffset()); PsiReferenceExpression refExpr = ref instanceof PsiReferenceExpression ? (PsiReferenceExpression)ref : null; assertTrue(element instanceof PsiField); - PsiField field = (PsiField)element; - new InlineConstantFieldProcessor(field, getProject(), refExpr, false).run(); + PsiField field = (PsiField)element.getNavigationElement(); + new InlineConstantFieldProcessor(field, getProject(), refExpr, element instanceof PsiCompiledElement).run(); } } \ No newline at end of file