Make FE1.0 report tailrec diagnostics on the keyword

This commit is contained in:
Tianyu Geng
2021-09-27 11:37:00 -07:00
committed by teamcityserver
parent 5252effb10
commit a5435c0efc
7 changed files with 27 additions and 27 deletions
@@ -644,8 +644,8 @@ public interface Errors {
DiagnosticFactory0<KtParameter> VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION = DiagnosticFactory0.create(ERROR); DiagnosticFactory0<KtParameter> VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<KtNamedFunction> NO_TAIL_CALLS_FOUND = DiagnosticFactory0.create(WARNING, DECLARATION_SIGNATURE); DiagnosticFactory0<KtNamedFunction> NO_TAIL_CALLS_FOUND = DiagnosticFactory0.create(WARNING, TAILREC_MODIFIER);
DiagnosticFactoryForDeprecation0<KtNamedFunction> TAILREC_ON_VIRTUAL_MEMBER = DiagnosticFactoryForDeprecation0.create(LanguageFeature.ProhibitTailrecOnVirtualMember, DECLARATION_SIGNATURE); DiagnosticFactoryForDeprecation0<KtNamedFunction> TAILREC_ON_VIRTUAL_MEMBER = DiagnosticFactoryForDeprecation0.create(LanguageFeature.ProhibitTailrecOnVirtualMember, TAILREC_MODIFIER);
DiagnosticFactory0<KtParameter> DiagnosticFactory0<KtParameter>
ANONYMOUS_FUNCTION_PARAMETER_WITH_DEFAULT_VALUE = DiagnosticFactory0.create(ERROR, PARAMETER_DEFAULT_VALUE); ANONYMOUS_FUNCTION_PARAMETER_WITH_DEFAULT_VALUE = DiagnosticFactory0.create(ERROR, PARAMETER_DEFAULT_VALUE);
@@ -12,7 +12,7 @@ open class A {
} }
class B : A() { class B : A() {
<!NO_TAIL_CALLS_FOUND!>override tailrec fun foo(s: String): String<!> { override <!NO_TAIL_CALLS_FOUND!>tailrec<!> fun foo(s: String): String {
return if (s == "OK") s else foo() return if (s == "OK") s else foo()
} }
} }
@@ -12,7 +12,7 @@
class C { class C {
companion object { companion object {
<!NO_TAIL_CALLS_FOUND!>tailrec fun rec(i: Int)<!> { <!NO_TAIL_CALLS_FOUND!>tailrec<!> fun rec(i: Int) {
if (i <= 0) return if (i <= 0) return
C.<!NON_TAIL_RECURSIVE_CALL!>rec<!>(i - 1) C.<!NON_TAIL_RECURSIVE_CALL!>rec<!>(i - 1)
} }
@@ -1,6 +1,6 @@
// WITH_STDLIB // WITH_STDLIB
<!NO_TAIL_CALLS_FOUND!>tailrec fun foo1()<!> { <!NO_TAIL_CALLS_FOUND!>tailrec<!> fun foo1() {
run { run {
<!NON_TAIL_RECURSIVE_CALL!>foo1<!>() <!NON_TAIL_RECURSIVE_CALL!>foo1<!>()
} }
@@ -9,13 +9,13 @@
fun myRun(f: () -> Unit) = f() fun myRun(f: () -> Unit) = f()
<!NO_TAIL_CALLS_FOUND!>tailrec fun foo2()<!> { <!NO_TAIL_CALLS_FOUND!>tailrec<!> fun foo2() {
myRun { myRun {
<!NON_TAIL_RECURSIVE_CALL!>foo2<!>() <!NON_TAIL_RECURSIVE_CALL!>foo2<!>()
} }
} }
<!NO_TAIL_CALLS_FOUND!>tailrec fun foo3()<!> { <!NO_TAIL_CALLS_FOUND!>tailrec<!> fun foo3() {
fun bar() { fun bar() {
<!NON_TAIL_RECURSIVE_CALL!>foo3<!>() <!NON_TAIL_RECURSIVE_CALL!>foo3<!>()
} }
@@ -23,7 +23,7 @@ fun myRun(f: () -> Unit) = f()
} }
class A { class A {
<!NO_TAIL_CALLS_FOUND!>tailrec fun foo4()<!> { <!NO_TAIL_CALLS_FOUND!>tailrec<!> fun foo4() {
with(this) { with(this) {
<!NON_TAIL_RECURSIVE_CALL!>foo4<!>() <!NON_TAIL_RECURSIVE_CALL!>foo4<!>()
} }
+15 -15
View File
@@ -1,15 +1,15 @@
//!LANGUAGE: -ProhibitTailrecOnVirtualMember //!LANGUAGE: -ProhibitTailrecOnVirtualMember
open class A { open class A {
<!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec open fun foo(x: Int)<!> { <!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec<!> open fun foo(x: Int) {
foo(x) foo(x)
} }
<!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>internal tailrec open fun bar(y: Int)<!> { internal <!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec<!> open fun bar(y: Int) {
bar(y) bar(y)
} }
<!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>protected tailrec open fun baz(y: Int)<!> { protected <!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec<!> open fun baz(y: Int) {
baz(y) baz(y)
} }
@@ -38,15 +38,15 @@ open class B : A() {
open class C : A() { open class C : A() {
<!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec override fun foo(x: Int)<!> { <!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec<!> override fun foo(x: Int) {
foo(x) foo(x)
} }
<!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec override fun bar(y: Int)<!> { <!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec<!> override fun bar(y: Int) {
bar(y) bar(y)
} }
<!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec override fun baz(y: Int)<!> { <!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec<!> override fun baz(y: Int) {
baz(y) baz(y)
} }
} }
@@ -66,15 +66,15 @@ object D : A() {
} }
sealed class E : A() { sealed class E : A() {
<!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec override fun foo(x: Int)<!> { <!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec<!> override fun foo(x: Int) {
foo(x) foo(x)
} }
<!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec override fun bar(y: Int)<!> { <!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec<!> override fun bar(y: Int) {
bar(y) bar(y)
} }
<!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec override fun baz(y: Int)<!> { <!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec<!> override fun baz(y: Int) {
baz(y) baz(y)
} }
@@ -109,15 +109,15 @@ enum class F {
} }
}; };
<!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec open fun foo(x: Int)<!> { <!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec<!> open fun foo(x: Int) {
foo(x) foo(x)
} }
<!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>internal tailrec open fun bar(y: Int)<!> { internal <!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec<!> open fun bar(y: Int) {
bar(y) bar(y)
} }
<!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>protected tailrec open fun baz(y: Int)<!> { protected <!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec<!> open fun baz(y: Int) {
baz(y) baz(y)
} }
@@ -134,15 +134,15 @@ enum class G {
G1; G1;
<!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec open fun foo(x: Int)<!> { <!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec<!> open fun foo(x: Int) {
foo(x) foo(x)
} }
<!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>internal tailrec open fun bar(y: Int)<!> { internal <!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec<!> open fun bar(y: Int) {
bar(y) bar(y)
} }
<!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>protected tailrec open fun baz(y: Int)<!> { protected <!TAILREC_ON_VIRTUAL_MEMBER_WARNING!>tailrec<!> open fun baz(y: Int) {
baz(y) baz(y)
} }
+2 -2
View File
@@ -6,11 +6,11 @@ open class A {
} }
class B: A() { class B: A() {
<!NO_TAIL_CALLS_FOUND!>tailrec override fun foo(x: Int)<!> { <!NO_TAIL_CALLS_FOUND!>tailrec<!> override fun foo(x: Int) {
foo() foo()
} }
<!NO_TAIL_CALLS_FOUND!>tailrec override fun gav(y: Int, z: Int)<!> { <!NO_TAIL_CALLS_FOUND!>tailrec<!> override fun gav(y: Int, z: Int) {
gav(y) gav(y)
} }
+2 -2
View File
@@ -22,7 +22,7 @@ class Bar {
this.bar2() this.bar2()
} }
<!NO_TAIL_CALLS_FOUND!>tailrec fun bar3()<!> { <!NO_TAIL_CALLS_FOUND!>tailrec<!> fun bar3() {
Bar.<!NON_TAIL_RECURSIVE_CALL!>bar3<!>() Bar.<!NON_TAIL_RECURSIVE_CALL!>bar3<!>()
} }
@@ -44,7 +44,7 @@ enum class E {
} }
}, },
C { C {
<!NO_TAIL_CALLS_FOUND!>override tailrec fun rec()<!> { override <!NO_TAIL_CALLS_FOUND!>tailrec<!> fun rec() {
C.rec() // resolution goes to `E.rec`. Hence the resolved symbol is considered different from `C.rec`. C.rec() // resolution goes to `E.rec`. Hence the resolved symbol is considered different from `C.rec`.
} }
}; };