diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureUtil.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureUtil.java index debbc14c39bd..391648b517b8 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureUtil.java @@ -16,6 +16,7 @@ package com.intellij.refactoring.changeSignature; import com.intellij.lang.LanguageRefactoringSupport; +import com.intellij.lang.refactoring.RefactoringSupportProvider; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.psi.JavaTokenType; @@ -110,7 +111,8 @@ public class ChangeSignatureUtil { } public static void invokeChangeSignatureOn(PsiMethod method, Project project) { - ChangeSignatureHandler handler = LanguageRefactoringSupport.INSTANCE.forLanguage(method.getLanguage()).getChangeSignatureHandler(); + RefactoringSupportProvider provider = LanguageRefactoringSupport.INSTANCE.forContext(method); + ChangeSignatureHandler handler = provider != null ? provider.getChangeSignatureHandler() : null; if (handler != null) { handler.invoke(project, new PsiElement[]{method}, null); } diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java index a4ccfba070e2..5b5ac8d2cbeb 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java @@ -638,7 +638,7 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase { final PsiFile file = anchorStatement.getContainingFile(); LOG.assertTrue(file != null, "expr.getContainingFile() == null"); final PsiElement nameSuggestionContext = editor == null ? null : file.findElementAt(editor.getCaretModel().getOffset()); - final RefactoringSupportProvider supportProvider = LanguageRefactoringSupport.INSTANCE.forLanguage(expr.getLanguage()); + final RefactoringSupportProvider supportProvider = LanguageRefactoringSupport.INSTANCE.forContext(expr); final boolean isInplaceAvailableOnDataContext = supportProvider != null && editor.getSettings().isVariableInplaceRenameEnabled() && diff --git a/platform/lang-api/src/com/intellij/lang/LanguageRefactoringSupport.java b/platform/lang-api/src/com/intellij/lang/LanguageRefactoringSupport.java index 0fc5351defc5..e36757719347 100644 --- a/platform/lang-api/src/com/intellij/lang/LanguageRefactoringSupport.java +++ b/platform/lang-api/src/com/intellij/lang/LanguageRefactoringSupport.java @@ -20,6 +20,11 @@ package com.intellij.lang; import com.intellij.lang.refactoring.RefactoringSupportProvider; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; public class LanguageRefactoringSupport extends LanguageExtension { public static final LanguageRefactoringSupport INSTANCE = new LanguageRefactoringSupport(); @@ -27,4 +32,15 @@ public class LanguageRefactoringSupport extends LanguageExtension providers = INSTANCE.allForLanguage(element.getLanguage()); + for (RefactoringSupportProvider provider : providers) { + if (provider.isAvailable(element)) { + return provider; + } + } + return null; + } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/refactoring/actions/ChangeSignatureAction.java b/platform/lang-impl/src/com/intellij/refactoring/actions/ChangeSignatureAction.java index f5e7584a4474..658051dcfc27 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/actions/ChangeSignatureAction.java +++ b/platform/lang-impl/src/com/intellij/refactoring/actions/ChangeSignatureAction.java @@ -16,7 +16,6 @@ package com.intellij.refactoring.actions; import com.intellij.lang.ContextAwareActionHandler; -import com.intellij.lang.Language; import com.intellij.lang.LanguageRefactoringSupport; import com.intellij.lang.refactoring.RefactoringSupportProvider; import com.intellij.openapi.actionSystem.DataContext; @@ -48,7 +47,7 @@ public class ChangeSignatureAction extends BasePlatformRefactoringAction { public boolean isEnabledOnElements(@NotNull PsiElement[] elements) { if (elements.length == 1) { PsiElement member = findTargetMember(elements[0]); - return member != null && getChangeSignatureHandler(member.getLanguage()) != null; + return member != null && getChangeSignatureHandler(member) != null; } return false; } @@ -57,13 +56,13 @@ public class ChangeSignatureAction extends BasePlatformRefactoringAction { protected boolean isAvailableOnElementInEditorAndFile(@NotNull final PsiElement element, @NotNull final Editor editor, @NotNull PsiFile file, @NotNull DataContext context) { PsiElement targetMember = findTargetMember(element); if (targetMember == null) { - final ChangeSignatureHandler targetHandler = getChangeSignatureHandler(file.getLanguage()); + final ChangeSignatureHandler targetHandler = getChangeSignatureHandler(file); if (targetHandler != null) { return true; } return false; } - final ChangeSignatureHandler targetHandler = getChangeSignatureHandler(targetMember.getLanguage()); + final ChangeSignatureHandler targetHandler = getChangeSignatureHandler(targetMember); if (targetHandler == null) return false; return true; } @@ -71,7 +70,7 @@ public class ChangeSignatureAction extends BasePlatformRefactoringAction { @Nullable private static PsiElement findTargetMember(@Nullable PsiElement element) { if (element == null) return null; - final ChangeSignatureHandler fileHandler = getChangeSignatureHandler(element.getLanguage()); + final ChangeSignatureHandler fileHandler = getChangeSignatureHandler(element); if (fileHandler != null) { final PsiElement targetMember = fileHandler.findTargetMember(element); if (targetMember != null) return targetMember; @@ -108,7 +107,7 @@ public class ChangeSignatureAction extends BasePlatformRefactoringAction { editor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE); final PsiElement targetMember = findTargetMember(element); if (targetMember == null) { - final ChangeSignatureHandler handler = getChangeSignatureHandler(file.getLanguage()); + final ChangeSignatureHandler handler = getChangeSignatureHandler(file); if (handler != null) { final String notFoundMessage = handler.getTargetNotFoundMessage(); if (notFoundMessage != null) { @@ -117,7 +116,7 @@ public class ChangeSignatureAction extends BasePlatformRefactoringAction { } return; } - final ChangeSignatureHandler handler = getChangeSignatureHandler(targetMember.getLanguage()); + final ChangeSignatureHandler handler = getChangeSignatureHandler(targetMember); if (handler == null) return; handler.invoke(project, new PsiElement[]{targetMember}, dataContext); } @@ -127,7 +126,7 @@ public class ChangeSignatureAction extends BasePlatformRefactoringAction { if (elements.length != 1) return; final PsiElement targetMember = findTargetMember(elements[0]); if (targetMember == null) return; - final ChangeSignatureHandler handler = getChangeSignatureHandler(targetMember.getLanguage()); + final ChangeSignatureHandler handler = getChangeSignatureHandler(targetMember); if (handler == null) return; handler.invoke(project, new PsiElement[]{targetMember}, dataContext); } @@ -135,7 +134,8 @@ public class ChangeSignatureAction extends BasePlatformRefactoringAction { } @Nullable - private static ChangeSignatureHandler getChangeSignatureHandler(Language language) { - return LanguageRefactoringSupport.INSTANCE.forLanguage(language).getChangeSignatureHandler(); + private static ChangeSignatureHandler getChangeSignatureHandler(@NotNull PsiElement language) { + RefactoringSupportProvider provider = LanguageRefactoringSupport.INSTANCE.forContext(language); + return provider != null ? provider.getChangeSignatureHandler() : null; } } diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MemberInplaceRenameHandler.java b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MemberInplaceRenameHandler.java index 0df4e6e28f44..6c53874a9836 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MemberInplaceRenameHandler.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MemberInplaceRenameHandler.java @@ -48,7 +48,7 @@ public class MemberInplaceRenameHandler extends VariableInplaceRenameHandler { element = PsiTreeUtil.getParentOfType(nameSuggestionContext, PsiNamedElement.class); } final RefactoringSupportProvider - supportProvider = element == null ? null : LanguageRefactoringSupport.INSTANCE.forLanguage(element.getLanguage()); + supportProvider = element == null ? null : LanguageRefactoringSupport.INSTANCE.forContext(element); return editor.getSettings().isVariableInplaceRenameEnabled() && supportProvider != null && element instanceof PsiNameIdentifierOwner diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenameHandler.java b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenameHandler.java index 8b125cc87afb..f5a286467103 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenameHandler.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenameHandler.java @@ -47,7 +47,7 @@ public class VariableInplaceRenameHandler implements RenameHandler { final PsiElement nameSuggestionContext = file.findElementAt(editor.getCaretModel().getOffset()); RefactoringSupportProvider supportProvider = - element == null ? null : LanguageRefactoringSupport.INSTANCE.forLanguage(element.getLanguage()); + element == null ? null : LanguageRefactoringSupport.INSTANCE.forContext(element); return supportProvider != null && editor.getSettings().isVariableInplaceRenameEnabled() && supportProvider.isInplaceRenameAvailable(element, nameSuggestionContext); diff --git a/platform/lang-impl/src/com/intellij/refactoring/safeDelete/SafeDeleteProcessor.java b/platform/lang-impl/src/com/intellij/refactoring/safeDelete/SafeDeleteProcessor.java index 85a659329c34..47537d2ee194 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/safeDelete/SafeDeleteProcessor.java +++ b/platform/lang-impl/src/com/intellij/refactoring/safeDelete/SafeDeleteProcessor.java @@ -462,8 +462,8 @@ public class SafeDeleteProcessor extends BaseRefactoringProcessor { public static boolean validElement(@NotNull PsiElement element) { if (element instanceof PsiFile) return true; if (!element.isPhysical()) return false; - final RefactoringSupportProvider provider = LanguageRefactoringSupport.INSTANCE.forLanguage(element.getLanguage()); - return provider.isSafeDeleteAvailable(element); + final RefactoringSupportProvider provider = LanguageRefactoringSupport.INSTANCE.forContext(element); + return provider != null && provider.isSafeDeleteAvailable(element); } public static SafeDeleteProcessor createInstance(Project project, @Nullable Runnable prepareSuccessfulCallback, diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrIntroduceHandlerBase.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrIntroduceHandlerBase.java index 37a896ac2e27..3e11bfdba083 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrIntroduceHandlerBase.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrIntroduceHandlerBase.java @@ -541,7 +541,7 @@ public abstract class GrIntroduceHandlerBase