Implemented KType, KCallable.returnType
This commit is contained in:
+2
@@ -353,6 +353,8 @@ internal class KonanSymbols(context: Context, val symbolTable: SymbolTable, val
|
|||||||
val getObjectTypeInfo = internalFunction("getObjectTypeInfo")
|
val getObjectTypeInfo = internalFunction("getObjectTypeInfo")
|
||||||
val kClassImpl = internalClass("KClassImpl")
|
val kClassImpl = internalClass("KClassImpl")
|
||||||
val kClassImplConstructor by lazy { kClassImpl.constructors.single() }
|
val kClassImplConstructor by lazy { kClassImpl.constructors.single() }
|
||||||
|
val kTypeImpl = internalClass("KTypeImpl")
|
||||||
|
val kTypeImplForGenerics = internalClass("KTypeImplForGenerics")
|
||||||
|
|
||||||
val listOfInternal = internalFunction("listOfInternal")
|
val listOfInternal = internalFunction("listOfInternal")
|
||||||
|
|
||||||
|
|||||||
+6
-9
@@ -43,9 +43,7 @@ import org.jetbrains.kotlin.ir.expressions.*
|
|||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
|
import org.jetbrains.kotlin.ir.symbols.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.types.*
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
@@ -169,18 +167,19 @@ internal class CallableReferenceLowering(val context: Context): FileLoweringPass
|
|||||||
|
|
||||||
private val kFunctionImplSymbol = context.ir.symbols.kFunctionImpl
|
private val kFunctionImplSymbol = context.ir.symbols.kFunctionImpl
|
||||||
|
|
||||||
|
private val kFunctionImplConstructorSymbol = kFunctionImplSymbol.constructors.single()
|
||||||
|
|
||||||
fun build(): BuiltFunctionReference {
|
fun build(): BuiltFunctionReference {
|
||||||
val startOffset = functionReference.startOffset
|
val startOffset = functionReference.startOffset
|
||||||
val endOffset = functionReference.endOffset
|
val endOffset = functionReference.endOffset
|
||||||
|
|
||||||
val returnType = irFunction.returnType
|
val superTypes = mutableListOf(kFunctionImplSymbol.typeWith(irFunction.returnType))
|
||||||
val superTypes = mutableListOf(kFunctionImplSymbol.typeWith(returnType))
|
|
||||||
|
|
||||||
val numberOfParameters = unboundFunctionParameters.size
|
val numberOfParameters = unboundFunctionParameters.size
|
||||||
|
|
||||||
val functionIrClass = context.ir.symbols.kFunctions[numberOfParameters].owner
|
val functionIrClass = context.ir.symbols.kFunctions[numberOfParameters].owner
|
||||||
val functionParameterTypes = unboundFunctionParameters.map { it.type }
|
val functionParameterTypes = unboundFunctionParameters.map { it.type }
|
||||||
val functionClassTypeParameters = functionParameterTypes + returnType
|
val functionClassTypeParameters = functionParameterTypes + irFunction.returnType
|
||||||
superTypes += functionIrClass.symbol.typeWith(functionClassTypeParameters)
|
superTypes += functionIrClass.symbol.typeWith(functionClassTypeParameters)
|
||||||
|
|
||||||
var suspendFunctionIrClass: IrClass? = null
|
var suspendFunctionIrClass: IrClass? = null
|
||||||
@@ -256,8 +255,6 @@ internal class CallableReferenceLowering(val context: Context): FileLoweringPass
|
|||||||
private fun createConstructorBuilder()
|
private fun createConstructorBuilder()
|
||||||
= object : SymbolWithIrBuilder<IrConstructorSymbol, IrConstructor>() {
|
= object : SymbolWithIrBuilder<IrConstructorSymbol, IrConstructor>() {
|
||||||
|
|
||||||
private val kFunctionImplConstructorSymbol = kFunctionImplSymbol.constructors.single()
|
|
||||||
|
|
||||||
override fun buildSymbol() = IrConstructorSymbolImpl(
|
override fun buildSymbol() = IrConstructorSymbolImpl(
|
||||||
ClassConstructorDescriptorImpl.create(
|
ClassConstructorDescriptorImpl.create(
|
||||||
/* containingDeclaration = */ functionReferenceClassDescriptor,
|
/* containingDeclaration = */ functionReferenceClassDescriptor,
|
||||||
@@ -278,7 +275,6 @@ internal class CallableReferenceLowering(val context: Context): FileLoweringPass
|
|||||||
|
|
||||||
override fun buildIr(): IrConstructor {
|
override fun buildIr(): IrConstructor {
|
||||||
|
|
||||||
val symbols = this@CallableReferenceLowering.context.ir.symbols
|
|
||||||
val irBuiltIns = context.irBuiltIns
|
val irBuiltIns = context.irBuiltIns
|
||||||
|
|
||||||
argumentToPropertiesMap = boundFunctionParameters.associate {
|
argumentToPropertiesMap = boundFunctionParameters.associate {
|
||||||
@@ -318,6 +314,7 @@ internal class CallableReferenceLowering(val context: Context): FileLoweringPass
|
|||||||
val needReceiver = boundFunctionParameters.singleOrNull()?.descriptor is ReceiverParameterDescriptor
|
val needReceiver = boundFunctionParameters.singleOrNull()?.descriptor is ReceiverParameterDescriptor
|
||||||
val receiver = if (needReceiver) irGet(valueParameters.single()) else irNull()
|
val receiver = if (needReceiver) irGet(valueParameters.single()) else irNull()
|
||||||
putValueArgument(3, receiver)
|
putValueArgument(3, receiver)
|
||||||
|
putValueArgument(4, irKType(this@CallableReferenceLowering.context, irFunction.returnType))
|
||||||
}
|
}
|
||||||
+IrInstanceInitializerCallImpl(startOffset, endOffset, functionReferenceClass.symbol, irBuiltIns.unitType)
|
+IrInstanceInitializerCallImpl(startOffset, endOffset, functionReferenceClass.symbol, irBuiltIns.unitType)
|
||||||
// Save all arguments to fields.
|
// Save all arguments to fields.
|
||||||
|
|||||||
+30
-2
@@ -36,7 +36,10 @@ import org.jetbrains.kotlin.ir.expressions.IrExpression
|
|||||||
import org.jetbrains.kotlin.ir.expressions.IrLocalDelegatedPropertyReference
|
import org.jetbrains.kotlin.ir.expressions.IrLocalDelegatedPropertyReference
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrPropertyReference
|
import org.jetbrains.kotlin.ir.expressions.IrPropertyReference
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
import org.jetbrains.kotlin.ir.types.toKotlinType
|
import org.jetbrains.kotlin.ir.types.toKotlinType
|
||||||
import org.jetbrains.kotlin.ir.types.typeWith
|
import org.jetbrains.kotlin.ir.types.typeWith
|
||||||
@@ -271,10 +274,11 @@ internal class PropertyDelegationLowering(val context: KonanBackendContext) : Fi
|
|||||||
isMutable = setterCallableReference != null)
|
isMutable = setterCallableReference != null)
|
||||||
val initializer = irCall(symbol.owner, constructorTypeArguments).apply {
|
val initializer = irCall(symbol.owner, constructorTypeArguments).apply {
|
||||||
putValueArgument(0, irString(propertyDescriptor.name.asString()))
|
putValueArgument(0, irString(propertyDescriptor.name.asString()))
|
||||||
|
putValueArgument(1, irKType(this@PropertyDelegationLowering.context, returnType))
|
||||||
if (getterCallableReference != null)
|
if (getterCallableReference != null)
|
||||||
putValueArgument(1, getterCallableReference)
|
putValueArgument(2, getterCallableReference)
|
||||||
if (setterCallableReference != null)
|
if (setterCallableReference != null)
|
||||||
putValueArgument(2, setterCallableReference)
|
putValueArgument(3, setterCallableReference)
|
||||||
}
|
}
|
||||||
+initializer
|
+initializer
|
||||||
}
|
}
|
||||||
@@ -291,6 +295,7 @@ internal class PropertyDelegationLowering(val context: KonanBackendContext) : Fi
|
|||||||
isMutable = false)
|
isMutable = false)
|
||||||
val initializer = irCall(symbol.owner, constructorTypeArguments).apply {
|
val initializer = irCall(symbol.owner, constructorTypeArguments).apply {
|
||||||
putValueArgument(0, irString(propertyDescriptor.name.asString()))
|
putValueArgument(0, irString(propertyDescriptor.name.asString()))
|
||||||
|
putValueArgument(1, irKType(this@PropertyDelegationLowering.context, propertyType))
|
||||||
}
|
}
|
||||||
return initializer
|
return initializer
|
||||||
}
|
}
|
||||||
@@ -323,3 +328,26 @@ internal class PropertyDelegationLowering(val context: KonanBackendContext) : Fi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal fun IrBuilderWithScope.irKType(context: KonanBackendContext, type: IrType): IrExpression {
|
||||||
|
val kTypeImplSymbol = context.ir.symbols.kTypeImpl
|
||||||
|
val kTypeImplForGenericsSymbol = context.ir.symbols.kTypeImplForGenerics
|
||||||
|
|
||||||
|
val kClassImplConstructorSymbol = context.ir.symbols.kClassImplConstructor
|
||||||
|
val kTypeImplConstructorSymbol = kTypeImplSymbol.constructors.single()
|
||||||
|
val kTypeImplForGenericsConstructorSymbol = kTypeImplForGenericsSymbol.constructors.single()
|
||||||
|
|
||||||
|
val getClassTypeInfoSymbol = context.ir.symbols.getClassTypeInfo
|
||||||
|
|
||||||
|
return if (type.classifierOrNull !is IrClassSymbol) {
|
||||||
|
// IrTypeParameterSymbol
|
||||||
|
irCall(kTypeImplForGenericsConstructorSymbol)
|
||||||
|
} else {
|
||||||
|
val returnKClass = irCall(kClassImplConstructorSymbol).apply {
|
||||||
|
putValueArgument(0, irCall(getClassTypeInfoSymbol, listOf(type)))
|
||||||
|
}
|
||||||
|
irCall(kTypeImplConstructorSymbol).apply {
|
||||||
|
putValueArgument(0, returnKClass)
|
||||||
|
putValueArgument(1, irBoolean(type.isMarkedNullable()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -47,6 +47,10 @@ internal class KClassImpl<T : Any>(private val typeInfo: NativePtr) : KClass<T>
|
|||||||
other is KClassImpl<*> && this.typeInfo == other.typeInfo
|
other is KClassImpl<*> && this.typeInfo == other.typeInfo
|
||||||
|
|
||||||
override fun hashCode(): Int = typeInfo.hashCode()
|
override fun hashCode(): Int = typeInfo.hashCode()
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return "class " + (qualifiedName ?: simpleName ?: "<anonymous>")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ExportForCompiler
|
@ExportForCompiler
|
||||||
|
|||||||
@@ -17,9 +17,11 @@
|
|||||||
package kotlin.native.internal
|
package kotlin.native.internal
|
||||||
|
|
||||||
import kotlin.reflect.KFunction
|
import kotlin.reflect.KFunction
|
||||||
|
import kotlin.reflect.KType
|
||||||
|
|
||||||
@FixmeReflection
|
@FixmeReflection
|
||||||
open class KFunctionImpl<out R>(override val name: String, val fqName: String, val bound: Boolean, val receiver: Any?): KFunction<R> {
|
open class KFunctionImpl<out R>(override val name: String, val fqName: String, val bound: Boolean, val receiver: Any?,
|
||||||
|
override val returnType: KType): KFunction<R> {
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
if (other !is KFunctionImpl<*>) return false
|
if (other !is KFunctionImpl<*>) return false
|
||||||
return fqName == other.fqName && bound == other.bound && receiver == other.receiver
|
return fqName == other.fqName && bound == other.bound && receiver == other.receiver
|
||||||
|
|||||||
@@ -16,16 +16,11 @@
|
|||||||
|
|
||||||
package kotlin.native.internal
|
package kotlin.native.internal
|
||||||
|
|
||||||
import kotlin.reflect.KProperty0
|
|
||||||
import kotlin.reflect.KProperty1
|
|
||||||
import kotlin.reflect.KProperty2
|
|
||||||
import kotlin.reflect.KMutableProperty0
|
|
||||||
import kotlin.reflect.KMutableProperty1
|
|
||||||
import kotlin.reflect.KMutableProperty2
|
|
||||||
import kotlin.UnsupportedOperationException
|
import kotlin.UnsupportedOperationException
|
||||||
|
import kotlin.reflect.*
|
||||||
|
|
||||||
@FixmeReflection
|
@FixmeReflection
|
||||||
open class KProperty0Impl<out R>(override val name: String, val getter: () -> R): KProperty0<R> {
|
open class KProperty0Impl<out R>(override val name: String, override val returnType: KType, val getter: () -> R): KProperty0<R> {
|
||||||
override fun get(): R {
|
override fun get(): R {
|
||||||
return getter()
|
return getter()
|
||||||
}
|
}
|
||||||
@@ -49,7 +44,7 @@ open class KProperty0Impl<out R>(override val name: String, val getter: () -> R)
|
|||||||
}
|
}
|
||||||
|
|
||||||
@FixmeReflection
|
@FixmeReflection
|
||||||
open class KProperty1Impl<T, out R>(override val name: String, val getter: (T) -> R): KProperty1<T, R> {
|
open class KProperty1Impl<T, out R>(override val name: String, override val returnType: KType, val getter: (T) -> R): KProperty1<T, R> {
|
||||||
override fun get(p1: T): R {
|
override fun get(p1: T): R {
|
||||||
return getter(p1)
|
return getter(p1)
|
||||||
}
|
}
|
||||||
@@ -73,7 +68,7 @@ open class KProperty1Impl<T, out R>(override val name: String, val getter: (T) -
|
|||||||
}
|
}
|
||||||
|
|
||||||
@FixmeReflection
|
@FixmeReflection
|
||||||
open class KProperty2Impl<T1, T2, out R>(override val name: String, val getter: (T1, T2) -> R): KProperty2<T1, T2, R> {
|
open class KProperty2Impl<T1, T2, out R>(override val name: String, override val returnType: KType, val getter: (T1, T2) -> R): KProperty2<T1, T2, R> {
|
||||||
override fun get(p1: T1, p2: T2): R {
|
override fun get(p1: T1, p2: T2): R {
|
||||||
return getter(p1, p2)
|
return getter(p1, p2)
|
||||||
}
|
}
|
||||||
@@ -97,8 +92,8 @@ open class KProperty2Impl<T1, T2, out R>(override val name: String, val getter:
|
|||||||
}
|
}
|
||||||
|
|
||||||
@FixmeReflection
|
@FixmeReflection
|
||||||
class KMutableProperty0Impl<R>(name: String, getter: () -> R, val setter: (R) -> Unit)
|
class KMutableProperty0Impl<R>(name: String, returnType: KType, getter: () -> R, val setter: (R) -> Unit)
|
||||||
: KProperty0Impl<R>(name, getter), KMutableProperty0<R> {
|
: KProperty0Impl<R>(name, returnType, getter), KMutableProperty0<R> {
|
||||||
override fun set(value: R): Unit {
|
override fun set(value: R): Unit {
|
||||||
setter(value)
|
setter(value)
|
||||||
}
|
}
|
||||||
@@ -119,8 +114,8 @@ class KMutableProperty0Impl<R>(name: String, getter: () -> R, val setter: (R) ->
|
|||||||
}
|
}
|
||||||
|
|
||||||
@FixmeReflection
|
@FixmeReflection
|
||||||
class KMutableProperty1Impl<T, R>(name: String, getter: (T) -> R, val setter: (T, R) -> Unit)
|
class KMutableProperty1Impl<T, R>(name: String, returnType: KType, getter: (T) -> R, val setter: (T, R) -> Unit)
|
||||||
: KProperty1Impl<T, R>(name, getter), KMutableProperty1<T, R> {
|
: KProperty1Impl<T, R>(name, returnType, getter), KMutableProperty1<T, R> {
|
||||||
override fun set(receiver: T, value: R): Unit {
|
override fun set(receiver: T, value: R): Unit {
|
||||||
setter(receiver, value)
|
setter(receiver, value)
|
||||||
}
|
}
|
||||||
@@ -141,8 +136,8 @@ class KMutableProperty1Impl<T, R>(name: String, getter: (T) -> R, val setter: (T
|
|||||||
}
|
}
|
||||||
|
|
||||||
@FixmeReflection
|
@FixmeReflection
|
||||||
class KMutableProperty2Impl<T1, T2, R>(name: String, getter: (T1, T2) -> R, val setter: (T1, T2, R) -> Unit)
|
class KMutableProperty2Impl<T1, T2, R>(name: String, returnType: KType, getter: (T1, T2) -> R, val setter: (T1, T2, R) -> Unit)
|
||||||
: KProperty2Impl<T1, T2, R>(name, getter), KMutableProperty2<T1, T2, R> {
|
: KProperty2Impl<T1, T2, R>(name, returnType, getter), KMutableProperty2<T1, T2, R> {
|
||||||
override fun set(receiver1: T1, receiver2: T2, value: R): Unit {
|
override fun set(receiver1: T1, receiver2: T2, value: R): Unit {
|
||||||
setter(receiver1, receiver2, value)
|
setter(receiver1, receiver2, value)
|
||||||
}
|
}
|
||||||
@@ -162,7 +157,7 @@ class KMutableProperty2Impl<T1, T2, R>(name: String, getter: (T1, T2) -> R, val
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open class KLocalDelegatedPropertyImpl<out R>(override val name: String): KProperty0<R> {
|
open class KLocalDelegatedPropertyImpl<out R>(override val name: String, override val returnType: KType): KProperty0<R> {
|
||||||
override fun get(): R {
|
override fun get(): R {
|
||||||
throw UnsupportedOperationException("Not supported for local property reference.")
|
throw UnsupportedOperationException("Not supported for local property reference.")
|
||||||
}
|
}
|
||||||
@@ -175,7 +170,7 @@ open class KLocalDelegatedPropertyImpl<out R>(override val name: String): KPrope
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class KLocalDelegatedMutablePropertyImpl<R>(name: String): KLocalDelegatedPropertyImpl<R>(name), KMutableProperty0<R> {
|
class KLocalDelegatedMutablePropertyImpl<R>(name: String, returnType: KType): KLocalDelegatedPropertyImpl<R>(name, returnType), KMutableProperty0<R> {
|
||||||
override fun set(value: R): Unit {
|
override fun set(value: R): Unit {
|
||||||
throw UnsupportedOperationException("Not supported for local property reference.")
|
throw UnsupportedOperationException("Not supported for local property reference.")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 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 kotlin.native.internal
|
||||||
|
|
||||||
|
import kotlin.reflect.KClassifier
|
||||||
|
import kotlin.reflect.KType
|
||||||
|
|
||||||
|
internal class KTypeImpl(override val classifier: KClassifier?, override val isMarkedNullable: Boolean) : KType {
|
||||||
|
override fun equals(other: Any?) =
|
||||||
|
other is KTypeImpl && classifier == other.classifier && isMarkedNullable == other.isMarkedNullable
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
return (classifier?.hashCode() ?: 0) * 31 + if (isMarkedNullable) 1 else 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class KTypeImplForGenerics : KType {
|
||||||
|
override val classifier: KClassifier?
|
||||||
|
get() = error("Generic types are not yet supported in reflection")
|
||||||
|
|
||||||
|
override val isMarkedNullable: Boolean
|
||||||
|
get() = error("Generic types are not yet supported in reflection")
|
||||||
|
|
||||||
|
override fun equals(other: Any?) =
|
||||||
|
error("Generic types are not yet supported in reflection")
|
||||||
|
|
||||||
|
override fun hashCode(): Int =
|
||||||
|
error("Generic types are not yet supported in reflection")
|
||||||
|
}
|
||||||
@@ -39,12 +39,12 @@ public interface KCallable<out R> : KAnnotatedElement {
|
|||||||
// * they come first in the list in that order.
|
// * they come first in the list in that order.
|
||||||
// */
|
// */
|
||||||
// public val parameters: List<KParameter>
|
// public val parameters: List<KParameter>
|
||||||
//
|
|
||||||
// /**
|
/**
|
||||||
// * The type of values returned by this callable.
|
* The type of values returned by this callable.
|
||||||
// */
|
*/
|
||||||
// public val returnType: KType
|
public val returnType: KType
|
||||||
//
|
|
||||||
// /**
|
// /**
|
||||||
// * The list of type parameters of this callable.
|
// * The list of type parameters of this callable.
|
||||||
// */
|
// */
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 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 kotlin.reflect
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a type. Type is usually either a class with optional type arguments,
|
||||||
|
* or a type parameter of some declaration, plus nullability.
|
||||||
|
*/
|
||||||
|
public interface KType {
|
||||||
|
/**
|
||||||
|
* The declaration of the classifier used in this type.
|
||||||
|
* For example, in the type `List<String>` the classifier would be the [KClass] instance for [List].
|
||||||
|
*
|
||||||
|
* Returns `null` if this type is not denotable in Kotlin, for example if it is an intersection type.
|
||||||
|
*/
|
||||||
|
@SinceKotlin("1.1")
|
||||||
|
public val classifier: KClassifier?
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type arguments passed for the parameters of the classifier in this type.
|
||||||
|
* For example, in the type `Array<out Number>` the only type argument is `out Number`.
|
||||||
|
*
|
||||||
|
* In case this type is based on an inner class, the returned list contains the type arguments provided for the innermost class first,
|
||||||
|
* then its outer class, and so on.
|
||||||
|
* For example, in the type `Outer<A, B>.Inner<C, D>` the returned list is `[C, D, A, B]`.
|
||||||
|
*/
|
||||||
|
// @SinceKotlin("1.1")
|
||||||
|
// public val arguments: List<KTypeProjection>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* `true` if this type was marked nullable in the source code.
|
||||||
|
*
|
||||||
|
* For Kotlin types, it means that `null` value is allowed to be represented by this type.
|
||||||
|
* In practice it means that the type was declared with a question mark at the end.
|
||||||
|
* For non-Kotlin types, it means the type or the symbol which was declared with this type
|
||||||
|
* is annotated with a runtime-retained nullability annotation such as [javax.annotation.Nullable].
|
||||||
|
*
|
||||||
|
* Note that even if [isMarkedNullable] is false, values of the type can still be `null`.
|
||||||
|
* This may happen if it is a type of the type parameter with a nullable upper bound:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* fun <T> foo(t: T) {
|
||||||
|
* // isMarkedNullable == false for t's type, but t can be null here when T = "Any?"
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
public val isMarkedNullable: Boolean
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user