external annotations: refactoring listener (IDEA-170718)

This commit is contained in:
Anna Kozlova
2017-05-25 10:42:45 +03:00
parent f49f2a32bf
commit 435387f851
4 changed files with 110 additions and 0 deletions
@@ -351,6 +351,51 @@ public class ExternalAnnotationsManagerImpl extends ReadableExternalAnnotationsM
});
}
@Override
public void elementRenamedOrMoved(@NotNull PsiModifierListOwner element, @NotNull String oldExternalName) {
ApplicationManager.getApplication().assertIsDispatchThread();
try {
final List<XmlFile> files = findExternalAnnotationsXmlFiles(element);
if (files == null) {
return;
}
for (final XmlFile file : files) {
if (!file.isValid()) {
continue;
}
final XmlDocument document = file.getDocument();
if (document == null) {
continue;
}
final XmlTag rootTag = document.getRootTag();
if (rootTag == null) {
continue;
}
for (XmlTag tag : rootTag.getSubTags()) {
String className = StringUtil.unescapeXml(tag.getAttributeValue("name"));
if (Comparing.strEqual(className, oldExternalName)) {
WriteCommandAction
.runWriteCommandAction(myPsiManager.getProject(), ExternalAnnotationsManagerImpl.class.getName(), null, () -> {
PsiDocumentManager.getInstance(myPsiManager.getProject()).commitAllDocuments();
try {
tag.setAttribute("name", StringUtil.escapeXml(getExternalName(element, false)));
commitChanges(file);
}
catch (IncorrectOperationException e) {
LOG.error(e);
}
}, file);
}
}
}
}
finally {
dropCache();
}
}
@Override
public boolean editExternalAnnotation(@NotNull PsiModifierListOwner listOwner,
@NotNull final String annotationFQN,
@@ -0,0 +1,63 @@
/*
* Copyright 2000-2017 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.codeInsight;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiModifierListOwner;
import com.intellij.psi.util.PsiFormatUtil;
import com.intellij.refactoring.listeners.RefactoringElementListener;
import com.intellij.refactoring.listeners.RefactoringElementListenerProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class ExternalAnnotationsRefactoringListenerProvider implements RefactoringElementListenerProvider {
@Nullable
@Override
public RefactoringElementListener getListener(PsiElement element) {
if (element instanceof PsiModifierListOwner) {
Project project = element.getProject();
PsiModifierListOwner modifierListOwner = (PsiModifierListOwner)element;
ExternalAnnotationsManager externalAnnotationsManager = ExternalAnnotationsManager.getInstance(project);
PsiAnnotation[] annotations = externalAnnotationsManager.findExternalAnnotations(modifierListOwner);
if (annotations != null) {
String oldExternalName = PsiFormatUtil.getExternalName(modifierListOwner, false, Integer.MAX_VALUE);
if (oldExternalName == null) {
return null;
}
return new RefactoringElementListener() {
private void elementRenamedOrMoved(@NotNull PsiElement newElement) {
if (newElement instanceof PsiModifierListOwner) {
externalAnnotationsManager.elementRenamedOrMoved((PsiModifierListOwner)newElement, oldExternalName);
}
}
@Override
public void elementMoved(@NotNull PsiElement newElement) {
elementRenamedOrMoved(newElement);
}
@Override
public void elementRenamed(@NotNull PsiElement newElement) {
elementRenamedOrMoved(newElement);
}
};
}
}
return null;
}
}
@@ -59,6 +59,7 @@ public abstract class ExternalAnnotationsManager {
@Nullable PsiNameValuePair[] value) throws CanceledConfigurationException;
public abstract boolean deannotate(@NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN);
public void elementRenamedOrMoved(@NotNull PsiModifierListOwner element, @NotNull String oldExternalName) { }
// Method used in Kotlin plugin when it is necessary to leave external annotation, but modify its arguments
public abstract boolean editExternalAnnotation(@NotNull PsiModifierListOwner listOwner,
+1
View File
@@ -1937,6 +1937,7 @@
<codeInsight.linkHandler prefix="#assignment/" handlerClass="com.intellij.codeInsight.intention.impl.config.AssignmentTooltipLinkHandler"/>
<nonProjectFileWritingAccessExtension
implementation="com.intellij.codeInsight.ExternalAnnotationsNonProjectFileWritingAccessExtension"/>
<refactoring.elementListenerProvider implementation="com.intellij.codeInsight.ExternalAnnotationsRefactoringListenerProvider"/>
<lang.inspectionSuppressor language="JAVA" implementationClass="com.intellij.codeInspection.SuppressManagerImpl"/>
<refactoring.moveInnerClassUsagesHandler language="JAVA" implementationClass="com.intellij.refactoring.move.moveInner.MoveInnerClassJavaUsagesHandler" id="java"/>
<actionPromoter implementation="com.intellij.execution.testframework.TestTreeViewActionsPromoter"/>