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?");