Report error on non-top-level type aliases (unsupported in 1.1).
Get rid of nested type aliases in project.
This commit is contained in:
@@ -130,6 +130,7 @@ public interface Errors {
|
|||||||
DiagnosticFactory0<KtParameter> REIFIED_TYPE_IN_CATCH_CLAUSE = DiagnosticFactory0.create(ERROR);
|
DiagnosticFactory0<KtParameter> REIFIED_TYPE_IN_CATCH_CLAUSE = DiagnosticFactory0.create(ERROR);
|
||||||
DiagnosticFactory0<KtTypeParameterList> GENERIC_THROWABLE_SUBCLASS = DiagnosticFactory0.create(ERROR);
|
DiagnosticFactory0<KtTypeParameterList> GENERIC_THROWABLE_SUBCLASS = DiagnosticFactory0.create(ERROR);
|
||||||
|
|
||||||
|
DiagnosticFactory0<KtTypeAlias> TOPLEVEL_TYPEALIASES_ONLY = DiagnosticFactory0.create(ERROR);
|
||||||
DiagnosticFactory1<KtElement, ClassifierDescriptor> RECURSIVE_TYPEALIAS_EXPANSION = DiagnosticFactory1.create(ERROR);
|
DiagnosticFactory1<KtElement, ClassifierDescriptor> RECURSIVE_TYPEALIAS_EXPANSION = DiagnosticFactory1.create(ERROR);
|
||||||
DiagnosticFactory3<KtElement, KotlinType, KotlinType, ClassifierDescriptor> UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION =
|
DiagnosticFactory3<KtElement, KotlinType, KotlinType, ClassifierDescriptor> UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION =
|
||||||
DiagnosticFactory3.create(ERROR);
|
DiagnosticFactory3.create(ERROR);
|
||||||
|
|||||||
+1
@@ -434,6 +434,7 @@ public class DefaultErrorMessages {
|
|||||||
MAP.put(USELESS_ELVIS_RIGHT_IS_NULL, "Right operand of elvis operator (?:) is useless if it is null");
|
MAP.put(USELESS_ELVIS_RIGHT_IS_NULL, "Right operand of elvis operator (?:) is useless if it is null");
|
||||||
MAP.put(CONFLICTING_UPPER_BOUNDS, "Upper bounds of {0} have empty intersection", NAME);
|
MAP.put(CONFLICTING_UPPER_BOUNDS, "Upper bounds of {0} have empty intersection", NAME);
|
||||||
|
|
||||||
|
MAP.put(TOPLEVEL_TYPEALIASES_ONLY, "Nested and local type aliases are not supported");
|
||||||
MAP.put(RECURSIVE_TYPEALIAS_EXPANSION, "Recursive type alias in expansion: {0}", NAME);
|
MAP.put(RECURSIVE_TYPEALIAS_EXPANSION, "Recursive type alias in expansion: {0}", NAME);
|
||||||
MAP.put(UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION,
|
MAP.put(UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION,
|
||||||
"Type argument resulting from type alias expansion is not within required bounds for ''{2}'': " +
|
"Type argument resulting from type alias expansion is not within required bounds for ''{2}'': " +
|
||||||
|
|||||||
@@ -661,6 +661,10 @@ public class DescriptorResolver {
|
|||||||
@NotNull KtTypeAlias typeAlias,
|
@NotNull KtTypeAlias typeAlias,
|
||||||
@NotNull final BindingTrace trace
|
@NotNull final BindingTrace trace
|
||||||
) {
|
) {
|
||||||
|
if (!(containingDeclaration instanceof PackageFragmentDescriptor)) {
|
||||||
|
trace.report(TOPLEVEL_TYPEALIASES_ONLY.on(typeAlias));
|
||||||
|
}
|
||||||
|
|
||||||
KtModifierList modifierList = typeAlias.getModifierList();
|
KtModifierList modifierList = typeAlias.getModifierList();
|
||||||
Visibility visibility = resolveVisibilityFromModifiers(typeAlias, getDefaultVisibility(typeAlias, containingDeclaration));
|
Visibility visibility = resolveVisibilityFromModifiers(typeAlias, getDefaultVisibility(typeAlias, containingDeclaration));
|
||||||
|
|
||||||
|
|||||||
@@ -12,11 +12,6 @@ import java.lang.Class
|
|||||||
@Retention(RUNTIME)
|
@Retention(RUNTIME)
|
||||||
annotation class Ann(val x: Int)
|
annotation class Ann(val x: Int)
|
||||||
|
|
||||||
class C {
|
|
||||||
@Ann(1)
|
|
||||||
typealias TA = Any
|
|
||||||
}
|
|
||||||
|
|
||||||
@Ann(2)
|
@Ann(2)
|
||||||
typealias TA = Any
|
typealias TA = Any
|
||||||
|
|
||||||
@@ -28,7 +23,6 @@ fun Class<*>.assertHasDeclaredMethodWithAnn() {
|
|||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
Class.forName("AnnotationsOnTypeAliasesKt").assertHasDeclaredMethodWithAnn()
|
Class.forName("AnnotationsOnTypeAliasesKt").assertHasDeclaredMethodWithAnn()
|
||||||
Class.forName("C").assertHasDeclaredMethodWithAnn()
|
|
||||||
|
|
||||||
return "OK"
|
return "OK"
|
||||||
}
|
}
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
class Cell<TC>(val x: TC)
|
|
||||||
|
|
||||||
object OkHost {
|
|
||||||
val value = "OK"
|
|
||||||
}
|
|
||||||
|
|
||||||
fun <T> id(x: T): T {
|
|
||||||
typealias C = Cell<T>
|
|
||||||
val c: C = C(x)
|
|
||||||
return c.x
|
|
||||||
}
|
|
||||||
|
|
||||||
fun box(): String {
|
|
||||||
typealias OK = OkHost
|
|
||||||
return id(OK.value)
|
|
||||||
}
|
|
||||||
+1
@@ -4,6 +4,7 @@ typealias Str = String
|
|||||||
typealias L<T> = List<T>
|
typealias L<T> = List<T>
|
||||||
|
|
||||||
class Klass {
|
class Klass {
|
||||||
|
@Suppress("TOPLEVEL_TYPEALIASES_ONLY")
|
||||||
typealias Nested = Z
|
typealias Nested = Z
|
||||||
|
|
||||||
class Z
|
class Z
|
||||||
|
|||||||
@@ -9,11 +9,6 @@ import java.lang.Class
|
|||||||
@Retention(RUNTIME)
|
@Retention(RUNTIME)
|
||||||
annotation class Ann(val x: Int)
|
annotation class Ann(val x: Int)
|
||||||
|
|
||||||
class C {
|
|
||||||
@Ann(1)
|
|
||||||
typealias TA = Any
|
|
||||||
}
|
|
||||||
|
|
||||||
@Ann(2)
|
@Ann(2)
|
||||||
typealias TA = Any
|
typealias TA = Any
|
||||||
|
|
||||||
@@ -28,7 +23,6 @@ fun Class<*>.assertHasDeclaredMethodWithAnn() {
|
|||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
Class.forName("a.AKt").assertHasDeclaredMethodWithAnn()
|
Class.forName("a.AKt").assertHasDeclaredMethodWithAnn()
|
||||||
Class.forName("a.C").assertHasDeclaredMethodWithAnn()
|
|
||||||
|
|
||||||
return "OK"
|
return "OK"
|
||||||
}
|
}
|
||||||
@@ -1,14 +1,15 @@
|
|||||||
// FILE: A.kt
|
// FILE: A.kt
|
||||||
class Foo<out T>(val t: T) {
|
typealias Bar<T> = (T) -> String
|
||||||
typealias Bar = (T) -> String
|
|
||||||
|
|
||||||
fun baz(b: Bar) = b(t)
|
class Foo<out T>(val t: T) {
|
||||||
|
|
||||||
|
fun baz(b: Bar<T>) = b(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FILE: B.kt
|
// FILE: B.kt
|
||||||
class FooTest {
|
class FooTest {
|
||||||
fun baz(): String {
|
fun baz(): String {
|
||||||
val b: Foo<String>.Bar = { "OK" }
|
val b: Bar<String> = { "OK" }
|
||||||
return Foo("").baz(b)
|
return Foo("").baz(b)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// !DIAGNOSTICS: -DEPRECATION
|
// !DIAGNOSTICS: -DEPRECATION -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
<!UNDERSCORE_IS_RESERVED!>import kotlin.Deprecated as ___<!>
|
<!UNDERSCORE_IS_RESERVED!>import kotlin.Deprecated as ___<!>
|
||||||
|
|
||||||
|
|||||||
Vendored
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
// !CHECK_TYPE
|
// !CHECK_TYPE
|
||||||
open class Outer<X, Y> {
|
open class Outer<X, Y> {
|
||||||
inner class Inner<Z>
|
inner class Inner<Z>
|
||||||
|
|||||||
compiler/testData/diagnostics/tests/generics/innerClasses/implicitArguments/fromSuperClassesLocal.kt
Vendored
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
// !CHECK_TYPE
|
// !CHECK_TYPE
|
||||||
// !DIAGNOSTICS: -UNUSED_VALUE -VARIABLE_WITH_REDUNDANT_INITIALIZER
|
// !DIAGNOSTICS: -UNUSED_VALUE -VARIABLE_WITH_REDUNDANT_INITIALIZER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
class A<R1, R2, R3, R4>
|
class A<R1, R2, R3, R4>
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
// !CHECK_TYPE
|
// !CHECK_TYPE
|
||||||
// !DIAGNOSTICS: -UNUSED_VALUE -VARIABLE_WITH_REDUNDANT_INITIALIZER
|
// !DIAGNOSTICS: -UNUSED_VALUE -VARIABLE_WITH_REDUNDANT_INITIALIZER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
class A<R1, R2, R3, R4, R5, R6>
|
class A<R1, R2, R3, R4, R5, R6>
|
||||||
|
|
||||||
|
|||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
// !CHECK_TYPE
|
// !CHECK_TYPE
|
||||||
open class Outer<X, Y> {
|
open class Outer<X, Y> {
|
||||||
inner class Inner<Z>
|
inner class Inner<Z>
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
class C(val x: Int)
|
class C(val x: Int)
|
||||||
|
|
||||||
<!CONFLICTING_OVERLOADS!>typealias CC = C<!>
|
<!CONFLICTING_OVERLOADS!>typealias CC = C<!>
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
// FILE: file1.kt
|
// FILE: file1.kt
|
||||||
class <!PACKAGE_OR_CLASSIFIER_REDECLARATION!>SomeClass<!>
|
class <!PACKAGE_OR_CLASSIFIER_REDECLARATION!>SomeClass<!>
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
// FILE: file1.kt
|
// FILE: file1.kt
|
||||||
typealias <!REDECLARATION!>Test<!> = String
|
typealias <!REDECLARATION!>Test<!> = String
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
typealias S = String
|
typealias S = String
|
||||||
|
|
||||||
class C {
|
class C {
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
class Outer<TO> {
|
class Outer<TO> {
|
||||||
typealias LTO = List<TO>
|
typealias LTO = List<TO>
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
typealias L<T> = List<T>
|
typealias L<T> = List<T>
|
||||||
|
|
||||||
class Outer {
|
class Outer {
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
// FILE: file1.kt
|
// FILE: file1.kt
|
||||||
package package1
|
package package1
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
interface ICell<T> {
|
interface ICell<T> {
|
||||||
val x: T
|
val x: T
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
open class Base {
|
open class Base {
|
||||||
typealias Nested = String
|
typealias Nested = String
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
class Outer<T> {
|
class Outer<T> {
|
||||||
class Nested
|
class Nested
|
||||||
class GenericNested<TT>
|
class GenericNested<TT>
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
class C<T> {
|
class C<T> {
|
||||||
inner class D
|
inner class D
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
class Pair<X, Y>(val x: X, val y: Y)
|
class Pair<X, Y>(val x: X, val y: Y)
|
||||||
|
|
||||||
class C<T> {
|
class C<T> {
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
class OuterClass<T1> {
|
class OuterClass<T1> {
|
||||||
class NestedClass<T2>
|
class NestedClass<T2>
|
||||||
typealias NestedType<T> = NestedClass<T>
|
typealias NestedType<T> = NestedClass<T>
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
class A {
|
class A {
|
||||||
public inner class B { }
|
public inner class B { }
|
||||||
public typealias BAlias = B
|
public typealias BAlias = B
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
fun <T> emptyList(): List<T> = null!!
|
fun <T> emptyList(): List<T> = null!!
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
class Cell<TC>(val x: TC)
|
class Cell<TC>(val x: TC)
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
fun outer() {
|
fun outer() {
|
||||||
<!WRONG_MODIFIER_TARGET!>companion<!> typealias TestLocal = Any
|
<!WRONG_MODIFIER_TARGET!>companion<!> typealias TestLocal = Any
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
fun outer() {
|
fun outer() {
|
||||||
typealias Test1 = <!RECURSIVE_TYPEALIAS_EXPANSION!>Test1<!>
|
typealias Test1 = <!RECURSIVE_TYPEALIAS_EXPANSION!>Test1<!>
|
||||||
typealias Test2 = <!RECURSIVE_TYPEALIAS_EXPANSION!>List<Test2><!>
|
typealias Test2 = <!RECURSIVE_TYPEALIAS_EXPANSION!>List<Test2><!>
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
class Pair<T1, T2>(val x1: T1, val x2: T2)
|
class Pair<T1, T2>(val x1: T1, val x2: T2)
|
||||||
|
|
||||||
|
|||||||
+2
@@ -1,3 +1,5 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
class Pair<T1, T2>(val x1: T1, val x2: T2)
|
class Pair<T1, T2>(val x1: T1, val x2: T2)
|
||||||
|
|
||||||
class C<T> {
|
class C<T> {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
class Pair<T1, T2>(val x1: T1, val x2: T2)
|
class Pair<T1, T2>(val x1: T1, val x2: T2)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
typealias TopLevel = Any
|
||||||
|
|
||||||
|
interface A {
|
||||||
|
<!TOPLEVEL_TYPEALIASES_ONLY!>typealias Nested = Any<!>
|
||||||
|
}
|
||||||
|
|
||||||
|
class C {
|
||||||
|
<!TOPLEVEL_TYPEALIASES_ONLY!>typealias Nested = Any<!>
|
||||||
|
class D {
|
||||||
|
<!TOPLEVEL_TYPEALIASES_ONLY!>typealias Nested = Any<!>
|
||||||
|
fun foo() {
|
||||||
|
<!TOPLEVEL_TYPEALIASES_ONLY!>typealias LocalInMember = Any<!>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
<!TOPLEVEL_TYPEALIASES_ONLY!>typealias Local = Any<!>
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public fun foo(): kotlin.Unit
|
||||||
|
|
||||||
|
public interface A {
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
public typealias Nested = kotlin.Any
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class C {
|
||||||
|
public constructor C()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
|
||||||
|
public final class D {
|
||||||
|
public constructor D()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public final fun foo(): kotlin.Unit
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
public typealias Nested = kotlin.Any
|
||||||
|
}
|
||||||
|
public typealias Nested = kotlin.Any
|
||||||
|
}
|
||||||
|
public typealias TopLevel = kotlin.Any
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
typealias L<T> = List<T>
|
typealias L<T> = List<T>
|
||||||
typealias NL<T> = List<T>?
|
typealias NL<T> = List<T>?
|
||||||
typealias LStar<<!UNUSED_TYPEALIAS_PARAMETER!>T<!>> = List<*>
|
typealias LStar<<!UNUSED_TYPEALIAS_PARAMETER!>T<!>> = List<*>
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
class C {
|
class C {
|
||||||
typealias Self = C
|
typealias Self = C
|
||||||
class Nested {
|
class Nested {
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
open class Base {
|
open class Base {
|
||||||
open fun foo() {}
|
open fun foo() {}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -1,3 +1,5 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
abstract class AbstractClass
|
abstract class AbstractClass
|
||||||
typealias Test1 = AbstractClass
|
typealias Test1 = AbstractClass
|
||||||
val test1 = <!CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS!>Test1()<!>
|
val test1 = <!CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS!>Test1()<!>
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -TOPLEVEL_TYPEALIASES_ONLY
|
||||||
|
|
||||||
typealias ToTypeParam1<T> = <!TYPEALIAS_SHOULD_EXPAND_TO_CLASS!>T<!>
|
typealias ToTypeParam1<T> = <!TYPEALIAS_SHOULD_EXPAND_TO_CLASS!>T<!>
|
||||||
typealias ToTypeParam2<T> = <!TYPEALIAS_SHOULD_EXPAND_TO_CLASS!>ToTypeParam1<T><!>
|
typealias ToTypeParam2<T> = <!TYPEALIAS_SHOULD_EXPAND_TO_CLASS!>ToTypeParam1<T><!>
|
||||||
typealias ToTypeParam3<T1, <!UNUSED_TYPEALIAS_PARAMETER!>T2<!>> = <!TYPEALIAS_SHOULD_EXPAND_TO_CLASS!>ToTypeParam2<T1><!>
|
typealias ToTypeParam3<T1, <!UNUSED_TYPEALIAS_PARAMETER!>T2<!>> = <!TYPEALIAS_SHOULD_EXPAND_TO_CLASS!>ToTypeParam2<T1><!>
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
typealias Test1 = String
|
typealias Test1 = String
|
||||||
|
|
||||||
fun foo() {
|
fun foo() {
|
||||||
|
@Suppress("TOPLEVEL_TYPEALIASES_ONLY")
|
||||||
typealias TestLocal = String
|
typealias TestLocal = String
|
||||||
}
|
}
|
||||||
|
|
||||||
class C {
|
class C {
|
||||||
|
@Suppress("TOPLEVEL_TYPEALIASES_ONLY")
|
||||||
typealias TestNested = String
|
typealias TestNested = String
|
||||||
}
|
}
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
//ALLOW_AST_ACCESS
|
|
||||||
package test
|
|
||||||
|
|
||||||
open class Pair<T1, T2>
|
|
||||||
open class Triple<T1, T2, T3>
|
|
||||||
|
|
||||||
class Outer<X> {
|
|
||||||
inner class InnerTest1<A>: Pair<X, A>()
|
|
||||||
typealias Test1<A> = Pair<X, A>
|
|
||||||
|
|
||||||
class Nested<Y> {
|
|
||||||
typealias Test2<B> = Pair<Y, B>
|
|
||||||
}
|
|
||||||
|
|
||||||
inner class Inner<Z> {
|
|
||||||
typealias Test3<C> = Triple<X, Z, C>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
public final class Outer</*0*/ X> {
|
|
||||||
/*primary*/ public constructor Outer</*0*/ X>()
|
|
||||||
|
|
||||||
public final inner class Inner</*0*/ Z> /*captured type parameters: /*1*/ X*/ {
|
|
||||||
/*primary*/ public constructor Inner</*0*/ Z>()
|
|
||||||
public typealias Test3</*0*/ C> /*captured type parameters: /*1*/ Z, /*2*/ X*/ = test.Triple<X, Z, C>
|
|
||||||
}
|
|
||||||
|
|
||||||
public final inner class InnerTest1</*0*/ A> /*captured type parameters: /*1*/ X*/ : test.Pair<X, A> {
|
|
||||||
/*primary*/ public constructor InnerTest1</*0*/ A>()
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class Nested</*0*/ Y> {
|
|
||||||
/*primary*/ public constructor Nested</*0*/ Y>()
|
|
||||||
public typealias Test2</*0*/ B> /*captured type parameters: /*1*/ Y*/ = test.Pair<Y, B>
|
|
||||||
}
|
|
||||||
public typealias Test1</*0*/ A> /*captured type parameters: /*1*/ X*/ = test.Pair<X, A>
|
|
||||||
}
|
|
||||||
|
|
||||||
public open class Pair</*0*/ T1, /*1*/ T2> {
|
|
||||||
/*primary*/ public constructor Pair</*0*/ T1, /*1*/ T2>()
|
|
||||||
}
|
|
||||||
|
|
||||||
public open class Triple</*0*/ T1, /*1*/ T2, /*2*/ T3> {
|
|
||||||
/*primary*/ public constructor Triple</*0*/ T1, /*1*/ T2, /*2*/ T3>()
|
|
||||||
}
|
|
||||||
-6
@@ -16193,12 +16193,6 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("localTypeAlias.kt")
|
|
||||||
public void testLocalTypeAlias() throws Exception {
|
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/localTypeAlias.kt");
|
|
||||||
doTest(fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("simple.kt")
|
@TestMetadata("simple.kt")
|
||||||
public void testSimple() throws Exception {
|
public void testSimple() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/simple.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/simple.kt");
|
||||||
|
|||||||
@@ -21106,6 +21106,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("topLevelTypeAliasesOnly.kt")
|
||||||
|
public void testTopLevelTypeAliasesOnly() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/topLevelTypeAliasesOnly.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("typeAliasArgumentsInCompanionObject.kt")
|
@TestMetadata("typeAliasArgumentsInCompanionObject.kt")
|
||||||
public void testTypeAliasArgumentsInCompanionObject() throws Exception {
|
public void testTypeAliasArgumentsInCompanionObject() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/typeAliasArgumentsInCompanionObject.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/typeAliasArgumentsInCompanionObject.kt");
|
||||||
|
|||||||
@@ -16193,12 +16193,6 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("localTypeAlias.kt")
|
|
||||||
public void testLocalTypeAlias() throws Exception {
|
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/localTypeAlias.kt");
|
|
||||||
doTest(fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("simple.kt")
|
@TestMetadata("simple.kt")
|
||||||
public void testSimple() throws Exception {
|
public void testSimple() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/simple.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/simple.kt");
|
||||||
|
|||||||
@@ -4837,12 +4837,6 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest {
|
|||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/typealias/Generic.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/typealias/Generic.kt");
|
||||||
doTestCompiledKotlin(fileName);
|
doTestCompiledKotlin(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("Nested.kt")
|
|
||||||
public void testNested() throws Exception {
|
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/typealias/Nested.kt");
|
|
||||||
doTestCompiledKotlin(fileName);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/loadJava/compiledKotlin/visibility")
|
@TestMetadata("compiler/testData/loadJava/compiledKotlin/visibility")
|
||||||
|
|||||||
-6
@@ -3070,12 +3070,6 @@ public class LoadKotlinWithTypeTableTestGenerated extends AbstractLoadKotlinWith
|
|||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/typealias/Generic.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/typealias/Generic.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("Nested.kt")
|
|
||||||
public void testNested() throws Exception {
|
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/typealias/Nested.kt");
|
|
||||||
doTest(fileName);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/loadJava/compiledKotlin/visibility")
|
@TestMetadata("compiler/testData/loadJava/compiledKotlin/visibility")
|
||||||
|
|||||||
-6
@@ -3072,12 +3072,6 @@ public class JvmRuntimeDescriptorLoaderTestGenerated extends AbstractJvmRuntimeD
|
|||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/typealias/Generic.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/typealias/Generic.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("Nested.kt")
|
|
||||||
public void testNested() throws Exception {
|
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/typealias/Nested.kt");
|
|
||||||
doTest(fileName);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/loadJava/compiledKotlin/visibility")
|
@TestMetadata("compiler/testData/loadJava/compiledKotlin/visibility")
|
||||||
|
|||||||
@@ -260,12 +260,12 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
|||||||
|
|
||||||
val toBeShortened: Boolean
|
val toBeShortened: Boolean
|
||||||
when (result) {
|
when (result) {
|
||||||
is ShortenNow -> {
|
is AnalyzeQualifiedElementResult.ShortenNow -> {
|
||||||
elementsToShorten.add(element)
|
elementsToShorten.add(element)
|
||||||
toBeShortened = true
|
toBeShortened = true
|
||||||
}
|
}
|
||||||
|
|
||||||
is ImportDescriptors -> {
|
is AnalyzeQualifiedElementResult.ImportDescriptors -> {
|
||||||
val tryImport = result.descriptors.isNotEmpty()
|
val tryImport = result.descriptors.isNotEmpty()
|
||||||
&& result.descriptors.none { it in failedToImportDescriptors }
|
&& result.descriptors.none { it in failedToImportDescriptors }
|
||||||
&& result.descriptors.all { mayImport(it, file) }
|
&& result.descriptors.all { mayImport(it, file) }
|
||||||
@@ -278,7 +278,7 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
is Skip -> {
|
is AnalyzeQualifiedElementResult.Skip -> {
|
||||||
toBeShortened = false
|
toBeShortened = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -305,10 +305,6 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
|||||||
class ImportDescriptors(val descriptors: Collection<DeclarationDescriptor>) : AnalyzeQualifiedElementResult()
|
class ImportDescriptors(val descriptors: Collection<DeclarationDescriptor>) : AnalyzeQualifiedElementResult()
|
||||||
}
|
}
|
||||||
|
|
||||||
typealias Skip = AnalyzeQualifiedElementResult.Skip
|
|
||||||
typealias ShortenNow = AnalyzeQualifiedElementResult.ShortenNow
|
|
||||||
typealias ImportDescriptors = AnalyzeQualifiedElementResult.ImportDescriptors
|
|
||||||
|
|
||||||
protected abstract fun shortenElement(element: TElement): KtElement
|
protected abstract fun shortenElement(element: TElement): KtElement
|
||||||
|
|
||||||
fun shortenElements(elementSetToUpdate: MutableSet<KtElement>) {
|
fun shortenElements(elementSetToUpdate: MutableSet<KtElement>) {
|
||||||
@@ -357,10 +353,10 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun analyzeQualifiedElement(element: KtUserType, bindingContext: BindingContext): AnalyzeQualifiedElementResult {
|
override fun analyzeQualifiedElement(element: KtUserType, bindingContext: BindingContext): AnalyzeQualifiedElementResult {
|
||||||
if (element.qualifier == null) return Skip
|
if (element.qualifier == null) return AnalyzeQualifiedElementResult.Skip
|
||||||
val referenceExpression = element.referenceExpression ?: return Skip
|
val referenceExpression = element.referenceExpression ?: return AnalyzeQualifiedElementResult.Skip
|
||||||
|
|
||||||
val target = referenceExpression.targets(bindingContext).singleOrNull() ?: return Skip
|
val target = referenceExpression.targets(bindingContext).singleOrNull() ?: return AnalyzeQualifiedElementResult.Skip
|
||||||
|
|
||||||
val scope = element.getResolutionScope(bindingContext, resolutionFacade)
|
val scope = element.getResolutionScope(bindingContext, resolutionFacade)
|
||||||
val name = target.name
|
val name = target.name
|
||||||
@@ -370,7 +366,7 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
|||||||
scope.findPackage(name)
|
scope.findPackage(name)
|
||||||
|
|
||||||
val canShortenNow = targetByName?.asString() == target.asString()
|
val canShortenNow = targetByName?.asString() == target.asString()
|
||||||
return if (canShortenNow) ShortenNow else ImportDescriptors(target.singletonOrEmptyList())
|
return if (canShortenNow) AnalyzeQualifiedElementResult.ShortenNow else AnalyzeQualifiedElementResult.ImportDescriptors(target.singletonOrEmptyList())
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun shortenElement(element: KtUserType): KtElement {
|
override fun shortenElement(element: KtUserType): KtElement {
|
||||||
@@ -421,17 +417,17 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
|||||||
|
|
||||||
override fun analyzeQualifiedElement(element: KtDotQualifiedExpression, bindingContext: BindingContext): AnalyzeQualifiedElementResult {
|
override fun analyzeQualifiedElement(element: KtDotQualifiedExpression, bindingContext: BindingContext): AnalyzeQualifiedElementResult {
|
||||||
val receiver = element.receiverExpression
|
val receiver = element.receiverExpression
|
||||||
if (receiver !is KtThisExpression && bindingContext[BindingContext.QUALIFIER, receiver] == null) return Skip
|
if (receiver !is KtThisExpression && bindingContext[BindingContext.QUALIFIER, receiver] == null) return AnalyzeQualifiedElementResult.Skip
|
||||||
|
|
||||||
if (PsiTreeUtil.getParentOfType(
|
if (PsiTreeUtil.getParentOfType(
|
||||||
element,
|
element,
|
||||||
KtImportDirective::class.java, KtPackageDirective::class.java) != null) return Skip
|
KtImportDirective::class.java, KtPackageDirective::class.java) != null) return AnalyzeQualifiedElementResult.Skip
|
||||||
|
|
||||||
val selector = element.selectorExpression ?: return Skip
|
val selector = element.selectorExpression ?: return AnalyzeQualifiedElementResult.Skip
|
||||||
val callee = selector.getCalleeExpressionIfAny() as? KtReferenceExpression ?: return Skip
|
val callee = selector.getCalleeExpressionIfAny() as? KtReferenceExpression ?: return AnalyzeQualifiedElementResult.Skip
|
||||||
val targets = callee.targets(bindingContext)
|
val targets = callee.targets(bindingContext)
|
||||||
val varAsFunResolvedCall = callee.getResolvedCall(bindingContext) as? VariableAsFunctionResolvedCall
|
val varAsFunResolvedCall = callee.getResolvedCall(bindingContext) as? VariableAsFunctionResolvedCall
|
||||||
if (targets.isEmpty()) return Skip
|
if (targets.isEmpty()) return AnalyzeQualifiedElementResult.Skip
|
||||||
|
|
||||||
val (newContext, selectorCopy) = copyAndAnalyzeSelector(element, bindingContext)
|
val (newContext, selectorCopy) = copyAndAnalyzeSelector(element, bindingContext)
|
||||||
val newCallee = selectorCopy.getCalleeExpressionIfAny() as KtReferenceExpression
|
val newCallee = selectorCopy.getCalleeExpressionIfAny() as KtReferenceExpression
|
||||||
@@ -441,27 +437,27 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
|||||||
&& (varAsFunResolvedCall == null || resolvedCallsMatch(varAsFunResolvedCall, varAsFunResolvedCallWhenShort))
|
&& (varAsFunResolvedCall == null || resolvedCallsMatch(varAsFunResolvedCall, varAsFunResolvedCallWhenShort))
|
||||||
|
|
||||||
if (receiver is KtThisExpression) {
|
if (receiver is KtThisExpression) {
|
||||||
if (!targetsMatch) return Skip
|
if (!targetsMatch) return AnalyzeQualifiedElementResult.Skip
|
||||||
val originalCall = selector.getResolvedCall(bindingContext) ?: return Skip
|
val originalCall = selector.getResolvedCall(bindingContext) ?: return AnalyzeQualifiedElementResult.Skip
|
||||||
val newCall = selectorCopy.getResolvedCall(newContext) ?: return Skip
|
val newCall = selectorCopy.getResolvedCall(newContext) ?: return AnalyzeQualifiedElementResult.Skip
|
||||||
val receiverKind = originalCall.explicitReceiverKind
|
val receiverKind = originalCall.explicitReceiverKind
|
||||||
val newReceiver = when (receiverKind) {
|
val newReceiver = when (receiverKind) {
|
||||||
ExplicitReceiverKind.BOTH_RECEIVERS, ExplicitReceiverKind.EXTENSION_RECEIVER -> newCall.extensionReceiver
|
ExplicitReceiverKind.BOTH_RECEIVERS, ExplicitReceiverKind.EXTENSION_RECEIVER -> newCall.extensionReceiver
|
||||||
ExplicitReceiverKind.DISPATCH_RECEIVER -> newCall.dispatchReceiver
|
ExplicitReceiverKind.DISPATCH_RECEIVER -> newCall.dispatchReceiver
|
||||||
else -> return Skip
|
else -> return AnalyzeQualifiedElementResult.Skip
|
||||||
} as? ImplicitReceiver ?: return Skip
|
} as? ImplicitReceiver ?: return AnalyzeQualifiedElementResult.Skip
|
||||||
|
|
||||||
val thisTarget = receiver.instanceReference.targets(bindingContext).singleOrNull()
|
val thisTarget = receiver.instanceReference.targets(bindingContext).singleOrNull()
|
||||||
if (newReceiver.declarationDescriptor.asString() != thisTarget?.asString()) return Skip
|
if (newReceiver.declarationDescriptor.asString() != thisTarget?.asString()) return AnalyzeQualifiedElementResult.Skip
|
||||||
}
|
}
|
||||||
|
|
||||||
return when {
|
return when {
|
||||||
targetsMatch -> ShortenNow
|
targetsMatch -> AnalyzeQualifiedElementResult.ShortenNow
|
||||||
|
|
||||||
// it makes no sense to insert import when there is a conflict with function, property etc
|
// it makes no sense to insert import when there is a conflict with function, property etc
|
||||||
targetsWhenShort.any { it !is ClassDescriptor && it !is PackageViewDescriptor } -> Skip
|
targetsWhenShort.any { it !is ClassDescriptor && it !is PackageViewDescriptor } -> AnalyzeQualifiedElementResult.Skip
|
||||||
|
|
||||||
else -> ImportDescriptors(targets)
|
else -> AnalyzeQualifiedElementResult.ImportDescriptors(targets)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -519,10 +515,10 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun analyzeQualifiedElement(element: KtThisExpression, bindingContext: BindingContext): AnalyzeQualifiedElementResult {
|
override fun analyzeQualifiedElement(element: KtThisExpression, bindingContext: BindingContext): AnalyzeQualifiedElementResult {
|
||||||
val targetBefore = element.instanceReference.targets(bindingContext).singleOrNull() ?: return Skip
|
val targetBefore = element.instanceReference.targets(bindingContext).singleOrNull() ?: return AnalyzeQualifiedElementResult.Skip
|
||||||
val newContext = simpleThis.analyzeAsReplacement(element, bindingContext, resolutionFacade)
|
val newContext = simpleThis.analyzeAsReplacement(element, bindingContext, resolutionFacade)
|
||||||
val targetAfter = simpleThis.instanceReference.targets(newContext).singleOrNull()
|
val targetAfter = simpleThis.instanceReference.targets(newContext).singleOrNull()
|
||||||
return if (targetBefore == targetAfter) ShortenNow else Skip
|
return if (targetBefore == targetAfter) AnalyzeQualifiedElementResult.ShortenNow else AnalyzeQualifiedElementResult.Skip
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun shortenElement(element: KtThisExpression): KtElement {
|
override fun shortenElement(element: KtThisExpression): KtElement {
|
||||||
@@ -545,27 +541,27 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
|||||||
|
|
||||||
if (PsiTreeUtil.getParentOfType(
|
if (PsiTreeUtil.getParentOfType(
|
||||||
element,
|
element,
|
||||||
KtImportDirective::class.java, KtPackageDirective::class.java) != null) return Skip
|
KtImportDirective::class.java, KtPackageDirective::class.java) != null) return AnalyzeQualifiedElementResult.Skip
|
||||||
|
|
||||||
val receiverTarget = receiver.singleTarget(bindingContext) as? ClassDescriptor ?: return Skip
|
val receiverTarget = receiver.singleTarget(bindingContext) as? ClassDescriptor ?: return AnalyzeQualifiedElementResult.Skip
|
||||||
|
|
||||||
val selectorExpression = element.selectorExpression ?: return Skip
|
val selectorExpression = element.selectorExpression ?: return AnalyzeQualifiedElementResult.Skip
|
||||||
val selectorTarget = selectorExpression.singleTarget(bindingContext) ?: return Skip
|
val selectorTarget = selectorExpression.singleTarget(bindingContext) ?: return AnalyzeQualifiedElementResult.Skip
|
||||||
|
|
||||||
if (receiverTarget.companionObjectDescriptor != selectorTarget) return Skip
|
if (receiverTarget.companionObjectDescriptor != selectorTarget) return AnalyzeQualifiedElementResult.Skip
|
||||||
|
|
||||||
val selectorsSelector = (element.parent as? KtDotQualifiedExpression)?.selectorExpression
|
val selectorsSelector = (element.parent as? KtDotQualifiedExpression)?.selectorExpression
|
||||||
?: return ShortenNow
|
?: return AnalyzeQualifiedElementResult.ShortenNow
|
||||||
|
|
||||||
val selectorsSelectorTarget = selectorsSelector.singleTarget(bindingContext) ?: return Skip
|
val selectorsSelectorTarget = selectorsSelector.singleTarget(bindingContext) ?: return AnalyzeQualifiedElementResult.Skip
|
||||||
if (selectorsSelectorTarget is ClassDescriptor) return Skip
|
if (selectorsSelectorTarget is ClassDescriptor) return AnalyzeQualifiedElementResult.Skip
|
||||||
// TODO: More generic solution may be possible
|
// TODO: More generic solution may be possible
|
||||||
if (selectorsSelectorTarget is PropertyDescriptor) {
|
if (selectorsSelectorTarget is PropertyDescriptor) {
|
||||||
val source = selectorsSelectorTarget.source.getPsi() as? KtProperty
|
val source = selectorsSelectorTarget.source.getPsi() as? KtProperty
|
||||||
if (source != null && isEnumCompanionPropertyWithEntryConflict(source, source.name ?: "")) return Skip
|
if (source != null && isEnumCompanionPropertyWithEntryConflict(source, source.name ?: "")) return AnalyzeQualifiedElementResult.Skip
|
||||||
}
|
}
|
||||||
|
|
||||||
return ShortenNow
|
return AnalyzeQualifiedElementResult.ShortenNow
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun shortenElement(element: KtDotQualifiedExpression): KtElement {
|
override fun shortenElement(element: KtDotQualifiedExpression): KtElement {
|
||||||
|
|||||||
@@ -3070,12 +3070,6 @@ public class ResolveByStubTestGenerated extends AbstractResolveByStubTest {
|
|||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/typealias/Generic.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/typealias/Generic.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("Nested.kt")
|
|
||||||
public void testNested() throws Exception {
|
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/typealias/Nested.kt");
|
|
||||||
doTest(fileName);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/loadJava/compiledKotlin/visibility")
|
@TestMetadata("compiler/testData/loadJava/compiledKotlin/visibility")
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ package a
|
|||||||
class Outer {
|
class Outer {
|
||||||
inner class B(x: String)
|
inner class B(x: String)
|
||||||
|
|
||||||
|
@Suppress("TOPLEVEL_TYPEALIASES_ONLY")
|
||||||
typealias A1 = B
|
typealias A1 = B
|
||||||
|
@Suppress("TOPLEVEL_TYPEALIASES_ONLY")
|
||||||
private typealias A2 = B
|
private typealias A2 = B
|
||||||
|
|
||||||
fun A1(x: Any) = x
|
fun A1(x: Any) = x
|
||||||
|
|||||||
@@ -3,7 +3,10 @@ package a
|
|||||||
class Outer {
|
class Outer {
|
||||||
inner class B(x: String)
|
inner class B(x: String)
|
||||||
|
|
||||||
|
@Suppress("TOPLEVEL_TYPEALIASES_ONLY")
|
||||||
typealias A1 = B
|
typealias A1 = B
|
||||||
|
|
||||||
|
@Suppress("TOPLEVEL_TYPEALIASES_ONLY")
|
||||||
private typealias A2 = B
|
private typealias A2 = B
|
||||||
|
|
||||||
fun A1(x: Any) = x
|
fun A1(x: Any) = x
|
||||||
|
|||||||
@@ -21098,12 +21098,6 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("localTypeAlias.kt")
|
|
||||||
public void testLocalTypeAlias() throws Exception {
|
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/localTypeAlias.kt");
|
|
||||||
doTest(fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestMetadata("simple.kt")
|
@TestMetadata("simple.kt")
|
||||||
public void testSimple() throws Exception {
|
public void testSimple() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/simple.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/simple.kt");
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ object O {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class C {
|
class C {
|
||||||
|
@Suppress("TOPLEVEL_TYPEALIASES_ONLY")
|
||||||
typealias B = O
|
typealias B = O
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user