From 87293a8831b776d8a1c54f0d2f90095ee46a340a Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 28 Aug 2013 15:26:47 +0400 Subject: [PATCH] Navigation to invoke() from {} Example: foo {} --- .../psi/JetFunctionLiteralExpression.java | 12 +++- .../JetInvokeFunctionReference.java | 49 ++++++++++------ .../references/invoke/lambdaAndParens.kt | 9 +++ .../resolve/references/invoke/lambdaNoPar.kt | 9 +++ .../references/invoke/lambdaNoParLabel.kt | 9 +++ .../references/invoke/lambdaNoParRCurly.kt | 9 +++ .../resolve/references/invoke/noParams.kt | 9 +++ .../resolve/references/invoke/noParamsRPar.kt | 9 +++ .../references/invoke/nonemptyLambdaRPar.kt | 9 +++ .../resolve/references/invoke/oneParam.kt | 9 +++ .../resolve/references/invoke/oneParamRPar.kt | 9 +++ .../ReferenceResolveTestGenerated.java | 56 ++++++++++++++++++- 12 files changed, 179 insertions(+), 19 deletions(-) create mode 100644 idea/testData/resolve/references/invoke/lambdaAndParens.kt create mode 100644 idea/testData/resolve/references/invoke/lambdaNoPar.kt create mode 100644 idea/testData/resolve/references/invoke/lambdaNoParLabel.kt create mode 100644 idea/testData/resolve/references/invoke/lambdaNoParRCurly.kt create mode 100644 idea/testData/resolve/references/invoke/noParams.kt create mode 100644 idea/testData/resolve/references/invoke/noParamsRPar.kt create mode 100644 idea/testData/resolve/references/invoke/nonemptyLambdaRPar.kt create mode 100644 idea/testData/resolve/references/invoke/oneParam.kt create mode 100644 idea/testData/resolve/references/invoke/oneParamRPar.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetFunctionLiteralExpression.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetFunctionLiteralExpression.java index a87277dc210..b65423eab4f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetFunctionLiteralExpression.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetFunctionLiteralExpression.java @@ -20,7 +20,7 @@ import com.intellij.lang.ASTNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.JetNodeTypes; -import org.jetbrains.jet.lexer.JetToken; +import org.jetbrains.jet.lexer.JetTokens; import java.util.List; @@ -65,4 +65,14 @@ public class JetFunctionLiteralExpression extends JetExpressionImpl { public JetElement asElement() { return this; } + + @NotNull + public ASTNode getLeftCurlyBrace() { + return getFunctionLiteral().getNode().findChildByType(JetTokens.LBRACE); + } + + @Nullable + public ASTNode getRightCurlyBrace() { + return getFunctionLiteral().getNode().findChildByType(JetTokens.RBRACE); + } } diff --git a/idea/src/org/jetbrains/jet/plugin/references/JetInvokeFunctionReference.java b/idea/src/org/jetbrains/jet/plugin/references/JetInvokeFunctionReference.java index a0501a7670d..7d96f953006 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/JetInvokeFunctionReference.java +++ b/idea/src/org/jetbrains/jet/plugin/references/JetInvokeFunctionReference.java @@ -22,9 +22,7 @@ import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; -import org.jetbrains.jet.lang.psi.JetCallExpression; -import org.jetbrains.jet.lang.psi.JetExpression; -import org.jetbrains.jet.lang.psi.JetValueArgumentList; +import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; @@ -79,26 +77,43 @@ class JetInvokeFunctionReference extends JetPsiReference implements MultiRangeRe @Override public List getRanges() { + JetCallExpression callExpression = (JetCallExpression) myExpression; + List list = new ArrayList(); - JetValueArgumentList valueArgumentList = ((JetCallExpression) myExpression).getValueArgumentList(); - if (valueArgumentList == null) { - return list; + JetValueArgumentList valueArgumentList = callExpression.getValueArgumentList(); + if (valueArgumentList != null) { + if (valueArgumentList.getArguments().size() > 0) { + ASTNode valueArgumentListNode = valueArgumentList.getNode(); + ASTNode lPar = valueArgumentListNode.findChildByType(JetTokens.LPAR); + if (lPar != null) { + list.add(getRange(lPar)); + } + + ASTNode rPar = valueArgumentListNode.findChildByType(JetTokens.RPAR); + if (rPar != null) { + list.add(getRange(rPar)); + } + } + else { + list.add(getRange(valueArgumentList.getNode())); + } } - if (valueArgumentList.getArguments().size() > 0) { - ASTNode valueArgumentListNode = valueArgumentList.getNode(); - ASTNode lPar = valueArgumentListNode.findChildByType(JetTokens.LPAR); - if (lPar != null) { - list.add(getRange(lPar)); + + List functionLiteralArguments = callExpression.getFunctionLiteralArguments(); + for (JetExpression functionLiteralArgument : functionLiteralArguments) { + while (functionLiteralArgument instanceof JetPrefixExpression) { + functionLiteralArgument = ((JetPrefixExpression) functionLiteralArgument).getBaseExpression(); } - ASTNode rPar = valueArgumentListNode.findChildByType(JetTokens.RPAR); - if (rPar != null) { - list.add(getRange(rPar)); + if (functionLiteralArgument instanceof JetFunctionLiteralExpression) { + JetFunctionLiteralExpression functionLiteralExpression = (JetFunctionLiteralExpression) functionLiteralArgument; + list.add(getRange(functionLiteralExpression.getLeftCurlyBrace())); + ASTNode rightCurlyBrace = functionLiteralExpression.getRightCurlyBrace(); + if (rightCurlyBrace != null) { + list.add(getRange(rightCurlyBrace)); + } } } - else { - list.add(getRange(valueArgumentList.getNode())); - } return list; } diff --git a/idea/testData/resolve/references/invoke/lambdaAndParens.kt b/idea/testData/resolve/references/invoke/lambdaAndParens.kt new file mode 100644 index 00000000000..e9b40b79f96 --- /dev/null +++ b/idea/testData/resolve/references/invoke/lambdaAndParens.kt @@ -0,0 +1,9 @@ +class Foo { + fun invoke(vararg a: Any) {} +} + +fun test(f: Foo) { + f() {} +} + +// REF: (in Foo).invoke(Any) \ No newline at end of file diff --git a/idea/testData/resolve/references/invoke/lambdaNoPar.kt b/idea/testData/resolve/references/invoke/lambdaNoPar.kt new file mode 100644 index 00000000000..a276b5eaff2 --- /dev/null +++ b/idea/testData/resolve/references/invoke/lambdaNoPar.kt @@ -0,0 +1,9 @@ +class Foo { + fun invoke(vararg a: Any) {} +} + +fun test(f: Foo) { + f {} +} + +// REF: (in Foo).invoke(Any) \ No newline at end of file diff --git a/idea/testData/resolve/references/invoke/lambdaNoParLabel.kt b/idea/testData/resolve/references/invoke/lambdaNoParLabel.kt new file mode 100644 index 00000000000..53a2d70ddc0 --- /dev/null +++ b/idea/testData/resolve/references/invoke/lambdaNoParLabel.kt @@ -0,0 +1,9 @@ +class Foo { + fun invoke(vararg a: Any) {} +} + +fun test(f: Foo) { + f @f {} +} + +// REF: (in Foo).invoke(Any) \ No newline at end of file diff --git a/idea/testData/resolve/references/invoke/lambdaNoParRCurly.kt b/idea/testData/resolve/references/invoke/lambdaNoParRCurly.kt new file mode 100644 index 00000000000..3aef4c145aa --- /dev/null +++ b/idea/testData/resolve/references/invoke/lambdaNoParRCurly.kt @@ -0,0 +1,9 @@ +class Foo { + fun invoke(vararg a: Any) {} +} + +fun test(f: Foo) { + f {} +} + +// REF: (in Foo).invoke(Any) \ No newline at end of file diff --git a/idea/testData/resolve/references/invoke/noParams.kt b/idea/testData/resolve/references/invoke/noParams.kt new file mode 100644 index 00000000000..db6af4176ac --- /dev/null +++ b/idea/testData/resolve/references/invoke/noParams.kt @@ -0,0 +1,9 @@ +class Foo { + fun invoke(vararg a: Any) {} +} + +fun test(f: Foo) { + f() +} + +// REF: (in Foo).invoke(Any) \ No newline at end of file diff --git a/idea/testData/resolve/references/invoke/noParamsRPar.kt b/idea/testData/resolve/references/invoke/noParamsRPar.kt new file mode 100644 index 00000000000..3838caf0604 --- /dev/null +++ b/idea/testData/resolve/references/invoke/noParamsRPar.kt @@ -0,0 +1,9 @@ +class Foo { + fun invoke(vararg a: Any) {} +} + +fun test(f: Foo) { + f() +} + +// REF: (in Foo).invoke(Any) \ No newline at end of file diff --git a/idea/testData/resolve/references/invoke/nonemptyLambdaRPar.kt b/idea/testData/resolve/references/invoke/nonemptyLambdaRPar.kt new file mode 100644 index 00000000000..5d10bb78c37 --- /dev/null +++ b/idea/testData/resolve/references/invoke/nonemptyLambdaRPar.kt @@ -0,0 +1,9 @@ +class Foo { + fun invoke(vararg a: Any) {} +} + +fun test(f: Foo) { + f() { 1} +} + +// REF: (in Foo).invoke(Any) \ No newline at end of file diff --git a/idea/testData/resolve/references/invoke/oneParam.kt b/idea/testData/resolve/references/invoke/oneParam.kt new file mode 100644 index 00000000000..89b26c82d21 --- /dev/null +++ b/idea/testData/resolve/references/invoke/oneParam.kt @@ -0,0 +1,9 @@ +class Foo { + fun invoke(vararg a: Any) {} +} + +fun test(f: Foo) { + f(1) +} + +// REF: (in Foo).invoke(Any) \ No newline at end of file diff --git a/idea/testData/resolve/references/invoke/oneParamRPar.kt b/idea/testData/resolve/references/invoke/oneParamRPar.kt new file mode 100644 index 00000000000..13c5c98c11a --- /dev/null +++ b/idea/testData/resolve/references/invoke/oneParamRPar.kt @@ -0,0 +1,9 @@ +class Foo { + fun invoke(vararg a: Any) {} +} + +fun test(f: Foo) { + f(1) +} + +// REF: (in Foo).invoke(Any) \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveTestGenerated.java b/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveTestGenerated.java index af1c5f15b40..9ccecb70c1b 100644 --- a/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveTestGenerated.java @@ -31,7 +31,7 @@ import org.jetbrains.jet.resolve.AbstractResolveBaseTest; /** This class is generated by {@link org.jetbrains.jet.generators.tests.GenerateTests}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") @TestMetadata("idea/testData/resolve/references") -@InnerTestClasses({ReferenceResolveTestGenerated.DelegatedPropertyAccessors.class, ReferenceResolveTestGenerated.ForLoopIn.class}) +@InnerTestClasses({ReferenceResolveTestGenerated.DelegatedPropertyAccessors.class, ReferenceResolveTestGenerated.ForLoopIn.class, ReferenceResolveTestGenerated.Invoke.class}) public class ReferenceResolveTestGenerated extends AbstractResolveBaseTest { public void testAllFilesPresentInReferences() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/resolve/references"), Pattern.compile("^(.+)\\.kt$"), true); @@ -325,11 +325,65 @@ public class ReferenceResolveTestGenerated extends AbstractResolveBaseTest { } } + @TestMetadata("idea/testData/resolve/references/invoke") + public static class Invoke extends AbstractResolveBaseTest { + public void testAllFilesPresentInInvoke() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/resolve/references/invoke"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("lambdaAndParens.kt") + public void testLambdaAndParens() throws Exception { + doTest("idea/testData/resolve/references/invoke/lambdaAndParens.kt"); + } + + @TestMetadata("lambdaNoPar.kt") + public void testLambdaNoPar() throws Exception { + doTest("idea/testData/resolve/references/invoke/lambdaNoPar.kt"); + } + + @TestMetadata("lambdaNoParLabel.kt") + public void testLambdaNoParLabel() throws Exception { + doTest("idea/testData/resolve/references/invoke/lambdaNoParLabel.kt"); + } + + @TestMetadata("lambdaNoParRCurly.kt") + public void testLambdaNoParRCurly() throws Exception { + doTest("idea/testData/resolve/references/invoke/lambdaNoParRCurly.kt"); + } + + @TestMetadata("noParams.kt") + public void testNoParams() throws Exception { + doTest("idea/testData/resolve/references/invoke/noParams.kt"); + } + + @TestMetadata("noParamsRPar.kt") + public void testNoParamsRPar() throws Exception { + doTest("idea/testData/resolve/references/invoke/noParamsRPar.kt"); + } + + @TestMetadata("nonemptyLambdaRPar.kt") + public void testNonemptyLambdaRPar() throws Exception { + doTest("idea/testData/resolve/references/invoke/nonemptyLambdaRPar.kt"); + } + + @TestMetadata("oneParam.kt") + public void testOneParam() throws Exception { + doTest("idea/testData/resolve/references/invoke/oneParam.kt"); + } + + @TestMetadata("oneParamRPar.kt") + public void testOneParamRPar() throws Exception { + doTest("idea/testData/resolve/references/invoke/oneParamRPar.kt"); + } + + } + public static Test suite() { TestSuite suite = new TestSuite("ReferenceResolveTestGenerated"); suite.addTestSuite(ReferenceResolveTestGenerated.class); suite.addTest(DelegatedPropertyAccessors.innerSuite()); suite.addTest(ForLoopIn.innerSuite()); + suite.addTestSuite(Invoke.class); return suite; } }