[jvm-lang] port createVoidMethodIfFixPossible

This commit is contained in:
Daniil Ovchinnikov
2017-09-25 15:16:15 +02:00
parent 37c54f270d
commit 58d193ad7f
2 changed files with 57 additions and 15 deletions
@@ -0,0 +1,43 @@
/*
* 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.
*/
package com.intellij.lang.jvm.actions
import com.intellij.lang.jvm.JvmModifier
import com.intellij.lang.jvm.types.JvmSubstitutor
import com.intellij.lang.jvm.types.JvmType
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiJvmSubstitutor
import com.intellij.psi.PsiSubstitutor
private class SimpleMethodRequest(
override val methodName: String,
override val modifiers: Collection<JvmModifier> = emptyList(),
override val returnType: ExpectedTypes = emptyList(),
override val annotations: Collection<AnnotationRequest> = emptyList(),
override val parameters: List<ExpectedParameter> = emptyList(),
override val targetSubstitutor: JvmSubstitutor
) : CreateMethodRequest {
override val isValid: Boolean = true
}
fun methodRequest(project: Project, methodName: String, modifier: JvmModifier, returnType: JvmType): CreateMethodRequest {
return SimpleMethodRequest(
methodName = methodName,
modifiers = listOf(modifier),
returnType = listOf(expectedType(returnType)),
targetSubstitutor = PsiJvmSubstitutor(project, PsiSubstitutor.EMPTY)
)
}
@@ -16,11 +16,13 @@
package com.intellij.codeInsight.daemon.impl.quickfix
import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.codeInspection.IntentionWrapper.wrapToQuickFixes
import com.intellij.codeInspection.LocalQuickFix
import com.intellij.codeInspection.LocalQuickFixBase
import com.intellij.codeInspection.ProblemDescriptor
import com.intellij.lang.jvm.JvmModifier
import com.intellij.lang.jvm.actions.MemberRequest
import com.intellij.lang.jvm.actions.createMethodAction
import com.intellij.lang.jvm.actions.createMethodActions
import com.intellij.lang.jvm.actions.methodRequest
import com.intellij.openapi.module.ModuleUtilCore
import com.intellij.openapi.project.Project
import com.intellij.psi.*
@@ -52,18 +54,15 @@ class CreateMethodFix(containingClass: @JvmCommon PsiClass, private val createMe
is UMethod -> method.uastBody?.psi
else -> method.toUElementOfType<UMethod>()?.uastBody?.psi
}
companion object {
@JvmStatic
fun createVoidMethodIfFixPossible(psiClass: @JvmCommon PsiClass,
methodName: String,
modifier: JvmModifier): CreateMethodFix? {
if (!ModuleUtilCore.projectContainsFile(psiClass.project, psiClass.containingFile.virtualFile, false)) return null
val request = MemberRequest.simpleMethodRequest(methodName, modifier, PsiType.VOID, emptyList())
val action = createMethodAction(psiClass, request) ?: return null
return CreateMethodFix(psiClass, action)
}
}
}
fun createVoidMethodFixes(psiClass: @JvmCommon PsiClass, methodName: String, modifier: JvmModifier): Array<LocalQuickFix> {
if (!ModuleUtilCore.projectContainsFile(psiClass.project, psiClass.containingFile.virtualFile, false)) return LocalQuickFix.EMPTY_ARRAY
val request = methodRequest(psiClass.project, methodName, modifier, PsiType.VOID)
val actions = createMethodActions(psiClass, request)
if (actions.isEmpty()) return LocalQuickFix.EMPTY_ARRAY
return wrapToQuickFixes(
actions,
psiClass.containingFile
).toTypedArray()
}