From 9ed0b009d4904fe5b0e1a552808433dd39555d1c Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 5 Dec 2013 21:09:26 +0400 Subject: [PATCH] No need to store a list of recursive call expressions in trace --- .../jet/lang/resolve/BindingContext.java | 6 ++--- ...ilRecursionsFunctionAnalyzerExtension.java | 25 +++---------------- .../calls/CallResolverExtensionProvider.java | 9 ------- 3 files changed, 5 insertions(+), 35 deletions(-) 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 94a608262fe..6aa2f3fbfe2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java @@ -89,10 +89,8 @@ public interface BindingContext { new BasicWritableSlice(DO_NOTHING); WritableSlice> RESOLVED_CALL = new BasicWritableSlice>(DO_NOTHING); - WritableSlice TAIL_RECURSION_CALL = - new BasicWritableSlice(DO_NOTHING, true); - WritableSlice> FUNCTION_RECURSIVE_CALL_EXPRESSIONS = - new BasicWritableSlice>(DO_NOTHING, false); + WritableSlice TAIL_RECURSION_CALL = new BasicWritableSlice(DO_NOTHING, true); + WritableSlice HAS_TAIL_CALLS = Slices.createSimpleSetSlice(); WritableSlice CONSTRAINT_SYSTEM_COMPLETER = new BasicWritableSlice(DO_NOTHING); WritableSlice CALL = new BasicWritableSlice(DO_NOTHING); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TailRecursionsFunctionAnalyzerExtension.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TailRecursionsFunctionAnalyzerExtension.java index f1ff24f4f70..b6ec1f6614c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TailRecursionsFunctionAnalyzerExtension.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TailRecursionsFunctionAnalyzerExtension.java @@ -16,19 +16,10 @@ package org.jetbrains.jet.lang.resolve; -import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.diagnostics.Errors; -import org.jetbrains.jet.lang.psi.JetCallExpression; import org.jetbrains.jet.lang.psi.JetNamedFunction; -import org.jetbrains.jet.lang.resolve.calls.TailRecursionKind; - -import java.util.Collections; -import java.util.List; - -import static com.google.common.base.Objects.firstNonNull; public class TailRecursionsFunctionAnalyzerExtension implements FunctionAnalyzerExtension.AnalyzerExtension { @@ -36,21 +27,11 @@ public class TailRecursionsFunctionAnalyzerExtension implements FunctionAnalyzer @Override public void process( - @NotNull FunctionDescriptor descriptor, @NotNull JetNamedFunction function, @NotNull final BindingTrace trace + @NotNull FunctionDescriptor descriptor, @NotNull JetNamedFunction function, @NotNull BindingTrace trace ) { - List callExpressions = firstNonNull( - trace.get(BindingContext.FUNCTION_RECURSIVE_CALL_EXPRESSIONS, descriptor), - Collections.emptyList()); + Boolean hasTailCalls = trace.get(BindingContext.HAS_TAIL_CALLS, descriptor); - boolean allNonTailRecursiveCalls = Iterables.all(callExpressions, new Predicate() { - @Override - public boolean apply(JetCallExpression callExpression) { - TailRecursionKind recursionKind = trace.get(BindingContext.TAIL_RECURSION_CALL, callExpression); - return recursionKind == null || !recursionKind.isDoGenerateTailRecursion(); - } - }); - - if (allNonTailRecursiveCalls) { + if (Boolean.FALSE.equals(hasTailCalls)) { trace.report(Errors.NO_TAIL_CALLS_FOUND.on(function)); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverExtensionProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverExtensionProvider.java index a4ebcaf9bb8..ee89bc9660d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverExtensionProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverExtensionProvider.java @@ -16,18 +16,10 @@ package org.jetbrains.jet.lang.resolve.calls; -import com.intellij.psi.PsiElement; -import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; -import org.jetbrains.jet.lang.psi.JetCallExpression; -import org.jetbrains.jet.lang.psi.JetPsiUtil; -import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lang.resolve.calls.context.BasicCallResolutionContext; -import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResultsImpl; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import java.lang.ref.WeakReference; @@ -87,7 +79,6 @@ public class CallResolverExtensionProvider { } } if (isAnnotatedAsTailRecursive(declarationDescriptor)) { - extensions.add(RecursiveCallRecorderResolverExtension.INSTANCE); extensions.add(TailRecursionDetectorExtension.INSTANCE); } // add your extensions here