diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index d4661d38dc7..3b4ee88248e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1595,9 +1595,10 @@ public class ExpressionCodegen extends JetVisitor implem if (returnedExpression != null) { if (returnedExpression instanceof JetCallExpression) { JetCallExpression callExpression = (JetCallExpression) returnedExpression; - if (tailRecursionGeneratorUtil.isTailRecursion(callExpression) && callExpression.getCalleeExpression() != null) { - ResolvedCall resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, callExpression.getCalleeExpression()); - if (resolvedCall != null) { + JetExpression calleeExpression = callExpression.getCalleeExpression(); + if (calleeExpression != null) { + ResolvedCall resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, calleeExpression); + if (resolvedCall != null && tailRecursionGeneratorUtil.isTailRecursion(resolvedCall)) { return tailRecursionGeneratorUtil.generateTailRecursion(resolvedCall, callExpression); } } @@ -1932,7 +1933,7 @@ public class ExpressionCodegen extends JetVisitor implem } } - if (tailRecursionGeneratorUtil.isTailRecursion(expression)) { + if (tailRecursionGeneratorUtil.isTailRecursion(resolvedCall)) { return tailRecursionGeneratorUtil.generateTailRecursion(resolvedCall, expression); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/TailRecursionGeneratorUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/TailRecursionGeneratorUtil.java index 03bf669669a..78801994a80 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/TailRecursionGeneratorUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/TailRecursionGeneratorUtil.java @@ -61,8 +61,8 @@ public class TailRecursionGeneratorUtil { this.state = state; } - public boolean isTailRecursion(@NotNull JetCallExpression expression) { - TailRecursionKind status = state.getBindingContext().get(TAIL_RECURSION_CALL, expression); + public boolean isTailRecursion(@NotNull ResolvedCall resolvedCall) { + TailRecursionKind status = state.getBindingContext().get(TAIL_RECURSION_CALL, resolvedCall); return status != null && status.isDoGenerateTailRecursion(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index 1fbdb7b437f..db8f325dde8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -336,8 +336,8 @@ public interface Errors { DiagnosticFactory2 FUNCTION_EXPECTED = DiagnosticFactory2.create(ERROR); DiagnosticFactory2 FUNCTION_CALL_EXPECTED = DiagnosticFactory2.create(ERROR, CALL_EXPRESSION); - DiagnosticFactory0 NON_TAIL_RECURSIVE_CALL = DiagnosticFactory0.create(WARNING, CALL_EXPRESSION); - DiagnosticFactory0 TAIL_RECURSION_IN_TRY_IS_NOT_SUPPORTED = DiagnosticFactory0.create(WARNING, CALL_EXPRESSION); + DiagnosticFactory0 NON_TAIL_RECURSIVE_CALL = DiagnosticFactory0.create(WARNING, CALL_EXPRESSION); + DiagnosticFactory0 TAIL_RECURSION_IN_TRY_IS_NOT_SUPPORTED = DiagnosticFactory0.create(WARNING, CALL_EXPRESSION); DiagnosticFactory0 NO_CONSTRUCTOR = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS = DiagnosticFactory0.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java index 751e1a4d792..92a264e8341 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java @@ -383,10 +383,10 @@ public class PositioningStrategies { } }; - public static final PositioningStrategy CALL_EXPRESSION = new PositioningStrategy() { + public static final PositioningStrategy CALL_EXPRESSION = new PositioningStrategy() { @NotNull @Override - public List mark(@NotNull JetExpression element) { + public List mark(@NotNull PsiElement element) { if (element instanceof JetCallExpression) { JetCallExpression callExpression = (JetCallExpression) element; PsiElement endElement; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java index 6aa2f3fbfe2..8adf844c7b2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java @@ -89,7 +89,7 @@ public interface BindingContext { new BasicWritableSlice(DO_NOTHING); WritableSlice> RESOLVED_CALL = new BasicWritableSlice>(DO_NOTHING); - WritableSlice TAIL_RECURSION_CALL = new BasicWritableSlice(DO_NOTHING, true); + WritableSlice, TailRecursionKind> TAIL_RECURSION_CALL = Slices.createSimpleSlice(); WritableSlice HAS_TAIL_CALLS = Slices.createSimpleSetSlice(); WritableSlice CONSTRAINT_SYSTEM_COMPLETER = new BasicWritableSlice(DO_NOTHING); WritableSlice CALL = new BasicWritableSlice(DO_NOTHING);