From 176be0e190be0b9f1177c7efed0e37fe3fa2f062 Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Wed, 23 Aug 2017 15:39:35 +0300 Subject: [PATCH] make JvmElementActionsFactory a regular EP instead of a language EP --- .../jvm/actions/JvmElementActionsFactory.kt | 15 ----- .../com/intellij/lang/jvm/actions/actions.kt | 62 +++++++++++++++++++ .../inheritance/ImplicitSubclassInspection.kt | 27 +++----- .../daemon/impl/quickfix/CreateMethodFix.kt | 8 +-- .../CreateBeanPropertyFixes.java | 12 ++-- .../refs/JavaFxEventHandlerReference.java | 8 +-- resources/src/META-INF/IdeaPlugin.xml | 8 +-- 7 files changed, 82 insertions(+), 58 deletions(-) create mode 100644 java/java-analysis-api/src/com/intellij/lang/jvm/actions/actions.kt diff --git a/java/java-analysis-api/src/com/intellij/lang/jvm/actions/JvmElementActionsFactory.kt b/java/java-analysis-api/src/com/intellij/lang/jvm/actions/JvmElementActionsFactory.kt index 12791561e58b..789c330830e7 100644 --- a/java/java-analysis-api/src/com/intellij/lang/jvm/actions/JvmElementActionsFactory.kt +++ b/java/java-analysis-api/src/com/intellij/lang/jvm/actions/JvmElementActionsFactory.kt @@ -16,11 +16,8 @@ package com.intellij.lang.jvm.actions import com.intellij.codeInsight.intention.IntentionAction -import com.intellij.lang.Language -import com.intellij.lang.LanguageExtension import com.intellij.lang.jvm.JvmClass import com.intellij.lang.jvm.JvmModifiersOwner -import com.intellij.openapi.components.ServiceManager import org.jetbrains.annotations.ApiStatus /** @@ -43,16 +40,4 @@ abstract class JvmElementActionsFactory { open fun createAddMethodActions(targetClass: JvmClass, request: MemberRequest.Method): List = emptyList() open fun createAddPropertyActions(targetClass: JvmClass, request: MemberRequest.Property): List = emptyList() - - companion object : LanguageExtension( - "com.intellij.lang.jvm.actions.jvmElementActionsFactory") { - - @JvmStatic - override fun forLanguage(l: Language): JvmElementActionsFactory? = - super.forLanguage(l) - ?: ServiceManager.getService(JvmElementActionsFactoryFallback::class.java).forLanguage(l) - } - } - - diff --git a/java/java-analysis-api/src/com/intellij/lang/jvm/actions/actions.kt b/java/java-analysis-api/src/com/intellij/lang/jvm/actions/actions.kt new file mode 100644 index 000000000000..d5aa7ec6fa25 --- /dev/null +++ b/java/java-analysis-api/src/com/intellij/lang/jvm/actions/actions.kt @@ -0,0 +1,62 @@ +/* + * 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. + */ +@file:JvmName("JvmElementActionFactories") + +package com.intellij.lang.jvm.actions + +import com.intellij.codeInsight.intention.IntentionAction +import com.intellij.lang.jvm.JvmClass +import com.intellij.lang.jvm.JvmModifiersOwner +import com.intellij.openapi.extensions.ExtensionPointName + +private val EP_NAME = ExtensionPointName.create("com.intellij.lang.jvm.actions.jvmElementActionsFactory") + +private inline fun createActions(crossinline actions: (JvmElementActionsFactory) -> List): List { + return EP_NAME.extensions.flatMap { + actions(it) + } +} + +fun createModifierActions(target: JvmModifiersOwner, request: MemberRequest.Modifier): List { + return createActions { + it.createChangeModifierActions(target, request) + } +} + +fun createConstructorActions(target: JvmClass, request: MemberRequest.Constructor): List { + return createActions { + it.createAddConstructorActions(target, request) + } +} + +fun createMethodAction(target: JvmClass, request: MemberRequest.Method): IntentionAction? { + for (factory in EP_NAME.extensions) { + return factory.createAddMethodActions(target, request).firstOrNull() ?: continue + } + return null +} + +fun createMethodActions(target: JvmClass, request: MemberRequest.Method): List { + return createActions { + it.createAddMethodActions(target, request) + } +} + +fun createPropertyActions(target: JvmClass, request: MemberRequest.Property): List { + return createActions { + it.createAddPropertyActions(target, request) + } +} diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/ImplicitSubclassInspection.kt b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/ImplicitSubclassInspection.kt index 9062a7c309ba..c91be1359c9e 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/ImplicitSubclassInspection.kt +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/ImplicitSubclassInspection.kt @@ -22,8 +22,8 @@ import com.intellij.codeInspection.* import com.intellij.lang.jvm.JvmClass import com.intellij.lang.jvm.JvmModifier import com.intellij.lang.jvm.JvmModifiersOwner -import com.intellij.lang.jvm.actions.JvmElementActionsFactory import com.intellij.lang.jvm.actions.MemberRequest +import com.intellij.lang.jvm.actions.createModifierActions import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.project.Project @@ -61,13 +61,11 @@ class ImplicitSubclassInspection : AbstractBaseUastLocalInspectionTool() { val smartPointerManager = SmartPointerManager.getInstance(aClass.project) - val actionsFactory = JvmElementActionsFactory.forLanguage(aClass.language) - for ((method, description) in methodsToOverride) { if (method.isFinal || method.isStatic || method.hasModifierProperty(PsiModifier.PRIVATE)) { methodsToAttachToClassFix?.add(smartPointerManager.createSmartPsiElementPointer(method, method.containingFile)) - val methodFixes = createFixesIfApplicable(actionsFactory, method, method.name) + val methodFixes = createFixesIfApplicable(method, method.name) problemTargets(method, methodHighlightableModifiersSet).forEach { problems.add(manager.createProblemDescriptor( it, description, isOnTheFly, @@ -84,7 +82,7 @@ class ImplicitSubclassInspection : AbstractBaseUastLocalInspectionTool() { problems.add(manager.createProblemDescriptor( it, classReasonToBeSubclassed ?: InspectionsBundle.message("inspection.implicit.subclass.display.forClass", aClass.name), isOnTheFly, - createFixesIfApplicable(actionsFactory, aClass, aClass.name ?: "class", methodsToAttachToClassFix ?: emptyList()), + createFixesIfApplicable(aClass, aClass.name ?: "class", methodsToAttachToClassFix ?: emptyList()), ProblemHighlightType.GENERIC_ERROR_OR_WARNING) ) } @@ -94,12 +92,10 @@ class ImplicitSubclassInspection : AbstractBaseUastLocalInspectionTool() { return problems.toTypedArray() } - private fun createFixesIfApplicable(actionsFactory: JvmElementActionsFactory?, - aClass: UDeclaration, + private fun createFixesIfApplicable(aClass: UDeclaration, hintTargetName: String, methodsToAttachToClassFix: List> = emptyList()): Array { - if (actionsFactory == null) return emptyArray() - val fix = MakeExtendableFix(aClass, hintTargetName, actionsFactory, methodsToAttachToClassFix) + val fix = MakeExtendableFix(aClass, hintTargetName, methodsToAttachToClassFix) if (!fix.hasActionsToPerform) return emptyArray() return arrayOf(fix) } @@ -123,7 +119,6 @@ class ImplicitSubclassInspection : AbstractBaseUastLocalInspectionTool() { private class MakeExtendableFix(uDeclaration: UDeclaration, hintTargetName: String, - val actionsFactory: JvmElementActionsFactory, val siblings: List> = emptyList()) : LocalQuickFixOnPsiElement(uDeclaration) { @@ -133,8 +128,7 @@ class ImplicitSubclassInspection : AbstractBaseUastLocalInspectionTool() { private val actionsToPerform = SmartList() - val hasActionsToPerform: Boolean - get() = actionsToPerform.isNotEmpty() + val hasActionsToPerform: Boolean get() = actionsToPerform.isNotEmpty() init { collectMakeExtendable(uDeclaration, actionsToPerform) @@ -187,12 +181,9 @@ class ImplicitSubclassInspection : AbstractBaseUastLocalInspectionTool() { modifier: JvmModifier, shouldPresent: Boolean, actionsList: SmartList) { - if (declaration.hasModifier(modifier) != shouldPresent) { - actionsFactory.createChangeModifierActions(declaration, MemberRequest.Modifier(modifier, - shouldPresent)).let { - actionsList.addAll(it) - } - } + if (declaration.hasModifier(modifier) == shouldPresent) return + val request = MemberRequest.Modifier(modifier, shouldPresent) + actionsList += createModifierActions(declaration, request) } private val MAX_MESSAGES_TO_COMBINE = 3 diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFix.kt b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFix.kt index 8610e07667ad..3a99537c482b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFix.kt +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFix.kt @@ -19,8 +19,8 @@ import com.intellij.codeInsight.intention.IntentionAction import com.intellij.codeInspection.LocalQuickFixBase import com.intellij.codeInspection.ProblemDescriptor import com.intellij.lang.jvm.JvmModifier -import com.intellij.lang.jvm.actions.JvmElementActionsFactory import com.intellij.lang.jvm.actions.MemberRequest +import com.intellij.lang.jvm.actions.createMethodAction import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.project.Project import com.intellij.psi.* @@ -59,10 +59,8 @@ class CreateMethodFix(containingClass: @JvmCommon PsiClass, private val createMe methodName: String, modifier: JvmModifier): CreateMethodFix? { if (!ModuleUtilCore.projectContainsFile(psiClass.project, psiClass.containingFile.virtualFile, false)) return null - val actionsFactory = JvmElementActionsFactory.forLanguage(psiClass.language) ?: return null - val action = actionsFactory.createAddMethodActions(psiClass, - MemberRequest.simpleMethodRequest(methodName, modifier, PsiType.VOID, emptyList()) - ).firstOrNull() ?: return null + val request = MemberRequest.simpleMethodRequest(methodName, modifier, PsiType.VOID, emptyList()) + val action = createMethodAction(psiClass, request) ?: return null return CreateMethodFix(psiClass, action) } } diff --git a/java/java-impl/src/com/intellij/psi/impl/beanProperties/CreateBeanPropertyFixes.java b/java/java-impl/src/com/intellij/psi/impl/beanProperties/CreateBeanPropertyFixes.java index e1f66967deff..4f2f84a2b85a 100644 --- a/java/java-impl/src/com/intellij/psi/impl/beanProperties/CreateBeanPropertyFixes.java +++ b/java/java-impl/src/com/intellij/psi/impl/beanProperties/CreateBeanPropertyFixes.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * 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. @@ -19,7 +19,6 @@ import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInspection.IntentionWrapper; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.lang.jvm.JvmModifier; -import com.intellij.lang.jvm.actions.JvmElementActionsFactory; import com.intellij.lang.jvm.actions.MemberRequest; import com.intellij.openapi.project.Project; import com.intellij.psi.*; @@ -28,6 +27,7 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import static com.intellij.lang.jvm.actions.JvmElementActionFactories.createPropertyActions; import static com.intellij.psi.CommonClassNames.JAVA_LANG_STRING; import static com.intellij.util.ArrayUtil.toObjectArray; @@ -53,11 +53,7 @@ public class CreateBeanPropertyFixes { if (aClass == null) return IntentionAction.EMPTY_ARRAY; type = facade.getElementFactory().createType(aClass); } - JvmElementActionsFactory factory = JvmElementActionsFactory.forLanguage(psiClass.getLanguage()); - if (factory == null) return IntentionAction.EMPTY_ARRAY; - return toObjectArray( - factory.createAddPropertyActions(psiClass, - new MemberRequest.Property(propertyName, JvmModifier.PUBLIC, type, createSetter, !createSetter)), - IntentionAction.class); + MemberRequest.Property request = new MemberRequest.Property(propertyName, JvmModifier.PUBLIC, type, createSetter, !createSetter); + return toObjectArray(createPropertyActions(psiClass, request), IntentionAction.class); } } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxEventHandlerReference.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxEventHandlerReference.java index a53228676c31..9ffe50cd1b23 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxEventHandlerReference.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxEventHandlerReference.java @@ -17,7 +17,7 @@ package org.jetbrains.plugins.javaFX.fxml.refs; import com.intellij.codeInsight.daemon.QuickFixActionRegistrar; import com.intellij.codeInsight.quickfix.UnresolvedReferenceQuickFixProvider; -import com.intellij.lang.jvm.actions.JvmElementActionsFactory; +import com.intellij.lang.jvm.actions.JvmElementActionFactories; import com.intellij.lang.jvm.actions.MemberRequest; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; @@ -100,10 +100,6 @@ public class JavaFxEventHandlerReference extends PsiReferenceBase - - - + @@ -2023,8 +2020,7 @@ - +