From d529d38f3231c084a2e11170563ccf1e7c83666c Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Thu, 11 Oct 2018 21:03:45 +0300 Subject: [PATCH] [groovy] 2.5 support `tap` method (IDEA-200196) --- .../groovy/lang/psi/util/GdkMethodUtil.java | 2 +- .../lang/resolve/Groovy25ResolveTest.groovy | 25 +++++++++++++++++++ .../plugins/groovy/util/BaseTest.java | 13 ++++++++++ .../plugins/groovy/util/Groovy25Test.groovy | 22 ++++++++++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/Groovy25ResolveTest.groovy create mode 100644 plugins/groovy/test/org/jetbrains/plugins/groovy/util/Groovy25Test.groovy diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GdkMethodUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GdkMethodUtil.java index d1839628dd1e..73e6a35a851d 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GdkMethodUtil.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GdkMethodUtil.java @@ -117,7 +117,7 @@ public class GdkMethodUtil { } public static boolean isWithName(String name) { - return WITH.equals(name) || IDENTITY.equals(name); + return WITH.equals(name) || IDENTITY.equals(name) || "tap".equals(name); } @Nullable diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/Groovy25ResolveTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/Groovy25ResolveTest.groovy new file mode 100644 index 000000000000..0023815226ae --- /dev/null +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/Groovy25ResolveTest.groovy @@ -0,0 +1,25 @@ +// 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. +package org.jetbrains.plugins.groovy.lang.resolve + +import groovy.transform.CompileStatic +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAccessorMethod +import org.jetbrains.plugins.groovy.util.Groovy25Test +import org.jetbrains.plugins.groovy.util.ResolveTest +import org.junit.Test + +@CompileStatic +class Groovy25ResolveTest extends Groovy25Test implements ResolveTest { + + @Test + void 'tap'() { + def expression = elementUnderCaret '''\ +class A { def prop } +new A().tap { prop = 1 } +''', GrReferenceExpression + def reference = expression.LValueReference + assert reference != null + def resolved = reference.resolve() + assert resolved instanceof GrAccessorMethod + } +} diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/util/BaseTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/util/BaseTest.java index b9cafc7759ad..654cbbb942c9 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/util/BaseTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/util/BaseTest.java @@ -1,11 +1,17 @@ +// 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. package org.jetbrains.plugins.groovy.util; +import com.intellij.psi.PsiElement; import com.intellij.testFramework.fixtures.CodeInsightTestFixture; import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; +import java.util.Objects; + +import static com.intellij.psi.util.PsiTreeUtil.getParentOfType; + public interface BaseTest { @NotNull @@ -18,4 +24,11 @@ public interface BaseTest { default GrExpression configureByExpression(@NotNull String text) { return (GrExpression)ArrayUtil.getLastElement(configureByText(text).getStatements()); } + + @NotNull + default T elementUnderCaret(@NotNull String text, @NotNull Class clazz) { + GroovyFile file = configureByText(text); + T element = getParentOfType(file.findElementAt(getFixture().getCaretOffset()), clazz); + return Objects.requireNonNull(element); + } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/util/Groovy25Test.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/util/Groovy25Test.groovy new file mode 100644 index 000000000000..37b1a9cfac2a --- /dev/null +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/util/Groovy25Test.groovy @@ -0,0 +1,22 @@ +// 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. +package org.jetbrains.plugins.groovy.util + +import com.intellij.testFramework.fixtures.CodeInsightTestFixture +import groovy.transform.CompileStatic +import org.jetbrains.annotations.NotNull +import org.jetbrains.plugins.groovy.GroovyProjectDescriptors +import org.junit.Rule +import org.junit.rules.RuleChain +import org.junit.rules.TestRule + +@CompileStatic +abstract class Groovy25Test { + + private final FixtureRule myFixtureRule = new FixtureRule(GroovyProjectDescriptors.GROOVY_2_5, '') + public final @Rule TestRule myRules = RuleChain.outerRule(myFixtureRule).around(new EdtRule()) + + @NotNull + CodeInsightTestFixture getFixture() { + myFixtureRule.fixture + } +}