From 30f8afdc35c711bf0778a5d051d8d2fa57aea8ac Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 7 Jun 2013 12:31:04 +0400 Subject: [PATCH] SPI: support rename of providers --- .../intellij/spi/parsing/SPIElementTypes.java | 2 +- .../intellij/spi/psi/SPIProviderElement.java | 17 ++++++++++++++--- .../spi/psi/SPIProvidersElementList.java | 8 ++++++++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/spi/parsing/SPIElementTypes.java b/java/java-impl/src/com/intellij/spi/parsing/SPIElementTypes.java index 54d465648661..228a8459d14f 100644 --- a/java/java-impl/src/com/intellij/spi/parsing/SPIElementTypes.java +++ b/java/java-impl/src/com/intellij/spi/parsing/SPIElementTypes.java @@ -20,7 +20,7 @@ import com.intellij.psi.tree.IFileElementType; import com.intellij.psi.tree.TokenSet; import com.intellij.lang.spi.SPILanguage; -interface SPIElementTypes { +public interface SPIElementTypes { IFileElementType FILE = new IFileElementType(SPILanguage.INSTANCE); IElementType PROVIDER = new IElementType("PROVIDER", SPILanguage.INSTANCE); diff --git a/java/java-impl/src/com/intellij/spi/psi/SPIProviderElement.java b/java/java-impl/src/com/intellij/spi/psi/SPIProviderElement.java index 41e580a3900e..17c47b0ffbcc 100644 --- a/java/java-impl/src/com/intellij/spi/psi/SPIProviderElement.java +++ b/java/java-impl/src/com/intellij/spi/psi/SPIProviderElement.java @@ -22,6 +22,7 @@ import com.intellij.psi.*; import com.intellij.psi.infos.ClassCandidateInfo; import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.util.ClassUtil; +import com.intellij.spi.SPIFileType; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; @@ -36,7 +37,8 @@ public class SPIProviderElement extends ASTWrapperPsiElement implements PsiJavaR } @Override - public void processVariants(PsiScopeProcessor processor) {} + public void processVariants(PsiScopeProcessor processor) { + } @NotNull @Override @@ -53,7 +55,7 @@ public class SPIProviderElement extends ASTWrapperPsiElement implements PsiJavaR public JavaResolveResult[] multiResolve(boolean incompleteCode) { final PsiElement resolve = resolve(); if (resolve instanceof PsiClass) { - return new JavaResolveResult[] {new ClassCandidateInfo(resolve, PsiSubstitutor.EMPTY)}; + return new JavaResolveResult[]{new ClassCandidateInfo(resolve, PsiSubstitutor.EMPTY)}; } return JavaResolveResult.EMPTY_ARRAY; } @@ -82,11 +84,20 @@ public class SPIProviderElement extends ASTWrapperPsiElement implements PsiJavaR @Override public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException { - return null; + final SPIProvidersElementList firstChild = + (SPIProvidersElementList)PsiFileFactory.getInstance(getProject()) + .createFileFromText("spi_dummy", SPIFileType.INSTANCE, newElementName).getFirstChild(); + return replace(firstChild.getElements().get(0)); } @Override public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException { + if (element instanceof PsiClass) { + final String className = ClassUtil.getJVMClassName((PsiClass)element); + if (className != null) { + return handleElementRename(className); + } + } return null; } diff --git a/java/java-impl/src/com/intellij/spi/psi/SPIProvidersElementList.java b/java/java-impl/src/com/intellij/spi/psi/SPIProvidersElementList.java index 2f850b7b8bce..75cc44cb700f 100644 --- a/java/java-impl/src/com/intellij/spi/psi/SPIProvidersElementList.java +++ b/java/java-impl/src/com/intellij/spi/psi/SPIProvidersElementList.java @@ -17,8 +17,12 @@ package com.intellij.spi.psi; import com.intellij.extapi.psi.ASTWrapperPsiElement; import com.intellij.lang.ASTNode; +import com.intellij.spi.parsing.SPIElementType; +import com.intellij.spi.parsing.SPIElementTypes; import org.jetbrains.annotations.NotNull; +import java.util.List; + /** * User: anna */ @@ -26,4 +30,8 @@ public class SPIProvidersElementList extends ASTWrapperPsiElement { public SPIProvidersElementList(@NotNull ASTNode node) { super(node); } + + public List getElements() { + return findChildrenByType(SPIElementTypes.PROVIDER); + } }