From 3339a4762c4b28a323a42d9fa9e10bfed64cfc2e Mon Sep 17 00:00:00 2001 From: "alexey.afanasiev" Date: Thu, 10 Oct 2019 13:01:46 +0300 Subject: [PATCH] [groovy] IDEA-220527 Rewrite 'Create method' using JvmElementActionsFactory GitOrigin-RevId: 257144d55c9b7d57d281e1a9d5514ef167e04109 --- .../lang/jvm/actions/actionsGrouping.kt | 4 +- .../untypedUnresolvedAccess/referenceFixes.kt | 23 +-- .../CreateExecutableFromGroovyUsageRequest.kt | 92 ++++++++++ .../CreateMethodFromGroovyUsageRequest.kt | 45 +++++ .../requests/MethodRequestBuilder.kt | 39 +++++ .../requests/createMethodFromUsage.kt | 41 +++++ .../fixes/CreateMethodFromUsageTest.groovy | 163 ++++++++++++++++++ .../abstract/After.groovy | 3 + .../abstract/Before.groovy | 2 + .../abstract/script.groovy | 5 + .../abstractInInterface/After.groovy | 3 + .../abstractInInterface/Before.groovy | 2 + .../abstractInInterface/script.groovy | 5 + .../abstractInNonAbstract/Before.groovy | 2 + .../abstractInNonAbstract/script.groovy | 5 + .../abstractStatic/Before.groovy | 2 + .../abstractStatic/script.groovy | 5 + .../arrayParam/After.groovy | 5 + .../arrayParam/Before.groovy | 2 + .../arrayParam/script.groovy | 5 + .../assertDescription/After.groovy | 5 + .../assertDescription/Before.groovy | 2 + .../assertDescription/script.groovy | 2 + .../capturedWildcard/After.groovy | 5 + .../capturedWildcard/Before.groovy | 2 + .../capturedWildcard/script.groovy | 11 ++ .../closureArgument/After.groovy | 5 + .../closureArgument/Before.groovy | 2 + .../closureArgument/script.groovy | 5 + .../constructor1/After.groovy | 9 + .../constructor1/Before.groovy | 5 + .../constructor1/script.groovy | 1 + .../constructor2/After.groovy | 9 + .../constructor2/Before.groovy | 5 + .../constructor2/script.groovy | 5 + .../constructorAnon/After.groovy | 9 + .../constructorAnon/Before.groovy | 5 + .../constructorAnon/script.groovy | 5 + .../constructorEnum/Before.groovy | 2 + .../constructorEnum/script.groovy | 5 + .../constructorInterface/Before.groovy | 2 + .../constructorInterface/script.groovy | 5 + .../constructorTrait/Before.groovy | 2 + .../constructorTrait/script.groovy | 5 + .../generic/After.groovy | 5 + .../generic/Before.groovy | 2 + .../generic/script.groovy | 5 + .../inAnonymousClass/After.groovy | 5 + .../inAnonymousClass/Before.groovy | 2 + .../inAnonymousClass/script.groovy | 9 + .../integerCast/After.groovy | 5 + .../integerCast/Before.groovy | 2 + .../integerCast/script.groovy | 5 + .../methodReference/After.groovy | 5 + .../methodReference/Before.groovy | 2 + .../methodReference/script.groovy | 5 + .../multiMap/After.groovy | 5 + .../multiMap/Before.groovy | 2 + .../multiMap/script.groovy | 6 + .../nestedExpression/After.groovy | 5 + .../nestedExpression/Before.groovy | 2 + .../nestedExpression/script.groovy | 5 + .../parameterNameSuggestion/After.groovy | 5 + .../parameterNameSuggestion/Before.groovy | 2 + .../parameterNameSuggestion/script.groovy | 4 + .../polyadicExpression/After.groovy | 5 + .../polyadicExpression/Before.groovy | 2 + .../polyadicExpression/script.groovy | 5 + .../severalArguments/After.groovy | 5 + .../severalArguments/Before.groovy | 2 + .../severalArguments/script.groovy | 10 ++ .../severalReturnTypes/After.groovy | 5 + .../severalReturnTypes/Before.groovy | 2 + .../severalReturnTypes/script.groovy | 6 + .../simple1/After.groovy | 5 + .../simple1/Before.groovy | 2 + .../simple1/script.groovy | 1 + .../simple2/After.groovy | 5 + .../simple2/Before.groovy | 2 + .../simple2/script.groovy | 5 + .../simple3/After.groovy | 5 + .../simple3/Before.groovy | 2 + .../simple3/script.groovy | 5 + .../simple4/After.groovy | 7 + .../simple4/Before.groovy | 3 + .../simple4/script.groovy | 1 + .../typeParameterFromWildcard/After.groovy | 5 + .../typeParameterFromWildcard/Before.groovy | 2 + .../typeParameterFromWildcard/script.groovy | 5 + .../unresolvedArg/Before.groovy | 2 + .../unresolvedArg/script.groovy | 5 + 91 files changed, 746 insertions(+), 12 deletions(-) create mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/requests/CreateExecutableFromGroovyUsageRequest.kt create mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/requests/CreateMethodFromGroovyUsageRequest.kt create mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/requests/MethodRequestBuilder.kt create mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/requests/createMethodFromUsage.kt create mode 100644 plugins/groovy/test/org/jetbrains/plugins/groovy/fixes/CreateMethodFromUsageTest.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/abstract/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/abstract/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/abstract/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInInterface/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInInterface/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInInterface/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInNonAbstract/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInNonAbstract/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/abstractStatic/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/abstractStatic/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/arrayParam/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/arrayParam/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/arrayParam/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/assertDescription/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/assertDescription/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/assertDescription/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/capturedWildcard/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/capturedWildcard/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/capturedWildcard/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/closureArgument/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/closureArgument/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/closureArgument/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/constructor1/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/constructor1/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/constructor1/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/constructor2/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/constructor2/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/constructor2/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/constructorAnon/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/constructorAnon/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/constructorAnon/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/constructorEnum/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/constructorEnum/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/constructorInterface/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/constructorInterface/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/constructorTrait/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/constructorTrait/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/generic/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/generic/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/generic/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/inAnonymousClass/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/inAnonymousClass/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/inAnonymousClass/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/integerCast/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/integerCast/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/integerCast/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/methodReference/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/methodReference/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/methodReference/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/multiMap/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/multiMap/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/multiMap/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/nestedExpression/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/nestedExpression/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/nestedExpression/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/parameterNameSuggestion/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/parameterNameSuggestion/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/parameterNameSuggestion/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/polyadicExpression/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/polyadicExpression/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/polyadicExpression/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/severalArguments/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/severalArguments/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/severalArguments/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/severalReturnTypes/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/severalReturnTypes/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/severalReturnTypes/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/simple1/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/simple1/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/simple1/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/simple2/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/simple2/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/simple2/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/simple3/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/simple3/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/simple3/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/simple4/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/simple4/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/simple4/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/typeParameterFromWildcard/After.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/typeParameterFromWildcard/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/typeParameterFromWildcard/script.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/unresolvedArg/Before.groovy create mode 100644 plugins/groovy/testdata/fixes/createMethodFromUsage/unresolvedArg/script.groovy diff --git a/java/java-impl/src/com/intellij/lang/jvm/actions/actionsGrouping.kt b/java/java-impl/src/com/intellij/lang/jvm/actions/actionsGrouping.kt index b594ab7feeff..da3362462567 100644 --- a/java/java-impl/src/com/intellij/lang/jvm/actions/actionsGrouping.kt +++ b/java/java-impl/src/com/intellij/lang/jvm/actions/actionsGrouping.kt @@ -1,11 +1,11 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.lang.jvm.actions import com.intellij.codeInsight.intention.IntentionAction import com.intellij.lang.java.JavaLanguage import com.intellij.openapi.application.ApplicationManager -internal fun List.groupActionsByType(): List { +fun List.groupActionsByType(): List { if (ApplicationManager.getApplication().isUnitTestMode) { return this } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/referenceFixes.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/referenceFixes.kt index b60b621d09b3..1e315a76beba 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/referenceFixes.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/referenceFixes.kt @@ -9,13 +9,14 @@ import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.parentOfType import org.jetbrains.plugins.groovy.annotator.intentions.QuickfixUtil import org.jetbrains.plugins.groovy.codeInspection.GroovyQuickFixFactory +import org.jetbrains.plugins.groovy.codeInspection.untypedUnresolvedAccess.requests.generateCreateMethodActions import org.jetbrains.plugins.groovy.lang.GrCreateClassKind import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCall import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrNewExpression import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrExtendsClause @@ -115,15 +116,17 @@ fun generateReferenceExpressionFixes(ref: GrReferenceExpression): Collection( + call: T, + private val modifiers: Collection +) : CreateExecutableRequest { + + private val psiManager = call.manager + private val project = psiManager.project + private val callPointer: SmartPsiElementPointer = call.createSmartPointer(project) + protected val call: T get() = callPointer.element ?: error("dead pointer") + + override fun isValid() = callPointer.element != null + + override fun getAnnotations() = emptyList() + + override fun getModifiers() = modifiers + + override fun getTargetSubstitutor() = PsiJvmSubstitutor(project, getTargetSubstitutor(call)) + + override fun getExpectedParameters(): List { + val argumentTypes = getArgumentTypes() ?: return emptyList() + + val codeStyleManager: JavaCodeStyleManager = project.service() + return argumentTypes.map {(type, _) -> + //if (expression != null) codeStyleManager.suggestSemanticNames(expression) //TODO add semantic names based on expression + val names = codeStyleManager.suggestNames(emptyList(), VariableKind.PARAMETER, type).names + expectedParameter(expectedTypes(type, ExpectedType.Kind.SUPERTYPE), names.toList()) + } + } + + fun getArgumentTypes(): List>? { + val result = mutableListOf>() + val namedArguments = call.namedArguments + if (namedArguments.isNotEmpty()) { + result.add(GrMapType.createFromNamedArgs(call, namedArguments) to null) + } + + val expressionArguments = call.expressionArguments + for (expression in expressionArguments) { + val type = anonymousClassesToBase(expression.type) + if (expression is GrSpreadArgument) { + if (type is GrTupleType) { + type.componentTypes.forEach { result.add(it to null) } + } + else { + return null + } + } + else { + val expectedType = type ?: TypesUtil.getJavaLangObject(expression) + result.add(expectedType to expression) + } + } + + val closureArguments = call.closureArguments + for (closure in closureArguments) { + val expectedType = closure.type ?: TypesUtil.getJavaLangObject(closure) + result.add(expectedType to null) + } + + return result + } + + private fun anonymousClassesToBase(type: PsiType?): PsiType? { + if (type !is PsiClassType) return type + val resolved = type.resolve() + return if (resolved is GrAnonymousClassDefinition) resolved.baseClassType else type + } + + override fun getParameters() = getParameters(expectedParameters, project) +} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/requests/CreateMethodFromGroovyUsageRequest.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/requests/CreateMethodFromGroovyUsageRequest.kt new file mode 100644 index 000000000000..a4af4121c41e --- /dev/null +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/requests/CreateMethodFromGroovyUsageRequest.kt @@ -0,0 +1,45 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.plugins.groovy.codeInspection.untypedUnresolvedAccess.requests + +import com.intellij.lang.jvm.JvmModifier +import com.intellij.lang.jvm.actions.CreateMethodRequest +import com.intellij.lang.jvm.actions.ExpectedType +import com.intellij.lang.jvm.actions.expectedType +import com.intellij.lang.jvm.actions.expectedTypes +import com.intellij.psi.* +import com.intellij.psi.util.parentOfType +import com.intellij.psi.util.parents +import com.intellij.util.containers.withPrevious +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression +import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.GroovyExpectedTypesProvider + +internal class CreateMethodFromGroovyUsageRequest( + methodCall: GrMethodCall, + modifiers: Collection +) : CreateExecutableFromGroovyUsageRequest(methodCall, modifiers), CreateMethodRequest { + + override fun isValid() = super.isValid() && call.let { + getRefExpression()?.referenceName != null + } + + private fun getRefExpression() = call.invokedExpression as? GrReferenceExpression + + override fun getMethodName() = getRefExpression()?.referenceName!! + + override fun getReturnType() : List { + val expected = GroovyExpectedTypesProvider.getDefaultExpectedTypes(call) + if (expected.isEmpty()) { + return expectedTypes(PsiType.VOID) + } + return expected.map { expectedType(it, ExpectedType.Kind.EXACT) } + } + + fun getAnchor(targetClass: PsiClass): PsiElement? { + val enclosingMember = call.parentOfType(PsiMethod::class, PsiField::class, PsiClassInitializer::class) ?: return null + for ((parent, lastParent) in enclosingMember.parents().withPrevious()) { + if (parent == targetClass) return lastParent + } + return null + } +} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/requests/MethodRequestBuilder.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/requests/MethodRequestBuilder.kt new file mode 100644 index 000000000000..8562cc5b88ab --- /dev/null +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/requests/MethodRequestBuilder.kt @@ -0,0 +1,39 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.plugins.groovy.codeInspection.untypedUnresolvedAccess.requests + +import com.intellij.lang.jvm.JvmClass +import com.intellij.lang.jvm.JvmModifier +import com.intellij.lang.jvm.actions.CreateMethodRequest +import com.intellij.psi.PsiClass +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression +import org.jetbrains.plugins.groovy.lang.psi.util.GrStaticChecker + +class MethodRequestsBuilder(private val myCall: GrMethodCall) { + + private val myRequests = LinkedHashMap() + + fun buildRequests(): Map { + build() + return myRequests + } + + private fun build() { + val invokedExpression = myCall.invokedExpression as? GrReferenceExpression ?: return + val targetClasses = getTargetClasses(invokedExpression) { + psiClass -> psiClass.manager.isInProject(psiClass) + } + targetClasses.forEach { + processClass(it, invokedExpression) + } + + } + + private fun processClass(clazz: PsiClass, invokedExpression: GrReferenceExpression) { + //if (CreateMethodFromUsageFix.isMethodSignatureExists(myCall, clazz)) return // TODO add check + + val modifiers = mutableSetOf() + if (GrStaticChecker.isInStaticContext(invokedExpression, clazz)) modifiers += JvmModifier.STATIC + myRequests[clazz] = CreateMethodFromGroovyUsageRequest(myCall, modifiers) + } +} \ No newline at end of file diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/requests/createMethodFromUsage.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/requests/createMethodFromUsage.kt new file mode 100644 index 000000000000..5d40ea5f2765 --- /dev/null +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/requests/createMethodFromUsage.kt @@ -0,0 +1,41 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.plugins.groovy.codeInspection.untypedUnresolvedAccess.requests + +import com.intellij.codeInsight.intention.IntentionAction +import com.intellij.lang.jvm.actions.EP_NAME +import com.intellij.lang.jvm.actions.groupActionsByType +import com.intellij.psi.PsiClass +import org.jetbrains.plugins.groovy.annotator.intentions.QuickfixUtil +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression + +fun generateCreateMethodActions(call: GrMethodCall): List { + val methodRequests = MethodRequestsBuilder(call).buildRequests() + val extensions = EP_NAME.extensions + return methodRequests.flatMap { (clazz, request) -> + extensions.flatMap { ext -> + ext.createAddMethodActions(clazz, request) + } + }.groupActionsByType() +} + +internal fun getTargetClasses(ref: GrReferenceExpression, predicate: (ref: PsiClass) -> Boolean): List { + val targetClass = QuickfixUtil.findTargetClass(ref) + if (targetClass == null || !predicate(targetClass)) return emptyList() + + val classes = mutableListOf() + collectSupers(targetClass, classes, predicate) + return classes +} + +private fun collectSupers(psiClass: PsiClass, classes: MutableList, predicate: (ref: PsiClass) -> Boolean) { + classes.add(psiClass) + + val supers = psiClass.supers + for (aSuper in supers) { + if (classes.contains(aSuper)) continue + if (predicate(aSuper)) { + collectSupers(aSuper, classes, predicate) + } + } +} diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/fixes/CreateMethodFromUsageTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/fixes/CreateMethodFromUsageTest.groovy new file mode 100644 index 000000000000..1d49122578b7 --- /dev/null +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/fixes/CreateMethodFromUsageTest.groovy @@ -0,0 +1,163 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.plugins.groovy.fixes + +import com.intellij.psi.impl.source.PostprocessReformattingAspect +import groovy.transform.CompileStatic +import org.jetbrains.plugins.groovy.codeInspection.untypedUnresolvedAccess.GrUnresolvedAccessInspection +import org.jetbrains.plugins.groovy.lang.highlighting.GrHighlightingTestBase +import org.jetbrains.plugins.groovy.util.TestUtils + +@CompileStatic +class CreateMethodFromUsageTest extends GrHighlightingTestBase { + private static final String BEFORE = "Before.groovy" + private static final String AFTER = "After.groovy" + private static final String USAGE = "script.groovy" + + public static final String CREATE_METHOD = 'Create method' + public static final String CREATE_ABSTRACT_METHOD = 'Create abstract method' + public static final String CREATE_CONSTRUCTOR = 'Create constructor' + + final String getBasePath() { + return TestUtils.testDataPath + 'fixes/createMethodFromUsage/' + getTestName(true) + '/' + } + + @Override + void setUp() { + super.setUp() + fixture.configureByFiles(USAGE, BEFORE) + fixture.enableInspections(GrUnresolvedAccessInspection) + } + + private void doTest(String action = CREATE_METHOD, int actionCount = 1) { + fixture.with { + def fixes = filterAvailableIntentions(action) + assert fixes.size() == actionCount + if (actionCount == 0) return + launchAction fixes.first() + PostprocessReformattingAspect.getInstance(project).doPostponedFormatting() + checkResultByFile(BEFORE, AFTER, true) + } + } + + void testSimple1() { + doTest() + } + + void _testSimple2() { + doTest() + } + + void _testSimple3() { + doTest() + } + + void _testSimple4() { + doTest() + } + + void testAbstract() { + doTest(CREATE_ABSTRACT_METHOD) + } + + void testAbstractStatic() { + doTest(CREATE_ABSTRACT_METHOD, 0) + } + + void testAbstractInNonAbstract() { + doTest(CREATE_ABSTRACT_METHOD, 0) + } + + void testAbstractInInterface() { + doTest() + } + + void testArrayParam() { + doTest() + } + + void _testAssertDescription() { + doTest() + } + + void testGeneric() { + doTest() + } + + void testMultiMap() { + doTest() + } + + void testClosureArgument() { + doTest() + } + + void testMethodReference() { + doTest() + } + + void testSeveralReturnTypes() { + doTest() + } + + void testCapturedWildcard() { + doTest() + } + + void _testParameterNameSuggestion() { + doTest() + } + + void _testPolyadicExpression() { + doTest() + } + + void testNestedExpression() { + doTest() + } + + void testInAnonymousClass() { + doTest() + } + + void testTypeParameterFromWildcard() { + doTest() + } + + void _testUnresolvedArg() { + doTest(CREATE_METHOD, 0) + } + + void _testIntegerCast() { + doTest() + } + + void testSeveralArguments() { + doTest() + } + + void _testConstructor1() { + doTest(CREATE_CONSTRUCTOR) + } + + void _testConstructor2() { + doTest(CREATE_CONSTRUCTOR) + } + + void _testConstructorAnon() { + doTest(CREATE_CONSTRUCTOR) + } + + void testConstructorInterface() { + doTest(CREATE_CONSTRUCTOR, 0) + } + + void testConstructorTrait() { + doTest(CREATE_CONSTRUCTOR, 0) + } + + void testConstructorEnum() { + doTest(CREATE_CONSTRUCTOR, 0) + } +} + + diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/abstract/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstract/After.groovy new file mode 100644 index 000000000000..10dbc9f1dce4 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstract/After.groovy @@ -0,0 +1,3 @@ +abstract class A { + abstract void test() +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/abstract/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstract/Before.groovy new file mode 100644 index 000000000000..3dff25b5f3ad --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstract/Before.groovy @@ -0,0 +1,2 @@ +abstract class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/abstract/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstract/script.groovy new file mode 100644 index 000000000000..be6e373b374a --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstract/script.groovy @@ -0,0 +1,5 @@ +class Test { + Test(A a) { + a.test() + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInInterface/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInInterface/After.groovy new file mode 100644 index 000000000000..f3f65254158b --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInInterface/After.groovy @@ -0,0 +1,3 @@ +interface A { + void test() +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInInterface/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInInterface/Before.groovy new file mode 100644 index 000000000000..e8750af5264a --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInInterface/Before.groovy @@ -0,0 +1,2 @@ +interface A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInInterface/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInInterface/script.groovy new file mode 100644 index 000000000000..be6e373b374a --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInInterface/script.groovy @@ -0,0 +1,5 @@ +class Test { + Test(A a) { + a.test() + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInNonAbstract/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInNonAbstract/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInNonAbstract/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInNonAbstract/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInNonAbstract/script.groovy new file mode 100644 index 000000000000..be6e373b374a --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractInNonAbstract/script.groovy @@ -0,0 +1,5 @@ +class Test { + Test(A a) { + a.test() + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractStatic/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractStatic/Before.groovy new file mode 100644 index 000000000000..3dff25b5f3ad --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractStatic/Before.groovy @@ -0,0 +1,2 @@ +abstract class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractStatic/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractStatic/script.groovy new file mode 100644 index 000000000000..a3681dccfb9e --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/abstractStatic/script.groovy @@ -0,0 +1,5 @@ +class Test { + Test() { + A.TEST() + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/arrayParam/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/arrayParam/After.groovy new file mode 100644 index 000000000000..2fafdf4d86e0 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/arrayParam/After.groovy @@ -0,0 +1,5 @@ +class A { + void test(int[] ints) { + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/arrayParam/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/arrayParam/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/arrayParam/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/arrayParam/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/arrayParam/script.groovy new file mode 100644 index 000000000000..4c42ae8fea8a --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/arrayParam/script.groovy @@ -0,0 +1,5 @@ +class Test { + Test() { + new A().test(new int[0]) + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/assertDescription/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/assertDescription/After.groovy new file mode 100644 index 000000000000..beb8168967f4 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/assertDescription/After.groovy @@ -0,0 +1,5 @@ +class A { + String test() { + null + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/assertDescription/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/assertDescription/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/assertDescription/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/assertDescription/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/assertDescription/script.groovy new file mode 100644 index 000000000000..07faf280fb0f --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/assertDescription/script.groovy @@ -0,0 +1,2 @@ +A a = new A() +assert false, a.test() diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/capturedWildcard/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/capturedWildcard/After.groovy new file mode 100644 index 000000000000..9cf9769571b8 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/capturedWildcard/After.groovy @@ -0,0 +1,5 @@ +class A { + void foo(Test.List list) { + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/capturedWildcard/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/capturedWildcard/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/capturedWildcard/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/capturedWildcard/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/capturedWildcard/script.groovy new file mode 100644 index 000000000000..2d16f6cbd592 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/capturedWildcard/script.groovy @@ -0,0 +1,11 @@ +class Test { + private List sequences = null; + + { + new A().foo(sequences.map()) + } + + interface List { + List map() + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/closureArgument/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/closureArgument/After.groovy new file mode 100644 index 000000000000..d0961c8992a0 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/closureArgument/After.groovy @@ -0,0 +1,5 @@ +class A { + void f(Closure voidClosure) { + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/closureArgument/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/closureArgument/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/closureArgument/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/closureArgument/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/closureArgument/script.groovy new file mode 100644 index 000000000000..0188aa2aa855 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/closureArgument/script.groovy @@ -0,0 +1,5 @@ +class Test { + void foo() { + new A().f{} + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor1/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor1/After.groovy new file mode 100644 index 000000000000..6da58d49fff3 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor1/After.groovy @@ -0,0 +1,9 @@ +class A { + A(){ + + } + + A(int i) { + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor1/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor1/Before.groovy new file mode 100644 index 000000000000..b89c378a8fd0 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor1/Before.groovy @@ -0,0 +1,5 @@ +class A { + A(){ + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor1/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor1/script.groovy new file mode 100644 index 000000000000..81deb4340025 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor1/script.groovy @@ -0,0 +1 @@ +new A(10) diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor2/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor2/After.groovy new file mode 100644 index 000000000000..25a06bc5e135 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor2/After.groovy @@ -0,0 +1,9 @@ +class A { + A(){ + + } + + A(Test test) { + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor2/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor2/Before.groovy new file mode 100644 index 000000000000..b89c378a8fd0 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor2/Before.groovy @@ -0,0 +1,5 @@ +class A { + A(){ + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor2/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor2/script.groovy new file mode 100644 index 000000000000..8286de38a6da --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructor2/script.groovy @@ -0,0 +1,5 @@ +class Test { + void main2() { + new A(this) + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorAnon/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorAnon/After.groovy new file mode 100644 index 000000000000..2671f8316208 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorAnon/After.groovy @@ -0,0 +1,9 @@ +class A { + A(int i){ + + } + + A(Test test) { + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorAnon/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorAnon/Before.groovy new file mode 100644 index 000000000000..0ba21bc9ac19 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorAnon/Before.groovy @@ -0,0 +1,5 @@ +class A { + A(int i){ + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorAnon/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorAnon/script.groovy new file mode 100644 index 000000000000..e478035bebbe --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorAnon/script.groovy @@ -0,0 +1,5 @@ +class Test { + void main2() { + new A(this){} + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorEnum/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorEnum/Before.groovy new file mode 100644 index 000000000000..1af4d9065151 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorEnum/Before.groovy @@ -0,0 +1,2 @@ +enum A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorEnum/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorEnum/script.groovy new file mode 100644 index 000000000000..11f6a39ea70d --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorEnum/script.groovy @@ -0,0 +1,5 @@ +class Test { + void main2() { + new A(this){}; + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorInterface/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorInterface/Before.groovy new file mode 100644 index 000000000000..e8750af5264a --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorInterface/Before.groovy @@ -0,0 +1,2 @@ +interface A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorInterface/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorInterface/script.groovy new file mode 100644 index 000000000000..59d673ffde00 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorInterface/script.groovy @@ -0,0 +1,5 @@ +class Test { + void main2() { + new A(this){} + } +} diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorTrait/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorTrait/Before.groovy new file mode 100644 index 000000000000..670cabdb2410 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorTrait/Before.groovy @@ -0,0 +1,2 @@ +trait A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorTrait/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorTrait/script.groovy new file mode 100644 index 000000000000..e478035bebbe --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/constructorTrait/script.groovy @@ -0,0 +1,5 @@ +class Test { + void main2() { + new A(this){} + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/generic/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/generic/After.groovy new file mode 100644 index 000000000000..6cf5c5e3c5b1 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/generic/After.groovy @@ -0,0 +1,5 @@ +class A { + def void bar(T t, T t) { + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/generic/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/generic/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/generic/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/generic/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/generic/script.groovy new file mode 100644 index 000000000000..ac1dcba5f993 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/generic/script.groovy @@ -0,0 +1,5 @@ +class Test { + def void foo (T t1, T t2) { + new A().bar (t1, t2) + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/inAnonymousClass/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/inAnonymousClass/After.groovy new file mode 100644 index 000000000000..57a41fc7b470 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/inAnonymousClass/After.groovy @@ -0,0 +1,5 @@ +class A { + static void f(Runnable runnable) { + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/inAnonymousClass/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/inAnonymousClass/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/inAnonymousClass/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/inAnonymousClass/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/inAnonymousClass/script.groovy new file mode 100644 index 000000000000..f7bd3ff161c7 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/inAnonymousClass/script.groovy @@ -0,0 +1,9 @@ +class Test { + { + new Runnable() { + void run() { + A.f(this) + } + } + } +} diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/integerCast/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/integerCast/After.groovy new file mode 100644 index 000000000000..0e9a3be6dc3e --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/integerCast/After.groovy @@ -0,0 +1,5 @@ +class A { + static Object test() { + null + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/integerCast/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/integerCast/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/integerCast/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/integerCast/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/integerCast/script.groovy new file mode 100644 index 000000000000..206875131b21 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/integerCast/script.groovy @@ -0,0 +1,5 @@ +class Test { + { + int i = (Integer)A.test() + } +} diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/methodReference/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/methodReference/After.groovy new file mode 100644 index 000000000000..d0961c8992a0 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/methodReference/After.groovy @@ -0,0 +1,5 @@ +class A { + void f(Closure voidClosure) { + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/methodReference/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/methodReference/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/methodReference/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/methodReference/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/methodReference/script.groovy new file mode 100644 index 000000000000..de10c54cb024 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/methodReference/script.groovy @@ -0,0 +1,5 @@ +class Test { + void foo() { + new A().f(Test::foo) + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/multiMap/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/multiMap/After.groovy new file mode 100644 index 000000000000..17c517b96edf --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/multiMap/After.groovy @@ -0,0 +1,5 @@ +class A { + Map toMulti(Map stringStringMap) { + null + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/multiMap/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/multiMap/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/multiMap/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/multiMap/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/multiMap/script.groovy new file mode 100644 index 000000000000..db8cf45344a7 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/multiMap/script.groovy @@ -0,0 +1,6 @@ +class BrokenCreateMethod { + + void foo(Map bar) { + Map multiBar = new A().toMulti(bar) + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/nestedExpression/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/nestedExpression/After.groovy new file mode 100644 index 000000000000..52e6cf915e25 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/nestedExpression/After.groovy @@ -0,0 +1,5 @@ +class A { + static int f(int integer) { + 0 + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/nestedExpression/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/nestedExpression/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/nestedExpression/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/nestedExpression/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/nestedExpression/script.groovy new file mode 100644 index 000000000000..8b7fe3de2e55 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/nestedExpression/script.groovy @@ -0,0 +1,5 @@ +class Test { + { + double d = -A.f(2) + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/parameterNameSuggestion/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/parameterNameSuggestion/After.groovy new file mode 100644 index 000000000000..be5985babd41 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/parameterNameSuggestion/After.groovy @@ -0,0 +1,5 @@ +class A { + static void test2(String fooBar) { + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/parameterNameSuggestion/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/parameterNameSuggestion/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/parameterNameSuggestion/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/parameterNameSuggestion/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/parameterNameSuggestion/script.groovy new file mode 100644 index 000000000000..9e7ef0654e61 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/parameterNameSuggestion/script.groovy @@ -0,0 +1,4 @@ +class Foo { + static String FOO_BAR = "Bar"; + void test1() { A.test2(FOO_BAR) } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/polyadicExpression/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/polyadicExpression/After.groovy new file mode 100644 index 000000000000..168a1501d00f --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/polyadicExpression/After.groovy @@ -0,0 +1,5 @@ +class A { + static long f(int i) { + 0 + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/polyadicExpression/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/polyadicExpression/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/polyadicExpression/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/polyadicExpression/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/polyadicExpression/script.groovy new file mode 100644 index 000000000000..2814ce70c3f2 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/polyadicExpression/script.groovy @@ -0,0 +1,5 @@ +class Test { + { + long l = A.f(1) + A.f(2); + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/severalArguments/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/severalArguments/After.groovy new file mode 100644 index 000000000000..4099c589dd77 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/severalArguments/After.groovy @@ -0,0 +1,5 @@ +class A { + void test(int integer, Thread thread, Runnable runnable, List strings) { + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/severalArguments/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/severalArguments/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/severalArguments/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/severalArguments/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/severalArguments/script.groovy new file mode 100644 index 000000000000..83a14c828078 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/severalArguments/script.groovy @@ -0,0 +1,10 @@ +class Test { + Test(java.util.List l) { + new A().test(1, new java.lang.Thread(), new java.lang.Runnable(){ + @Override + void run() { + + } + }, l) + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/severalReturnTypes/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/severalReturnTypes/After.groovy new file mode 100644 index 000000000000..a7d9ee29994f --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/severalReturnTypes/After.groovy @@ -0,0 +1,5 @@ +class A { + Object bar() { + null + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/severalReturnTypes/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/severalReturnTypes/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/severalReturnTypes/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/severalReturnTypes/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/severalReturnTypes/script.groovy new file mode 100644 index 000000000000..4b9a5bb156ad --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/severalReturnTypes/script.groovy @@ -0,0 +1,6 @@ +class Test { + void foo(A a) { + Object x = a.bar() + String s = a.bar() + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/simple1/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple1/After.groovy new file mode 100644 index 000000000000..d893af2b165e --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple1/After.groovy @@ -0,0 +1,5 @@ +class A { + void test() { + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/simple1/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple1/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple1/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/simple1/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple1/script.groovy new file mode 100644 index 000000000000..52b5929163e7 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple1/script.groovy @@ -0,0 +1 @@ +new A().test() diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/simple2/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple2/After.groovy new file mode 100644 index 000000000000..d65d240c8829 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple2/After.groovy @@ -0,0 +1,5 @@ +class A { + void test() { + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/simple2/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple2/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple2/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/simple2/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple2/script.groovy new file mode 100644 index 000000000000..2dd2b75bde0a --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple2/script.groovy @@ -0,0 +1,5 @@ +class Test { + Test() { + new A().test() + } +} diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/simple3/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple3/After.groovy new file mode 100644 index 000000000000..d65d240c8829 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple3/After.groovy @@ -0,0 +1,5 @@ +class A { + void test() { + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/simple3/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple3/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple3/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/simple3/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple3/script.groovy new file mode 100644 index 000000000000..3c91cbc4cd0a --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple3/script.groovy @@ -0,0 +1,5 @@ +class Test { + Test() { + new A().test() + } +} diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/simple4/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple4/After.groovy new file mode 100644 index 000000000000..cdc084e0f47f --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple4/After.groovy @@ -0,0 +1,7 @@ +class A { + void test(int i) {} + + void test() { + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/simple4/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple4/Before.groovy new file mode 100644 index 000000000000..1a3be52f9fbc --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple4/Before.groovy @@ -0,0 +1,3 @@ +class A { + void test(int i) {} +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/simple4/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple4/script.groovy new file mode 100644 index 000000000000..52b5929163e7 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/simple4/script.groovy @@ -0,0 +1 @@ +new A().test() diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/typeParameterFromWildcard/After.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/typeParameterFromWildcard/After.groovy new file mode 100644 index 000000000000..c2124c3f0e5f --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/typeParameterFromWildcard/After.groovy @@ -0,0 +1,5 @@ +class A { + def void test(List ts) { + + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/typeParameterFromWildcard/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/typeParameterFromWildcard/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/typeParameterFromWildcard/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/typeParameterFromWildcard/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/typeParameterFromWildcard/script.groovy new file mode 100644 index 000000000000..c62802ed6c02 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/typeParameterFromWildcard/script.groovy @@ -0,0 +1,5 @@ +class Test { + def void f(List l) { + new A().test(l) + } +} diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/unresolvedArg/Before.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/unresolvedArg/Before.groovy new file mode 100644 index 000000000000..a7ca22abab45 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/unresolvedArg/Before.groovy @@ -0,0 +1,2 @@ +class A { +} \ No newline at end of file diff --git a/plugins/groovy/testdata/fixes/createMethodFromUsage/unresolvedArg/script.groovy b/plugins/groovy/testdata/fixes/createMethodFromUsage/unresolvedArg/script.groovy new file mode 100644 index 000000000000..0f9bce305134 --- /dev/null +++ b/plugins/groovy/testdata/fixes/createMethodFromUsage/unresolvedArg/script.groovy @@ -0,0 +1,5 @@ +class Test { + { + new A().foo(bar) + } +}