[FIR] Implement builders for leaf nodes of FIR tree
This commit is contained in:
@@ -16,8 +16,8 @@ import org.jetbrains.kotlin.fir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.fir.references.FirReference
|
||||
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.FirSuperReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirPropertyFromParameterResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.resolve.*
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.SyntheticPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.IntegerLiteralTypeApproximationTransformer
|
||||
@@ -902,15 +902,15 @@ class Fir2IrVisitor(
|
||||
if (functionCall !is FirFunctionCallImpl) {
|
||||
return functionCall
|
||||
}
|
||||
val calleeReference = (functionCall.calleeReference as? FirResolvedNamedReferenceImpl) ?: return functionCall
|
||||
val calleeReference = (functionCall.calleeReference as? FirResolvedNamedReference) ?: return functionCall
|
||||
val resolvedSymbol = (calleeReference.resolvedSymbol as? FirNamedFunctionSymbol) ?: return functionCall
|
||||
if (resolvedSymbol.callableId.isInvoke()) {
|
||||
functionCall.calleeReference =
|
||||
FirResolvedNamedReferenceImpl(
|
||||
source = calleeReference.source,
|
||||
name = calleeReference.name,
|
||||
resolvedSymbol = resolvedSymbol.overriddenSymbol!!
|
||||
)
|
||||
buildResolvedNamedReference {
|
||||
source = calleeReference.source
|
||||
name = calleeReference.name
|
||||
this.resolvedSymbol = resolvedSymbol.overriddenSymbol!!
|
||||
}
|
||||
}
|
||||
return functionCall
|
||||
}
|
||||
|
||||
@@ -15,21 +15,19 @@ import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.addDefaultBoundIfNecessary
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.visibility
|
||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
|
||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaConstructor
|
||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaField
|
||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaMethod
|
||||
import org.jetbrains.kotlin.fir.resolve.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder
|
||||
import org.jetbrains.kotlin.fir.java.declarations.*
|
||||
import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.constructType
|
||||
import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.*
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.lazyNestedClassifierScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeNullability
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.load.java.JavaClassFinder
|
||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
||||
import org.jetbrains.kotlin.load.java.structure.JavaClass
|
||||
@@ -45,7 +43,7 @@ import org.jetbrains.kotlin.types.Variance.INVARIANT
|
||||
class JavaSymbolProvider(
|
||||
val session: FirSession,
|
||||
val project: Project,
|
||||
private val searchScope: GlobalSearchScope
|
||||
private val searchScope: GlobalSearchScope,
|
||||
) : AbstractFirSymbolProvider<FirRegularClassSymbol>() {
|
||||
|
||||
private val scopeProvider = JavaScopeProvider(::wrapScopeWithJvmMapped, this)
|
||||
@@ -54,7 +52,7 @@ class JavaSymbolProvider(
|
||||
|
||||
private fun findClass(
|
||||
classId: ClassId,
|
||||
content: KotlinClassFinder.Result.ClassFileContent?
|
||||
content: KotlinClassFinder.Result.ClassFileContent?,
|
||||
): JavaClass? = facade.findClass(JavaClassFinder.Request(classId, previouslyFoundClassFileContent = content?.content), searchScope)
|
||||
|
||||
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<FirCallableSymbol<*>> =
|
||||
@@ -67,34 +65,31 @@ class JavaSymbolProvider(
|
||||
lazyNestedClassifierScope(
|
||||
classId,
|
||||
existingNames = regularClass.existingNestedClassifierNames,
|
||||
symbolProvider = this
|
||||
symbolProvider = this,
|
||||
)
|
||||
} else {
|
||||
nestedClassifierScope(regularClass)
|
||||
}
|
||||
}
|
||||
|
||||
private fun JavaTypeParameter.toFirTypeParameter(javaTypeParameterStack: JavaTypeParameterStack): FirTypeParameter {
|
||||
val stored = javaTypeParameterStack.safeGet(this)
|
||||
if (stored != null) return stored.fir
|
||||
private fun JavaTypeParameter.toFirTypeParameter(javaTypeParameterStack: JavaTypeParameterStack): FirTypeParameterBuilder {
|
||||
javaTypeParameterStack.getBuilder(this)?.let { return it }
|
||||
val firSymbol = FirTypeParameterSymbol()
|
||||
val result = FirTypeParameterImpl(
|
||||
null,
|
||||
session,
|
||||
name,
|
||||
firSymbol,
|
||||
variance = INVARIANT,
|
||||
return FirTypeParameterBuilder().apply {
|
||||
session = this@JavaSymbolProvider.session
|
||||
name = this@toFirTypeParameter.name
|
||||
symbol = firSymbol
|
||||
variance = INVARIANT
|
||||
isReified = false
|
||||
)
|
||||
javaTypeParameterStack.add(this, result)
|
||||
return result
|
||||
}.also {
|
||||
javaTypeParameterStack.add(this, it)
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirTypeParameter.addBounds(
|
||||
private fun FirTypeParameterBuilder.addBounds(
|
||||
javaTypeParameter: JavaTypeParameter,
|
||||
stack: JavaTypeParameterStack
|
||||
stack: JavaTypeParameterStack,
|
||||
) {
|
||||
require(this is FirTypeParameterImpl)
|
||||
for (upperBound in javaTypeParameter.upperBounds) {
|
||||
bounds += upperBound.toFirResolvedTypeRef(this@JavaSymbolProvider.session, stack, nullability = ConeNullability.NULLABLE)
|
||||
}
|
||||
@@ -104,12 +99,11 @@ class JavaSymbolProvider(
|
||||
private fun List<JavaTypeParameter>.convertTypeParameters(stack: JavaTypeParameterStack): List<FirTypeParameter> {
|
||||
return this
|
||||
.map { it.toFirTypeParameter(stack) }
|
||||
.also {
|
||||
it.forEachIndexed { index, typeParameter ->
|
||||
if (typeParameter.bounds.isEmpty()) {
|
||||
typeParameter.addBounds(this[index], stack)
|
||||
}
|
||||
.mapIndexed { index, typeParameterBuilder ->
|
||||
if (typeParameterBuilder.bounds.isEmpty()) {
|
||||
typeParameterBuilder.addBounds(this[index], stack)
|
||||
}
|
||||
typeParameterBuilder.build()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -123,14 +117,17 @@ class JavaSymbolProvider(
|
||||
|
||||
fun getFirJavaClass(classId: ClassId, content: KotlinClassFinder.Result.ClassFileContent? = null): FirRegularClassSymbol? {
|
||||
if (!hasTopLevelClassOf(classId)) return null
|
||||
return classCache.lookupCacheOrCalculateWithPostCompute(classId, {
|
||||
val foundClass = findClass(classId, content)
|
||||
if (foundClass == null || foundClass.annotations.any { it.classId?.asSingleFqName() == JvmAnnotationNames.METADATA_FQ_NAME }) {
|
||||
null to null
|
||||
} else {
|
||||
FirRegularClassSymbol(classId) to foundClass
|
||||
}
|
||||
}) { firSymbol, foundClass ->
|
||||
return classCache.lookupCacheOrCalculateWithPostCompute(
|
||||
classId,
|
||||
{
|
||||
val foundClass = findClass(classId, content)
|
||||
if (foundClass == null || foundClass.annotations.any { it.classId?.asSingleFqName() == JvmAnnotationNames.METADATA_FQ_NAME }) {
|
||||
null to null
|
||||
} else {
|
||||
FirRegularClassSymbol(classId) to foundClass
|
||||
}
|
||||
},
|
||||
) { firSymbol, foundClass ->
|
||||
foundClass?.let { javaClass ->
|
||||
val javaTypeParameterStack = JavaTypeParameterStack()
|
||||
val parentFqName = classId.relativeClassName.parent()
|
||||
@@ -143,17 +140,20 @@ class JavaSymbolProvider(
|
||||
javaTypeParameterStack.addStack(parentClass.javaTypeParameterStack)
|
||||
}
|
||||
}
|
||||
FirJavaClass(
|
||||
(javaClass as? JavaElementImpl<*>)?.psi?.toFirSourceElement(), session,
|
||||
firSymbol, javaClass.name,
|
||||
javaClass.visibility, javaClass.modality,
|
||||
javaClass.classKind, isTopLevel = isTopLevel,
|
||||
isStatic = javaClass.isStatic,
|
||||
javaTypeParameterStack = javaTypeParameterStack,
|
||||
existingNestedClassifierNames = javaClass.innerClassNames.toList(),
|
||||
scopeProvider = scopeProvider
|
||||
).apply {
|
||||
this.typeParameters += foundClass.typeParameters.convertTypeParameters(javaTypeParameterStack)
|
||||
buildJavaClass {
|
||||
source = (javaClass as? JavaElementImpl<*>)?.psi?.toFirSourceElement()
|
||||
session = this@JavaSymbolProvider.session
|
||||
symbol = firSymbol
|
||||
name = javaClass.name
|
||||
visibility = javaClass.visibility
|
||||
modality = javaClass.modality
|
||||
classKind = javaClass.classKind
|
||||
this.isTopLevel = isTopLevel
|
||||
isStatic = javaClass.isStatic
|
||||
this.javaTypeParameterStack = javaTypeParameterStack
|
||||
existingNestedClassifierNames += javaClass.innerClassNames
|
||||
scopeProvider = this@JavaSymbolProvider.scopeProvider
|
||||
typeParameters += foundClass.typeParameters.convertTypeParameters(javaTypeParameterStack)
|
||||
addAnnotationsFrom(this@JavaSymbolProvider.session, javaClass, javaTypeParameterStack)
|
||||
for (supertype in javaClass.supertypes) {
|
||||
superTypeRefs += supertype.toFirResolvedTypeRef(
|
||||
@@ -167,14 +167,16 @@ class JavaSymbolProvider(
|
||||
val fieldId = CallableId(classId.packageFqName, classId.relativeClassName, fieldName)
|
||||
val fieldSymbol = FirFieldSymbol(fieldId)
|
||||
val returnType = javaField.type
|
||||
val firJavaField = FirJavaField(
|
||||
(javaField as? JavaElementImpl<*>)?.psi?.toFirSourceElement(), this@JavaSymbolProvider.session,
|
||||
fieldSymbol, fieldName,
|
||||
javaField.visibility, javaField.modality,
|
||||
returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack),
|
||||
isVar = !javaField.isFinal,
|
||||
val firJavaField = buildJavaField {
|
||||
source = (javaField as? JavaElementImpl<*>)?.psi?.toFirSourceElement()
|
||||
session = this@JavaSymbolProvider.session
|
||||
symbol = fieldSymbol
|
||||
name = fieldName
|
||||
visibility = javaField.visibility
|
||||
modality = javaField.modality
|
||||
returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack)
|
||||
isVar = !javaField.isFinal
|
||||
isStatic = javaField.isStatic
|
||||
).apply {
|
||||
addAnnotationsFrom(this@JavaSymbolProvider.session, javaField, javaTypeParameterStack)
|
||||
}
|
||||
declarations += firJavaField
|
||||
@@ -184,18 +186,20 @@ class JavaSymbolProvider(
|
||||
val methodId = CallableId(classId.packageFqName, classId.relativeClassName, methodName)
|
||||
val methodSymbol = FirNamedFunctionSymbol(methodId)
|
||||
val returnType = javaMethod.returnType
|
||||
val firJavaMethod = FirJavaMethod(
|
||||
this@JavaSymbolProvider.session, (javaMethod as? JavaElementImpl<*>)?.psi?.toFirSourceElement(),
|
||||
methodSymbol, methodName,
|
||||
javaMethod.visibility, javaMethod.modality,
|
||||
returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack),
|
||||
val firJavaMethod = buildJavaMethod {
|
||||
session = this@JavaSymbolProvider.session
|
||||
source = (javaMethod as? JavaElementImpl<*>)?.psi?.toFirSourceElement()
|
||||
symbol = methodSymbol
|
||||
name = methodName
|
||||
visibility = javaMethod.visibility
|
||||
modality = javaMethod.modality
|
||||
returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack)
|
||||
isStatic = javaMethod.isStatic
|
||||
).apply {
|
||||
this.typeParameters += javaMethod.typeParameters.convertTypeParameters(javaTypeParameterStack)
|
||||
typeParameters += javaMethod.typeParameters.convertTypeParameters(javaTypeParameterStack)
|
||||
addAnnotationsFrom(this@JavaSymbolProvider.session, javaMethod, javaTypeParameterStack)
|
||||
for ((index, valueParameter) in javaMethod.valueParameters.withIndex()) {
|
||||
valueParameters += valueParameter.toFirValueParameter(
|
||||
this@JavaSymbolProvider.session, index, javaTypeParameterStack
|
||||
this@JavaSymbolProvider.session, index, javaTypeParameterStack,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -204,56 +208,53 @@ class JavaSymbolProvider(
|
||||
val javaClassDeclaredConstructors = javaClass.constructors
|
||||
val constructorId = CallableId(classId.packageFqName, classId.relativeClassName, classId.shortClassName)
|
||||
|
||||
fun addJavaConstructor(
|
||||
fun prepareJavaConstructor(
|
||||
visibility: Visibility = this.visibility,
|
||||
psi: PsiElement? = null,
|
||||
isPrimary: Boolean = false
|
||||
): FirJavaConstructor {
|
||||
isPrimary: Boolean = false,
|
||||
): FirJavaConstructorBuilder {
|
||||
val constructorSymbol = FirConstructorSymbol(constructorId)
|
||||
val classTypeParameters = javaClass.typeParameters.convertTypeParameters(javaTypeParameterStack)
|
||||
val firJavaConstructor = FirJavaConstructor(
|
||||
psi?.toFirSourceElement(),
|
||||
this@JavaSymbolProvider.session,
|
||||
constructorSymbol,
|
||||
visibility,
|
||||
isPrimary,
|
||||
isInner = !javaClass.isStatic,
|
||||
returnTypeRef = FirResolvedTypeRefImpl(
|
||||
null,
|
||||
firSymbol.constructType(
|
||||
val firJavaConstructor = FirJavaConstructorBuilder().apply {
|
||||
source = psi?.toFirSourceElement()
|
||||
session = this@JavaSymbolProvider.session
|
||||
symbol = constructorSymbol
|
||||
this.visibility = visibility
|
||||
this.isPrimary = isPrimary
|
||||
isInner = !javaClass.isStatic
|
||||
returnTypeRef = buildResolvedTypeRef {
|
||||
type = firSymbol.constructType(
|
||||
classTypeParameters.map { ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false) }.toTypedArray(),
|
||||
false
|
||||
false,
|
||||
)
|
||||
)
|
||||
).apply {
|
||||
this.typeParameters += classTypeParameters
|
||||
}
|
||||
typeParameters += classTypeParameters
|
||||
}
|
||||
declarations += firJavaConstructor
|
||||
return firJavaConstructor
|
||||
}
|
||||
|
||||
if (javaClassDeclaredConstructors.isEmpty() && javaClass.classKind == ClassKind.CLASS) {
|
||||
addJavaConstructor(isPrimary = true)
|
||||
declarations += prepareJavaConstructor(isPrimary = true).build()
|
||||
}
|
||||
for (javaConstructor in javaClassDeclaredConstructors) {
|
||||
addJavaConstructor(
|
||||
visibility = javaConstructor.visibility, psi = (javaConstructor as? JavaElementImpl<*>)?.psi
|
||||
declarations += prepareJavaConstructor(
|
||||
visibility = javaConstructor.visibility, psi = (javaConstructor as? JavaElementImpl<*>)?.psi,
|
||||
).apply {
|
||||
this.typeParameters += javaConstructor.typeParameters.convertTypeParameters(javaTypeParameterStack)
|
||||
addAnnotationsFrom(this@JavaSymbolProvider.session, javaConstructor, javaTypeParameterStack)
|
||||
for ((index, valueParameter) in javaConstructor.valueParameters.withIndex()) {
|
||||
valueParameters += valueParameter.toFirValueParameter(
|
||||
this@JavaSymbolProvider.session, index, javaTypeParameterStack
|
||||
this@JavaSymbolProvider.session, index, javaTypeParameterStack,
|
||||
)
|
||||
}
|
||||
}
|
||||
}.build()
|
||||
}
|
||||
|
||||
if (classKind == ClassKind.ENUM_CLASS) {
|
||||
generateValuesFunction(session, classId.packageFqName, classId.relativeClassName)
|
||||
generateValueOfFunction(session, classId.packageFqName, classId.relativeClassName)
|
||||
}
|
||||
calculateSAM()
|
||||
isNotSam = isNotSam()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,16 +5,16 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.java
|
||||
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.load.java.structure.JavaTypeParameter
|
||||
|
||||
internal class JavaTypeParameterStack {
|
||||
|
||||
private val typeParameterMap = mutableMapOf<JavaTypeParameter, FirTypeParameterSymbol>()
|
||||
private val typeParameterMap = mutableMapOf<JavaTypeParameter, FirTypeParameterBuilder>()
|
||||
|
||||
fun add(javaTypeParameter: JavaTypeParameter, firTypeParameter: FirTypeParameter) {
|
||||
typeParameterMap[javaTypeParameter] = firTypeParameter.symbol
|
||||
fun add(javaTypeParameter: JavaTypeParameter, firTypeParameterBuilder: FirTypeParameterBuilder) {
|
||||
typeParameterMap[javaTypeParameter] = firTypeParameterBuilder
|
||||
}
|
||||
|
||||
fun addStack(javaTypeParameterStack: JavaTypeParameterStack) {
|
||||
@@ -30,7 +30,9 @@ internal class JavaTypeParameterStack {
|
||||
?: throw IllegalArgumentException("Cannot find Java type parameter $javaTypeParameter in stack")
|
||||
}
|
||||
|
||||
fun safeGet(javaTypeParameter: JavaTypeParameter) = typeParameterMap[javaTypeParameter]
|
||||
fun safeGet(javaTypeParameter: JavaTypeParameter) = typeParameterMap[javaTypeParameter]?.symbol
|
||||
|
||||
fun getBuilder(javaTypeParameter: JavaTypeParameter) = typeParameterMap[javaTypeParameter]
|
||||
|
||||
companion object {
|
||||
val EMPTY: JavaTypeParameterStack = JavaTypeParameterStack()
|
||||
|
||||
@@ -9,19 +9,21 @@ import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirArrayOfCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstKind
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
|
||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaValueParameter
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.*
|
||||
import org.jetbrains.kotlin.fir.java.declarations.buildJavaValueParameter
|
||||
import org.jetbrains.kotlin.fir.java.enhancement.readOnlyToMutable
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.resolve.constructClassType
|
||||
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.getClassDeclaredCallableSymbols
|
||||
@@ -30,11 +32,11 @@ import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.toFirSourceElement
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstKind
|
||||
import org.jetbrains.kotlin.fir.types.jvm.buildJavaTypeRef
|
||||
import org.jetbrains.kotlin.load.java.structure.*
|
||||
import org.jetbrains.kotlin.load.java.structure.impl.JavaElementImpl
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
@@ -84,10 +86,10 @@ internal fun JavaType?.toNotNullConeKotlinType(
|
||||
|
||||
internal fun JavaType.toFirJavaTypeRef(session: FirSession, javaTypeParameterStack: JavaTypeParameterStack): FirJavaTypeRef {
|
||||
val annotations = (this as? JavaClassifierType)?.annotations.orEmpty()
|
||||
return FirJavaTypeRef(
|
||||
annotations = annotations.map { it.toFirAnnotationCall(session, javaTypeParameterStack) },
|
||||
type = this
|
||||
)
|
||||
return buildJavaTypeRef {
|
||||
annotations.mapTo(this.annotations) { it.toFirAnnotationCall(session, javaTypeParameterStack) }
|
||||
type = this@toFirJavaTypeRef
|
||||
}
|
||||
}
|
||||
|
||||
internal fun JavaClassifierType.toFirResolvedTypeRef(
|
||||
@@ -97,10 +99,9 @@ internal fun JavaClassifierType.toFirResolvedTypeRef(
|
||||
typeParametersNullability: ConeNullability = ConeNullability.NOT_NULL
|
||||
): FirResolvedTypeRef {
|
||||
val coneType = this.toConeKotlinTypeWithNullability(session, javaTypeParameterStack, nullability, typeParametersNullability)
|
||||
return FirResolvedTypeRefImpl(
|
||||
source = null, type = coneType
|
||||
).apply {
|
||||
annotations += this@toFirResolvedTypeRef.annotations.map { it.toFirAnnotationCall(session, javaTypeParameterStack) }
|
||||
return buildResolvedTypeRef {
|
||||
type = coneType
|
||||
this@toFirResolvedTypeRef.annotations.mapTo(annotations) { it.toFirAnnotationCall(session, javaTypeParameterStack) }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -188,20 +189,18 @@ internal fun JavaClassifierType.toConeKotlinTypeWithNullability(
|
||||
internal fun JavaAnnotation.toFirAnnotationCall(
|
||||
session: FirSession, javaTypeParameterStack: JavaTypeParameterStack
|
||||
): FirAnnotationCall {
|
||||
return FirAnnotationCallImpl(
|
||||
source = null, useSiteTarget = null,
|
||||
annotationTypeRef = FirResolvedTypeRefImpl(
|
||||
source = null,
|
||||
return buildAnnotationCall {
|
||||
annotationTypeRef = buildResolvedTypeRef {
|
||||
type = ConeClassLikeTypeImpl(FirRegularClassSymbol(classId!!).toLookupTag(), emptyArray(), isNullable = false)
|
||||
)
|
||||
).apply {
|
||||
}
|
||||
for (argument in this@toFirAnnotationCall.arguments) {
|
||||
arguments += argument.toFirExpression(session, javaTypeParameterStack)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal fun FirAbstractAnnotatedElement.addAnnotationsFrom(
|
||||
@FirBuilderDsl
|
||||
internal fun FirAnnotationContainerBuilder.addAnnotationsFrom(
|
||||
session: FirSession, javaAnnotationOwner: JavaAnnotationOwner, javaTypeParameterStack: JavaTypeParameterStack
|
||||
) {
|
||||
for (annotation in javaAnnotationOwner.annotations) {
|
||||
@@ -212,11 +211,12 @@ internal fun FirAbstractAnnotatedElement.addAnnotationsFrom(
|
||||
internal fun JavaValueParameter.toFirValueParameter(
|
||||
session: FirSession, index: Int, javaTypeParameterStack: JavaTypeParameterStack
|
||||
): FirValueParameter {
|
||||
return FirJavaValueParameter(
|
||||
session, (this as? JavaElementImpl<*>)?.psi?.toFirSourceElement(), name ?: Name.identifier("p$index"),
|
||||
returnTypeRef = type.toFirJavaTypeRef(session, javaTypeParameterStack),
|
||||
isVararg = isVararg
|
||||
).apply {
|
||||
return buildJavaValueParameter {
|
||||
source = (this@toFirValueParameter as? JavaElementImpl<*>)?.psi?.toFirSourceElement()
|
||||
this.session = session
|
||||
name = this@toFirValueParameter.name ?: Name.identifier("p$index")
|
||||
returnTypeRef = type.toFirJavaTypeRef(session, javaTypeParameterStack)
|
||||
isVararg = this@toFirValueParameter.isVararg
|
||||
addAnnotationsFrom(session, this@toFirValueParameter, javaTypeParameterStack)
|
||||
}
|
||||
}
|
||||
@@ -257,13 +257,13 @@ private fun JavaAnnotationArgument.toFirExpression(
|
||||
is JavaLiteralAnnotationArgument -> {
|
||||
value.createConstant(session)
|
||||
}
|
||||
is JavaArrayAnnotationArgument -> FirArrayOfCallImpl(null).apply {
|
||||
is JavaArrayAnnotationArgument -> buildArrayOfCall {
|
||||
for (element in getElements()) {
|
||||
arguments += element.toFirExpression(session, javaTypeParameterStack)
|
||||
}
|
||||
}
|
||||
is JavaEnumValueAnnotationArgument -> {
|
||||
FirFunctionCallImpl(null).apply {
|
||||
buildFunctionCall {
|
||||
val classId = this@toFirExpression.enumClassId
|
||||
val entryName = this@toFirExpression.entryName
|
||||
val calleeReference = if (classId != null && entryName != null) {
|
||||
@@ -271,33 +271,36 @@ private fun JavaAnnotationArgument.toFirExpression(
|
||||
classId, entryName
|
||||
).firstOrNull()
|
||||
callableSymbol?.let {
|
||||
FirResolvedNamedReferenceImpl(null, entryName, it)
|
||||
buildResolvedNamedReference {
|
||||
name = entryName
|
||||
resolvedSymbol = it
|
||||
}
|
||||
}
|
||||
} else {
|
||||
null
|
||||
}
|
||||
this.calleeReference = calleeReference
|
||||
?: FirErrorNamedReferenceImpl(
|
||||
null, FirSimpleDiagnostic("Strange Java enum value: $classId.$entryName", DiagnosticKind.Java)
|
||||
)
|
||||
?: buildErrorNamedReference {
|
||||
diagnostic = FirSimpleDiagnostic("Strange Java enum value: $classId.$entryName", DiagnosticKind.Java)
|
||||
}
|
||||
}
|
||||
}
|
||||
is JavaClassObjectAnnotationArgument -> FirGetClassCallImpl(null).apply {
|
||||
is JavaClassObjectAnnotationArgument -> buildGetClassCall {
|
||||
val referencedType = getReferencedType()
|
||||
arguments += FirClassReferenceExpressionImpl(
|
||||
null, referencedType.toFirResolvedTypeRef(session, javaTypeParameterStack)
|
||||
)
|
||||
arguments += buildClassReferenceExpression {
|
||||
classTypeRef = referencedType.toFirResolvedTypeRef(session, javaTypeParameterStack)
|
||||
}
|
||||
}
|
||||
is JavaAnnotationAsAnnotationArgument -> getAnnotation().toFirAnnotationCall(session, javaTypeParameterStack)
|
||||
else -> FirErrorExpressionImpl(
|
||||
null, FirSimpleDiagnostic("Unknown JavaAnnotationArgument: ${this::class.java}", DiagnosticKind.Java)
|
||||
)
|
||||
else -> buildErrorExpression {
|
||||
diagnostic = FirSimpleDiagnostic("Unknown JavaAnnotationArgument: ${this::class.java}", DiagnosticKind.Java)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: use kind here
|
||||
private fun <T> List<T>.createArrayOfCall(session: FirSession, @Suppress("UNUSED_PARAMETER") kind: FirConstKind<T>): FirArrayOfCall {
|
||||
return FirArrayOfCallImpl(null).apply {
|
||||
return buildArrayOfCall {
|
||||
for (element in this@createArrayOfCall) {
|
||||
arguments += element.createConstant(session)
|
||||
}
|
||||
@@ -306,15 +309,15 @@ private fun <T> List<T>.createArrayOfCall(session: FirSession, @Suppress("UNUSED
|
||||
|
||||
internal fun Any?.createConstant(session: FirSession): FirExpression {
|
||||
return when (this) {
|
||||
is Byte -> FirConstExpressionImpl(null, FirConstKind.Byte, this)
|
||||
is Short -> FirConstExpressionImpl(null, FirConstKind.Short, this)
|
||||
is Int -> FirConstExpressionImpl(null, FirConstKind.Int, this)
|
||||
is Long -> FirConstExpressionImpl(null, FirConstKind.Long, this)
|
||||
is Char -> FirConstExpressionImpl(null, FirConstKind.Char, this)
|
||||
is Float -> FirConstExpressionImpl(null, FirConstKind.Float, this)
|
||||
is Double -> FirConstExpressionImpl(null, FirConstKind.Double, this)
|
||||
is Boolean -> FirConstExpressionImpl(null, FirConstKind.Boolean, this)
|
||||
is String -> FirConstExpressionImpl(null, FirConstKind.String, this)
|
||||
is Byte -> buildConstExpression(null, FirConstKind.Byte, this)
|
||||
is Short -> buildConstExpression(null, FirConstKind.Short, this)
|
||||
is Int -> buildConstExpression(null, FirConstKind.Int, this)
|
||||
is Long -> buildConstExpression(null, FirConstKind.Long, this)
|
||||
is Char -> buildConstExpression(null, FirConstKind.Char, this)
|
||||
is Float -> buildConstExpression(null, FirConstKind.Float, this)
|
||||
is Double -> buildConstExpression(null, FirConstKind.Double, this)
|
||||
is Boolean -> buildConstExpression(null, FirConstKind.Boolean, this)
|
||||
is String -> buildConstExpression(null, FirConstKind.String, this)
|
||||
is ByteArray -> toList().createArrayOfCall(session, FirConstKind.Byte)
|
||||
is ShortArray -> toList().createArrayOfCall(session, FirConstKind.Short)
|
||||
is IntArray -> toList().createArrayOfCall(session, FirConstKind.Int)
|
||||
@@ -323,11 +326,11 @@ internal fun Any?.createConstant(session: FirSession): FirExpression {
|
||||
is FloatArray -> toList().createArrayOfCall(session, FirConstKind.Float)
|
||||
is DoubleArray -> toList().createArrayOfCall(session, FirConstKind.Double)
|
||||
is BooleanArray -> toList().createArrayOfCall(session, FirConstKind.Boolean)
|
||||
null -> FirConstExpressionImpl(null, FirConstKind.Null, null)
|
||||
null -> buildConstExpression(null, FirConstKind.Null, null)
|
||||
|
||||
else -> FirErrorExpressionImpl(
|
||||
null, FirSimpleDiagnostic("Unknown value in JavaLiteralAnnotationArgument: $this", DiagnosticKind.Java)
|
||||
)
|
||||
else -> buildErrorExpression {
|
||||
diagnostic = FirSimpleDiagnostic("Unknown value in JavaLiteralAnnotationArgument: $this", DiagnosticKind.Java)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -335,8 +338,8 @@ private fun JavaType.toFirResolvedTypeRef(
|
||||
session: FirSession, javaTypeParameterStack: JavaTypeParameterStack
|
||||
): FirResolvedTypeRef {
|
||||
if (this is JavaClassifierType) return toFirResolvedTypeRef(session, javaTypeParameterStack)
|
||||
return FirResolvedTypeRefImpl(
|
||||
source = null, type = ConeClassErrorType("Unexpected JavaType: $this")
|
||||
)
|
||||
return buildResolvedTypeRef {
|
||||
type = ConeClassErrorType("Unexpected JavaType: $this")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,13 +8,14 @@ package org.jetbrains.kotlin.fir.java.declarations
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.FirImplementationDetail
|
||||
import org.jetbrains.kotlin.fir.FirPureAbstractElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.AbstractFirRegularClassBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableClass
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
@@ -27,38 +28,31 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||
import org.jetbrains.kotlin.fir.visitors.transformInplace
|
||||
import org.jetbrains.kotlin.fir.visitors.transformSingle
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
class FirJavaClass internal constructor(
|
||||
@UseExperimental(FirImplementationDetail::class)
|
||||
class FirJavaClass @FirImplementationDetail internal constructor(
|
||||
override val source: FirSourceElement?,
|
||||
override val session: FirSession,
|
||||
override val symbol: FirRegularClassSymbol,
|
||||
override var resolvePhase: FirResolvePhase,
|
||||
override val name: Name,
|
||||
visibility: Visibility,
|
||||
modality: Modality?,
|
||||
override val annotations: MutableList<FirAnnotationCall>,
|
||||
override var status: FirDeclarationStatus,
|
||||
override val classKind: ClassKind,
|
||||
isTopLevel: Boolean,
|
||||
isStatic: Boolean,
|
||||
override val declarations: MutableList<FirDeclaration>,
|
||||
override val scopeProvider: FirScopeProvider,
|
||||
override val symbol: FirRegularClassSymbol,
|
||||
override val superTypeRefs: MutableList<FirTypeRef>,
|
||||
override val typeParameters: MutableList<FirTypeParameter>,
|
||||
internal val javaTypeParameterStack: JavaTypeParameterStack,
|
||||
internal val existingNestedClassifierNames: List<Name>
|
||||
) : FirPureAbstractElement(), FirRegularClass, FirModifiableClass<FirRegularClass> {
|
||||
override var status: FirDeclarationStatusImpl = FirDeclarationStatusImpl(visibility, modality)
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||
override val hasLazyNestedClassifiers: Boolean get() = true
|
||||
|
||||
init {
|
||||
symbol.bind(this)
|
||||
status.isInner = !isTopLevel && !isStatic
|
||||
status.isCompanion = false
|
||||
status.isData = false
|
||||
status.isInline = false
|
||||
}
|
||||
|
||||
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
|
||||
override val superTypeRefs = mutableListOf<FirTypeRef>()
|
||||
|
||||
override val declarations = mutableListOf<FirDeclaration>()
|
||||
|
||||
override val companionObject: FirRegularClass?
|
||||
get() = null
|
||||
@@ -94,3 +88,74 @@ class FirJavaClass internal constructor(
|
||||
return this
|
||||
}
|
||||
}
|
||||
|
||||
@FirBuilderDsl
|
||||
internal class FirJavaClassBuilder : AbstractFirRegularClassBuilder, FirAnnotationContainerBuilder {
|
||||
lateinit var visibility: Visibility
|
||||
var modality: Modality? = null
|
||||
var isTopLevel: Boolean by Delegates.notNull()
|
||||
var isStatic: Boolean by Delegates.notNull()
|
||||
var isNotSam: Boolean by Delegates.notNull()
|
||||
lateinit var javaTypeParameterStack: JavaTypeParameterStack
|
||||
val existingNestedClassifierNames: MutableList<Name> = mutableListOf()
|
||||
|
||||
override var source: FirSourceElement? = null
|
||||
override lateinit var session: FirSession
|
||||
override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||
override lateinit var name: Name
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||
override lateinit var status: FirDeclarationStatus
|
||||
override lateinit var classKind: ClassKind
|
||||
override val declarations: MutableList<FirDeclaration> = mutableListOf()
|
||||
override lateinit var scopeProvider: FirScopeProvider
|
||||
override lateinit var symbol: FirRegularClassSymbol
|
||||
|
||||
override val superTypeRefs: MutableList<FirTypeRef> = mutableListOf()
|
||||
|
||||
@UseExperimental(FirImplementationDetail::class)
|
||||
override fun build(): FirJavaClass {
|
||||
val status = FirDeclarationStatusImpl(visibility, modality).apply {
|
||||
isInner = !isTopLevel && !isStatic
|
||||
isCompanion = false
|
||||
isData = false
|
||||
isInline = false
|
||||
isNotSAM = this@FirJavaClassBuilder.isNotSam
|
||||
}
|
||||
|
||||
return FirJavaClass(
|
||||
source,
|
||||
session,
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES,
|
||||
name,
|
||||
annotations,
|
||||
status,
|
||||
classKind,
|
||||
declarations,
|
||||
scopeProvider,
|
||||
symbol,
|
||||
superTypeRefs,
|
||||
typeParameters,
|
||||
javaTypeParameterStack,
|
||||
existingNestedClassifierNames
|
||||
)
|
||||
}
|
||||
|
||||
@Deprecated("Modification of 'hasLazyNestedClassifiers' has no impact for FirClassImplBuilder", level = DeprecationLevel.HIDDEN)
|
||||
override var companionObject: FirRegularClass?
|
||||
get() = throw IllegalStateException()
|
||||
set(value) {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
|
||||
@Deprecated("Modification of 'hasLazyNestedClassifiers' has no impact for FirClassImplBuilder", level = DeprecationLevel.HIDDEN)
|
||||
override var hasLazyNestedClassifiers: Boolean
|
||||
get() = throw IllegalStateException()
|
||||
set(value) {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
}
|
||||
|
||||
internal inline fun buildJavaClass(init: FirJavaClassBuilder.() -> Unit): FirJavaClass {
|
||||
return FirJavaClassBuilder().apply(init).build()
|
||||
}
|
||||
+87
-28
@@ -7,16 +7,14 @@ package org.jetbrains.kotlin.fir.java.declarations
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.CONSTRUCTOR_NAME
|
||||
import org.jetbrains.kotlin.fir.FirPureAbstractElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirConstructorBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
|
||||
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
|
||||
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReference
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||
@@ -25,30 +23,23 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||
import org.jetbrains.kotlin.fir.visitors.transformInplace
|
||||
import org.jetbrains.kotlin.fir.visitors.transformSingle
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
class FirJavaConstructor(
|
||||
@UseExperimental(FirImplementationDetail::class)
|
||||
class FirJavaConstructor @FirImplementationDetail constructor(
|
||||
override val source: FirSourceElement?,
|
||||
override val session: FirSession,
|
||||
override val symbol: FirConstructorSymbol,
|
||||
visibility: Visibility,
|
||||
override val isPrimary: Boolean,
|
||||
isInner: Boolean,
|
||||
override var returnTypeRef : FirTypeRef
|
||||
) : FirPureAbstractElement(), FirAbstractAnnotatedElement, FirConstructor {
|
||||
override var returnTypeRef: FirTypeRef,
|
||||
override val valueParameters: MutableList<FirValueParameter>,
|
||||
override val typeParameters: MutableList<FirTypeParameter>,
|
||||
override val annotations: MutableList<FirAnnotationCall>,
|
||||
override var status: FirDeclarationStatus,
|
||||
override var resolvePhase: FirResolvePhase,
|
||||
) : FirPureAbstractElement(), FirConstructor {
|
||||
override val receiverTypeRef: FirTypeRef? get() = null
|
||||
override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
|
||||
override var status: FirDeclarationStatus = FirDeclarationStatusImpl(visibility, Modality.FINAL).apply {
|
||||
isExpect = false
|
||||
isActual = false
|
||||
isOverride = false
|
||||
this.isInner = isInner
|
||||
}
|
||||
|
||||
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
|
||||
init {
|
||||
symbol.bind(this)
|
||||
@@ -60,9 +51,7 @@ class FirJavaConstructor(
|
||||
override val body: FirBlock?
|
||||
get() = null
|
||||
|
||||
override val valueParameters = mutableListOf<FirValueParameter>()
|
||||
|
||||
override val controlFlowGraphReference: FirControlFlowGraphReference get() = FirEmptyControlFlowGraphReference()
|
||||
override val controlFlowGraphReference: FirControlFlowGraphReference get() = FirEmptyControlFlowGraphReference
|
||||
|
||||
override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirJavaConstructor {
|
||||
valueParameters.transformInplace(transformer, data)
|
||||
@@ -116,10 +105,80 @@ class FirJavaConstructor(
|
||||
returnTypeRef = newReturnTypeRef
|
||||
}
|
||||
|
||||
override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) {}
|
||||
|
||||
override fun replaceValueParameters(newValueParameters: List<FirValueParameter>) {
|
||||
valueParameters.clear()
|
||||
valueParameters.addAll(newValueParameters)
|
||||
valueParameters += newValueParameters
|
||||
}
|
||||
|
||||
override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) {}
|
||||
}
|
||||
|
||||
@FirBuilderDsl
|
||||
class FirJavaConstructorBuilder : FirConstructorBuilder() {
|
||||
lateinit var visibility: Visibility
|
||||
var isInner: Boolean by Delegates.notNull()
|
||||
var isPrimary: Boolean by Delegates.notNull()
|
||||
|
||||
@UseExperimental(FirImplementationDetail::class)
|
||||
override fun build(): FirJavaConstructor {
|
||||
val status = FirDeclarationStatusImpl(visibility, Modality.FINAL).apply {
|
||||
isExpect = false
|
||||
isActual = false
|
||||
isOverride = false
|
||||
isInner = this@FirJavaConstructorBuilder.isInner
|
||||
}
|
||||
|
||||
return FirJavaConstructor(
|
||||
source,
|
||||
session,
|
||||
symbol,
|
||||
isPrimary,
|
||||
returnTypeRef,
|
||||
valueParameters,
|
||||
typeParameters,
|
||||
annotations,
|
||||
status,
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
)
|
||||
}
|
||||
|
||||
@Deprecated("Modification of 'body' has no impact for FirJavaConstructorBuilder", level = DeprecationLevel.HIDDEN)
|
||||
override var body: FirBlock?
|
||||
get() = throw IllegalStateException()
|
||||
set(value) {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
|
||||
@Deprecated("Modification of 'delegatedConstructor' has no impact for FirJavaConstructorBuilder", level = DeprecationLevel.HIDDEN)
|
||||
override var delegatedConstructor: FirDelegatedConstructorCall?
|
||||
get() = throw IllegalStateException()
|
||||
set(value) {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
|
||||
@Deprecated("Modification of 'resolvePhase' has no impact for FirJavaConstructorBuilder", level = DeprecationLevel.HIDDEN)
|
||||
override var resolvePhase: FirResolvePhase
|
||||
get() = throw IllegalStateException()
|
||||
set(value) {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
|
||||
@Deprecated("Modification of 'status' has no impact for FirJavaConstructorBuilder", level = DeprecationLevel.HIDDEN)
|
||||
override var status: FirDeclarationStatus
|
||||
get() = throw IllegalStateException()
|
||||
set(value) {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
|
||||
@Deprecated("Modification of 'receiverTypeRef' has no impact for FirJavaConstructorBuilder", level = DeprecationLevel.HIDDEN)
|
||||
override var receiverTypeRef: FirTypeRef?
|
||||
get() = throw IllegalStateException()
|
||||
set(value) {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
}
|
||||
|
||||
inline fun buildJavaConstructor(init: FirJavaConstructorBuilder.() -> Unit): FirJavaConstructor {
|
||||
return FirJavaConstructorBuilder().apply(init).build()
|
||||
}
|
||||
|
||||
|
||||
@@ -7,13 +7,15 @@ package org.jetbrains.kotlin.fir.java.declarations
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.FirImplementationDetail
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirFieldBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
@@ -23,35 +25,32 @@ import org.jetbrains.kotlin.fir.visitors.transformInplace
|
||||
import org.jetbrains.kotlin.fir.visitors.transformSingle
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||
import kotlin.contracts.ExperimentalContracts
|
||||
import kotlin.contracts.InvocationKind
|
||||
import kotlin.contracts.contract
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
class FirJavaField(
|
||||
@UseExperimental(FirImplementationDetail::class)
|
||||
class FirJavaField @FirImplementationDetail constructor(
|
||||
override val source: FirSourceElement?,
|
||||
override val session: FirSession,
|
||||
override val symbol: FirFieldSymbol,
|
||||
override val name: Name,
|
||||
visibility: Visibility,
|
||||
modality: Modality?,
|
||||
override var resolvePhase: FirResolvePhase,
|
||||
override var returnTypeRef: FirTypeRef,
|
||||
override var status: FirDeclarationStatus,
|
||||
override val isVar: Boolean,
|
||||
isStatic: Boolean
|
||||
) : FirAbstractAnnotatedElement, FirField() {
|
||||
override val annotations: MutableList<FirAnnotationCall>,
|
||||
override val typeParameters: MutableList<FirTypeParameter>,
|
||||
) : FirField() {
|
||||
init {
|
||||
symbol.bind(this)
|
||||
}
|
||||
|
||||
override var status: FirDeclarationStatus = FirDeclarationStatusImpl(visibility, modality).apply {
|
||||
this.isStatic = isStatic
|
||||
isExpect = false
|
||||
isActual = false
|
||||
isOverride = false
|
||||
}
|
||||
override val receiverTypeRef: FirTypeRef? get() = null
|
||||
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
override val isVal: Boolean = true
|
||||
override val isVal: Boolean get() = !isVar
|
||||
override val getter: FirPropertyAccessor? get() = null
|
||||
override val setter: FirPropertyAccessor? get() = null
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||
|
||||
override fun <D> transformReturnTypeRef(transformer: FirTransformer<D>, data: D): FirField {
|
||||
returnTypeRef = returnTypeRef.transformSingle(transformer, data)
|
||||
@@ -118,3 +117,43 @@ class FirJavaField(
|
||||
|
||||
override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) {}
|
||||
}
|
||||
|
||||
@FirBuilderDsl
|
||||
internal class FirJavaFieldBuilder : FirFieldBuilder() {
|
||||
var modality: Modality? = null
|
||||
lateinit var visibility: Visibility
|
||||
var isStatic: Boolean by Delegates.notNull()
|
||||
|
||||
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
|
||||
@UseExperimental(FirImplementationDetail::class)
|
||||
override fun build(): FirJavaField {
|
||||
val status: FirDeclarationStatus = FirDeclarationStatusImpl(visibility, modality).apply {
|
||||
isStatic = this@FirJavaFieldBuilder.isStatic
|
||||
isExpect = false
|
||||
isActual = false
|
||||
isOverride = false
|
||||
}
|
||||
|
||||
return FirJavaField(
|
||||
source,
|
||||
session,
|
||||
symbol as FirFieldSymbol,
|
||||
name,
|
||||
resolvePhase,
|
||||
returnTypeRef,
|
||||
status,
|
||||
isVar,
|
||||
annotations,
|
||||
typeParameters
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@UseExperimental(ExperimentalContracts::class)
|
||||
internal inline fun buildJavaField(init: FirJavaFieldBuilder.() -> Unit): FirJavaField {
|
||||
contract {
|
||||
callsInPlace(init, InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
return FirJavaFieldBuilder().apply(init).build()
|
||||
}
|
||||
|
||||
@@ -7,45 +7,94 @@ package org.jetbrains.kotlin.fir.java.declarations
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.FirImplementationDetail
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
class FirJavaMethod(
|
||||
session: FirSession,
|
||||
@UseExperimental(FirImplementationDetail::class)
|
||||
class FirJavaMethod @FirImplementationDetail constructor(
|
||||
source: FirSourceElement?,
|
||||
symbol: FirNamedFunctionSymbol,
|
||||
session: FirSession,
|
||||
resolvePhase: FirResolvePhase,
|
||||
returnTypeRef: FirTypeRef,
|
||||
receiverTypeRef: FirTypeRef?,
|
||||
typeParameters: MutableList<FirTypeParameter>,
|
||||
valueParameters: MutableList<FirValueParameter>,
|
||||
body: FirBlock?,
|
||||
name: Name,
|
||||
visibility: Visibility,
|
||||
modality: Modality?,
|
||||
returnTypeRef: FirJavaTypeRef,
|
||||
isStatic: Boolean
|
||||
status: FirDeclarationStatus,
|
||||
containerSource: DeserializedContainerSource?,
|
||||
symbol: FirFunctionSymbol<FirSimpleFunction>,
|
||||
annotations: MutableList<FirAnnotationCall>,
|
||||
) : FirSimpleFunctionImpl(
|
||||
source,
|
||||
session,
|
||||
resolvePhase,
|
||||
returnTypeRef,
|
||||
null,
|
||||
FirDeclarationStatusImpl(visibility, modality).apply {
|
||||
this.isStatic = isStatic
|
||||
isExpect = false
|
||||
isActual = false
|
||||
isOverride = false
|
||||
isOperator = true // All Java methods with name that allows to use it in operator form are considered operators
|
||||
isInfix = false
|
||||
isInline = false
|
||||
isTailRec = false
|
||||
isExternal = false
|
||||
isSuspend = false
|
||||
},
|
||||
receiverTypeRef,
|
||||
typeParameters,
|
||||
valueParameters,
|
||||
body,
|
||||
status,
|
||||
containerSource,
|
||||
name,
|
||||
symbol
|
||||
) {
|
||||
init {
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
symbol,
|
||||
annotations,
|
||||
)
|
||||
|
||||
@FirBuilderDsl
|
||||
class FirJavaMethodBuilder : FirSimpleFunctionBuilder() {
|
||||
lateinit var visibility: Visibility
|
||||
var modality: Modality? = null
|
||||
var isStatic: Boolean by Delegates.notNull()
|
||||
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
|
||||
@UseExperimental(FirImplementationDetail::class)
|
||||
override fun build(): FirJavaMethod {
|
||||
val status = FirDeclarationStatusImpl(visibility, modality).apply {
|
||||
isStatic = this@FirJavaMethodBuilder.isStatic
|
||||
isExpect = false
|
||||
isActual = false
|
||||
isOverride = false
|
||||
isOperator = true // All Java methods with name that allows to use it in operator form are considered operators
|
||||
isInfix = false
|
||||
isInline = false
|
||||
isTailRec = false
|
||||
isExternal = false
|
||||
isSuspend = false
|
||||
}
|
||||
|
||||
return FirJavaMethod(
|
||||
source,
|
||||
session,
|
||||
resolvePhase,
|
||||
returnTypeRef as FirJavaTypeRef,
|
||||
receiverTypeRef = null,
|
||||
typeParameters,
|
||||
valueParameters,
|
||||
body,
|
||||
name,
|
||||
status,
|
||||
containerSource,
|
||||
symbol,
|
||||
annotations,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
inline fun buildJavaMethod(init: FirJavaMethodBuilder.() -> Unit): FirJavaMethod {
|
||||
return FirJavaMethodBuilder().apply(init).build()
|
||||
}
|
||||
+84
-13
@@ -5,32 +5,103 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.java.declarations
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirImplementationDetail
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirValueParameterBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirJavaValueParameter(
|
||||
session: FirSession,
|
||||
@UseExperimental(FirImplementationDetail::class)
|
||||
class FirJavaValueParameter @FirImplementationDetail constructor(
|
||||
source: FirSourceElement?,
|
||||
session: FirSession,
|
||||
resolvePhase: FirResolvePhase,
|
||||
returnTypeRef: FirTypeRef,
|
||||
name: Name,
|
||||
returnTypeRef: FirJavaTypeRef,
|
||||
isVararg: Boolean
|
||||
symbol: FirVariableSymbol<FirValueParameter>,
|
||||
annotations: MutableList<FirAnnotationCall>,
|
||||
defaultValue: FirExpression?,
|
||||
isCrossinline: Boolean,
|
||||
isNoinline: Boolean,
|
||||
isVararg: Boolean,
|
||||
) : FirValueParameterImpl(
|
||||
source,
|
||||
session,
|
||||
resolvePhase,
|
||||
returnTypeRef,
|
||||
name,
|
||||
FirVariableSymbol(name),
|
||||
defaultValue = null,
|
||||
isCrossinline = false,
|
||||
isNoinline = false,
|
||||
isVararg = isVararg
|
||||
) {
|
||||
init {
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
symbol,
|
||||
annotations,
|
||||
defaultValue,
|
||||
isCrossinline,
|
||||
isNoinline,
|
||||
isVararg,
|
||||
)
|
||||
|
||||
@FirBuilderDsl
|
||||
class FirJavaValueParameterBuilder : FirValueParameterBuilder() {
|
||||
@UseExperimental(FirImplementationDetail::class)
|
||||
override fun build(): FirJavaValueParameter {
|
||||
return FirJavaValueParameter(
|
||||
source,
|
||||
session,
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES,
|
||||
returnTypeRef,
|
||||
name,
|
||||
symbol = FirVariableSymbol(name),
|
||||
annotations,
|
||||
defaultValue = null,
|
||||
isCrossinline = false,
|
||||
isNoinline = false,
|
||||
isVararg,
|
||||
)
|
||||
}
|
||||
|
||||
@Deprecated("Modification of 'resolvePhase' has no impact for FirJavaValueParameterBuilder", level = DeprecationLevel.HIDDEN)
|
||||
override var resolvePhase: FirResolvePhase
|
||||
get() = throw IllegalStateException()
|
||||
set(value) {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
|
||||
@Deprecated("Modification of '' has no impact for FirJavaValueParameterBuilder", level = DeprecationLevel.HIDDEN)
|
||||
override var symbol: FirVariableSymbol<FirValueParameter>
|
||||
get() = throw IllegalStateException()
|
||||
set(value) {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
|
||||
@Deprecated("Modification of 'defaultValue' has no impact for FirJavaValueParameterBuilder", level = DeprecationLevel.HIDDEN)
|
||||
override var defaultValue: FirExpression?
|
||||
get() = throw IllegalStateException()
|
||||
set(value) {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
|
||||
@Deprecated("Modification of 'isCrossinline' has no impact for FirJavaValueParameterBuilder", level = DeprecationLevel.HIDDEN)
|
||||
override var isCrossinline: Boolean
|
||||
get() = throw IllegalStateException()
|
||||
set(value) {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
|
||||
@Deprecated("Modification of 'isNoinline' has no impact for FirJavaValueParameterBuilder", level = DeprecationLevel.HIDDEN)
|
||||
override var isNoinline: Boolean
|
||||
get() = throw IllegalStateException()
|
||||
set(value) {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
inline fun buildJavaValueParameter(init: FirJavaValueParameterBuilder.() -> Unit): FirJavaValueParameter {
|
||||
return FirJavaValueParameterBuilder().apply(init).build()
|
||||
}
|
||||
+60
-56
@@ -9,9 +9,11 @@ import com.intellij.openapi.progress.ProcessCanceledException
|
||||
import com.intellij.openapi.project.Project
|
||||
import org.jetbrains.kotlin.descriptors.SourceElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirVariable
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirPropertyImpl
|
||||
import org.jetbrains.kotlin.fir.deserialization.FirDeserializationContext
|
||||
import org.jetbrains.kotlin.fir.deserialization.deserializeClassToSymbol
|
||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||
@@ -19,21 +21,20 @@ import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirClassReferenceExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.*
|
||||
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.java.createConstant
|
||||
import org.jetbrains.kotlin.fir.java.topLevelName
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.resolve.*
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.load.java.JavaClassFinder
|
||||
import org.jetbrains.kotlin.load.java.structure.JavaClass
|
||||
import org.jetbrains.kotlin.load.kotlin.*
|
||||
@@ -61,7 +62,7 @@ class KotlinDeserializedJvmSymbolsProvider(
|
||||
private val javaSymbolProvider: JavaSymbolProvider,
|
||||
private val kotlinClassFinder: KotlinClassFinder,
|
||||
private val javaClassFinder: JavaClassFinder,
|
||||
private val kotlinScopeProvider: KotlinScopeProvider
|
||||
private val kotlinScopeProvider: KotlinScopeProvider,
|
||||
) : AbstractFirSymbolProvider<FirClassLikeSymbol<*>>() {
|
||||
private val classesCache = HashMap<ClassId, FirRegularClassSymbol>()
|
||||
private val typeAliasCache = HashMap<ClassId, FirTypeAliasSymbol?>()
|
||||
@@ -72,7 +73,7 @@ class KotlinDeserializedJvmSymbolsProvider(
|
||||
private class PackagePartsCacheData(
|
||||
val proto: ProtoBuf.Package,
|
||||
val context: FirDeserializationContext,
|
||||
val source: JvmPackagePartSource
|
||||
val source: JvmPackagePartSource,
|
||||
) {
|
||||
val topLevelFunctionNameIndex by lazy {
|
||||
proto.functionList.withIndex()
|
||||
@@ -113,16 +114,16 @@ class KotlinDeserializedJvmSymbolsProvider(
|
||||
|
||||
val source = JvmPackagePartSource(
|
||||
kotlinJvmBinaryClass, packageProto, nameResolver,
|
||||
kotlinJvmBinaryClass.incompatibility, kotlinJvmBinaryClass.isPreReleaseInvisible
|
||||
kotlinJvmBinaryClass.incompatibility, kotlinJvmBinaryClass.isPreReleaseInvisible,
|
||||
)
|
||||
|
||||
PackagePartsCacheData(
|
||||
packageProto,
|
||||
FirDeserializationContext.createForPackage(
|
||||
packageFqName, packageProto, nameResolver, session,
|
||||
JvmBinaryAnnotationDeserializer(session)
|
||||
JvmBinaryAnnotationDeserializer(session),
|
||||
),
|
||||
source
|
||||
source,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -142,7 +143,7 @@ class KotlinDeserializedJvmSymbolsProvider(
|
||||
}
|
||||
|
||||
private fun findAndDeserializeTypeAlias(
|
||||
classId: ClassId
|
||||
classId: ClassId,
|
||||
): FirTypeAliasSymbol? {
|
||||
if (!classId.relativeClassName.isOneSegmentFQN()) return null
|
||||
return typeAliasCache.getOrPutNullable(classId) {
|
||||
@@ -164,15 +165,15 @@ class KotlinDeserializedJvmSymbolsProvider(
|
||||
|
||||
private fun FirClassifierSymbol<*>?.toDefaultResolvedTypeRef(classId: ClassId): FirResolvedTypeRef {
|
||||
return this?.let {
|
||||
FirResolvedTypeRefImpl(
|
||||
null, it.constructType(emptyList(), isNullable = false)
|
||||
)
|
||||
} ?: FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Symbol not found for $classId", DiagnosticKind.Java))
|
||||
buildResolvedTypeRef {
|
||||
type = it.constructType(emptyList(), isNullable = false)
|
||||
}
|
||||
} ?: buildErrorTypeRef { diagnostic = FirSimpleDiagnostic("Symbol not found for $classId", DiagnosticKind.Java) }
|
||||
|
||||
}
|
||||
|
||||
private fun loadAnnotation(
|
||||
annotationClassId: ClassId, result: MutableList<FirAnnotationCall>
|
||||
annotationClassId: ClassId, result: MutableList<FirAnnotationCall>,
|
||||
): KotlinJvmBinaryClass.AnnotationArgumentVisitor? {
|
||||
val lookupTag = ConeClassLikeLookupTagImpl(annotationClassId)
|
||||
val symbol = lookupTag.toSymbol(session)
|
||||
@@ -189,39 +190,39 @@ class KotlinDeserializedJvmSymbolsProvider(
|
||||
private fun ClassLiteralValue.toFirClassReferenceExpression(): FirClassReferenceExpression {
|
||||
val literalLookupTag = ConeClassLikeLookupTagImpl(classId)
|
||||
val literalSymbol = literalLookupTag.toSymbol(this@KotlinDeserializedJvmSymbolsProvider.session)
|
||||
return FirClassReferenceExpressionImpl(
|
||||
null,
|
||||
literalSymbol.toDefaultResolvedTypeRef(classId)
|
||||
)
|
||||
return buildClassReferenceExpression {
|
||||
classTypeRef = literalSymbol.toDefaultResolvedTypeRef(classId)
|
||||
}
|
||||
}
|
||||
|
||||
private fun ClassId.toEnumEntryReferenceExpression(name: Name): FirExpression {
|
||||
return FirFunctionCallImpl(null).apply {
|
||||
return buildFunctionCall {
|
||||
val entryCallableSymbol =
|
||||
this@KotlinDeserializedJvmSymbolsProvider.session.firSymbolProvider.getClassDeclaredCallableSymbols(
|
||||
this@toEnumEntryReferenceExpression, name
|
||||
this@toEnumEntryReferenceExpression, name,
|
||||
).firstOrNull()
|
||||
|
||||
this.calleeReference = when {
|
||||
calleeReference = when {
|
||||
entryCallableSymbol != null -> {
|
||||
FirResolvedNamedReferenceImpl(
|
||||
null, name, entryCallableSymbol
|
||||
)
|
||||
buildResolvedNamedReference {
|
||||
this.name = name
|
||||
resolvedSymbol = entryCallableSymbol
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
FirErrorNamedReferenceImpl(
|
||||
null,
|
||||
FirSimpleDiagnostic(
|
||||
"Strange deserialized enum value: ${this@toEnumEntryReferenceExpression}.$name", DiagnosticKind.Java
|
||||
buildErrorNamedReference {
|
||||
diagnostic = FirSimpleDiagnostic(
|
||||
"Strange deserialized enum value: ${this@toEnumEntryReferenceExpression}.$name",
|
||||
DiagnosticKind.Java,
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitClassLiteral(name: Name, value: ClassLiteralValue) {
|
||||
argumentMap[name] = FirGetClassCallImpl(null).apply {
|
||||
argumentMap[name] = buildGetClassCall {
|
||||
arguments += value.toFirClassReferenceExpression()
|
||||
}
|
||||
}
|
||||
@@ -247,7 +248,7 @@ class KotlinDeserializedJvmSymbolsProvider(
|
||||
}
|
||||
|
||||
override fun visitEnd() {
|
||||
argumentMap[name] = FirArrayOfCallImpl(null).apply {
|
||||
argumentMap[name] = buildArrayOfCall {
|
||||
arguments += elements
|
||||
}
|
||||
}
|
||||
@@ -266,11 +267,14 @@ class KotlinDeserializedJvmSymbolsProvider(
|
||||
}
|
||||
|
||||
override fun visitEnd() {
|
||||
result += FirAnnotationCallImpl(null, null, symbol.toDefaultResolvedTypeRef(annotationClassId)).apply {
|
||||
result += buildAnnotationCall {
|
||||
annotationTypeRef = symbol.toDefaultResolvedTypeRef(annotationClassId)
|
||||
for ((name, expression) in argumentMap) {
|
||||
arguments += FirNamedArgumentExpressionImpl(
|
||||
null, expression, false, name
|
||||
)
|
||||
arguments += buildNamedArgumentExpression {
|
||||
this.expression = expression
|
||||
this.name = name
|
||||
isSpread = false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -282,7 +286,7 @@ class KotlinDeserializedJvmSymbolsProvider(
|
||||
}
|
||||
|
||||
private fun loadAnnotationIfNotSpecial(
|
||||
annotationClassId: ClassId, result: MutableList<FirAnnotationCall>
|
||||
annotationClassId: ClassId, result: MutableList<FirAnnotationCall>,
|
||||
): KotlinJvmBinaryClass.AnnotationArgumentVisitor? {
|
||||
if (annotationClassId in AbstractBinaryClassAnnotationAndConstantLoader.SPECIAL_ANNOTATIONS) return null
|
||||
return loadAnnotation(annotationClassId, result)
|
||||
@@ -290,7 +294,7 @@ class KotlinDeserializedJvmSymbolsProvider(
|
||||
|
||||
private fun findAndDeserializeClass(
|
||||
classId: ClassId,
|
||||
parentContext: FirDeserializationContext? = null
|
||||
parentContext: FirDeserializationContext? = null,
|
||||
): FirRegularClassSymbol? {
|
||||
if (hasNoTopLevelClassOf(classId)) return null
|
||||
if (classesCache.containsKey(classId)) return classesCache[classId]
|
||||
@@ -326,34 +330,35 @@ class KotlinDeserializedJvmSymbolsProvider(
|
||||
classId, classProto, symbol, nameResolver, session,
|
||||
JvmBinaryAnnotationDeserializer(session),
|
||||
kotlinScopeProvider,
|
||||
parentContext, this::findAndDeserializeClass
|
||||
parentContext, this::findAndDeserializeClass,
|
||||
)
|
||||
|
||||
classesCache[classId] = symbol
|
||||
val annotations = mutableListOf<FirAnnotationCall>()
|
||||
kotlinJvmBinaryClass.loadClassAnnotations(object : KotlinJvmBinaryClass.AnnotationVisitor {
|
||||
override fun visitAnnotation(classId: ClassId, source: SourceElement): KotlinJvmBinaryClass.AnnotationArgumentVisitor? {
|
||||
return loadAnnotationIfNotSpecial(classId, annotations)
|
||||
}
|
||||
kotlinJvmBinaryClass.loadClassAnnotations(
|
||||
object : KotlinJvmBinaryClass.AnnotationVisitor {
|
||||
override fun visitAnnotation(classId: ClassId, source: SourceElement): KotlinJvmBinaryClass.AnnotationArgumentVisitor? {
|
||||
return loadAnnotationIfNotSpecial(classId, annotations)
|
||||
}
|
||||
|
||||
override fun visitEnd() {
|
||||
}
|
||||
override fun visitEnd() {
|
||||
}
|
||||
|
||||
|
||||
}, null)
|
||||
(symbol.fir as FirAbstractAnnotatedElement).annotations += annotations
|
||||
},
|
||||
null,
|
||||
)
|
||||
(symbol.fir.annotations as MutableList<FirAnnotationCall>) += annotations
|
||||
}
|
||||
|
||||
return classesCache[classId]
|
||||
// }
|
||||
}
|
||||
|
||||
private fun loadFunctionsByName(part: PackagePartsCacheData, name: Name): List<FirCallableSymbol<*>> {
|
||||
val functionIds = part.topLevelFunctionNameIndex[name] ?: return emptyList()
|
||||
return functionIds.map { part.proto.getFunction(it) }
|
||||
.map {
|
||||
val firNamedFunction = part.context.memberDeserializer.loadFunction(it) as FirSimpleFunctionImpl
|
||||
firNamedFunction.containerSource = part.source
|
||||
val firNamedFunction = part.context.memberDeserializer.loadFunction(it, containerSource = part.source) as FirSimpleFunctionImpl
|
||||
firNamedFunction.symbol
|
||||
}
|
||||
}
|
||||
@@ -362,8 +367,7 @@ class KotlinDeserializedJvmSymbolsProvider(
|
||||
val propertyIds = part.topLevelPropertyNameIndex[name] ?: return emptyList()
|
||||
return propertyIds.map { part.proto.getProperty(it) }
|
||||
.map {
|
||||
val firProperty = part.context.memberDeserializer.loadProperty(it) as FirPropertyImpl
|
||||
firProperty.containerSource = part.source
|
||||
val firProperty = part.context.memberDeserializer.loadProperty(it, containerSource = part.source)
|
||||
firProperty.symbol
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,14 +11,14 @@ import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirConstExpressionImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirQualifiedAccessExpressionImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildQualifiedAccessExpression
|
||||
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
|
||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
|
||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaField
|
||||
import org.jetbrains.kotlin.fir.java.toConeProjection
|
||||
import org.jetbrains.kotlin.fir.java.toNotNullConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.resolve.*
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
@@ -29,7 +29,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.typeContext
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
|
||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.DEFAULT_NULL_FQ_NAME
|
||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.DEFAULT_VALUE_FQ_NAME
|
||||
@@ -111,7 +111,8 @@ private fun JavaType?.enhancePossiblyFlexible(
|
||||
}
|
||||
}
|
||||
|
||||
return FirResolvedTypeRefImpl(source = null, type = enhanced).apply {
|
||||
return buildResolvedTypeRef {
|
||||
this.type = enhanced
|
||||
this.annotations += annotations
|
||||
}
|
||||
}
|
||||
@@ -361,19 +362,21 @@ internal fun ConeKotlinType.lexicalCastFrom(session: FirSession, value: String):
|
||||
val name = Name.identifier(value)
|
||||
val firEnumEntry = firElement.collectEnumEntries().find { it.name == name }
|
||||
|
||||
return if (firEnumEntry != null) FirQualifiedAccessExpressionImpl(null).apply {
|
||||
calleeReference = FirResolvedNamedReferenceImpl(
|
||||
null, name, firEnumEntry.symbol
|
||||
)
|
||||
return if (firEnumEntry != null) buildQualifiedAccessExpression {
|
||||
calleeReference = buildResolvedNamedReference {
|
||||
this.name = name
|
||||
resolvedSymbol = firEnumEntry.symbol
|
||||
}
|
||||
} else if (firElement is FirJavaClass) {
|
||||
val firStaticProperty = firElement.declarations.filterIsInstance<FirJavaField>().find {
|
||||
it.isStatic && it.modality == Modality.FINAL && it.name == name
|
||||
}
|
||||
if (firStaticProperty != null) {
|
||||
FirQualifiedAccessExpressionImpl(null).apply {
|
||||
calleeReference = FirResolvedNamedReferenceImpl(
|
||||
null, name, firStaticProperty.symbol as FirCallableSymbol<*>
|
||||
)
|
||||
buildQualifiedAccessExpression {
|
||||
calleeReference = buildResolvedNamedReference {
|
||||
this.name = name
|
||||
resolvedSymbol = firStaticProperty.symbol as FirCallableSymbol<*>
|
||||
}
|
||||
}
|
||||
} else null
|
||||
} else null
|
||||
@@ -385,15 +388,15 @@ internal fun ConeKotlinType.lexicalCastFrom(session: FirSession, value: String):
|
||||
|
||||
val (number, radix) = extractRadix(value)
|
||||
return when (classId.relativeClassName.asString()) {
|
||||
"Boolean" -> FirConstExpressionImpl(null, FirConstKind.Boolean, value.toBoolean())
|
||||
"Char" -> FirConstExpressionImpl(null, FirConstKind.Char, value.singleOrNull() ?: return null)
|
||||
"Byte" -> FirConstExpressionImpl(null, FirConstKind.Byte, number.toByteOrNull(radix) ?: return null)
|
||||
"Short" -> FirConstExpressionImpl(null, FirConstKind.Short, number.toShortOrNull(radix) ?: return null)
|
||||
"Int" -> FirConstExpressionImpl(null, FirConstKind.Int, number.toIntOrNull(radix) ?: return null)
|
||||
"Long" -> FirConstExpressionImpl(null, FirConstKind.Long, number.toLongOrNull(radix) ?: return null)
|
||||
"Float" -> FirConstExpressionImpl(null, FirConstKind.Float, value.toFloatOrNull() ?: return null)
|
||||
"Double" -> FirConstExpressionImpl(null, FirConstKind.Double, value.toDoubleOrNull() ?: return null)
|
||||
"String" -> FirConstExpressionImpl(null, FirConstKind.String, value)
|
||||
"Boolean" -> buildConstExpression(null, FirConstKind.Boolean, value.toBoolean())
|
||||
"Char" -> buildConstExpression(null, FirConstKind.Char, value.singleOrNull() ?: return null)
|
||||
"Byte" -> buildConstExpression(null, FirConstKind.Byte, number.toByteOrNull(radix) ?: return null)
|
||||
"Short" -> buildConstExpression(null, FirConstKind.Short, number.toShortOrNull(radix) ?: return null)
|
||||
"Int" -> buildConstExpression(null, FirConstKind.Int, number.toIntOrNull(radix) ?: return null)
|
||||
"Long" -> buildConstExpression(null, FirConstKind.Long, number.toLongOrNull(radix) ?: return null)
|
||||
"Float" -> buildConstExpression(null, FirConstKind.Float, value.toFloatOrNull() ?: return null)
|
||||
"Double" -> buildConstExpression(null, FirConstKind.Double, value.toDoubleOrNull() ?: return null)
|
||||
"String" -> buildConstExpression(null, FirConstKind.String, value)
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
+66
-64
@@ -9,14 +9,17 @@ import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.fir.FirAnnotationContainer
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirConstructorBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirPrimaryConstructorBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstKind
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirConstExpressionImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression
|
||||
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
|
||||
import org.jetbrains.kotlin.fir.java.declarations.*
|
||||
import org.jetbrains.kotlin.fir.java.enhancement.*
|
||||
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
|
||||
import org.jetbrains.kotlin.fir.render
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.jvm.computeJvmDescriptor
|
||||
@@ -24,6 +27,7 @@ import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
|
||||
import org.jetbrains.kotlin.load.java.AnnotationTypeQualifierResolver
|
||||
import org.jetbrains.kotlin.load.java.descriptors.NullDefaultValue
|
||||
import org.jetbrains.kotlin.load.java.descriptors.StringDefaultValue
|
||||
@@ -86,20 +90,17 @@ class JavaClassEnhancementScope(
|
||||
val newReturnTypeRef = enhanceReturnType(firElement, emptyList(), memberContext, null)
|
||||
|
||||
val symbol = FirFieldSymbol(original.callableId)
|
||||
with(firElement) {
|
||||
FirJavaField(
|
||||
firElement.source,
|
||||
this@JavaClassEnhancementScope.session,
|
||||
symbol,
|
||||
name,
|
||||
visibility,
|
||||
modality,
|
||||
newReturnTypeRef,
|
||||
isVar,
|
||||
isStatic
|
||||
).apply {
|
||||
annotations += firElement.annotations
|
||||
}
|
||||
buildJavaField {
|
||||
source = firElement.source
|
||||
session = this@JavaClassEnhancementScope.session
|
||||
this.symbol = symbol
|
||||
this.name = name
|
||||
visibility = firElement.visibility
|
||||
modality = firElement.modality
|
||||
returnTypeRef = newReturnTypeRef
|
||||
isVar = firElement.isVar
|
||||
isStatic = firElement.isStatic
|
||||
annotations += firElement.annotations
|
||||
}
|
||||
return symbol
|
||||
}
|
||||
@@ -173,67 +174,68 @@ class JavaClassEnhancementScope(
|
||||
|
||||
val newValueParameters = firMethod.valueParameters.zip(newValueParameterInfo) { valueParameter, newInfo ->
|
||||
val (newTypeRef, newDefaultValue) = newInfo
|
||||
with(valueParameter) {
|
||||
FirValueParameterImpl(
|
||||
source, this@JavaClassEnhancementScope.session,
|
||||
newTypeRef, this.name,
|
||||
FirVariableSymbol(this.name),
|
||||
defaultValue ?: newDefaultValue, isCrossinline, isNoinline, isVararg
|
||||
).apply {
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
annotations += valueParameter.annotations
|
||||
}
|
||||
buildValueParameter {
|
||||
source = valueParameter.source
|
||||
session = this@JavaClassEnhancementScope.session
|
||||
returnTypeRef = newTypeRef
|
||||
this.name = valueParameter.name
|
||||
symbol = FirVariableSymbol(this.name)
|
||||
defaultValue = valueParameter.defaultValue ?: newDefaultValue
|
||||
isCrossinline = valueParameter.isCrossinline
|
||||
isNoinline = valueParameter.isNoinline
|
||||
isVararg = valueParameter.isVararg
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
annotations += valueParameter.annotations
|
||||
}
|
||||
}
|
||||
val function = when (firMethod) {
|
||||
is FirJavaConstructor -> {
|
||||
val symbol = FirConstructorSymbol(methodId)
|
||||
val status = FirDeclarationStatusImpl(firMethod.visibility, Modality.FINAL).apply {
|
||||
isExpect = false
|
||||
isActual = false
|
||||
isInner = firMethod.isInner
|
||||
}
|
||||
if (firMethod.isPrimary) {
|
||||
FirPrimaryConstructorImpl(
|
||||
firMethod.source,
|
||||
this@JavaClassEnhancementScope.session,
|
||||
newReturnTypeRef,
|
||||
null,
|
||||
status,
|
||||
symbol
|
||||
)
|
||||
FirPrimaryConstructorBuilder().apply {
|
||||
source = firMethod.source
|
||||
session = this@JavaClassEnhancementScope.session
|
||||
returnTypeRef = newReturnTypeRef
|
||||
status = FirDeclarationStatusImpl(firMethod.visibility, Modality.FINAL).apply {
|
||||
isExpect = false
|
||||
isActual = false
|
||||
isInner = firMethod.isInner
|
||||
}
|
||||
this.symbol = symbol
|
||||
}
|
||||
} else {
|
||||
FirConstructorImpl(
|
||||
firMethod.source,
|
||||
this@JavaClassEnhancementScope.session,
|
||||
newReturnTypeRef,
|
||||
newReceiverTypeRef,
|
||||
firMethod.status,
|
||||
symbol
|
||||
)
|
||||
FirConstructorBuilder().apply {
|
||||
source = firMethod.source
|
||||
session = this@JavaClassEnhancementScope.session
|
||||
returnTypeRef = newReturnTypeRef
|
||||
status = firMethod.status
|
||||
this.symbol = symbol
|
||||
}
|
||||
}.apply {
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
this.valueParameters += newValueParameters
|
||||
this.typeParameters += firMethod.typeParameters
|
||||
}
|
||||
}
|
||||
is FirJavaMethod -> FirSimpleFunctionImpl(
|
||||
firMethod.source,
|
||||
this@JavaClassEnhancementScope.session,
|
||||
newReturnTypeRef,
|
||||
newReceiverTypeRef,
|
||||
firMethod.status,
|
||||
name,
|
||||
if (!isAccessor) FirNamedFunctionSymbol(methodId)
|
||||
else FirAccessorSymbol(callableId = propertyId!!, accessorId = methodId)
|
||||
).apply {
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
this.valueParameters += newValueParameters
|
||||
this.typeParameters += firMethod.typeParameters
|
||||
is FirJavaMethod -> {
|
||||
FirSimpleFunctionBuilder().apply {
|
||||
source = firMethod.source
|
||||
session = this@JavaClassEnhancementScope.session
|
||||
returnTypeRef = newReturnTypeRef
|
||||
receiverTypeRef = newReceiverTypeRef
|
||||
this.name = name
|
||||
status = firMethod.status
|
||||
symbol = if (!isAccessor) FirNamedFunctionSymbol(methodId)
|
||||
else FirAccessorSymbol(callableId = propertyId!!, accessorId = methodId)
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
valueParameters += newValueParameters
|
||||
typeParameters += firMethod.typeParameters
|
||||
}
|
||||
}
|
||||
else -> throw AssertionError("Unknown Java method to enhance: ${firMethod.render()}")
|
||||
}
|
||||
function.annotations += firMethod.annotations
|
||||
}.apply {
|
||||
annotations += firMethod.annotations
|
||||
}.build()
|
||||
return function.symbol
|
||||
}
|
||||
|
||||
@@ -275,7 +277,7 @@ class JavaClassEnhancementScope(
|
||||
).enhance(session, jsr305State, predefinedEnhancementInfo?.parametersInfo?.getOrNull(index))
|
||||
val firResolvedTypeRef = signatureParts.type
|
||||
val defaultValueExpression = when (val defaultValue = ownerParameter.getDefaultValueFromAnnotation()) {
|
||||
NullDefaultValue -> FirConstExpressionImpl(null, FirConstKind.Null, null)
|
||||
NullDefaultValue -> buildConstExpression(null, FirConstKind.Null, null)
|
||||
is StringDefaultValue -> firResolvedTypeRef.type.lexicalCastFrom(session, defaultValue.value)
|
||||
null -> null
|
||||
}
|
||||
|
||||
+22
-24
@@ -7,13 +7,11 @@ package org.jetbrains.kotlin.fir.java.scopes
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirValueParameterBuilder
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
|
||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
|
||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaMethod
|
||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaValueParameter
|
||||
import org.jetbrains.kotlin.fir.java.declarations.*
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertiesScope
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.AbstractFirUseSiteMemberScope
|
||||
@@ -119,29 +117,29 @@ class JavaClassUseSiteMemberScope(
|
||||
}
|
||||
}
|
||||
|
||||
override fun createFunctionCopy(firSimpleFunction: FirSimpleFunction, newSymbol: FirNamedFunctionSymbol): FirSimpleFunctionImpl {
|
||||
override fun createFunctionCopy(firSimpleFunction: FirSimpleFunction, newSymbol: FirNamedFunctionSymbol): FirSimpleFunctionBuilder {
|
||||
if (firSimpleFunction !is FirJavaMethod) return super.createFunctionCopy(firSimpleFunction, newSymbol)
|
||||
return FirJavaMethod(
|
||||
firSimpleFunction.session,
|
||||
firSimpleFunction.source,
|
||||
newSymbol,
|
||||
firSimpleFunction.name,
|
||||
firSimpleFunction.visibility,
|
||||
firSimpleFunction.modality,
|
||||
firSimpleFunction.returnTypeRef as FirJavaTypeRef,
|
||||
firSimpleFunction.status.isStatic
|
||||
)
|
||||
return FirJavaMethodBuilder().apply {
|
||||
session = firSimpleFunction.session
|
||||
source = firSimpleFunction.source
|
||||
symbol = newSymbol
|
||||
name = firSimpleFunction.name
|
||||
visibility = firSimpleFunction.visibility
|
||||
modality = firSimpleFunction.modality
|
||||
returnTypeRef = firSimpleFunction.returnTypeRef
|
||||
isStatic = firSimpleFunction.status.isStatic
|
||||
}
|
||||
}
|
||||
|
||||
override fun createValueParameterCopy(parameter: FirValueParameter, newDefaultValue: FirExpression?): FirValueParameterImpl {
|
||||
override fun createValueParameterCopy(parameter: FirValueParameter, newDefaultValue: FirExpression?): FirValueParameterBuilder {
|
||||
if (parameter !is FirJavaValueParameter) return super.createValueParameterCopy(parameter, newDefaultValue)
|
||||
return FirJavaValueParameter(
|
||||
parameter.session,
|
||||
parameter.source,
|
||||
parameter.name,
|
||||
parameter.returnTypeRef as FirJavaTypeRef,
|
||||
parameter.isVararg
|
||||
)
|
||||
return FirJavaValueParameterBuilder().apply {
|
||||
session = parameter.session
|
||||
source = parameter.source
|
||||
name = parameter.name
|
||||
returnTypeRef = parameter.returnTypeRef as FirJavaTypeRef
|
||||
isVararg = parameter.isVararg
|
||||
}
|
||||
}
|
||||
|
||||
override fun processPropertiesByName(name: Name, processor: (FirCallableSymbol<*>) -> Unit) {
|
||||
|
||||
@@ -67,6 +67,8 @@ class LightTree2Fir(
|
||||
val lightTree = buildLightTree(code)
|
||||
|
||||
return DeclarationsConverter(session, scopeProvider, stubMode, lightTree)
|
||||
.convertFile(lightTree.root, fileName)
|
||||
.convertFile(lightTree.root, fileName).also {
|
||||
it
|
||||
}
|
||||
}
|
||||
}
|
||||
+15
-6
@@ -10,22 +10,30 @@ import com.intellij.openapi.util.Ref
|
||||
import com.intellij.psi.tree.IElementType
|
||||
import com.intellij.util.diff.FlyweightCapableTreeStructure
|
||||
import org.jetbrains.kotlin.KtNodeTypes
|
||||
import org.jetbrains.kotlin.fir.FirLightSourceElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.BaseFirBuilder
|
||||
import org.jetbrains.kotlin.fir.builder.Context
|
||||
import org.jetbrains.kotlin.fir.builder.escapedStringToCharacter
|
||||
import org.jetbrains.kotlin.fir.types.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef
|
||||
import org.jetbrains.kotlin.lexer.KtToken
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.lexer.KtTokens.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import kotlin.contracts.ExperimentalContracts
|
||||
import kotlin.contracts.InvocationKind
|
||||
import kotlin.contracts.contract
|
||||
|
||||
open class BaseConverter(
|
||||
session: FirSession,
|
||||
baseSession: FirSession,
|
||||
private val tree: FlyweightCapableTreeStructure<LighterASTNode>,
|
||||
context: Context = Context()
|
||||
) : BaseFirBuilder<LighterASTNode>(session, context) {
|
||||
protected val implicitType = FirImplicitTypeRefImpl(null)
|
||||
context: Context<LighterASTNode> = Context()
|
||||
) : BaseFirBuilder<LighterASTNode>(baseSession, context) {
|
||||
protected val implicitType = buildImplicitTypeRef()
|
||||
|
||||
override fun LighterASTNode.toFirSourceElement(): FirSourceElement {
|
||||
return FirLightSourceElement(this)
|
||||
}
|
||||
|
||||
override val LighterASTNode.elementType: IElementType
|
||||
get() = this.tokenType
|
||||
@@ -98,6 +106,7 @@ open class BaseConverter(
|
||||
return kidsRef.get()
|
||||
}
|
||||
|
||||
@UseExperimental(ExperimentalContracts::class)
|
||||
protected inline fun LighterASTNode.forEachChildren(vararg skipTokens: KtToken, f: (LighterASTNode) -> Unit) {
|
||||
val kidsArray = this.getChildrenAsArray()
|
||||
for (kid in kidsArray) {
|
||||
|
||||
+21
-41
@@ -14,22 +14,18 @@ import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.builder.generateResolvedAccessExpression
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner
|
||||
import org.jetbrains.kotlin.fir.declarations.FirVariable
|
||||
import org.jetbrains.kotlin.fir.declarations.addDefaultBoundIfNecessary
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParametersOwnerBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirPropertyImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirBlockImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirCallWithArgumentList
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirComponentCallImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.FirAnnotationCallBuilder
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.FirCallBuilder
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildBlock
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildComponentCall
|
||||
import org.jetbrains.kotlin.fir.lightTree.fir.DestructuringDeclaration
|
||||
import org.jetbrains.kotlin.fir.lightTree.fir.TypeConstraint
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.lexer.KtSingleValueToken
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -77,22 +73,8 @@ fun LighterASTNode.isExpression(): Boolean {
|
||||
}
|
||||
}
|
||||
|
||||
fun FirTypeParametersOwner.joinTypeParameters(typeConstraints: List<TypeConstraint>) {
|
||||
typeConstraints.forEach { typeConstraint ->
|
||||
this.typeParameters.forEach { typeParameter ->
|
||||
if (typeConstraint.identifier == typeParameter.name.identifier) {
|
||||
(typeParameter as FirTypeParameterImpl).bounds += typeConstraint.firTypeRef
|
||||
// TODO: why this is necessary?
|
||||
// typeParameter.annotations += typeConstraint.firTypeRef.annotations
|
||||
typeParameter.annotations += typeConstraint.annotations
|
||||
}
|
||||
(typeParameter as FirTypeParameterImpl).addDefaultBoundIfNecessary()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun <T : FirCallWithArgumentList> T.extractArgumentsFrom(container: List<FirExpression>, stubMode: Boolean): T {
|
||||
if (!stubMode || this is FirAnnotationCall) {
|
||||
fun <T : FirCallBuilder> T.extractArgumentsFrom(container: List<FirExpression>, stubMode: Boolean): T {
|
||||
if (!stubMode || this is FirAnnotationCallBuilder) {
|
||||
this.arguments += container
|
||||
}
|
||||
return this
|
||||
@@ -125,27 +107,25 @@ fun generateDestructuringBlock(
|
||||
container: FirVariable<*>,
|
||||
tmpVariable: Boolean
|
||||
): FirExpression {
|
||||
return FirBlockImpl(null).apply {
|
||||
return buildBlock {
|
||||
if (tmpVariable) {
|
||||
statements += container
|
||||
}
|
||||
val isVar = multiDeclaration.isVar
|
||||
for ((index, entry) in multiDeclaration.entries.withIndex()) {
|
||||
statements += FirPropertyImpl(
|
||||
null,
|
||||
session,
|
||||
entry.returnTypeRef,
|
||||
null,
|
||||
entry.name,
|
||||
FirComponentCallImpl(null, generateResolvedAccessExpression(null, container), index + 1),
|
||||
null,
|
||||
isVar,
|
||||
FirPropertySymbol(entry.name), // TODO?
|
||||
true,
|
||||
FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL)
|
||||
).apply {
|
||||
statements += buildProperty {
|
||||
this.session = session
|
||||
returnTypeRef = entry.returnTypeRef
|
||||
name = entry.name
|
||||
initializer = buildComponentCall {
|
||||
explicitReceiver = generateResolvedAccessExpression(null, container)
|
||||
componentIndex = index + 1
|
||||
}
|
||||
this.isVar = isVar
|
||||
symbol = FirPropertySymbol(entry.name) // TODO?
|
||||
isLocal = true
|
||||
status = FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL)
|
||||
annotations += entry.annotations
|
||||
symbol.bind(this)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+421
-416
File diff suppressed because it is too large
Load Diff
+294
-185
@@ -11,40 +11,36 @@ import com.intellij.util.diff.FlyweightCapableTreeStructure
|
||||
import org.jetbrains.kotlin.KtNodeTypes.*
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirWhenSubject
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.builder.*
|
||||
import org.jetbrains.kotlin.fir.declarations.FirVariable
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirAnonymousFunctionImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildAnonymousFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirPropertyImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
|
||||
import org.jetbrains.kotlin.fir.impl.FirLabelImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirModifiableQualifiedAccess
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.buildSingleExpressionBlock
|
||||
import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir
|
||||
import org.jetbrains.kotlin.fir.lightTree.fir.ValueParameter
|
||||
import org.jetbrains.kotlin.fir.lightTree.fir.WhenEntry
|
||||
import org.jetbrains.kotlin.fir.references.FirNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirExplicitSuperReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirExplicitThisReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.render
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildExplicitSuperReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildExplicitThisReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeProjection
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef
|
||||
import org.jetbrains.kotlin.lexer.KtTokens.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.name.SpecialNames
|
||||
import org.jetbrains.kotlin.psi.stubs.elements.KtConstantExpressionElementType
|
||||
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
@@ -54,11 +50,11 @@ class ExpressionsConverter(
|
||||
private val stubMode: Boolean,
|
||||
tree: FlyweightCapableTreeStructure<LighterASTNode>,
|
||||
private val declarationsConverter: DeclarationsConverter,
|
||||
context: Context = Context()
|
||||
context: Context<LighterASTNode> = Context()
|
||||
) : BaseConverter(session, tree, context) {
|
||||
|
||||
inline fun <reified R : FirElement> getAsFirExpression(expression: LighterASTNode?, errorReason: String = ""): R {
|
||||
return expression?.let { convertExpression(it, errorReason) } as? R ?: (FirErrorExpressionImpl(null, FirSimpleDiagnostic(errorReason, DiagnosticKind.Syntax)) as R)
|
||||
return expression?.let { convertExpression(it, errorReason) } as? R ?: (buildErrorExpression(null, FirSimpleDiagnostic(errorReason, DiagnosticKind.Syntax)) as R)
|
||||
}
|
||||
|
||||
/***** EXPRESSIONS *****/
|
||||
@@ -67,7 +63,7 @@ class ExpressionsConverter(
|
||||
return when (expression.tokenType) {
|
||||
LAMBDA_EXPRESSION -> {
|
||||
val lambdaTree = LightTree2Fir.buildLightTreeLambdaExpression(expression.asText)
|
||||
ExpressionsConverter(session, stubMode, lambdaTree, declarationsConverter, context)
|
||||
ExpressionsConverter(baseSession, stubMode, lambdaTree, declarationsConverter, context)
|
||||
.convertLambdaExpression(lambdaTree.root)
|
||||
}
|
||||
BINARY_EXPRESSION -> convertBinaryExpression(expression)
|
||||
@@ -106,11 +102,11 @@ class ExpressionsConverter(
|
||||
|
||||
OBJECT_LITERAL -> declarationsConverter.convertObjectLiteral(expression)
|
||||
FUN -> declarationsConverter.convertFunctionDeclaration(expression)
|
||||
else -> FirErrorExpressionImpl(null, FirSimpleDiagnostic(errorReason, DiagnosticKind.Syntax))
|
||||
else -> buildErrorExpression(null, FirSimpleDiagnostic(errorReason, DiagnosticKind.Syntax))
|
||||
}
|
||||
}
|
||||
|
||||
return FirExpressionStub(null)
|
||||
return buildExpressionStub()
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -126,27 +122,33 @@ class ExpressionsConverter(
|
||||
BLOCK -> block = it
|
||||
}
|
||||
}
|
||||
|
||||
return FirAnonymousFunctionImpl(null, session, implicitType, implicitType, FirAnonymousFunctionSymbol(), isLambda = true).apply {
|
||||
context.firFunctions += this
|
||||
|
||||
val target = FirFunctionTarget(labelName = lambdaExpression.getLabelName(), isLambda = true)
|
||||
return buildAnonymousFunction {
|
||||
source = lambdaExpression.toFirSourceElement()
|
||||
session = baseSession
|
||||
returnTypeRef = implicitType
|
||||
receiverTypeRef = implicitType
|
||||
symbol = FirAnonymousFunctionSymbol()
|
||||
isLambda = true
|
||||
context.firFunctionTargets += target
|
||||
var destructuringBlock: FirExpression? = null
|
||||
for (valueParameter in valueParameterList) {
|
||||
val multiDeclaration = valueParameter.destructuringDeclaration
|
||||
valueParameters += if (multiDeclaration != null) {
|
||||
val name = Name.special("<destruct>")
|
||||
val multiParameter = FirValueParameterImpl(
|
||||
null,
|
||||
this@ExpressionsConverter.session,
|
||||
FirImplicitTypeRefImpl(null),
|
||||
name,
|
||||
FirVariableSymbol(name),
|
||||
defaultValue = null,
|
||||
isCrossinline = false,
|
||||
isNoinline = false,
|
||||
val multiParameter = buildValueParameter {
|
||||
session = baseSession
|
||||
returnTypeRef = buildImplicitTypeRef()
|
||||
this.name = name
|
||||
symbol = FirVariableSymbol(name)
|
||||
defaultValue = null
|
||||
isCrossinline = false
|
||||
isNoinline = false
|
||||
isVararg = false
|
||||
)
|
||||
}
|
||||
destructuringBlock = generateDestructuringBlock(
|
||||
this@ExpressionsConverter.session,
|
||||
this@ExpressionsConverter.baseSession,
|
||||
multiDeclaration,
|
||||
multiParameter,
|
||||
tmpVariable = false
|
||||
@@ -157,25 +159,26 @@ class ExpressionsConverter(
|
||||
}
|
||||
}
|
||||
label = context.firLabels.pop() ?: context.firFunctionCalls.lastOrNull()?.calleeReference?.name?.let {
|
||||
FirLabelImpl(null, it.asString())
|
||||
buildLabel { name = it.asString() }
|
||||
}
|
||||
val bodyExpression = block?.let { declarationsConverter.convertBlockExpression(it) }
|
||||
?: FirErrorExpressionImpl(null, FirSimpleDiagnostic("Lambda has no body", DiagnosticKind.Syntax))
|
||||
body = if (bodyExpression is FirBlockImpl) {
|
||||
if (bodyExpression.statements.isEmpty()) {
|
||||
bodyExpression.statements.add(FirUnitExpression(null))
|
||||
}
|
||||
if (destructuringBlock is FirBlock) {
|
||||
for ((index, statement) in destructuringBlock.statements.withIndex()) {
|
||||
bodyExpression.statements.add(index, statement)
|
||||
|
||||
body = if (block != null) {
|
||||
declarationsConverter.convertBlockExpressionWithoutBuilding(block!!).apply {
|
||||
if (statements.isEmpty()) {
|
||||
statements.add(buildUnitExpression())
|
||||
}
|
||||
}
|
||||
bodyExpression
|
||||
if (destructuringBlock is FirBlock) {
|
||||
for ((index, statement) in destructuringBlock.statements.withIndex()) {
|
||||
statements.add(index, statement)
|
||||
}
|
||||
}
|
||||
}.build()
|
||||
} else {
|
||||
FirSingleExpressionBlock(bodyExpression.toReturn())
|
||||
buildSingleExpressionBlock(buildErrorExpression(null, FirSimpleDiagnostic("Lambda has no body", DiagnosticKind.Syntax)))
|
||||
}
|
||||
|
||||
context.firFunctions.removeLast()
|
||||
context.firFunctionTargets.removeLast()
|
||||
}.also {
|
||||
target.bind(it)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -187,7 +190,7 @@ class ExpressionsConverter(
|
||||
var isLeftArgument = true
|
||||
lateinit var operationTokenName: String
|
||||
var leftArgNode: LighterASTNode? = null
|
||||
var rightArgAsFir: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No right operand", DiagnosticKind.Syntax))
|
||||
var rightArgAsFir: FirExpression = buildErrorExpression(null, FirSimpleDiagnostic("No right operand", DiagnosticKind.Syntax))
|
||||
binaryExpression.forEachChildren {
|
||||
when (it.tokenType) {
|
||||
OPERATION_REFERENCE -> {
|
||||
@@ -208,7 +211,7 @@ class ExpressionsConverter(
|
||||
when (operationToken) {
|
||||
ELVIS ->
|
||||
return getAsFirExpression<FirExpression>(leftArgNode, "No left operand").generateNotNullOrOther(
|
||||
session, rightArgAsFir, "elvis", null
|
||||
baseSession, rightArgAsFir, "elvis", null
|
||||
)
|
||||
ANDAND, OROR ->
|
||||
return getAsFirExpression<FirExpression>(leftArgNode, "No left operand").generateLazyLogicalOperation(
|
||||
@@ -221,10 +224,11 @@ class ExpressionsConverter(
|
||||
}
|
||||
val conventionCallName = operationToken.toBinaryName()
|
||||
return if (conventionCallName != null || operationToken == IDENTIFIER) {
|
||||
FirFunctionCallImpl(null).apply {
|
||||
calleeReference = FirSimpleNamedReference(
|
||||
null, conventionCallName ?: operationTokenName.nameAsSafeName(), null
|
||||
)
|
||||
buildFunctionCall {
|
||||
source = binaryExpression.toFirSourceElement()
|
||||
calleeReference = buildSimpleNamedReference {
|
||||
name = conventionCallName ?: operationTokenName.nameAsSafeName()
|
||||
}
|
||||
explicitReceiver = getAsFirExpression(leftArgNode, "No left operand")
|
||||
arguments += rightArgAsFir
|
||||
}
|
||||
@@ -233,7 +237,9 @@ class ExpressionsConverter(
|
||||
if (firOperation in FirOperation.ASSIGNMENTS) {
|
||||
return leftArgNode.generateAssignment(null, rightArgAsFir, firOperation) { getAsFirExpression(this) }
|
||||
} else {
|
||||
FirOperatorCallImpl(null, firOperation).apply {
|
||||
buildOperatorCall {
|
||||
source = binaryExpression.toFirSourceElement()
|
||||
operation = firOperation
|
||||
arguments += getAsFirExpression<FirExpression>(leftArgNode, "No left operand")
|
||||
arguments += rightArgAsFir
|
||||
}
|
||||
@@ -251,7 +257,7 @@ class ExpressionsConverter(
|
||||
toFirOperation: String.() -> FirOperation
|
||||
): FirTypeOperatorCall {
|
||||
lateinit var operationTokenName: String
|
||||
var leftArgAsFir: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No left operand", DiagnosticKind.Syntax))
|
||||
var leftArgAsFir: FirExpression = buildErrorExpression(null, FirSimpleDiagnostic("No left operand", DiagnosticKind.Syntax))
|
||||
lateinit var firType: FirTypeRef
|
||||
binaryExpression.forEachChildren {
|
||||
when (it.tokenType) {
|
||||
@@ -260,9 +266,11 @@ class ExpressionsConverter(
|
||||
else -> if (it.isExpression()) leftArgAsFir = getAsFirExpression(it, "No left operand")
|
||||
}
|
||||
}
|
||||
|
||||
val operation = operationTokenName.toFirOperation()
|
||||
return FirTypeOperatorCallImpl(null, operation, firType).apply {
|
||||
|
||||
return buildTypeOperatorCall {
|
||||
source = binaryExpression.toFirSourceElement()
|
||||
operation = operationTokenName.toFirOperation()
|
||||
conversionTypeRef = firType
|
||||
arguments += leftArgAsFir
|
||||
}
|
||||
}
|
||||
@@ -276,7 +284,7 @@ class ExpressionsConverter(
|
||||
var firExpression: FirElement? = null
|
||||
labeledExpression.forEachChildren {
|
||||
when (it.tokenType) {
|
||||
LABEL_QUALIFIER -> context.firLabels += FirLabelImpl(null, it.toString().replace("@", ""))
|
||||
LABEL_QUALIFIER -> context.firLabels += buildLabel { name = it.toString().replace("@", "") }
|
||||
BLOCK -> firExpression = declarationsConverter.convertBlock(it)
|
||||
PROPERTY -> firExpression = declarationsConverter.convertPropertyDeclaration(it)
|
||||
else -> if (it.isExpression()) firExpression = getAsFirExpression(it)
|
||||
@@ -287,7 +295,7 @@ class ExpressionsConverter(
|
||||
context.firLabels.removeLast()
|
||||
//println("Unused label: ${labeledExpression.getAsString()}")
|
||||
}
|
||||
return firExpression ?: FirErrorExpressionImpl(null, FirSimpleDiagnostic("Empty label", DiagnosticKind.Syntax))
|
||||
return firExpression ?: buildErrorExpression(null, FirSimpleDiagnostic("Empty label", DiagnosticKind.Syntax))
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -309,7 +317,8 @@ class ExpressionsConverter(
|
||||
val conventionCallName = operationToken.toUnaryName()
|
||||
return when {
|
||||
operationToken == EXCLEXCL -> {
|
||||
FirCheckNotNullCallImpl(null).apply {
|
||||
buildCheckNotNullCall {
|
||||
source = unaryExpression.toFirSourceElement()
|
||||
arguments += getAsFirExpression<FirExpression>(argument, "No operand")
|
||||
}
|
||||
|
||||
@@ -323,14 +332,17 @@ class ExpressionsConverter(
|
||||
prefix = unaryExpression.tokenType == PREFIX_EXPRESSION
|
||||
) { getAsFirExpression(this) }
|
||||
}
|
||||
FirFunctionCallImpl(null).apply {
|
||||
calleeReference = FirSimpleNamedReference(null, conventionCallName, null)
|
||||
buildFunctionCall{
|
||||
source = unaryExpression.toFirSourceElement()
|
||||
calleeReference = buildSimpleNamedReference { name = conventionCallName }
|
||||
explicitReceiver = getAsFirExpression(argument, "No operand")
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
val firOperation = operationToken.toFirOperation()
|
||||
FirOperatorCallImpl(null, firOperation).apply {
|
||||
buildOperatorCall {
|
||||
source = unaryExpression.toFirSourceElement()
|
||||
operation = firOperation
|
||||
arguments += getAsFirExpression<FirExpression>(argument, "No operand")
|
||||
}
|
||||
}
|
||||
@@ -352,9 +364,10 @@ class ExpressionsConverter(
|
||||
}
|
||||
}
|
||||
|
||||
return (firExpression as? FirAbstractAnnotatedElement)?.apply {
|
||||
annotations += firAnnotationList
|
||||
} ?: FirErrorExpressionImpl(null, FirSimpleDiagnostic("Strange annotated expression: ${firExpression?.render()}", DiagnosticKind.Syntax))
|
||||
return firExpression?.also {
|
||||
require(it is FirAnnotationContainer)
|
||||
(it.annotations as MutableList<FirAnnotationCall>) += firAnnotationList
|
||||
} ?: buildErrorExpression(null, FirSimpleDiagnostic("Strange annotated expression: ${firExpression?.render()}", DiagnosticKind.Syntax))
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -362,12 +375,13 @@ class ExpressionsConverter(
|
||||
* @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitClassLiteralExpression
|
||||
*/
|
||||
private fun convertClassLiteralExpression(classLiteralExpression: LighterASTNode): FirExpression {
|
||||
var firReceiverExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No receiver in class literal", DiagnosticKind.Syntax))
|
||||
var firReceiverExpression: FirExpression = buildErrorExpression(null, FirSimpleDiagnostic("No receiver in class literal", DiagnosticKind.Syntax))
|
||||
classLiteralExpression.forEachChildren {
|
||||
if (it.isExpression()) firReceiverExpression = getAsFirExpression(it, "No receiver in class literal")
|
||||
}
|
||||
|
||||
return FirGetClassCallImpl(null).apply {
|
||||
return buildGetClassCall {
|
||||
source = classLiteralExpression.toFirSourceElement()
|
||||
arguments += firReceiverExpression
|
||||
}
|
||||
}
|
||||
@@ -395,7 +409,8 @@ class ExpressionsConverter(
|
||||
}
|
||||
}
|
||||
|
||||
return FirCallableReferenceAccessImpl(null).apply {
|
||||
return buildCallableReferenceAccess {
|
||||
source = callableReferenceExpression.toFirSourceElement()
|
||||
calleeReference = firCallableReference.calleeReference as FirNamedReference
|
||||
explicitReceiver = firReceiverExpression
|
||||
this.safe = safe
|
||||
@@ -409,7 +424,7 @@ class ExpressionsConverter(
|
||||
private fun convertQualifiedExpression(dotQualifiedExpression: LighterASTNode): FirExpression {
|
||||
var isSelector = false
|
||||
var isSafe = false
|
||||
var firSelector: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("Qualified expression without selector", DiagnosticKind.Syntax)) //after dot
|
||||
var firSelector: FirExpression = buildErrorExpression(null, FirSimpleDiagnostic("Qualified expression without selector", DiagnosticKind.Syntax)) //after dot
|
||||
var firReceiver: FirExpression? = null //before dot
|
||||
dotQualifiedExpression.forEachChildren {
|
||||
when (it.tokenType) {
|
||||
@@ -469,15 +484,16 @@ class ExpressionsConverter(
|
||||
}
|
||||
|
||||
val (calleeReference, explicitReceiver) = when {
|
||||
name != null -> FirSimpleNamedReference(null, name.nameAsSafeName(), null) to null
|
||||
name != null -> buildSimpleNamedReference { this.name = name.nameAsSafeName() } to null
|
||||
additionalArgument != null -> {
|
||||
FirSimpleNamedReference(null, OperatorNameConventions.INVOKE, null) to additionalArgument!!
|
||||
buildSimpleNamedReference { this.name = OperatorNameConventions.INVOKE } to additionalArgument!!
|
||||
}
|
||||
else -> FirErrorNamedReferenceImpl(null, FirSimpleDiagnostic("Call has no callee", DiagnosticKind.Syntax)) to null
|
||||
else -> buildErrorNamedReference {diagnostic = FirSimpleDiagnostic("Call has no callee", DiagnosticKind.Syntax) } to null
|
||||
}
|
||||
|
||||
return if (hasArguments) {
|
||||
FirFunctionCallImpl(null).apply {
|
||||
val builder: FirQualifiedAccessBuilder = if (hasArguments) {
|
||||
FirFunctionCallBuilder().apply {
|
||||
source = callSuffix.toFirSourceElement()
|
||||
this.calleeReference = calleeReference
|
||||
|
||||
context.firFunctionCalls += this
|
||||
@@ -485,13 +501,15 @@ class ExpressionsConverter(
|
||||
context.firFunctionCalls.removeLast()
|
||||
}
|
||||
} else {
|
||||
FirQualifiedAccessExpressionImpl(null).apply {
|
||||
FirQualifiedAccessExpressionBuilder().apply {
|
||||
source = callSuffix.toFirSourceElement()
|
||||
this.calleeReference = calleeReference
|
||||
}
|
||||
}.apply {
|
||||
}
|
||||
return builder.apply {
|
||||
this.explicitReceiver = explicitReceiver
|
||||
typeArguments += firTypeArguments
|
||||
}
|
||||
}.build() as FirExpression
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -502,7 +520,7 @@ class ExpressionsConverter(
|
||||
}
|
||||
|
||||
private fun LighterASTNode?.convertShortOrLongStringTemplate(errorReason: String): FirExpression {
|
||||
var firExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic(errorReason, DiagnosticKind.Syntax))
|
||||
var firExpression: FirExpression = buildErrorExpression(null, FirSimpleDiagnostic(errorReason, DiagnosticKind.Syntax))
|
||||
this?.forEachChildren(LONG_TEMPLATE_ENTRY_START, LONG_TEMPLATE_ENTRY_END) {
|
||||
firExpression = getAsFirExpression(it, errorReason)
|
||||
}
|
||||
@@ -523,55 +541,65 @@ class ExpressionsConverter(
|
||||
private fun convertWhenExpression(whenExpression: LighterASTNode): FirExpression {
|
||||
var subjectExpression: FirExpression? = null
|
||||
var subjectVariable: FirVariable<*>? = null
|
||||
val whenEntryNodes = mutableListOf<LighterASTNode>()
|
||||
val whenEntries = mutableListOf<WhenEntry>()
|
||||
whenExpression.forEachChildren {
|
||||
when (it.tokenType) {
|
||||
PROPERTY -> subjectVariable = (declarationsConverter.convertPropertyDeclaration(it) as FirVariable<*>).let { variable ->
|
||||
FirPropertyImpl(
|
||||
null,
|
||||
session,
|
||||
variable.returnTypeRef,
|
||||
null,
|
||||
variable.name,
|
||||
variable.initializer,
|
||||
null,
|
||||
false,
|
||||
FirPropertySymbol(variable.name),
|
||||
true,
|
||||
FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL)
|
||||
)
|
||||
buildProperty {
|
||||
source = it.toFirSourceElement()
|
||||
session = baseSession
|
||||
returnTypeRef = variable.returnTypeRef
|
||||
name = variable.name
|
||||
initializer = variable.initializer
|
||||
isVar = false
|
||||
symbol = FirPropertySymbol(variable.name)
|
||||
isLocal = true
|
||||
status = FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL)
|
||||
}
|
||||
}
|
||||
DESTRUCTURING_DECLARATION -> subjectExpression =
|
||||
getAsFirExpression(it, "Incorrect when subject expression: ${whenExpression.asText}")
|
||||
WHEN_ENTRY -> whenEntries += convertWhenEntry(it)
|
||||
WHEN_ENTRY -> whenEntryNodes += it
|
||||
else -> if (it.isExpression()) subjectExpression =
|
||||
getAsFirExpression(it, "Incorrect when subject expression: ${whenExpression.asText}")
|
||||
}
|
||||
}
|
||||
|
||||
subjectExpression = subjectVariable?.initializer ?: subjectExpression
|
||||
val hasSubject = subjectExpression != null
|
||||
val subject = FirWhenSubject()
|
||||
return FirWhenExpressionImpl(null, subjectExpression, subjectVariable).apply {
|
||||
if (hasSubject) {
|
||||
subject.bind(this)
|
||||
}
|
||||
whenEntryNodes.mapTo(whenEntries) { convertWhenEntry(it, subject.takeIf { hasSubject }) }
|
||||
return buildWhenExpression {
|
||||
source = whenExpression.toFirSourceElement()
|
||||
this.subject = subjectExpression
|
||||
this.subjectVariable = subjectVariable
|
||||
for (entry in whenEntries) {
|
||||
val branch = entry.firBlock
|
||||
branches += if (!entry.isElse) {
|
||||
if (hasSubject) {
|
||||
val firCondition = entry.toFirWhenCondition(subject)
|
||||
FirWhenBranchImpl(null, firCondition, branch)
|
||||
val firCondition = entry.toFirWhenCondition()
|
||||
buildWhenBranch {
|
||||
condition = firCondition
|
||||
result = branch
|
||||
}
|
||||
} else {
|
||||
val firCondition = entry.toFirWhenConditionWithoutSubject()
|
||||
FirWhenBranchImpl(null, firCondition, branch)
|
||||
buildWhenBranch {
|
||||
condition = firCondition
|
||||
result = branch
|
||||
}
|
||||
}
|
||||
} else {
|
||||
FirWhenBranchImpl(
|
||||
null, FirElseIfTrueCondition(null), branch
|
||||
)
|
||||
buildWhenBranch {
|
||||
condition = buildElseIfTrueCondition()
|
||||
result = branch
|
||||
}
|
||||
}
|
||||
}
|
||||
}.also {
|
||||
if (hasSubject) {
|
||||
subject.bind(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -579,15 +607,15 @@ class ExpressionsConverter(
|
||||
* @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parseWhenEntry
|
||||
* @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parseWhenEntryNotElse
|
||||
*/
|
||||
private fun convertWhenEntry(whenEntry: LighterASTNode): WhenEntry {
|
||||
private fun convertWhenEntry(whenEntry: LighterASTNode, subject: FirWhenSubject?): WhenEntry {
|
||||
var isElse = false
|
||||
var firBlock: FirBlock = FirEmptyExpressionBlock()
|
||||
var firBlock: FirBlock = buildEmptyExpressionBlock()
|
||||
val conditions = mutableListOf<FirExpression>()
|
||||
whenEntry.forEachChildren {
|
||||
when (it.tokenType) {
|
||||
WHEN_CONDITION_EXPRESSION -> conditions += convertWhenConditionExpression(it)
|
||||
WHEN_CONDITION_IN_RANGE -> conditions += convertWhenConditionInRange(it)
|
||||
WHEN_CONDITION_IS_PATTERN -> conditions += convertWhenConditionIsPattern(it)
|
||||
WHEN_CONDITION_EXPRESSION -> conditions += convertWhenConditionExpression(it, subject)
|
||||
WHEN_CONDITION_IN_RANGE -> conditions += convertWhenConditionInRange(it, subject)
|
||||
WHEN_CONDITION_IS_PATTERN -> conditions += convertWhenConditionIsPattern(it, subject)
|
||||
ELSE_KEYWORD -> isElse = true
|
||||
BLOCK -> firBlock = declarationsConverter.convertBlock(it)
|
||||
else -> if (it.isExpression()) firBlock = declarationsConverter.convertBlock(it)
|
||||
@@ -597,22 +625,31 @@ class ExpressionsConverter(
|
||||
return WhenEntry(conditions, firBlock, isElse)
|
||||
}
|
||||
|
||||
private fun convertWhenConditionExpression(whenCondition: LighterASTNode): FirExpression {
|
||||
var firExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No expression in condition with expression", DiagnosticKind.Syntax))
|
||||
private fun convertWhenConditionExpression(whenCondition: LighterASTNode, subject: FirWhenSubject?): FirExpression {
|
||||
var firExpression: FirExpression = buildErrorExpression(null, FirSimpleDiagnostic("No expression in condition with expression", DiagnosticKind.Syntax))
|
||||
whenCondition.forEachChildren {
|
||||
when (it.tokenType) {
|
||||
else -> if (it.isExpression()) firExpression = getAsFirExpression(it, "No expression in condition with expression")
|
||||
}
|
||||
}
|
||||
return if (subject != null) {
|
||||
buildOperatorCall {
|
||||
source = whenCondition.toFirSourceElement()
|
||||
operation = FirOperation.EQ
|
||||
arguments += buildWhenSubjectExpression {
|
||||
whenSubject = subject
|
||||
}
|
||||
arguments += firExpression
|
||||
}
|
||||
|
||||
return FirOperatorCallImpl(null, FirOperation.EQ).apply {
|
||||
arguments += firExpression
|
||||
} else {
|
||||
firExpression
|
||||
}
|
||||
}
|
||||
|
||||
private fun convertWhenConditionInRange(whenCondition: LighterASTNode): FirExpression {
|
||||
private fun convertWhenConditionInRange(whenCondition: LighterASTNode, subject: FirWhenSubject?): FirExpression {
|
||||
var isNegate = false
|
||||
var firExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No range in condition with range", DiagnosticKind.Syntax))
|
||||
var firExpression: FirExpression = buildErrorExpression(null, FirSimpleDiagnostic("No range in condition with range", DiagnosticKind.Syntax))
|
||||
whenCondition.forEachChildren {
|
||||
when {
|
||||
it.tokenType == OPERATION_REFERENCE && it.asText == NOT_IN.value -> isNegate = true
|
||||
@@ -620,14 +657,26 @@ class ExpressionsConverter(
|
||||
}
|
||||
}
|
||||
|
||||
val name = if (isNegate) OperatorNameConventions.NOT else SpecialNames.NO_NAME_PROVIDED
|
||||
return FirFunctionCallImpl(null).apply {
|
||||
calleeReference = FirSimpleNamedReference(null, name, null)
|
||||
explicitReceiver = firExpression
|
||||
val subjectExpression = if (subject != null) {
|
||||
buildWhenSubjectExpression {
|
||||
whenSubject = subject
|
||||
}
|
||||
} else {
|
||||
return buildErrorExpression {
|
||||
source = whenCondition.toFirSourceElement()
|
||||
diagnostic = FirSimpleDiagnostic("No expression in condition with expression", DiagnosticKind.Syntax)
|
||||
}
|
||||
}
|
||||
|
||||
return firExpression.generateContainsOperation(
|
||||
subjectExpression,
|
||||
inverted = isNegate,
|
||||
base = null, // TODO: replace with FirSourceElement
|
||||
operationReference = null
|
||||
)
|
||||
}
|
||||
|
||||
private fun convertWhenConditionIsPattern(whenCondition: LighterASTNode): FirExpression {
|
||||
private fun convertWhenConditionIsPattern(whenCondition: LighterASTNode, subject: FirWhenSubject?): FirExpression {
|
||||
lateinit var firOperation: FirOperation
|
||||
lateinit var firType: FirTypeRef
|
||||
whenCondition.forEachChildren {
|
||||
@@ -638,7 +687,23 @@ class ExpressionsConverter(
|
||||
}
|
||||
}
|
||||
|
||||
return FirTypeOperatorCallImpl(null, firOperation, firType)
|
||||
val subjectExpression = if (subject != null) {
|
||||
buildWhenSubjectExpression {
|
||||
whenSubject = subject
|
||||
}
|
||||
} else {
|
||||
return buildErrorExpression {
|
||||
source = whenCondition.toFirSourceElement()
|
||||
diagnostic = FirSimpleDiagnostic("No expression in condition with expression", DiagnosticKind.Syntax)
|
||||
}
|
||||
}
|
||||
|
||||
return buildTypeOperatorCall {
|
||||
source = whenCondition.toFirSourceElement()
|
||||
operation = firOperation
|
||||
conversionTypeRef = firType
|
||||
arguments += subjectExpression
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -646,7 +711,7 @@ class ExpressionsConverter(
|
||||
* @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitArrayAccessExpression
|
||||
*/
|
||||
private fun convertArrayAccessExpression(arrayAccess: LighterASTNode): FirFunctionCall {
|
||||
var firExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No array expression", DiagnosticKind.Syntax))
|
||||
var firExpression: FirExpression = buildErrorExpression(null, FirSimpleDiagnostic("No array expression", DiagnosticKind.Syntax))
|
||||
val indices: MutableList<FirExpression> = mutableListOf()
|
||||
arrayAccess.forEachChildren {
|
||||
when (it.tokenType) {
|
||||
@@ -654,10 +719,15 @@ class ExpressionsConverter(
|
||||
else -> if (it.isExpression()) firExpression = getAsFirExpression(it, "No array expression")
|
||||
}
|
||||
}
|
||||
return FirFunctionCallImpl(null).apply {
|
||||
calleeReference = FirSimpleNamedReference(null, OperatorNameConventions.GET, null)
|
||||
val getArgument = context.arraySetArgument.remove(arrayAccess)
|
||||
return buildFunctionCall {
|
||||
source = arrayAccess.toFirSourceElement()
|
||||
calleeReference = buildSimpleNamedReference {
|
||||
name = if (getArgument == null) OperatorNameConventions.GET else OperatorNameConventions.SET
|
||||
}
|
||||
explicitReceiver = firExpression
|
||||
arguments += indices
|
||||
getArgument?.let { arguments += it }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -670,7 +740,8 @@ class ExpressionsConverter(
|
||||
if (it.isExpression()) firExpressionList += getAsFirExpression<FirExpression>(it, "Incorrect collection literal argument")
|
||||
}
|
||||
|
||||
return FirArrayOfCallImpl(null).apply {
|
||||
return buildArrayOfCall {
|
||||
source = expression.toFirSourceElement()
|
||||
arguments += firExpressionList
|
||||
}
|
||||
}
|
||||
@@ -692,9 +763,9 @@ class ExpressionsConverter(
|
||||
* @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitSimpleNameExpression
|
||||
*/
|
||||
private fun convertSimpleNameExpression(referenceExpression: LighterASTNode): FirQualifiedAccessExpression {
|
||||
return FirQualifiedAccessExpressionImpl(null).apply {
|
||||
calleeReference =
|
||||
FirSimpleNamedReference(null, referenceExpression.asText.nameAsSafeName(), null)
|
||||
return buildQualifiedAccessExpression {
|
||||
source = referenceExpression.toFirSourceElement()
|
||||
calleeReference = buildSimpleNamedReference { name = referenceExpression.asText.nameAsSafeName() }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -704,7 +775,7 @@ class ExpressionsConverter(
|
||||
*/
|
||||
private fun convertDoWhile(doWhileLoop: LighterASTNode): FirElement {
|
||||
var block: LighterASTNode? = null
|
||||
var firCondition: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No condition in do-while loop", DiagnosticKind.Syntax))
|
||||
var firCondition: FirExpression = buildErrorExpression(null, FirSimpleDiagnostic("No condition in do-while loop", DiagnosticKind.Syntax))
|
||||
doWhileLoop.forEachChildren {
|
||||
when (it.tokenType) {
|
||||
BODY -> block = it
|
||||
@@ -712,7 +783,10 @@ class ExpressionsConverter(
|
||||
}
|
||||
}
|
||||
|
||||
return FirDoWhileLoopImpl(null, firCondition).configure { convertLoopBody(block) }
|
||||
return FirDoWhileLoopBuilder().apply {
|
||||
source = doWhileLoop.toFirSourceElement()
|
||||
condition = firCondition
|
||||
}.configure { convertLoopBody(block) }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -721,7 +795,7 @@ class ExpressionsConverter(
|
||||
*/
|
||||
private fun convertWhile(whileLoop: LighterASTNode): FirElement {
|
||||
var block: LighterASTNode? = null
|
||||
var firCondition: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No condition in while loop", DiagnosticKind.Syntax))
|
||||
var firCondition: FirExpression = buildErrorExpression(null, FirSimpleDiagnostic("No condition in while loop", DiagnosticKind.Syntax))
|
||||
whileLoop.forEachChildren {
|
||||
when (it.tokenType) {
|
||||
BODY -> block = it
|
||||
@@ -729,7 +803,10 @@ class ExpressionsConverter(
|
||||
}
|
||||
}
|
||||
|
||||
return FirWhileLoopImpl(null, firCondition).configure { convertLoopBody(block) }
|
||||
return FirWhileLoopBuilder().apply {
|
||||
source = whileLoop.toFirSourceElement()
|
||||
condition = firCondition
|
||||
}.configure { convertLoopBody(block) }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -738,7 +815,7 @@ class ExpressionsConverter(
|
||||
*/
|
||||
private fun convertFor(forLoop: LighterASTNode): FirElement {
|
||||
var parameter: ValueParameter? = null
|
||||
var rangeExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No range in for loop", DiagnosticKind.Syntax))
|
||||
var rangeExpression: FirExpression = buildErrorExpression(null, FirSimpleDiagnostic("No range in for loop", DiagnosticKind.Syntax))
|
||||
var blockNode: LighterASTNode? = null
|
||||
forLoop.forEachChildren {
|
||||
when (it.tokenType) {
|
||||
@@ -748,57 +825,58 @@ class ExpressionsConverter(
|
||||
}
|
||||
}
|
||||
|
||||
return FirBlockImpl(null).apply {
|
||||
return buildBlock {
|
||||
source = forLoop.toFirSourceElement()
|
||||
val rangeVal =
|
||||
generateTemporaryVariable(this@ExpressionsConverter.session, null, Name.special("<range>"), rangeExpression)
|
||||
generateTemporaryVariable(this@ExpressionsConverter.baseSession, null, Name.special("<range>"), rangeExpression)
|
||||
statements += rangeVal
|
||||
val iteratorVal = generateTemporaryVariable(
|
||||
this@ExpressionsConverter.session, null, Name.special("<iterator>"),
|
||||
FirFunctionCallImpl(null).apply {
|
||||
calleeReference = FirSimpleNamedReference(null, Name.identifier("iterator"), null)
|
||||
this@ExpressionsConverter.baseSession, null, Name.special("<iterator>"),
|
||||
buildFunctionCall {
|
||||
calleeReference = buildSimpleNamedReference { name = Name.identifier("iterator") }
|
||||
explicitReceiver = generateResolvedAccessExpression(null, rangeVal)
|
||||
}
|
||||
)
|
||||
statements += iteratorVal
|
||||
statements += FirWhileLoopImpl(
|
||||
null,
|
||||
FirFunctionCallImpl(null).apply {
|
||||
calleeReference = FirSimpleNamedReference(null, Name.identifier("hasNext"), null)
|
||||
statements += FirWhileLoopBuilder().apply {
|
||||
source = forLoop.toFirSourceElement()
|
||||
condition = buildFunctionCall {
|
||||
calleeReference = buildSimpleNamedReference { name = Name.identifier("hasNext") }
|
||||
explicitReceiver = generateResolvedAccessExpression(null, iteratorVal)
|
||||
}
|
||||
).configure {
|
||||
}.configure {
|
||||
// NB: just body.toFirBlock() isn't acceptable here because we need to add some statements
|
||||
val block = FirBlockImpl(null).apply {
|
||||
buildBlock block@{
|
||||
source = blockNode?.toFirSourceElement()
|
||||
statements += convertLoopBody(blockNode).statements
|
||||
}
|
||||
if (parameter != null) {
|
||||
if (parameter == null) return@block
|
||||
val multiDeclaration = parameter!!.destructuringDeclaration
|
||||
val firLoopParameter = generateTemporaryVariable(
|
||||
this@ExpressionsConverter.session, null,
|
||||
this@ExpressionsConverter.baseSession, null,
|
||||
if (multiDeclaration != null) Name.special("<destruct>") else parameter!!.firValueParameter.name,
|
||||
FirFunctionCallImpl(null).apply {
|
||||
calleeReference = FirSimpleNamedReference(null, Name.identifier("next"), null)
|
||||
buildFunctionCall {
|
||||
calleeReference = buildSimpleNamedReference { name = Name.identifier("next") }
|
||||
explicitReceiver = generateResolvedAccessExpression(null, iteratorVal)
|
||||
},
|
||||
parameter!!.firValueParameter.returnTypeRef
|
||||
)
|
||||
if (multiDeclaration != null) {
|
||||
val destructuringBlock = generateDestructuringBlock(
|
||||
this@ExpressionsConverter.session,
|
||||
this@ExpressionsConverter.baseSession,
|
||||
multiDeclaration,
|
||||
firLoopParameter,
|
||||
tmpVariable = true
|
||||
)
|
||||
if (destructuringBlock is FirBlock) {
|
||||
for ((index, statement) in destructuringBlock.statements.withIndex()) {
|
||||
block.statements.add(index, statement)
|
||||
statements.add(index, statement)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
block.statements.add(0, firLoopParameter)
|
||||
statements.add(0, firLoopParameter)
|
||||
}
|
||||
|
||||
}
|
||||
block
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -819,7 +897,7 @@ class ExpressionsConverter(
|
||||
|
||||
return when {
|
||||
firStatement != null -> FirSingleExpressionBlock(firStatement!!)
|
||||
firBlock == null -> FirEmptyExpressionBlock()
|
||||
firBlock == null -> buildEmptyExpressionBlock()
|
||||
else -> firBlock!!
|
||||
}
|
||||
}
|
||||
@@ -839,10 +917,16 @@ class ExpressionsConverter(
|
||||
FINALLY -> finallyBlock = convertFinally(it)
|
||||
}
|
||||
}
|
||||
return FirTryExpressionImpl(null, tryBlock, finallyBlock).apply {
|
||||
return buildTryExpression {
|
||||
source = tryExpression.toFirSourceElement()
|
||||
this.tryBlock = tryBlock
|
||||
this.finallyBlock = finallyBlock
|
||||
for ((parameter, block) in catchClauses) {
|
||||
if (parameter == null) continue
|
||||
catches += FirCatchImpl(null, parameter.firValueParameter, block)
|
||||
catches += buildCatch {
|
||||
this.parameter = parameter.firValueParameter
|
||||
this.block = block
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -882,7 +966,7 @@ class ExpressionsConverter(
|
||||
* @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitIfExpression
|
||||
*/
|
||||
private fun convertIfExpression(ifExpression: LighterASTNode): FirExpression {
|
||||
var firCondition: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("If statement should have condition", DiagnosticKind.Syntax))
|
||||
var firCondition: FirExpression = buildErrorExpression(null, FirSimpleDiagnostic("If statement should have condition", DiagnosticKind.Syntax))
|
||||
var thenBlock: LighterASTNode? = null
|
||||
var elseBlock: LighterASTNode? = null
|
||||
ifExpression.forEachChildren {
|
||||
@@ -893,14 +977,21 @@ class ExpressionsConverter(
|
||||
}
|
||||
}
|
||||
|
||||
return FirWhenExpressionImpl(null, null, null).apply {
|
||||
return buildWhenExpression {
|
||||
val trueBranch = convertLoopBody(thenBlock)
|
||||
branches += FirWhenBranchImpl(null, firCondition, trueBranch)
|
||||
val elseBranch = convertLoopBody(elseBlock)
|
||||
if (elseBranch !is FirEmptyExpressionBlock) {
|
||||
branches += FirWhenBranchImpl(
|
||||
null, FirElseIfTrueCondition(null), elseBranch
|
||||
)
|
||||
branches += buildWhenBranch {
|
||||
source = thenBlock?.toFirSourceElement()
|
||||
condition = firCondition
|
||||
result = trueBranch
|
||||
}
|
||||
if (elseBlock != null) {
|
||||
val elseBranch = convertLoopBody(elseBlock)
|
||||
branches += buildWhenBranch {
|
||||
source = elseBlock?.toFirSourceElement()
|
||||
condition = buildElseIfTrueCondition()
|
||||
result = elseBranch
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -919,7 +1010,10 @@ class ExpressionsConverter(
|
||||
}
|
||||
}
|
||||
|
||||
return (if (isBreak) FirBreakExpressionImpl(null) else FirContinueExpressionImpl(null)).bindLabel(jump)
|
||||
val jumpBuilder = if (isBreak) FirBreakExpressionBuilder() else FirContinueExpressionBuilder()
|
||||
return jumpBuilder.apply {
|
||||
source = jump.toFirSourceElement()
|
||||
}.bindLabel(jump).build()
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -928,7 +1022,7 @@ class ExpressionsConverter(
|
||||
*/
|
||||
private fun convertReturn(returnExpression: LighterASTNode): FirExpression {
|
||||
var labelName: String? = null
|
||||
var firExpression: FirExpression = FirUnitExpression(null)
|
||||
var firExpression: FirExpression = buildUnitExpression()
|
||||
returnExpression.forEachChildren {
|
||||
when (it.tokenType) {
|
||||
LABEL_QUALIFIER -> labelName = it.getAsStringWithoutBacktick().replace("@", "")
|
||||
@@ -944,12 +1038,15 @@ class ExpressionsConverter(
|
||||
* @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitThrowExpression
|
||||
*/
|
||||
private fun convertThrow(throwExpression: LighterASTNode): FirExpression {
|
||||
var firExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("Nothing to throw", DiagnosticKind.Syntax))
|
||||
var firExpression: FirExpression = buildErrorExpression(null, FirSimpleDiagnostic("Nothing to throw", DiagnosticKind.Syntax))
|
||||
throwExpression.forEachChildren {
|
||||
if (it.isExpression()) firExpression = getAsFirExpression(it, "Nothing to throw")
|
||||
}
|
||||
|
||||
return FirThrowExpressionImpl(null, firExpression)
|
||||
return buildThrowExpression {
|
||||
source = throwExpression.toFirSourceElement()
|
||||
exception = firExpression
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -958,7 +1055,10 @@ class ExpressionsConverter(
|
||||
*/
|
||||
private fun convertThisExpression(thisExpression: LighterASTNode): FirQualifiedAccessExpression {
|
||||
val label: String? = thisExpression.getLabelName()
|
||||
return FirThisReceiverExpressionImpl(null, FirExplicitThisReference(null, label))
|
||||
return buildThisReceiverExpression {
|
||||
source = thisExpression.toFirSourceElement()
|
||||
calleeReference = buildExplicitThisReference { labelName = label }
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -973,8 +1073,11 @@ class ExpressionsConverter(
|
||||
}
|
||||
}
|
||||
|
||||
return FirQualifiedAccessExpressionImpl(null).apply {
|
||||
calleeReference = FirExplicitSuperReference(null, superTypeRef)
|
||||
return buildQualifiedAccessExpression {
|
||||
source = superExpression.toFirSourceElement()
|
||||
calleeReference = buildExplicitSuperReference {
|
||||
this.superTypeRef = superTypeRef
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -987,7 +1090,10 @@ class ExpressionsConverter(
|
||||
VALUE_ARGUMENT -> container += convertValueArgument(node)
|
||||
LAMBDA_EXPRESSION,
|
||||
LABELED_EXPRESSION,
|
||||
ANNOTATED_EXPRESSION -> container += FirLambdaArgumentExpressionImpl(null, getAsFirExpression(node))
|
||||
ANNOTATED_EXPRESSION -> container += buildLambdaArgumentExpression {
|
||||
source = valueArguments.toFirSourceElement()
|
||||
expression = getAsFirExpression(node)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -999,7 +1105,7 @@ class ExpressionsConverter(
|
||||
private fun convertValueArgument(valueArgument: LighterASTNode): FirExpression {
|
||||
var identifier: String? = null
|
||||
var isSpread = false
|
||||
var firExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("Argument is absent", DiagnosticKind.Syntax))
|
||||
var firExpression: FirExpression = buildErrorExpression(null, FirSimpleDiagnostic("Argument is absent", DiagnosticKind.Syntax))
|
||||
valueArgument.forEachChildren {
|
||||
when (it.tokenType) {
|
||||
VALUE_ARGUMENT_NAME -> identifier = it.asText
|
||||
@@ -1010,13 +1116,16 @@ class ExpressionsConverter(
|
||||
}
|
||||
}
|
||||
return when {
|
||||
identifier != null -> FirNamedArgumentExpressionImpl(
|
||||
null,
|
||||
firExpression,
|
||||
isSpread,
|
||||
identifier.nameAsSafeName()
|
||||
)
|
||||
isSpread -> FirSpreadArgumentExpressionImpl(null, firExpression)
|
||||
identifier != null -> buildNamedArgumentExpression {
|
||||
source = valueArgument.toFirSourceElement()
|
||||
expression = firExpression
|
||||
this.isSpread = isSpread
|
||||
name = identifier.nameAsSafeName()
|
||||
}
|
||||
isSpread -> buildSpreadArgumentExpression {
|
||||
source = valueArgument.toFirSourceElement()
|
||||
expression = firExpression
|
||||
}
|
||||
else -> firExpression
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,8 +13,8 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.Modifier
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.FirUserTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildUserTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirQualifierPartImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirUserTypeRefImpl
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.name.SpecialNames
|
||||
|
||||
@@ -65,15 +65,9 @@ class ClassWrapper(
|
||||
}
|
||||
|
||||
fun getFirUserTypeFromClassName(): FirUserTypeRef {
|
||||
val qualifier = FirQualifierPartImpl(
|
||||
className
|
||||
)
|
||||
|
||||
return FirUserTypeRefImpl(
|
||||
null,
|
||||
false
|
||||
).apply {
|
||||
this.qualifier.add(qualifier)
|
||||
return buildUserTypeRef {
|
||||
isMarkedNullable = false
|
||||
qualifier.add(FirQualifierPartImpl(className))
|
||||
}
|
||||
}
|
||||
}
|
||||
+26
-30
@@ -9,19 +9,19 @@ import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.builder.convertToArrayType
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirPropertyImpl
|
||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirQualifiedAccessExpressionImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildQualifiedAccessExpression
|
||||
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.Modifier
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirPropertyFromParameterResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildPropertyFromParameterResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
||||
|
||||
class ValueParameter(
|
||||
private val isVal: Boolean,
|
||||
@@ -41,34 +41,30 @@ class ValueParameter(
|
||||
type = type.convertToArrayType()
|
||||
}
|
||||
if (type is FirImplicitTypeRef) {
|
||||
type = FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Incomplete code", DiagnosticKind.Syntax))
|
||||
type = buildErrorTypeRef { diagnostic = FirSimpleDiagnostic("Incomplete code", DiagnosticKind.Syntax) }
|
||||
}
|
||||
|
||||
val status = FirDeclarationStatusImpl(modifiers.getVisibility(), modifiers.getModality()).apply {
|
||||
isExpect = modifiers.hasExpect()
|
||||
isActual = modifiers.hasActual()
|
||||
isOverride = modifiers.hasOverride()
|
||||
isConst = false
|
||||
isLateInit = false
|
||||
}
|
||||
|
||||
return FirPropertyImpl(
|
||||
null,
|
||||
session,
|
||||
type,
|
||||
null,
|
||||
name,
|
||||
FirQualifiedAccessExpressionImpl(null).apply {
|
||||
calleeReference = FirPropertyFromParameterResolvedNamedReference(
|
||||
null, name, this@ValueParameter.firValueParameter.symbol
|
||||
)
|
||||
},
|
||||
null,
|
||||
this.isVar,
|
||||
FirPropertySymbol(callableId),
|
||||
false,
|
||||
status
|
||||
).apply {
|
||||
return buildProperty {
|
||||
source = firValueParameter.source
|
||||
this.session = session
|
||||
returnTypeRef = type
|
||||
this.name = name
|
||||
initializer = buildQualifiedAccessExpression {
|
||||
calleeReference = buildPropertyFromParameterResolvedNamedReference {
|
||||
this.name = name
|
||||
resolvedSymbol = this@ValueParameter.firValueParameter.symbol
|
||||
}
|
||||
}
|
||||
isVar = this@ValueParameter.isVar
|
||||
symbol = FirPropertySymbol(callableId)
|
||||
isLocal = false
|
||||
status = FirDeclarationStatusImpl(modifiers.getVisibility(), modifiers.getModality()).apply {
|
||||
isExpect = modifiers.hasExpect()
|
||||
isActual = modifiers.hasActual()
|
||||
isOverride = modifiers.hasOverride()
|
||||
isConst = false
|
||||
isLateInit = false
|
||||
}
|
||||
annotations += this@ValueParameter.firValueParameter.annotations
|
||||
getter = FirDefaultPropertyGetter(null, session, type, modifiers.getVisibility())
|
||||
setter = if (this.isVar) FirDefaultPropertySetter(null, session, type, modifiers.getVisibility()) else null
|
||||
|
||||
@@ -6,26 +6,24 @@
|
||||
package org.jetbrains.kotlin.fir.lightTree.fir
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirWhenSubject
|
||||
import org.jetbrains.kotlin.fir.builder.generateContainsOperation
|
||||
import org.jetbrains.kotlin.fir.builder.generateLazyLogicalOperation
|
||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirErrorExpressionImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirOperatorCallImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirTypeOperatorCallImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirWhenSubjectExpressionImpl
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirOperatorCall
|
||||
import org.jetbrains.kotlin.fir.expressions.buildErrorExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildWhenSubjectExpression
|
||||
|
||||
data class WhenEntry(
|
||||
val conditions: List<FirExpression>,
|
||||
val firBlock: FirBlock,
|
||||
val isElse: Boolean = false
|
||||
) {
|
||||
fun toFirWhenCondition(subject: FirWhenSubject): FirExpression {
|
||||
fun toFirWhenCondition(): FirExpression {
|
||||
var firCondition: FirExpression? = null
|
||||
for (condition in conditions) {
|
||||
val firConditionElement = condition.toFirWhenCondition(subject)
|
||||
val firConditionElement = condition.toFirWhenCondition()
|
||||
firCondition = when (firCondition) {
|
||||
null -> firConditionElement
|
||||
else -> firCondition.generateLazyLogicalOperation(firConditionElement, false, null)
|
||||
@@ -34,34 +32,15 @@ data class WhenEntry(
|
||||
return firCondition!!
|
||||
}
|
||||
|
||||
private fun FirExpression.toFirWhenCondition(subject: FirWhenSubject): FirExpression {
|
||||
val firSubjectExpression = FirWhenSubjectExpressionImpl(null, subject)
|
||||
return when (this) {
|
||||
is FirOperatorCallImpl -> {
|
||||
this.apply {
|
||||
arguments.add(0, firSubjectExpression)
|
||||
}
|
||||
}
|
||||
is FirFunctionCall -> {
|
||||
val firExpression = this.explicitReceiver!!
|
||||
val isNegate = this.calleeReference.name == OperatorNameConventions.NOT
|
||||
firExpression.generateContainsOperation(firSubjectExpression, isNegate, null, null)
|
||||
}
|
||||
is FirTypeOperatorCallImpl -> {
|
||||
this.apply {
|
||||
arguments += firSubjectExpression
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
FirErrorExpressionImpl(null, FirSimpleDiagnostic("Unsupported when condition: ${this.javaClass}", DiagnosticKind.Syntax))
|
||||
}
|
||||
}
|
||||
private fun FirExpression.toFirWhenCondition(): FirExpression {
|
||||
return this
|
||||
}
|
||||
|
||||
fun toFirWhenConditionWithoutSubject(): FirExpression {
|
||||
return when (val condition = conditions.first()) {
|
||||
is FirOperatorCallImpl -> condition.arguments.first()
|
||||
else -> FirErrorExpressionImpl(null, FirSimpleDiagnostic("No expression in condition with expression", DiagnosticKind.Syntax))
|
||||
return when (val condition = conditions.firstOrNull()) {
|
||||
// is FirOperatorCall -> condition.arguments.first()
|
||||
null -> buildErrorExpression(null, FirSimpleDiagnostic("No expression in condition with expression", DiagnosticKind.Syntax))
|
||||
else -> condition
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-13
@@ -9,9 +9,7 @@ import com.intellij.lang.LighterASTNode
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
|
||||
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.CLASS_MODIFIER
|
||||
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.FUNCTION_MODIFIER
|
||||
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.INHERITANCE_MODIFIER
|
||||
@@ -20,11 +18,8 @@ import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.PARAMETER_MO
|
||||
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.PLATFORM_MODIFIER
|
||||
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.PROPERTY_MODIFIER
|
||||
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.VISIBILITY_MODIFIER
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||
|
||||
class Modifier(
|
||||
override val source: FirSourceElement? = null,
|
||||
private val classModifiers: MutableList<ClassModifier> = mutableListOf(),
|
||||
private val memberModifiers: MutableList<MemberModifier> = mutableListOf(),
|
||||
private val visibilityModifiers: MutableList<VisibilityModifier> = mutableListOf(),
|
||||
@@ -33,8 +28,8 @@ class Modifier(
|
||||
private val inheritanceModifiers: MutableList<InheritanceModifier> = mutableListOf(),
|
||||
private val parameterModifiers: MutableList<ParameterModifier> = mutableListOf(),
|
||||
private val platformModifiers: MutableList<PlatformModifier> = mutableListOf()
|
||||
) : FirAbstractAnnotatedElement {
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
) {
|
||||
val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
|
||||
fun addModifier(modifier: LighterASTNode) {
|
||||
val tokenType = modifier.tokenType
|
||||
@@ -157,10 +152,4 @@ class Modifier(
|
||||
fun hasActual(): Boolean {
|
||||
return platformModifiers.contains(PlatformModifier.ACTUAL) || platformModifiers.contains(PlatformModifier.IMPL)
|
||||
}
|
||||
|
||||
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirAbstractAnnotatedElement {
|
||||
return this
|
||||
}
|
||||
}
|
||||
|
||||
+2
-15
@@ -6,18 +6,11 @@
|
||||
package org.jetbrains.kotlin.fir.lightTree.fir.modifier
|
||||
|
||||
import com.intellij.lang.LighterASTNode
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
|
||||
class TypeModifier(
|
||||
override val source: FirSourceElement? = null,
|
||||
var hasSuspend: Boolean = false
|
||||
) : FirAbstractAnnotatedElement {
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
class TypeModifier(var hasSuspend: Boolean = false) {
|
||||
val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
|
||||
fun addModifier(modifier: LighterASTNode) {
|
||||
when (modifier.tokenType) {
|
||||
@@ -28,10 +21,4 @@ class TypeModifier(
|
||||
fun hasNoAnnotations(): Boolean {
|
||||
return annotations.isEmpty()
|
||||
}
|
||||
|
||||
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirAbstractAnnotatedElement {
|
||||
return this
|
||||
}
|
||||
}
|
||||
|
||||
+2
-13
@@ -6,21 +6,16 @@
|
||||
package org.jetbrains.kotlin.fir.lightTree.fir.modifier
|
||||
|
||||
import com.intellij.lang.LighterASTNode
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
|
||||
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.REIFICATION_MODIFIER
|
||||
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.VARIANCE_MODIFIER
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
|
||||
class TypeParameterModifier(
|
||||
override val source: FirSourceElement? = null,
|
||||
private val varianceModifiers: MutableList<VarianceModifier> = mutableListOf(),
|
||||
private var reificationModifier: ReificationModifier? = null
|
||||
) : FirAbstractAnnotatedElement {
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
) {
|
||||
val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
|
||||
fun addModifier(modifier: LighterASTNode) {
|
||||
val tokenType = modifier.tokenType
|
||||
@@ -42,10 +37,4 @@ class TypeParameterModifier(
|
||||
fun hasReified(): Boolean {
|
||||
return reificationModifier == ReificationModifier.REIFIED
|
||||
}
|
||||
|
||||
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirAbstractAnnotatedElement {
|
||||
return this
|
||||
}
|
||||
}
|
||||
|
||||
+3
-12
@@ -8,17 +8,14 @@ package org.jetbrains.kotlin.fir.lightTree.fir.modifier
|
||||
import com.intellij.lang.LighterASTNode
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
|
||||
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.VARIANCE_MODIFIER
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
|
||||
class TypeProjectionModifier(
|
||||
override val source: FirSourceElement? = null,
|
||||
val source: FirSourceElement? = null,
|
||||
private val varianceModifiers: MutableList<VarianceModifier> = mutableListOf()
|
||||
) : FirAbstractAnnotatedElement {
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
) {
|
||||
val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
|
||||
fun addModifier(modifier: LighterASTNode) {
|
||||
val tokenType = modifier.tokenType
|
||||
@@ -34,10 +31,4 @@ class TypeProjectionModifier(
|
||||
else -> Variance.INVARIANT
|
||||
}
|
||||
}
|
||||
|
||||
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirAbstractAnnotatedElement {
|
||||
return this
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,24 +8,35 @@ package org.jetbrains.kotlin.fir.builder
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.tree.IElementType
|
||||
import org.jetbrains.kotlin.KtNodeTypes.*
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirErrorFunctionImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.addDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.AbstractFirRegularClassBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildErrorFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.buildSingleExpressionBlock
|
||||
import org.jetbrains.kotlin.fir.references.FirReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirExplicitThisReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.*
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirErrorFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.lexer.KtTokens.CLOSING_QUOTE
|
||||
import org.jetbrains.kotlin.lexer.KtTokens.OPEN_QUOTE
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
@@ -34,15 +45,16 @@ import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||
import org.jetbrains.kotlin.psi.KtStringTemplateExpression
|
||||
import org.jetbrains.kotlin.psi.KtUnaryExpression
|
||||
import org.jetbrains.kotlin.resolve.constants.evaluate.*
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
//T can be either PsiElement, or LighterASTNode
|
||||
abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context = Context()) {
|
||||
abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Context<T> = Context()) {
|
||||
|
||||
protected val implicitUnitType = session.builtinTypes.unitType
|
||||
protected val implicitAnyType = session.builtinTypes.anyType
|
||||
protected val implicitEnumType = session.builtinTypes.enumType
|
||||
protected val implicitAnnotationType = session.builtinTypes.annotationType
|
||||
abstract fun T.toFirSourceElement(): FirSourceElement
|
||||
|
||||
protected val implicitUnitType = baseSession.builtinTypes.unitType
|
||||
protected val implicitAnyType = baseSession.builtinTypes.anyType
|
||||
protected val implicitEnumType = baseSession.builtinTypes.enumType
|
||||
protected val implicitAnnotationType = baseSession.builtinTypes.annotationType
|
||||
|
||||
abstract val T.elementType: IElementType
|
||||
abstract val T.asText: String
|
||||
@@ -56,9 +68,11 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
|
||||
/**** Class name utils ****/
|
||||
inline fun <T> withChildClassName(name: Name, l: () -> T): T {
|
||||
context.className = context.className.child(name)
|
||||
val t = l()
|
||||
context.className = context.className.parent()
|
||||
return t
|
||||
return try {
|
||||
l()
|
||||
} finally {
|
||||
context.className = context.className.parent()
|
||||
}
|
||||
}
|
||||
|
||||
fun callableIdForName(name: Name, local: Boolean = false) =
|
||||
@@ -93,63 +107,47 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
|
||||
}
|
||||
|
||||
fun FirExpression.toReturn(baseSource: FirSourceElement? = source, labelName: String? = null): FirReturnExpression {
|
||||
return FirReturnExpressionImpl(
|
||||
baseSource,
|
||||
this
|
||||
).apply {
|
||||
target = FirFunctionTarget(labelName)
|
||||
return buildReturnExpression {
|
||||
fun FirFunctionTarget.bindToErrorFunction(message: String, kind: DiagnosticKind) {
|
||||
bind(
|
||||
buildErrorFunction {
|
||||
source = baseSource
|
||||
session = this@BaseFirBuilder.baseSession
|
||||
diagnostic = FirSimpleDiagnostic(message, kind)
|
||||
symbol = FirErrorFunctionSymbol()
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
source = baseSource
|
||||
result = this@toReturn
|
||||
if (labelName == null) {
|
||||
val lastFunction = context.firFunctions.lastOrNull { !(it is FirAnonymousFunction && it.isLambda) }
|
||||
if (lastFunction != null) {
|
||||
target.bind(lastFunction)
|
||||
} else {
|
||||
target.bind(
|
||||
FirErrorFunctionImpl(
|
||||
source,
|
||||
this@BaseFirBuilder.session,
|
||||
FirSimpleDiagnostic("Cannot bind unlabeled return to a function", DiagnosticKind.ReturnNotAllowed),
|
||||
FirErrorFunctionSymbol()
|
||||
)
|
||||
)
|
||||
target = context.firFunctionTargets.lastOrNull { !it.isLambda } ?: FirFunctionTarget(labelName, isLambda = false).apply {
|
||||
bindToErrorFunction("Cannot bind unlabeled return to a function", DiagnosticKind.ReturnNotAllowed)
|
||||
}
|
||||
} else {
|
||||
for (firFunction in context.firFunctions.asReversed()) {
|
||||
when (firFunction) {
|
||||
is FirAnonymousFunction -> {
|
||||
if (firFunction.label?.name == labelName) {
|
||||
target.bind(firFunction)
|
||||
return@apply
|
||||
}
|
||||
}
|
||||
is FirSimpleFunction -> {
|
||||
if (firFunction.name.asString() == labelName) {
|
||||
target.bind(firFunction)
|
||||
return@apply
|
||||
}
|
||||
}
|
||||
for (functionTarget in context.firFunctionTargets.asReversed()) {
|
||||
if (functionTarget.labelName == labelName) {
|
||||
target = functionTarget
|
||||
return@buildReturnExpression
|
||||
}
|
||||
}
|
||||
target.bind(
|
||||
FirErrorFunctionImpl(
|
||||
source,
|
||||
this@BaseFirBuilder.session,
|
||||
FirSimpleDiagnostic("Cannot bind label $labelName to a function", DiagnosticKind.UnresolvedLabel),
|
||||
FirErrorFunctionSymbol()
|
||||
)
|
||||
)
|
||||
target = FirFunctionTarget(labelName, false).apply {
|
||||
bindToErrorFunction("Cannot bind label $labelName to a function", DiagnosticKind.UnresolvedLabel)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun KtClassOrObject?.toDelegatedSelfType(firClass: FirRegularClass): FirResolvedTypeRef {
|
||||
return FirResolvedTypeRefImpl(
|
||||
this?.toFirSourceElement(),
|
||||
ConeClassLikeTypeImpl(
|
||||
fun T?.toDelegatedSelfType(firClass: AbstractFirRegularClassBuilder): FirResolvedTypeRef {
|
||||
return buildResolvedTypeRef {
|
||||
source = this@toDelegatedSelfType?.toFirSourceElement()
|
||||
type = ConeClassLikeTypeImpl(
|
||||
firClass.symbol.toLookupTag(),
|
||||
firClass.typeParameters.map { ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false) }.toTypedArray(),
|
||||
false
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun typeParametersFromSelfType(delegatedSelfTypeRef: FirTypeRef): List<FirTypeParameter> {
|
||||
@@ -159,40 +157,43 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
|
||||
?: emptyList()
|
||||
}
|
||||
|
||||
fun FirAbstractLoop.configure(generateBlock: () -> FirBlock): FirAbstractLoop {
|
||||
fun FirLoopBuilder.configure(generateBlock: () -> FirBlock): FirLoop {
|
||||
label = context.firLabels.pop()
|
||||
context.firLoops += this
|
||||
val target = FirLoopTarget(label?.name)
|
||||
context.firLoopTargets += target
|
||||
block = generateBlock()
|
||||
context.firLoops.removeLast()
|
||||
return this
|
||||
val loop = build()
|
||||
context.firLoopTargets.removeLast()
|
||||
target.bind(loop)
|
||||
return loop
|
||||
}
|
||||
|
||||
fun FirAbstractLoopJump.bindLabel(expression: T): FirAbstractLoopJump {
|
||||
fun FirLoopJumpBuilder.bindLabel(expression: T): FirLoopJumpBuilder {
|
||||
val labelName = expression.getLabelName()
|
||||
target = FirLoopTarget(labelName)
|
||||
val lastLoop = context.firLoops.lastOrNull()
|
||||
val lastLoopTarget = context.firLoopTargets.lastOrNull()
|
||||
if (labelName == null) {
|
||||
if (lastLoop != null) {
|
||||
target.bind(lastLoop)
|
||||
} else {
|
||||
target.bind(
|
||||
FirErrorLoop(
|
||||
expression.getSourceOrNull(), FirSimpleDiagnostic("Cannot bind unlabeled jump to a loop", DiagnosticKind.Syntax)
|
||||
target = lastLoopTarget ?: FirLoopTarget(labelName).apply {
|
||||
bind(
|
||||
buildErrorLoop(
|
||||
expression.getSourceOrNull(),
|
||||
FirSimpleDiagnostic("Cannot bind unlabeled jump to a loop", DiagnosticKind.Syntax)
|
||||
)
|
||||
)
|
||||
}
|
||||
} else {
|
||||
for (firLoop in context.firLoops.asReversed()) {
|
||||
if (firLoop.label?.name == labelName) {
|
||||
target.bind(firLoop)
|
||||
for (firLoopTarget in context.firLoopTargets.asReversed()) {
|
||||
if (firLoopTarget.labelName == labelName) {
|
||||
target = firLoopTarget
|
||||
return this
|
||||
}
|
||||
}
|
||||
target.bind(
|
||||
FirErrorLoop(
|
||||
expression.getSourceOrNull(), FirSimpleDiagnostic("Cannot bind label $labelName to a loop", DiagnosticKind.Syntax)
|
||||
target = FirLoopTarget(labelName).apply {
|
||||
bind(
|
||||
buildErrorLoop(
|
||||
expression.getSourceOrNull(), FirSimpleDiagnostic("Cannot bind label $labelName to a loop", DiagnosticKind.Syntax)
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
return this
|
||||
}
|
||||
@@ -213,13 +214,13 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
|
||||
return when (type) {
|
||||
INTEGER_CONSTANT -> {
|
||||
val kind = when {
|
||||
convertedText !is Long -> return FirErrorExpressionImpl(
|
||||
expression.getSourceOrNull(),
|
||||
FirSimpleDiagnostic(
|
||||
convertedText !is Long -> return buildErrorExpression {
|
||||
source = expression.getSourceOrNull()
|
||||
diagnostic = FirSimpleDiagnostic(
|
||||
"Incorrect constant expression: $text",
|
||||
DiagnosticKind.IllegalConstExpression
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
hasLongSuffix(text) || hasUnsignedSuffix(text) || hasUnsignedLongSuffix(text) -> {
|
||||
FirConstKind.Long
|
||||
@@ -230,7 +231,7 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
|
||||
}
|
||||
}
|
||||
|
||||
FirConstExpressionImpl(
|
||||
buildConstOrErrorExpression(
|
||||
expression.getSourceOrNull(),
|
||||
kind,
|
||||
convertedText,
|
||||
@@ -239,25 +240,39 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
|
||||
}
|
||||
FLOAT_CONSTANT ->
|
||||
if (convertedText is Float) {
|
||||
FirConstExpressionImpl(
|
||||
expression.getSourceOrNull(), FirConstKind.Float, convertedText,
|
||||
buildConstOrErrorExpression(
|
||||
expression.getSourceOrNull(),
|
||||
FirConstKind.Float,
|
||||
convertedText,
|
||||
FirSimpleDiagnostic("Incorrect float: $text", DiagnosticKind.Syntax)
|
||||
)
|
||||
} else {
|
||||
FirConstExpressionImpl(
|
||||
expression.getSourceOrNull(), FirConstKind.Double, convertedText as Double,
|
||||
buildConstOrErrorExpression(
|
||||
expression.getSourceOrNull(),
|
||||
FirConstKind.Double,
|
||||
convertedText as Double,
|
||||
FirSimpleDiagnostic("Incorrect double: $text", DiagnosticKind.Syntax)
|
||||
)
|
||||
}
|
||||
CHARACTER_CONSTANT ->
|
||||
FirConstExpressionImpl(
|
||||
expression.getSourceOrNull(), FirConstKind.Char, text.parseCharacter(),
|
||||
buildConstOrErrorExpression(
|
||||
expression.getSourceOrNull(),
|
||||
FirConstKind.Char,
|
||||
text.parseCharacter(),
|
||||
FirSimpleDiagnostic("Incorrect character: $text", DiagnosticKind.Syntax)
|
||||
)
|
||||
BOOLEAN_CONSTANT ->
|
||||
FirConstExpressionImpl(expression.getSourceOrNull(), FirConstKind.Boolean, convertedText as Boolean)
|
||||
buildConstExpression(
|
||||
expression.getSourceOrNull(),
|
||||
FirConstKind.Boolean,
|
||||
convertedText as Boolean
|
||||
)
|
||||
NULL ->
|
||||
FirConstExpressionImpl(expression.getSourceOrNull(), FirConstKind.Null, null)
|
||||
buildConstExpression(
|
||||
expression.getSourceOrNull(),
|
||||
FirConstKind.Null,
|
||||
null
|
||||
)
|
||||
else ->
|
||||
throw AssertionError("Unknown literal type: $type, $text")
|
||||
}
|
||||
@@ -267,53 +282,48 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
|
||||
base: KtStringTemplateExpression?,
|
||||
convertTemplateEntry: T?.(String) -> FirExpression
|
||||
): FirExpression {
|
||||
val sb = StringBuilder()
|
||||
var hasExpressions = false
|
||||
var result: FirExpression? = null
|
||||
var callCreated = false
|
||||
L@ for (entry in this) {
|
||||
if (entry == null) continue
|
||||
val nextArgument = when (entry.elementType) {
|
||||
OPEN_QUOTE, CLOSING_QUOTE -> continue@L
|
||||
LITERAL_STRING_TEMPLATE_ENTRY -> {
|
||||
sb.append(entry.asText)
|
||||
FirConstExpressionImpl(entry.getSourceOrNull(), FirConstKind.String, entry.asText)
|
||||
}
|
||||
ESCAPE_STRING_TEMPLATE_ENTRY -> {
|
||||
sb.append(entry.unescapedValue)
|
||||
FirConstExpressionImpl(entry.getSourceOrNull(), FirConstKind.String, entry.unescapedValue)
|
||||
}
|
||||
SHORT_STRING_TEMPLATE_ENTRY, LONG_STRING_TEMPLATE_ENTRY -> {
|
||||
hasExpressions = true
|
||||
val firExpression = entry.convertTemplateEntry("Incorrect template argument")
|
||||
val source = firExpression.source
|
||||
FirFunctionCallImpl(source).apply {
|
||||
explicitReceiver = firExpression
|
||||
calleeReference = FirSimpleNamedReference(source, Name.identifier("toString"), candidateSymbol = null)
|
||||
return buildStringConcatenationCall {
|
||||
val sb = StringBuilder()
|
||||
var hasExpressions = false
|
||||
L@ for (entry in this@toInterpolatingCall) {
|
||||
if (entry == null) continue
|
||||
arguments += when (entry.elementType) {
|
||||
OPEN_QUOTE, CLOSING_QUOTE -> continue@L
|
||||
LITERAL_STRING_TEMPLATE_ENTRY -> {
|
||||
sb.append(entry.asText)
|
||||
buildConstExpression(entry.getSourceOrNull(), FirConstKind.String, entry.asText)
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
hasExpressions = true
|
||||
FirErrorExpressionImpl(
|
||||
entry.getSourceOrNull(), FirSimpleDiagnostic("Incorrect template entry: ${entry.asText}", DiagnosticKind.Syntax)
|
||||
)
|
||||
}
|
||||
}
|
||||
result = when {
|
||||
result == null -> nextArgument
|
||||
callCreated && result is FirStringConcatenationCallImpl -> result.apply {
|
||||
arguments += nextArgument
|
||||
}
|
||||
else -> {
|
||||
callCreated = true
|
||||
FirStringConcatenationCallImpl(base?.toFirSourceElement()).apply {
|
||||
arguments += result!!
|
||||
arguments += nextArgument
|
||||
ESCAPE_STRING_TEMPLATE_ENTRY -> {
|
||||
sb.append(entry.unescapedValue)
|
||||
buildConstExpression(entry.getSourceOrNull(), FirConstKind.String, entry.unescapedValue)
|
||||
}
|
||||
SHORT_STRING_TEMPLATE_ENTRY, LONG_STRING_TEMPLATE_ENTRY -> {
|
||||
hasExpressions = true
|
||||
val firExpression = entry.convertTemplateEntry("Incorrect template argument")
|
||||
val source = firExpression.source
|
||||
buildFunctionCall {
|
||||
this.source = source
|
||||
explicitReceiver = firExpression
|
||||
calleeReference = buildSimpleNamedReference {
|
||||
this.source = source
|
||||
name = Name.identifier("toString")
|
||||
}
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
hasExpressions = true
|
||||
buildErrorExpression {
|
||||
source = entry.getSourceOrNull()
|
||||
diagnostic = FirSimpleDiagnostic("Incorrect template entry: ${entry.asText}", DiagnosticKind.Syntax)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
source = base?.toFirSourceElement()
|
||||
// Fast-pass if there is no non-const string expressions
|
||||
if (!hasExpressions) return buildConstExpression(source, FirConstKind.String, sb.toString())
|
||||
arguments.singleOrNull()?.let { return it }
|
||||
}
|
||||
return if (hasExpressions) result!! else FirConstExpressionImpl(base?.toFirSourceElement(), FirConstKind.String, sb.toString())
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -348,19 +358,27 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
|
||||
convert: T.() -> FirExpression
|
||||
): FirExpression {
|
||||
if (argument == null) {
|
||||
return FirErrorExpressionImpl(argument, FirSimpleDiagnostic("Inc/dec without operand", DiagnosticKind.Syntax))
|
||||
return buildErrorExpression {
|
||||
source = argument
|
||||
diagnostic = FirSimpleDiagnostic("Inc/dec without operand", DiagnosticKind.Syntax)
|
||||
}
|
||||
}
|
||||
val source = baseExpression?.toFirSourceElement()
|
||||
return FirBlockImpl(source).apply {
|
||||
return buildBlock {
|
||||
val baseSource = baseExpression?.toFirSourceElement()
|
||||
source = baseSource
|
||||
val tempName = Name.special("<unary>")
|
||||
val temporaryVariable = generateTemporaryVariable(this@BaseFirBuilder.session, source, tempName, argument.convert())
|
||||
val temporaryVariable = generateTemporaryVariable(this@BaseFirBuilder.baseSession, source, tempName, argument.convert())
|
||||
statements += temporaryVariable
|
||||
val resultName = Name.special("<unary-result>")
|
||||
val resultInitializer = FirFunctionCallImpl(source).apply {
|
||||
this.calleeReference = FirSimpleNamedReference(baseExpression?.operationReference?.toFirSourceElement(), callName, null)
|
||||
this.explicitReceiver = generateResolvedAccessExpression(source, temporaryVariable)
|
||||
val resultInitializer = buildFunctionCall {
|
||||
source = baseSource
|
||||
calleeReference = buildSimpleNamedReference {
|
||||
source = baseExpression?.operationReference?.toFirSourceElement()
|
||||
name = callName
|
||||
}
|
||||
explicitReceiver = generateResolvedAccessExpression(source, temporaryVariable)
|
||||
}
|
||||
val resultVar = generateTemporaryVariable(this@BaseFirBuilder.session, source, resultName, resultInitializer)
|
||||
val resultVar = generateTemporaryVariable(this@BaseFirBuilder.baseSession, source, resultName, resultInitializer)
|
||||
val assignment = argument.generateAssignment(
|
||||
source,
|
||||
if (prefix && argument.elementType != REFERENCE_EXPRESSION)
|
||||
@@ -394,7 +412,7 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirModifiableQualifiedAccess.initializeLValue(
|
||||
private fun FirQualifiedAccessBuilder.initializeLValue(
|
||||
left: T?,
|
||||
convertQualified: T.() -> FirQualifiedAccess?
|
||||
): FirReference {
|
||||
@@ -402,10 +420,16 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
|
||||
if (left != null) {
|
||||
when (tokenType) {
|
||||
REFERENCE_EXPRESSION -> {
|
||||
return FirSimpleNamedReference(left.getSourceOrNull(), left.getReferencedNameAsName(), null)
|
||||
return buildSimpleNamedReference {
|
||||
source = left.getSourceOrNull()
|
||||
name = left.getReferencedNameAsName()
|
||||
}
|
||||
}
|
||||
THIS_EXPRESSION -> {
|
||||
return FirExplicitThisReference(left.getSourceOrNull(), left.getLabelName())
|
||||
return buildExplicitThisReference {
|
||||
source = left.getSourceOrNull()
|
||||
labelName = left.getLabelName()
|
||||
}
|
||||
}
|
||||
DOT_QUALIFIED_EXPRESSION, SAFE_ACCESS_EXPRESSION -> {
|
||||
val firMemberAccess = left.convertQualified()
|
||||
@@ -414,10 +438,10 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
|
||||
safe = firMemberAccess.safe
|
||||
firMemberAccess.calleeReference
|
||||
} else {
|
||||
FirErrorNamedReferenceImpl(
|
||||
left.getSourceOrNull(),
|
||||
FirSimpleDiagnostic("Unsupported qualified LValue: ${left.asText}", DiagnosticKind.Syntax)
|
||||
)
|
||||
buildErrorNamedReference {
|
||||
source = left.getSourceOrNull()
|
||||
diagnostic = FirSimpleDiagnostic("Unsupported qualified LValue: ${left.asText}", DiagnosticKind.Syntax)
|
||||
}
|
||||
}
|
||||
}
|
||||
PARENTHESIZED -> {
|
||||
@@ -425,62 +449,178 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
|
||||
}
|
||||
}
|
||||
}
|
||||
return FirErrorNamedReferenceImpl(
|
||||
left.getSourceOrNull(), FirSimpleDiagnostic("Unsupported LValue: $tokenType", DiagnosticKind.Syntax)
|
||||
)
|
||||
return buildErrorNamedReference {
|
||||
source = left.getSourceOrNull()
|
||||
diagnostic = FirSimpleDiagnostic("Unsupported LValue: $tokenType", DiagnosticKind.Syntax)
|
||||
}
|
||||
}
|
||||
|
||||
fun T?.generateAssignment(
|
||||
source: FirSourceElement?,
|
||||
baseSource: FirSourceElement?,
|
||||
value: FirExpression,
|
||||
operation: FirOperation,
|
||||
convert: T.() -> FirExpression
|
||||
): FirStatement {
|
||||
val tokenType = this?.elementType
|
||||
if (tokenType == PARENTHESIZED) {
|
||||
return this!!.getExpressionInParentheses().generateAssignment(source, value, operation, convert)
|
||||
return this!!.getExpressionInParentheses().generateAssignment(baseSource, value, operation, convert)
|
||||
}
|
||||
if (tokenType == ARRAY_ACCESS_EXPRESSION) {
|
||||
val firArrayAccess = this!!.convert() as FirFunctionCallImpl
|
||||
val arraySet = if (operation != FirOperation.ASSIGN) {
|
||||
FirArraySetCallImpl(source, value, operation).apply {
|
||||
indexes += firArrayAccess.arguments
|
||||
}
|
||||
} else {
|
||||
return firArrayAccess.apply {
|
||||
calleeReference = FirSimpleNamedReference(source, OperatorNameConventions.SET, null)
|
||||
arguments += value
|
||||
}
|
||||
if (operation == FirOperation.ASSIGN) {
|
||||
context.arraySetArgument[this!!] = value
|
||||
}
|
||||
val firArrayAccess = this!!.convert() as FirFunctionCall
|
||||
if (operation == FirOperation.ASSIGN) {
|
||||
return firArrayAccess
|
||||
}
|
||||
val arraySetCallBuilder = FirArraySetCallBuilder().apply {
|
||||
source = baseSource
|
||||
rValue = value
|
||||
this.operation = operation
|
||||
indexes += firArrayAccess.arguments
|
||||
}
|
||||
val arrayExpression = this.getChildNodeByType(REFERENCE_EXPRESSION)
|
||||
if (arrayExpression != null) {
|
||||
return arraySet.apply {
|
||||
lValue = initializeLValue(arrayExpression) { convert() as? FirQualifiedAccess }
|
||||
}
|
||||
return arraySetCallBuilder.apply {
|
||||
calleeReference = initializeLValue(arrayExpression) { convert() as? FirQualifiedAccess }
|
||||
}.build()
|
||||
}
|
||||
val psiArrayExpression = firArrayAccess.explicitReceiver?.psi
|
||||
return FirBlockImpl(psiArrayExpression?.toFirSourceElement()).apply {
|
||||
return buildBlock {
|
||||
source = psiArrayExpression?.toFirSourceElement()
|
||||
val name = Name.special("<array-set>")
|
||||
statements += generateTemporaryVariable(
|
||||
this@BaseFirBuilder.session, this@generateAssignment.getSourceOrNull(), name, firArrayAccess.explicitReceiver!!
|
||||
this@BaseFirBuilder.baseSession, this@generateAssignment.getSourceOrNull(), name, firArrayAccess.explicitReceiver!!
|
||||
)
|
||||
statements += arraySet.apply { lValue = FirSimpleNamedReference(psiArrayExpression?.toFirSourceElement(), name, null) }
|
||||
statements += arraySetCallBuilder.apply {
|
||||
calleeReference = buildSimpleNamedReference {
|
||||
source = psiArrayExpression?.toFirSourceElement()
|
||||
this.name = name
|
||||
}
|
||||
}.build()
|
||||
}
|
||||
}
|
||||
|
||||
if (operation in FirOperation.ASSIGNMENTS && operation != FirOperation.ASSIGN) {
|
||||
return FirOperatorCallImpl(source, operation).apply {
|
||||
return buildOperatorCall {
|
||||
source = baseSource
|
||||
this.operation = operation
|
||||
// TODO: take good psi
|
||||
arguments += this@generateAssignment?.convert() ?:
|
||||
FirErrorExpressionImpl(
|
||||
null, FirSimpleDiagnostic("Unsupported left value of assignment: ${source?.psi?.text}", DiagnosticKind.Syntax)
|
||||
)
|
||||
buildErrorExpression {
|
||||
source = null
|
||||
diagnostic = FirSimpleDiagnostic("Unsupported left value of assignment: ${baseSource?.psi?.text}", DiagnosticKind.Syntax)
|
||||
}
|
||||
arguments += value
|
||||
}
|
||||
}
|
||||
require(operation == FirOperation.ASSIGN)
|
||||
return FirVariableAssignmentImpl(source, false, value).apply {
|
||||
lValue = initializeLValue(this@generateAssignment) { convert() as? FirQualifiedAccess }
|
||||
return buildVariableAssignment {
|
||||
source = baseSource
|
||||
safe = false
|
||||
rValue = value
|
||||
calleeReference = initializeLValue(this@generateAssignment) { convert() as? FirQualifiedAccess }
|
||||
}
|
||||
}
|
||||
|
||||
fun List<Pair<T, FirProperty>>.generateComponentFunctions(
|
||||
session: FirSession, firClassBuilder: AbstractFirRegularClassBuilder, packageFqName: FqName, classFqName: FqName,
|
||||
firPrimaryConstructor: FirConstructor,
|
||||
) {
|
||||
var componentIndex = 1
|
||||
for ((sourceNode, firProperty) in this) {
|
||||
if (!firProperty.isVal && !firProperty.isVar) continue
|
||||
val name = Name.identifier("component$componentIndex")
|
||||
componentIndex++
|
||||
val parameterSource = sourceNode?.toFirSourceElement()
|
||||
val target = FirFunctionTarget(labelName = null, isLambda = false)
|
||||
val componentFunction = buildSimpleFunction {
|
||||
source = parameterSource
|
||||
this.session = session
|
||||
returnTypeRef = buildImplicitTypeRef {
|
||||
source = parameterSource
|
||||
}
|
||||
receiverTypeRef = null
|
||||
this.name = name
|
||||
this.status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL)
|
||||
this.symbol = FirNamedFunctionSymbol(CallableId(packageFqName, classFqName, name))
|
||||
|
||||
val returnExpression = buildReturnExpression {
|
||||
source = parameterSource
|
||||
result = buildQualifiedAccessExpression {
|
||||
source = parameterSource
|
||||
dispatchReceiver = buildThisReceiverExpression {
|
||||
calleeReference = buildImplicitThisReference {
|
||||
boundSymbol = firClassBuilder.symbol
|
||||
}
|
||||
typeRef = firPrimaryConstructor.returnTypeRef
|
||||
}
|
||||
calleeReference = buildResolvedNamedReference {
|
||||
source = parameterSource
|
||||
this.name = firProperty.name
|
||||
resolvedSymbol = firProperty.symbol
|
||||
}
|
||||
}
|
||||
this.target = target
|
||||
}
|
||||
body = buildSingleExpressionBlock(returnExpression)
|
||||
}.also {
|
||||
target.bind(it)
|
||||
}
|
||||
firClassBuilder.addDeclaration(componentFunction)
|
||||
}
|
||||
}
|
||||
|
||||
private val copyName = Name.identifier("copy")
|
||||
|
||||
fun List<Pair<T, FirProperty>>.generateCopyFunction(
|
||||
session: FirSession,
|
||||
classOrObject: KtClassOrObject?,
|
||||
classBuilder: AbstractFirRegularClassBuilder,
|
||||
packageFqName: FqName,
|
||||
classFqName: FqName,
|
||||
firPrimaryConstructor: FirConstructor,
|
||||
) {
|
||||
classBuilder.addDeclaration(
|
||||
buildSimpleFunction {
|
||||
source = classOrObject?.toFirSourceElement()
|
||||
this.session = session
|
||||
returnTypeRef = firPrimaryConstructor.returnTypeRef
|
||||
name = copyName
|
||||
status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL)
|
||||
symbol = FirNamedFunctionSymbol(CallableId(packageFqName, classFqName, copyName))
|
||||
for ((ktParameter, firProperty) in this@generateCopyFunction) {
|
||||
val propertyName = firProperty.name
|
||||
val parameterSource = ktParameter?.toFirSourceElement()
|
||||
valueParameters += buildValueParameter {
|
||||
source = parameterSource
|
||||
this.session = session
|
||||
returnTypeRef = firProperty.returnTypeRef
|
||||
name = propertyName
|
||||
symbol = FirVariableSymbol(propertyName)
|
||||
defaultValue = buildQualifiedAccessExpression {
|
||||
source = parameterSource
|
||||
dispatchReceiver = buildThisReceiverExpression {
|
||||
calleeReference = buildImplicitThisReference {
|
||||
boundSymbol = classBuilder.symbol
|
||||
}
|
||||
typeRef = firPrimaryConstructor.returnTypeRef
|
||||
}
|
||||
calleeReference = buildResolvedNamedReference {
|
||||
source = parameterSource
|
||||
this.name = propertyName
|
||||
resolvedSymbol = firProperty.symbol
|
||||
}
|
||||
}
|
||||
isCrossinline = false
|
||||
isNoinline = false
|
||||
isVararg = false
|
||||
}
|
||||
}
|
||||
|
||||
body = buildEmptyExpressionBlock()
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -5,20 +5,22 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.builder
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirFunctionTarget
|
||||
import org.jetbrains.kotlin.fir.FirLabel
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFunction
|
||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirLoop
|
||||
import org.jetbrains.kotlin.fir.FirLoopTarget
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.FirFunctionCallBuilder
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
|
||||
class Context {
|
||||
class Context<T> {
|
||||
lateinit var packageFqName: FqName
|
||||
var className: FqName = FqName.ROOT
|
||||
val currentClassId get() = ClassId(packageFqName, className, firFunctions.isNotEmpty())
|
||||
val currentClassId get() = ClassId(packageFqName, className, firFunctionTargets.isNotEmpty())
|
||||
|
||||
val firFunctions = mutableListOf<FirFunction<*>>()
|
||||
val firFunctionCalls = mutableListOf<FirFunctionCall>()
|
||||
val firFunctionTargets = mutableListOf<FirFunctionTarget>()
|
||||
val firFunctionCalls = mutableListOf<FirFunctionCallBuilder>()
|
||||
val firLabels = mutableListOf<FirLabel>()
|
||||
val firLoops = mutableListOf<FirLoop>()
|
||||
val firLoopTargets = mutableListOf<FirLoopTarget>()
|
||||
val arraySetArgument = mutableMapOf<T, FirExpression>()
|
||||
}
|
||||
@@ -9,25 +9,37 @@ import com.intellij.psi.tree.IElementType
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.FirVariable
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirPropertyBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirDelegateFieldReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirExplicitThisReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.buildSingleExpressionBlock
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildDelegateFieldReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildExplicitThisReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeStarProjection
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.FirUserTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildTypeProjectionWithVariance
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildUserTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitKPropertyTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirQualifierPartImpl
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
@@ -135,55 +147,68 @@ fun IElementType.toFirOperation(): FirOperation =
|
||||
}
|
||||
|
||||
fun FirExpression.generateNotNullOrOther(
|
||||
session: FirSession, other: FirExpression, caseId: String, baseSource: FirSourceElement?
|
||||
session: FirSession, other: FirExpression, caseId: String, baseSource: FirSourceElement?,
|
||||
): FirWhenExpression {
|
||||
val subjectName = Name.special("<$caseId>")
|
||||
val subjectVariable = generateTemporaryVariable(session, baseSource, subjectName, this)
|
||||
val subject = FirWhenSubject()
|
||||
val subjectExpression = FirWhenSubjectExpressionImpl(baseSource, subject)
|
||||
return FirWhenExpressionImpl(
|
||||
baseSource, this, subjectVariable
|
||||
).apply {
|
||||
subject.bind(this)
|
||||
branches += FirWhenBranchImpl(
|
||||
baseSource,
|
||||
FirOperatorCallImpl(baseSource, FirOperation.EQ).apply {
|
||||
val subjectExpression = buildWhenSubjectExpression {
|
||||
source = baseSource
|
||||
whenSubject = subject
|
||||
}
|
||||
|
||||
return buildWhenExpression {
|
||||
source = baseSource
|
||||
this.subject = this@generateNotNullOrOther
|
||||
this.subjectVariable = subjectVariable
|
||||
branches += buildWhenBranch {
|
||||
source = baseSource
|
||||
condition = buildOperatorCall {
|
||||
source = baseSource
|
||||
operation = FirOperation.EQ
|
||||
arguments += subjectExpression
|
||||
arguments += FirConstExpressionImpl(baseSource, FirConstKind.Null, null)
|
||||
},
|
||||
FirSingleExpressionBlock(other)
|
||||
)
|
||||
branches += FirWhenBranchImpl(
|
||||
other.source, FirElseIfTrueCondition(baseSource),
|
||||
FirSingleExpressionBlock(
|
||||
generateResolvedAccessExpression(baseSource, subjectVariable)
|
||||
)
|
||||
)
|
||||
arguments += buildConstExpression(baseSource, FirConstKind.Null, null)
|
||||
}
|
||||
result = buildSingleExpressionBlock(other)
|
||||
}
|
||||
branches += buildWhenBranch {
|
||||
source = other.source
|
||||
condition = buildElseIfTrueCondition {
|
||||
source = baseSource
|
||||
}
|
||||
result = buildSingleExpressionBlock(generateResolvedAccessExpression(baseSource, subjectVariable))
|
||||
}
|
||||
}.also {
|
||||
subject.bind(it)
|
||||
}
|
||||
}
|
||||
|
||||
fun FirExpression.generateLazyLogicalOperation(
|
||||
other: FirExpression, isAnd: Boolean, baseSource: FirSourceElement?
|
||||
other: FirExpression, isAnd: Boolean, baseSource: FirSourceElement?,
|
||||
): FirBinaryLogicExpression {
|
||||
val kind = if (isAnd)
|
||||
LogicOperationKind.AND
|
||||
else
|
||||
LogicOperationKind.OR
|
||||
return FirBinaryLogicExpressionImpl(baseSource, this, other, kind)
|
||||
return buildBinaryLogicExpression {
|
||||
source = baseSource
|
||||
leftOperand = this@generateLazyLogicalOperation
|
||||
rightOperand = other
|
||||
kind = if (isAnd) LogicOperationKind.AND else LogicOperationKind.OR
|
||||
}
|
||||
}
|
||||
|
||||
internal fun KtWhenCondition.toFirWhenCondition(
|
||||
subject: FirWhenSubject,
|
||||
convert: KtExpression?.(String) -> FirExpression,
|
||||
toFirOrErrorTypeRef: KtTypeReference?.() -> FirTypeRef
|
||||
toFirOrErrorTypeRef: KtTypeReference?.() -> FirTypeRef,
|
||||
): FirExpression {
|
||||
val firSubjectExpression = FirWhenSubjectExpressionImpl(this.toFirSourceElement(), subject)
|
||||
val baseSource = this.toFirSourceElement()
|
||||
val firSubjectExpression = buildWhenSubjectExpression {
|
||||
source = baseSource
|
||||
whenSubject = subject
|
||||
}
|
||||
return when (this) {
|
||||
is KtWhenConditionWithExpression -> {
|
||||
FirOperatorCallImpl(
|
||||
expression?.toFirSourceElement(),
|
||||
FirOperation.EQ
|
||||
).apply {
|
||||
buildOperatorCall {
|
||||
source = expression?.toFirSourceElement()
|
||||
operation = FirOperation.EQ
|
||||
arguments += firSubjectExpression
|
||||
arguments += expression.convert("No expression in condition with expression")
|
||||
}
|
||||
@@ -193,16 +218,15 @@ internal fun KtWhenCondition.toFirWhenCondition(
|
||||
firRange.generateContainsOperation(firSubjectExpression, isNegated, rangeExpression, operationReference)
|
||||
}
|
||||
is KtWhenConditionIsPattern -> {
|
||||
FirTypeOperatorCallImpl(
|
||||
typeReference?.toFirSourceElement(),
|
||||
if (isNegated) FirOperation.NOT_IS else FirOperation.IS,
|
||||
typeReference.toFirOrErrorTypeRef()
|
||||
).apply {
|
||||
buildTypeOperatorCall {
|
||||
source = typeReference?.toFirSourceElement()
|
||||
operation = if (isNegated) FirOperation.NOT_IS else FirOperation.IS
|
||||
conversionTypeRef = typeReference.toFirOrErrorTypeRef()
|
||||
arguments += firSubjectExpression
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
FirErrorExpressionImpl(this.toFirSourceElement(), FirSimpleDiagnostic("Unsupported when condition: ${this.javaClass}", DiagnosticKind.Syntax))
|
||||
buildErrorExpression(baseSource, FirSimpleDiagnostic("Unsupported when condition: ${this.javaClass}", DiagnosticKind.Syntax))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -211,7 +235,7 @@ internal fun Array<KtWhenCondition>.toFirWhenCondition(
|
||||
baseSource: FirSourceElement?,
|
||||
subject: FirWhenSubject,
|
||||
convert: KtExpression?.(String) -> FirExpression,
|
||||
toFirOrErrorTypeRef: KtTypeReference?.() -> FirTypeRef
|
||||
toFirOrErrorTypeRef: KtTypeReference?.() -> FirTypeRef,
|
||||
): FirExpression {
|
||||
var firCondition: FirExpression? = null
|
||||
for (condition in this) {
|
||||
@@ -219,7 +243,7 @@ internal fun Array<KtWhenCondition>.toFirWhenCondition(
|
||||
firCondition = when (firCondition) {
|
||||
null -> firConditionElement
|
||||
else -> firCondition.generateLazyLogicalOperation(
|
||||
firConditionElement, false, baseSource
|
||||
firConditionElement, false, baseSource,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -230,30 +254,47 @@ fun FirExpression.generateContainsOperation(
|
||||
argument: FirExpression,
|
||||
inverted: Boolean,
|
||||
base: KtExpression?,
|
||||
operationReference: KtOperationReferenceExpression?
|
||||
operationReference: KtOperationReferenceExpression?,
|
||||
): FirFunctionCall {
|
||||
val baseSource = base?.toFirSourceElement()
|
||||
val operationReferenceSource = operationReference?.toFirSourceElement()
|
||||
val containsCall = FirFunctionCallImpl(baseSource).apply {
|
||||
calleeReference = FirSimpleNamedReference(operationReferenceSource, OperatorNameConventions.CONTAINS, null)
|
||||
val containsCall = buildFunctionCall {
|
||||
source = baseSource
|
||||
calleeReference = buildSimpleNamedReference {
|
||||
source = operationReferenceSource
|
||||
name = OperatorNameConventions.CONTAINS
|
||||
}
|
||||
explicitReceiver = this@generateContainsOperation
|
||||
arguments += argument
|
||||
}
|
||||
if (!inverted) return containsCall
|
||||
return FirFunctionCallImpl(baseSource).apply {
|
||||
calleeReference = FirSimpleNamedReference(operationReferenceSource, OperatorNameConventions.NOT, null)
|
||||
return buildFunctionCall {
|
||||
source = baseSource
|
||||
calleeReference = buildSimpleNamedReference {
|
||||
source = operationReferenceSource
|
||||
name = OperatorNameConventions.NOT
|
||||
}
|
||||
explicitReceiver = containsCall
|
||||
}
|
||||
}
|
||||
|
||||
fun generateAccessExpression(source: FirSourceElement?, name: Name): FirQualifiedAccessExpression =
|
||||
FirQualifiedAccessExpressionImpl(source).apply {
|
||||
calleeReference = FirSimpleNamedReference(source, name, null)
|
||||
buildQualifiedAccessExpression {
|
||||
this.source = source
|
||||
calleeReference = buildSimpleNamedReference {
|
||||
this.source = source
|
||||
this.name = name
|
||||
}
|
||||
}
|
||||
|
||||
fun generateResolvedAccessExpression(source: FirSourceElement?, variable: FirVariable<*>): FirQualifiedAccessExpression =
|
||||
FirQualifiedAccessExpressionImpl(source).apply {
|
||||
calleeReference = FirResolvedNamedReferenceImpl(source, variable.name, variable.symbol)
|
||||
buildQualifiedAccessExpression {
|
||||
this.source = source
|
||||
calleeReference = buildResolvedNamedReference {
|
||||
this.source = source
|
||||
name = variable.name
|
||||
resolvedSymbol = variable.symbol
|
||||
}
|
||||
}
|
||||
|
||||
internal fun generateDestructuringBlock(
|
||||
@@ -261,142 +302,165 @@ internal fun generateDestructuringBlock(
|
||||
multiDeclaration: KtDestructuringDeclaration,
|
||||
container: FirVariable<*>,
|
||||
tmpVariable: Boolean,
|
||||
extractAnnotationsTo: KtAnnotated.(FirAbstractAnnotatedElement) -> Unit,
|
||||
toFirOrImplicitTypeRef: KtTypeReference?.() -> FirTypeRef
|
||||
extractAnnotationsTo: KtAnnotated.(FirAnnotationContainerBuilder) -> Unit,
|
||||
toFirOrImplicitTypeRef: KtTypeReference?.() -> FirTypeRef,
|
||||
): FirExpression {
|
||||
return FirBlockImpl(multiDeclaration.toFirSourceElement()).apply {
|
||||
return buildBlock {
|
||||
source = multiDeclaration.toFirSourceElement()
|
||||
if (tmpVariable) {
|
||||
statements += container
|
||||
}
|
||||
val isVar = multiDeclaration.isVar
|
||||
for ((index, entry) in multiDeclaration.entries.withIndex()) {
|
||||
val entrySource = entry.toFirSourceElement()
|
||||
statements += FirPropertyImpl(
|
||||
entrySource,
|
||||
session,
|
||||
entry.typeReference.toFirOrImplicitTypeRef(),
|
||||
null,
|
||||
entry.nameAsSafeName,
|
||||
FirComponentCallImpl(entrySource, generateResolvedAccessExpression(entrySource, container), index + 1),
|
||||
null,
|
||||
isVar,
|
||||
FirPropertySymbol(entry.nameAsSafeName), // TODO?
|
||||
true,
|
||||
FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL)
|
||||
).apply {
|
||||
val name = entry.nameAsSafeName
|
||||
statements += buildProperty {
|
||||
source = entrySource
|
||||
this.session = session
|
||||
returnTypeRef = entry.typeReference.toFirOrImplicitTypeRef()
|
||||
this.name = name
|
||||
initializer = buildComponentCall {
|
||||
source = entrySource
|
||||
explicitReceiver = generateResolvedAccessExpression(entrySource, container)
|
||||
componentIndex = index + 1
|
||||
}
|
||||
this.isVar = isVar
|
||||
isLocal = true
|
||||
status = FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL)
|
||||
symbol = FirPropertySymbol(name)
|
||||
entry.extractAnnotationsTo(this)
|
||||
symbol.bind(this)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun generateTemporaryVariable(
|
||||
session: FirSession, source: FirSourceElement?, name: Name, initializer: FirExpression, typeRef: FirTypeRef? = null
|
||||
session: FirSession, source: FirSourceElement?, name: Name, initializer: FirExpression, typeRef: FirTypeRef? = null,
|
||||
): FirVariable<*> =
|
||||
FirPropertyImpl(
|
||||
source,
|
||||
session,
|
||||
typeRef ?: FirImplicitTypeRefImpl(source),
|
||||
null,
|
||||
name,
|
||||
initializer,
|
||||
null,
|
||||
false,
|
||||
FirPropertySymbol(name),
|
||||
true,
|
||||
FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL)
|
||||
).apply {
|
||||
symbol.bind(this)
|
||||
buildProperty {
|
||||
this.source = source
|
||||
this.session = session
|
||||
returnTypeRef = typeRef ?: buildImplicitTypeRef {
|
||||
this.source = source
|
||||
}
|
||||
this.name = name
|
||||
this.initializer = initializer
|
||||
symbol = FirPropertySymbol(name)
|
||||
isVar = false
|
||||
isLocal = true
|
||||
status = FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL)
|
||||
}
|
||||
|
||||
fun generateTemporaryVariable(
|
||||
session: FirSession, source: FirSourceElement?, specialName: String, initializer: FirExpression
|
||||
session: FirSession, source: FirSourceElement?, specialName: String, initializer: FirExpression,
|
||||
): FirVariable<*> = generateTemporaryVariable(session, source, Name.special("<$specialName>"), initializer)
|
||||
|
||||
fun FirModifiableVariable<*>.generateAccessorsByDelegate(
|
||||
fun FirPropertyBuilder.generateAccessorsByDelegate(
|
||||
delegateBuilder: FirWrappedDelegateExpressionBuilder?,
|
||||
session: FirSession,
|
||||
member: Boolean,
|
||||
extension: Boolean,
|
||||
stubMode: Boolean,
|
||||
receiver: FirExpression?
|
||||
|
||||
) {
|
||||
val variable = this as FirVariable<*>
|
||||
val delegateFieldSymbol = delegateFieldSymbol ?: return
|
||||
val delegate = delegate as? FirWrappedDelegateExpressionImpl ?: return
|
||||
fun delegateAccess() = FirQualifiedAccessExpressionImpl(null).apply {
|
||||
calleeReference = FirDelegateFieldReferenceImpl(null, null, delegateFieldSymbol)
|
||||
if (delegateBuilder == null) return
|
||||
val delegateFieldSymbol = FirDelegateFieldSymbol<FirProperty>(symbol.callableId).also {
|
||||
this.delegateFieldSymbol = it
|
||||
}
|
||||
fun delegateAccess() = buildQualifiedAccessExpression {
|
||||
source = null
|
||||
calleeReference = buildDelegateFieldReference {
|
||||
resolvedSymbol = delegateFieldSymbol
|
||||
}
|
||||
}
|
||||
|
||||
fun thisRef(): FirExpression =
|
||||
when {
|
||||
member || extension -> FirQualifiedAccessExpressionImpl(null).apply {
|
||||
calleeReference = FirExplicitThisReference(null, null)
|
||||
}
|
||||
else -> FirConstExpressionImpl(null, FirConstKind.Null, null)
|
||||
if (member || extension) buildQualifiedAccessExpression {
|
||||
source = null
|
||||
calleeReference = buildExplicitThisReference {}
|
||||
}
|
||||
else buildConstExpression(null, FirConstKind.Null, null)
|
||||
|
||||
fun propertyRef() = FirCallableReferenceAccessImpl(null).apply {
|
||||
calleeReference = FirResolvedNamedReferenceImpl(null, variable.name, variable.symbol)
|
||||
fun propertyRef() = buildCallableReferenceAccess {
|
||||
source = null
|
||||
calleeReference = buildResolvedNamedReference {
|
||||
source = null
|
||||
name = this@generateAccessorsByDelegate.name
|
||||
resolvedSymbol = this@generateAccessorsByDelegate.symbol
|
||||
}
|
||||
typeRef = FirImplicitKPropertyTypeRef(null, ConeStarProjection)
|
||||
}
|
||||
|
||||
delegate.delegateProvider = if (stubMode) FirExpressionStub(null) else FirFunctionCallImpl(null).apply {
|
||||
delegateBuilder.delegateProvider = if (stubMode) buildExpressionStub() else buildFunctionCall {
|
||||
explicitReceiver = receiver
|
||||
calleeReference = FirSimpleNamedReference(null, PROVIDE_DELEGATE, null)
|
||||
calleeReference = buildSimpleNamedReference {
|
||||
source = null
|
||||
name = PROVIDE_DELEGATE
|
||||
}
|
||||
arguments += thisRef()
|
||||
arguments += propertyRef()
|
||||
}
|
||||
delegate = delegateBuilder.build()
|
||||
if (stubMode) return
|
||||
if (getter == null || getter is FirDefaultPropertyAccessor) {
|
||||
getter = FirPropertyAccessorImpl(
|
||||
null,
|
||||
session,
|
||||
FirImplicitTypeRefImpl(null),
|
||||
FirPropertyAccessorSymbol(),
|
||||
true,
|
||||
FirDeclarationStatusImpl(Visibilities.UNKNOWN, Modality.FINAL)
|
||||
).apply Accessor@{
|
||||
val returnTarget = FirFunctionTarget(null, isLambda = false)
|
||||
getter = buildPropertyAccessor {
|
||||
this.session = session
|
||||
returnTypeRef = buildImplicitTypeRef()
|
||||
isGetter = true
|
||||
status = FirDeclarationStatusImpl(Visibilities.UNKNOWN, Modality.FINAL)
|
||||
symbol = FirPropertyAccessorSymbol()
|
||||
|
||||
body = FirSingleExpressionBlock(
|
||||
FirReturnExpressionImpl(
|
||||
null,
|
||||
FirFunctionCallImpl(null).apply {
|
||||
buildReturnExpression {
|
||||
result = buildFunctionCall {
|
||||
source = null
|
||||
explicitReceiver = delegateAccess()
|
||||
calleeReference = FirSimpleNamedReference(null, GET_VALUE, null)
|
||||
calleeReference = buildSimpleNamedReference {
|
||||
source = null
|
||||
name = GET_VALUE
|
||||
}
|
||||
arguments += thisRef()
|
||||
arguments += propertyRef()
|
||||
}
|
||||
).apply {
|
||||
target = FirFunctionTarget(null)
|
||||
target.bind(this@Accessor)
|
||||
target = returnTarget
|
||||
}
|
||||
)
|
||||
}.also {
|
||||
returnTarget.bind(it)
|
||||
}
|
||||
}
|
||||
if (variable.isVar && (setter == null || setter is FirDefaultPropertyAccessor)) {
|
||||
setter = FirPropertyAccessorImpl(
|
||||
null,
|
||||
session,
|
||||
session.builtinTypes.unitType,
|
||||
FirPropertyAccessorSymbol(),
|
||||
false,
|
||||
FirDeclarationStatusImpl(Visibilities.UNKNOWN, Modality.FINAL)
|
||||
).apply {
|
||||
val parameter = FirValueParameterImpl(
|
||||
null, session, FirImplicitTypeRefImpl(null),
|
||||
DELEGATED_SETTER_PARAM, FirVariableSymbol(name),
|
||||
defaultValue = null, isCrossinline = false,
|
||||
isNoinline = false, isVararg = false
|
||||
)
|
||||
if (isVar && (setter == null || setter is FirDefaultPropertyAccessor)) {
|
||||
setter = buildPropertyAccessor {
|
||||
this.session = session
|
||||
returnTypeRef = session.builtinTypes.unitType
|
||||
isGetter = false
|
||||
status = FirDeclarationStatusImpl(Visibilities.UNKNOWN, Modality.FINAL)
|
||||
val parameter = buildValueParameter {
|
||||
this.session = session
|
||||
returnTypeRef = buildImplicitTypeRef()
|
||||
name = DELEGATED_SETTER_PARAM
|
||||
symbol = FirVariableSymbol(this@generateAccessorsByDelegate.name)
|
||||
isCrossinline = false
|
||||
isNoinline = false
|
||||
isVararg = false
|
||||
}
|
||||
valueParameters += parameter
|
||||
symbol = FirPropertyAccessorSymbol()
|
||||
body = FirSingleExpressionBlock(
|
||||
FirFunctionCallImpl(null).apply {
|
||||
buildFunctionCall {
|
||||
explicitReceiver = delegateAccess()
|
||||
calleeReference = FirSimpleNamedReference(null, SET_VALUE, null)
|
||||
calleeReference = buildSimpleNamedReference {
|
||||
name = SET_VALUE
|
||||
}
|
||||
arguments += thisRef()
|
||||
arguments += propertyRef()
|
||||
arguments += FirQualifiedAccessExpressionImpl(null).apply {
|
||||
calleeReference = FirResolvedNamedReferenceImpl(source, DELEGATED_SETTER_PARAM, parameter.symbol)
|
||||
arguments += buildQualifiedAccessExpression {
|
||||
calleeReference = buildResolvedNamedReference {
|
||||
name = DELEGATED_SETTER_PARAM
|
||||
resolvedSymbol = parameter.symbol
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
@@ -404,11 +468,15 @@ fun FirModifiableVariable<*>.generateAccessorsByDelegate(
|
||||
}
|
||||
}
|
||||
|
||||
fun FirTypeRef.convertToArrayType(): FirUserTypeRef = FirUserTypeRefImpl(source, isMarkedNullable = false).apply {
|
||||
fun FirTypeRef.convertToArrayType(): FirUserTypeRef = buildUserTypeRef {
|
||||
source = this@convertToArrayType.source
|
||||
isMarkedNullable = false
|
||||
qualifier += FirQualifierPartImpl(StandardClassIds.Array.shortClassName).apply {
|
||||
typeArguments += FirTypeProjectionWithVarianceImpl(
|
||||
source, this@convertToArrayType, Variance.OUT_VARIANCE
|
||||
)
|
||||
typeArguments += buildTypeProjectionWithVariance {
|
||||
source = this@convertToArrayType.source
|
||||
typeRef = this@convertToArrayType
|
||||
variance = Variance.OUT_VARIANCE
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,111 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2019 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.builder
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.FirFunctionTarget
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.addDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirImplicitThisReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.toFirSourceElement
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||
import org.jetbrains.kotlin.psi.KtParameter
|
||||
|
||||
fun List<Pair<KtParameter?, FirProperty>>.generateComponentFunctions(
|
||||
session: FirSession, firClass: FirModifiableRegularClass, packageFqName: FqName, classFqName: FqName,
|
||||
firPrimaryConstructor: FirConstructor
|
||||
) {
|
||||
var componentIndex = 1
|
||||
for ((ktParameter, firProperty) in this) {
|
||||
if (!firProperty.isVal && !firProperty.isVar) continue
|
||||
val name = Name.identifier("component$componentIndex")
|
||||
componentIndex++
|
||||
val symbol = FirNamedFunctionSymbol(CallableId(packageFqName, classFqName, name))
|
||||
val status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL)
|
||||
val parameterSource = ktParameter?.toFirSourceElement()
|
||||
firClass.addDeclaration(
|
||||
FirSimpleFunctionImpl(
|
||||
parameterSource, session, FirImplicitTypeRefImpl(parameterSource),
|
||||
null, status, name, symbol
|
||||
).apply {
|
||||
val componentFunction = this
|
||||
body = FirSingleExpressionBlock(
|
||||
FirReturnExpressionImpl(
|
||||
parameterSource,
|
||||
FirQualifiedAccessExpressionImpl(parameterSource).apply {
|
||||
val parameterName = firProperty.name
|
||||
dispatchReceiver = FirThisReceiverExpressionImpl(null, FirImplicitThisReference(firClass.symbol)).apply {
|
||||
typeRef = firPrimaryConstructor.returnTypeRef
|
||||
}
|
||||
calleeReference = FirResolvedNamedReferenceImpl(
|
||||
parameterSource,
|
||||
parameterName, firProperty.symbol
|
||||
)
|
||||
}
|
||||
).apply {
|
||||
target = FirFunctionTarget(null)
|
||||
target.bind(componentFunction)
|
||||
}
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private val copyName = Name.identifier("copy")
|
||||
|
||||
fun List<Pair<KtParameter?, FirProperty>>.generateCopyFunction(
|
||||
session: FirSession, classOrObject: KtClassOrObject?, firClass: FirModifiableRegularClass, packageFqName: FqName, classFqName: FqName,
|
||||
firPrimaryConstructor: FirConstructor
|
||||
) {
|
||||
val symbol = FirNamedFunctionSymbol(CallableId(packageFqName, classFqName, copyName))
|
||||
val status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL)
|
||||
firClass.addDeclaration(
|
||||
FirSimpleFunctionImpl(
|
||||
classOrObject?.toFirSourceElement(),
|
||||
session,
|
||||
firPrimaryConstructor.returnTypeRef,
|
||||
null,
|
||||
status,
|
||||
copyName,
|
||||
symbol
|
||||
).apply {
|
||||
for ((ktParameter, firProperty) in this@generateCopyFunction) {
|
||||
val name = firProperty.name
|
||||
val parameterSource = ktParameter?.toFirSourceElement()
|
||||
valueParameters += FirValueParameterImpl(
|
||||
parameterSource, session, firProperty.returnTypeRef,
|
||||
name,
|
||||
FirVariableSymbol(name),
|
||||
FirQualifiedAccessExpressionImpl(parameterSource).apply {
|
||||
dispatchReceiver = FirThisReceiverExpressionImpl(null, FirImplicitThisReference(firClass.symbol)).apply {
|
||||
typeRef = firPrimaryConstructor.returnTypeRef
|
||||
}
|
||||
calleeReference = FirResolvedNamedReferenceImpl(parameterSource, name, firProperty.symbol)
|
||||
},
|
||||
isCrossinline = false, isNoinline = false, isVararg = false
|
||||
)
|
||||
}
|
||||
|
||||
body = FirEmptyExpressionBlock()
|
||||
}
|
||||
)
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
+4
-1
@@ -22,6 +22,8 @@ import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirStubReference
|
||||
import org.jetbrains.kotlin.fir.render
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.isExtensionFunctionAnnotationCall
|
||||
@@ -161,7 +163,8 @@ abstract class AbstractRawFirBuilderTestCase : KtParsingTestCase(
|
||||
|
||||
private fun throwTwiceVisitingError(element: FirElement) {
|
||||
if (element is FirTypeRef || element is FirNoReceiverExpression || element is FirTypeParameter ||
|
||||
element is FirEmptyContractDescription || element.isExtensionFunctionAnnotation
|
||||
element is FirEmptyContractDescription || element is FirEmptyControlFlowGraphReference ||
|
||||
element is FirStubReference || element.isExtensionFunctionAnnotation
|
||||
) {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -9,22 +9,20 @@ import org.jetbrains.kotlin.contracts.description.InvocationKind
|
||||
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirAnonymousFunctionImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildAnonymousFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildTypeParameter
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirCheckNotNullCallImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirTryExpressionImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirWhenExpressionImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.*
|
||||
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||
import org.jetbrains.kotlin.fir.references.FirNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.FirReference
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirIntegerOperatorCall
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirIntegerOperatorCallBuilder
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeProjection
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
|
||||
fun FirFunctionCall.copy(
|
||||
annotations: List<FirAnnotationCall> = this.annotations,
|
||||
@@ -38,21 +36,27 @@ fun FirFunctionCall.copy(
|
||||
typeArguments: List<FirTypeProjection> = this.typeArguments,
|
||||
resultType: FirTypeRef = this.typeRef
|
||||
): FirFunctionCall {
|
||||
return if (this is FirIntegerOperatorCall) {
|
||||
FirIntegerOperatorCall(source)
|
||||
val builder = if (this is FirIntegerOperatorCall) {
|
||||
FirIntegerOperatorCallBuilder().apply {
|
||||
this.calleeReference = calleeReference
|
||||
}
|
||||
} else {
|
||||
FirFunctionCallImpl(source)
|
||||
}.apply {
|
||||
FirFunctionCallBuilder().apply {
|
||||
this.calleeReference = calleeReference
|
||||
}
|
||||
}
|
||||
builder.apply {
|
||||
this.source = source
|
||||
this.safe = safe
|
||||
this.annotations.addAll(annotations)
|
||||
this.arguments.addAll(arguments)
|
||||
this.calleeReference = calleeReference
|
||||
this.explicitReceiver = explicitReceiver
|
||||
this.dispatchReceiver = dispatchReceiver
|
||||
this.extensionReceiver = extensionReceiver
|
||||
this.typeArguments.addAll(typeArguments)
|
||||
this.typeRef = resultType
|
||||
}
|
||||
return (builder as FirCallBuilder).build() as FirFunctionCall
|
||||
}
|
||||
|
||||
fun FirAnonymousFunction.copy(
|
||||
@@ -68,7 +72,13 @@ fun FirAnonymousFunction.copy(
|
||||
controlFlowGraphReference: FirControlFlowGraphReference = this.controlFlowGraphReference,
|
||||
invocationKind: InvocationKind? = this.invocationKind
|
||||
): FirAnonymousFunction {
|
||||
return FirAnonymousFunctionImpl(source, session, returnTypeRef, receiverTypeRef, symbol, isLambda).apply {
|
||||
return buildAnonymousFunction {
|
||||
this.source = source
|
||||
this.session = session
|
||||
this.returnTypeRef = returnTypeRef
|
||||
this.receiverTypeRef = receiverTypeRef
|
||||
symbol = this@copy.symbol
|
||||
isLambda = this@copy.isLambda
|
||||
this.valueParameters.addAll(valueParameters)
|
||||
this.body = body
|
||||
this.annotations.addAll(annotations)
|
||||
@@ -83,7 +93,9 @@ fun FirAnonymousFunction.copy(
|
||||
fun FirTypeRef.resolvedTypeFromPrototype(
|
||||
type: ConeKotlinType
|
||||
): FirResolvedTypeRef {
|
||||
return FirResolvedTypeRefImpl(source, type).apply {
|
||||
return buildResolvedTypeRef {
|
||||
source = this@resolvedTypeFromPrototype.source
|
||||
this.type = type
|
||||
annotations += this@resolvedTypeFromPrototype.annotations
|
||||
}
|
||||
}
|
||||
@@ -91,10 +103,14 @@ fun FirTypeRef.resolvedTypeFromPrototype(
|
||||
fun FirTypeParameter.copy(
|
||||
bounds: List<FirTypeRef> = this.bounds,
|
||||
annotations: List<FirAnnotationCall> = this.annotations
|
||||
): FirTypeParameterImpl {
|
||||
return FirTypeParameterImpl(
|
||||
source, session, name, symbol, variance, isReified
|
||||
).apply {
|
||||
): FirTypeParameter {
|
||||
return buildTypeParameter {
|
||||
source = this@copy.source
|
||||
session = this@copy.session
|
||||
name = this@copy.name
|
||||
symbol = this@copy.symbol
|
||||
variance = this@copy.variance
|
||||
isReified = this@copy.isReified
|
||||
this.bounds += bounds
|
||||
this.annotations += annotations
|
||||
}
|
||||
@@ -104,10 +120,13 @@ fun FirWhenExpression.copy(
|
||||
resultType: FirTypeRef = this.typeRef,
|
||||
calleeReference: FirReference = this.calleeReference,
|
||||
annotations: List<FirAnnotationCall> = this.annotations
|
||||
): FirWhenExpressionImpl = FirWhenExpressionImpl(source, subject, subjectVariable).apply {
|
||||
): FirWhenExpression = buildWhenExpression {
|
||||
source = this@copy.source
|
||||
subject = this@copy.subject
|
||||
subjectVariable = this@copy.subjectVariable
|
||||
this.calleeReference = calleeReference
|
||||
this@apply.branches.addAll(this@copy.branches)
|
||||
this.typeRef = resultType
|
||||
branches += this@copy.branches
|
||||
typeRef = resultType
|
||||
this.annotations += annotations
|
||||
}
|
||||
|
||||
@@ -115,10 +134,13 @@ fun FirTryExpression.copy(
|
||||
resultType: FirTypeRef = this.typeRef,
|
||||
calleeReference: FirReference = this.calleeReference,
|
||||
annotations: List<FirAnnotationCall> = this.annotations
|
||||
): FirTryExpressionImpl = FirTryExpressionImpl(source, tryBlock, finallyBlock).apply {
|
||||
): FirTryExpression = buildTryExpression {
|
||||
source = this@copy.source
|
||||
tryBlock = this@copy.tryBlock
|
||||
finallyBlock = this@copy.finallyBlock
|
||||
this.calleeReference = calleeReference
|
||||
this@apply.catches.addAll(this@copy.catches)
|
||||
this.typeRef = resultType
|
||||
catches += this@copy.catches
|
||||
typeRef = resultType
|
||||
this.annotations += annotations
|
||||
}
|
||||
|
||||
@@ -126,9 +148,10 @@ fun FirCheckNotNullCall.copy(
|
||||
resultType: FirTypeRef = this.typeRef,
|
||||
calleeReference: FirReference = this.calleeReference,
|
||||
annotations: List<FirAnnotationCall> = this.annotations
|
||||
): FirCheckNotNullCallImpl = FirCheckNotNullCallImpl(source).apply {
|
||||
): FirCheckNotNullCall = buildCheckNotNullCall {
|
||||
source = this@copy.source
|
||||
this.calleeReference = calleeReference
|
||||
this@apply.arguments.addAll(this@copy.arguments)
|
||||
arguments += this@copy.arguments
|
||||
this.typeRef = resultType
|
||||
this.annotations += annotations
|
||||
}
|
||||
@@ -8,16 +8,16 @@ package org.jetbrains.kotlin.fir
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedQualifierImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedReifiedParameterReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildExpressionStub
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildResolvedQualifier
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildResolvedReifiedParameterReference
|
||||
import org.jetbrains.kotlin.fir.references.FirNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.FirReference
|
||||
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.FirSuperReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirBackingFieldReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildBackingFieldReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.resolve.*
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.*
|
||||
@@ -35,7 +35,7 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope
|
||||
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder
|
||||
import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator
|
||||
@@ -46,7 +46,7 @@ class FirCallResolver(
|
||||
topLevelScopes: List<FirScope>,
|
||||
localScopes: List<FirLocalScope>,
|
||||
override val implicitReceiverStack: ImplicitReceiverStack,
|
||||
private val qualifiedResolver: FirQualifiedNameResolver
|
||||
private val qualifiedResolver: FirQualifiedNameResolver,
|
||||
) : BodyResolveComponents by components {
|
||||
|
||||
private lateinit var transformer: FirExpressionsResolveTransformer
|
||||
@@ -58,7 +58,7 @@ class FirCallResolver(
|
||||
private val towerResolver = FirTowerResolver(
|
||||
returnTypeCalculator, this, resolutionStageRunner,
|
||||
topLevelScopes = topLevelScopes.asReversed(),
|
||||
localScopes = localScopes.asReversed()
|
||||
localScopes = localScopes.asReversed(),
|
||||
)
|
||||
|
||||
private val conflictResolver =
|
||||
@@ -86,7 +86,7 @@ class FirCallResolver(
|
||||
functionCall.calleeReference,
|
||||
functionCall.calleeReference.name,
|
||||
result.candidates,
|
||||
result.applicability
|
||||
result.applicability,
|
||||
)
|
||||
|
||||
val resultExpression = functionCall.transformCalleeReference(StoreNameReference, nameReference)
|
||||
@@ -99,7 +99,7 @@ class FirCallResolver(
|
||||
dispatchReceiver = candidate.dispatchReceiverExpression(),
|
||||
extensionReceiver = candidate.extensionReceiverExpression(),
|
||||
arguments = candidate.callInfo.arguments,
|
||||
safe = candidate.callInfo.isSafeCall
|
||||
safe = candidate.callInfo.isSafeCall,
|
||||
)
|
||||
} else {
|
||||
resultExpression
|
||||
@@ -112,7 +112,7 @@ class FirCallResolver(
|
||||
}
|
||||
|
||||
private data class ResolutionResult(
|
||||
val info: CallInfo, val applicability: CandidateApplicability, val candidates: Collection<Candidate>
|
||||
val info: CallInfo, val applicability: CandidateApplicability, val candidates: Collection<Candidate>,
|
||||
)
|
||||
|
||||
private fun collectCandidates(functionCall: FirFunctionCall): ResolutionResult {
|
||||
@@ -129,12 +129,12 @@ class FirCallResolver(
|
||||
typeArguments,
|
||||
session,
|
||||
file,
|
||||
transformer.components.implicitReceiverStack
|
||||
transformer.components.implicitReceiverStack,
|
||||
)
|
||||
towerResolver.reset()
|
||||
val result = towerResolver.runResolver(
|
||||
implicitReceiverStack.receiversAsReversed(),
|
||||
info
|
||||
info,
|
||||
)
|
||||
val bestCandidates = result.bestCandidates()
|
||||
val reducedCandidates = if (result.currentApplicability < CandidateApplicability.SYNTHETIC_RESOLVED) {
|
||||
@@ -168,12 +168,12 @@ class FirCallResolver(
|
||||
emptyList(),
|
||||
session,
|
||||
file,
|
||||
transformer.components.implicitReceiverStack
|
||||
transformer.components.implicitReceiverStack,
|
||||
)
|
||||
towerResolver.reset()
|
||||
val result = towerResolver.runResolver(
|
||||
implicitReceiverStack.receiversAsReversed(),
|
||||
info
|
||||
info,
|
||||
)
|
||||
|
||||
val bestCandidates = result.bestCandidates()
|
||||
@@ -189,7 +189,7 @@ class FirCallResolver(
|
||||
callee,
|
||||
callee.name,
|
||||
reducedCandidates,
|
||||
result.currentApplicability
|
||||
result.currentApplicability,
|
||||
)
|
||||
|
||||
if (qualifiedAccess.explicitReceiver == null) {
|
||||
@@ -214,10 +214,13 @@ class FirCallResolver(
|
||||
when {
|
||||
referencedSymbol is FirClassLikeSymbol<*> -> {
|
||||
val classId = referencedSymbol.classId
|
||||
return FirResolvedQualifierImpl(
|
||||
nameReference.source, classId.packageFqName, classId.relativeClassName, safe = false
|
||||
).apply {
|
||||
return buildResolvedQualifier {
|
||||
source = nameReference.source
|
||||
packageFqName = classId.packageFqName
|
||||
relativeClassFqName = classId.relativeClassName
|
||||
safe = false
|
||||
typeArguments.addAll(qualifiedAccess.typeArguments)
|
||||
}.apply {
|
||||
resultType = if (classId.isLocal) {
|
||||
typeForQualifierByDeclaration(referencedSymbol.fir, resultType, session)
|
||||
?: session.builtinTypes.unitType
|
||||
@@ -227,8 +230,10 @@ class FirCallResolver(
|
||||
}
|
||||
}
|
||||
referencedSymbol is FirTypeParameterSymbol && referencedSymbol.fir.isReified -> {
|
||||
return FirResolvedReifiedParameterReferenceImpl(nameReference.source, referencedSymbol).apply {
|
||||
resultType = typeForReifiedParameterReference(this)
|
||||
return buildResolvedReifiedParameterReference {
|
||||
source = nameReference.source
|
||||
symbol = referencedSymbol
|
||||
typeRef = typeForReifiedParameterReference(this)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -246,7 +251,7 @@ class FirCallResolver(
|
||||
|
||||
fun resolveCallableReference(
|
||||
constraintSystemBuilder: ConstraintSystemBuilder,
|
||||
resolvedCallableReferenceAtom: ResolvedCallableReferenceAtom
|
||||
resolvedCallableReferenceAtom: ResolvedCallableReferenceAtom,
|
||||
): Boolean {
|
||||
val callableReferenceAccess = resolvedCallableReferenceAtom.reference
|
||||
val lhs = resolvedCallableReferenceAtom.lhs
|
||||
@@ -255,14 +260,14 @@ class FirCallResolver(
|
||||
|
||||
val info = createCallableReferencesInfoForLHS(
|
||||
callableReferenceAccess, lhs,
|
||||
expectedType, constraintSystemBuilder
|
||||
expectedType, constraintSystemBuilder,
|
||||
)
|
||||
// No reset here!
|
||||
val result = towerResolver.runResolver(
|
||||
implicitReceiverStack.receiversAsReversed(),
|
||||
info,
|
||||
collector = CandidateCollector(this, resolutionStageRunner),
|
||||
manager = TowerResolveManager(towerResolver)
|
||||
manager = TowerResolveManager(towerResolver),
|
||||
)
|
||||
val bestCandidates = result.bestCandidates()
|
||||
val noSuccessfulCandidates = result.currentApplicability < CandidateApplicability.SYNTHETIC_RESOLVED
|
||||
@@ -298,7 +303,7 @@ class FirCallResolver(
|
||||
fun resolveDelegatingConstructorCall(
|
||||
delegatedConstructorCall: FirDelegatedConstructorCall,
|
||||
symbol: FirClassSymbol<*>,
|
||||
typeArguments: List<FirTypeProjection>
|
||||
typeArguments: List<FirTypeProjection>,
|
||||
): FirDelegatedConstructorCall? {
|
||||
val scope = symbol.fir.unsubstitutedScope(session, scopeSession)
|
||||
val className = symbol.classId.shortClassName
|
||||
@@ -311,7 +316,7 @@ class FirCallResolver(
|
||||
typeArguments = typeArguments,
|
||||
session,
|
||||
file,
|
||||
implicitReceiverStack
|
||||
implicitReceiverStack,
|
||||
)
|
||||
val candidateFactory = CandidateFactory(this, callInfo)
|
||||
val candidates = mutableListOf<Candidate>()
|
||||
@@ -325,7 +330,7 @@ class FirCallResolver(
|
||||
}
|
||||
|
||||
private fun <T> selectCandidateFromGivenCandidates(
|
||||
call: T, name: Name, candidates: Collection<Candidate>
|
||||
call: T, name: Name, candidates: Collection<Candidate>,
|
||||
): T where T : FirResolvable, T : FirCall {
|
||||
val result = CandidateCollector(this, resolutionStageRunner)
|
||||
candidates.forEach { result.consumeCandidate(TowerGroup.Start, it) }
|
||||
@@ -340,7 +345,7 @@ class FirCallResolver(
|
||||
call.calleeReference,
|
||||
name,
|
||||
reducedCandidates,
|
||||
result.currentApplicability
|
||||
result.currentApplicability,
|
||||
)
|
||||
|
||||
return call.transformCalleeReference(StoreNameReference, nameReference) as T
|
||||
@@ -350,7 +355,7 @@ class FirCallResolver(
|
||||
callableReferenceAccess: FirCallableReferenceAccess,
|
||||
lhs: DoubleColonLHS?,
|
||||
expectedType: ConeKotlinType?,
|
||||
outerConstraintSystemBuilder: ConstraintSystemBuilder?
|
||||
outerConstraintSystemBuilder: ConstraintSystemBuilder?,
|
||||
): CallInfo {
|
||||
return CallInfo(
|
||||
CallKind.CallableReference,
|
||||
@@ -366,9 +371,12 @@ class FirCallResolver(
|
||||
expectedType,
|
||||
outerConstraintSystemBuilder,
|
||||
lhs,
|
||||
stubReceiver = if (lhs !is DoubleColonLHS.Type) null else FirExpressionStub(callableReferenceAccess.source).apply {
|
||||
replaceTypeRef(FirResolvedTypeRefImpl(null, lhs.type))
|
||||
}
|
||||
stubReceiver = if (lhs !is DoubleColonLHS.Type) null else buildExpressionStub {
|
||||
source = callableReferenceAccess.source
|
||||
typeRef = buildResolvedTypeRef {
|
||||
type = lhs.type
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
@@ -376,40 +384,54 @@ class FirCallResolver(
|
||||
reference: FirReference,
|
||||
name: Name,
|
||||
candidates: Collection<Candidate>,
|
||||
applicability: CandidateApplicability
|
||||
applicability: CandidateApplicability,
|
||||
): FirNamedReference {
|
||||
val source = reference.source
|
||||
return when {
|
||||
candidates.isEmpty() -> FirErrorNamedReferenceImpl(
|
||||
source, FirUnresolvedNameError(name)
|
||||
)
|
||||
candidates.isEmpty() -> buildErrorNamedReference {
|
||||
this.source = source
|
||||
diagnostic = FirUnresolvedNameError(name)
|
||||
}
|
||||
applicability < CandidateApplicability.SYNTHETIC_RESOLVED -> {
|
||||
FirErrorNamedReferenceImpl(
|
||||
source,
|
||||
FirInapplicableCandidateError(applicability, candidates.map {
|
||||
FirInapplicableCandidateError.CandidateInfo(
|
||||
it.symbol,
|
||||
if (it.systemInitialized) it.system.diagnostics else emptyList()
|
||||
)
|
||||
})
|
||||
)
|
||||
buildErrorNamedReference {
|
||||
this.source = source
|
||||
diagnostic = FirInapplicableCandidateError(
|
||||
applicability,
|
||||
candidates.map {
|
||||
FirInapplicableCandidateError.CandidateInfo(
|
||||
it.symbol,
|
||||
if (it.systemInitialized) it.system.diagnostics else emptyList(),
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
candidates.size == 1 -> {
|
||||
val candidate = candidates.single()
|
||||
val coneSymbol = candidate.symbol
|
||||
when {
|
||||
coneSymbol is FirBackingFieldSymbol -> FirBackingFieldReferenceImpl(source, null, coneSymbol)
|
||||
coneSymbol is FirBackingFieldSymbol -> buildBackingFieldReference {
|
||||
this.source = source
|
||||
resolvedSymbol = coneSymbol
|
||||
}
|
||||
|
||||
coneSymbol is FirVariableSymbol && (
|
||||
coneSymbol !is FirPropertySymbol ||
|
||||
(coneSymbol.phasedFir() as FirMemberDeclaration).typeParameters.isEmpty()
|
||||
) ->
|
||||
FirResolvedNamedReferenceImpl(source, name, coneSymbol)
|
||||
)
|
||||
-> buildResolvedNamedReference {
|
||||
this.source = source
|
||||
this.name = name
|
||||
resolvedSymbol = coneSymbol
|
||||
}
|
||||
|
||||
else -> FirNamedReferenceWithCandidate(source, name, candidate)
|
||||
}
|
||||
}
|
||||
else -> FirErrorNamedReferenceImpl(
|
||||
source, FirAmbiguityError(name, candidates.map { it.symbol })
|
||||
)
|
||||
else -> buildErrorNamedReference {
|
||||
this.source = source
|
||||
diagnostic = FirAmbiguityError(name, candidates.map { it.symbol })
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.fir
|
||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
|
||||
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
||||
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedQualifierImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildResolvedQualifier
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
|
||||
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
|
||||
@@ -62,12 +62,14 @@ class FirQualifiedNameResolver(components: BodyResolveComponents) : BodyResolveC
|
||||
|
||||
if (resolved != null) {
|
||||
qualifierPartsToDrop = qualifierParts.size - 1
|
||||
return FirResolvedQualifierImpl(
|
||||
source,
|
||||
resolved.packageFqName,
|
||||
resolved.relativeClassFqName,
|
||||
return buildResolvedQualifier {
|
||||
this.source = source
|
||||
packageFqName = resolved.packageFqName
|
||||
relativeClassFqName = resolved.relativeClassFqName
|
||||
safe = false
|
||||
).apply { resultType = typeForQualifier(this) }
|
||||
}.apply {
|
||||
resultType = typeForQualifier(this)
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
|
||||
+32
-29
@@ -13,19 +13,19 @@ import org.jetbrains.kotlin.fir.declarations.collectEnumEntries
|
||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstKind
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.*
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.resolve.constructType
|
||||
import org.jetbrains.kotlin.fir.resolve.diagnostics.FirUnresolvedSymbolError
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstKind
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||
import org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.Argument.Value.Type.*
|
||||
import org.jetbrains.kotlin.metadata.deserialization.Flags
|
||||
@@ -87,21 +87,21 @@ abstract class AbstractAnnotationDeserializer(
|
||||
val name = nameResolver.getName(it.nameId)
|
||||
val parameter = parameterByName[name] ?: return@mapNotNull null
|
||||
val value = resolveValue(parameter.returnTypeRef, it.value, nameResolver) ?: return@mapNotNull null
|
||||
FirNamedArgumentExpressionImpl(
|
||||
null, value, false, name
|
||||
)
|
||||
buildNamedArgumentExpression {
|
||||
expression = value
|
||||
isSpread = false
|
||||
this.name = name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return FirAnnotationCallImpl(
|
||||
null, null,
|
||||
symbol?.let {
|
||||
FirResolvedTypeRefImpl(
|
||||
null, it.constructType(emptyList(), isNullable = false)
|
||||
)
|
||||
} ?: FirErrorTypeRefImpl(null, FirUnresolvedSymbolError(classId))
|
||||
).apply {
|
||||
return buildAnnotationCall {
|
||||
annotationTypeRef = symbol?.let {
|
||||
buildResolvedTypeRef {
|
||||
type = it.constructType(emptyList(), isNullable = false)
|
||||
}
|
||||
} ?: buildErrorTypeRef { diagnostic =FirUnresolvedSymbolError(classId) }
|
||||
this.arguments += arguments
|
||||
}
|
||||
}
|
||||
@@ -122,16 +122,17 @@ abstract class AbstractAnnotationDeserializer(
|
||||
BOOLEAN -> const(FirConstKind.Boolean, (value.intValue != 0L))
|
||||
STRING -> const(FirConstKind.String, nameResolver.getString(value.stringValue))
|
||||
ANNOTATION -> deserializeAnnotation(value.annotation, nameResolver)
|
||||
CLASS -> FirGetClassCallImpl(null).apply {
|
||||
CLASS -> buildGetClassCall {
|
||||
val classId = nameResolver.getClassId(value.classId)
|
||||
val lookupTag = ConeClassLikeLookupTagImpl(classId)
|
||||
val referencedType = lookupTag.constructType(emptyArray(), isNullable = false)
|
||||
arguments += FirClassReferenceExpressionImpl(
|
||||
null,
|
||||
FirResolvedTypeRefImpl(null, referencedType)
|
||||
)
|
||||
arguments += buildClassReferenceExpression {
|
||||
classTypeRef = buildResolvedTypeRef {
|
||||
type = referencedType
|
||||
}
|
||||
}
|
||||
}
|
||||
ENUM -> FirFunctionCallImpl(null).apply {
|
||||
ENUM -> buildFunctionCall {
|
||||
val classId = nameResolver.getClassId(value.classId)
|
||||
val entryName = nameResolver.getName(value.enumValueId)
|
||||
|
||||
@@ -142,11 +143,13 @@ abstract class AbstractAnnotationDeserializer(
|
||||
val enumEntries = firClass?.collectEnumEntries() ?: emptyList()
|
||||
val enumEntrySymbol = enumEntries.find { it.name == entryName }
|
||||
this.calleeReference = enumEntrySymbol?.let {
|
||||
FirResolvedNamedReferenceImpl(null, entryName, it.symbol)
|
||||
} ?: FirErrorNamedReferenceImpl(
|
||||
null,
|
||||
FirSimpleDiagnostic("Strange deserialized enum value: $classId.$entryName", DiagnosticKind.DeserializationError)
|
||||
)
|
||||
buildResolvedNamedReference {
|
||||
name = entryName
|
||||
resolvedSymbol = it.symbol
|
||||
}
|
||||
} ?: buildErrorNamedReference {
|
||||
diagnostic = FirSimpleDiagnostic("Strange deserialized enum value: $classId.$entryName", DiagnosticKind.DeserializationError)
|
||||
}
|
||||
}
|
||||
// ARRAY -> {
|
||||
// TODO: see AnnotationDeserializer
|
||||
@@ -157,5 +160,5 @@ abstract class AbstractAnnotationDeserializer(
|
||||
return result
|
||||
}
|
||||
|
||||
private fun <T> const(kind: FirConstKind<T>, value: T) = FirConstExpressionImpl(null, kind, value)
|
||||
private fun <T> const(kind: FirConstKind<T>, value: T) = buildConstExpression(null, kind, value)
|
||||
}
|
||||
|
||||
+22
-38
@@ -11,16 +11,16 @@ import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.calculateSAM
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.addDeclarations
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirClassImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirClassImplBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirSealedClassBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildEnumEntry
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirEnumEntryImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirSealedClassImpl
|
||||
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||
import org.jetbrains.kotlin.metadata.deserialization.Flags
|
||||
import org.jetbrains.kotlin.metadata.deserialization.NameResolver
|
||||
@@ -57,28 +57,15 @@ fun deserializeClassToSymbol(
|
||||
isInline = Flags.IS_INLINE_CLASS.get(classProto.flags)
|
||||
}
|
||||
val isSealed = modality == Modality.SEALED
|
||||
val firClass = if (isSealed) {
|
||||
FirSealedClassImpl(
|
||||
null,
|
||||
session,
|
||||
status,
|
||||
ProtoEnumFlags.classKind(kind),
|
||||
scopeProvider,
|
||||
classId.shortClassName,
|
||||
symbol
|
||||
)
|
||||
} else {
|
||||
FirClassImpl(
|
||||
null,
|
||||
session,
|
||||
status,
|
||||
ProtoEnumFlags.classKind(kind),
|
||||
scopeProvider,
|
||||
classId.shortClassName,
|
||||
symbol
|
||||
)
|
||||
}
|
||||
firClass.apply {
|
||||
val classBuilder = if (isSealed) FirSealedClassBuilder() else FirClassImplBuilder()
|
||||
classBuilder.apply {
|
||||
this.session = session
|
||||
name = classId.shortClassName
|
||||
this.status = status
|
||||
classKind = ProtoEnumFlags.classKind(kind)
|
||||
this.scopeProvider = scopeProvider
|
||||
this.symbol = symbol
|
||||
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
val context =
|
||||
parentContext?.childContext(
|
||||
@@ -102,7 +89,7 @@ fun deserializeClassToSymbol(
|
||||
|
||||
superTypesDeserialized.mapNotNullTo(superTypeRefs) {
|
||||
if (it == null) return@mapNotNullTo null
|
||||
FirResolvedTypeRefImpl(null, it)
|
||||
buildResolvedTypeRef { type = it }
|
||||
}
|
||||
|
||||
addDeclarations(classProto.functionList.map(classDeserializer::loadFunction))
|
||||
@@ -126,17 +113,14 @@ fun deserializeClassToSymbol(
|
||||
val enumEntryName = nameResolver.getName(enumEntryProto.name)
|
||||
|
||||
val enumType = ConeClassLikeTypeImpl(symbol.toLookupTag(), emptyArray(), false)
|
||||
val property = FirEnumEntryImpl(
|
||||
null,
|
||||
session,
|
||||
FirResolvedTypeRefImpl(null, enumType),
|
||||
enumEntryName,
|
||||
initializer = null,
|
||||
symbol = FirVariableSymbol(CallableId(classId, enumEntryName)),
|
||||
status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL).apply {
|
||||
val property = buildEnumEntry {
|
||||
this.session = session
|
||||
returnTypeRef = buildResolvedTypeRef { type = enumType }
|
||||
name = enumEntryName
|
||||
this.symbol = FirVariableSymbol(CallableId(classId, enumEntryName))
|
||||
this.status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL).apply {
|
||||
isStatic = true
|
||||
}
|
||||
).apply {
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
}
|
||||
|
||||
@@ -145,10 +129,10 @@ fun deserializeClassToSymbol(
|
||||
)
|
||||
|
||||
if (isSealed) {
|
||||
classProto.sealedSubclassFqNameList.mapTo((firClass as FirSealedClassImpl).inheritors) {
|
||||
classProto.sealedSubclassFqNameList.mapTo((this as FirSealedClassBuilder).inheritors) {
|
||||
ClassId.fromString(nameResolver.getQualifiedClassName(it))
|
||||
}
|
||||
}
|
||||
calculateSAM()
|
||||
}
|
||||
firClass.calculateSAM()
|
||||
}
|
||||
|
||||
+3
-3
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.fir.deserialization
|
||||
|
||||
import org.jetbrains.kotlin.contracts.description.InvocationKind
|
||||
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
|
||||
import org.jetbrains.kotlin.fir.contracts.builder.buildContractDescription
|
||||
import org.jetbrains.kotlin.fir.contracts.description.*
|
||||
import org.jetbrains.kotlin.fir.contracts.impl.FirContractDescriptionImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.expressions.LogicOperationKind
|
||||
@@ -22,8 +22,8 @@ import org.jetbrains.kotlin.utils.addIfNotNull
|
||||
class FirContractDeserializer(private val c: FirDeserializationContext) {
|
||||
fun loadContract(proto: ProtoBuf.Contract, owner: FirContractDescriptionOwner): FirContractDescription? {
|
||||
val effects = proto.effectList.map { loadPossiblyConditionalEffect(it, owner) ?: return null }
|
||||
return FirContractDescriptionImpl(null).apply {
|
||||
this.effects.addAll(effects)
|
||||
return buildContractDescription {
|
||||
this.effects += effects
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+87
-113
@@ -9,20 +9,22 @@ import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.*
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.*
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildExpressionStub
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||
import org.jetbrains.kotlin.metadata.deserialization.*
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||
import org.jetbrains.kotlin.serialization.deserialization.getName
|
||||
|
||||
class FirDeserializationContext(
|
||||
@@ -131,59 +133,50 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
||||
val flags = proto.flags
|
||||
val name = c.nameResolver.getName(proto.name)
|
||||
val local = c.childContext(proto.typeParameterList)
|
||||
val status = FirDeclarationStatusImpl(ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)), Modality.FINAL).apply {
|
||||
isExpect = Flags.IS_EXPECT_CLASS.get(flags)
|
||||
isActual = false
|
||||
}
|
||||
return FirTypeAliasImpl(
|
||||
null,
|
||||
c.session,
|
||||
status,
|
||||
name,
|
||||
FirTypeAliasSymbol(ClassId(c.packageFqName, name)),
|
||||
FirResolvedTypeRefImpl(
|
||||
null,
|
||||
local.typeDeserializer.type(proto.underlyingType(c.typeTable))
|
||||
)
|
||||
).apply {
|
||||
return buildTypeAlias {
|
||||
session = c.session
|
||||
this.name = name
|
||||
status = FirDeclarationStatusImpl(ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)), Modality.FINAL).apply {
|
||||
isExpect = Flags.IS_EXPECT_CLASS.get(flags)
|
||||
isActual = false
|
||||
}
|
||||
symbol = FirTypeAliasSymbol(ClassId(c.packageFqName, name))
|
||||
expandedTypeRef = buildResolvedTypeRef {
|
||||
type = local.typeDeserializer.type(proto.underlyingType(c.typeTable))
|
||||
}
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir }
|
||||
}
|
||||
}
|
||||
|
||||
fun loadProperty(proto: ProtoBuf.Property): FirProperty {
|
||||
fun loadProperty(proto: ProtoBuf.Property, containerSource: DeserializedContainerSource? = null): FirProperty {
|
||||
val flags = if (proto.hasFlags()) proto.flags else loadOldFlags(proto.oldFlags)
|
||||
val callableName = c.nameResolver.getName(proto.name)
|
||||
val symbol = FirPropertySymbol(CallableId(c.packageFqName, c.relativeClassName, callableName))
|
||||
val local = c.childContext(proto.typeParameterList)
|
||||
val returnTypeRef = proto.returnType(c.typeTable).toTypeRef(local)
|
||||
|
||||
val getterFlags = if (proto.hasGetterFlags()) proto.getterFlags else flags
|
||||
val setterFlags = if (proto.hasSetterFlags()) proto.setterFlags else flags
|
||||
val isVar = Flags.IS_VAR.get(flags)
|
||||
val status = FirDeclarationStatusImpl(
|
||||
ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)),
|
||||
ProtoEnumFlags.modality(Flags.MODALITY.get(flags))
|
||||
).apply {
|
||||
isExpect = Flags.IS_EXPECT_PROPERTY.get(flags)
|
||||
isActual = false
|
||||
isOverride = false
|
||||
isConst = Flags.IS_CONST.get(flags)
|
||||
isLateInit = Flags.IS_LATEINIT.get(flags)
|
||||
}
|
||||
return FirPropertyImpl(
|
||||
null,
|
||||
c.session,
|
||||
returnTypeRef,
|
||||
proto.receiverType(c.typeTable)?.toTypeRef(local),
|
||||
callableName,
|
||||
null,
|
||||
null,
|
||||
isVar,
|
||||
symbol,
|
||||
false,
|
||||
status
|
||||
).apply {
|
||||
return buildProperty {
|
||||
session = c.session
|
||||
returnTypeRef = proto.returnType(c.typeTable).toTypeRef(local)
|
||||
receiverTypeRef = proto.receiverType(c.typeTable)?.toTypeRef(local)
|
||||
name = callableName
|
||||
this.isVar = isVar
|
||||
this.symbol = symbol
|
||||
isLocal = false
|
||||
status = FirDeclarationStatusImpl(
|
||||
ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)),
|
||||
ProtoEnumFlags.modality(Flags.MODALITY.get(flags))
|
||||
).apply {
|
||||
isExpect = Flags.IS_EXPECT_PROPERTY.get(flags)
|
||||
isActual = false
|
||||
isOverride = false
|
||||
isConst = Flags.IS_CONST.get(flags)
|
||||
isLateInit = Flags.IS_LATEINIT.get(flags)
|
||||
}
|
||||
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir }
|
||||
annotations += c.annotationDeserializer.loadPropertyAnnotations(proto, local.nameResolver)
|
||||
@@ -191,10 +184,11 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
||||
setter = if (isVar) {
|
||||
FirDefaultPropertySetter(null, c.session, returnTypeRef, ProtoEnumFlags.visibility(Flags.VISIBILITY.get(setterFlags)))
|
||||
} else null
|
||||
this.containerSource = containerSource
|
||||
}
|
||||
}
|
||||
|
||||
fun loadFunction(proto: ProtoBuf.Function): FirSimpleFunction {
|
||||
fun loadFunction(proto: ProtoBuf.Function, containerSource: DeserializedContainerSource? = null): FirSimpleFunction {
|
||||
val flags = if (proto.hasFlags()) proto.flags else loadOldFlags(proto.oldFlags)
|
||||
|
||||
val receiverAnnotations =
|
||||
@@ -208,99 +202,83 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
||||
val callableName = c.nameResolver.getName(proto.name)
|
||||
val symbol = FirNamedFunctionSymbol(CallableId(c.packageFqName, c.relativeClassName, callableName))
|
||||
val local = c.childContext(proto.typeParameterList)
|
||||
val status = FirDeclarationStatusImpl(
|
||||
ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)),
|
||||
ProtoEnumFlags.modality(Flags.MODALITY.get(flags))
|
||||
).apply {
|
||||
isExpect = Flags.IS_EXPECT_FUNCTION.get(flags)
|
||||
isActual = false
|
||||
isOverride = false
|
||||
isOperator = Flags.IS_OPERATOR.get(flags)
|
||||
isInfix = Flags.IS_INFIX.get(flags)
|
||||
isInline = Flags.IS_INLINE.get(flags)
|
||||
isTailRec = Flags.IS_TAILREC.get(flags)
|
||||
isExternal = Flags.IS_EXTERNAL_FUNCTION.get(flags)
|
||||
isSuspend = Flags.IS_SUSPEND.get(flags)
|
||||
}
|
||||
|
||||
// TODO: support contracts
|
||||
|
||||
val simpleFunction = FirSimpleFunctionImpl(
|
||||
null,
|
||||
c.session,
|
||||
proto.returnType(local.typeTable).toTypeRef(local),
|
||||
proto.receiverType(local.typeTable)?.toTypeRef(local),
|
||||
status,
|
||||
callableName,
|
||||
symbol
|
||||
).apply {
|
||||
val simpleFunction = buildSimpleFunction {
|
||||
session = c.session
|
||||
returnTypeRef = proto.returnType(local.typeTable).toTypeRef(local)
|
||||
receiverTypeRef = proto.receiverType(local.typeTable)?.toTypeRef(local)
|
||||
name = callableName
|
||||
status = FirDeclarationStatusImpl(
|
||||
ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)),
|
||||
ProtoEnumFlags.modality(Flags.MODALITY.get(flags))
|
||||
).apply {
|
||||
isExpect = Flags.IS_EXPECT_FUNCTION.get(flags)
|
||||
isActual = false
|
||||
isOverride = false
|
||||
isOperator = Flags.IS_OPERATOR.get(flags)
|
||||
isInfix = Flags.IS_INFIX.get(flags)
|
||||
isInline = Flags.IS_INLINE.get(flags)
|
||||
isTailRec = Flags.IS_TAILREC.get(flags)
|
||||
isExternal = Flags.IS_EXTERNAL_FUNCTION.get(flags)
|
||||
isSuspend = Flags.IS_SUSPEND.get(flags)
|
||||
}
|
||||
this.symbol = symbol
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir }
|
||||
valueParameters += local.memberDeserializer.valueParameters(proto.valueParameterList)
|
||||
annotations += local.annotationDeserializer.loadFunctionAnnotations(proto, local.nameResolver)
|
||||
this.containerSource = containerSource
|
||||
}
|
||||
if (proto.hasContract()) {
|
||||
val contractDescription = contractDeserializer.loadContract(proto.contract, simpleFunction)
|
||||
if (contractDescription != null) {
|
||||
simpleFunction.contractDescription = contractDescription
|
||||
simpleFunction.replaceContractDescription(contractDescription)
|
||||
}
|
||||
}
|
||||
return simpleFunction
|
||||
}
|
||||
|
||||
fun loadConstructor(proto: ProtoBuf.Constructor, klass: FirRegularClass): FirConstructor {
|
||||
fun loadConstructor(proto: ProtoBuf.Constructor, classBuilder: AbstractFirRegularClassBuilder): FirConstructor {
|
||||
val flags = proto.flags
|
||||
val relativeClassName = c.relativeClassName!!
|
||||
val symbol = FirConstructorSymbol(CallableId(c.packageFqName, relativeClassName, relativeClassName.shortName()))
|
||||
val local = c.childContext(emptyList())
|
||||
val isPrimary = !Flags.IS_SECONDARY.get(flags)
|
||||
|
||||
val typeParameters = klass.typeParameters
|
||||
val typeParameters = classBuilder.typeParameters
|
||||
|
||||
val delegatedSelfType = FirResolvedTypeRefImpl(
|
||||
null,
|
||||
ConeClassLikeTypeImpl(
|
||||
klass.symbol.toLookupTag(),
|
||||
val delegatedSelfType = buildResolvedTypeRef {
|
||||
type = ConeClassLikeTypeImpl(
|
||||
classBuilder.symbol.toLookupTag(),
|
||||
typeParameters.map { ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false) }.toTypedArray(),
|
||||
false
|
||||
)
|
||||
)
|
||||
|
||||
val status = FirDeclarationStatusImpl(ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)), Modality.FINAL).apply {
|
||||
isExpect = Flags.IS_EXPECT_FUNCTION.get(flags)
|
||||
isActual = false
|
||||
isInner = klass.isInner
|
||||
}
|
||||
|
||||
return if (isPrimary) {
|
||||
FirPrimaryConstructorImpl(
|
||||
null,
|
||||
c.session,
|
||||
delegatedSelfType,
|
||||
null,
|
||||
status,
|
||||
symbol
|
||||
)
|
||||
FirPrimaryConstructorBuilder()
|
||||
} else {
|
||||
FirConstructorImpl(
|
||||
null,
|
||||
c.session,
|
||||
delegatedSelfType,
|
||||
null,
|
||||
status,
|
||||
symbol
|
||||
)
|
||||
FirConstructorBuilder()
|
||||
}.apply {
|
||||
session = c.session
|
||||
returnTypeRef = delegatedSelfType
|
||||
status = FirDeclarationStatusImpl(ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)), Modality.FINAL).apply {
|
||||
isExpect = Flags.IS_EXPECT_FUNCTION.get(flags)
|
||||
isActual = false
|
||||
isInner = classBuilder.status.isInner
|
||||
}
|
||||
this.symbol = symbol
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
this.typeParameters += typeParameters
|
||||
valueParameters += local.memberDeserializer.valueParameters(proto.valueParameterList)
|
||||
annotations += local.annotationDeserializer.loadConstructorAnnotations(proto, local.nameResolver)
|
||||
}
|
||||
|
||||
}.build()
|
||||
}
|
||||
|
||||
private fun defaultValue(flags: Int): FirExpression? {
|
||||
if (Flags.DECLARES_DEFAULT_VALUE.get(flags)) {
|
||||
return FirExpressionStub(null)
|
||||
return buildExpressionStub()
|
||||
}
|
||||
return null
|
||||
}
|
||||
@@ -311,27 +289,23 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
||||
return valueParameters.map { proto ->
|
||||
val flags = if (proto.hasFlags()) proto.flags else 0
|
||||
val name = c.nameResolver.getName(proto.name)
|
||||
FirValueParameterImpl(
|
||||
null,
|
||||
c.session,
|
||||
proto.type(c.typeTable).toTypeRef(c),
|
||||
name,
|
||||
FirVariableSymbol(name),
|
||||
defaultValue(flags),
|
||||
isCrossinline = Flags.IS_CROSSINLINE.get(flags),
|
||||
isNoinline = Flags.IS_NOINLINE.get(flags),
|
||||
buildValueParameter {
|
||||
session = c.session
|
||||
returnTypeRef = proto.type(c.typeTable).toTypeRef(c)
|
||||
this.name = name
|
||||
symbol = FirVariableSymbol(name)
|
||||
defaultValue = defaultValue(flags)
|
||||
isCrossinline = Flags.IS_CROSSINLINE.get(flags)
|
||||
isNoinline = Flags.IS_NOINLINE.get(flags)
|
||||
isVararg = proto.varargElementType(c.typeTable) != null
|
||||
).apply {
|
||||
annotations += c.annotationDeserializer.loadValueParameterAnnotations(proto, c.nameResolver)
|
||||
}
|
||||
}.toList()
|
||||
}
|
||||
|
||||
private fun ProtoBuf.Type.toTypeRef(context: FirDeserializationContext): FirTypeRef {
|
||||
val coneType = context.typeDeserializer.type(this)
|
||||
return FirResolvedTypeRefImpl(
|
||||
null, coneType
|
||||
).apply {
|
||||
return buildResolvedTypeRef {
|
||||
type = context.typeDeserializer.type(this@toTypeRef)
|
||||
annotations += context.annotationDeserializer.loadTypeAnnotations(this@toTypeRef, context.nameResolver)
|
||||
}
|
||||
}
|
||||
|
||||
+48
-47
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.fir.deserialization
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner
|
||||
import org.jetbrains.kotlin.fir.declarations.addDefaultBoundIfNecessary
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder
|
||||
import org.jetbrains.kotlin.fir.resolve.toTypeProjection
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag
|
||||
@@ -17,9 +17,9 @@ import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||
import org.jetbrains.kotlin.metadata.deserialization.*
|
||||
import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags
|
||||
@@ -35,6 +35,51 @@ class FirTypeDeserializer(
|
||||
typeParameterProtos: List<ProtoBuf.TypeParameter>,
|
||||
val parent: FirTypeDeserializer?
|
||||
) {
|
||||
private val typeParameterDescriptors: Map<Int, FirTypeParameterSymbol> = if (typeParameterProtos.isNotEmpty()) {
|
||||
LinkedHashMap<Int, FirTypeParameterSymbol>()
|
||||
} else {
|
||||
mapOf()
|
||||
}
|
||||
|
||||
private val typeParameterNames: Map<String, FirTypeParameterSymbol>
|
||||
|
||||
val ownTypeParameters: List<FirTypeParameterSymbol>
|
||||
get() = typeParameterDescriptors.values.toList()
|
||||
|
||||
init {
|
||||
if (typeParameterProtos.isNotEmpty()) {
|
||||
typeParameterNames = mutableMapOf()
|
||||
val result = typeParameterDescriptors as LinkedHashMap<Int, FirTypeParameterSymbol>
|
||||
val builders = mutableListOf<FirTypeParameterBuilder>()
|
||||
for (proto in typeParameterProtos) {
|
||||
if (!proto.hasId()) continue
|
||||
val name = nameResolver.getName(proto.name)
|
||||
val symbol = FirTypeParameterSymbol().also {
|
||||
typeParameterNames[name.asString()] = it
|
||||
}
|
||||
builders += FirTypeParameterBuilder().apply {
|
||||
session = this@FirTypeDeserializer.session
|
||||
this.name = name
|
||||
this.symbol = symbol
|
||||
variance = proto.variance.convertVariance()
|
||||
isReified = proto.reified
|
||||
}
|
||||
result[proto.id] = symbol
|
||||
}
|
||||
|
||||
for ((index, proto) in typeParameterProtos.withIndex()) {
|
||||
val builder = builders[index]
|
||||
builder.apply {
|
||||
proto.upperBoundList.mapTo(bounds) {
|
||||
buildResolvedTypeRef { type = type(it) }
|
||||
}
|
||||
addDefaultBoundIfNecessary()
|
||||
}.build()
|
||||
}
|
||||
} else {
|
||||
typeParameterNames = emptyMap()
|
||||
}
|
||||
}
|
||||
|
||||
private fun computeClassifier(fqNameIndex: Int): ConeClassLikeLookupTag? {
|
||||
try {
|
||||
@@ -47,7 +92,6 @@ class FirTypeDeserializer(
|
||||
|
||||
fun type(proto: ProtoBuf.Type): ConeKotlinType {
|
||||
if (proto.hasFlexibleTypeCapabilitiesId()) {
|
||||
val id = nameResolver.getString(proto.flexibleTypeCapabilitiesId)
|
||||
val lowerBound = simpleType(proto)
|
||||
val upperBound = simpleType(proto.flexibleUpperBound(typeTable)!!)
|
||||
return ConeFlexibleType(lowerBound!!, upperBound!!)
|
||||
@@ -57,7 +101,6 @@ class FirTypeDeserializer(
|
||||
return simpleType(proto) ?: ConeKotlinErrorType("?!id:0")
|
||||
}
|
||||
|
||||
|
||||
private fun typeParameterSymbol(typeParameterId: Int): ConeTypeParameterLookupTag? =
|
||||
typeParameterDescriptors[typeParameterId]?.toLookupTag() ?: parent?.typeParameterSymbol(typeParameterId)
|
||||
|
||||
@@ -70,46 +113,6 @@ class FirTypeDeserializer(
|
||||
}
|
||||
}
|
||||
|
||||
private val typeParameterDescriptors: Map<Int, FirTypeParameterSymbol> =
|
||||
if (typeParameterProtos.isEmpty()) {
|
||||
mapOf()
|
||||
} else {
|
||||
val result = LinkedHashMap<Int, FirTypeParameterSymbol>()
|
||||
for ((index, proto) in typeParameterProtos.withIndex()) {
|
||||
if (!proto.hasId()) continue
|
||||
val name = nameResolver.getName(proto.name)
|
||||
val symbol = FirTypeParameterSymbol()
|
||||
FirTypeParameterImpl(
|
||||
null,
|
||||
session,
|
||||
name,
|
||||
symbol,
|
||||
proto.variance.convertVariance(),
|
||||
proto.reified
|
||||
)
|
||||
result[proto.id] = symbol
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
|
||||
init {
|
||||
for ((index, proto) in typeParameterProtos.withIndex()) {
|
||||
if (!proto.hasId()) continue
|
||||
val symbol = typeParameterDescriptors[proto.id]!!
|
||||
val declaration = symbol.fir as FirTypeParameterImpl
|
||||
declaration.apply {
|
||||
proto.upperBoundList.mapTo(bounds) {
|
||||
FirResolvedTypeRefImpl(null, type(it))
|
||||
}
|
||||
addDefaultBoundIfNecessary()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val ownTypeParameters: List<FirTypeParameterSymbol>
|
||||
get() = typeParameterDescriptors.values.toList()
|
||||
|
||||
|
||||
fun FirClassLikeSymbol<*>.typeParameters(): List<FirTypeParameterSymbol> =
|
||||
(fir as? FirTypeParametersOwner)?.typeParameters?.map { it.symbol }.orEmpty()
|
||||
@@ -146,9 +149,7 @@ class FirTypeDeserializer(
|
||||
proto.hasTypeParameter() -> typeParameterSymbol(proto.typeParameter)
|
||||
proto.hasTypeParameterName() -> {
|
||||
val name = nameResolver.getString(proto.typeParameterName)
|
||||
|
||||
// TODO: Optimize
|
||||
ownTypeParameters.find { it.name.asString() == name }?.toLookupTag()
|
||||
typeParameterNames[name]?.toLookupTag()
|
||||
}
|
||||
else -> null
|
||||
}
|
||||
|
||||
@@ -13,6 +13,8 @@ import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.diagnostics.FirStubDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.FirResolvedQualifierBuilder
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.FirResolvedReifiedParameterReferenceBuilder
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionWithSmartcastImpl
|
||||
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||
@@ -29,10 +31,10 @@ import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType
|
||||
import org.jetbrains.kotlin.fir.symbols.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.AbstractStrictEqualityTypeChecker
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
@@ -65,7 +67,7 @@ fun ConeClassLikeLookupTag.toSymbol(useSiteSession: FirSession): FirClassLikeSym
|
||||
|
||||
fun ConeClassLikeType.fullyExpandedType(
|
||||
useSiteSession: FirSession,
|
||||
expandedConeType: (FirTypeAlias) -> ConeClassLikeType? = FirTypeAlias::expandedConeType
|
||||
expandedConeType: (FirTypeAlias) -> ConeClassLikeType? = FirTypeAlias::expandedConeType,
|
||||
): ConeClassLikeType {
|
||||
if (this is ConeClassLikeTypeImpl) {
|
||||
val expandedTypeAndSession = cachedExpandedType
|
||||
@@ -83,7 +85,7 @@ fun ConeClassLikeType.fullyExpandedType(
|
||||
|
||||
private fun ConeClassLikeType.fullyExpandedTypeNoCache(
|
||||
useSiteSession: FirSession,
|
||||
expandedConeType: (FirTypeAlias) -> ConeClassLikeType?
|
||||
expandedConeType: (FirTypeAlias) -> ConeClassLikeType?,
|
||||
): ConeClassLikeType {
|
||||
val directExpansionType = directExpansionType(useSiteSession, expandedConeType) ?: return this
|
||||
return directExpansionType.fullyExpandedType(useSiteSession, expandedConeType)
|
||||
@@ -91,7 +93,7 @@ private fun ConeClassLikeType.fullyExpandedTypeNoCache(
|
||||
|
||||
fun ConeClassLikeType.directExpansionType(
|
||||
useSiteSession: FirSession,
|
||||
expandedConeType: (FirTypeAlias) -> ConeClassLikeType? = FirTypeAlias::expandedConeType
|
||||
expandedConeType: (FirTypeAlias) -> ConeClassLikeType? = FirTypeAlias::expandedConeType,
|
||||
): ConeClassLikeType? {
|
||||
val typeAlias = lookupTag
|
||||
.toSymbol(useSiteSession)
|
||||
@@ -105,7 +107,7 @@ fun ConeClassLikeType.directExpansionType(
|
||||
private fun mapTypeAliasArguments(
|
||||
typeAlias: FirTypeAlias,
|
||||
abbreviatedType: ConeClassLikeType,
|
||||
resultingType: ConeClassLikeType
|
||||
resultingType: ConeClassLikeType,
|
||||
): ConeKotlinType {
|
||||
val typeAliasMap = typeAlias.typeParameters.map { it.symbol }.zip(abbreviatedType.typeArguments).toMap()
|
||||
|
||||
@@ -141,7 +143,10 @@ fun ConeClassifierLookupTag.toSymbol(useSiteSession: FirSession): FirClassifierS
|
||||
|
||||
fun ConeTypeParameterLookupTag.toSymbol(): FirTypeParameterSymbol = this.symbol as FirTypeParameterSymbol
|
||||
|
||||
fun ConeClassLikeLookupTag.constructClassType(typeArguments: Array<out ConeKotlinTypeProjection>, isNullable: Boolean): ConeLookupTagBasedType {
|
||||
fun ConeClassLikeLookupTag.constructClassType(
|
||||
typeArguments: Array<out ConeKotlinTypeProjection>,
|
||||
isNullable: Boolean,
|
||||
): ConeLookupTagBasedType {
|
||||
return ConeClassLikeTypeImpl(this, typeArguments, isNullable)
|
||||
}
|
||||
|
||||
@@ -165,7 +170,7 @@ fun FirClassifierSymbol<*>.constructType(typeArguments: Array<ConeKotlinTypeProj
|
||||
ConeClassLikeTypeImpl(
|
||||
this.toLookupTag(),
|
||||
typeArguments = typeArguments,
|
||||
isNullable = isNullable
|
||||
isNullable = isNullable,
|
||||
)
|
||||
}
|
||||
else -> error("!")
|
||||
@@ -178,7 +183,7 @@ fun FirClassifierSymbol<*>.constructType(parts: List<FirQualifierPart>, isNullab
|
||||
fun FirClassifierSymbol<*>.constructType(
|
||||
parts: List<FirQualifierPart>,
|
||||
isNullable: Boolean,
|
||||
symbolOriginSession: FirSession
|
||||
symbolOriginSession: FirSession,
|
||||
): ConeKotlinType =
|
||||
constructType(parts.toTypeProjections(), isNullable)
|
||||
.also {
|
||||
@@ -211,7 +216,7 @@ private fun List<FirQualifierPart>.toTypeProjections(): Array<ConeKotlinTypeProj
|
||||
fun coneFlexibleOrSimpleType(
|
||||
typeContext: ConeInferenceContext?,
|
||||
lowerBound: ConeKotlinType,
|
||||
upperBound: ConeKotlinType
|
||||
upperBound: ConeKotlinType,
|
||||
): ConeKotlinType {
|
||||
if (lowerBound is ConeFlexibleType) {
|
||||
return coneFlexibleOrSimpleType(typeContext, lowerBound.lowerBound, upperBound)
|
||||
@@ -296,14 +301,17 @@ fun FirFunction<*>.constructFunctionalTypeRef(session: FirSession): FirResolvedT
|
||||
|
||||
val functionalType = createFunctionalType(parameters, receiverTypeRef?.coneTypeSafe(), rawReturnType)
|
||||
|
||||
return FirResolvedTypeRefImpl(source, functionalType)
|
||||
return buildResolvedTypeRef {
|
||||
source = this@constructFunctionalTypeRef.source
|
||||
type = functionalType
|
||||
}
|
||||
}
|
||||
|
||||
fun createFunctionalType(
|
||||
parameters: List<ConeKotlinType>,
|
||||
receiverType: ConeKotlinType?,
|
||||
rawReturnType: ConeKotlinType,
|
||||
isKFunctionType: Boolean = false
|
||||
isKFunctionType: Boolean = false,
|
||||
): ConeLookupTagBasedType {
|
||||
val receiverAndParameterTypes = listOfNotNull(receiverType) + parameters + listOf(rawReturnType)
|
||||
|
||||
@@ -315,7 +323,7 @@ fun createFunctionalType(
|
||||
fun createKPropertyType(
|
||||
receiverType: ConeKotlinType?,
|
||||
rawReturnType: ConeKotlinType,
|
||||
isMutable: Boolean
|
||||
isMutable: Boolean,
|
||||
): ConeLookupTagBasedType {
|
||||
val arguments = if (receiverType != null) listOf(receiverType, rawReturnType) else listOf(rawReturnType)
|
||||
val classId = StandardClassIds.reflectByName("K${if (isMutable) "Mutable" else ""}Property${arguments.size - 1}")
|
||||
@@ -327,7 +335,9 @@ fun BodyResolveComponents.typeForQualifier(resolvedQualifier: FirResolvedQualifi
|
||||
val resultType = resolvedQualifier.resultType
|
||||
if (classId != null) {
|
||||
val classSymbol = symbolProvider.getClassLikeSymbolByFqName(classId)
|
||||
?: return FirErrorTypeRefImpl(source = null, diagnostic = FirSimpleDiagnostic("No type for qualifier", DiagnosticKind.Other))
|
||||
?: return buildErrorTypeRef {
|
||||
diagnostic = FirSimpleDiagnostic("No type for qualifier", DiagnosticKind.Other)
|
||||
}
|
||||
val declaration = classSymbol.phasedFir
|
||||
if (declaration !is FirTypeAlias || resolvedQualifier.typeArguments.isEmpty()) {
|
||||
typeForQualifierByDeclaration(declaration, resultType, session)?.let { return it }
|
||||
@@ -337,9 +347,9 @@ fun BodyResolveComponents.typeForQualifier(resolvedQualifier: FirResolvedQualifi
|
||||
return session.builtinTypes.unitType
|
||||
}
|
||||
|
||||
internal fun typeForReifiedParameterReference(parameterReference: FirResolvedReifiedParameterReference): FirTypeRef {
|
||||
val resultType = parameterReference.resultType
|
||||
val typeParameterSymbol = parameterReference.symbol
|
||||
internal fun typeForReifiedParameterReference(parameterReferenceBuilder: FirResolvedReifiedParameterReferenceBuilder): FirTypeRef {
|
||||
val resultType = parameterReferenceBuilder.typeRef
|
||||
val typeParameterSymbol = parameterReferenceBuilder.symbol
|
||||
return resultType.resolvedTypeFromPrototype(typeParameterSymbol.constructType(emptyArray(), false))
|
||||
}
|
||||
|
||||
@@ -351,13 +361,13 @@ internal fun typeForQualifierByDeclaration(declaration: FirDeclaration, resultTy
|
||||
if (declaration is FirRegularClass) {
|
||||
if (declaration.classKind == ClassKind.OBJECT) {
|
||||
return resultType.resolvedTypeFromPrototype(
|
||||
declaration.symbol.constructType(emptyArray(), false)
|
||||
declaration.symbol.constructType(emptyArray(), false),
|
||||
)
|
||||
} else {
|
||||
val companionObject = declaration.companionObject
|
||||
if (companionObject != null) {
|
||||
return resultType.resolvedTypeFromPrototype(
|
||||
companionObject.symbol.constructType(emptyArray(), false)
|
||||
companionObject.symbol.constructType(emptyArray(), false),
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -385,7 +395,10 @@ fun <T : FirResolvable> BodyResolveComponents.typeFromCallee(access: T): FirReso
|
||||
|
||||
return when (val newCallee = access.calleeReference) {
|
||||
is FirErrorNamedReference ->
|
||||
FirErrorTypeRefImpl(access.source, FirStubDiagnostic(newCallee.diagnostic))
|
||||
buildErrorTypeRef {
|
||||
source = access.source
|
||||
diagnostic = FirStubDiagnostic(newCallee.diagnostic)
|
||||
}
|
||||
is FirNamedReferenceWithCandidate -> {
|
||||
typeFromSymbol(newCallee.candidateSymbol, makeNullable)
|
||||
}
|
||||
@@ -395,10 +408,16 @@ fun <T : FirResolvable> BodyResolveComponents.typeFromCallee(access: T): FirReso
|
||||
is FirThisReference -> {
|
||||
val labelName = newCallee.labelName
|
||||
val implicitReceiver = implicitReceiverStack[labelName]
|
||||
FirResolvedTypeRefImpl(null, implicitReceiver?.type ?: ConeKotlinErrorType("Unresolved this@$labelName"))
|
||||
buildResolvedTypeRef {
|
||||
source = null
|
||||
type = implicitReceiver?.type ?: ConeKotlinErrorType("Unresolved this@$labelName")
|
||||
}
|
||||
}
|
||||
is FirSuperReference -> {
|
||||
newCallee.superTypeRef as? FirResolvedTypeRef ?: FirErrorTypeRefImpl(newCallee.source, FirUnresolvedNameError(Name.identifier("super")))
|
||||
newCallee.superTypeRef as? FirResolvedTypeRef ?: buildErrorTypeRef {
|
||||
source = newCallee.source
|
||||
diagnostic = FirUnresolvedNameError(Name.identifier("super"))
|
||||
}
|
||||
}
|
||||
else -> error("Failed to extract type from: $newCallee")
|
||||
}
|
||||
@@ -410,7 +429,7 @@ private fun BodyResolveComponents.typeFromSymbol(symbol: AbstractFirBasedSymbol<
|
||||
val returnType = returnTypeCalculator.tryCalculateReturnType(symbol.phasedFir)
|
||||
if (makeNullable) {
|
||||
returnType.withReplacedConeType(
|
||||
returnType.coneTypeUnsafe<ConeKotlinType>().withNullability(ConeNullability.NULLABLE, session.inferenceContext)
|
||||
returnType.coneTypeUnsafe<ConeKotlinType>().withNullability(ConeNullability.NULLABLE, session.inferenceContext),
|
||||
)
|
||||
} else {
|
||||
returnType
|
||||
@@ -419,9 +438,10 @@ private fun BodyResolveComponents.typeFromSymbol(symbol: AbstractFirBasedSymbol<
|
||||
is FirClassifierSymbol<*> -> {
|
||||
val fir = (symbol as? AbstractFirBasedSymbol<*>)?.phasedFir
|
||||
// TODO: unhack
|
||||
FirResolvedTypeRefImpl(
|
||||
null, symbol.constructType(emptyArray(), isNullable = false)
|
||||
)
|
||||
buildResolvedTypeRef {
|
||||
source = null
|
||||
type = symbol.constructType(emptyArray(), isNullable = false)
|
||||
}
|
||||
}
|
||||
else -> error("WTF ! $symbol")
|
||||
}
|
||||
@@ -434,7 +454,9 @@ fun BodyResolveComponents.transformQualifiedAccessUsingSmartcastInfo(qualifiedAc
|
||||
}
|
||||
val intersectedType = ConeTypeIntersector.intersectTypes(inferenceComponents.ctx as ConeInferenceContext, allTypes)
|
||||
// TODO: add check that intersectedType is not equal to original type
|
||||
val intersectedTypeRef = FirResolvedTypeRefImpl(qualifiedAccessExpression.resultType.source, intersectedType).apply {
|
||||
val intersectedTypeRef = buildResolvedTypeRef {
|
||||
source = qualifiedAccessExpression.resultType.source
|
||||
type = intersectedType
|
||||
annotations += qualifiedAccessExpression.resultType.annotations
|
||||
}
|
||||
return FirExpressionWithSmartcastImpl(qualifiedAccessExpression, intersectedTypeRef, typesFromSmartCast)
|
||||
|
||||
@@ -10,10 +10,10 @@ import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSessionComponent
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
||||
import org.jetbrains.kotlin.fir.inferenceContext
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
|
||||
@@ -25,9 +25,9 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
@@ -43,7 +43,7 @@ val SAM_PARAMETER_NAME = Name.identifier("block")
|
||||
|
||||
class FirSamResolverImpl(
|
||||
private val firSession: FirSession,
|
||||
private val scopeSession: ScopeSession
|
||||
private val scopeSession: ScopeSession,
|
||||
) : FirSamResolver {
|
||||
|
||||
private val resolvedFunctionType: MutableMap<FirRegularClass, Any> = mutableMapOf()
|
||||
@@ -54,13 +54,14 @@ class FirSamResolverImpl(
|
||||
is ConeClassLikeType -> getFunctionTypeForPossibleSamType(type)
|
||||
is ConeFlexibleType -> ConeFlexibleType(
|
||||
getFunctionTypeForPossibleSamType(type.lowerBound) ?: return null,
|
||||
getFunctionTypeForPossibleSamType(type.upperBound) ?: return null
|
||||
getFunctionTypeForPossibleSamType(type.upperBound) ?: return null,
|
||||
)
|
||||
is ConeClassErrorType, is ConeStubType -> null
|
||||
// TODO: support those types as well
|
||||
is ConeTypeParameterType, is ConeTypeVariableType,
|
||||
is ConeCapturedType, is ConeDefinitelyNotNullType, is ConeIntersectionType,
|
||||
is ConeIntegerLiteralType -> null
|
||||
is ConeIntegerLiteralType,
|
||||
-> null
|
||||
// TODO: Thing of getting rid of this branch since ConeLookupTagBasedType should be a sealed class
|
||||
is ConeLookupTagBasedType -> null
|
||||
}
|
||||
@@ -78,12 +79,14 @@ class FirSamResolverImpl(
|
||||
substitutorByMap(
|
||||
firRegularClass.typeParameters
|
||||
.map { it.symbol }
|
||||
.zip(type.typeArguments.map {
|
||||
(it as? ConeTypedProjection)?.type
|
||||
?: firSession.builtinTypes.nullableAnyType.type
|
||||
//ConeClassLikeTypeImpl(ConeClassLikeLookupTagImpl(StandardClassIds.Any), emptyArray(), isNullable = true)
|
||||
})
|
||||
.toMap()
|
||||
.zip(
|
||||
type.typeArguments.map {
|
||||
(it as? ConeTypedProjection)?.type
|
||||
?: firSession.builtinTypes.nullableAnyType.type
|
||||
//ConeClassLikeTypeImpl(ConeClassLikeLookupTagImpl(StandardClassIds.Any), emptyArray(), isNullable = true)
|
||||
},
|
||||
)
|
||||
.toMap(),
|
||||
)
|
||||
|
||||
val result =
|
||||
@@ -112,19 +115,18 @@ class FirSamResolverImpl(
|
||||
CallableId(
|
||||
classId.packageFqName,
|
||||
classId.relativeClassName.parent().takeIf { !it.isRoot },
|
||||
classId.shortClassName
|
||||
)
|
||||
classId.shortClassName,
|
||||
),
|
||||
)
|
||||
|
||||
val newTypeParameters = firRegularClass.typeParameters.map { typeParameter ->
|
||||
FirTypeParameterImpl(
|
||||
typeParameter.source,
|
||||
firSession,
|
||||
typeParameter.name,
|
||||
FirTypeParameterSymbol(),
|
||||
Variance.INVARIANT,
|
||||
FirTypeParameterBuilder().apply {
|
||||
source = typeParameter.source
|
||||
session = firSession
|
||||
name = typeParameter.name
|
||||
this.symbol = FirTypeParameterSymbol()
|
||||
variance = Variance.INVARIANT
|
||||
isReified = false
|
||||
).apply {
|
||||
annotations += typeParameter.annotations
|
||||
}
|
||||
}
|
||||
@@ -136,59 +138,57 @@ class FirSamResolverImpl(
|
||||
val substitutor = substitutorByMap(
|
||||
firRegularClass.typeParameters
|
||||
.map { it.symbol }
|
||||
.zip(newTypeParameterTypes).toMap()
|
||||
.zip(newTypeParameterTypes).toMap(),
|
||||
)
|
||||
|
||||
for ((newTypeParameter, oldTypeParameter) in newTypeParameters.zip(firRegularClass.typeParameters)) {
|
||||
newTypeParameter.bounds += oldTypeParameter.bounds.mapNotNull { typeRef ->
|
||||
FirResolvedTypeRefImpl(
|
||||
typeRef.source,
|
||||
substitutor.substituteOrSelf(typeRef.coneTypeSafe() ?: return@mapNotNull null)
|
||||
)
|
||||
buildResolvedTypeRef {
|
||||
source = typeRef.source
|
||||
type = substitutor.substituteOrSelf(typeRef.coneTypeSafe() ?: return@mapNotNull null)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val substitutedFunctionType = substitutor.substituteOrSelf(functionType)
|
||||
val substitutedReturnType =
|
||||
ConeClassLikeTypeImpl(
|
||||
firRegularClass.symbol.toLookupTag(), newTypeParameterTypes.toTypedArray(), isNullable = false
|
||||
firRegularClass.symbol.toLookupTag(), newTypeParameterTypes.toTypedArray(), isNullable = false,
|
||||
)
|
||||
|
||||
val status = FirDeclarationStatusImpl(firRegularClass.visibility, Modality.FINAL).apply {
|
||||
isExpect = firRegularClass.isExpect
|
||||
isActual = firRegularClass.isActual
|
||||
isOverride = false
|
||||
isOperator = false
|
||||
isInfix = false
|
||||
isExternal = false
|
||||
isInline = false
|
||||
isSuspend = false
|
||||
isTailRec = false
|
||||
}
|
||||
return buildSimpleFunction {
|
||||
session = firSession
|
||||
returnTypeRef = buildResolvedTypeRef {
|
||||
source = null
|
||||
type = substitutedReturnType
|
||||
}
|
||||
name = classId.shortClassName
|
||||
status = FirDeclarationStatusImpl(firRegularClass.visibility, Modality.FINAL).apply {
|
||||
isExpect = firRegularClass.isExpect
|
||||
isActual = firRegularClass.isActual
|
||||
isOverride = false
|
||||
isOperator = false
|
||||
isInfix = false
|
||||
isExternal = false
|
||||
isInline = false
|
||||
isSuspend = false
|
||||
isTailRec = false
|
||||
}
|
||||
this.symbol = symbol
|
||||
valueParameters += buildValueParameter {
|
||||
session = firSession
|
||||
returnTypeRef = buildResolvedTypeRef {
|
||||
source = firRegularClass.source
|
||||
type = substitutedFunctionType
|
||||
}
|
||||
name = SAM_PARAMETER_NAME
|
||||
this.symbol = FirVariableSymbol(SAM_PARAMETER_NAME)
|
||||
isCrossinline = false
|
||||
isNoinline = false
|
||||
isVararg = false
|
||||
}
|
||||
|
||||
return FirSimpleFunctionImpl(
|
||||
null,
|
||||
firSession,
|
||||
FirResolvedTypeRefImpl(null, substitutedReturnType),
|
||||
null,
|
||||
status,
|
||||
classId.shortClassName,
|
||||
symbol
|
||||
).apply {
|
||||
valueParameters += listOf(
|
||||
FirValueParameterImpl(
|
||||
source,
|
||||
session,
|
||||
FirResolvedTypeRefImpl(firRegularClass.source, substitutedFunctionType),
|
||||
SAM_PARAMETER_NAME,
|
||||
FirVariableSymbol(SAM_PARAMETER_NAME),
|
||||
defaultValue = null,
|
||||
isCrossinline = false,
|
||||
isNoinline = false,
|
||||
isVararg = false
|
||||
)
|
||||
)
|
||||
typeParameters += newTypeParameters
|
||||
typeParameters += newTypeParameters.map { it.build() }
|
||||
resolvePhase = FirResolvePhase.BODY_RESOLVE
|
||||
}
|
||||
}
|
||||
@@ -210,7 +210,7 @@ class FirSamResolverImpl(
|
||||
|
||||
private fun FirRegularClass.getSingleAbstractMethodOrNull(
|
||||
session: FirSession,
|
||||
scopeSession: ScopeSession
|
||||
scopeSession: ScopeSession,
|
||||
): FirSimpleFunction? {
|
||||
// TODO: restrict to Java interfaces
|
||||
if (classKind != ClassKind.INTERFACE || hasMoreThenOneAbstractFunctionOrHasAbstractProperty()) return null
|
||||
@@ -247,7 +247,7 @@ private fun FirRegularClass.computeSamCandidateNames(session: FirSession): Set<N
|
||||
private fun FirRegularClass.findSingleAbstractMethodByNames(
|
||||
session: FirSession,
|
||||
scopeSession: ScopeSession,
|
||||
samCandidateNames: Set<Name>
|
||||
samCandidateNames: Set<Name>,
|
||||
): FirSimpleFunction? {
|
||||
if (status.isNotSAM) return null
|
||||
|
||||
@@ -351,6 +351,6 @@ private fun FirSimpleFunction.getFunctionTypeForAbstractMethod(): ConeLookupTagB
|
||||
|
||||
return createFunctionalType(
|
||||
parameterTypes, receiverType = null,
|
||||
rawReturnType = returnTypeRef.coneTypeSafe() ?: ConeKotlinErrorType("No type for return type of $this")
|
||||
rawReturnType = returnTypeRef.coneTypeSafe() ?: ConeKotlinErrorType("No type for return type of $this"),
|
||||
)
|
||||
}
|
||||
|
||||
+19
-20
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.fir.resolve.calls
|
||||
import com.intellij.openapi.progress.ProcessCanceledException
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirConstructorImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildConstructor
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
|
||||
import org.jetbrains.kotlin.fir.resolve.*
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
|
||||
@@ -223,29 +223,28 @@ private fun prepareSubstitutingScopeForTypeAliasConstructors(
|
||||
expandedType,
|
||||
session
|
||||
) factory@{ newReturnType, newParameterTypes, newTypeParameters ->
|
||||
FirConstructorImpl(
|
||||
source, session,
|
||||
returnTypeRef.withReplacedConeType(newReturnType),
|
||||
receiverTypeRef, status,
|
||||
FirConstructorSymbol(symbol.callableId, overriddenSymbol = symbol)
|
||||
).apply {
|
||||
buildConstructor {
|
||||
source = this@factory.source
|
||||
this.session = session
|
||||
returnTypeRef = this@factory.returnTypeRef.withReplacedConeType(newReturnType)
|
||||
receiverTypeRef = this@factory.receiverTypeRef
|
||||
status = this@factory.status
|
||||
symbol = FirConstructorSymbol(this@factory.symbol.callableId, overriddenSymbol = this@factory.symbol)
|
||||
resolvePhase = this@factory.resolvePhase
|
||||
valueParameters +=
|
||||
this@factory.valueParameters.zip(
|
||||
newParameterTypes
|
||||
) { valueParameter, newParameterType ->
|
||||
with(valueParameter) {
|
||||
FirValueParameterImpl(
|
||||
source,
|
||||
session,
|
||||
returnTypeRef.withReplacedConeType(newParameterType),
|
||||
name,
|
||||
FirVariableSymbol(valueParameter.symbol.callableId),
|
||||
defaultValue,
|
||||
isCrossinline,
|
||||
isNoinline,
|
||||
isVararg
|
||||
)
|
||||
buildValueParameter {
|
||||
source = valueParameter.source
|
||||
this.session = session
|
||||
returnTypeRef = valueParameter.returnTypeRef.withReplacedConeType(newParameterType)
|
||||
name = valueParameter.name
|
||||
symbol = FirVariableSymbol(valueParameter.symbol.callableId)
|
||||
defaultValue = valueParameter.defaultValue
|
||||
isCrossinline = valueParameter.isCrossinline
|
||||
isNoinline = valueParameter.isNoinline
|
||||
isVararg = valueParameter.isVararg
|
||||
}
|
||||
}
|
||||
this.typeParameters += newTypeParameters
|
||||
|
||||
+2
@@ -5,11 +5,13 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.resolve.calls
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirImplementationDetail
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
@UseExperimental(FirImplementationDetail::class)
|
||||
class FirNamedReferenceWithCandidate(
|
||||
source: FirSourceElement?,
|
||||
name: Name,
|
||||
|
||||
@@ -6,24 +6,30 @@
|
||||
package org.jetbrains.kotlin.fir.resolve.calls
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner
|
||||
import org.jetbrains.kotlin.fir.declarations.expandedConeType
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirThisReceiverExpressionImpl
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirImplicitThisReference
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildThisReceiverExpression
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildImplicitThisReference
|
||||
import org.jetbrains.kotlin.fir.renderWithType
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.constructType
|
||||
import org.jetbrains.kotlin.fir.resolve.scope
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirQualifierScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope
|
||||
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinErrorType
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.ConeStarProjection
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.coneTypeSafe
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
interface Receiver {
|
||||
fun scope(useSiteSession: FirSession, scopeSession: ScopeSession): FirScope?
|
||||
@@ -39,8 +45,13 @@ interface ReceiverValue : Receiver {
|
||||
}
|
||||
|
||||
private fun receiverExpression(symbol: AbstractFirBasedSymbol<*>, type: ConeKotlinType): FirExpression =
|
||||
FirThisReceiverExpressionImpl(null, FirImplicitThisReference(symbol)).apply {
|
||||
typeRef = FirResolvedTypeRefImpl(null, type)
|
||||
buildThisReceiverExpression {
|
||||
calleeReference = buildImplicitThisReference {
|
||||
boundSymbol = symbol
|
||||
}
|
||||
typeRef = buildResolvedTypeRef {
|
||||
this.type = type
|
||||
}
|
||||
}
|
||||
|
||||
class ClassDispatchReceiverValue(klassSymbol: FirClassSymbol<*>) : ReceiverValue {
|
||||
|
||||
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.fir.resolve.calls
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirImportImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildImport
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildResolvedImport
|
||||
import org.jetbrains.kotlin.fir.declarations.isCompanion
|
||||
import org.jetbrains.kotlin.fir.declarations.isInner
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
@@ -89,11 +89,13 @@ class FirTowerResolver(
|
||||
listOf(
|
||||
FirExplicitSimpleImportingScope(
|
||||
listOf(
|
||||
FirResolvedImportImpl(
|
||||
FirImportImpl(source = null, importedFqName = FqName.topLevel(info.name), isAllUnder = false, aliasName = null),
|
||||
resolvedQualifier.packageFqName,
|
||||
relativeClassName = null
|
||||
)
|
||||
buildResolvedImport {
|
||||
delegate = buildImport {
|
||||
importedFqName = FqName.topLevel(info.name)
|
||||
isAllUnder = false
|
||||
}
|
||||
packageFqName = resolvedQualifier.packageFqName
|
||||
}
|
||||
), session, components.scopeSession
|
||||
)
|
||||
)
|
||||
|
||||
+7
-7
@@ -9,11 +9,11 @@ import org.jetbrains.kotlin.fir.FirCallResolver
|
||||
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
|
||||
import org.jetbrains.kotlin.fir.resolve.diagnostics.FirUnresolvedReferenceError
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.StoreNameReference
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.resolve.calls.components.InferenceSession
|
||||
import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzer
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystemConstraintPosition
|
||||
@@ -78,10 +78,10 @@ class PostponedArgumentsAnalyzer(
|
||||
|
||||
val namedReference = when {
|
||||
candidate == null || applicability < CandidateApplicability.SYNTHETIC_RESOLVED ->
|
||||
FirErrorNamedReferenceImpl(
|
||||
callableReferenceAccess.source,
|
||||
FirUnresolvedReferenceError(callableReferenceAccess.calleeReference.name)
|
||||
)
|
||||
buildErrorNamedReference {
|
||||
source = callableReferenceAccess.source
|
||||
diagnostic = FirUnresolvedReferenceError(callableReferenceAccess.calleeReference.name)
|
||||
}
|
||||
else -> FirNamedReferenceWithCandidate(callableReferenceAccess.source, callableReferenceAccess.calleeReference.name, candidate)
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@ class PostponedArgumentsAnalyzer(
|
||||
namedReference
|
||||
).apply {
|
||||
if (candidate != null) {
|
||||
replaceTypeRef(FirResolvedTypeRefImpl(null, candidate.resultingTypeForCallableReference!!))
|
||||
replaceTypeRef(buildResolvedTypeRef { type = candidate.resultingTypeForCallableReference!! })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-3
@@ -7,9 +7,8 @@ package org.jetbrains.kotlin.fir.resolve.calls
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.expandedConeType
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirClassImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirSealedClassImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
|
||||
@@ -107,7 +106,7 @@ class QualifierReceiver(override val explicitReceiver: FirResolvedQualifier) : A
|
||||
val (classSymbol, callableScopes) = getClassSymbolWithCallableScopes(classId, useSiteSession, scopeSession)
|
||||
if (classSymbol != null) {
|
||||
val klass = classSymbol.fir
|
||||
val classifierScope = if (klass is FirClassImpl || klass is FirSealedClassImpl) {
|
||||
val classifierScope = if ((klass as? FirRegularClass)?.hasLazyNestedClassifiers == false) {
|
||||
nestedClassifierScope(klass)
|
||||
} else {
|
||||
useSiteSession.firSymbolProvider.getNestedClassifierScope(classId)
|
||||
|
||||
@@ -99,7 +99,8 @@ internal sealed class CheckReceivers : ResolutionStage() {
|
||||
val receiverType = (callable.receiverTypeRef as FirResolvedTypeRef?)?.type
|
||||
if (receiverType != null) return receiverType
|
||||
val returnTypeRef = callable.returnTypeRef as? FirResolvedTypeRef ?: return null
|
||||
return returnTypeRef.type.receiverType(returnTypeRef, bodyResolveComponents.session)
|
||||
if (!returnTypeRef.isExtensionFunctionType(bodyResolveComponents.session)) return null
|
||||
return (returnTypeRef.type.typeArguments.firstOrNull() as? ConeTypedProjection)?.type
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.calls
|
||||
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirQualifiedAccessExpressionImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessExpressionBuilder
|
||||
import org.jetbrains.kotlin.fir.resolve.constructClassType
|
||||
import org.jetbrains.kotlin.fir.resolve.transformQualifiedAccessUsingSmartcastInfo
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe
|
||||
@@ -105,9 +105,9 @@ class TowerResolveManager internal constructor(private val towerResolver: FirTow
|
||||
val explicitReceiverKind: ExplicitReceiverKind,
|
||||
val group: TowerGroup
|
||||
) {
|
||||
private fun createExplicitReceiverForInvoke(candidate: Candidate): FirQualifiedAccessExpressionImpl {
|
||||
private fun createExplicitReceiverForInvoke(candidate: Candidate): FirQualifiedAccessExpressionBuilder {
|
||||
val symbol = candidate.symbol as FirCallableSymbol<*>
|
||||
return FirQualifiedAccessExpressionImpl(null).apply {
|
||||
return FirQualifiedAccessExpressionBuilder().apply {
|
||||
calleeReference = FirNamedReferenceWithCandidate(
|
||||
null,
|
||||
symbol.callableId.callableName,
|
||||
@@ -184,7 +184,7 @@ class TowerResolveManager internal constructor(private val towerResolver: FirTow
|
||||
it.explicitReceiver = info.explicitReceiver
|
||||
it.safe = info.isSafeCall
|
||||
}
|
||||
towerResolver.components.transformQualifiedAccessUsingSmartcastInfo(it)
|
||||
towerResolver.components.transformQualifiedAccessUsingSmartcastInfo(it.build())
|
||||
}
|
||||
|
||||
val invokeFunctionInfo =
|
||||
|
||||
@@ -6,15 +6,13 @@
|
||||
package org.jetbrains.kotlin.fir.resolve.dfa
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSymbolOwner
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcast
|
||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
||||
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.FirThisReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirExplicitThisReference
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate
|
||||
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
|
||||
@UseExperimental(DfaInternals::class)
|
||||
class VariableStorage {
|
||||
|
||||
+26
-19
@@ -8,10 +8,11 @@ package org.jetbrains.kotlin.fir.resolve.dfa.contracts
|
||||
import org.jetbrains.kotlin.fir.contracts.description.*
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstKind
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.*
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
private object ConeConditionalEffectToFirVisitor : ConeContractDescriptionVisitor<FirExpression?, Map<Int, FirExpression>>() {
|
||||
@@ -21,8 +22,8 @@ private object ConeConditionalEffectToFirVisitor : ConeContractDescriptionVisito
|
||||
|
||||
override fun visitConstantDescriptor(constantReference: ConeConstantReference, data: Map<Int, FirExpression>): FirExpression? {
|
||||
return when (constantReference) {
|
||||
ConeBooleanConstantReference.TRUE -> FirConstExpressionImpl(null, FirConstKind.Boolean, true)
|
||||
ConeBooleanConstantReference.FALSE -> FirConstExpressionImpl(null, FirConstKind.Boolean, false)
|
||||
ConeBooleanConstantReference.TRUE -> buildConstExpression(null, FirConstKind.Boolean, true)
|
||||
ConeBooleanConstantReference.FALSE -> buildConstExpression(null, FirConstKind.Boolean, false)
|
||||
ConeConstantReference.NULL -> createConstNull()
|
||||
else -> null
|
||||
}
|
||||
@@ -34,34 +35,40 @@ private object ConeConditionalEffectToFirVisitor : ConeContractDescriptionVisito
|
||||
): FirExpression? {
|
||||
val leftExpression = binaryLogicExpression.left.accept(this, data) ?: return null
|
||||
val rightExpression = binaryLogicExpression.right.accept(this, data) ?: return null
|
||||
return FirBinaryLogicExpressionImpl(null, leftExpression, rightExpression, binaryLogicExpression.kind)
|
||||
return buildBinaryLogicExpression {
|
||||
leftOperand = leftExpression
|
||||
rightOperand = rightExpression
|
||||
binaryLogicExpression.kind
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitLogicalNot(logicalNot: ConeLogicalNot, data: Map<Int, FirExpression>): FirExpression? {
|
||||
val explicitReceiver = logicalNot.arg.accept(this, data) ?: return null
|
||||
return FirFunctionCallImpl(null).apply {
|
||||
calleeReference = FirSimpleNamedReference(null, OperatorNameConventions.NOT, null)
|
||||
return buildFunctionCall {
|
||||
calleeReference = buildSimpleNamedReference { name = OperatorNameConventions.NOT }
|
||||
this.explicitReceiver = explicitReceiver
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitIsInstancePredicate(isInstancePredicate: ConeIsInstancePredicate, data: Map<Int, FirExpression>): FirExpression? {
|
||||
val operation = if (isInstancePredicate.isNegated) {
|
||||
FirOperation.NOT_IS
|
||||
} else {
|
||||
FirOperation.IS
|
||||
return buildTypeOperatorCall {
|
||||
operation = if (isInstancePredicate.isNegated) {
|
||||
FirOperation.NOT_IS
|
||||
} else {
|
||||
FirOperation.IS
|
||||
}
|
||||
conversionTypeRef = buildResolvedTypeRef { type = isInstancePredicate.type }
|
||||
}
|
||||
return FirTypeOperatorCallImpl(null, operation, FirResolvedTypeRefImpl(null, isInstancePredicate.type))
|
||||
}
|
||||
|
||||
override fun visitIsNullPredicate(isNullPredicate: ConeIsNullPredicate, data: Map<Int, FirExpression>): FirExpression? {
|
||||
val argument = isNullPredicate.arg.accept(this, data) ?: return null
|
||||
val operation = if (isNullPredicate.isNegated) {
|
||||
FirOperation.NOT_EQ
|
||||
} else {
|
||||
FirOperation.EQ
|
||||
}
|
||||
return FirOperatorCallImpl(null, operation).apply {
|
||||
return buildOperatorCall {
|
||||
operation = if (isNullPredicate.isNegated) {
|
||||
FirOperation.NOT_EQ
|
||||
} else {
|
||||
FirOperation.EQ
|
||||
}
|
||||
arguments += argument
|
||||
arguments += createConstNull()
|
||||
}
|
||||
@@ -71,7 +78,7 @@ private object ConeConditionalEffectToFirVisitor : ConeContractDescriptionVisito
|
||||
return data[valueParameterReference.parameterIndex]
|
||||
}
|
||||
|
||||
private fun createConstNull(): FirConstExpression<*> = FirConstExpressionImpl(null, FirConstKind.Null, null)
|
||||
private fun createConstNull(): FirConstExpression<*> = buildConstExpression(null, FirConstKind.Null, null)
|
||||
}
|
||||
|
||||
fun ConeConditionalEffectDeclaration.buildContractFir(argumentMapping: Map<Int, FirExpression>): FirExpression? {
|
||||
|
||||
+75
-86
@@ -13,6 +13,10 @@ import org.jetbrains.kotlin.descriptors.SourceElement
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildClassImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.*
|
||||
import org.jetbrains.kotlin.fir.deserialization.FirBuiltinAnnotationDeserializer
|
||||
import org.jetbrains.kotlin.fir.deserialization.FirDeserializationContext
|
||||
@@ -27,8 +31,8 @@ import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||
import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion
|
||||
import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl
|
||||
@@ -46,7 +50,7 @@ import java.io.InputStream
|
||||
class FirBuiltinSymbolProvider(val session: FirSession, val kotlinScopeProvider: KotlinScopeProvider) : FirSymbolProvider() {
|
||||
private class BuiltInsPackageFragment(
|
||||
stream: InputStream, val fqName: FqName, val session: FirSession,
|
||||
val kotlinScopeProvider: KotlinScopeProvider
|
||||
val kotlinScopeProvider: KotlinScopeProvider,
|
||||
) {
|
||||
lateinit var version: BuiltInsBinaryVersion
|
||||
|
||||
@@ -59,7 +63,7 @@ class FirBuiltinSymbolProvider(val session: FirSession, val kotlinScopeProvider:
|
||||
throw UnsupportedOperationException(
|
||||
"Kotlin built-in definition format version is not supported: " +
|
||||
"expected ${BuiltInsBinaryVersion.INSTANCE}, actual $version. " +
|
||||
"Please update Kotlin"
|
||||
"Please update Kotlin",
|
||||
)
|
||||
}
|
||||
|
||||
@@ -73,7 +77,7 @@ class FirBuiltinSymbolProvider(val session: FirSession, val kotlinScopeProvider:
|
||||
private val memberDeserializer by lazy {
|
||||
FirDeserializationContext.createForPackage(
|
||||
fqName, packageProto.`package`, nameResolver, session,
|
||||
FirBuiltinAnnotationDeserializer(session)
|
||||
FirBuiltinAnnotationDeserializer(session),
|
||||
).memberDeserializer
|
||||
}
|
||||
|
||||
@@ -84,7 +88,7 @@ class FirBuiltinSymbolProvider(val session: FirSession, val kotlinScopeProvider:
|
||||
|
||||
private fun findAndDeserializeClass(
|
||||
classId: ClassId,
|
||||
parentContext: FirDeserializationContext? = null
|
||||
parentContext: FirDeserializationContext? = null,
|
||||
): FirRegularClassSymbol? {
|
||||
val classIdExists = classId in classDataFinder.allClassIds
|
||||
if (!classIdExists) return null
|
||||
@@ -95,7 +99,7 @@ class FirBuiltinSymbolProvider(val session: FirSession, val kotlinScopeProvider:
|
||||
deserializeClassToSymbol(
|
||||
classId, classProto, symbol, nameResolver, session,
|
||||
null, kotlinScopeProvider, parentContext,
|
||||
this::findAndDeserializeClass
|
||||
this::findAndDeserializeClass,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -148,48 +152,43 @@ class FirBuiltinSymbolProvider(val session: FirSession, val kotlinScopeProvider:
|
||||
val prefix = kind.classNamePrefix
|
||||
val arity = className.substring(prefix.length).toIntOrNull() ?: return null
|
||||
syntheticFunctionalInterfaceSymbols.getOrPut(SyntheticFunctionalInterfaceSymbolKey(kind, arity)) {
|
||||
val status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.ABSTRACT).apply {
|
||||
isExpect = false
|
||||
isActual = false
|
||||
isInner = false
|
||||
isCompanion = false
|
||||
isData = false
|
||||
isInline = false
|
||||
}
|
||||
FirRegularClassSymbol(this).apply {
|
||||
FirClassImpl(
|
||||
null,
|
||||
session,
|
||||
status,
|
||||
ClassKind.INTERFACE,
|
||||
kotlinScopeProvider,
|
||||
relativeClassName.shortName(),
|
||||
this
|
||||
).apply klass@{
|
||||
FirRegularClassSymbol(this).apply symbol@{
|
||||
buildClassImpl klass@{
|
||||
session = this@FirBuiltinSymbolProvider.session
|
||||
name = relativeClassName.shortName()
|
||||
status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.ABSTRACT).apply {
|
||||
isExpect = false
|
||||
isActual = false
|
||||
isInner = false
|
||||
isCompanion = false
|
||||
isData = false
|
||||
isInline = false
|
||||
}
|
||||
classKind = ClassKind.INTERFACE
|
||||
scopeProvider = kotlinScopeProvider
|
||||
symbol = this@symbol
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
typeParameters.addAll((1..arity).map {
|
||||
FirTypeParameterImpl(
|
||||
null,
|
||||
this@FirBuiltinSymbolProvider.session,
|
||||
Name.identifier("P$it"),
|
||||
FirTypeParameterSymbol(),
|
||||
Variance.IN_VARIANCE,
|
||||
false
|
||||
).apply {
|
||||
bounds += session.builtinTypes.nullableAnyType
|
||||
}
|
||||
})
|
||||
typeParameters.addAll(
|
||||
(1..arity).map {
|
||||
buildTypeParameter {
|
||||
session = this@FirBuiltinSymbolProvider.session
|
||||
name = Name.identifier("P$it")
|
||||
symbol = FirTypeParameterSymbol()
|
||||
variance = Variance.IN_VARIANCE
|
||||
isReified = false
|
||||
bounds += session.builtinTypes.nullableAnyType
|
||||
}
|
||||
},
|
||||
)
|
||||
typeParameters.add(
|
||||
FirTypeParameterImpl(
|
||||
null,
|
||||
this@FirBuiltinSymbolProvider.session,
|
||||
Name.identifier("R"),
|
||||
FirTypeParameterSymbol(),
|
||||
Variance.OUT_VARIANCE,
|
||||
false
|
||||
).apply {
|
||||
buildTypeParameter {
|
||||
session = this@FirBuiltinSymbolProvider.session
|
||||
name = Name.identifier("R")
|
||||
symbol = FirTypeParameterSymbol()
|
||||
variance = Variance.OUT_VARIANCE
|
||||
isReified = false
|
||||
bounds += session.builtinTypes.nullableAnyType
|
||||
}
|
||||
},
|
||||
)
|
||||
val name = OperatorNameConventions.INVOKE
|
||||
val functionStatus = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.ABSTRACT).apply {
|
||||
@@ -206,70 +205,60 @@ class FirBuiltinSymbolProvider(val session: FirSession, val kotlinScopeProvider:
|
||||
kind == FunctionClassDescriptor.Kind.KSuspendFunction
|
||||
}
|
||||
val typeArguments = typeParameters.map {
|
||||
FirResolvedTypeRefImpl(
|
||||
null,
|
||||
ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false)
|
||||
)
|
||||
buildResolvedTypeRef {
|
||||
type = ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false)
|
||||
}
|
||||
}
|
||||
|
||||
addDeclaration(
|
||||
FirSimpleFunctionImpl(
|
||||
null,
|
||||
this@FirBuiltinSymbolProvider.session,
|
||||
typeArguments.last(),
|
||||
null,
|
||||
functionStatus,
|
||||
name,
|
||||
FirNamedFunctionSymbol(CallableId(packageFqName, relativeClassName, name))
|
||||
).apply {
|
||||
buildSimpleFunction {
|
||||
session = this@FirBuiltinSymbolProvider.session
|
||||
returnTypeRef = typeArguments.last()
|
||||
this.name = name
|
||||
status = functionStatus
|
||||
symbol = FirNamedFunctionSymbol(CallableId(packageFqName, relativeClassName, name))
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
valueParameters += typeArguments.dropLast(1).mapIndexed { index, typeArgument ->
|
||||
val parameterName = Name.identifier("p${index + 1}")
|
||||
FirValueParameterImpl(
|
||||
null,
|
||||
this@FirBuiltinSymbolProvider.session,
|
||||
typeArgument,
|
||||
parameterName,
|
||||
FirVariableSymbol(parameterName),
|
||||
defaultValue = null,
|
||||
isCrossinline = false,
|
||||
isNoinline = false,
|
||||
buildValueParameter {
|
||||
session = this@FirBuiltinSymbolProvider.session
|
||||
returnTypeRef = typeArgument
|
||||
this.name = parameterName
|
||||
symbol = FirVariableSymbol(parameterName)
|
||||
defaultValue = null
|
||||
isCrossinline = false
|
||||
isNoinline = false
|
||||
isVararg = false
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
fun createSuperType(
|
||||
kind: FunctionClassDescriptor.Kind
|
||||
kind: FunctionClassDescriptor.Kind,
|
||||
): FirResolvedTypeRef {
|
||||
return FirResolvedTypeRefImpl(
|
||||
null,
|
||||
ConeClassLikeLookupTagImpl(kind.classId(arity))
|
||||
return buildResolvedTypeRef {
|
||||
type = ConeClassLikeLookupTagImpl(kind.classId(arity))
|
||||
.constructClassType(typeArguments.map { it.type }.toTypedArray(), isNullable = false)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
val superTypes = when (kind) {
|
||||
superTypeRefs += when (kind) {
|
||||
FunctionClassDescriptor.Kind.Function ->
|
||||
listOf(
|
||||
FirResolvedTypeRefImpl(
|
||||
source = null,
|
||||
ConeClassLikeLookupTagImpl(StandardClassIds.Function)
|
||||
.constructClassType(arrayOf(typeArguments.last().type), isNullable = false)
|
||||
)
|
||||
)
|
||||
buildResolvedTypeRef {
|
||||
type = ConeClassLikeLookupTagImpl(StandardClassIds.Function)
|
||||
.constructClassType(arrayOf(typeArguments.last().type), isNullable = false)
|
||||
}
|
||||
|
||||
FunctionClassDescriptor.Kind.SuspendFunction ->
|
||||
listOf(session.builtinTypes.anyType)
|
||||
session.builtinTypes.anyType
|
||||
|
||||
FunctionClassDescriptor.Kind.KFunction ->
|
||||
listOf(createSuperType(FunctionClassDescriptor.Kind.Function))
|
||||
createSuperType(FunctionClassDescriptor.Kind.Function)
|
||||
|
||||
FunctionClassDescriptor.Kind.KSuspendFunction ->
|
||||
listOf(createSuperType(FunctionClassDescriptor.Kind.SuspendFunction))
|
||||
createSuperType(FunctionClassDescriptor.Kind.SuspendFunction)
|
||||
}
|
||||
replaceSuperTypeRefs(superTypes)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+13
-14
@@ -6,7 +6,7 @@
|
||||
package org.jetbrains.kotlin.fir.resolve.inference
|
||||
|
||||
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirResolvable
|
||||
@@ -15,8 +15,8 @@ import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
|
||||
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.*
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirCallCompletionResultsWriterTransformer
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.InvocationKindTransformer
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.*
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.MapArguments
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirAbstractBodyResolveTransformer
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirBodyResolveTransformer
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType
|
||||
@@ -27,7 +27,7 @@ import org.jetbrains.kotlin.fir.types.ConeKotlinErrorType
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.transformSingle
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.calls.components.InferenceSession
|
||||
@@ -119,17 +119,16 @@ class FirCallCompleter(
|
||||
needItParam -> {
|
||||
val name = Name.identifier("it")
|
||||
val itType = parameters.single()
|
||||
FirValueParameterImpl(
|
||||
null,
|
||||
session,
|
||||
FirResolvedTypeRefImpl(null, itType.approximateLambdaInputType()),
|
||||
name,
|
||||
FirVariableSymbol(name),
|
||||
defaultValue = null,
|
||||
isCrossinline = false,
|
||||
isNoinline = false,
|
||||
buildValueParameter {
|
||||
session = this@FirCallCompleter.session
|
||||
returnTypeRef = buildResolvedTypeRef { type = itType.approximateLambdaInputType() }
|
||||
this.name = name
|
||||
symbol = FirVariableSymbol(name)
|
||||
defaultValue = null
|
||||
isCrossinline = false
|
||||
isNoinline = false
|
||||
isVararg = false
|
||||
)
|
||||
}
|
||||
}
|
||||
else -> null
|
||||
}
|
||||
|
||||
+75
-77
@@ -9,10 +9,10 @@ import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildVarargArgumentsExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirVarargArgumentsExpressionImpl
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirResolvedCallableReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildResolvedCallableReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.Candidate
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.isBuiltinFunctionalType
|
||||
@@ -25,10 +25,10 @@ import org.jetbrains.kotlin.fir.resolve.withNullability
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirIntegerOperatorCall
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildTypeProjectionWithVariance
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirTypeProjectionWithVarianceImpl
|
||||
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
||||
import org.jetbrains.kotlin.fir.visitors.compose
|
||||
import org.jetbrains.kotlin.fir.visitors.transformSingle
|
||||
@@ -43,12 +43,12 @@ class FirCallCompletionResultsWriterTransformer(
|
||||
private val typeCalculator: ReturnTypeCalculator,
|
||||
private val typeApproximator: AbstractTypeApproximator,
|
||||
private val integerOperatorsTypeUpdater: IntegerOperatorsTypeUpdater,
|
||||
private val integerApproximator: IntegerLiteralTypeApproximationTransformer
|
||||
private val integerApproximator: IntegerLiteralTypeApproximationTransformer,
|
||||
) : FirAbstractTreeTransformer<ExpectedArgumentType?>(phase = FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) {
|
||||
|
||||
override fun transformQualifiedAccessExpression(
|
||||
qualifiedAccessExpression: FirQualifiedAccessExpression,
|
||||
data: ExpectedArgumentType?
|
||||
data: ExpectedArgumentType?,
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
val calleeReference =
|
||||
qualifiedAccessExpression.calleeReference as? FirNamedReferenceWithCandidate ?: return qualifiedAccessExpression.compose()
|
||||
@@ -56,26 +56,26 @@ class FirCallCompletionResultsWriterTransformer(
|
||||
val candidateFir = calleeReference.candidateSymbol.phasedFir
|
||||
val typeRef = (candidateFir as? FirTypedDeclaration)?.let {
|
||||
typeCalculator.tryCalculateReturnType(it)
|
||||
} ?: FirErrorTypeRefImpl(
|
||||
calleeReference.source,
|
||||
FirSimpleDiagnostic("Callee reference to candidate without return type: ${candidateFir.render()}")
|
||||
)
|
||||
} ?: buildErrorTypeRef {
|
||||
source = calleeReference.source
|
||||
diagnostic = FirSimpleDiagnostic("Callee reference to candidate without return type: ${candidateFir.render()}")
|
||||
}
|
||||
|
||||
qualifiedAccessExpression.replaceTypeRefWithSubstituted(calleeReference, typeRef)
|
||||
|
||||
return qualifiedAccessExpression.transformCalleeReference(
|
||||
StoreCalleeReference,
|
||||
FirResolvedNamedReferenceImpl(
|
||||
calleeReference.source,
|
||||
calleeReference.name,
|
||||
calleeReference.candidateSymbol
|
||||
)
|
||||
buildResolvedNamedReference {
|
||||
source = calleeReference.source
|
||||
name = calleeReference.name
|
||||
resolvedSymbol = calleeReference.candidateSymbol
|
||||
},
|
||||
).compose()
|
||||
}
|
||||
|
||||
private fun <D : FirExpression> D.replaceTypeRefWithSubstituted(
|
||||
calleeReference: FirNamedReferenceWithCandidate,
|
||||
typeRef: FirResolvedTypeRef
|
||||
typeRef: FirResolvedTypeRef,
|
||||
): D {
|
||||
val resultTypeRef = typeRef.substituteTypeRef(calleeReference.candidate)
|
||||
replaceTypeRef(resultTypeRef)
|
||||
@@ -83,12 +83,12 @@ class FirCallCompletionResultsWriterTransformer(
|
||||
}
|
||||
|
||||
private fun FirResolvedTypeRef.substituteTypeRef(
|
||||
candidate: Candidate
|
||||
candidate: Candidate,
|
||||
): FirResolvedTypeRef {
|
||||
val initialType = candidate.substitutor.substituteOrNull(type)
|
||||
val finalType = finalSubstitutor.substituteOrNull(initialType)?.let { substitutedType ->
|
||||
typeApproximator.approximateToSuperType(
|
||||
substitutedType, TypeApproximatorConfiguration.FinalApproximationAfterResolutionAndInference
|
||||
substitutedType, TypeApproximatorConfiguration.FinalApproximationAfterResolutionAndInference,
|
||||
) as ConeKotlinType? ?: substitutedType
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ class FirCallCompletionResultsWriterTransformer(
|
||||
|
||||
override fun transformCallableReferenceAccess(
|
||||
callableReferenceAccess: FirCallableReferenceAccess,
|
||||
data: ExpectedArgumentType?
|
||||
data: ExpectedArgumentType?,
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
val calleeReference =
|
||||
callableReferenceAccess.calleeReference as? FirNamedReferenceWithCandidate ?: return callableReferenceAccess.compose()
|
||||
@@ -112,29 +112,28 @@ class FirCallCompletionResultsWriterTransformer(
|
||||
|
||||
return callableReferenceAccess.transformCalleeReference(
|
||||
StoreCalleeReference,
|
||||
FirResolvedCallableReferenceImpl(
|
||||
calleeReference.source,
|
||||
calleeReference.name,
|
||||
calleeReference.candidateSymbol
|
||||
).apply {
|
||||
buildResolvedCallableReference {
|
||||
source = calleeReference.source
|
||||
name = calleeReference.name
|
||||
resolvedSymbol = calleeReference.candidateSymbol
|
||||
inferredTypeArguments.addAll(computeTypeArguments(calleeReference.candidate))
|
||||
}
|
||||
},
|
||||
).compose()
|
||||
}
|
||||
|
||||
override fun transformVariableAssignment(
|
||||
variableAssignment: FirVariableAssignment,
|
||||
data: ExpectedArgumentType?
|
||||
data: ExpectedArgumentType?,
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
val calleeReference = variableAssignment.calleeReference as? FirNamedReferenceWithCandidate
|
||||
?: return variableAssignment.compose()
|
||||
return variableAssignment.transformCalleeReference(
|
||||
StoreCalleeReference,
|
||||
FirResolvedNamedReferenceImpl(
|
||||
calleeReference.source,
|
||||
calleeReference.name,
|
||||
calleeReference.candidateSymbol
|
||||
)
|
||||
buildResolvedNamedReference {
|
||||
source = calleeReference.source
|
||||
name = calleeReference.name
|
||||
resolvedSymbol = calleeReference.candidateSymbol
|
||||
},
|
||||
).compose()
|
||||
}
|
||||
|
||||
@@ -148,18 +147,20 @@ class FirCallCompletionResultsWriterTransformer(
|
||||
when (val argument = functionCall.typeArguments.getOrNull(index)) {
|
||||
is FirTypeProjectionWithVariance -> {
|
||||
val typeRef = argument.typeRef as FirResolvedTypeRef
|
||||
FirTypeProjectionWithVarianceImpl(
|
||||
argument.source,
|
||||
typeRef.withReplacedConeType(type),
|
||||
argument.variance
|
||||
)
|
||||
buildTypeProjectionWithVariance {
|
||||
source = argument.source
|
||||
this.typeRef = typeRef.withReplacedConeType(type)
|
||||
variance = argument.variance
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
FirTypeProjectionWithVarianceImpl(
|
||||
argument?.source,
|
||||
FirResolvedTypeRefImpl(null, type),
|
||||
Variance.INVARIANT
|
||||
)
|
||||
buildTypeProjectionWithVariance {
|
||||
source = argument?.source
|
||||
typeRef = buildResolvedTypeRef {
|
||||
this.type = type
|
||||
}
|
||||
variance = Variance.INVARIANT
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -176,11 +177,11 @@ class FirCallCompletionResultsWriterTransformer(
|
||||
var result = functionCall.transformSingle(integerOperatorsTypeUpdater, null)
|
||||
.transformCalleeReference(
|
||||
StoreCalleeReference,
|
||||
FirResolvedNamedReferenceImpl(
|
||||
calleeReference.source,
|
||||
calleeReference.name,
|
||||
calleeReference.candidateSymbol
|
||||
)
|
||||
buildResolvedNamedReference {
|
||||
source = calleeReference.source
|
||||
name = calleeReference.name
|
||||
resolvedSymbol = calleeReference.candidateSymbol
|
||||
},
|
||||
)
|
||||
.transformDispatchReceiver(StoreReceiver, subCandidate.dispatchReceiverExpression())
|
||||
.transformExtensionReceiver(StoreReceiver, subCandidate.extensionReceiverExpression())
|
||||
@@ -195,27 +196,24 @@ class FirCallCompletionResultsWriterTransformer(
|
||||
else -> {
|
||||
resultType = typeRef.substituteTypeRef(subCandidate)
|
||||
val vararg = subCandidate.argumentMapping?.values?.firstOrNull { it.isVararg }
|
||||
result.transformArguments(this, subCandidate.createArgumentsMapping()).apply {
|
||||
result.transformArguments(this, subCandidate.createArgumentsMapping()).apply call@{
|
||||
if (vararg != null && this is FirFunctionCallImpl) {
|
||||
// Create a FirVarargArgumentExpression for the vararg arguments
|
||||
val resolvedArrayType = vararg.returnTypeRef.substitute(subCandidate)
|
||||
val resolvedElementType = resolvedArrayType.arrayElementType(session)
|
||||
val varargArgument = FirVarargArgumentsExpressionImpl(
|
||||
null,
|
||||
vararg.returnTypeRef.withReplacedConeType(resolvedElementType)
|
||||
)
|
||||
varargArgument.replaceTypeRef(
|
||||
vararg.returnTypeRef.withReplacedConeType(
|
||||
var firstIndex = this@call.arguments.size
|
||||
val varargArgument = buildVarargArgumentsExpression {
|
||||
varargElementType = vararg.returnTypeRef.withReplacedConeType(resolvedElementType)
|
||||
this.typeRef = vararg.returnTypeRef.withReplacedConeType(
|
||||
vararg.returnTypeRef.substitute(
|
||||
subCandidate
|
||||
)
|
||||
)
|
||||
)
|
||||
var firstIndex = arguments.size
|
||||
for ((i, arg) in arguments.withIndex()) {
|
||||
if (subCandidate.argumentMapping!![arg]?.isVararg ?: false) {
|
||||
firstIndex = min(firstIndex, i)
|
||||
varargArgument.arguments.add(arg)
|
||||
for ((i, arg) in this@call.arguments.withIndex()) {
|
||||
if (subCandidate.argumentMapping!![arg]?.isVararg ?: false) {
|
||||
firstIndex = min(firstIndex, i)
|
||||
arguments += arg
|
||||
}
|
||||
}
|
||||
}
|
||||
for (arg in varargArgument.arguments) {
|
||||
@@ -229,7 +227,7 @@ class FirCallCompletionResultsWriterTransformer(
|
||||
|
||||
return result.copy(
|
||||
resultType = resultType,
|
||||
typeArguments = typeArguments
|
||||
typeArguments = typeArguments,
|
||||
).compose()
|
||||
}
|
||||
|
||||
@@ -248,7 +246,7 @@ class FirCallCompletionResultsWriterTransformer(
|
||||
|
||||
override fun transformDelegatedConstructorCall(
|
||||
delegatedConstructorCall: FirDelegatedConstructorCall,
|
||||
data: ExpectedArgumentType?
|
||||
data: ExpectedArgumentType?,
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
val calleeReference =
|
||||
delegatedConstructorCall.calleeReference as? FirNamedReferenceWithCandidate ?: return delegatedConstructorCall.compose()
|
||||
@@ -256,16 +254,16 @@ class FirCallCompletionResultsWriterTransformer(
|
||||
val result = delegatedConstructorCall.transformArguments(this, calleeReference.candidate.createArgumentsMapping())
|
||||
return result.transformCalleeReference(
|
||||
StoreCalleeReference,
|
||||
FirResolvedNamedReferenceImpl(
|
||||
calleeReference.source,
|
||||
calleeReference.name,
|
||||
calleeReference.candidateSymbol
|
||||
)
|
||||
buildResolvedNamedReference {
|
||||
source = calleeReference.source
|
||||
name = calleeReference.name
|
||||
resolvedSymbol = calleeReference.candidateSymbol
|
||||
},
|
||||
).compose()
|
||||
}
|
||||
|
||||
private fun computeTypeArguments(
|
||||
candidate: Candidate
|
||||
candidate: Candidate,
|
||||
): List<ConeKotlinType> {
|
||||
val declaration = candidate.symbol.phasedFir as? FirCallableMemberDeclaration<*> ?: return emptyList()
|
||||
|
||||
@@ -276,7 +274,7 @@ class FirCallCompletionResultsWriterTransformer(
|
||||
|
||||
override fun transformAnonymousFunction(
|
||||
anonymousFunction: FirAnonymousFunction,
|
||||
data: ExpectedArgumentType?
|
||||
data: ExpectedArgumentType?,
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
val expectedReturnType = data?.getExpectedType(anonymousFunction)
|
||||
?.takeIf { it.isBuiltinFunctionalType(session) }
|
||||
@@ -321,7 +319,7 @@ class FirCallCompletionResultsWriterTransformer(
|
||||
|
||||
private inline fun <reified D> transformSyntheticCall(
|
||||
syntheticCall: D,
|
||||
data: ExpectedArgumentType?
|
||||
data: ExpectedArgumentType?,
|
||||
): CompositeTransformResult<FirStatement>
|
||||
where D : FirResolvable, D : FirExpression {
|
||||
val syntheticCall = syntheticCall.transformChildren(this, data?.getExpectedType(syntheticCall)?.toExpectedType()) as D
|
||||
@@ -334,17 +332,17 @@ class FirCallCompletionResultsWriterTransformer(
|
||||
|
||||
return (syntheticCall.transformCalleeReference(
|
||||
StoreCalleeReference,
|
||||
FirResolvedNamedReferenceImpl(
|
||||
calleeReference.source,
|
||||
calleeReference.name,
|
||||
calleeReference.candidateSymbol
|
||||
)
|
||||
buildResolvedNamedReference {
|
||||
source = calleeReference.source
|
||||
name = calleeReference.name
|
||||
resolvedSymbol = calleeReference.candidateSymbol
|
||||
},
|
||||
) as D).compose()
|
||||
}
|
||||
|
||||
override fun <T> transformConstExpression(
|
||||
constExpression: FirConstExpression<T>,
|
||||
data: ExpectedArgumentType?
|
||||
data: ExpectedArgumentType?,
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
if (data == ExpectedArgumentType.NoApproximation) return constExpression.compose()
|
||||
val expectedType = data?.getExpectedType(constExpression)
|
||||
|
||||
+6
-4
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
import org.jetbrains.kotlin.fir.declarations.FirImport
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildResolvedImport
|
||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
||||
import org.jetbrains.kotlin.fir.visitors.compose
|
||||
@@ -52,10 +52,12 @@ class FirImportResolveTransformer() : FirAbstractTreeTransformer<Nothing?>(phase
|
||||
|
||||
private fun transformImportForFqName(fqName: FqName, delegate: FirImport): CompositeTransformResult<FirImport> {
|
||||
val (packageFqName, relativeClassFqName) = resolveToPackageOrClass(symbolProvider, fqName) ?: return delegate.compose()
|
||||
return FirResolvedImportImpl(delegate, packageFqName, relativeClassFqName).compose()
|
||||
return buildResolvedImport {
|
||||
this.delegate = delegate
|
||||
this.packageFqName = packageFqName
|
||||
relativeClassName = relativeClassFqName
|
||||
}.compose()
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
fun resolveToPackageOrClass(symbolProvider: FirSymbolProvider, fqName: FqName): PackageOrClass? {
|
||||
|
||||
+11
-13
@@ -10,8 +10,8 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.resolve.FirTypeResolver
|
||||
import org.jetbrains.kotlin.fir.scopes.FirIterableScope
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedFunctionTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedFunctionTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
||||
import org.jetbrains.kotlin.fir.visitors.compose
|
||||
|
||||
@@ -28,23 +28,21 @@ class FirSpecificTypeResolverTransformer(
|
||||
|
||||
override fun transformFunctionTypeRef(functionTypeRef: FirFunctionTypeRef, data: Nothing?): CompositeTransformResult<FirTypeRef> {
|
||||
functionTypeRef.transformChildren(this, data)
|
||||
return FirResolvedFunctionTypeRefImpl(
|
||||
functionTypeRef.source,
|
||||
typeResolver.resolveType(functionTypeRef, towerScope),
|
||||
functionTypeRef.isMarkedNullable,
|
||||
functionTypeRef.receiverTypeRef,
|
||||
functionTypeRef.returnTypeRef
|
||||
).apply {
|
||||
return buildResolvedFunctionTypeRef {
|
||||
source = functionTypeRef.source
|
||||
type = typeResolver.resolveType(functionTypeRef, towerScope)
|
||||
isMarkedNullable = functionTypeRef.isMarkedNullable
|
||||
receiverTypeRef = functionTypeRef.receiverTypeRef
|
||||
returnTypeRef = functionTypeRef.returnTypeRef
|
||||
annotations += functionTypeRef.annotations
|
||||
valueParameters += functionTypeRef.valueParameters
|
||||
}.compose()
|
||||
}
|
||||
|
||||
private fun transformType(typeRef: FirTypeRef, resolvedType: ConeKotlinType): CompositeTransformResult<FirTypeRef> {
|
||||
return FirResolvedTypeRefImpl(
|
||||
typeRef.source,
|
||||
resolvedType
|
||||
).apply {
|
||||
return buildResolvedTypeRef {
|
||||
source = typeRef.source
|
||||
type = resolvedType
|
||||
annotations += typeRef.annotations
|
||||
delegatedTypeRef = typeRef
|
||||
}.compose()
|
||||
|
||||
+5
-2
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirMemberTypeParameterScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
@@ -264,7 +264,10 @@ private class FirSupertypeResolverVisitor(
|
||||
}
|
||||
}
|
||||
|
||||
private fun createErrorTypeRef(fir: FirElement, message: String) = FirErrorTypeRefImpl(fir.source, FirSimpleDiagnostic(message))
|
||||
private fun createErrorTypeRef(fir: FirElement, message: String) = buildErrorTypeRef {
|
||||
source = fir.source
|
||||
diagnostic = FirSimpleDiagnostic(message)
|
||||
}
|
||||
|
||||
private class SupertypeComputationSession {
|
||||
private val fileScopesMap = hashMapOf<FirFile, FirImmutableCompositeScope>()
|
||||
|
||||
+85
-77
@@ -8,19 +8,19 @@ package org.jetbrains.kotlin.fir.resolve.transformers
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.copy
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.addDefaultBoundIfNecessary
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildFunctionCall
|
||||
import org.jetbrains.kotlin.fir.inferenceContext
|
||||
import org.jetbrains.kotlin.fir.references.FirReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirStubReference
|
||||
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.*
|
||||
@@ -34,9 +34,9 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildTypeProjectionWithVariance
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirTypeProjectionWithVarianceImpl
|
||||
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.fir.visitors.compose
|
||||
@@ -48,10 +48,10 @@ class FirSyntheticCallGenerator(
|
||||
private val components: FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents,
|
||||
private val callCompleter: FirCallCompleter
|
||||
) : BodyResolveComponents by components {
|
||||
private val whenSelectFunction: FirSimpleFunctionImpl = generateSyntheticSelectFunction(SyntheticCallableId.WHEN)
|
||||
private val trySelectFunction: FirSimpleFunctionImpl = generateSyntheticSelectFunction(SyntheticCallableId.TRY)
|
||||
private val idFunction: FirSimpleFunctionImpl = generateSyntheticSelectFunction(SyntheticCallableId.ID)
|
||||
private val checkNotNullFunction: FirSimpleFunctionImpl = generateSyntheticCheckNotNullFunction()
|
||||
private val whenSelectFunction: FirSimpleFunction = generateSyntheticSelectFunction(SyntheticCallableId.WHEN)
|
||||
private val trySelectFunction: FirSimpleFunction = generateSyntheticSelectFunction(SyntheticCallableId.TRY)
|
||||
private val idFunction: FirSimpleFunction = generateSyntheticSelectFunction(SyntheticCallableId.ID)
|
||||
private val checkNotNullFunction: FirSimpleFunction = generateSyntheticCheckNotNullFunction()
|
||||
|
||||
fun generateCalleeForWhenExpression(whenExpression: FirWhenExpression): FirWhenExpression? {
|
||||
val stubReference = whenExpression.calleeReference
|
||||
@@ -115,19 +115,22 @@ class FirSyntheticCallGenerator(
|
||||
idFunction, arguments, SyntheticCallableId.ID.callableName, CallKind.SyntheticIdForCallableReferencesResolution
|
||||
) ?: return callableReferenceAccess.transformCalleeReference(
|
||||
StoreCalleeReference,
|
||||
FirErrorNamedReferenceImpl(
|
||||
callableReferenceAccess.source,
|
||||
FirUnresolvedNameError(callableReferenceAccess.calleeReference.name)
|
||||
)
|
||||
buildErrorNamedReference {
|
||||
source = callableReferenceAccess.source
|
||||
diagnostic = FirUnresolvedNameError(callableReferenceAccess.calleeReference.name)
|
||||
}
|
||||
)
|
||||
val fakeCallElement = FirFunctionCallImpl(null).copy(calleeReference = reference, arguments = arguments)
|
||||
val fakeCallElement = buildFunctionCall {
|
||||
calleeReference = reference
|
||||
this.arguments += callableReferenceAccess
|
||||
}
|
||||
|
||||
val argument = callCompleter.completeCall(fakeCallElement, expectedTypeRef).arguments[0]
|
||||
return ((argument as? FirVarargArgumentsExpression)?.arguments?.get(0) ?: argument) as FirCallableReferenceAccess?
|
||||
}
|
||||
|
||||
private fun generateCalleeReferenceWithCandidate(
|
||||
function: FirSimpleFunctionImpl,
|
||||
function: FirSimpleFunction,
|
||||
arguments: List<FirExpression>,
|
||||
name: Name,
|
||||
callKind: CallKind = CallKind.SyntheticSelect
|
||||
@@ -142,7 +145,7 @@ class FirSyntheticCallGenerator(
|
||||
return FirNamedReferenceWithCandidate(null, name, candidate)
|
||||
}
|
||||
|
||||
private fun generateCandidate(callInfo: CallInfo, function: FirSimpleFunctionImpl): Candidate =
|
||||
private fun generateCandidate(callInfo: CallInfo, function: FirSimpleFunction): Candidate =
|
||||
CandidateFactory(components, callInfo).createCandidate(
|
||||
symbol = function.symbol,
|
||||
explicitReceiverKind = ExplicitReceiverKind.NO_EXPLICIT_RECEIVER
|
||||
@@ -160,28 +163,36 @@ class FirSyntheticCallGenerator(
|
||||
implicitReceiverStack = implicitReceiverStack
|
||||
)
|
||||
|
||||
private fun generateSyntheticSelectFunction(callableId: CallableId): FirSimpleFunctionImpl {
|
||||
private fun generateSyntheticSelectFunction(callableId: CallableId): FirSimpleFunction {
|
||||
// Synthetic function signature:
|
||||
// fun <K> select(vararg values: K): K
|
||||
val functionSymbol = FirSyntheticFunctionSymbol(callableId)
|
||||
val typeParameterSymbol = FirTypeParameterSymbol()
|
||||
val typeParameter =
|
||||
FirTypeParameterImpl(null, session, Name.identifier("K"), typeParameterSymbol, Variance.INVARIANT, false).apply {
|
||||
buildTypeParameter {
|
||||
session = this@FirSyntheticCallGenerator.session
|
||||
name = Name.identifier("K")
|
||||
symbol = typeParameterSymbol
|
||||
variance = Variance.INVARIANT
|
||||
isReified = false
|
||||
addDefaultBoundIfNecessary()
|
||||
}
|
||||
|
||||
val returnType = FirResolvedTypeRefImpl(null, ConeTypeParameterTypeImpl(typeParameterSymbol.toLookupTag(), false))
|
||||
val returnType = buildResolvedTypeRef { type = ConeTypeParameterTypeImpl(typeParameterSymbol.toLookupTag(), false) }
|
||||
|
||||
val argumentType = FirResolvedTypeRefImpl(null, returnType.coneTypeUnsafe<ConeKotlinType>().createArrayOf(session))
|
||||
val typeArgument = FirTypeProjectionWithVarianceImpl(null, returnType, Variance.INVARIANT)
|
||||
|
||||
return generateMemberFunction(session, functionSymbol, callableId.callableName, typeArgument.typeRef).apply {
|
||||
typeParameters += typeParameter
|
||||
valueParameters += argumentType.toValueParameter(session, "branches", isVararg = true)
|
||||
val argumentType = buildResolvedTypeRef { type = returnType.coneTypeUnsafe<ConeKotlinType>().createArrayOf(session) }
|
||||
val typeArgument = buildTypeProjectionWithVariance {
|
||||
typeRef = returnType
|
||||
variance = Variance.INVARIANT
|
||||
}
|
||||
|
||||
return generateMemberFunction(functionSymbol, callableId.callableName, typeArgument.typeRef).apply {
|
||||
typeParameters += typeParameter
|
||||
valueParameters += argumentType.toValueParameter("branches", isVararg = true)
|
||||
}.build()
|
||||
}
|
||||
|
||||
private fun generateSyntheticCheckNotNullFunction(): FirSimpleFunctionImpl {
|
||||
private fun generateSyntheticCheckNotNullFunction(): FirSimpleFunction {
|
||||
// Synthetic function signature:
|
||||
// fun <K> checkNotNull(arg: K?): K
|
||||
//
|
||||
@@ -191,74 +202,71 @@ class FirSyntheticCallGenerator(
|
||||
val functionSymbol = FirSyntheticFunctionSymbol(SyntheticCallableId.CHECK_NOT_NULL)
|
||||
val typeParameterSymbol = FirTypeParameterSymbol()
|
||||
val typeParameter =
|
||||
FirTypeParameterImpl(null, session, Name.identifier("K"), typeParameterSymbol, Variance.INVARIANT, false).apply {
|
||||
buildTypeParameter {
|
||||
session = this@FirSyntheticCallGenerator.session
|
||||
name = Name.identifier("K")
|
||||
symbol = typeParameterSymbol
|
||||
variance = Variance.INVARIANT
|
||||
isReified = false
|
||||
addDefaultBoundIfNecessary()
|
||||
}
|
||||
|
||||
val returnType = FirResolvedTypeRefImpl(null, ConeTypeParameterTypeImpl(typeParameterSymbol.toLookupTag(), false))
|
||||
val returnType = buildResolvedTypeRef { type = ConeTypeParameterTypeImpl(typeParameterSymbol.toLookupTag(), false) }
|
||||
|
||||
val argumentType =
|
||||
FirResolvedTypeRefImpl(
|
||||
null, returnType.coneTypeUnsafe<ConeKotlinType>().withNullability(
|
||||
ConeNullability.NULLABLE, session.inferenceContext
|
||||
)
|
||||
)
|
||||
val typeArgument = FirTypeProjectionWithVarianceImpl(null, returnType, Variance.INVARIANT)
|
||||
val argumentType = buildResolvedTypeRef {
|
||||
type = returnType.coneTypeUnsafe<ConeKotlinType>().withNullability(ConeNullability.NULLABLE, session.inferenceContext)
|
||||
}
|
||||
val typeArgument = buildTypeProjectionWithVariance {
|
||||
typeRef = returnType
|
||||
variance = Variance.INVARIANT
|
||||
}
|
||||
|
||||
return generateMemberFunction(
|
||||
session,
|
||||
functionSymbol,
|
||||
SyntheticCallableId.CHECK_NOT_NULL.callableName,
|
||||
typeArgument.typeRef
|
||||
).apply {
|
||||
typeParameters += typeParameter
|
||||
valueParameters += argumentType.toValueParameter(session, "arg")
|
||||
}
|
||||
valueParameters += argumentType.toValueParameter("arg")
|
||||
}.build()
|
||||
}
|
||||
|
||||
private fun generateMemberFunction(
|
||||
session: FirSession, symbol: FirNamedFunctionSymbol, name: Name, returnType: FirTypeRef
|
||||
): FirSimpleFunctionImpl {
|
||||
val status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL).apply {
|
||||
isExpect = false
|
||||
isActual = false
|
||||
isOverride = false
|
||||
isOperator = false
|
||||
isInfix = false
|
||||
isInline = false
|
||||
isTailRec = false
|
||||
isExternal = false
|
||||
isSuspend = false
|
||||
}
|
||||
return FirSimpleFunctionImpl(
|
||||
session = session,
|
||||
source = null,
|
||||
symbol = symbol,
|
||||
name = name,
|
||||
status = status,
|
||||
receiverTypeRef = null,
|
||||
symbol: FirNamedFunctionSymbol, name: Name, returnType: FirTypeRef
|
||||
): FirSimpleFunctionBuilder {
|
||||
return FirSimpleFunctionBuilder().apply {
|
||||
session = this@FirSyntheticCallGenerator.session
|
||||
this.symbol = symbol
|
||||
this.name = name
|
||||
status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL).apply {
|
||||
isExpect = false
|
||||
isActual = false
|
||||
isOverride = false
|
||||
isOperator = false
|
||||
isInfix = false
|
||||
isInline = false
|
||||
isTailRec = false
|
||||
isExternal = false
|
||||
isSuspend = false
|
||||
}
|
||||
returnTypeRef = returnType
|
||||
).apply {
|
||||
this.resolvePhase = FirResolvePhase.BODY_RESOLVE
|
||||
resolvePhase = FirResolvePhase.BODY_RESOLVE
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirResolvedTypeRef.toValueParameter(
|
||||
session: FirSession, nameAsString: String, isVararg: Boolean = false
|
||||
): FirValueParameterImpl {
|
||||
nameAsString: String, isVararg: Boolean = false
|
||||
): FirValueParameter {
|
||||
val name = Name.identifier(nameAsString)
|
||||
return FirValueParameterImpl(
|
||||
session = session,
|
||||
source = null,
|
||||
name = name,
|
||||
returnTypeRef = this,
|
||||
defaultValue = null,
|
||||
isCrossinline = false,
|
||||
isNoinline = false,
|
||||
isVararg = isVararg,
|
||||
return buildValueParameter {
|
||||
session = this@FirSyntheticCallGenerator.session
|
||||
this.name = name
|
||||
returnTypeRef = this@toValueParameter
|
||||
isCrossinline = false
|
||||
isNoinline = false
|
||||
this.isVararg = isVararg
|
||||
symbol = FirVariableSymbol(name)
|
||||
).apply {
|
||||
this.resolvePhase = FirResolvePhase.BODY_RESOLVE
|
||||
resolvePhase = FirResolvePhase.BODY_RESOLVE
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
-1
@@ -18,7 +18,6 @@ import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType
|
||||
import org.jetbrains.kotlin.fir.types.ConeNullability
|
||||
|
||||
+22
-13
@@ -6,10 +6,11 @@
|
||||
package org.jetbrains.kotlin.fir.resolve.transformers
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirImplementationDetail
|
||||
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.ConeInferenceContext
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate
|
||||
@@ -77,7 +78,13 @@ class IntegerLiteralTypeApproximationTransformer(
|
||||
// e.g. Byte doesn't have `and` in member scope. It's an extension
|
||||
if (resultSymbol == null) return functionCall.compose()
|
||||
functionCall.resultType = data?.let { functionCall.resultType.resolvedTypeFromPrototype(it) } ?: resultSymbol.fir.returnTypeRef
|
||||
return functionCall.transformCalleeReference(StoreCalleeReference, FirResolvedNamedReferenceImpl(null, operator.name, resultSymbol!!)).compose()
|
||||
return functionCall.transformCalleeReference(
|
||||
StoreCalleeReference,
|
||||
buildResolvedNamedReference {
|
||||
name = operator.name
|
||||
resolvedSymbol = resultSymbol!!
|
||||
}
|
||||
).compose()
|
||||
}
|
||||
|
||||
override fun transformOperatorCall(operatorCall: FirOperatorCall, data: ConeKotlinType?): CompositeTransformResult<FirStatement> {
|
||||
@@ -190,17 +197,19 @@ class IntegerOperatorsTypeUpdater(val approximator: IntegerLiteralTypeApproximat
|
||||
}
|
||||
}
|
||||
|
||||
@UseExperimental(FirImplementationDetail::class)
|
||||
private fun FirFunctionCall.toOperatorCall(): FirIntegerOperatorCall {
|
||||
if (this is FirIntegerOperatorCall) return this
|
||||
return FirIntegerOperatorCall(source).also {
|
||||
it.typeRef = typeRef
|
||||
it.annotations += annotations
|
||||
it.safe = safe
|
||||
it.typeArguments += typeArguments
|
||||
it.explicitReceiver = explicitReceiver
|
||||
it.dispatchReceiver = dispatchReceiver
|
||||
it.extensionReceiver = extensionReceiver
|
||||
it.arguments += arguments
|
||||
it.calleeReference = calleeReference
|
||||
}
|
||||
return FirIntegerOperatorCall(
|
||||
source,
|
||||
typeRef,
|
||||
annotations.toMutableList(),
|
||||
safe,
|
||||
typeArguments.toMutableList(),
|
||||
explicitReceiver,
|
||||
dispatchReceiver,
|
||||
extensionReceiver,
|
||||
arguments.toMutableList(),
|
||||
calleeReference,
|
||||
)
|
||||
}
|
||||
+4
-5
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.render
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
||||
|
||||
interface ReturnTypeCalculator {
|
||||
fun tryCalculateReturnType(declaration: FirTypedDeclaration): FirResolvedTypeRef
|
||||
@@ -22,12 +22,11 @@ class ReturnTypeCalculatorForFullBodyResolve : ReturnTypeCalculator {
|
||||
val returnTypeRef = declaration.returnTypeRef
|
||||
if (returnTypeRef is FirResolvedTypeRef) return returnTypeRef
|
||||
|
||||
return FirErrorTypeRefImpl(
|
||||
null,
|
||||
FirSimpleDiagnostic(
|
||||
return buildErrorTypeRef {
|
||||
diagnostic = FirSimpleDiagnostic(
|
||||
"Cannot calculate return type during full-body resolution (local class/object?): ${declaration.render()}",
|
||||
DiagnosticKind.InferenceError
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.resolve.transformers
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirBlockImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock
|
||||
import org.jetbrains.kotlin.fir.references.*
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType
|
||||
@@ -38,8 +37,9 @@ internal object MapArguments : FirDefaultTransformer<Map<FirElement, FirElement>
|
||||
if (block.statements.isEmpty()) return block.compose()
|
||||
val transformedStatement = block.statements.last().transformSingle(this@MapArguments, data)
|
||||
when (block) {
|
||||
is FirBlockImpl -> block.statements[block.statements.size - 1] = transformedStatement
|
||||
is FirSingleExpressionBlock -> block.statement = transformedStatement
|
||||
// TODO: dirty cast
|
||||
else -> (block.statements as MutableList<FirStatement>)[block.statements.size - 1] = transformedStatement
|
||||
}
|
||||
return block.compose()
|
||||
}
|
||||
|
||||
+2
-2
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirTypeResolveScopeForBodyResolve
|
||||
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef
|
||||
|
||||
abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAbstractPhaseTransformer<ResolutionMode>(phase) {
|
||||
abstract val components: BodyResolveTransformerComponents
|
||||
@@ -97,7 +97,7 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
|
||||
val topLevelScopes: MutableList<FirScope> = mutableListOf()
|
||||
val localScopes: MutableList<FirLocalScope> = mutableListOf()
|
||||
|
||||
override val noExpectedType: FirTypeRef = FirImplicitTypeRefImpl(null)
|
||||
override val noExpectedType: FirTypeRef = buildImplicitTypeRef()
|
||||
|
||||
override lateinit var file: FirFile
|
||||
internal set
|
||||
|
||||
+8
-5
@@ -15,13 +15,12 @@ import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirSyntheticCallGenerator
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirWhenExhaustivenessTransformer
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.IntegerLiteralTypeApproximationTransformer
|
||||
import org.jetbrains.kotlin.fir.resolvedTypeFromPrototype
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.coneTypeSafe
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
||||
import org.jetbrains.kotlin.fir.visitors.compose
|
||||
import org.jetbrains.kotlin.fir.visitors.transformSingle
|
||||
@@ -77,7 +76,9 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran
|
||||
whenExpression = syntheticCallGenerator.generateCalleeForWhenExpression(whenExpression) ?: run {
|
||||
whenExpression = whenExpression.transformSingle(whenExhaustivenessTransformer, null)
|
||||
dataFlowAnalyzer.exitWhenExpression(whenExpression)
|
||||
whenExpression.resultType = FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Can't resolve when expression", DiagnosticKind.InferenceError))
|
||||
whenExpression.resultType = buildErrorTypeRef {
|
||||
diagnostic = FirSimpleDiagnostic("Can't resolve when expression", DiagnosticKind.InferenceError)
|
||||
}
|
||||
return@with whenExpression.compose()
|
||||
}
|
||||
|
||||
@@ -103,7 +104,7 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran
|
||||
if (branches.size == 1) return true
|
||||
if (branches.size > 2) return false
|
||||
val lastBranch = branches.last()
|
||||
return lastBranch.condition is FirElseIfTrueCondition && lastBranch.result is FirEmptyExpressionBlock
|
||||
return lastBranch.source != null && lastBranch.condition is FirElseIfTrueCondition && lastBranch.result is FirEmptyExpressionBlock
|
||||
}
|
||||
|
||||
override fun transformWhenBranch(whenBranch: FirWhenBranch, data: ResolutionMode): CompositeTransformResult<FirWhenBranch> {
|
||||
@@ -143,7 +144,9 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran
|
||||
val expectedTypeRef = data.expectedType
|
||||
callCompleter.completeCall(it, expectedTypeRef)
|
||||
} ?: run {
|
||||
tryExpression.resultType = FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Can't resolve try expression", DiagnosticKind.InferenceError))
|
||||
tryExpression.resultType = buildErrorTypeRef {
|
||||
diagnostic = FirSimpleDiagnostic("Can't resolve try expression", DiagnosticKind.InferenceError)
|
||||
}
|
||||
tryExpression
|
||||
}
|
||||
|
||||
|
||||
+43
-34
@@ -9,15 +9,15 @@ import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirFunctionTarget
|
||||
import org.jetbrains.kotlin.fir.copy
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirReturnExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirReturnExpressionImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirUnitExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildReturnExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildUnitExpression
|
||||
import org.jetbrains.kotlin.fir.resolve.*
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.*
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||
@@ -28,9 +28,9 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirMemberTypeParameterScope
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||
@@ -256,7 +256,10 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
prepareLocalClassForBodyResolve(anonymousObject)
|
||||
return withScopeCleanup(topLevelScopes) {
|
||||
val type = anonymousObject.defaultType()
|
||||
anonymousObject.resultType = FirResolvedTypeRefImpl(anonymousObject.source, type)
|
||||
anonymousObject.resultType = buildResolvedTypeRef {
|
||||
source = anonymousObject.source
|
||||
this.type = type
|
||||
}
|
||||
val result = withLabelAndReceiverType(null, anonymousObject, type) {
|
||||
transformDeclaration(anonymousObject, data)
|
||||
}
|
||||
@@ -342,9 +345,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
} else {
|
||||
result.transformReturnTypeRef(
|
||||
transformer,
|
||||
withExpectedType(
|
||||
FirErrorTypeRefImpl(null, FirSimpleDiagnostic("empty body", DiagnosticKind.Other))
|
||||
)
|
||||
withExpectedType(buildErrorTypeRef { diagnostic = FirSimpleDiagnostic("empty body", DiagnosticKind.Other) })
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -413,7 +414,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
transformAnonymousFunctionWithLambdaResolution(anonymousFunction, data).addReturn().compose()
|
||||
}
|
||||
is ResolutionMode.WithExpectedType, is ResolutionMode.ContextIndependent -> {
|
||||
val expectedTypeRef = (data as? ResolutionMode.WithExpectedType)?.expectedTypeRef ?: FirImplicitTypeRefImpl(null)
|
||||
val expectedTypeRef = (data as? ResolutionMode.WithExpectedType)?.expectedTypeRef ?: buildImplicitTypeRef()
|
||||
val resolvedLambdaAtom = (expectedTypeRef as? FirResolvedTypeRef)?.let {
|
||||
extractLambdaInfoFromFunctionalType(
|
||||
it.type, it, anonymousFunction, session
|
||||
@@ -427,17 +428,15 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
val itParam = when {
|
||||
af.valueParameters.isEmpty() && singleParameterType != null -> {
|
||||
val name = Name.identifier("it")
|
||||
FirValueParameterImpl(
|
||||
null,
|
||||
session,
|
||||
FirResolvedTypeRefImpl(null, singleParameterType),
|
||||
name,
|
||||
FirVariableSymbol(name),
|
||||
defaultValue = null,
|
||||
isCrossinline = false,
|
||||
isNoinline = false,
|
||||
buildValueParameter {
|
||||
session = this@FirDeclarationsResolveTransformer.session
|
||||
returnTypeRef = buildResolvedTypeRef { type = singleParameterType }
|
||||
this.name = name
|
||||
symbol = FirVariableSymbol(name)
|
||||
isCrossinline = false
|
||||
isNoinline = false
|
||||
isVararg = false
|
||||
)
|
||||
}
|
||||
}
|
||||
else -> null
|
||||
}
|
||||
@@ -502,9 +501,13 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
object : FirDefaultTransformer<FirExpression>() {
|
||||
override fun <E : FirElement> transformElement(element: E, data: FirExpression): CompositeTransformResult<E> {
|
||||
if (element == lastStatement) {
|
||||
val returnExpression = FirReturnExpressionImpl(element.source, lastStatement)
|
||||
returnExpression.target = FirFunctionTarget(null)
|
||||
(returnExpression.target as FirFunctionTarget).bind(this@addReturn)
|
||||
val returnExpression = buildReturnExpression {
|
||||
source = element.source
|
||||
result = lastStatement
|
||||
target = FirFunctionTarget(null, isLambda = this@addReturn.isLambda).also {
|
||||
it.bind(this@addReturn)
|
||||
}
|
||||
}
|
||||
return (returnExpression as E).compose()
|
||||
}
|
||||
return element.compose()
|
||||
@@ -517,7 +520,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
return returnExpression.compose()
|
||||
}
|
||||
},
|
||||
FirUnitExpression(null)
|
||||
buildUnitExpression()
|
||||
)
|
||||
}
|
||||
return this
|
||||
@@ -577,10 +580,9 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
when {
|
||||
initializer != null -> {
|
||||
val expectedType = when (val resultType = initializer.resultType) {
|
||||
is FirImplicitTypeRef -> FirErrorTypeRefImpl(
|
||||
null,
|
||||
FirSimpleDiagnostic("No result type for initializer", DiagnosticKind.InferenceError)
|
||||
)
|
||||
is FirImplicitTypeRef -> buildErrorTypeRef {
|
||||
diagnostic = FirSimpleDiagnostic("No result type for initializer", DiagnosticKind.InferenceError)
|
||||
}
|
||||
else -> resultType
|
||||
}
|
||||
variable.transformReturnTypeRef(
|
||||
@@ -590,10 +592,9 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
}
|
||||
variable.getter != null && variable.getter !is FirDefaultPropertyAccessor -> {
|
||||
val expectedType = when (val resultType = variable.getter?.returnTypeRef) {
|
||||
is FirImplicitTypeRef -> FirErrorTypeRefImpl(
|
||||
null,
|
||||
FirSimpleDiagnostic("No result type for getter", DiagnosticKind.InferenceError)
|
||||
)
|
||||
is FirImplicitTypeRef -> buildErrorTypeRef {
|
||||
diagnostic = FirSimpleDiagnostic("No result type for getter", DiagnosticKind.InferenceError)
|
||||
}
|
||||
else -> resultType
|
||||
}
|
||||
variable.transformReturnTypeRef(
|
||||
@@ -603,7 +604,15 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
|
||||
}
|
||||
else -> {
|
||||
variable.transformReturnTypeRef(
|
||||
transformer, withExpectedType(FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Cannot infer variable type without initializer / getter / delegate", DiagnosticKind.InferenceError)))
|
||||
transformer,
|
||||
withExpectedType(
|
||||
buildErrorTypeRef {
|
||||
diagnostic = FirSimpleDiagnostic(
|
||||
"Cannot infer variable type without initializer / getter / delegate",
|
||||
DiagnosticKind.InferenceError,
|
||||
)
|
||||
},
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+95
-72
@@ -11,13 +11,15 @@ import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner
|
||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirErrorExpressionImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedQualifierImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirVariableAssignmentImpl
|
||||
import org.jetbrains.kotlin.fir.references.*
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirExplicitThisReference
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildErrorExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildFunctionCall
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildVariableAssignment
|
||||
import org.jetbrains.kotlin.fir.references.FirDelegateFieldReference
|
||||
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.FirSuperReference
|
||||
import org.jetbrains.kotlin.fir.references.FirThisReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.resolve.*
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.candidate
|
||||
@@ -33,7 +35,8 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.invoke
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.builder.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
||||
import org.jetbrains.kotlin.fir.visitors.compose
|
||||
import org.jetbrains.kotlin.fir.visitors.transformSingle
|
||||
@@ -51,10 +54,11 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
|
||||
override fun transformExpression(expression: FirExpression, data: ResolutionMode): CompositeTransformResult<FirStatement> {
|
||||
if (expression.resultType is FirImplicitTypeRef && expression !is FirWrappedExpression) {
|
||||
val type = FirErrorTypeRefImpl(
|
||||
expression.source,
|
||||
FirSimpleDiagnostic("Type calculating for ${expression::class} is not supported", DiagnosticKind.InferenceError)
|
||||
)
|
||||
val type = buildErrorTypeRef {
|
||||
source = expression.source
|
||||
diagnostic =
|
||||
FirSimpleDiagnostic("Type calculating for ${expression::class} is not supported", DiagnosticKind.InferenceError)
|
||||
}
|
||||
expression.resultType = type
|
||||
}
|
||||
return (expression.transformChildren(transformer, data) as FirStatement).compose()
|
||||
@@ -62,21 +66,22 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
|
||||
override fun transformQualifiedAccessExpression(
|
||||
qualifiedAccessExpression: FirQualifiedAccessExpression,
|
||||
data: ResolutionMode
|
||||
data: ResolutionMode,
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
qualifiedAccessExpression.annotations.forEach { it.accept(this, data) }
|
||||
qualifiedAccessExpression.transformTypeArguments(transformer, ResolutionMode.ContextIndependent)
|
||||
|
||||
var result = when (val callee = qualifiedAccessExpression.calleeReference) {
|
||||
is FirExplicitThisReference -> {
|
||||
// TODO: there was FirExplicitThisReference
|
||||
is FirThisReference -> {
|
||||
val labelName = callee.labelName
|
||||
val implicitReceiver = implicitReceiverStack[labelName]
|
||||
implicitReceiver?.boundSymbol?.let {
|
||||
callee.replaceBoundSymbol(it)
|
||||
}
|
||||
qualifiedAccessExpression.resultType = FirResolvedTypeRefImpl(
|
||||
null, implicitReceiver?.type ?: ConeKotlinErrorType("Unresolved this@$labelName")
|
||||
)
|
||||
qualifiedAccessExpression.resultType = buildResolvedTypeRef {
|
||||
type = implicitReceiver?.type ?: ConeKotlinErrorType("Unresolved this@$labelName")
|
||||
}
|
||||
qualifiedAccessExpression
|
||||
}
|
||||
is FirSuperReference -> {
|
||||
@@ -92,16 +97,18 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
val superTypeRefs = implicitReceiverStack.lastDispatchReceiver()?.boundSymbol?.phasedFir?.superTypeRefs
|
||||
val resultType = when {
|
||||
superTypeRefs?.isNotEmpty() != true -> {
|
||||
FirErrorTypeRefImpl(
|
||||
qualifiedAccessExpression.source, FirSimpleDiagnostic("No super type", DiagnosticKind.NoSupertype)
|
||||
)
|
||||
buildErrorTypeRef {
|
||||
source = qualifiedAccessExpression.source
|
||||
diagnostic = FirSimpleDiagnostic("No super type", DiagnosticKind.NoSupertype)
|
||||
}
|
||||
}
|
||||
superTypeRefs.size == 1 -> {
|
||||
superTypeRefs.single()
|
||||
}
|
||||
else -> {
|
||||
FirComposedSuperTypeRefImpl(qualifiedAccessExpression.source).apply {
|
||||
this.superTypeRefs += superTypeRefs.map { it as FirResolvedTypeRef }
|
||||
buildComposedSuperTypeRef {
|
||||
source = qualifiedAccessExpression.source
|
||||
superTypeRefs.mapTo(this.superTypeRefs) { it as FirResolvedTypeRef }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -188,7 +195,9 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
block.resultType = if (resultExpression == null) {
|
||||
block.resultType.resolvedTypeFromPrototype(session.builtinTypes.unitType.type)
|
||||
} else {
|
||||
(resultExpression.resultType as? FirResolvedTypeRef) ?: FirErrorTypeRefImpl(null, FirSimpleDiagnostic("No type for block", DiagnosticKind.InferenceError))
|
||||
(resultExpression.resultType as? FirResolvedTypeRef) ?: buildErrorTypeRef {
|
||||
diagnostic = FirSimpleDiagnostic("No type for block", DiagnosticKind.InferenceError)
|
||||
}
|
||||
}
|
||||
dataFlowAnalyzer.exitBlock(block)
|
||||
return block.compose()
|
||||
@@ -196,7 +205,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
|
||||
override fun transformThisReceiverExpression(
|
||||
thisReceiverExpression: FirThisReceiverExpression,
|
||||
data: ResolutionMode
|
||||
data: ResolutionMode,
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
return transformQualifiedAccessExpression(thisReceiverExpression, data)
|
||||
}
|
||||
@@ -219,14 +228,15 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
val operatorCall = operatorCall.transformArguments(this, ResolutionMode.ContextIndependent)
|
||||
val (leftArgument, rightArgument) = operatorCall.arguments
|
||||
|
||||
fun createFunctionCall(name: Name) = FirFunctionCallImpl(operatorCall.source).apply {
|
||||
fun createFunctionCall(name: Name) = buildFunctionCall {
|
||||
source = operatorCall.source
|
||||
explicitReceiver = leftArgument
|
||||
arguments += rightArgument
|
||||
calleeReference = FirSimpleNamedReference(
|
||||
operatorCall.source,
|
||||
name,
|
||||
calleeReference = buildSimpleNamedReference {
|
||||
source = operatorCall.source
|
||||
this.name = name
|
||||
candidateSymbol = null
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: disable DataFlowAnalyzer for resolving that two calls
|
||||
@@ -248,18 +258,24 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
operatorCallReference == null || (!lhsIsVar && !assignIsError) -> resolvedAssignCall.compose()
|
||||
assignCallReference == null -> {
|
||||
val assignment =
|
||||
FirVariableAssignmentImpl(operatorCall.source, false, resolvedOperatorCall).apply {
|
||||
lValue = if (lhsIsVar)
|
||||
buildVariableAssignment {
|
||||
source = operatorCall.source
|
||||
safe = false
|
||||
rValue = resolvedOperatorCall
|
||||
calleeReference = if (lhsIsVar)
|
||||
lhsReference!!
|
||||
else
|
||||
FirErrorNamedReferenceImpl(operatorCall.arguments.first().source, FirVariableExpectedError())
|
||||
buildErrorNamedReference {
|
||||
source = operatorCall.arguments.first().source
|
||||
diagnostic = FirVariableExpectedError()
|
||||
}
|
||||
}
|
||||
assignment.transform(transformer, ResolutionMode.ContextIndependent)
|
||||
}
|
||||
else -> FirErrorExpressionImpl(
|
||||
operatorCall.source,
|
||||
FirOperatorAmbiguityError(listOf(operatorCallReference.resolvedSymbol, assignCallReference.resolvedSymbol))
|
||||
).compose()
|
||||
else -> buildErrorExpression {
|
||||
source = operatorCall.source
|
||||
diagnostic = FirOperatorAmbiguityError(listOf(operatorCallReference.resolvedSymbol, assignCallReference.resolvedSymbol))
|
||||
}.compose()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -268,7 +284,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
|
||||
override fun transformTypeOperatorCall(
|
||||
typeOperatorCall: FirTypeOperatorCall,
|
||||
data: ResolutionMode
|
||||
data: ResolutionMode,
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
val symbolProvider = session.firSymbolProvider
|
||||
val resolved = (transformExpression(typeOperatorCall, data).single as FirTypeOperatorCall)
|
||||
@@ -284,8 +300,8 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
resolved.resultType =
|
||||
resolved.conversionTypeRef.withReplacedConeType(
|
||||
resolved.conversionTypeRef.coneTypeUnsafe<ConeKotlinType>().withNullability(
|
||||
ConeNullability.NULLABLE, session.inferenceContext
|
||||
)
|
||||
ConeNullability.NULLABLE, session.inferenceContext,
|
||||
),
|
||||
)
|
||||
}
|
||||
else -> error("Unknown type operator")
|
||||
@@ -296,7 +312,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
|
||||
override fun transformCheckNotNullCall(
|
||||
checkNotNullCall: FirCheckNotNullCall,
|
||||
data: ResolutionMode
|
||||
data: ResolutionMode,
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
// Resolve the return type of a call to the synthetic function with signature:
|
||||
// fun <K> checkNotNull(arg: K?): K
|
||||
@@ -312,7 +328,9 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
callCompleter.completeCall(it, data.expectedType)
|
||||
} ?: run {
|
||||
checkNotNullCall.resultType =
|
||||
FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Can't resolve !! operator call", DiagnosticKind.InferenceError))
|
||||
buildErrorTypeRef {
|
||||
diagnostic = FirSimpleDiagnostic("Can't resolve !! operator call", DiagnosticKind.InferenceError)
|
||||
}
|
||||
checkNotNullCall
|
||||
}
|
||||
dataFlowAnalyzer.exitCheckNotNullCall(result)
|
||||
@@ -321,18 +339,20 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
|
||||
override fun transformBinaryLogicExpression(
|
||||
binaryLogicExpression: FirBinaryLogicExpression,
|
||||
data: ResolutionMode
|
||||
data: ResolutionMode,
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
val booleanType = binaryLogicExpression.typeRef.resolvedTypeFromPrototype(builtinTypes.booleanType.type)
|
||||
return when (binaryLogicExpression.kind) {
|
||||
LogicOperationKind.AND ->
|
||||
binaryLogicExpression.also(dataFlowAnalyzer::enterBinaryAnd)
|
||||
.transformLeftOperand(this, ResolutionMode.WithExpectedType(booleanType)).also(dataFlowAnalyzer::exitLeftBinaryAndArgument)
|
||||
.transformLeftOperand(this, ResolutionMode.WithExpectedType(booleanType))
|
||||
.also(dataFlowAnalyzer::exitLeftBinaryAndArgument)
|
||||
.transformRightOperand(this, ResolutionMode.WithExpectedType(booleanType)).also(dataFlowAnalyzer::exitBinaryAnd)
|
||||
|
||||
LogicOperationKind.OR ->
|
||||
binaryLogicExpression.also(dataFlowAnalyzer::enterBinaryOr)
|
||||
.transformLeftOperand(this, ResolutionMode.WithExpectedType(booleanType)).also(dataFlowAnalyzer::exitLeftBinaryOrArgument)
|
||||
.transformLeftOperand(this, ResolutionMode.WithExpectedType(booleanType))
|
||||
.also(dataFlowAnalyzer::exitLeftBinaryOrArgument)
|
||||
.transformRightOperand(this, ResolutionMode.WithExpectedType(booleanType)).also(dataFlowAnalyzer::exitBinaryOr)
|
||||
}.transformOtherChildren(transformer, ResolutionMode.WithExpectedType(booleanType)).also {
|
||||
it.resultType = booleanType
|
||||
@@ -341,7 +361,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
|
||||
override fun transformVariableAssignment(
|
||||
variableAssignment: FirVariableAssignment,
|
||||
data: ResolutionMode
|
||||
data: ResolutionMode,
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
// val resolvedAssignment = transformCallee(variableAssignment)
|
||||
variableAssignment.annotations.forEach { it.accept(this, data) }
|
||||
@@ -362,7 +382,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
|
||||
override fun transformCallableReferenceAccess(
|
||||
callableReferenceAccess: FirCallableReferenceAccess,
|
||||
data: ResolutionMode
|
||||
data: ResolutionMode,
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
if (callableReferenceAccess.calleeReference is FirResolvedNamedReference) {
|
||||
return callableReferenceAccess.compose()
|
||||
@@ -371,8 +391,8 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
callableReferenceAccess.annotations.forEach { it.accept(this, data) }
|
||||
val explicitReceiver = callableReferenceAccess.explicitReceiver
|
||||
val transformedLHS = explicitReceiver?.transformSingle(this, ResolutionMode.ContextIndependent)?.apply {
|
||||
if (this is FirResolvedQualifierImpl && callableReferenceAccess.safe) {
|
||||
this.safe = true
|
||||
if (this is FirResolvedQualifier && callableReferenceAccess.safe) {
|
||||
replaceSafe(true)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -385,7 +405,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
if (data !is ResolutionMode.ContextDependent) {
|
||||
val resolvedReference =
|
||||
components.syntheticCallGenerator.resolveCallableReferenceWithSyntheticOuterCall(
|
||||
callableReferenceAccess, data.expectedType
|
||||
callableReferenceAccess, data.expectedType,
|
||||
) ?: callableReferenceAccess
|
||||
|
||||
return resolvedReference.compose()
|
||||
@@ -408,7 +428,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
Array((symbol.phasedFir as? FirTypeParametersOwner)?.typeParameters?.size ?: 0) {
|
||||
ConeStarProjection
|
||||
},
|
||||
isNullable = false
|
||||
isNullable = false,
|
||||
)
|
||||
} else {
|
||||
null
|
||||
@@ -424,16 +444,15 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
}
|
||||
|
||||
transformedGetClassCall.resultType =
|
||||
FirResolvedTypeRefImpl(
|
||||
null,
|
||||
kClassSymbol.constructType(arrayOf(typeOfExpression), false)
|
||||
)
|
||||
buildResolvedTypeRef {
|
||||
type = kClassSymbol.constructType(arrayOf(typeOfExpression), false)
|
||||
}
|
||||
return transformedGetClassCall.compose()
|
||||
}
|
||||
|
||||
override fun transformWrappedDelegateExpression(
|
||||
wrappedDelegateExpression: FirWrappedDelegateExpression,
|
||||
data: ResolutionMode
|
||||
data: ResolutionMode,
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
transformExpression(wrappedDelegateExpression, data)
|
||||
with(wrappedDelegateExpression) {
|
||||
@@ -445,7 +464,10 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
}
|
||||
}
|
||||
|
||||
override fun <T> transformConstExpression(constExpression: FirConstExpression<T>, data: ResolutionMode): CompositeTransformResult<FirStatement> {
|
||||
override fun <T> transformConstExpression(
|
||||
constExpression: FirConstExpression<T>,
|
||||
data: ResolutionMode,
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
constExpression.annotations.forEach { it.accept(this, data) }
|
||||
val kind = constExpression.kind
|
||||
val symbol = when (kind) {
|
||||
@@ -473,10 +495,10 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
if (newConstKind == null) {
|
||||
constExpression.replaceKind(FirConstKind.Int as FirConstKind<T>)
|
||||
dataFlowAnalyzer.exitConstExpresion(constExpression as FirConstExpression<*>)
|
||||
constExpression.resultType = FirErrorTypeRefImpl(
|
||||
constExpression.source,
|
||||
FirTypeMismatchError(expectedType, integerLiteralType.getApproximatedType())
|
||||
)
|
||||
constExpression.resultType = buildErrorTypeRef {
|
||||
source = constExpression.source
|
||||
diagnostic = FirTypeMismatchError(expectedType, integerLiteralType.getApproximatedType())
|
||||
}
|
||||
return constExpression.compose()
|
||||
}
|
||||
constExpression.replaceKind(newConstKind as FirConstKind<T>)
|
||||
@@ -500,29 +522,29 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
}
|
||||
|
||||
private fun ConeKotlinTypeProjection.toFirTypeProjection(): FirTypeProjection = when (this) {
|
||||
is ConeStarProjection -> FirStarProjectionImpl(null)
|
||||
is ConeStarProjection -> buildStarProjection()
|
||||
else -> {
|
||||
val variance = when (kind) {
|
||||
ProjectionKind.IN -> Variance.IN_VARIANCE
|
||||
ProjectionKind.OUT -> Variance.OUT_VARIANCE
|
||||
ProjectionKind.INVARIANT -> Variance.INVARIANT
|
||||
ProjectionKind.STAR -> throw IllegalStateException()
|
||||
}
|
||||
val type = when (this) {
|
||||
is ConeKotlinTypeProjectionIn -> type
|
||||
is ConeKotlinTypeProjectionOut -> type
|
||||
is ConeStarProjection -> throw IllegalStateException()
|
||||
else -> this as ConeKotlinType
|
||||
}
|
||||
FirTypeProjectionWithVarianceImpl(
|
||||
null, FirResolvedTypeRefImpl(null, type), variance
|
||||
)
|
||||
buildTypeProjectionWithVariance {
|
||||
typeRef = buildResolvedTypeRef { this.type = type }
|
||||
variance = when (kind) {
|
||||
ProjectionKind.IN -> Variance.IN_VARIANCE
|
||||
ProjectionKind.OUT -> Variance.OUT_VARIANCE
|
||||
ProjectionKind.INVARIANT -> Variance.INVARIANT
|
||||
ProjectionKind.STAR -> throw IllegalStateException()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun transformDelegatedConstructorCall(
|
||||
delegatedConstructorCall: FirDelegatedConstructorCall,
|
||||
data: ResolutionMode
|
||||
data: ResolutionMode,
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
if (transformer.implicitTypeOnly) return delegatedConstructorCall.compose()
|
||||
delegatedConstructorCall.transformChildren(transformer, ResolutionMode.ContextDependent)
|
||||
@@ -553,7 +575,8 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
}
|
||||
else -> return delegatedConstructorCall.compose()
|
||||
}
|
||||
val result = callResolver.resolveDelegatingConstructorCall(delegatedConstructorCall, symbol, typeArguments) ?: return delegatedConstructorCall.compose()
|
||||
val result = callResolver.resolveDelegatingConstructorCall(delegatedConstructorCall, symbol, typeArguments)
|
||||
?: return delegatedConstructorCall.compose()
|
||||
return callCompleter.completeCall(result, noExpectedType).compose()
|
||||
}
|
||||
|
||||
|
||||
+8
-10
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.fir.resolve.transformers.TransformImplicitType
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
||||
import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
@@ -152,10 +152,9 @@ private class ReturnTypeCalculatorWithJump(
|
||||
// TODO?
|
||||
declaration.transformReturnTypeRef(
|
||||
TransformImplicitType,
|
||||
FirErrorTypeRefImpl(
|
||||
null,
|
||||
FirSimpleDiagnostic("Unsupported: implicit VP type")
|
||||
)
|
||||
buildErrorTypeRef {
|
||||
diagnostic = FirSimpleDiagnostic("Unsupported: implicit VP type")
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -167,7 +166,7 @@ private class ReturnTypeCalculatorWithJump(
|
||||
return when (val status = implicitBodyResolveComputationSession.getStatus(declaration.symbol)) {
|
||||
is ImplicitBodyResolveComputationStatus.Computed -> status.resolvedTypeRef
|
||||
is ImplicitBodyResolveComputationStatus.Computing ->
|
||||
FirErrorTypeRefImpl(null, FirSimpleDiagnostic("cycle", DiagnosticKind.RecursionInImplicitTypes))
|
||||
buildErrorTypeRef {diagnostic = FirSimpleDiagnostic("cycle", DiagnosticKind.RecursionInImplicitTypes) }
|
||||
else -> computeReturnTypeRef(declaration)
|
||||
}
|
||||
}
|
||||
@@ -185,13 +184,12 @@ private class ReturnTypeCalculatorWithJump(
|
||||
}.mapTo(mutableListOf()) { provider.getFirClassifierByFqName(it) }
|
||||
|
||||
if (file == null || outerClasses.any { it == null }) {
|
||||
return FirErrorTypeRefImpl(
|
||||
null,
|
||||
FirSimpleDiagnostic(
|
||||
return buildErrorTypeRef {
|
||||
diagnostic = FirSimpleDiagnostic(
|
||||
"Cannot calculate return type (local class/object?)",
|
||||
DiagnosticKind.InferenceError
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
val designation = (listOf(file) + outerClasses.filterNotNull().asReversed() + listOf(declaration))
|
||||
val transformer = FirDesignatedBodyResolveTransformerForReturnTypeCalculator(
|
||||
|
||||
+28
-26
@@ -9,6 +9,9 @@ import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirValueParameterBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
@@ -82,41 +85,40 @@ abstract class AbstractFirUseSiteMemberScope(
|
||||
if (overriddenParameter.defaultValue != null)
|
||||
createValueParameterCopy(overrideParameter, overriddenParameter.defaultValue).apply {
|
||||
annotations += overrideParameter.annotations
|
||||
}
|
||||
}.build()
|
||||
else
|
||||
overrideParameter
|
||||
}
|
||||
}
|
||||
}.build()
|
||||
|
||||
return newSymbol
|
||||
}
|
||||
|
||||
protected open fun createFunctionCopy(firSimpleFunction: FirSimpleFunction, newSymbol: FirNamedFunctionSymbol): FirSimpleFunctionImpl =
|
||||
FirSimpleFunctionImpl(
|
||||
firSimpleFunction.source,
|
||||
firSimpleFunction.session,
|
||||
firSimpleFunction.returnTypeRef,
|
||||
firSimpleFunction.receiverTypeRef,
|
||||
firSimpleFunction.status,
|
||||
firSimpleFunction.name,
|
||||
newSymbol
|
||||
)
|
||||
|
||||
protected open fun createValueParameterCopy(parameter: FirValueParameter, newDefaultValue: FirExpression?): FirValueParameterImpl =
|
||||
with(parameter) {
|
||||
FirValueParameterImpl(
|
||||
source,
|
||||
session,
|
||||
returnTypeRef,
|
||||
name,
|
||||
FirVariableSymbol(parameter.symbol.callableId),
|
||||
newDefaultValue,
|
||||
isCrossinline,
|
||||
isNoinline,
|
||||
isVararg
|
||||
)
|
||||
protected open fun createFunctionCopy(firSimpleFunction: FirSimpleFunction, newSymbol: FirNamedFunctionSymbol): FirSimpleFunctionBuilder =
|
||||
FirSimpleFunctionBuilder().apply {
|
||||
source = firSimpleFunction.source
|
||||
session = firSimpleFunction.session
|
||||
returnTypeRef = firSimpleFunction.returnTypeRef
|
||||
receiverTypeRef = firSimpleFunction.receiverTypeRef
|
||||
name = firSimpleFunction.name
|
||||
status = firSimpleFunction.status
|
||||
symbol = newSymbol
|
||||
}
|
||||
|
||||
protected open fun createValueParameterCopy(parameter: FirValueParameter, newDefaultValue: FirExpression?): FirValueParameterBuilder =
|
||||
FirValueParameterBuilder().apply {
|
||||
source = parameter.source
|
||||
session = parameter.session
|
||||
returnTypeRef = parameter.returnTypeRef
|
||||
name = parameter.name
|
||||
symbol = FirVariableSymbol(parameter.symbol.callableId)
|
||||
defaultValue = newDefaultValue
|
||||
isCrossinline = parameter.isCrossinline
|
||||
isNoinline = parameter.isNoinline
|
||||
isVararg = parameter.isVararg
|
||||
}
|
||||
|
||||
|
||||
override fun processClassifiersByName(
|
||||
name: Name,
|
||||
processor: (FirClassifierSymbol<*>) -> Unit
|
||||
|
||||
+2
-2
@@ -6,7 +6,7 @@
|
||||
package org.jetbrains.kotlin.fir.scopes.impl
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvedImport
|
||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.TowerScopeLevel
|
||||
@@ -20,7 +20,7 @@ abstract class FirAbstractSimpleImportingScope(
|
||||
scopeSession: ScopeSession
|
||||
) : FirAbstractImportingScope(session, scopeSession, lookupInFir = true) {
|
||||
|
||||
protected abstract val simpleImports: Map<Name, List<FirResolvedImportImpl>>
|
||||
protected abstract val simpleImports: Map<Name, List<FirResolvedImport>>
|
||||
|
||||
override fun processClassifiersByName(
|
||||
name: Name,
|
||||
|
||||
+76
-76
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirField
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.*
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.ChainedSubstitutor
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||
@@ -22,9 +22,9 @@ import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.coneTypeUnsafe
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirClassSubstitutionScope(
|
||||
@@ -127,10 +127,13 @@ class FirClassSubstitutionScope(
|
||||
): Pair<List<FirTypeParameter>, ConeSubstitutor> {
|
||||
if (member.typeParameters.isEmpty()) return Pair(member.typeParameters, substitutor)
|
||||
val newTypeParameters = member.typeParameters.map { originalParameter ->
|
||||
FirTypeParameterImpl(
|
||||
originalParameter.source, originalParameter.session, originalParameter.name,
|
||||
FirTypeParameterSymbol(), originalParameter.variance, originalParameter.isReified
|
||||
).apply {
|
||||
FirTypeParameterBuilder().apply {
|
||||
source = originalParameter.source
|
||||
session = originalParameter.session
|
||||
name = originalParameter.name
|
||||
symbol = FirTypeParameterSymbol()
|
||||
variance = originalParameter.variance
|
||||
isReified = originalParameter.isReified
|
||||
annotations += originalParameter.annotations
|
||||
}
|
||||
}
|
||||
@@ -151,9 +154,10 @@ class FirClassSubstitutionScope(
|
||||
}
|
||||
|
||||
newTypeParameter.bounds +=
|
||||
FirResolvedTypeRefImpl(
|
||||
boundTypeRef.source, additionalSubstitutor.substituteOrSelf(substitutedBound ?: typeForBound)
|
||||
)
|
||||
buildResolvedTypeRef {
|
||||
source = boundTypeRef.source
|
||||
type = additionalSubstitutor.substituteOrSelf(substitutedBound ?: typeForBound)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,7 +166,7 @@ class FirClassSubstitutionScope(
|
||||
// While common Ir contracts expect them to be different
|
||||
// if (!wereChangesInTypeParameters) return Pair(member.typeParameters, substitutor)
|
||||
|
||||
return Pair(newTypeParameters, ChainedSubstitutor(substitutor, additionalSubstitutor))
|
||||
return Pair(newTypeParameters.map { it.build() }, ChainedSubstitutor(substitutor, additionalSubstitutor))
|
||||
}
|
||||
|
||||
private fun createFakeOverrideProperty(original: FirPropertySymbol): FirPropertySymbol {
|
||||
@@ -217,47 +221,43 @@ class FirClassSubstitutionScope(
|
||||
newParameterTypes: List<ConeKotlinType?>? = null,
|
||||
newTypeParameters: List<FirTypeParameter>? = null
|
||||
): FirSimpleFunction {
|
||||
return with(baseFunction) {
|
||||
// TODO: consider using here some light-weight functions instead of pseudo-real FirMemberFunctionImpl
|
||||
// As second alternative, we can invent some light-weight kind of FirRegularClass
|
||||
FirSimpleFunctionImpl(
|
||||
source,
|
||||
session,
|
||||
baseFunction.returnTypeRef.withReplacedReturnType(newReturnType),
|
||||
baseFunction.receiverTypeRef?.withReplacedConeType(newReceiverType),
|
||||
baseFunction.status,
|
||||
name,
|
||||
fakeOverrideSymbol
|
||||
).apply {
|
||||
annotations += baseFunction.annotations
|
||||
resolvePhase = baseFunction.resolvePhase
|
||||
valueParameters += baseFunction.valueParameters.zip(
|
||||
newParameterTypes ?: List(baseFunction.valueParameters.size) { null }
|
||||
) { valueParameter, newType ->
|
||||
with(valueParameter) {
|
||||
FirValueParameterImpl(
|
||||
source,
|
||||
session,
|
||||
this.returnTypeRef.withReplacedConeType(newType),
|
||||
name,
|
||||
FirVariableSymbol(valueParameter.symbol.callableId),
|
||||
defaultValue,
|
||||
isCrossinline,
|
||||
isNoinline,
|
||||
isVararg
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Fix the hack for org.jetbrains.kotlin.fir.backend.Fir2IrVisitor.addFakeOverrides
|
||||
// We might have added baseFunction.typeParameters in case new ones are null
|
||||
// But it fails at org.jetbrains.kotlin.ir.AbstractIrTextTestCase.IrVerifier.elementsAreUniqueChecker
|
||||
// because it shares the same declarations of type parameters between two different two functions
|
||||
if (newTypeParameters != null) {
|
||||
typeParameters += newTypeParameters
|
||||
// TODO: consider using here some light-weight functions instead of pseudo-real FirMemberFunctionImpl
|
||||
// As second alternative, we can invent some light-weight kind of FirRegularClass
|
||||
return buildSimpleFunction {
|
||||
source = baseFunction.source
|
||||
this.session = session
|
||||
returnTypeRef = baseFunction.returnTypeRef.withReplacedReturnType(newReturnType)
|
||||
receiverTypeRef = baseFunction.receiverTypeRef?.withReplacedConeType(newReceiverType)
|
||||
name = baseFunction.name
|
||||
status = baseFunction.status
|
||||
symbol = fakeOverrideSymbol
|
||||
annotations += baseFunction.annotations
|
||||
resolvePhase = baseFunction.resolvePhase
|
||||
valueParameters += baseFunction.valueParameters.zip(
|
||||
newParameterTypes ?: List(baseFunction.valueParameters.size) { null }
|
||||
) { valueParameter, newType ->
|
||||
buildValueParameter {
|
||||
source = valueParameter.source
|
||||
this.session = session
|
||||
returnTypeRef = valueParameter.returnTypeRef.withReplacedConeType(newType)
|
||||
name = valueParameter.name
|
||||
symbol = FirVariableSymbol(valueParameter.symbol.callableId)
|
||||
defaultValue = valueParameter.defaultValue
|
||||
isCrossinline = valueParameter.isCrossinline
|
||||
isNoinline = valueParameter.isNoinline
|
||||
isVararg = valueParameter.isVararg
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Fix the hack for org.jetbrains.kotlin.fir.backend.Fir2IrVisitor.addFakeOverrides
|
||||
// We might have added baseFunction.typeParameters in case new ones are null
|
||||
// But it fails at org.jetbrains.kotlin.ir.AbstractIrTextTestCase.IrVerifier.elementsAreUniqueChecker
|
||||
// because it shares the same declarations of type parameters between two different two functions
|
||||
if (newTypeParameters != null) {
|
||||
typeParameters += newTypeParameters
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fun createFakeOverrideFunction(
|
||||
@@ -284,23 +284,18 @@ class FirClassSubstitutionScope(
|
||||
newReturnType: ConeKotlinType? = null
|
||||
): FirPropertySymbol {
|
||||
val symbol = FirPropertySymbol(baseSymbol.callableId, true, baseSymbol)
|
||||
with(baseProperty) {
|
||||
FirPropertyImpl(
|
||||
source,
|
||||
session,
|
||||
baseProperty.returnTypeRef.withReplacedReturnType(newReturnType),
|
||||
baseProperty.receiverTypeRef?.withReplacedConeType(newReceiverType),
|
||||
name,
|
||||
null,
|
||||
null,
|
||||
isVar,
|
||||
symbol,
|
||||
false,
|
||||
baseProperty.status
|
||||
).apply {
|
||||
resolvePhase = baseProperty.resolvePhase
|
||||
annotations += baseProperty.annotations
|
||||
}
|
||||
buildProperty {
|
||||
source = baseProperty.source
|
||||
this.session = session
|
||||
returnTypeRef = baseProperty.returnTypeRef.withReplacedReturnType(newReturnType)
|
||||
receiverTypeRef = baseProperty.receiverTypeRef?.withReplacedConeType(newReceiverType)
|
||||
name = baseProperty.name
|
||||
isVar = baseProperty.isVar
|
||||
this.symbol = symbol
|
||||
isLocal = false
|
||||
status = baseProperty.status
|
||||
resolvePhase = baseProperty.resolvePhase
|
||||
annotations += baseProperty.annotations
|
||||
}
|
||||
return symbol
|
||||
}
|
||||
@@ -312,15 +307,16 @@ class FirClassSubstitutionScope(
|
||||
newReturnType: ConeKotlinType? = null
|
||||
): FirFieldSymbol {
|
||||
val symbol = FirFieldSymbol(baseSymbol.callableId)
|
||||
with(baseField) {
|
||||
FirFieldImpl(
|
||||
source, session,
|
||||
baseField.returnTypeRef.withReplacedConeType(newReturnType),
|
||||
name, symbol, isVar, baseField.status
|
||||
).apply {
|
||||
resolvePhase = baseField.resolvePhase
|
||||
annotations += baseField.annotations
|
||||
}
|
||||
buildField {
|
||||
source = baseField.source
|
||||
this.session = session
|
||||
returnTypeRef = baseField.returnTypeRef.withReplacedConeType(newReturnType)
|
||||
name = baseField.name
|
||||
this.symbol = symbol
|
||||
isVar = baseField.isVar
|
||||
status = baseField.status
|
||||
resolvePhase = baseField.resolvePhase
|
||||
annotations += baseField.annotations
|
||||
}
|
||||
return symbol
|
||||
}
|
||||
@@ -345,7 +341,9 @@ fun FirTypeRef.withReplacedReturnType(newType: ConeKotlinType?): FirTypeRef {
|
||||
require(this is FirResolvedTypeRef || newType == null)
|
||||
if (newType == null) return this
|
||||
|
||||
return FirResolvedTypeRefImpl(source, newType).apply {
|
||||
return buildResolvedTypeRef {
|
||||
source = this@withReplacedReturnType.source
|
||||
type = newType
|
||||
annotations += this@withReplacedReturnType.annotations
|
||||
}
|
||||
}
|
||||
@@ -354,7 +352,9 @@ fun FirTypeRef.withReplacedConeType(newType: ConeKotlinType?): FirResolvedTypeRe
|
||||
require(this is FirResolvedTypeRef)
|
||||
if (newType == null) return this
|
||||
|
||||
return FirResolvedTypeRefImpl(source, newType).apply {
|
||||
return buildResolvedTypeRef {
|
||||
source = this@withReplacedConeType.source
|
||||
type = newType
|
||||
annotations += this@withReplacedConeType.annotations
|
||||
}
|
||||
}
|
||||
|
||||
+9
-6
@@ -7,8 +7,9 @@ package org.jetbrains.kotlin.fir.scopes.impl
|
||||
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirImportImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirImport
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvedImport
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildImport
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer
|
||||
|
||||
@@ -18,8 +19,8 @@ class FirDefaultSimpleImportingScope(
|
||||
priority: DefaultImportPriority
|
||||
) : FirAbstractSimpleImportingScope(session, scopeSession) {
|
||||
|
||||
private fun FirImportImpl.resolve(importResolveTransformer: FirImportResolveTransformer) =
|
||||
importResolveTransformer.transformImport(this, null).single as FirResolvedImportImpl
|
||||
private fun FirImport.resolve(importResolveTransformer: FirImportResolveTransformer) =
|
||||
importResolveTransformer.transformImport(this, null).single as FirResolvedImport
|
||||
|
||||
override val simpleImports = run {
|
||||
val importResolveTransformer = FirImportResolveTransformer(session)
|
||||
@@ -28,8 +29,10 @@ class FirDefaultSimpleImportingScope(
|
||||
allDefaultImports
|
||||
?.filter { !it.isAllUnder }
|
||||
?.map {
|
||||
FirImportImpl(null, it.fqName, isAllUnder = false, aliasName = null)
|
||||
.resolve(importResolveTransformer)
|
||||
buildImport {
|
||||
importedFqName = it.fqName
|
||||
isAllUnder = false
|
||||
}.resolve(importResolveTransformer)
|
||||
}?.groupBy { it.importedName!! } ?: emptyMap()
|
||||
}
|
||||
}
|
||||
|
||||
+9
-7
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.fir.scopes.impl
|
||||
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirImportImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildImport
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildResolvedImport
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
|
||||
class FirDefaultStarImportingScope(
|
||||
@@ -24,11 +24,13 @@ class FirDefaultStarImportingScope(
|
||||
allDefaultImports
|
||||
?.filter { it.isAllUnder }
|
||||
?.map {
|
||||
FirResolvedImportImpl(
|
||||
FirImportImpl(null, it.fqName, isAllUnder = true, aliasName = null),
|
||||
it.fqName,
|
||||
null
|
||||
)
|
||||
buildResolvedImport {
|
||||
delegate = buildImport {
|
||||
importedFqName = it.fqName
|
||||
isAllUnder = true
|
||||
}
|
||||
packageFqName = it.fqName
|
||||
}
|
||||
} ?: emptyList()
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.scopes.impl
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirImport
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvedImport
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
|
||||
class FirExplicitSimpleImportingScope(
|
||||
@@ -17,7 +17,7 @@ class FirExplicitSimpleImportingScope(
|
||||
) : FirAbstractSimpleImportingScope(session, scopeSession) {
|
||||
|
||||
override val simpleImports =
|
||||
imports.filterIsInstance<FirResolvedImportImpl>()
|
||||
imports.filterIsInstance<FirResolvedImport>()
|
||||
.filter { !it.isAllUnder && it.importedName != null }
|
||||
.groupBy { it.aliasName ?: it.importedName!! }
|
||||
}
|
||||
|
||||
+30
-19
@@ -7,19 +7,15 @@ package org.jetbrains.kotlin.fir.scopes.impl
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.FirSymbolOwner
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl
|
||||
import org.jetbrains.kotlin.fir.resolve.scopeSessionKey
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||
@@ -80,17 +76,17 @@ class FirIntegerLiteralTypeScope(private val session: FirSession) : FirScope() {
|
||||
name to FirNamedFunctionSymbol(CallableId(name)).apply {
|
||||
createFirFunction(name, this).apply {
|
||||
val valueParameterName = Name.identifier("arg")
|
||||
valueParameters += FirValueParameterImpl(
|
||||
source = null,
|
||||
session,
|
||||
FirILTTypeRefPlaceHolder(),
|
||||
valueParameterName,
|
||||
FirVariableSymbol(name),
|
||||
defaultValue = null,
|
||||
isCrossinline = false,
|
||||
isNoinline = false,
|
||||
valueParameters += buildValueParameter {
|
||||
source = null
|
||||
session = this@FirIntegerLiteralTypeScope.session
|
||||
returnTypeRef = FirILTTypeRefPlaceHolder()
|
||||
this.name = valueParameterName
|
||||
symbol = FirVariableSymbol(valueParameterName)
|
||||
defaultValue = null
|
||||
isCrossinline = false
|
||||
isNoinline = false
|
||||
isVararg = false
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}.toMap()
|
||||
@@ -99,6 +95,7 @@ class FirIntegerLiteralTypeScope(private val session: FirSession) : FirScope() {
|
||||
name to FirNamedFunctionSymbol(CallableId(name)).apply { createFirFunction(name, this) }
|
||||
}.toMap()
|
||||
|
||||
@UseExperimental(FirImplementationDetail::class)
|
||||
private fun createFirFunction(name: Name, symbol: FirNamedFunctionSymbol): FirSimpleFunctionImpl = FirIntegerOperator(
|
||||
source = null,
|
||||
session,
|
||||
@@ -126,7 +123,8 @@ class FirIntegerLiteralTypeScope(private val session: FirSession) : FirScope() {
|
||||
}
|
||||
}
|
||||
|
||||
class FirIntegerOperator(
|
||||
@UseExperimental(FirImplementationDetail::class)
|
||||
class FirIntegerOperator @FirImplementationDetail constructor(
|
||||
source: FirSourceElement?,
|
||||
session: FirSession,
|
||||
returnTypeRef: FirTypeRef,
|
||||
@@ -134,7 +132,21 @@ class FirIntegerOperator(
|
||||
val kind: Kind,
|
||||
status: FirDeclarationStatus,
|
||||
symbol: FirFunctionSymbol<FirSimpleFunction>
|
||||
) : FirSimpleFunctionImpl(source, session, returnTypeRef, receiverTypeRef, status, kind.operatorName, symbol) {
|
||||
) : FirSimpleFunctionImpl(
|
||||
source,
|
||||
session,
|
||||
resolvePhase = FirResolvePhase.BODY_RESOLVE,
|
||||
returnTypeRef,
|
||||
receiverTypeRef,
|
||||
typeParameters = mutableListOf(),
|
||||
valueParameters = mutableListOf(),
|
||||
body = null,
|
||||
status,
|
||||
containerSource = null,
|
||||
kind.operatorName,
|
||||
symbol,
|
||||
annotations = mutableListOf(),
|
||||
) {
|
||||
enum class Kind(val unary: Boolean, val operatorName: Name) {
|
||||
PLUS(false, OperatorNameConventions.PLUS),
|
||||
MINUS(false, OperatorNameConventions.MINUS),
|
||||
@@ -166,4 +178,3 @@ class FirILTTypeRefPlaceHolder : FirResolvedTypeRef() {
|
||||
}
|
||||
}
|
||||
|
||||
class FirIntegerOperatorCall(source: FirSourceElement?) : FirFunctionCallImpl(source)
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* 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.scopes.impl
|
||||
|
||||
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
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.FirCallBuilder
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessBuilder
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
||||
import org.jetbrains.kotlin.fir.references.FirNamedReference
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeProjection
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef
|
||||
|
||||
@UseExperimental(FirImplementationDetail::class)
|
||||
class FirIntegerOperatorCall @FirImplementationDetail constructor(
|
||||
source: FirSourceElement?,
|
||||
typeRef: FirTypeRef,
|
||||
annotations: MutableList<FirAnnotationCall>,
|
||||
safe: Boolean,
|
||||
typeArguments: MutableList<FirTypeProjection>,
|
||||
explicitReceiver: FirExpression?,
|
||||
dispatchReceiver: FirExpression,
|
||||
extensionReceiver: FirExpression,
|
||||
arguments: MutableList<FirExpression>,
|
||||
calleeReference: FirNamedReference,
|
||||
) : FirFunctionCallImpl(
|
||||
source,
|
||||
typeRef,
|
||||
annotations,
|
||||
safe,
|
||||
typeArguments,
|
||||
explicitReceiver,
|
||||
dispatchReceiver,
|
||||
extensionReceiver,
|
||||
arguments,
|
||||
calleeReference,
|
||||
)
|
||||
|
||||
@FirBuilderDsl
|
||||
class FirIntegerOperatorCallBuilder : FirQualifiedAccessBuilder, FirCallBuilder, FirAnnotationContainerBuilder, FirExpressionBuilder {
|
||||
override var source: FirSourceElement? = null
|
||||
override var typeRef: FirTypeRef = buildImplicitTypeRef()
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
override var safe: Boolean = false
|
||||
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
|
||||
override var explicitReceiver: FirExpression? = null
|
||||
override var dispatchReceiver: FirExpression = FirNoReceiverExpression
|
||||
override var extensionReceiver: FirExpression = FirNoReceiverExpression
|
||||
override val arguments: MutableList<FirExpression> = mutableListOf()
|
||||
lateinit var calleeReference: FirNamedReference
|
||||
|
||||
@UseExperimental(FirImplementationDetail::class)
|
||||
override fun build(): FirIntegerOperatorCall {
|
||||
return FirIntegerOperatorCall(
|
||||
source,
|
||||
typeRef,
|
||||
annotations,
|
||||
safe,
|
||||
typeArguments,
|
||||
explicitReceiver,
|
||||
dispatchReceiver,
|
||||
extensionReceiver,
|
||||
arguments,
|
||||
calleeReference,
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
inline fun buildFunctionCall(init: FirIntegerOperatorCallBuilder.() -> Unit): FirIntegerOperatorCall {
|
||||
return FirIntegerOperatorCallBuilder().apply(init).build()
|
||||
}
|
||||
@@ -5,15 +5,43 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.types.jvm
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.types.FirQualifierPart
|
||||
import org.jetbrains.kotlin.fir.types.FirUserTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.FirUserTypeRefBuilder
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirUserTypeRefImpl
|
||||
import org.jetbrains.kotlin.load.java.structure.JavaType
|
||||
|
||||
class FirJavaTypeRef(
|
||||
annotations: List<FirAnnotationCall>,
|
||||
val type: JavaType
|
||||
) : FirUserTypeRefImpl(source = null, isMarkedNullable = false) {
|
||||
init {
|
||||
this.annotations += annotations
|
||||
val type: JavaType,
|
||||
annotations: MutableList<FirAnnotationCall>,
|
||||
qualifier: MutableList<FirQualifierPart>
|
||||
) : FirUserTypeRefImpl(
|
||||
source = null,
|
||||
isMarkedNullable = false,
|
||||
qualifier,
|
||||
annotations
|
||||
)
|
||||
|
||||
@FirBuilderDsl
|
||||
class FirJavaTypeRefBuilder : FirUserTypeRefBuilder() {
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
lateinit var type: JavaType
|
||||
|
||||
override fun build(): FirJavaTypeRef {
|
||||
return FirJavaTypeRef(type, annotations, qualifier)
|
||||
}
|
||||
|
||||
@Deprecated("Modification of 'source' has no impact for FirJavaTypeRefBuilder", level = DeprecationLevel.HIDDEN)
|
||||
override var source: FirSourceElement? = null
|
||||
|
||||
@Deprecated("Modification of 'isMarkedNullable' has no impact for FirJavaTypeRefBuilder", level = DeprecationLevel.HIDDEN)
|
||||
override var isMarkedNullable: Boolean = false
|
||||
}
|
||||
|
||||
inline fun buildJavaTypeRef(init: FirJavaTypeRefBuilder.() -> Unit): FirJavaTypeRef {
|
||||
return FirJavaTypeRefBuilder().apply(init).build()
|
||||
}
|
||||
@@ -102,7 +102,7 @@ class FirResolveBench(val withProgress: Boolean) {
|
||||
var firFile: FirFile? = null
|
||||
val time = measureNanoTime {
|
||||
firFile = builder.buildFirFile(file)
|
||||
(builder.session.firProvider as FirProviderImpl).recordFile(firFile!!)
|
||||
(builder.baseSession.firProvider as FirProviderImpl).recordFile(firFile!!)
|
||||
}
|
||||
val after = vmStateSnapshot()
|
||||
val diff = after - before
|
||||
|
||||
@@ -28,7 +28,7 @@ dependencies {
|
||||
generatorClasspath(project("tree-generator"))
|
||||
}
|
||||
|
||||
val generationRoot = projectDir.resolve("gen")
|
||||
val generationRoot = File(projectDir.resolve("gen").absolutePath.replace("tree", "new-tree"))
|
||||
|
||||
val generateTree by tasks.registering(NoDebugJavaExec::class) {
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
*.kt eol=lf
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* 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.builder
|
||||
|
||||
import kotlin.contracts.*
|
||||
import org.jetbrains.kotlin.fir.FirAnnotationContainer
|
||||
import org.jetbrains.kotlin.fir.FirPureAbstractElement
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
|
||||
/*
|
||||
* This file was generated automatically
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
@FirBuilderDsl
|
||||
class FirAbstractAnnotatedElementBuilder {
|
||||
var source: FirSourceElement? = null
|
||||
val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
|
||||
fun build(): FirAnnotationContainer {
|
||||
return FirAbstractAnnotatedElement(
|
||||
source,
|
||||
annotations,
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@UseExperimental(ExperimentalContracts::class)
|
||||
inline fun buildAbstractAnnotatedElement(init: FirAbstractAnnotatedElementBuilder.() -> Unit = {}): FirAnnotationContainer {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
return FirAbstractAnnotatedElementBuilder().apply(init).build()
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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.builder
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirAnnotationContainer
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
|
||||
/*
|
||||
* This file was generated automatically
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
@FirBuilderDsl
|
||||
interface FirAnnotationContainerBuilder {
|
||||
abstract var source: FirSourceElement?
|
||||
abstract val annotations: MutableList<FirAnnotationCall>
|
||||
|
||||
fun build(): FirAnnotationContainer
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* 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.builder
|
||||
|
||||
import kotlin.contracts.*
|
||||
import org.jetbrains.kotlin.fir.FirLabel
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.impl.FirLabelImpl
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
|
||||
/*
|
||||
* This file was generated automatically
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
@FirBuilderDsl
|
||||
class FirLabelBuilder {
|
||||
var source: FirSourceElement? = null
|
||||
lateinit var name: String
|
||||
|
||||
fun build(): FirLabel {
|
||||
return FirLabelImpl(
|
||||
source,
|
||||
name,
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@UseExperimental(ExperimentalContracts::class)
|
||||
inline fun buildLabel(init: FirLabelBuilder.() -> Unit): FirLabel {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
return FirLabelBuilder().apply(init).build()
|
||||
}
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* 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.contracts.builder
|
||||
|
||||
import kotlin.contracts.*
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
|
||||
import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration
|
||||
import org.jetbrains.kotlin.fir.contracts.impl.FirContractDescriptionImpl
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
|
||||
/*
|
||||
* This file was generated automatically
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
@FirBuilderDsl
|
||||
class FirContractDescriptionBuilder {
|
||||
var source: FirSourceElement? = null
|
||||
val effects: MutableList<ConeEffectDeclaration> = mutableListOf()
|
||||
|
||||
fun build(): FirContractDescription {
|
||||
return FirContractDescriptionImpl(
|
||||
source,
|
||||
effects,
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@UseExperimental(ExperimentalContracts::class)
|
||||
inline fun buildContractDescription(init: FirContractDescriptionBuilder.() -> Unit = {}): FirContractDescription {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
return FirContractDescriptionBuilder().apply(init).build()
|
||||
}
|
||||
+3
-4
@@ -15,11 +15,10 @@ import org.jetbrains.kotlin.fir.visitors.*
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
class FirContractDescriptionImpl(
|
||||
override val source: FirSourceElement?
|
||||
internal class FirContractDescriptionImpl(
|
||||
override val source: FirSourceElement?,
|
||||
override val effects: MutableList<ConeEffectDeclaration>,
|
||||
) : FirContractDescription() {
|
||||
override val effects: MutableList<ConeEffectDeclaration> = mutableListOf()
|
||||
|
||||
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirContractDescriptionImpl {
|
||||
|
||||
+2
@@ -21,5 +21,7 @@ interface FirContractDescriptionOwner : FirElement {
|
||||
|
||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitContractDescriptionOwner(this, data)
|
||||
|
||||
fun replaceContractDescription(newContractDescription: FirContractDescription)
|
||||
|
||||
fun <D> transformContractDescription(transformer: FirTransformer<D>, data: D): FirContractDescriptionOwner
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ interface FirRegularClass : FirMemberDeclaration, FirTypeParametersOwner, FirCla
|
||||
val name: Name
|
||||
override val symbol: FirRegularClassSymbol
|
||||
val companionObject: FirRegularClass?
|
||||
val hasLazyNestedClassifiers: Boolean
|
||||
override val superTypeRefs: List<FirTypeRef>
|
||||
|
||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitRegularClass(this, data)
|
||||
|
||||
@@ -35,6 +35,7 @@ abstract class FirSealedClass : FirPureAbstractElement(), FirRegularClass {
|
||||
abstract override val name: Name
|
||||
abstract override val symbol: FirRegularClassSymbol
|
||||
abstract override val companionObject: FirRegularClass?
|
||||
abstract override val hasLazyNestedClassifiers: Boolean
|
||||
abstract override val superTypeRefs: List<FirTypeRef>
|
||||
abstract val inheritors: List<ClassId>
|
||||
|
||||
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* 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.declarations.builder
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirClassBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParametersOwnerBuilder
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
/*
|
||||
* This file was generated automatically
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
@FirBuilderDsl
|
||||
interface AbstractFirRegularClassBuilder : FirClassBuilder, FirTypeParametersOwnerBuilder {
|
||||
abstract override var source: FirSourceElement?
|
||||
abstract override val annotations: MutableList<FirAnnotationCall>
|
||||
abstract override var session: FirSession
|
||||
abstract override var classKind: ClassKind
|
||||
abstract override val superTypeRefs: MutableList<FirTypeRef>
|
||||
abstract override val declarations: MutableList<FirDeclaration>
|
||||
abstract override var scopeProvider: FirScopeProvider
|
||||
abstract override val typeParameters: MutableList<FirTypeParameter>
|
||||
abstract var resolvePhase: FirResolvePhase
|
||||
abstract var status: FirDeclarationStatus
|
||||
abstract var name: Name
|
||||
abstract var symbol: FirRegularClassSymbol
|
||||
abstract var companionObject: FirRegularClass?
|
||||
abstract var hasLazyNestedClassifiers: Boolean
|
||||
override fun build(): FirRegularClass
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* 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.declarations.builder
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirFunctionBuilder
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
|
||||
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||
|
||||
/*
|
||||
* This file was generated automatically
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
@FirBuilderDsl
|
||||
interface FirAbstractConstructorBuilder : FirFunctionBuilder {
|
||||
abstract override var source: FirSourceElement?
|
||||
abstract override val annotations: MutableList<FirAnnotationCall>
|
||||
abstract override var session: FirSession
|
||||
abstract override var returnTypeRef: FirTypeRef
|
||||
abstract override val typeParameters: MutableList<FirTypeParameter>
|
||||
abstract override val valueParameters: MutableList<FirValueParameter>
|
||||
abstract override var body: FirBlock?
|
||||
abstract var resolvePhase: FirResolvePhase
|
||||
abstract var receiverTypeRef: FirTypeRef?
|
||||
abstract var controlFlowGraphReference: FirControlFlowGraphReference
|
||||
abstract var status: FirDeclarationStatus
|
||||
abstract var containerSource: DeserializedContainerSource?
|
||||
abstract var symbol: FirConstructorSymbol
|
||||
abstract var delegatedConstructor: FirDelegatedConstructorCall?
|
||||
override fun build(): FirConstructor
|
||||
}
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
* 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.declarations.builder
|
||||
|
||||
import kotlin.contracts.*
|
||||
import org.jetbrains.kotlin.contracts.description.InvocationKind
|
||||
import org.jetbrains.kotlin.fir.FirLabel
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirFunctionBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirAnonymousFunctionImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableFunction
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
|
||||
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReference
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
|
||||
/*
|
||||
* This file was generated automatically
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
@FirBuilderDsl
|
||||
class FirAnonymousFunctionBuilder : FirFunctionBuilder, FirAnnotationContainerBuilder, FirExpressionBuilder {
|
||||
override var source: FirSourceElement? = null
|
||||
override lateinit var session: FirSession
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
override lateinit var returnTypeRef: FirTypeRef
|
||||
var receiverTypeRef: FirTypeRef? = null
|
||||
override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||
var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference
|
||||
override val valueParameters: MutableList<FirValueParameter> = mutableListOf()
|
||||
override var body: FirBlock? = null
|
||||
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
|
||||
lateinit var symbol: FirAnonymousFunctionSymbol
|
||||
var label: FirLabel? = null
|
||||
var invocationKind: InvocationKind? = null
|
||||
var isLambda: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
|
||||
|
||||
override fun build(): FirAnonymousFunction {
|
||||
return FirAnonymousFunctionImpl(
|
||||
source,
|
||||
session,
|
||||
annotations,
|
||||
returnTypeRef,
|
||||
receiverTypeRef,
|
||||
typeParameters,
|
||||
controlFlowGraphReference,
|
||||
valueParameters,
|
||||
body,
|
||||
typeRef,
|
||||
symbol,
|
||||
label,
|
||||
invocationKind,
|
||||
isLambda,
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@UseExperimental(ExperimentalContracts::class)
|
||||
inline fun buildAnonymousFunction(init: FirAnonymousFunctionBuilder.() -> Unit): FirAnonymousFunction {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
return FirAnonymousFunctionBuilder().apply(init).build()
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* 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.declarations.builder
|
||||
|
||||
import kotlin.contracts.*
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirAnonymousInitializer
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirAnonymousInitializerImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
|
||||
/*
|
||||
* This file was generated automatically
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
@FirBuilderDsl
|
||||
class FirAnonymousInitializerBuilder {
|
||||
var source: FirSourceElement? = null
|
||||
lateinit var session: FirSession
|
||||
var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||
var body: FirBlock? = null
|
||||
|
||||
fun build(): FirAnonymousInitializer {
|
||||
return FirAnonymousInitializerImpl(
|
||||
source,
|
||||
session,
|
||||
resolvePhase,
|
||||
body,
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@UseExperimental(ExperimentalContracts::class)
|
||||
inline fun buildAnonymousInitializer(init: FirAnonymousInitializerBuilder.() -> Unit): FirAnonymousInitializer {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
return FirAnonymousInitializerBuilder().apply(init).build()
|
||||
}
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* 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.declarations.builder
|
||||
|
||||
import kotlin.contracts.*
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirClassBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirAnonymousObjectImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableClass
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
|
||||
/*
|
||||
* This file was generated automatically
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
@FirBuilderDsl
|
||||
class FirAnonymousObjectBuilder : FirClassBuilder, FirAnnotationContainerBuilder, FirExpressionBuilder {
|
||||
override var source: FirSourceElement? = null
|
||||
override lateinit var session: FirSession
|
||||
var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||
override lateinit var classKind: ClassKind
|
||||
override val superTypeRefs: MutableList<FirTypeRef> = mutableListOf()
|
||||
override val declarations: MutableList<FirDeclaration> = mutableListOf()
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
override lateinit var scopeProvider: FirScopeProvider
|
||||
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
|
||||
lateinit var symbol: FirAnonymousObjectSymbol
|
||||
|
||||
override fun build(): FirAnonymousObject {
|
||||
return FirAnonymousObjectImpl(
|
||||
source,
|
||||
session,
|
||||
resolvePhase,
|
||||
classKind,
|
||||
superTypeRefs,
|
||||
declarations,
|
||||
annotations,
|
||||
scopeProvider,
|
||||
typeRef,
|
||||
symbol,
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@UseExperimental(ExperimentalContracts::class)
|
||||
inline fun buildAnonymousObject(init: FirAnonymousObjectBuilder.() -> Unit): FirAnonymousObject {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
return FirAnonymousObjectBuilder().apply(init).build()
|
||||
}
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* 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.declarations.builder
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
|
||||
/*
|
||||
* This file was generated automatically
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
@FirBuilderDsl
|
||||
interface FirClassBuilder : FirAnnotationContainerBuilder {
|
||||
abstract override var source: FirSourceElement?
|
||||
abstract override val annotations: MutableList<FirAnnotationCall>
|
||||
abstract var session: FirSession
|
||||
abstract var classKind: ClassKind
|
||||
abstract val superTypeRefs: MutableList<FirTypeRef>
|
||||
abstract val declarations: MutableList<FirDeclaration>
|
||||
abstract var scopeProvider: FirScopeProvider
|
||||
override fun build(): FirClass<*>
|
||||
}
|
||||
+84
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* 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.declarations.builder
|
||||
|
||||
import kotlin.contracts.*
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.fir.FirPureAbstractElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.AbstractFirRegularClassBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirClassImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableRegularClass
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
/*
|
||||
* This file was generated automatically
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
@FirBuilderDsl
|
||||
open class FirClassImplBuilder : AbstractFirRegularClassBuilder, FirAnnotationContainerBuilder {
|
||||
override var source: FirSourceElement? = null
|
||||
override lateinit var session: FirSession
|
||||
override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||
override lateinit var status: FirDeclarationStatus
|
||||
override lateinit var classKind: ClassKind
|
||||
override val declarations: MutableList<FirDeclaration> = mutableListOf()
|
||||
override lateinit var scopeProvider: FirScopeProvider
|
||||
override lateinit var name: Name
|
||||
override lateinit var symbol: FirRegularClassSymbol
|
||||
override var companionObject: FirRegularClass? = null
|
||||
override val superTypeRefs: MutableList<FirTypeRef> = mutableListOf()
|
||||
|
||||
override fun build(): FirRegularClass {
|
||||
return FirClassImpl(
|
||||
source,
|
||||
session,
|
||||
resolvePhase,
|
||||
annotations,
|
||||
typeParameters,
|
||||
status,
|
||||
classKind,
|
||||
declarations,
|
||||
scopeProvider,
|
||||
name,
|
||||
symbol,
|
||||
companionObject,
|
||||
superTypeRefs,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@Deprecated("Modification of 'hasLazyNestedClassifiers' has no impact for FirClassImplBuilder", level = DeprecationLevel.HIDDEN)
|
||||
override var hasLazyNestedClassifiers: Boolean
|
||||
get() = throw IllegalStateException()
|
||||
set(value) {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
}
|
||||
|
||||
@UseExperimental(ExperimentalContracts::class)
|
||||
inline fun buildClassImpl(init: FirClassImplBuilder.() -> Unit): FirRegularClass {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
return FirClassImplBuilder().apply(init).build()
|
||||
}
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* 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.declarations.builder
|
||||
|
||||
import kotlin.contracts.*
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirAbstractConstructorBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirConstructorImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableConstructor
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
|
||||
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReference
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||
|
||||
/*
|
||||
* This file was generated automatically
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
@FirBuilderDsl
|
||||
open class FirConstructorBuilder : FirAbstractConstructorBuilder, FirAnnotationContainerBuilder {
|
||||
override var source: FirSourceElement? = null
|
||||
override lateinit var session: FirSession
|
||||
override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||
override lateinit var returnTypeRef: FirTypeRef
|
||||
override var receiverTypeRef: FirTypeRef? = null
|
||||
override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||
override val valueParameters: MutableList<FirValueParameter> = mutableListOf()
|
||||
override lateinit var status: FirDeclarationStatus
|
||||
override var containerSource: DeserializedContainerSource? = null
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
override lateinit var symbol: FirConstructorSymbol
|
||||
override var delegatedConstructor: FirDelegatedConstructorCall? = null
|
||||
override var body: FirBlock? = null
|
||||
|
||||
override fun build(): FirConstructor {
|
||||
return FirConstructorImpl(
|
||||
source,
|
||||
session,
|
||||
resolvePhase,
|
||||
returnTypeRef,
|
||||
receiverTypeRef,
|
||||
typeParameters,
|
||||
valueParameters,
|
||||
status,
|
||||
containerSource,
|
||||
annotations,
|
||||
symbol,
|
||||
delegatedConstructor,
|
||||
body,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@Deprecated("Modification of 'controlFlowGraphReference' has no impact for FirConstructorBuilder", level = DeprecationLevel.HIDDEN)
|
||||
override var controlFlowGraphReference: FirControlFlowGraphReference
|
||||
get() = throw IllegalStateException()
|
||||
set(value) {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
}
|
||||
|
||||
@UseExperimental(ExperimentalContracts::class)
|
||||
inline fun buildConstructor(init: FirConstructorBuilder.() -> Unit): FirConstructor {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
return FirConstructorBuilder().apply(init).build()
|
||||
}
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
* 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.declarations.builder
|
||||
|
||||
import kotlin.contracts.*
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultSetterValueParameter
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
/*
|
||||
* This file was generated automatically
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
@FirBuilderDsl
|
||||
class FirDefaultSetterValueParameterBuilder : FirAnnotationContainerBuilder {
|
||||
override var source: FirSourceElement? = null
|
||||
lateinit var session: FirSession
|
||||
var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||
lateinit var returnTypeRef: FirTypeRef
|
||||
var receiverTypeRef: FirTypeRef? = null
|
||||
lateinit var symbol: FirVariableSymbol<FirValueParameter>
|
||||
var initializer: FirExpression? = null
|
||||
var delegate: FirExpression? = null
|
||||
var delegateFieldSymbol: FirDelegateFieldSymbol<FirValueParameter>? = null
|
||||
var isVar: Boolean = false
|
||||
var isVal: Boolean = true
|
||||
var getter: FirPropertyAccessor? = null
|
||||
var setter: FirPropertyAccessor? = null
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
var defaultValue: FirExpression? = null
|
||||
var isCrossinline: Boolean = false
|
||||
var isNoinline: Boolean = false
|
||||
var isVararg: Boolean = false
|
||||
|
||||
override fun build(): FirValueParameter {
|
||||
return FirDefaultSetterValueParameter(
|
||||
source,
|
||||
session,
|
||||
resolvePhase,
|
||||
returnTypeRef,
|
||||
receiverTypeRef,
|
||||
symbol,
|
||||
initializer,
|
||||
delegate,
|
||||
delegateFieldSymbol,
|
||||
isVar,
|
||||
isVal,
|
||||
getter,
|
||||
setter,
|
||||
annotations,
|
||||
defaultValue,
|
||||
isCrossinline,
|
||||
isNoinline,
|
||||
isVararg,
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@UseExperimental(ExperimentalContracts::class)
|
||||
inline fun buildDefaultSetterValueParameter(init: FirDefaultSetterValueParameterBuilder.() -> Unit): FirValueParameter {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
return FirDefaultSetterValueParameterBuilder().apply(init).build()
|
||||
}
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* 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.declarations.builder
|
||||
|
||||
import kotlin.contracts.*
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
|
||||
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirEnumEntryImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||
|
||||
/*
|
||||
* This file was generated automatically
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
@FirBuilderDsl
|
||||
class FirEnumEntryBuilder : FirAnnotationContainerBuilder {
|
||||
override var source: FirSourceElement? = null
|
||||
lateinit var session: FirSession
|
||||
var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||
lateinit var returnTypeRef: FirTypeRef
|
||||
lateinit var name: Name
|
||||
lateinit var symbol: FirVariableSymbol<FirEnumEntry>
|
||||
var initializer: FirExpression? = null
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||
lateinit var status: FirDeclarationStatus
|
||||
var containerSource: DeserializedContainerSource? = null
|
||||
|
||||
override fun build(): FirEnumEntry {
|
||||
return FirEnumEntryImpl(
|
||||
source,
|
||||
session,
|
||||
resolvePhase,
|
||||
returnTypeRef,
|
||||
name,
|
||||
symbol,
|
||||
initializer,
|
||||
annotations,
|
||||
typeParameters,
|
||||
status,
|
||||
containerSource,
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@UseExperimental(ExperimentalContracts::class)
|
||||
inline fun buildEnumEntry(init: FirEnumEntryBuilder.() -> Unit): FirEnumEntry {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
return FirEnumEntryBuilder().apply(init).build()
|
||||
}
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* 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.declarations.builder
|
||||
|
||||
import kotlin.contracts.*
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirErrorFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirErrorFunctionImpl
|
||||
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReference
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirErrorFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
|
||||
/*
|
||||
* This file was generated automatically
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
@FirBuilderDsl
|
||||
class FirErrorFunctionBuilder : FirAnnotationContainerBuilder {
|
||||
override var source: FirSourceElement? = null
|
||||
lateinit var session: FirSession
|
||||
var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||
val valueParameters: MutableList<FirValueParameter> = mutableListOf()
|
||||
lateinit var diagnostic: FirDiagnostic
|
||||
lateinit var symbol: FirErrorFunctionSymbol
|
||||
|
||||
override fun build(): FirErrorFunction {
|
||||
return FirErrorFunctionImpl(
|
||||
source,
|
||||
session,
|
||||
resolvePhase,
|
||||
annotations,
|
||||
typeParameters,
|
||||
valueParameters,
|
||||
diagnostic,
|
||||
symbol,
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@UseExperimental(ExperimentalContracts::class)
|
||||
inline fun buildErrorFunction(init: FirErrorFunctionBuilder.() -> Unit): FirErrorFunction {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
return FirErrorFunctionBuilder().apply(init).build()
|
||||
}
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* 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.declarations.builder
|
||||
|
||||
import kotlin.contracts.*
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||
import org.jetbrains.kotlin.fir.declarations.FirField
|
||||
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirFieldImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||
|
||||
/*
|
||||
* This file was generated automatically
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
@FirBuilderDsl
|
||||
open class FirFieldBuilder : FirAnnotationContainerBuilder {
|
||||
override var source: FirSourceElement? = null
|
||||
open lateinit var session: FirSession
|
||||
open var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||
open lateinit var returnTypeRef: FirTypeRef
|
||||
open lateinit var name: Name
|
||||
open lateinit var symbol: FirVariableSymbol<FirField>
|
||||
open var isVar: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
open val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||
open lateinit var status: FirDeclarationStatus
|
||||
open var containerSource: DeserializedContainerSource? = null
|
||||
|
||||
override fun build(): FirField {
|
||||
return FirFieldImpl(
|
||||
source,
|
||||
session,
|
||||
resolvePhase,
|
||||
returnTypeRef,
|
||||
name,
|
||||
symbol,
|
||||
isVar,
|
||||
annotations,
|
||||
typeParameters,
|
||||
status,
|
||||
containerSource,
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@UseExperimental(ExperimentalContracts::class)
|
||||
inline fun buildField(init: FirFieldBuilder.() -> Unit): FirField {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
return FirFieldBuilder().apply(init).build()
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* 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.declarations.builder
|
||||
|
||||
import kotlin.contracts.*
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
import org.jetbrains.kotlin.fir.declarations.FirImport
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirFileImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.visitors.*
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
|
||||
/*
|
||||
* This file was generated automatically
|
||||
* DO NOT MODIFY IT MANUALLY
|
||||
*/
|
||||
|
||||
@FirBuilderDsl
|
||||
class FirFileBuilder : FirAnnotationContainerBuilder {
|
||||
override var source: FirSourceElement? = null
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
lateinit var session: FirSession
|
||||
var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||
val imports: MutableList<FirImport> = mutableListOf()
|
||||
val declarations: MutableList<FirDeclaration> = mutableListOf()
|
||||
lateinit var name: String
|
||||
lateinit var packageFqName: FqName
|
||||
|
||||
override fun build(): FirFile {
|
||||
return FirFileImpl(
|
||||
source,
|
||||
annotations,
|
||||
session,
|
||||
resolvePhase,
|
||||
imports,
|
||||
declarations,
|
||||
name,
|
||||
packageFqName,
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@UseExperimental(ExperimentalContracts::class)
|
||||
inline fun buildFile(init: FirFileBuilder.() -> Unit): FirFile {
|
||||
contract {
|
||||
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
return FirFileBuilder().apply(init).build()
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user