FIR type enhancement: fold flexible types when it's possible

Related to KT-29937
This commit is contained in:
Mikhail Glukhikh
2019-03-06 18:01:42 +03:00
parent 3d29b31177
commit be412baf9f
25 changed files with 113 additions and 101 deletions
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.service
import org.jetbrains.kotlin.fir.symbols.ConeClassifierSymbol
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.typeContext
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
@@ -33,6 +34,7 @@ import org.jetbrains.kotlin.load.java.structure.*
import org.jetbrains.kotlin.load.java.typeEnhancement.*
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.types.AbstractStrictEqualityTypeChecker
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
@@ -65,7 +67,7 @@ private fun JavaType?.enhancePossiblyFlexible(
FirResolvedTypeRefImpl(
session, psi = null,
type = ConeFlexibleType(lowerResult, upperResult),
type = coneFlexibleOrSimpleType(session, lowerResult, upperResult),
isMarkedNullable = false, annotations = annotations
)
}
@@ -81,6 +83,17 @@ private fun JavaType?.subtreeSize(): Int {
return 1 + typeArguments.sumBy { it?.subtreeSize() ?: 0 }
}
private fun coneFlexibleOrSimpleType(
session: FirSession,
lowerBound: ConeLookupTagBasedType,
upperBound: ConeLookupTagBasedType
): ConeKotlinType {
if (AbstractStrictEqualityTypeChecker.strictEqualTypes(session.typeContext, lowerBound, upperBound)) {
return lowerBound
}
return ConeFlexibleType(lowerBound, upperBound)
}
private val KOTLIN_COLLECTIONS = FqName("kotlin.collections")
private val KOTLIN_COLLECTIONS_PREFIX_LENGTH = KOTLIN_COLLECTIONS.asString().length + 1
@@ -33,15 +33,6 @@ class JavaClassUseSiteScope(
//base symbol as key, overridden as value
private val overriddenByBase = mutableMapOf<ConeFunctionSymbol, ConeFunctionSymbol?>()
@Suppress("UNUSED_PARAMETER")
private fun isSubtypeOf(subType: ConeKotlinType, superType: ConeKotlinType): Boolean {
// TODO: introduce normal sub-typing
return true
}
private fun isSubtypeOf(subType: FirTypeRef, superType: FirTypeRef) =
isSubtypeOf(subType.toNotNullConeKotlinType(), superType.toNotNullConeKotlinType())
@Suppress("UNUSED_PARAMETER")
private fun isEqualTypes(a: ConeKotlinType, b: ConeKotlinType): Boolean {
// TODO: introduce normal type comparison
@@ -73,7 +64,6 @@ class JavaClassUseSiteScope(
val member = (it as FirFunctionSymbol).fir as FirNamedFunction
self.modality != Modality.FINAL
&& sameReceivers(member.receiverTypeRef, self.receiverTypeRef)
&& isSubtypeOf(member.returnTypeRef, self.returnTypeRef)
&& isOverriddenFunCheck(member, self)
} // TODO: two or more overrides for one fun?
overriddenByBase[this] = overriding
@@ -0,0 +1,12 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.fir.types.ConeTypeContext
private class SessionBasedTypeContext(override val session: FirSession) : ConeTypeContext
val FirSession.typeContext: ConeTypeContext get() = SessionBasedTypeContext(this)
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol
import org.jetbrains.kotlin.fir.typeContext
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.ConeTypeContext
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
@@ -35,11 +36,7 @@ class FirClassUseSiteScope(
//base symbol as key
val overrides = mutableMapOf<ConeCallableSymbol, ConeCallableSymbol?>()
val context = object : ConeTypeContext {
override val session: FirSession
get() = session
}
val context: ConeTypeContext = session.typeContext
private fun isEqualTypes(a: ConeKotlinType, b: ConeKotlinType) = AbstractStrictEqualityTypeChecker.strictEqualTypes(context, a, b)
@@ -1,10 +1,10 @@
@R|java/lang/annotation/Documented|() @R|javax/annotation/meta/TypeQualifierNickname|() @R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.NEVER|()) @R|java/lang/annotation/Retention|(R|java/lang/annotation/RetentionPolicy.RUNTIME|()) public abstract annotation class MyNullable : R|java/lang/annotation/Annotation| {
}
public open class NonNullNever : R|java/lang/Object| {
@R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.NEVER|()) public open property field(var): R|ft<kotlin/String?, kotlin/String?>|?
public get(): R|ft<kotlin/String?, kotlin/String?>|?
public set(value: R|ft<kotlin/String?, kotlin/String?>|?): kotlin/Unit
@R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.NEVER|()) public open property field(var): R|kotlin/String|?
public get(): R|kotlin/String|?
public set(value: R|kotlin/String|?): kotlin/Unit
@R|MyNullable|() public open operator function foo(@R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.NEVER|()) x: R|ft<kotlin/String?, kotlin/String?>|?, @R|MyNullable|() y: R|ft<kotlin/CharSequence?, kotlin/CharSequence?>|?): R|ft<kotlin/String?, kotlin/String?>|?
@R|MyNullable|() public open operator function foo(@R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.NEVER|()) x: R|kotlin/String|?, @R|MyNullable|() y: R|kotlin/CharSequence|?): R|kotlin/String|?
}
@@ -1,10 +1,10 @@
public open class Simple : R|java/lang/Object| {
@R|javax/annotation/Nullable|() public open property field(var): R|ft<kotlin/String?, kotlin/String?>|?
public get(): R|ft<kotlin/String?, kotlin/String?>|?
public set(value: R|ft<kotlin/String?, kotlin/String?>|?): kotlin/Unit
@R|javax/annotation/Nullable|() public open property field(var): R|kotlin/String|?
public get(): R|kotlin/String|?
public set(value: R|kotlin/String|?): kotlin/Unit
@R|javax/annotation/Nullable|() public open operator function foo(@R|javax/annotation/Nonnull|() x: R|ft<kotlin/String, kotlin/String>|, @R|javax/annotation/CheckForNull|() y: R|ft<kotlin/CharSequence?, kotlin/CharSequence?>|?): R|ft<kotlin/String?, kotlin/String?>|?
@R|javax/annotation/Nullable|() public open operator function foo(@R|javax/annotation/Nonnull|() x: R|kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence|?): R|kotlin/String|?
@R|javax/annotation/Nonnull|() public open operator function bar(): R|ft<kotlin/String, kotlin/String>|
@R|javax/annotation/Nonnull|() public open operator function bar(): R|kotlin/String|
}
@@ -3,8 +3,8 @@ public open class Strange : R|java/lang/Object| {
public get(): R|ft<kotlin/String, kotlin/String?>|!
public set(value: R|ft<kotlin/String, kotlin/String?>|!): kotlin/Unit
@R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.MAYBE|()) public open operator function foo(@R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.ALWAYS|()) x: R|ft<kotlin/String, kotlin/String>|, @R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.NEVER|()) y: R|ft<kotlin/CharSequence?, kotlin/CharSequence?>|?): R|ft<kotlin/String?, kotlin/String?>|?
@R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.MAYBE|()) public open operator function foo(@R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.ALWAYS|()) x: R|kotlin/String|, @R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.NEVER|()) y: R|kotlin/CharSequence|?): R|kotlin/String|?
@R|javax/annotation/Nonnull|() public open operator function bar(): R|ft<kotlin/String, kotlin/String>|
@R|javax/annotation/Nonnull|() public open operator function bar(): R|kotlin/String|
}
@@ -1,15 +1,15 @@
@R|FieldsAreNullable|() public open class A : R|java/lang/Object| {
public open property field(var): R|ft<kotlin/String?, kotlin/String?>|?
public get(): R|ft<kotlin/String?, kotlin/String?>|?
public set(value: R|ft<kotlin/String?, kotlin/String?>|?): kotlin/Unit
public open property field(var): R|kotlin/String|?
public get(): R|kotlin/String|?
public set(value: R|kotlin/String|?): kotlin/Unit
@R|javax/annotation/Nonnull|() public open property nonNullField(var): R|ft<kotlin/String, kotlin/String>|
public get(): R|ft<kotlin/String, kotlin/String>|
public set(value: R|ft<kotlin/String, kotlin/String>|): kotlin/Unit
@R|javax/annotation/Nonnull|() public open property nonNullField(var): R|kotlin/String|
public get(): R|kotlin/String|
public set(value: R|kotlin/String|): kotlin/Unit
public open operator function foo(q: R|ft<kotlin/String, kotlin/String?>|!, @R|javax/annotation/Nonnull|() x: R|ft<kotlin/String, kotlin/String>|, @R|javax/annotation/CheckForNull|() y: R|ft<kotlin/CharSequence?, kotlin/CharSequence?>|?): R|ft<kotlin/String, kotlin/String?>|!
public open operator function foo(q: R|ft<kotlin/String, kotlin/String?>|!, @R|javax/annotation/Nonnull|() x: R|kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence|?): R|ft<kotlin/String, kotlin/String?>|!
@R|javax/annotation/Nonnull|() public open operator function bar(): R|ft<kotlin/String, kotlin/String>|
@R|javax/annotation/Nonnull|() public open operator function bar(): R|kotlin/String|
}
@R|java/lang/annotation/Retention|(R|java/lang/annotation/RetentionPolicy.RUNTIME|()) @R|java/lang/annotation/Documented|() @R|javax/annotation/CheckForNull|() @R|javax/annotation/meta/TypeQualifierDefault|(<implicitArrayOf>(R|java/lang/annotation/ElementType.FIELD|())) public abstract annotation class FieldsAreNullable : R|java/lang/annotation/Annotation| {
@@ -1,7 +1,7 @@
@R|spr/NonNullApi|() public open class A : R|java/lang/Object| {
public open operator function foo(x: R|ft<kotlin/String, kotlin/String>|, @R|spr/Nullable|() y: R|ft<kotlin/CharSequence?, kotlin/CharSequence?>|?): R|ft<kotlin/String, kotlin/String>|
public open operator function foo(x: R|kotlin/String|, @R|spr/Nullable|() y: R|kotlin/CharSequence|?): R|kotlin/String|
@R|spr/ForceFlexibility|() public open operator function bar(x: R|ft<kotlin/String, kotlin/String?>|!, @R|javax/annotation/Nonnull|() y: R|ft<kotlin/CharSequence, kotlin/CharSequence>|): R|ft<kotlin/String, kotlin/String?>|!
@R|spr/ForceFlexibility|() public open operator function bar(x: R|ft<kotlin/String, kotlin/String?>|!, @R|javax/annotation/Nonnull|() y: R|kotlin/CharSequence|): R|ft<kotlin/String, kotlin/String?>|!
}
@R|java/lang/annotation/Retention|(R|java/lang/annotation/RetentionPolicy.RUNTIME|()) @R|java/lang/annotation/Documented|() @R|spr/UnknownNullability|() @R|javax/annotation/meta/TypeQualifierDefault|(<implicitArrayOf>(R|java/lang/annotation/ElementType.METHOD|(), R|java/lang/annotation/ElementType.PARAMETER|())) public abstract annotation class ForceFlexibility : R|java/lang/annotation/Annotation| {
@@ -1,21 +1,21 @@
@R|spr/NonNullApi|() public open class A : R|java/lang/Object|, R|B| {
@R|spr/ForceFlexibility|() public open operator function foo(x: R|ft<kotlin/String, kotlin/String>|): R|kotlin/Unit|
@R|spr/ForceFlexibility|() public open operator function foo(x: R|kotlin/String|): R|kotlin/Unit|
public open operator function bar(@R|spr/ForceFlexibility|() x: R|ft<kotlin/String, kotlin/String>|): R|kotlin/Unit|
public open operator function bar(@R|spr/ForceFlexibility|() x: R|kotlin/String|): R|kotlin/Unit|
public open operator function baz(@R|spr/UnknownNullability|() x: R|ft<kotlin/String, kotlin/String>|): R|kotlin/Unit|
public open operator function baz(@R|spr/UnknownNullability|() x: R|kotlin/String|): R|kotlin/Unit|
public open operator function foobar(@R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.UNKNOWN|()) x: R|ft<kotlin/String, kotlin/String?>|!): R|kotlin/Unit|
}
public abstract interface B : R|java/lang/Object| {
public abstract operator function foo(@R|javax/annotation/Nonnull|() x: R|ft<kotlin/String, kotlin/String>|): R|kotlin/Unit|
public abstract operator function foo(@R|javax/annotation/Nonnull|() x: R|kotlin/String|): R|kotlin/Unit|
public abstract operator function bar(@R|javax/annotation/Nonnull|() x: R|ft<kotlin/String, kotlin/String>|): R|kotlin/Unit|
public abstract operator function bar(@R|javax/annotation/Nonnull|() x: R|kotlin/String|): R|kotlin/Unit|
public abstract operator function baz(@R|javax/annotation/Nonnull|() x: R|ft<kotlin/String, kotlin/String>|): R|kotlin/Unit|
public abstract operator function baz(@R|javax/annotation/Nonnull|() x: R|kotlin/String|): R|kotlin/Unit|
public abstract operator function foobar(@R|javax/annotation/Nonnull|() x: R|ft<kotlin/String, kotlin/String>|): R|kotlin/Unit|
public abstract operator function foobar(@R|javax/annotation/Nonnull|() x: R|kotlin/String|): R|kotlin/Unit|
}
@R|java/lang/annotation/Retention|(R|java/lang/annotation/RetentionPolicy.RUNTIME|()) @R|java/lang/annotation/Documented|() @R|spr/UnknownNullability|() @R|javax/annotation/meta/TypeQualifierDefault|(<implicitArrayOf>(R|java/lang/annotation/ElementType.METHOD|(), R|java/lang/annotation/ElementType.PARAMETER|())) public abstract annotation class ForceFlexibility : R|java/lang/annotation/Annotation| {
@@ -1,51 +1,51 @@
@R|NonNullApi|() public open class A : R|java/lang/Object| {
public open operator function foo1(x: R|ft<kotlin/String, kotlin/String>|): R|ft<kotlin/String, kotlin/String>|
public open operator function foo1(x: R|kotlin/String|): R|kotlin/String|
public open operator function foo2(x: R|ft<kotlin/String, kotlin/String>|): R|ft<kotlin/String, kotlin/String>|
public open operator function foo2(x: R|kotlin/String|): R|kotlin/String|
public open operator function foo3(x: R|ft<kotlin/String, kotlin/String>|): R|ft<kotlin/String, kotlin/String>|
public open operator function foo3(x: R|kotlin/String|): R|kotlin/String|
@R|javax/annotation/Nullable|() public open operator function bar1(@R|javax/annotation/Nullable|() x: R|ft<kotlin/String?, kotlin/String?>|?): R|ft<kotlin/String?, kotlin/String?>|?
@R|javax/annotation/Nullable|() public open operator function bar1(@R|javax/annotation/Nullable|() x: R|kotlin/String|?): R|kotlin/String|?
@R|javax/annotation/Nullable|() public open operator function bar2(@R|javax/annotation/Nullable|() x: R|ft<kotlin/String?, kotlin/String?>|?): R|ft<kotlin/String?, kotlin/String?>|?
@R|javax/annotation/Nullable|() public open operator function bar2(@R|javax/annotation/Nullable|() x: R|kotlin/String|?): R|kotlin/String|?
public open operator function baz(@R|javax/annotation/Nonnull|() x: R|ft<kotlin/String, kotlin/String>|): R|ft<kotlin/String, kotlin/String>|
public open operator function baz(@R|javax/annotation/Nonnull|() x: R|kotlin/String|): R|kotlin/String|
}
@R|NonNullApi|() public abstract interface AInt : R|java/lang/Object| {
public abstract operator function foo1(x: R|ft<kotlin/String, kotlin/String>|): R|ft<kotlin/CharSequence, kotlin/CharSequence>|
public abstract operator function foo1(x: R|kotlin/String|): R|kotlin/CharSequence|
public abstract operator function foo2(x: R|ft<kotlin/String, kotlin/String>|): R|ft<kotlin/CharSequence, kotlin/CharSequence>|
public abstract operator function foo2(x: R|kotlin/String|): R|kotlin/CharSequence|
public abstract operator function foo3(x: R|ft<kotlin/String, kotlin/String>|): R|ft<kotlin/CharSequence, kotlin/CharSequence>|
public abstract operator function foo3(x: R|kotlin/String|): R|kotlin/CharSequence|
@R|javax/annotation/Nullable|() public abstract operator function bar1(@R|javax/annotation/Nullable|() x: R|ft<kotlin/String?, kotlin/String?>|?): R|ft<kotlin/CharSequence?, kotlin/CharSequence?>|?
@R|javax/annotation/Nullable|() public abstract operator function bar1(@R|javax/annotation/Nullable|() x: R|kotlin/String|?): R|kotlin/CharSequence|?
@R|javax/annotation/Nullable|() public abstract operator function bar2(@R|javax/annotation/Nullable|() x: R|ft<kotlin/String?, kotlin/String?>|?): R|ft<kotlin/CharSequence?, kotlin/CharSequence?>|?
@R|javax/annotation/Nullable|() public abstract operator function bar2(@R|javax/annotation/Nullable|() x: R|kotlin/String|?): R|kotlin/CharSequence|?
public abstract operator function baz(@R|javax/annotation/Nonnull|() x: R|ft<kotlin/String, kotlin/String>|): R|ft<kotlin/CharSequence, kotlin/CharSequence>|
public abstract operator function baz(@R|javax/annotation/Nonnull|() x: R|kotlin/String|): R|kotlin/CharSequence|
}
@R|NullableApi|() public open class B : R|A|, R|AInt| {
public open operator function foo1(x: R|ft<kotlin/String, kotlin/String>|): R|ft<kotlin/String, kotlin/String>|
public open operator function foo1(x: R|kotlin/String|): R|kotlin/String|
@R|javax/annotation/Nonnull|() public open operator function foo2(@R|javax/annotation/Nonnull|() x: R|ft<kotlin/String, kotlin/String>|): R|ft<kotlin/String, kotlin/String>|
@R|javax/annotation/Nonnull|() public open operator function foo2(@R|javax/annotation/Nonnull|() x: R|kotlin/String|): R|kotlin/String|
public open operator function bar1(x: R|ft<kotlin/String?, kotlin/String?>|?): R|ft<kotlin/String?, kotlin/String?>|?
public open operator function bar1(x: R|kotlin/String|?): R|kotlin/String|?
public open operator function baz(x: R|ft<kotlin/String, kotlin/String>|): R|ft<kotlin/String, kotlin/String>|
public open operator function baz(x: R|kotlin/String|): R|kotlin/String|
}
@R|NonNullApi|() public open class C : R|A|, R|AInt| {
public open operator function foo1(x: R|ft<kotlin/String, kotlin/String>|): R|ft<kotlin/String, kotlin/String>|
public open operator function foo1(x: R|kotlin/String|): R|kotlin/String|
public open operator function foo2(@R|javax/annotation/Nonnull|() x: R|ft<kotlin/String, kotlin/String>|): R|ft<kotlin/String, kotlin/String>|
public open operator function foo2(@R|javax/annotation/Nonnull|() x: R|kotlin/String|): R|kotlin/String|
public open operator function bar1(x: R|ft<kotlin/String?, kotlin/String?>|?): R|ft<kotlin/String?, kotlin/String?>|?
public open operator function bar1(x: R|kotlin/String|?): R|kotlin/String|?
@R|javax/annotation/Nullable|() public open operator function bar2(@R|javax/annotation/Nullable|() x: R|ft<kotlin/String?, kotlin/String?>|?): R|ft<kotlin/String?, kotlin/String?>|?
@R|javax/annotation/Nullable|() public open operator function bar2(@R|javax/annotation/Nullable|() x: R|kotlin/String|?): R|kotlin/String|?
public open operator function baz(x: R|ft<kotlin/String, kotlin/String>|): R|ft<kotlin/String, kotlin/String>|
public open operator function baz(x: R|kotlin/String|): R|kotlin/String|
}
@R|java/lang/annotation/Target|(R|java/lang/annotation/ElementType.TYPE|()) @R|java/lang/annotation/Retention|(R|java/lang/annotation/RetentionPolicy.RUNTIME|()) @R|java/lang/annotation/Documented|() @R|javax/annotation/Nonnull|() @R|javax/annotation/meta/TypeQualifierDefault|(<implicitArrayOf>(R|java/lang/annotation/ElementType.METHOD|(), R|java/lang/annotation/ElementType.PARAMETER|(), R|java/lang/annotation/ElementType.FIELD|())) public abstract annotation class NonNullApi : R|java/lang/annotation/Annotation| {
@@ -1,13 +1,13 @@
@R|NonNullApi|() public open class A : R|java/lang/Object| {
public open property field(var): R|ft<kotlin/String, kotlin/String>|
public get(): R|ft<kotlin/String, kotlin/String>|
public set(value: R|ft<kotlin/String, kotlin/String>|): kotlin/Unit
public open property field(var): R|kotlin/String|
public get(): R|kotlin/String|
public set(value: R|kotlin/String|): kotlin/Unit
public open operator function foo(x: R|ft<kotlin/String, kotlin/String>|, @R|javax/annotation/CheckForNull|() y: R|ft<kotlin/CharSequence?, kotlin/CharSequence?>|?): R|ft<kotlin/String, kotlin/String>|
public open operator function foo(x: R|kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence|?): R|kotlin/String|
@R|NullableApi|() public open operator function foobar(x: R|ft<kotlin/String?, kotlin/String?>|?, @R|NonNullApi|() y: R|ft<kotlin/CharSequence, kotlin/CharSequence>|): R|ft<kotlin/String?, kotlin/String?>|?
@R|NullableApi|() public open operator function foobar(x: R|kotlin/String|?, @R|NonNullApi|() y: R|kotlin/CharSequence|): R|kotlin/String|?
public open operator function bar(): R|ft<kotlin/String, kotlin/String>|
public open operator function bar(): R|kotlin/String|
@R|javax/annotation/Nullable|() public open operator function baz(): R|ft<kotlin/collections/MutableList<ft<kotlin/String, kotlin/String?>>?, kotlin/collections/List<ft<kotlin/String, kotlin/String?>>?>|?
@@ -1,10 +1,10 @@
@R|javax/annotation/ParametersAreNonnullByDefault|() public open class A : R|java/lang/Object| {
@R|javax/annotation/Nullable|() public open property field(var): R|ft<kotlin/String?, kotlin/String?>|?
public get(): R|ft<kotlin/String?, kotlin/String?>|?
public set(value: R|ft<kotlin/String?, kotlin/String?>|?): kotlin/Unit
@R|javax/annotation/Nullable|() public open property field(var): R|kotlin/String|?
public get(): R|kotlin/String|?
public set(value: R|kotlin/String|?): kotlin/Unit
public open operator function foo(q: R|ft<kotlin/String, kotlin/String>|, @R|javax/annotation/Nonnull|() x: R|ft<kotlin/String, kotlin/String>|, @R|javax/annotation/CheckForNull|() y: R|ft<kotlin/CharSequence?, kotlin/CharSequence?>|?): R|ft<kotlin/String, kotlin/String?>|!
public open operator function foo(q: R|kotlin/String|, @R|javax/annotation/Nonnull|() x: R|kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence|?): R|ft<kotlin/String, kotlin/String?>|!
@R|javax/annotation/Nonnull|() public open operator function bar(): R|ft<kotlin/String, kotlin/String>|
@R|javax/annotation/Nonnull|() public open operator function bar(): R|kotlin/String|
}
@@ -1,20 +1,20 @@
public open class A : R|java/lang/Object| {
@R|javax/annotation/Nullable|() public open property field(var): R|ft<kotlin/String?, kotlin/String?>|?
public get(): R|ft<kotlin/String?, kotlin/String?>|?
public set(value: R|ft<kotlin/String?, kotlin/String?>|?): kotlin/Unit
@R|javax/annotation/Nullable|() public open property field(var): R|kotlin/String|?
public get(): R|kotlin/String|?
public set(value: R|kotlin/String|?): kotlin/Unit
public open operator function foo(q: R|ft<kotlin/String, kotlin/String?>|!, @R|javax/annotation/Nonnull|() x: R|ft<kotlin/String, kotlin/String>|, @R|javax/annotation/CheckForNull|() y: R|ft<kotlin/CharSequence?, kotlin/CharSequence?>|?): R|ft<kotlin/String, kotlin/String?>|!
public open operator function foo(q: R|ft<kotlin/String, kotlin/String?>|!, @R|javax/annotation/Nonnull|() x: R|kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence|?): R|ft<kotlin/String, kotlin/String?>|!
@R|javax/annotation/Nonnull|() public open operator function bar(): R|ft<kotlin/String, kotlin/String>|
@R|javax/annotation/Nonnull|() public open operator function bar(): R|kotlin/String|
}
public open class A2 : R|java/lang/Object| {
@R|javax/annotation/Nullable|() public open property field(var): R|ft<kotlin/String?, kotlin/String?>|?
public get(): R|ft<kotlin/String?, kotlin/String?>|?
public set(value: R|ft<kotlin/String?, kotlin/String?>|?): kotlin/Unit
@R|javax/annotation/Nullable|() public open property field(var): R|kotlin/String|?
public get(): R|kotlin/String|?
public set(value: R|kotlin/String|?): kotlin/Unit
public open operator function foo(q: R|ft<kotlin/String, kotlin/String?>|!, @R|javax/annotation/Nonnull|() x: R|ft<kotlin/String, kotlin/String>|, @R|javax/annotation/CheckForNull|() y: R|ft<kotlin/CharSequence?, kotlin/CharSequence?>|?): R|ft<kotlin/String, kotlin/String?>|!
public open operator function foo(q: R|ft<kotlin/String, kotlin/String?>|!, @R|javax/annotation/Nonnull|() x: R|kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence|?): R|ft<kotlin/String, kotlin/String?>|!
@R|javax/annotation/Nonnull|() public open operator function bar(): R|ft<kotlin/String, kotlin/String>|
@R|javax/annotation/Nonnull|() public open operator function bar(): R|kotlin/String|
}
@@ -3,9 +3,9 @@
public get(): R|ft<kotlin/String, kotlin/String?>|!
public set(value: R|ft<kotlin/String, kotlin/String?>|!): kotlin/Unit
public open operator function foo(x: R|ft<kotlin/String, kotlin/String>|, @R|spr/Nullable|() y: R|ft<kotlin/CharSequence?, kotlin/CharSequence?>|?): R|ft<kotlin/String, kotlin/String>|
public open operator function foo(x: R|kotlin/String|, @R|spr/Nullable|() y: R|kotlin/CharSequence|?): R|kotlin/String|
public open operator function bar(): R|ft<kotlin/String, kotlin/String>|
public open operator function bar(): R|kotlin/String|
@R|spr/Nullable|() public open operator function baz(): R|ft<kotlin/collections/MutableList<ft<kotlin/String, kotlin/String?>>?, kotlin/collections/List<ft<kotlin/String, kotlin/String?>>?>|?
@@ -3,7 +3,7 @@ public open class A : R|java/lang/Object| {
public get(): R|ft<kotlin/String, kotlin/String?>|!
public set(value: R|ft<kotlin/String, kotlin/String?>|!): kotlin/Unit
public open operator function foo(x: R|ft<kotlin/String, kotlin/String?>|!, @R|spr/Nullable|() y: R|ft<kotlin/CharSequence?, kotlin/CharSequence?>|?): R|ft<kotlin/String, kotlin/String?>|!
public open operator function foo(x: R|ft<kotlin/String, kotlin/String?>|!, @R|spr/Nullable|() y: R|kotlin/CharSequence|?): R|ft<kotlin/String, kotlin/String?>|!
public open operator function bar(): R|ft<kotlin/String, kotlin/String?>|!
@@ -1,5 +1,5 @@
public open class ModalityOfFakeOverrides : R|java/util/AbstractList<java/lang/String>| {
@R|java/lang/Override|() @R|org/jetbrains/annotations/NotNull|() public open operator function get(index: R|kotlin/Int|): R|ft<kotlin/String, kotlin/String>|
@R|java/lang/Override|() @R|org/jetbrains/annotations/NotNull|() public open operator function get(index: R|kotlin/Int|): R|kotlin/String|
@R|java/lang/Override|() public open operator function size(): R|kotlin/Int|
@@ -1,6 +1,6 @@
public abstract interface ReadOnlyExtendsWildcard : R|java/lang/Object| {
public abstract operator function bar(): R|kotlin/Unit|
public abstract operator function foo(@R|kotlin/annotations/jvm/ReadOnly|() x: R|ft<kotlin/collections/List<out java/lang/CharSequence>, kotlin/collections/List<out java/lang/CharSequence>?>|!, @R|org/jetbrains/annotations/NotNull|() y: R|ft<kotlin/Comparable<in java/lang/String>, kotlin/Comparable<in java/lang/String>>|): R|kotlin/Unit|
public abstract operator function foo(@R|kotlin/annotations/jvm/ReadOnly|() x: R|ft<kotlin/collections/List<out java/lang/CharSequence>, kotlin/collections/List<out java/lang/CharSequence>?>|!, @R|org/jetbrains/annotations/NotNull|() y: R|kotlin/Comparable<in java/lang/String>|): R|kotlin/Unit|
}
@@ -1,6 +1,6 @@
public open class NotNullField : R|java/lang/Object| {
@R|org/jetbrains/annotations/NotNull|() public open property hi(var): R|ft<kotlin/String, kotlin/String>|
public get(): R|ft<kotlin/String, kotlin/String>|
public set(value: R|ft<kotlin/String, kotlin/String>|): kotlin/Unit
@R|org/jetbrains/annotations/NotNull|() public open property hi(var): R|kotlin/String|
public get(): R|kotlin/String|
public set(value: R|kotlin/String|): kotlin/Unit
}
@@ -1,4 +1,4 @@
public open class NotNullMethod : R|java/lang/Object| {
@R|org/jetbrains/annotations/NotNull|() public open operator function hi(): R|ft<kotlin/String, kotlin/String>|
@R|org/jetbrains/annotations/NotNull|() public open operator function hi(): R|kotlin/String|
}
@@ -1,4 +1,4 @@
public open class NotNullParameter : R|java/lang/Object| {
public open operator function hi(@R|org/jetbrains/annotations/NotNull|() param: R|ft<kotlin/String, kotlin/String>|): R|kotlin/Unit|
public open operator function hi(@R|org/jetbrains/annotations/NotNull|() param: R|kotlin/String|): R|kotlin/Unit|
}
@@ -1,4 +1,4 @@
public open class ConstructorWithAnnotations : R|java/lang/Object| {
public final function ConstructorWithAnnotations(r: R|ft<java/lang/Runnable, java/lang/Runnable?>|!, @R|org/jetbrains/annotations/NotNull|() s: R|ft<kotlin/String, kotlin/String>|): R|test/ConstructorWithAnnotations|
public final function ConstructorWithAnnotations(r: R|ft<java/lang/Runnable, java/lang/Runnable?>|!, @R|org/jetbrains/annotations/NotNull|() s: R|kotlin/String|): R|test/ConstructorWithAnnotations|
}
@@ -1,4 +1,4 @@
public open class Annotated : R|java/lang/Object| {
@R|org/jetbrains/annotations/NotNull|() public open operator function foo(@R|org/jetbrains/annotations/Nullable|() param: R|ft<kotlin/String?, kotlin/String?>|?): R|ft<kotlin/String, kotlin/String>|
@R|org/jetbrains/annotations/NotNull|() public open operator function foo(@R|org/jetbrains/annotations/Nullable|() param: R|kotlin/String|?): R|kotlin/String|
}
@@ -1,8 +1,8 @@
public open class Annotated : R|java/lang/Object| {
@R|org/jetbrains/annotations/NotNull|() public open operator function foo(@R|org/jetbrains/annotations/Nullable|() param: R|ft<kotlin/String?, kotlin/String?>|?): R|ft<kotlin/String, kotlin/String>|
@R|org/jetbrains/annotations/NotNull|() public open operator function foo(@R|org/jetbrains/annotations/Nullable|() param: R|kotlin/String|?): R|kotlin/String|
}
public open class AnnotatedDerived : R|Annotated| {
public open operator function foo(param: R|ft<kotlin/String?, kotlin/String?>|?): R|ft<kotlin/String, kotlin/String>|
public open operator function foo(param: R|kotlin/String|?): R|kotlin/String|
}
@@ -1,4 +1,4 @@
public open class Some : R|java/lang/Object|, R|Strange<*>| {
public open operator function foo(): R|ft<kotlin/Any, kotlin/Any>|
public open operator function foo(): R|kotlin/Any|
}