introduce LanguageRefactoringSupport.forContext

checks RefactoringSupportProvider.isAvailable and use it where element is available
Fixes JS 'Change Signature' after aed9705385a8fcc7b4ecf3ebb19311dd55e64cc2 (WEB-34310)

GitOrigin-RevId: 247d062cccdbde966c0c4caaf0caa2a93c6b04b2
This commit is contained in:
Maxim Kropotov
2019-08-12 17:03:47 +03:00
committed by intellij-monorepo-bot
parent 2d3c7480a8
commit a0b20ad307
8 changed files with 35 additions and 17 deletions
@@ -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);
}
@@ -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() &&
@@ -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<RefactoringSupportProvider> {
public static final LanguageRefactoringSupport INSTANCE = new LanguageRefactoringSupport();
@@ -27,4 +32,15 @@ public class LanguageRefactoringSupport extends LanguageExtension<RefactoringSup
private LanguageRefactoringSupport() {
super("com.intellij.lang.refactoringSupport", new RefactoringSupportProvider() {});
}
@Nullable
public RefactoringSupportProvider forContext(@NotNull PsiElement element) {
List<RefactoringSupportProvider> providers = INSTANCE.allForLanguage(element.getLanguage());
for (RefactoringSupportProvider provider : providers) {
if (provider.isAvailable(element)) {
return provider;
}
}
return null;
}
}
@@ -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;
}
}
@@ -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
@@ -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);
@@ -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,
@@ -541,7 +541,7 @@ public abstract class GrIntroduceHandlerBase<Settings extends GrIntroduceSetting
public static boolean isInplace(@NotNull Editor editor, @NotNull PsiElement place) {
final RefactoringSupportProvider supportProvider = LanguageRefactoringSupport.INSTANCE.forLanguage(place.getLanguage());
final RefactoringSupportProvider supportProvider = LanguageRefactoringSupport.INSTANCE.forContext(place);
return supportProvider != null &&
(editor.getUserData(InplaceRefactoring.INTRODUCE_RESTART) == null || !editor.getUserData(InplaceRefactoring.INTRODUCE_RESTART)) &&
editor.getUserData(AbstractInplaceIntroducer.ACTIVE_INTRODUCE) == null &&