No need to store a list of recursive call expressions in trace
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
+3
-22
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
-9
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user