From db70087573bb747063d14f89d0a2a6743cc49f36 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 16 Aug 2013 20:03:50 +0400 Subject: [PATCH] Labels on function literal arguments are processed properly --- .../org/jetbrains/jet/lang/psi/JetCallExpression.java | 3 +-- .../calls/ValueArgumentsToParametersMapper.java | 11 +---------- .../return/LocalReturnExplicitLabelNoParens.kt | 5 +++++ .../return/LocalReturnExplicitLabelParens.kt | 10 ++++++++++ .../jet/checkers/JetDiagnosticsTestGenerated.java | 11 +++++++++++ .../org/jetbrains/jet/types/JetTypeCheckerTest.java | 4 ++-- 6 files changed, 30 insertions(+), 14 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnExplicitLabelNoParens.kt create mode 100644 compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnExplicitLabelParens.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallExpression.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallExpression.java index 80e8548375a..a9caca9cc61 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallExpression.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallExpression.java @@ -19,7 +19,6 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; -import com.intellij.psi.PsiReferenceService; import com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry; import com.intellij.util.SmartList; import org.jetbrains.annotations.NotNull; @@ -98,7 +97,7 @@ public class JetCallExpression extends JetReferenceExpression implements JetCall if (JetTokens.LABELS.contains(prefixExpression.getOperationReference().getReferencedNameElementType())) { JetExpression labeledExpression = prefixExpression.getBaseExpression(); if (labeledExpression instanceof JetFunctionLiteralExpression) { - result.add(labeledExpression); + result.add(prefixExpression); } } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java index bfca07f031f..225b54e7d70 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java @@ -215,15 +215,6 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap setStatus(ERROR); } else { - JetFunctionLiteralExpression functionLiteral; - if (possiblyLabeledFunctionLiteral instanceof JetLabelQualifiedExpression) { - JetLabelQualifiedExpression labeledFunctionLiteral = (JetLabelQualifiedExpression) possiblyLabeledFunctionLiteral; - functionLiteral = (JetFunctionLiteralExpression) labeledFunctionLiteral.getLabeledExpression(); - } - else { - functionLiteral = (JetFunctionLiteralExpression) possiblyLabeledFunctionLiteral; - } - ValueParameterDescriptor valueParameterDescriptor = valueParameters.get(valueParameters.size() - 1); if (valueParameterDescriptor.getVarargElementType() != null) { report(VARARG_OUTSIDE_PARENTHESES.on(possiblyLabeledFunctionLiteral)); @@ -235,7 +226,7 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap setStatus(WEAK_ERROR); } else { - putVararg(valueParameterDescriptor, CallMaker.makeValueArgument(functionLiteral)); + putVararg(valueParameterDescriptor, CallMaker.makeValueArgument(possiblyLabeledFunctionLiteral)); } } } diff --git a/compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnExplicitLabelNoParens.kt b/compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnExplicitLabelNoParens.kt new file mode 100644 index 00000000000..9d4d7b89be9 --- /dev/null +++ b/compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnExplicitLabelNoParens.kt @@ -0,0 +1,5 @@ +fun test2() { + run @f{return@f 1} +} + +fun run(f: () -> T): T { return f() } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnExplicitLabelParens.kt b/compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnExplicitLabelParens.kt new file mode 100644 index 00000000000..24d4e2d6455 --- /dev/null +++ b/compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnExplicitLabelParens.kt @@ -0,0 +1,10 @@ +fun test() { + run(@f{return@f 1}) +} + + +fun test1() { + run(@{return@ 1}) +} + +fun run(f: () -> T): T { return f() } \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 5a84190e06e..d7403c98ece 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -2436,6 +2436,17 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage public void testForbiddenNonLocalReturnNoType() throws Exception { doTest("compiler/testData/diagnostics/tests/functionLiterals/return/ForbiddenNonLocalReturnNoType.kt"); } + + @TestMetadata("LocalReturnExplicitLabelNoParens.kt") + public void testLocalReturnExplicitLabelNoParens() throws Exception { + doTest("compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnExplicitLabelNoParens.kt"); + } + + @TestMetadata("LocalReturnExplicitLabelParens.kt") + public void testLocalReturnExplicitLabelParens() throws Exception { + doTest("compiler/testData/diagnostics/tests/functionLiterals/return/LocalReturnExplicitLabelParens.kt"); + } + } public static Test innerSuite() { diff --git a/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java b/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java index 96006d483c5..d94730a589b 100644 --- a/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java +++ b/compiler/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java @@ -148,8 +148,8 @@ public class JetTypeCheckerTest extends JetLiteFixture { public void testIf() throws Exception { assertType("if (true) 1", "Unit"); assertType("if (true) 1 else 1", "Int"); - assertType("if (true) 1 else return", "Int"); - assertType("if (true) return else 1", "Int"); + assertType("if (true) 1 else throw Exception()", "Int"); + assertType("if (true) throw Exception() else 1", "Int"); assertType("if (true) throw Exception() else throw Exception()", "Nothing"); assertType("if (true) 1 else null", "Int?");