JvmCommonIntentionActionsFactory api refactoring

This commit is contained in:
Nicolay Mitropolsky
2017-05-31 12:11:46 +03:00
parent 4bd2a5647f
commit 00e6afd5e3
4 changed files with 53 additions and 47 deletions
@@ -21,10 +21,8 @@ import com.intellij.psi.PsiModifier
import com.intellij.psi.PsiType
import com.intellij.psi.PsiTypeParameter
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.annotations.NonNls
import org.jetbrains.uast.UClass
import org.jetbrains.uast.UDeclaration
import org.jetbrains.uast.UElement
import org.jetbrains.uast.UParameter
/**
@@ -41,18 +39,17 @@ import org.jetbrains.uast.UParameter
abstract class JvmCommonIntentionActionsFactory {
open fun createChangeModifierAction(declaration: UDeclaration,
@PsiModifier.ModifierConstant @NonNls modifier: String,
@PsiModifier.ModifierConstant modifier: String,
shouldPresent: Boolean): IntentionAction? = null
open fun createAddCallableMemberActions(info: NewCallableMemberInfo): List<IntentionAction> = emptyList()
open fun createAddCallableMemberActions(info: MethodInsertionInfo): List<IntentionAction> = emptyList()
open fun createAddBeanPropertyActions(uClass: UClass,
propertyName: String,
@PsiModifier.ModifierConstant visibilityModifier: String,
propertyType: PsiType,
setterRequired: Boolean,
getterRequired: Boolean): Array<IntentionAction> = emptyArray()
getterRequired: Boolean): List<IntentionAction> = emptyList()
companion object : LanguageExtension<JvmCommonIntentionActionsFactory>(
"com.intellij.codeInsight.intention.jvmCommonIntentionActionsFactory") {
@@ -63,39 +60,47 @@ abstract class JvmCommonIntentionActionsFactory {
}
data class NewCallableMemberInfo(
val kind: CallableKind,
sealed class MethodInsertionInfo(
val containingClass: UClass,
val name: String? = null,
@PsiModifier.ModifierConstant
val modifiers: List<String> = emptyList(),
val typeParams: List<PsiTypeParameter> = emptyList(),
val returnType: PsiType? = null,
val parameters: List<UParameter> = emptyList(),
val caller: UElement? = null,
val isAbstract: Boolean = false,
val focusAfterInserting: Boolean = false
val parameters: List<UParameter> = emptyList()
) {
enum class CallableKind {
FUNCTION,
CONSTRUCTOR
}
companion object {
@JvmStatic
fun constructorInfo(uClass: UClass, parameters: List<UParameter>) =
NewCallableMemberInfo(kind = CallableKind.CONSTRUCTOR, containingClass = uClass, parameters = parameters)
fun constructorInfo(containingClass: UClass, parameters: List<UParameter>) =
Constructor(containingClass = containingClass, parameters = parameters)
@JvmStatic
fun simpleMethodInfo(uClass: UClass, methodName: String, modifier: String, returnType: PsiType, parameters: List<UParameter>) =
NewCallableMemberInfo(kind = CallableKind.FUNCTION,
name = methodName,
modifiers = listOf(modifier),
containingClass = uClass,
returnType = returnType,
parameters = parameters)
fun simpleMethodInfo(containingClass: UClass,
methodName: String,
@PsiModifier.ModifierConstant modifier: String,
returnType: PsiType,
parameters: List<UParameter>) =
Method(name = methodName,
modifiers = listOf(modifier),
containingClass = containingClass,
returnType = returnType,
parameters = parameters)
}
}
class Method(
containingClass: UClass,
val name: String,
modifiers: List<String> = emptyList(),
typeParams: List<PsiTypeParameter> = emptyList(),
val returnType: PsiType,
parameters: List<UParameter> = emptyList(),
val isAbstract: Boolean = false
) : MethodInsertionInfo(containingClass, modifiers, typeParams, parameters)
class Constructor(
containingClass: UClass,
modifiers: List<String> = emptyList(),
typeParams: List<PsiTypeParameter> = emptyList(),
parameters: List<UParameter> = emptyList()
) : MethodInsertionInfo(containingClass, modifiers, typeParams, parameters)
}
@@ -17,7 +17,7 @@ package com.intellij.codeInsight.daemon.impl.quickfix
import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.codeInsight.intention.JvmCommonIntentionActionsFactory
import com.intellij.codeInsight.intention.NewCallableMemberInfo
import com.intellij.codeInsight.intention.MethodInsertionInfo
import com.intellij.codeInspection.LocalQuickFixBase
import com.intellij.codeInspection.ProblemDescriptor
import com.intellij.openapi.module.ModuleUtilCore
@@ -57,7 +57,7 @@ class UastCreateMethodFix(containingClass: UClass, private val createMethodActio
if (!ModuleUtilCore.projectContainsFile(uClass.project, uClass.containingFile.virtualFile, false)) return null
val actionsFactory = JvmCommonIntentionActionsFactory.forLanguage(uClass.language) ?: return null
val action = actionsFactory.createAddCallableMemberActions(
NewCallableMemberInfo.simpleMethodInfo(uClass, methodName, modifier, PsiType.VOID, emptyList())
MethodInsertionInfo.simpleMethodInfo(uClass, methodName, modifier, PsiType.VOID, emptyList())
).firstOrNull() ?: return null
return UastCreateMethodFix(uClass, action)
}
@@ -21,7 +21,7 @@ import com.intellij.codeInsight.daemon.impl.quickfix.ModifierFix
import com.intellij.codeInsight.intention.AbstractIntentionAction
import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.codeInsight.intention.JvmCommonIntentionActionsFactory
import com.intellij.codeInsight.intention.NewCallableMemberInfo
import com.intellij.codeInsight.intention.MethodInsertionInfo
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.*
@@ -39,15 +39,14 @@ class JavaCommonIntentionActionsFactory : JvmCommonIntentionActionsFactory() {
return ModifierFix(declaration.modifierList, modifier, shouldPresent, false)
}
override fun createAddCallableMemberActions(info: NewCallableMemberInfo): List<IntentionAction> {
return when (info.kind) {
NewCallableMemberInfo.CallableKind.FUNCTION ->
with(info) {
createAddMethodAction(containingClass, name!!, modifiers.joinToString(" "), returnType!!, parameters)
?.let { listOf(it) } ?: emptyList()
}
override fun createAddCallableMemberActions(info: MethodInsertionInfo): List<IntentionAction> {
return when (info) {
is MethodInsertionInfo.Method -> with(info) {
createAddMethodAction(containingClass, name, modifiers.joinToString(" "), returnType, parameters)
?.let { listOf(it) } ?: emptyList()
}
NewCallableMemberInfo.CallableKind.CONSTRUCTOR ->
is MethodInsertionInfo.Constructor ->
listOf(AddConstructorFix(info.containingClass.psi, info.parameters.map { it.psi }))
}
}
@@ -81,22 +80,22 @@ class JavaCommonIntentionActionsFactory : JvmCommonIntentionActionsFactory() {
@PsiModifier.ModifierConstant visibilityModifier: String,
propertyType: PsiType,
setterRequired: Boolean,
getterRequired: Boolean): Array<IntentionAction> {
getterRequired: Boolean): List<IntentionAction> {
if (getterRequired && setterRequired)
return arrayOf<IntentionAction>(
return listOf<IntentionAction>(
CreateJavaBeanPropertyFix(uClass.psi, propertyName, propertyType, getterRequired, setterRequired,
true),
CreateJavaBeanPropertyFix(uClass.psi, propertyName, propertyType, getterRequired, setterRequired,
false))
if (getterRequired || setterRequired)
return arrayOf<IntentionAction>(
return listOf<IntentionAction>(
CreateJavaBeanPropertyFix(uClass.psi, propertyName, propertyType, getterRequired, setterRequired,
true),
CreateJavaBeanPropertyFix(uClass.psi, propertyName, propertyType, getterRequired, setterRequired,
false),
CreateJavaBeanPropertyFix(uClass.psi, propertyName, propertyType, true, true, true))
return arrayOf<IntentionAction>(
return listOf<IntentionAction>(
CreateJavaBeanPropertyFix(uClass.psi, propertyName, propertyType, getterRequired, setterRequired, true))
}
@@ -29,6 +29,7 @@ import org.jetbrains.uast.UClass;
import org.jetbrains.uast.UastContextKt;
import static com.intellij.psi.CommonClassNames.JAVA_LANG_STRING;
import static com.intellij.util.ArrayUtil.toObjectArray;
@ApiStatus.Experimental
public class CreateBeanPropertyFixes {
@@ -56,6 +57,7 @@ public class CreateBeanPropertyFixes {
if (factory == null) return IntentionAction.EMPTY_ARRAY;
UClass uClass = UastContextKt.toUElement(psiClass, UClass.class);
if (uClass == null) return IntentionAction.EMPTY_ARRAY;
return factory.createAddBeanPropertyActions(uClass, propertyName, PsiModifier.PUBLIC, type, createSetter, !createSetter);
return toObjectArray(factory.createAddBeanPropertyActions(uClass, propertyName, PsiModifier.PUBLIC, type, createSetter, !createSetter),
IntentionAction.class);
}
}