No need to store a list of recursive call expressions in trace

This commit is contained in:
Andrey Breslav
2013-12-05 21:09:26 +04:00
parent 0316e6cb8d
commit 9ed0b009d4
3 changed files with 5 additions and 35 deletions
@@ -89,10 +89,8 @@ public interface BindingContext {
new BasicWritableSlice<JetReferenceExpression, DeclarationDescriptor>(DO_NOTHING);
WritableSlice<JetElement, ResolvedCall<? extends CallableDescriptor>> RESOLVED_CALL =
new BasicWritableSlice<JetElement, ResolvedCall<? extends CallableDescriptor>>(DO_NOTHING);
WritableSlice<JetCallExpression, TailRecursionKind> TAIL_RECURSION_CALL =
new BasicWritableSlice<JetCallExpression, TailRecursionKind>(DO_NOTHING, true);
WritableSlice<DeclarationDescriptor, List<JetCallExpression>> FUNCTION_RECURSIVE_CALL_EXPRESSIONS =
new BasicWritableSlice<DeclarationDescriptor, List<JetCallExpression>>(DO_NOTHING, false);
WritableSlice<JetCallExpression, TailRecursionKind> TAIL_RECURSION_CALL = new BasicWritableSlice<JetCallExpression, TailRecursionKind>(DO_NOTHING, true);
WritableSlice<FunctionDescriptor, Boolean> HAS_TAIL_CALLS = Slices.createSimpleSetSlice();
WritableSlice<JetElement, ConstraintSystemCompleter> CONSTRAINT_SYSTEM_COMPLETER = new BasicWritableSlice<JetElement, ConstraintSystemCompleter>(DO_NOTHING);
WritableSlice<JetElement, Call> CALL = new BasicWritableSlice<JetElement, Call>(DO_NOTHING);
@@ -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<JetCallExpression> callExpressions = firstNonNull(
trace.get(BindingContext.FUNCTION_RECURSIVE_CALL_EXPRESSIONS, descriptor),
Collections.<JetCallExpression>emptyList());
Boolean hasTailCalls = trace.get(BindingContext.HAS_TAIL_CALLS, descriptor);
boolean allNonTailRecursiveCalls = Iterables.all(callExpressions, new Predicate<JetCallExpression>() {
@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));
}
}
@@ -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