From 435387f8517f2b37bb5894ebfb5439bffb2bc034 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 24 May 2017 19:43:50 +0300 Subject: [PATCH] external annotations: refactoring listener (IDEA-170718) --- .../ExternalAnnotationsManagerImpl.java | 45 +++++++++++++ ...nnotationsRefactoringListenerProvider.java | 63 +++++++++++++++++++ .../ExternalAnnotationsManager.java | 1 + resources/src/META-INF/IdeaPlugin.xml | 1 + 4 files changed, 110 insertions(+) create mode 100644 java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsRefactoringListenerProvider.java diff --git a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java index 2f5c4245a6a0..40672cfcb4df 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java @@ -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 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, diff --git a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsRefactoringListenerProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsRefactoringListenerProvider.java new file mode 100644 index 000000000000..96d58aea4d61 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsRefactoringListenerProvider.java @@ -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; + } +} diff --git a/java/java-psi-api/src/com/intellij/codeInsight/ExternalAnnotationsManager.java b/java/java-psi-api/src/com/intellij/codeInsight/ExternalAnnotationsManager.java index 29eb19ec9aca..17704763e532 100644 --- a/java/java-psi-api/src/com/intellij/codeInsight/ExternalAnnotationsManager.java +++ b/java/java-psi-api/src/com/intellij/codeInsight/ExternalAnnotationsManager.java @@ -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, diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 244caadd6712..41e0aee5cea0 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -1937,6 +1937,7 @@ +