From 85fdebf831e2ad8a2b13aa19adf8e3d75b156323 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Tue, 22 Nov 2016 19:13:26 +0100 Subject: [PATCH] spi binding: be ready for short names in handleRename (IDEA-164272) --- .../src/com/intellij/spi/psi/SPIFile.java | 8 ++++--- .../SPIPackageOrClassReferenceElement.java | 23 ++++++++++++++----- .../META-INF/services/java.lang.Runnable | 1 + .../after/bar/foo1/FooRunnable.java | 5 ++++ .../META-INF/services/java.lang.Runnable | 1 + .../before/bar/foo/FooRunnable.java | 5 ++++ .../com/intellij/lang/spi/SPIRenameTest.java | 14 +++++++---- 7 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 java/java-tests/testData/spi/renamePackageWithImplementation/after/META-INF/services/java.lang.Runnable create mode 100644 java/java-tests/testData/spi/renamePackageWithImplementation/after/bar/foo1/FooRunnable.java create mode 100644 java/java-tests/testData/spi/renamePackageWithImplementation/before/META-INF/services/java.lang.Runnable create mode 100644 java/java-tests/testData/spi/renamePackageWithImplementation/before/bar/foo/FooRunnable.java diff --git a/java/java-impl/src/com/intellij/spi/psi/SPIFile.java b/java/java-impl/src/com/intellij/spi/psi/SPIFile.java index e7d1a8609816..d736f57b67d0 100644 --- a/java/java-impl/src/com/intellij/spi/psi/SPIFile.java +++ b/java/java-impl/src/com/intellij/spi/psi/SPIFile.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,14 +16,15 @@ package com.intellij.spi.psi; import com.intellij.extapi.psi.PsiFileBase; +import com.intellij.lang.spi.SPILanguage; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.util.ClassUtil; import com.intellij.spi.SPIFileType; -import com.intellij.lang.spi.SPILanguage; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; @@ -159,7 +160,8 @@ public class SPIFile extends PsiFileBase { @Override public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException { - return getElement().setName(newElementName + getElement().getName().substring(getCanonicalText().length())); + String newPackageQName = StringUtil.getQualifiedName(StringUtil.getPackageName(getCanonicalText()), newElementName); + return getElement().setName(newPackageQName + getElement().getName().substring(getCanonicalText().length())); } @Override diff --git a/java/java-impl/src/com/intellij/spi/psi/SPIPackageOrClassReferenceElement.java b/java/java-impl/src/com/intellij/spi/psi/SPIPackageOrClassReferenceElement.java index fa78a2ebc69c..ca0dc49a8e05 100644 --- a/java/java-impl/src/com/intellij/spi/psi/SPIPackageOrClassReferenceElement.java +++ b/java/java-impl/src/com/intellij/spi/psi/SPIPackageOrClassReferenceElement.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -57,7 +57,8 @@ public class SPIPackageOrClassReferenceElement extends ASTWrapperPsiElement impl final SPIClassProvidersElementList firstChild = (SPIClassProvidersElementList)PsiFileFactory.getInstance(getProject()) .createFileFromText("spi_dummy", SPIFileType.INSTANCE, newElementName).getFirstChild(); - return replace(firstChild.getElements().get(0)); + PsiTreeUtil.getDeepestLast(this).replace(PsiTreeUtil.getDeepestLast(firstChild.getElements().get(0))); + return this; } @Nullable @@ -72,11 +73,21 @@ public class SPIPackageOrClassReferenceElement extends ASTWrapperPsiElement impl @Override public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException { + String newElementName; if (element instanceof PsiPackage) { - return handleElementRename(((PsiPackage)element).getQualifiedName()); - } else if (element instanceof PsiClass) { - final String className = ClassUtil.getJVMClassName((PsiClass)element); - return className != null ? handleElementRename(className) : null; + newElementName = ((PsiPackage)element).getQualifiedName(); + } + else if (element instanceof PsiClass) { + newElementName = ClassUtil.getJVMClassName((PsiClass)element); + } + else { + return null; + } + if (newElementName != null) { + final SPIClassProvidersElementList firstChild = + (SPIClassProvidersElementList)PsiFileFactory.getInstance(getProject()) + .createFileFromText("spi_dummy", SPIFileType.INSTANCE, newElementName).getFirstChild(); + return replace(firstChild.getElements().get(0)); } return null; } diff --git a/java/java-tests/testData/spi/renamePackageWithImplementation/after/META-INF/services/java.lang.Runnable b/java/java-tests/testData/spi/renamePackageWithImplementation/after/META-INF/services/java.lang.Runnable new file mode 100644 index 000000000000..679317ff38d4 --- /dev/null +++ b/java/java-tests/testData/spi/renamePackageWithImplementation/after/META-INF/services/java.lang.Runnable @@ -0,0 +1 @@ +bar.foo1.FooRunnable diff --git a/java/java-tests/testData/spi/renamePackageWithImplementation/after/bar/foo1/FooRunnable.java b/java/java-tests/testData/spi/renamePackageWithImplementation/after/bar/foo1/FooRunnable.java new file mode 100644 index 000000000000..61f53c68b1d3 --- /dev/null +++ b/java/java-tests/testData/spi/renamePackageWithImplementation/after/bar/foo1/FooRunnable.java @@ -0,0 +1,5 @@ +package bar.foo1; +public class FooRunnable implements Runnable { + public void run() { + } +} diff --git a/java/java-tests/testData/spi/renamePackageWithImplementation/before/META-INF/services/java.lang.Runnable b/java/java-tests/testData/spi/renamePackageWithImplementation/before/META-INF/services/java.lang.Runnable new file mode 100644 index 000000000000..254d85d68d7e --- /dev/null +++ b/java/java-tests/testData/spi/renamePackageWithImplementation/before/META-INF/services/java.lang.Runnable @@ -0,0 +1 @@ +bar.foo.FooRunnable diff --git a/java/java-tests/testData/spi/renamePackageWithImplementation/before/bar/foo/FooRunnable.java b/java/java-tests/testData/spi/renamePackageWithImplementation/before/bar/foo/FooRunnable.java new file mode 100644 index 000000000000..e728ffcddf34 --- /dev/null +++ b/java/java-tests/testData/spi/renamePackageWithImplementation/before/bar/foo/FooRunnable.java @@ -0,0 +1,5 @@ +package bar.foo; +public class FooRunnable implements Runnable { + public void run() { + } +} diff --git a/java/java-tests/testSrc/com/intellij/lang/spi/SPIRenameTest.java b/java/java-tests/testSrc/com/intellij/lang/spi/SPIRenameTest.java index 7d42fd8fe8ac..fe8d3d05cc68 100644 --- a/java/java-tests/testSrc/com/intellij/lang/spi/SPIRenameTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/spi/SPIRenameTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,18 +28,22 @@ import org.jetbrains.annotations.NotNull; */ public class SPIRenameTest extends MultiFileTestCase { public void testRenameProviderImplementation() throws Exception { - doRenameTest("Test.java", "Test1"); + doRenameTest("Test1", "foo/Test.java"); } public void testRenameProviderImplementationContainingClass() throws Exception { - doRenameTest("Test.java", "Test1"); + doRenameTest("Test1", "foo/Test.java"); } - private void doRenameTest(final String editorFile, final String newName) throws Exception { + public void testRenamePackageWithImplementation() throws Exception { + doRenameTest("foo1", "bar/foo/FooRunnable.java"); + } + + private void doRenameTest(final String newName, final String relPath) throws Exception { doTest(new PerformAction() { @Override public void performAction(VirtualFile rootDir, VirtualFile rootAfter) throws Exception { - final VirtualFile file = rootDir.findFileByRelativePath("foo/" + editorFile); + final VirtualFile file = rootDir.findFileByRelativePath(relPath); assert file != null; configureByExistingFile(file); final PsiElement element = TargetElementUtil.findTargetElement(myEditor,