From 1849643e52f84c6f9d99ea46adc09147b59be340 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 6 Dec 2013 00:22:07 +0400 Subject: [PATCH] Got rid of HAS_TAIL_CALL slice --- .../lang/cfg/JetFlowInformationProvider.java | 6 ++- .../jet/lang/resolve/BindingContext.java | 4 +- .../resolve/FunctionAnalyzerExtension.java | 3 -- ...ilRecursionsFunctionAnalyzerExtension.java | 38 ------------------- 4 files changed, 6 insertions(+), 45 deletions(-) delete mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/resolve/TailRecursionsFunctionAnalyzerExtension.java diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java index 6ab0daef28b..c6018efccda 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java @@ -691,13 +691,14 @@ public class JetFlowInformationProvider { } } ); + boolean hasTailCalls = false; for (Map.Entry entry : calls.entrySet()) { JetElement element = entry.getKey(); KindAndCall kindAndCall = entry.getValue(); switch (kindAndCall.kind) { case TAIL_CALL: trace.record(TAIL_RECURSION_CALL, kindAndCall.call, TailRecursionKind.TAIL_CALL); - trace.record(BindingContext.HAS_TAIL_CALLS, (FunctionDescriptor) subroutineDescriptor); + hasTailCalls = true; break; case IN_TRY: trace.report(Errors.TAIL_RECURSION_IN_TRY_IS_NOT_SUPPORTED.on(element)); @@ -706,7 +707,10 @@ public class JetFlowInformationProvider { trace.report(Errors.NON_TAIL_RECURSIVE_CALL.on(element)); break; } + } + if (!hasTailCalls) { + trace.report(Errors.NO_TAIL_CALLS_FOUND.on((JetNamedFunction) subroutine)); } } 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 8adf844c7b2..1ce21d0518d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java @@ -21,11 +21,11 @@ import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; -import org.jetbrains.jet.lang.resolve.calls.TailRecursionKind; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptorImpl; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.calls.TailRecursionKind; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; import org.jetbrains.jet.lang.resolve.calls.inference.ConstraintSystemCompleter; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; @@ -40,7 +40,6 @@ import org.jetbrains.jet.util.slicedmap.*; import java.util.Collection; import java.util.Collections; -import java.util.List; import static org.jetbrains.jet.util.slicedmap.RewritePolicy.DO_NOTHING; @@ -90,7 +89,6 @@ public interface BindingContext { WritableSlice> RESOLVED_CALL = new BasicWritableSlice>(DO_NOTHING); 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); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/FunctionAnalyzerExtension.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/FunctionAnalyzerExtension.java index 45ba9233b06..3603cd4d196 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/FunctionAnalyzerExtension.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/FunctionAnalyzerExtension.java @@ -63,9 +63,6 @@ public class FunctionAnalyzerExtension { ((SimpleFunctionDescriptor) functionDescriptor).isInline()) { list.add(InlineAnalyzerExtension.INSTANCE); } - if (KotlinBuiltIns.getInstance().isTailRecursive(functionDescriptor)) { - list.add(TailRecursionsFunctionAnalyzerExtension.INSTANCE); - } return list; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TailRecursionsFunctionAnalyzerExtension.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TailRecursionsFunctionAnalyzerExtension.java deleted file mode 100644 index b6ec1f6614c..00000000000 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TailRecursionsFunctionAnalyzerExtension.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2010-2013 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.jet.lang.resolve; - -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.JetNamedFunction; - -public class TailRecursionsFunctionAnalyzerExtension implements FunctionAnalyzerExtension.AnalyzerExtension { - - public static final TailRecursionsFunctionAnalyzerExtension INSTANCE = new TailRecursionsFunctionAnalyzerExtension(); - - @Override - public void process( - @NotNull FunctionDescriptor descriptor, @NotNull JetNamedFunction function, @NotNull BindingTrace trace - ) { - Boolean hasTailCalls = trace.get(BindingContext.HAS_TAIL_CALLS, descriptor); - - if (Boolean.FALSE.equals(hasTailCalls)) { - trace.report(Errors.NO_TAIL_CALLS_FOUND.on(function)); - } - } -}