From a43a311851eca1d0c6c05f1f2b1012e94a6886b7 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 30 Apr 2015 18:02:59 +0200 Subject: [PATCH] restore disabled rename on valueOf/values/length (IDEA-139827) --- .../psi/impl/PsiElementFactoryImpl.java | 10 ++++++++ .../psi/impl/source/ClassInnerStuffCache.java | 8 +++++-- .../NotAvailableForArrayLength.java | 5 ++++ .../NotAvailableForValueOf.java | 6 +++++ .../NotAvailableForValues.java | 6 +++++ .../refactoring/RenameCollisionsTest.java | 24 +++++++++++++++++++ 6 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/refactoring/renameCollisions/NotAvailableForArrayLength.java create mode 100644 java/java-tests/testData/refactoring/renameCollisions/NotAvailableForValueOf.java create mode 100644 java/java-tests/testData/refactoring/renameCollisions/NotAvailableForValues.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java index dda3ca55b901..ede86356fdfe 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java @@ -43,6 +43,7 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentMap; @@ -69,6 +70,7 @@ public class PsiElementFactoryImpl extends PsiJavaParserFacadeImpl implements Ps if (myArrayClass == null) { @NonNls final String body = "public class __Array__{\n public final int length;\n public Object clone() {}\n}"; myArrayClass = ((PsiExtensibleClass)createClassFromText(body, null)).getOwnInnerClasses().get(0); + ensureNonWritable(myArrayClass); } return myArrayClass; } @@ -76,11 +78,19 @@ public class PsiElementFactoryImpl extends PsiJavaParserFacadeImpl implements Ps if (myArrayClass15 == null) { @NonNls final String body = "public class __Array__{\n public final int length;\n public T[] clone() {}\n}"; myArrayClass15 = ((PsiExtensibleClass)createClassFromText(body, null)).getOwnInnerClasses().get(0); + ensureNonWritable(myArrayClass15); } return myArrayClass15; } } + private static void ensureNonWritable(PsiClass arrayClass) { + try { + arrayClass.getContainingFile().getViewProvider().getVirtualFile().setWritable(false); + } + catch (IOException ignored) {} + } + @NotNull @Override public PsiClassType getArrayClassType(@NotNull final PsiType componentType, @NotNull final LanguageLevel languageLevel) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/ClassInnerStuffCache.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/ClassInnerStuffCache.java index 544925856a52..6ff6214b3a20 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/ClassInnerStuffCache.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/ClassInnerStuffCache.java @@ -142,7 +142,9 @@ public class ClassInnerStuffCache { PsiElementFactory factory = JavaPsiFacade.getInstance(myClass.getProject()).getElementFactory(); String text = "public static " + myClass.getName() + "[] values() { }"; PsiMethod physicalMethod = factory.createMethodFromText(text, myClass); - PsiMethod method = new LightMethod(myClass.getManager(), physicalMethod, myClass); + final PsiClass enumSelf = myClass.getSuperClass(); + if (enumSelf == null) return null; + PsiMethod method = new LightMethod(myClass.getManager(), physicalMethod, enumSelf); return new Result(method, OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, myTracker); } }); @@ -157,7 +159,9 @@ public class ClassInnerStuffCache { PsiElementFactory factory = JavaPsiFacade.getInstance(myClass.getProject()).getElementFactory(); String text = "public static " + myClass.getName() + " valueOf(java.lang.String name) throws java.lang.IllegalArgumentException { }"; PsiMethod physicalMethod = factory.createMethodFromText(text, myClass); - PsiMethod method = new LightMethod(myClass.getManager(), physicalMethod, myClass); + final PsiClass enumSelf = myClass.getSuperClass(); + if (enumSelf == null) return null; + PsiMethod method = new LightMethod(myClass.getManager(), physicalMethod, enumSelf); return new Result(method, OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, myTracker); } }); diff --git a/java/java-tests/testData/refactoring/renameCollisions/NotAvailableForArrayLength.java b/java/java-tests/testData/refactoring/renameCollisions/NotAvailableForArrayLength.java new file mode 100644 index 000000000000..8777d4f35e24 --- /dev/null +++ b/java/java-tests/testData/refactoring/renameCollisions/NotAvailableForArrayLength.java @@ -0,0 +1,5 @@ +class Test { + { + new String[0].length + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/renameCollisions/NotAvailableForValueOf.java b/java/java-tests/testData/refactoring/renameCollisions/NotAvailableForValueOf.java new file mode 100644 index 000000000000..e55943b9532f --- /dev/null +++ b/java/java-tests/testData/refactoring/renameCollisions/NotAvailableForValueOf.java @@ -0,0 +1,6 @@ +enum A { + ; + { + A.valueOf(""); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/renameCollisions/NotAvailableForValues.java b/java/java-tests/testData/refactoring/renameCollisions/NotAvailableForValues.java new file mode 100644 index 000000000000..7795051e702c --- /dev/null +++ b/java/java-tests/testData/refactoring/renameCollisions/NotAvailableForValues.java @@ -0,0 +1,6 @@ +enum A { + ; + { + A.values(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java b/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java index e830594db39f..4025b869634a 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java @@ -20,6 +20,7 @@ import com.intellij.codeInsight.TargetElementUtilBase; import com.intellij.psi.PsiElement; import com.intellij.refactoring.rename.RenameProcessor; import com.intellij.refactoring.rename.RenameUtil; +import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.refactoring.util.MoveRenameUsageInfo; import com.intellij.usageView.UsageInfo; import org.jetbrains.annotations.NotNull; @@ -240,6 +241,29 @@ public class RenameCollisionsTest extends LightRefactoringTestCase { doTest("T"); } + private void doTestImpossibleToRename() throws Exception { + try { + doTest("val"); + fail("Should be impossible to rename"); + } + catch (CommonRefactoringUtil.RefactoringErrorHintException e) { + assertEquals("Cannot perform refactoring.\n" + + "This element cannot be renamed", e.getMessage()); + } + } + + public void testNotAvailableForValueOf() throws Exception { + doTestImpossibleToRename(); + } + + public void testNotAvailableForValues() throws Exception { + doTestImpossibleToRename(); + } + + public void testNotAvailableForArrayLength() throws Exception { + doTestImpossibleToRename(); + } + private void doTest(final String newName) throws Exception { configureByFile(BASE_PATH + getTestName(false) + ".java"); PsiElement element = TargetElementUtilBase