FIR: change source of existing type refs in DataClassMembersGenerator to avoid sources clash
This commit is contained in:
+12
@@ -43,3 +43,15 @@ inline fun buildComposedSuperTypeRef(init: FirComposedSuperTypeRefBuilder.() ->
|
||||
}
|
||||
return FirComposedSuperTypeRefBuilder().apply(init).build()
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalContracts::class)
|
||||
inline fun buildComposedSuperTypeRefCopy(original: FirComposedSuperTypeRef, init: FirComposedSuperTypeRefBuilder.() -> Unit = {}): FirComposedSuperTypeRef {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
val copyBuilder = FirComposedSuperTypeRefBuilder()
|
||||
copyBuilder.source = original.source
|
||||
copyBuilder.annotations.addAll(original.annotations)
|
||||
copyBuilder.superTypeRefs.addAll(original.superTypeRefs)
|
||||
return copyBuilder.apply(init).build()
|
||||
}
|
||||
|
||||
+11
@@ -41,3 +41,14 @@ inline fun buildDelegatedTypeRef(init: FirDelegatedTypeRefBuilder.() -> Unit): F
|
||||
}
|
||||
return FirDelegatedTypeRefBuilder().apply(init).build()
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalContracts::class)
|
||||
inline fun buildDelegatedTypeRefCopy(original: FirDelegatedTypeRef, init: FirDelegatedTypeRefBuilder.() -> Unit): FirDelegatedTypeRef {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
val copyBuilder = FirDelegatedTypeRefBuilder()
|
||||
copyBuilder.delegate = original.delegate
|
||||
copyBuilder.typeRef = original.typeRef
|
||||
return copyBuilder.apply(init).build()
|
||||
}
|
||||
|
||||
+11
@@ -47,3 +47,14 @@ inline fun buildErrorTypeRef(init: FirErrorTypeRefBuilder.() -> Unit): FirErrorT
|
||||
}
|
||||
return FirErrorTypeRefBuilder().apply(init).build()
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalContracts::class)
|
||||
inline fun buildErrorTypeRefCopy(original: FirErrorTypeRef, init: FirErrorTypeRefBuilder.() -> Unit): FirErrorTypeRef {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
val copyBuilder = FirErrorTypeRefBuilder()
|
||||
copyBuilder.source = original.source
|
||||
copyBuilder.diagnostic = original.diagnostic
|
||||
return copyBuilder.apply(init).build()
|
||||
}
|
||||
|
||||
+16
@@ -53,3 +53,19 @@ inline fun buildFunctionTypeRef(init: FirFunctionTypeRefBuilder.() -> Unit): Fir
|
||||
}
|
||||
return FirFunctionTypeRefBuilder().apply(init).build()
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalContracts::class)
|
||||
inline fun buildFunctionTypeRefCopy(original: FirFunctionTypeRef, init: FirFunctionTypeRefBuilder.() -> Unit): FirFunctionTypeRef {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
val copyBuilder = FirFunctionTypeRefBuilder()
|
||||
copyBuilder.source = original.source
|
||||
copyBuilder.annotations.addAll(original.annotations)
|
||||
copyBuilder.isMarkedNullable = original.isMarkedNullable
|
||||
copyBuilder.receiverTypeRef = original.receiverTypeRef
|
||||
copyBuilder.valueParameters.addAll(original.valueParameters)
|
||||
copyBuilder.returnTypeRef = original.returnTypeRef
|
||||
copyBuilder.isSuspend = original.isSuspend
|
||||
return copyBuilder.apply(init).build()
|
||||
}
|
||||
|
||||
+10
@@ -37,3 +37,13 @@ inline fun buildImplicitTypeRef(init: FirImplicitTypeRefBuilder.() -> Unit = {})
|
||||
}
|
||||
return FirImplicitTypeRefBuilder().apply(init).build()
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalContracts::class)
|
||||
inline fun buildImplicitTypeRefCopy(original: FirImplicitTypeRef, init: FirImplicitTypeRefBuilder.() -> Unit = {}): FirImplicitTypeRef {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
val copyBuilder = FirImplicitTypeRefBuilder()
|
||||
copyBuilder.source = original.source
|
||||
return copyBuilder.apply(init).build()
|
||||
}
|
||||
|
||||
+17
@@ -55,3 +55,20 @@ inline fun buildResolvedFunctionTypeRef(init: FirResolvedFunctionTypeRefBuilder.
|
||||
}
|
||||
return FirResolvedFunctionTypeRefBuilder().apply(init).build()
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalContracts::class)
|
||||
inline fun buildResolvedFunctionTypeRefCopy(original: FirResolvedFunctionTypeRef, init: FirResolvedFunctionTypeRefBuilder.() -> Unit): FirResolvedFunctionTypeRef {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
val copyBuilder = FirResolvedFunctionTypeRefBuilder()
|
||||
copyBuilder.source = original.source
|
||||
copyBuilder.annotations.addAll(original.annotations)
|
||||
copyBuilder.type = original.type
|
||||
copyBuilder.isSuspend = original.isSuspend
|
||||
copyBuilder.isMarkedNullable = original.isMarkedNullable
|
||||
copyBuilder.receiverTypeRef = original.receiverTypeRef
|
||||
copyBuilder.valueParameters.addAll(original.valueParameters)
|
||||
copyBuilder.returnTypeRef = original.returnTypeRef
|
||||
return copyBuilder.apply(init).build()
|
||||
}
|
||||
|
||||
+16
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.fir.types.builder
|
||||
|
||||
import kotlin.contracts.*
|
||||
import org.jetbrains.kotlin.fir.FirImplementationDetail
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
@@ -29,6 +30,7 @@ class FirResolvedTypeRefBuilder : FirAnnotationContainerBuilder {
|
||||
var delegatedTypeRef: FirTypeRef? = null
|
||||
var isSuspend: Boolean = false
|
||||
|
||||
@OptIn(FirImplementationDetail::class)
|
||||
override fun build(): FirResolvedTypeRef {
|
||||
return FirResolvedTypeRefImpl(
|
||||
source,
|
||||
@@ -48,3 +50,17 @@ inline fun buildResolvedTypeRef(init: FirResolvedTypeRefBuilder.() -> Unit): Fir
|
||||
}
|
||||
return FirResolvedTypeRefBuilder().apply(init).build()
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalContracts::class)
|
||||
inline fun buildResolvedTypeRefCopy(original: FirResolvedTypeRef, init: FirResolvedTypeRefBuilder.() -> Unit): FirResolvedTypeRef {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
val copyBuilder = FirResolvedTypeRefBuilder()
|
||||
copyBuilder.source = original.source
|
||||
copyBuilder.annotations.addAll(original.annotations)
|
||||
copyBuilder.type = original.type
|
||||
copyBuilder.delegatedTypeRef = original.delegatedTypeRef
|
||||
copyBuilder.isSuspend = original.isSuspend
|
||||
return copyBuilder.apply(init).build()
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.types.impl
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirImplementationDetail
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
@@ -17,7 +18,7 @@ import org.jetbrains.kotlin.fir.visitors.*
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
internal class FirResolvedTypeRefImpl(
|
||||
class FirResolvedTypeRefImpl @FirImplementationDetail constructor(
|
||||
override val source: FirSourceElement?,
|
||||
override val annotations: MutableList<FirAnnotationCall>,
|
||||
override val type: ConeKotlinType,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -8,6 +8,10 @@ package org.jetbrains.kotlin.fir
|
||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.builder.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirFunctionTypeRefImpl
|
||||
|
||||
fun ModuleInfo.dependenciesWithoutSelf(): Sequence<ModuleInfo> = dependencies().asSequence().filter { it != this }
|
||||
|
||||
@@ -16,3 +20,41 @@ fun FirBlock.returnExpressions(): List<FirExpression> = listOfNotNull(statements
|
||||
|
||||
private val PUBLIC_METHOD_NAMES_IN_OBJECT = setOf("equals", "hashCode", "getClass", "wait", "notify", "notifyAll", "toString")
|
||||
|
||||
// do we need a deep copy here ?
|
||||
fun <R : FirTypeRef> R.copyWithNewSourceKind(newKind: FirFakeSourceElementKind): R {
|
||||
if (source == null) return this
|
||||
if (source?.kind == newKind) return this
|
||||
if (this is FirDelegatedTypeRef) return this
|
||||
val newSource = source?.withKind(newKind)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
return when (val typeRef = this) {
|
||||
is FirResolvedTypeRefImpl -> buildResolvedTypeRefCopy(typeRef) {
|
||||
source = newSource
|
||||
}
|
||||
is FirErrorTypeRef -> buildErrorTypeRefCopy(typeRef) {
|
||||
source = newSource
|
||||
}
|
||||
is FirUserTypeRefImpl -> buildUserTypeRef {
|
||||
source = newSource
|
||||
isMarkedNullable = typeRef.isMarkedNullable
|
||||
qualifier += typeRef.qualifier
|
||||
annotations += typeRef.annotations
|
||||
}
|
||||
is FirResolvedFunctionTypeRef -> buildResolvedFunctionTypeRefCopy(typeRef) {
|
||||
source = newSource
|
||||
}
|
||||
is FirImplicitTypeRef -> buildImplicitTypeRefCopy(typeRef) {
|
||||
source = newSource
|
||||
}
|
||||
is FirComposedSuperTypeRef -> buildComposedSuperTypeRefCopy(typeRef) {
|
||||
source = newSource
|
||||
}
|
||||
is FirFunctionTypeRefImpl -> buildFunctionTypeRefCopy(typeRef) {
|
||||
source = newSource
|
||||
}
|
||||
is FirImplicitBuiltinTypeRef -> typeRef.withFakeSource(newKind)
|
||||
else -> TODO("Not implemented for ${typeRef::class}")
|
||||
} as R
|
||||
}
|
||||
|
||||
|
||||
+55
-1
@@ -1,11 +1,12 @@
|
||||
/*
|
||||
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* 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.types.impl
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
|
||||
@@ -16,6 +17,7 @@ import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||
import org.jetbrains.kotlin.fir.withKind
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
sealed class FirImplicitBuiltinTypeRef(
|
||||
@@ -132,3 +134,55 @@ class FirImplicitKMutableProperty2TypeRef(
|
||||
source, StandardClassIds.KMutableProperty2,
|
||||
arrayOf(dispatchReceiverTypeArgument, extensionReceiverTypeArgument, propertyTypeArgument)
|
||||
)
|
||||
|
||||
fun FirImplicitBuiltinTypeRef.withFakeSource(kind: FirFakeSourceElementKind): FirImplicitBuiltinTypeRef {
|
||||
val source = source ?: return this
|
||||
if (source.kind == kind) return this
|
||||
val newSource = source.withKind(kind)
|
||||
return when (this) {
|
||||
is FirImplicitUnitTypeRef -> FirImplicitUnitTypeRef(newSource)
|
||||
is FirImplicitAnyTypeRef -> FirImplicitAnyTypeRef(newSource)
|
||||
is FirImplicitNullableAnyTypeRef -> FirImplicitNullableAnyTypeRef(newSource)
|
||||
is FirImplicitEnumTypeRef -> FirImplicitEnumTypeRef(newSource)
|
||||
is FirImplicitAnnotationTypeRef -> FirImplicitAnnotationTypeRef(newSource)
|
||||
is FirImplicitBooleanTypeRef -> FirImplicitBooleanTypeRef(newSource)
|
||||
is FirImplicitIntTypeRef -> FirImplicitIntTypeRef(newSource)
|
||||
is FirImplicitNothingTypeRef -> FirImplicitNothingTypeRef(newSource)
|
||||
is FirImplicitNullableNothingTypeRef -> FirImplicitNullableNothingTypeRef(newSource)
|
||||
is FirImplicitStringTypeRef -> FirImplicitStringTypeRef(newSource)
|
||||
is FirImplicitKPropertyTypeRef -> FirImplicitKPropertyTypeRef(
|
||||
newSource,
|
||||
typeArgument = type.typeArguments[0]
|
||||
)
|
||||
is FirImplicitKProperty0TypeRef -> FirImplicitKProperty0TypeRef(
|
||||
newSource,
|
||||
propertyTypeArgument = type.typeArguments[0]
|
||||
)
|
||||
is FirImplicitKMutableProperty0TypeRef -> FirImplicitKMutableProperty0TypeRef(
|
||||
newSource,
|
||||
propertyTypeArgument = type.typeArguments[0]
|
||||
)
|
||||
is FirImplicitKProperty1TypeRef -> FirImplicitKProperty1TypeRef(
|
||||
newSource,
|
||||
receiverTypeArgument = type.typeArguments[0],
|
||||
propertyTypeArgument = type.typeArguments[1]
|
||||
)
|
||||
is FirImplicitKMutableProperty1TypeRef -> FirImplicitKMutableProperty1TypeRef(
|
||||
newSource,
|
||||
receiverTypeArgument = type.typeArguments[0],
|
||||
propertyTypeArgument = type.typeArguments[1]
|
||||
)
|
||||
is FirImplicitKProperty2TypeRef -> FirImplicitKProperty2TypeRef(
|
||||
newSource,
|
||||
dispatchReceiverTypeArgument = type.typeArguments[0],
|
||||
extensionReceiverTypeArgument = type.typeArguments[1],
|
||||
propertyTypeArgument = type.typeArguments[2]
|
||||
)
|
||||
is FirImplicitKMutableProperty2TypeRef -> FirImplicitKMutableProperty2TypeRef(
|
||||
newSource,
|
||||
dispatchReceiverTypeArgument = type.typeArguments[0],
|
||||
extensionReceiverTypeArgument = type.typeArguments[1],
|
||||
propertyTypeArgument = type.typeArguments[2]
|
||||
)
|
||||
}
|
||||
}
|
||||
+25
@@ -222,6 +222,31 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
|
||||
builder(resolvedTypeRef) {
|
||||
defaultFalse("isSuspend")
|
||||
defaultNull("delegatedTypeRef")
|
||||
withCopy()
|
||||
}
|
||||
|
||||
builder(errorTypeRef) {
|
||||
withCopy()
|
||||
}
|
||||
|
||||
builder(delegatedTypeRef) {
|
||||
withCopy()
|
||||
}
|
||||
|
||||
builder(functionTypeRef) {
|
||||
withCopy()
|
||||
}
|
||||
|
||||
builder(resolvedFunctionTypeRef) {
|
||||
withCopy()
|
||||
}
|
||||
|
||||
builder(implicitTypeRef) {
|
||||
withCopy()
|
||||
}
|
||||
|
||||
builder(composedSuperTypeRef) {
|
||||
withCopy()
|
||||
}
|
||||
|
||||
builder(breakExpression) {
|
||||
|
||||
+4
-2
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -380,7 +380,9 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
|
||||
kind = Object
|
||||
}
|
||||
|
||||
impl(resolvedTypeRef)
|
||||
impl(resolvedTypeRef) {
|
||||
publicImplementation()
|
||||
}
|
||||
|
||||
impl(errorExpression) {
|
||||
defaultEmptyList("annotations")
|
||||
|
||||
Reference in New Issue
Block a user