mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
external annotations: refactoring listener (IDEA-170718)
This commit is contained in:
@@ -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,
|
||||
|
||||
+63
@@ -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,
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
Reference in New Issue
Block a user