[FIR] Implement builders for leaf nodes of FIR tree

This commit is contained in:
Dmitriy Novozhilov
2020-01-31 14:00:12 +03:00
parent b0c1387279
commit d57fa859c8
319 changed files with 11298 additions and 4284 deletions
@@ -16,8 +16,8 @@ import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.references.FirSuperReference 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.FirPropertyFromParameterResolvedNamedReference
import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl
import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.calls.SyntheticPropertySymbol import org.jetbrains.kotlin.fir.resolve.calls.SyntheticPropertySymbol
import org.jetbrains.kotlin.fir.resolve.transformers.IntegerLiteralTypeApproximationTransformer import org.jetbrains.kotlin.fir.resolve.transformers.IntegerLiteralTypeApproximationTransformer
@@ -902,15 +902,15 @@ class Fir2IrVisitor(
if (functionCall !is FirFunctionCallImpl) { if (functionCall !is FirFunctionCallImpl) {
return functionCall 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 val resolvedSymbol = (calleeReference.resolvedSymbol as? FirNamedFunctionSymbol) ?: return functionCall
if (resolvedSymbol.callableId.isInvoke()) { if (resolvedSymbol.callableId.isInvoke()) {
functionCall.calleeReference = functionCall.calleeReference =
FirResolvedNamedReferenceImpl( buildResolvedNamedReference {
source = calleeReference.source, source = calleeReference.source
name = calleeReference.name, name = calleeReference.name
resolvedSymbol = resolvedSymbol.overriddenSymbol!! this.resolvedSymbol = resolvedSymbol.overriddenSymbol!!
) }
} }
return functionCall return functionCall
} }
@@ -15,21 +15,19 @@ import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.addDefaultBoundIfNecessary 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.declarations.visibility import org.jetbrains.kotlin.fir.java.declarations.*
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider
import org.jetbrains.kotlin.fir.java.declarations.FirJavaConstructor import org.jetbrains.kotlin.fir.resolve.constructType
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.resolve.scopes.wrapScopeWithJvmMapped import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped
import org.jetbrains.kotlin.fir.scopes.FirScope 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.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.ConeNullability 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.ConeTypeParameterTypeImpl
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
import org.jetbrains.kotlin.load.java.JavaClassFinder import org.jetbrains.kotlin.load.java.JavaClassFinder
import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.java.JvmAnnotationNames
import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.JavaClass
@@ -45,7 +43,7 @@ import org.jetbrains.kotlin.types.Variance.INVARIANT
class JavaSymbolProvider( class JavaSymbolProvider(
val session: FirSession, val session: FirSession,
val project: Project, val project: Project,
private val searchScope: GlobalSearchScope private val searchScope: GlobalSearchScope,
) : AbstractFirSymbolProvider<FirRegularClassSymbol>() { ) : AbstractFirSymbolProvider<FirRegularClassSymbol>() {
private val scopeProvider = JavaScopeProvider(::wrapScopeWithJvmMapped, this) private val scopeProvider = JavaScopeProvider(::wrapScopeWithJvmMapped, this)
@@ -54,7 +52,7 @@ class JavaSymbolProvider(
private fun findClass( private fun findClass(
classId: ClassId, classId: ClassId,
content: KotlinClassFinder.Result.ClassFileContent? content: KotlinClassFinder.Result.ClassFileContent?,
): JavaClass? = facade.findClass(JavaClassFinder.Request(classId, previouslyFoundClassFileContent = content?.content), searchScope) ): JavaClass? = facade.findClass(JavaClassFinder.Request(classId, previouslyFoundClassFileContent = content?.content), searchScope)
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<FirCallableSymbol<*>> = override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<FirCallableSymbol<*>> =
@@ -67,34 +65,31 @@ class JavaSymbolProvider(
lazyNestedClassifierScope( lazyNestedClassifierScope(
classId, classId,
existingNames = regularClass.existingNestedClassifierNames, existingNames = regularClass.existingNestedClassifierNames,
symbolProvider = this symbolProvider = this,
) )
} else { } else {
nestedClassifierScope(regularClass) nestedClassifierScope(regularClass)
} }
} }
private fun JavaTypeParameter.toFirTypeParameter(javaTypeParameterStack: JavaTypeParameterStack): FirTypeParameter { private fun JavaTypeParameter.toFirTypeParameter(javaTypeParameterStack: JavaTypeParameterStack): FirTypeParameterBuilder {
val stored = javaTypeParameterStack.safeGet(this) javaTypeParameterStack.getBuilder(this)?.let { return it }
if (stored != null) return stored.fir
val firSymbol = FirTypeParameterSymbol() val firSymbol = FirTypeParameterSymbol()
val result = FirTypeParameterImpl( return FirTypeParameterBuilder().apply {
null, session = this@JavaSymbolProvider.session
session, name = this@toFirTypeParameter.name
name, symbol = firSymbol
firSymbol, variance = INVARIANT
variance = INVARIANT,
isReified = false isReified = false
) }.also {
javaTypeParameterStack.add(this, result) javaTypeParameterStack.add(this, it)
return result }
} }
private fun FirTypeParameter.addBounds( private fun FirTypeParameterBuilder.addBounds(
javaTypeParameter: JavaTypeParameter, javaTypeParameter: JavaTypeParameter,
stack: JavaTypeParameterStack stack: JavaTypeParameterStack,
) { ) {
require(this is FirTypeParameterImpl)
for (upperBound in javaTypeParameter.upperBounds) { for (upperBound in javaTypeParameter.upperBounds) {
bounds += upperBound.toFirResolvedTypeRef(this@JavaSymbolProvider.session, stack, nullability = ConeNullability.NULLABLE) 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> { private fun List<JavaTypeParameter>.convertTypeParameters(stack: JavaTypeParameterStack): List<FirTypeParameter> {
return this return this
.map { it.toFirTypeParameter(stack) } .map { it.toFirTypeParameter(stack) }
.also { .mapIndexed { index, typeParameterBuilder ->
it.forEachIndexed { index, typeParameter -> if (typeParameterBuilder.bounds.isEmpty()) {
if (typeParameter.bounds.isEmpty()) { typeParameterBuilder.addBounds(this[index], stack)
typeParameter.addBounds(this[index], stack)
}
} }
typeParameterBuilder.build()
} }
} }
@@ -123,14 +117,17 @@ class JavaSymbolProvider(
fun getFirJavaClass(classId: ClassId, content: KotlinClassFinder.Result.ClassFileContent? = null): FirRegularClassSymbol? { fun getFirJavaClass(classId: ClassId, content: KotlinClassFinder.Result.ClassFileContent? = null): FirRegularClassSymbol? {
if (!hasTopLevelClassOf(classId)) return null if (!hasTopLevelClassOf(classId)) return null
return classCache.lookupCacheOrCalculateWithPostCompute(classId, { return classCache.lookupCacheOrCalculateWithPostCompute(
val foundClass = findClass(classId, content) classId,
if (foundClass == null || foundClass.annotations.any { it.classId?.asSingleFqName() == JvmAnnotationNames.METADATA_FQ_NAME }) { {
null to null val foundClass = findClass(classId, content)
} else { if (foundClass == null || foundClass.annotations.any { it.classId?.asSingleFqName() == JvmAnnotationNames.METADATA_FQ_NAME }) {
FirRegularClassSymbol(classId) to foundClass null to null
} } else {
}) { firSymbol, foundClass -> FirRegularClassSymbol(classId) to foundClass
}
},
) { firSymbol, foundClass ->
foundClass?.let { javaClass -> foundClass?.let { javaClass ->
val javaTypeParameterStack = JavaTypeParameterStack() val javaTypeParameterStack = JavaTypeParameterStack()
val parentFqName = classId.relativeClassName.parent() val parentFqName = classId.relativeClassName.parent()
@@ -143,17 +140,20 @@ class JavaSymbolProvider(
javaTypeParameterStack.addStack(parentClass.javaTypeParameterStack) javaTypeParameterStack.addStack(parentClass.javaTypeParameterStack)
} }
} }
FirJavaClass( buildJavaClass {
(javaClass as? JavaElementImpl<*>)?.psi?.toFirSourceElement(), session, source = (javaClass as? JavaElementImpl<*>)?.psi?.toFirSourceElement()
firSymbol, javaClass.name, session = this@JavaSymbolProvider.session
javaClass.visibility, javaClass.modality, symbol = firSymbol
javaClass.classKind, isTopLevel = isTopLevel, name = javaClass.name
isStatic = javaClass.isStatic, visibility = javaClass.visibility
javaTypeParameterStack = javaTypeParameterStack, modality = javaClass.modality
existingNestedClassifierNames = javaClass.innerClassNames.toList(), classKind = javaClass.classKind
scopeProvider = scopeProvider this.isTopLevel = isTopLevel
).apply { isStatic = javaClass.isStatic
this.typeParameters += foundClass.typeParameters.convertTypeParameters(javaTypeParameterStack) this.javaTypeParameterStack = javaTypeParameterStack
existingNestedClassifierNames += javaClass.innerClassNames
scopeProvider = this@JavaSymbolProvider.scopeProvider
typeParameters += foundClass.typeParameters.convertTypeParameters(javaTypeParameterStack)
addAnnotationsFrom(this@JavaSymbolProvider.session, javaClass, javaTypeParameterStack) addAnnotationsFrom(this@JavaSymbolProvider.session, javaClass, javaTypeParameterStack)
for (supertype in javaClass.supertypes) { for (supertype in javaClass.supertypes) {
superTypeRefs += supertype.toFirResolvedTypeRef( superTypeRefs += supertype.toFirResolvedTypeRef(
@@ -167,14 +167,16 @@ class JavaSymbolProvider(
val fieldId = CallableId(classId.packageFqName, classId.relativeClassName, fieldName) val fieldId = CallableId(classId.packageFqName, classId.relativeClassName, fieldName)
val fieldSymbol = FirFieldSymbol(fieldId) val fieldSymbol = FirFieldSymbol(fieldId)
val returnType = javaField.type val returnType = javaField.type
val firJavaField = FirJavaField( val firJavaField = buildJavaField {
(javaField as? JavaElementImpl<*>)?.psi?.toFirSourceElement(), this@JavaSymbolProvider.session, source = (javaField as? JavaElementImpl<*>)?.psi?.toFirSourceElement()
fieldSymbol, fieldName, session = this@JavaSymbolProvider.session
javaField.visibility, javaField.modality, symbol = fieldSymbol
returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack), name = fieldName
isVar = !javaField.isFinal, visibility = javaField.visibility
modality = javaField.modality
returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack)
isVar = !javaField.isFinal
isStatic = javaField.isStatic isStatic = javaField.isStatic
).apply {
addAnnotationsFrom(this@JavaSymbolProvider.session, javaField, javaTypeParameterStack) addAnnotationsFrom(this@JavaSymbolProvider.session, javaField, javaTypeParameterStack)
} }
declarations += firJavaField declarations += firJavaField
@@ -184,18 +186,20 @@ class JavaSymbolProvider(
val methodId = CallableId(classId.packageFqName, classId.relativeClassName, methodName) val methodId = CallableId(classId.packageFqName, classId.relativeClassName, methodName)
val methodSymbol = FirNamedFunctionSymbol(methodId) val methodSymbol = FirNamedFunctionSymbol(methodId)
val returnType = javaMethod.returnType val returnType = javaMethod.returnType
val firJavaMethod = FirJavaMethod( val firJavaMethod = buildJavaMethod {
this@JavaSymbolProvider.session, (javaMethod as? JavaElementImpl<*>)?.psi?.toFirSourceElement(), session = this@JavaSymbolProvider.session
methodSymbol, methodName, source = (javaMethod as? JavaElementImpl<*>)?.psi?.toFirSourceElement()
javaMethod.visibility, javaMethod.modality, symbol = methodSymbol
returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack), name = methodName
visibility = javaMethod.visibility
modality = javaMethod.modality
returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack)
isStatic = javaMethod.isStatic isStatic = javaMethod.isStatic
).apply { typeParameters += javaMethod.typeParameters.convertTypeParameters(javaTypeParameterStack)
this.typeParameters += javaMethod.typeParameters.convertTypeParameters(javaTypeParameterStack)
addAnnotationsFrom(this@JavaSymbolProvider.session, javaMethod, javaTypeParameterStack) addAnnotationsFrom(this@JavaSymbolProvider.session, javaMethod, javaTypeParameterStack)
for ((index, valueParameter) in javaMethod.valueParameters.withIndex()) { for ((index, valueParameter) in javaMethod.valueParameters.withIndex()) {
valueParameters += valueParameter.toFirValueParameter( valueParameters += valueParameter.toFirValueParameter(
this@JavaSymbolProvider.session, index, javaTypeParameterStack this@JavaSymbolProvider.session, index, javaTypeParameterStack,
) )
} }
} }
@@ -204,56 +208,53 @@ class JavaSymbolProvider(
val javaClassDeclaredConstructors = javaClass.constructors val javaClassDeclaredConstructors = javaClass.constructors
val constructorId = CallableId(classId.packageFqName, classId.relativeClassName, classId.shortClassName) val constructorId = CallableId(classId.packageFqName, classId.relativeClassName, classId.shortClassName)
fun addJavaConstructor( fun prepareJavaConstructor(
visibility: Visibility = this.visibility, visibility: Visibility = this.visibility,
psi: PsiElement? = null, psi: PsiElement? = null,
isPrimary: Boolean = false isPrimary: Boolean = false,
): FirJavaConstructor { ): FirJavaConstructorBuilder {
val constructorSymbol = FirConstructorSymbol(constructorId) val constructorSymbol = FirConstructorSymbol(constructorId)
val classTypeParameters = javaClass.typeParameters.convertTypeParameters(javaTypeParameterStack) val classTypeParameters = javaClass.typeParameters.convertTypeParameters(javaTypeParameterStack)
val firJavaConstructor = FirJavaConstructor( val firJavaConstructor = FirJavaConstructorBuilder().apply {
psi?.toFirSourceElement(), source = psi?.toFirSourceElement()
this@JavaSymbolProvider.session, session = this@JavaSymbolProvider.session
constructorSymbol, symbol = constructorSymbol
visibility, this.visibility = visibility
isPrimary, this.isPrimary = isPrimary
isInner = !javaClass.isStatic, isInner = !javaClass.isStatic
returnTypeRef = FirResolvedTypeRefImpl( returnTypeRef = buildResolvedTypeRef {
null, type = firSymbol.constructType(
firSymbol.constructType(
classTypeParameters.map { ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false) }.toTypedArray(), classTypeParameters.map { ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false) }.toTypedArray(),
false false,
) )
) }
).apply { typeParameters += classTypeParameters
this.typeParameters += classTypeParameters
} }
declarations += firJavaConstructor
return firJavaConstructor return firJavaConstructor
} }
if (javaClassDeclaredConstructors.isEmpty() && javaClass.classKind == ClassKind.CLASS) { if (javaClassDeclaredConstructors.isEmpty() && javaClass.classKind == ClassKind.CLASS) {
addJavaConstructor(isPrimary = true) declarations += prepareJavaConstructor(isPrimary = true).build()
} }
for (javaConstructor in javaClassDeclaredConstructors) { for (javaConstructor in javaClassDeclaredConstructors) {
addJavaConstructor( declarations += prepareJavaConstructor(
visibility = javaConstructor.visibility, psi = (javaConstructor as? JavaElementImpl<*>)?.psi visibility = javaConstructor.visibility, psi = (javaConstructor as? JavaElementImpl<*>)?.psi,
).apply { ).apply {
this.typeParameters += javaConstructor.typeParameters.convertTypeParameters(javaTypeParameterStack) this.typeParameters += javaConstructor.typeParameters.convertTypeParameters(javaTypeParameterStack)
addAnnotationsFrom(this@JavaSymbolProvider.session, javaConstructor, javaTypeParameterStack) addAnnotationsFrom(this@JavaSymbolProvider.session, javaConstructor, javaTypeParameterStack)
for ((index, valueParameter) in javaConstructor.valueParameters.withIndex()) { for ((index, valueParameter) in javaConstructor.valueParameters.withIndex()) {
valueParameters += valueParameter.toFirValueParameter( valueParameters += valueParameter.toFirValueParameter(
this@JavaSymbolProvider.session, index, javaTypeParameterStack this@JavaSymbolProvider.session, index, javaTypeParameterStack,
) )
} }
} }.build()
} }
if (classKind == ClassKind.ENUM_CLASS) { if (classKind == ClassKind.ENUM_CLASS) {
generateValuesFunction(session, classId.packageFqName, classId.relativeClassName) generateValuesFunction(session, classId.packageFqName, classId.relativeClassName)
generateValueOfFunction(session, classId.packageFqName, classId.relativeClassName) generateValueOfFunction(session, classId.packageFqName, classId.relativeClassName)
} }
calculateSAM() isNotSam = isNotSam()
} }
} }
} }
@@ -5,16 +5,16 @@
package org.jetbrains.kotlin.fir.java 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.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.load.java.structure.JavaTypeParameter import org.jetbrains.kotlin.load.java.structure.JavaTypeParameter
internal class JavaTypeParameterStack { internal class JavaTypeParameterStack {
private val typeParameterMap = mutableMapOf<JavaTypeParameter, FirTypeParameterSymbol>() private val typeParameterMap = mutableMapOf<JavaTypeParameter, FirTypeParameterBuilder>()
fun add(javaTypeParameter: JavaTypeParameter, firTypeParameter: FirTypeParameter) { fun add(javaTypeParameter: JavaTypeParameter, firTypeParameterBuilder: FirTypeParameterBuilder) {
typeParameterMap[javaTypeParameter] = firTypeParameter.symbol typeParameterMap[javaTypeParameter] = firTypeParameterBuilder
} }
fun addStack(javaTypeParameterStack: JavaTypeParameterStack) { fun addStack(javaTypeParameterStack: JavaTypeParameterStack) {
@@ -30,7 +30,9 @@ internal class JavaTypeParameterStack {
?: throw IllegalArgumentException("Cannot find Java type parameter $javaTypeParameter in stack") ?: 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 { companion object {
val EMPTY: JavaTypeParameterStack = JavaTypeParameterStack() 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.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.FirSession 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.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirArrayOfCall 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.FirExpression
import org.jetbrains.kotlin.fir.expressions.impl.* import org.jetbrains.kotlin.fir.expressions.builder.*
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.java.declarations.buildJavaValueParameter
import org.jetbrains.kotlin.fir.java.declarations.FirJavaValueParameter
import org.jetbrains.kotlin.fir.java.enhancement.readOnlyToMutable import org.jetbrains.kotlin.fir.java.enhancement.readOnlyToMutable
import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
import org.jetbrains.kotlin.fir.resolve.constructClassType import org.jetbrains.kotlin.fir.resolve.constructClassType
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
import org.jetbrains.kotlin.fir.resolve.getClassDeclaredCallableSymbols 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.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.toFirSourceElement import org.jetbrains.kotlin.fir.toFirSourceElement
import org.jetbrains.kotlin.fir.types.* 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.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl 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.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.*
import org.jetbrains.kotlin.load.java.structure.impl.JavaElementImpl import org.jetbrains.kotlin.load.java.structure.impl.JavaElementImpl
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
@@ -84,10 +86,10 @@ internal fun JavaType?.toNotNullConeKotlinType(
internal fun JavaType.toFirJavaTypeRef(session: FirSession, javaTypeParameterStack: JavaTypeParameterStack): FirJavaTypeRef { internal fun JavaType.toFirJavaTypeRef(session: FirSession, javaTypeParameterStack: JavaTypeParameterStack): FirJavaTypeRef {
val annotations = (this as? JavaClassifierType)?.annotations.orEmpty() val annotations = (this as? JavaClassifierType)?.annotations.orEmpty()
return FirJavaTypeRef( return buildJavaTypeRef {
annotations = annotations.map { it.toFirAnnotationCall(session, javaTypeParameterStack) }, annotations.mapTo(this.annotations) { it.toFirAnnotationCall(session, javaTypeParameterStack) }
type = this type = this@toFirJavaTypeRef
) }
} }
internal fun JavaClassifierType.toFirResolvedTypeRef( internal fun JavaClassifierType.toFirResolvedTypeRef(
@@ -97,10 +99,9 @@ internal fun JavaClassifierType.toFirResolvedTypeRef(
typeParametersNullability: ConeNullability = ConeNullability.NOT_NULL typeParametersNullability: ConeNullability = ConeNullability.NOT_NULL
): FirResolvedTypeRef { ): FirResolvedTypeRef {
val coneType = this.toConeKotlinTypeWithNullability(session, javaTypeParameterStack, nullability, typeParametersNullability) val coneType = this.toConeKotlinTypeWithNullability(session, javaTypeParameterStack, nullability, typeParametersNullability)
return FirResolvedTypeRefImpl( return buildResolvedTypeRef {
source = null, type = coneType type = coneType
).apply { this@toFirResolvedTypeRef.annotations.mapTo(annotations) { it.toFirAnnotationCall(session, javaTypeParameterStack) }
annotations += this@toFirResolvedTypeRef.annotations.map { it.toFirAnnotationCall(session, javaTypeParameterStack) }
} }
} }
@@ -188,20 +189,18 @@ internal fun JavaClassifierType.toConeKotlinTypeWithNullability(
internal fun JavaAnnotation.toFirAnnotationCall( internal fun JavaAnnotation.toFirAnnotationCall(
session: FirSession, javaTypeParameterStack: JavaTypeParameterStack session: FirSession, javaTypeParameterStack: JavaTypeParameterStack
): FirAnnotationCall { ): FirAnnotationCall {
return FirAnnotationCallImpl( return buildAnnotationCall {
source = null, useSiteTarget = null, annotationTypeRef = buildResolvedTypeRef {
annotationTypeRef = FirResolvedTypeRefImpl(
source = null,
type = ConeClassLikeTypeImpl(FirRegularClassSymbol(classId!!).toLookupTag(), emptyArray(), isNullable = false) type = ConeClassLikeTypeImpl(FirRegularClassSymbol(classId!!).toLookupTag(), emptyArray(), isNullable = false)
) }
).apply {
for (argument in this@toFirAnnotationCall.arguments) { for (argument in this@toFirAnnotationCall.arguments) {
arguments += argument.toFirExpression(session, javaTypeParameterStack) arguments += argument.toFirExpression(session, javaTypeParameterStack)
} }
} }
} }
internal fun FirAbstractAnnotatedElement.addAnnotationsFrom( @FirBuilderDsl
internal fun FirAnnotationContainerBuilder.addAnnotationsFrom(
session: FirSession, javaAnnotationOwner: JavaAnnotationOwner, javaTypeParameterStack: JavaTypeParameterStack session: FirSession, javaAnnotationOwner: JavaAnnotationOwner, javaTypeParameterStack: JavaTypeParameterStack
) { ) {
for (annotation in javaAnnotationOwner.annotations) { for (annotation in javaAnnotationOwner.annotations) {
@@ -212,11 +211,12 @@ internal fun FirAbstractAnnotatedElement.addAnnotationsFrom(
internal fun JavaValueParameter.toFirValueParameter( internal fun JavaValueParameter.toFirValueParameter(
session: FirSession, index: Int, javaTypeParameterStack: JavaTypeParameterStack session: FirSession, index: Int, javaTypeParameterStack: JavaTypeParameterStack
): FirValueParameter { ): FirValueParameter {
return FirJavaValueParameter( return buildJavaValueParameter {
session, (this as? JavaElementImpl<*>)?.psi?.toFirSourceElement(), name ?: Name.identifier("p$index"), source = (this@toFirValueParameter as? JavaElementImpl<*>)?.psi?.toFirSourceElement()
returnTypeRef = type.toFirJavaTypeRef(session, javaTypeParameterStack), this.session = session
isVararg = isVararg name = this@toFirValueParameter.name ?: Name.identifier("p$index")
).apply { returnTypeRef = type.toFirJavaTypeRef(session, javaTypeParameterStack)
isVararg = this@toFirValueParameter.isVararg
addAnnotationsFrom(session, this@toFirValueParameter, javaTypeParameterStack) addAnnotationsFrom(session, this@toFirValueParameter, javaTypeParameterStack)
} }
} }
@@ -257,13 +257,13 @@ private fun JavaAnnotationArgument.toFirExpression(
is JavaLiteralAnnotationArgument -> { is JavaLiteralAnnotationArgument -> {
value.createConstant(session) value.createConstant(session)
} }
is JavaArrayAnnotationArgument -> FirArrayOfCallImpl(null).apply { is JavaArrayAnnotationArgument -> buildArrayOfCall {
for (element in getElements()) { for (element in getElements()) {
arguments += element.toFirExpression(session, javaTypeParameterStack) arguments += element.toFirExpression(session, javaTypeParameterStack)
} }
} }
is JavaEnumValueAnnotationArgument -> { is JavaEnumValueAnnotationArgument -> {
FirFunctionCallImpl(null).apply { buildFunctionCall {
val classId = this@toFirExpression.enumClassId val classId = this@toFirExpression.enumClassId
val entryName = this@toFirExpression.entryName val entryName = this@toFirExpression.entryName
val calleeReference = if (classId != null && entryName != null) { val calleeReference = if (classId != null && entryName != null) {
@@ -271,33 +271,36 @@ private fun JavaAnnotationArgument.toFirExpression(
classId, entryName classId, entryName
).firstOrNull() ).firstOrNull()
callableSymbol?.let { callableSymbol?.let {
FirResolvedNamedReferenceImpl(null, entryName, it) buildResolvedNamedReference {
name = entryName
resolvedSymbol = it
}
} }
} else { } else {
null null
} }
this.calleeReference = calleeReference this.calleeReference = calleeReference
?: FirErrorNamedReferenceImpl( ?: buildErrorNamedReference {
null, FirSimpleDiagnostic("Strange Java enum value: $classId.$entryName", DiagnosticKind.Java) diagnostic = FirSimpleDiagnostic("Strange Java enum value: $classId.$entryName", DiagnosticKind.Java)
) }
} }
} }
is JavaClassObjectAnnotationArgument -> FirGetClassCallImpl(null).apply { is JavaClassObjectAnnotationArgument -> buildGetClassCall {
val referencedType = getReferencedType() val referencedType = getReferencedType()
arguments += FirClassReferenceExpressionImpl( arguments += buildClassReferenceExpression {
null, referencedType.toFirResolvedTypeRef(session, javaTypeParameterStack) classTypeRef = referencedType.toFirResolvedTypeRef(session, javaTypeParameterStack)
) }
} }
is JavaAnnotationAsAnnotationArgument -> getAnnotation().toFirAnnotationCall(session, javaTypeParameterStack) is JavaAnnotationAsAnnotationArgument -> getAnnotation().toFirAnnotationCall(session, javaTypeParameterStack)
else -> FirErrorExpressionImpl( else -> buildErrorExpression {
null, FirSimpleDiagnostic("Unknown JavaAnnotationArgument: ${this::class.java}", DiagnosticKind.Java) diagnostic = FirSimpleDiagnostic("Unknown JavaAnnotationArgument: ${this::class.java}", DiagnosticKind.Java)
) }
} }
} }
// TODO: use kind here // TODO: use kind here
private fun <T> List<T>.createArrayOfCall(session: FirSession, @Suppress("UNUSED_PARAMETER") kind: FirConstKind<T>): FirArrayOfCall { 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) { for (element in this@createArrayOfCall) {
arguments += element.createConstant(session) 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 { internal fun Any?.createConstant(session: FirSession): FirExpression {
return when (this) { return when (this) {
is Byte -> FirConstExpressionImpl(null, FirConstKind.Byte, this) is Byte -> buildConstExpression(null, FirConstKind.Byte, this)
is Short -> FirConstExpressionImpl(null, FirConstKind.Short, this) is Short -> buildConstExpression(null, FirConstKind.Short, this)
is Int -> FirConstExpressionImpl(null, FirConstKind.Int, this) is Int -> buildConstExpression(null, FirConstKind.Int, this)
is Long -> FirConstExpressionImpl(null, FirConstKind.Long, this) is Long -> buildConstExpression(null, FirConstKind.Long, this)
is Char -> FirConstExpressionImpl(null, FirConstKind.Char, this) is Char -> buildConstExpression(null, FirConstKind.Char, this)
is Float -> FirConstExpressionImpl(null, FirConstKind.Float, this) is Float -> buildConstExpression(null, FirConstKind.Float, this)
is Double -> FirConstExpressionImpl(null, FirConstKind.Double, this) is Double -> buildConstExpression(null, FirConstKind.Double, this)
is Boolean -> FirConstExpressionImpl(null, FirConstKind.Boolean, this) is Boolean -> buildConstExpression(null, FirConstKind.Boolean, this)
is String -> FirConstExpressionImpl(null, FirConstKind.String, this) is String -> buildConstExpression(null, FirConstKind.String, this)
is ByteArray -> toList().createArrayOfCall(session, FirConstKind.Byte) is ByteArray -> toList().createArrayOfCall(session, FirConstKind.Byte)
is ShortArray -> toList().createArrayOfCall(session, FirConstKind.Short) is ShortArray -> toList().createArrayOfCall(session, FirConstKind.Short)
is IntArray -> toList().createArrayOfCall(session, FirConstKind.Int) 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 FloatArray -> toList().createArrayOfCall(session, FirConstKind.Float)
is DoubleArray -> toList().createArrayOfCall(session, FirConstKind.Double) is DoubleArray -> toList().createArrayOfCall(session, FirConstKind.Double)
is BooleanArray -> toList().createArrayOfCall(session, FirConstKind.Boolean) is BooleanArray -> toList().createArrayOfCall(session, FirConstKind.Boolean)
null -> FirConstExpressionImpl(null, FirConstKind.Null, null) null -> buildConstExpression(null, FirConstKind.Null, null)
else -> FirErrorExpressionImpl( else -> buildErrorExpression {
null, FirSimpleDiagnostic("Unknown value in JavaLiteralAnnotationArgument: $this", DiagnosticKind.Java) diagnostic = FirSimpleDiagnostic("Unknown value in JavaLiteralAnnotationArgument: $this", DiagnosticKind.Java)
) }
} }
} }
@@ -335,8 +338,8 @@ private fun JavaType.toFirResolvedTypeRef(
session: FirSession, javaTypeParameterStack: JavaTypeParameterStack session: FirSession, javaTypeParameterStack: JavaTypeParameterStack
): FirResolvedTypeRef { ): FirResolvedTypeRef {
if (this is JavaClassifierType) return toFirResolvedTypeRef(session, javaTypeParameterStack) if (this is JavaClassifierType) return toFirResolvedTypeRef(session, javaTypeParameterStack)
return FirResolvedTypeRefImpl( return buildResolvedTypeRef {
source = null, type = ConeClassErrorType("Unexpected JavaType: $this") 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.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.FirPureAbstractElement import org.jetbrains.kotlin.fir.FirPureAbstractElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.builder.AbstractFirRegularClassBuilder
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableClass import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableClass
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall 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.transformInplace
import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.fir.visitors.transformSingle
import org.jetbrains.kotlin.name.Name 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 source: FirSourceElement?,
override val session: FirSession, override val session: FirSession,
override val symbol: FirRegularClassSymbol, override var resolvePhase: FirResolvePhase,
override val name: Name, override val name: Name,
visibility: Visibility, override val annotations: MutableList<FirAnnotationCall>,
modality: Modality?, override var status: FirDeclarationStatus,
override val classKind: ClassKind, override val classKind: ClassKind,
isTopLevel: Boolean, override val declarations: MutableList<FirDeclaration>,
isStatic: Boolean,
override val scopeProvider: FirScopeProvider, override val scopeProvider: FirScopeProvider,
override val symbol: FirRegularClassSymbol,
override val superTypeRefs: MutableList<FirTypeRef>,
override val typeParameters: MutableList<FirTypeParameter>,
internal val javaTypeParameterStack: JavaTypeParameterStack, internal val javaTypeParameterStack: JavaTypeParameterStack,
internal val existingNestedClassifierNames: List<Name> internal val existingNestedClassifierNames: List<Name>
) : FirPureAbstractElement(), FirRegularClass, FirModifiableClass<FirRegularClass> { ) : FirPureAbstractElement(), FirRegularClass, FirModifiableClass<FirRegularClass> {
override var status: FirDeclarationStatusImpl = FirDeclarationStatusImpl(visibility, modality) override val hasLazyNestedClassifiers: Boolean get() = true
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
init { init {
symbol.bind(this) 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? override val companionObject: FirRegularClass?
get() = null get() = null
@@ -94,3 +88,74 @@ class FirJavaClass internal constructor(
return this 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()
}
@@ -7,16 +7,14 @@ package org.jetbrains.kotlin.fir.java.declarations
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.CONSTRUCTOR_NAME import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirPureAbstractElement import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.declarations.* 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.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall 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.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReference import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol 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.FirVisitor
import org.jetbrains.kotlin.fir.visitors.transformInplace import org.jetbrains.kotlin.fir.visitors.transformInplace
import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.fir.visitors.transformSingle
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource 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 source: FirSourceElement?,
override val session: FirSession, override val session: FirSession,
override val symbol: FirConstructorSymbol, override val symbol: FirConstructorSymbol,
visibility: Visibility,
override val isPrimary: Boolean, override val isPrimary: Boolean,
isInner: Boolean, override var returnTypeRef: FirTypeRef,
override var returnTypeRef : FirTypeRef override val valueParameters: MutableList<FirValueParameter>,
) : FirPureAbstractElement(), FirAbstractAnnotatedElement, FirConstructor { 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 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 { init {
symbol.bind(this) symbol.bind(this)
@@ -60,9 +51,7 @@ class FirJavaConstructor(
override val body: FirBlock? override val body: FirBlock?
get() = null 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 { override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirJavaConstructor {
valueParameters.transformInplace(transformer, data) valueParameters.transformInplace(transformer, data)
@@ -116,10 +105,80 @@ class FirJavaConstructor(
returnTypeRef = newReturnTypeRef returnTypeRef = newReturnTypeRef
} }
override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) {}
override fun replaceValueParameters(newValueParameters: List<FirValueParameter>) { override fun replaceValueParameters(newValueParameters: List<FirValueParameter>) {
valueParameters.clear() 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.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement 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.*
import org.jetbrains.kotlin.fir.declarations.builder.FirFieldBuilder
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirExpression 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.FirDelegateFieldSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef 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.fir.visitors.transformSingle
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource 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 source: FirSourceElement?,
override val session: FirSession, override val session: FirSession,
override val symbol: FirFieldSymbol, override val symbol: FirFieldSymbol,
override val name: Name, override val name: Name,
visibility: Visibility, override var resolvePhase: FirResolvePhase,
modality: Modality?,
override var returnTypeRef: FirTypeRef, override var returnTypeRef: FirTypeRef,
override var status: FirDeclarationStatus,
override val isVar: Boolean, override val isVar: Boolean,
isStatic: Boolean override val annotations: MutableList<FirAnnotationCall>,
) : FirAbstractAnnotatedElement, FirField() { override val typeParameters: MutableList<FirTypeParameter>,
) : FirField() {
init { init {
symbol.bind(this) 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 val receiverTypeRef: FirTypeRef? get() = null
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES override val isVal: Boolean get() = !isVar
override val isVal: Boolean = true
override val getter: FirPropertyAccessor? get() = null override val getter: FirPropertyAccessor? get() = null
override val setter: 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 { override fun <D> transformReturnTypeRef(transformer: FirTransformer<D>, data: D): FirField {
returnTypeRef = returnTypeRef.transformSingle(transformer, data) returnTypeRef = returnTypeRef.transformSingle(transformer, data)
@@ -118,3 +117,43 @@ class FirJavaField(
override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) {} 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.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement 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.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl 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.fir.types.jvm.FirJavaTypeRef
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
import kotlin.properties.Delegates
class FirJavaMethod( @UseExperimental(FirImplementationDetail::class)
session: FirSession, class FirJavaMethod @FirImplementationDetail constructor(
source: FirSourceElement?, source: FirSourceElement?,
symbol: FirNamedFunctionSymbol, session: FirSession,
resolvePhase: FirResolvePhase,
returnTypeRef: FirTypeRef,
receiverTypeRef: FirTypeRef?,
typeParameters: MutableList<FirTypeParameter>,
valueParameters: MutableList<FirValueParameter>,
body: FirBlock?,
name: Name, name: Name,
visibility: Visibility, status: FirDeclarationStatus,
modality: Modality?, containerSource: DeserializedContainerSource?,
returnTypeRef: FirJavaTypeRef, symbol: FirFunctionSymbol<FirSimpleFunction>,
isStatic: Boolean annotations: MutableList<FirAnnotationCall>,
) : FirSimpleFunctionImpl( ) : FirSimpleFunctionImpl(
source, source,
session, session,
resolvePhase,
returnTypeRef, returnTypeRef,
null, receiverTypeRef,
FirDeclarationStatusImpl(visibility, modality).apply { typeParameters,
this.isStatic = isStatic valueParameters,
isExpect = false body,
isActual = false status,
isOverride = false containerSource,
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
},
name, name,
symbol symbol,
) { annotations,
init { )
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
@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()
}
@@ -5,32 +5,103 @@
package org.jetbrains.kotlin.fir.java.declarations package org.jetbrains.kotlin.fir.java.declarations
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement 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.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.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.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirJavaValueParameter( @UseExperimental(FirImplementationDetail::class)
session: FirSession, class FirJavaValueParameter @FirImplementationDetail constructor(
source: FirSourceElement?, source: FirSourceElement?,
session: FirSession,
resolvePhase: FirResolvePhase,
returnTypeRef: FirTypeRef,
name: Name, name: Name,
returnTypeRef: FirJavaTypeRef, symbol: FirVariableSymbol<FirValueParameter>,
isVararg: Boolean annotations: MutableList<FirAnnotationCall>,
defaultValue: FirExpression?,
isCrossinline: Boolean,
isNoinline: Boolean,
isVararg: Boolean,
) : FirValueParameterImpl( ) : FirValueParameterImpl(
source, source,
session, session,
resolvePhase,
returnTypeRef, returnTypeRef,
name, name,
FirVariableSymbol(name), symbol,
defaultValue = null, annotations,
isCrossinline = false, defaultValue,
isNoinline = false, isCrossinline,
isVararg = isVararg isNoinline,
) { isVararg,
init { )
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
@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()
}
@@ -9,9 +9,11 @@ import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.fir.FirSession 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.FirSimpleFunctionImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirPropertyImpl
import org.jetbrains.kotlin.fir.deserialization.FirDeserializationContext import org.jetbrains.kotlin.fir.deserialization.FirDeserializationContext
import org.jetbrains.kotlin.fir.deserialization.deserializeClassToSymbol import org.jetbrains.kotlin.fir.deserialization.deserializeClassToSymbol
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind 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.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirClassReferenceExpression import org.jetbrains.kotlin.fir.expressions.FirClassReferenceExpression
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.impl.* import org.jetbrains.kotlin.fir.expressions.builder.*
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
import org.jetbrains.kotlin.fir.java.createConstant import org.jetbrains.kotlin.fir.java.createConstant
import org.jetbrains.kotlin.fir.java.topLevelName import org.jetbrains.kotlin.fir.java.topLevelName
import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
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.*
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef 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.types.impl.FirResolvedTypeRefImpl import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
import org.jetbrains.kotlin.load.java.JavaClassFinder import org.jetbrains.kotlin.load.java.JavaClassFinder
import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.load.kotlin.* import org.jetbrains.kotlin.load.kotlin.*
@@ -61,7 +62,7 @@ class KotlinDeserializedJvmSymbolsProvider(
private val javaSymbolProvider: JavaSymbolProvider, private val javaSymbolProvider: JavaSymbolProvider,
private val kotlinClassFinder: KotlinClassFinder, private val kotlinClassFinder: KotlinClassFinder,
private val javaClassFinder: JavaClassFinder, private val javaClassFinder: JavaClassFinder,
private val kotlinScopeProvider: KotlinScopeProvider private val kotlinScopeProvider: KotlinScopeProvider,
) : AbstractFirSymbolProvider<FirClassLikeSymbol<*>>() { ) : AbstractFirSymbolProvider<FirClassLikeSymbol<*>>() {
private val classesCache = HashMap<ClassId, FirRegularClassSymbol>() private val classesCache = HashMap<ClassId, FirRegularClassSymbol>()
private val typeAliasCache = HashMap<ClassId, FirTypeAliasSymbol?>() private val typeAliasCache = HashMap<ClassId, FirTypeAliasSymbol?>()
@@ -72,7 +73,7 @@ class KotlinDeserializedJvmSymbolsProvider(
private class PackagePartsCacheData( private class PackagePartsCacheData(
val proto: ProtoBuf.Package, val proto: ProtoBuf.Package,
val context: FirDeserializationContext, val context: FirDeserializationContext,
val source: JvmPackagePartSource val source: JvmPackagePartSource,
) { ) {
val topLevelFunctionNameIndex by lazy { val topLevelFunctionNameIndex by lazy {
proto.functionList.withIndex() proto.functionList.withIndex()
@@ -113,16 +114,16 @@ class KotlinDeserializedJvmSymbolsProvider(
val source = JvmPackagePartSource( val source = JvmPackagePartSource(
kotlinJvmBinaryClass, packageProto, nameResolver, kotlinJvmBinaryClass, packageProto, nameResolver,
kotlinJvmBinaryClass.incompatibility, kotlinJvmBinaryClass.isPreReleaseInvisible kotlinJvmBinaryClass.incompatibility, kotlinJvmBinaryClass.isPreReleaseInvisible,
) )
PackagePartsCacheData( PackagePartsCacheData(
packageProto, packageProto,
FirDeserializationContext.createForPackage( FirDeserializationContext.createForPackage(
packageFqName, packageProto, nameResolver, session, packageFqName, packageProto, nameResolver, session,
JvmBinaryAnnotationDeserializer(session) JvmBinaryAnnotationDeserializer(session),
), ),
source source,
) )
} }
} }
@@ -142,7 +143,7 @@ class KotlinDeserializedJvmSymbolsProvider(
} }
private fun findAndDeserializeTypeAlias( private fun findAndDeserializeTypeAlias(
classId: ClassId classId: ClassId,
): FirTypeAliasSymbol? { ): FirTypeAliasSymbol? {
if (!classId.relativeClassName.isOneSegmentFQN()) return null if (!classId.relativeClassName.isOneSegmentFQN()) return null
return typeAliasCache.getOrPutNullable(classId) { return typeAliasCache.getOrPutNullable(classId) {
@@ -164,15 +165,15 @@ class KotlinDeserializedJvmSymbolsProvider(
private fun FirClassifierSymbol<*>?.toDefaultResolvedTypeRef(classId: ClassId): FirResolvedTypeRef { private fun FirClassifierSymbol<*>?.toDefaultResolvedTypeRef(classId: ClassId): FirResolvedTypeRef {
return this?.let { return this?.let {
FirResolvedTypeRefImpl( buildResolvedTypeRef {
null, it.constructType(emptyList(), isNullable = false) type = it.constructType(emptyList(), isNullable = false)
) }
} ?: FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Symbol not found for $classId", DiagnosticKind.Java)) } ?: buildErrorTypeRef { diagnostic = FirSimpleDiagnostic("Symbol not found for $classId", DiagnosticKind.Java) }
} }
private fun loadAnnotation( private fun loadAnnotation(
annotationClassId: ClassId, result: MutableList<FirAnnotationCall> annotationClassId: ClassId, result: MutableList<FirAnnotationCall>,
): KotlinJvmBinaryClass.AnnotationArgumentVisitor? { ): KotlinJvmBinaryClass.AnnotationArgumentVisitor? {
val lookupTag = ConeClassLikeLookupTagImpl(annotationClassId) val lookupTag = ConeClassLikeLookupTagImpl(annotationClassId)
val symbol = lookupTag.toSymbol(session) val symbol = lookupTag.toSymbol(session)
@@ -189,39 +190,39 @@ class KotlinDeserializedJvmSymbolsProvider(
private fun ClassLiteralValue.toFirClassReferenceExpression(): FirClassReferenceExpression { private fun ClassLiteralValue.toFirClassReferenceExpression(): FirClassReferenceExpression {
val literalLookupTag = ConeClassLikeLookupTagImpl(classId) val literalLookupTag = ConeClassLikeLookupTagImpl(classId)
val literalSymbol = literalLookupTag.toSymbol(this@KotlinDeserializedJvmSymbolsProvider.session) val literalSymbol = literalLookupTag.toSymbol(this@KotlinDeserializedJvmSymbolsProvider.session)
return FirClassReferenceExpressionImpl( return buildClassReferenceExpression {
null, classTypeRef = literalSymbol.toDefaultResolvedTypeRef(classId)
literalSymbol.toDefaultResolvedTypeRef(classId) }
)
} }
private fun ClassId.toEnumEntryReferenceExpression(name: Name): FirExpression { private fun ClassId.toEnumEntryReferenceExpression(name: Name): FirExpression {
return FirFunctionCallImpl(null).apply { return buildFunctionCall {
val entryCallableSymbol = val entryCallableSymbol =
this@KotlinDeserializedJvmSymbolsProvider.session.firSymbolProvider.getClassDeclaredCallableSymbols( this@KotlinDeserializedJvmSymbolsProvider.session.firSymbolProvider.getClassDeclaredCallableSymbols(
this@toEnumEntryReferenceExpression, name this@toEnumEntryReferenceExpression, name,
).firstOrNull() ).firstOrNull()
this.calleeReference = when { calleeReference = when {
entryCallableSymbol != null -> { entryCallableSymbol != null -> {
FirResolvedNamedReferenceImpl( buildResolvedNamedReference {
null, name, entryCallableSymbol this.name = name
) resolvedSymbol = entryCallableSymbol
}
} }
else -> { else -> {
FirErrorNamedReferenceImpl( buildErrorNamedReference {
null, diagnostic = FirSimpleDiagnostic(
FirSimpleDiagnostic( "Strange deserialized enum value: ${this@toEnumEntryReferenceExpression}.$name",
"Strange deserialized enum value: ${this@toEnumEntryReferenceExpression}.$name", DiagnosticKind.Java DiagnosticKind.Java,
) )
) }
} }
} }
} }
} }
override fun visitClassLiteral(name: Name, value: ClassLiteralValue) { override fun visitClassLiteral(name: Name, value: ClassLiteralValue) {
argumentMap[name] = FirGetClassCallImpl(null).apply { argumentMap[name] = buildGetClassCall {
arguments += value.toFirClassReferenceExpression() arguments += value.toFirClassReferenceExpression()
} }
} }
@@ -247,7 +248,7 @@ class KotlinDeserializedJvmSymbolsProvider(
} }
override fun visitEnd() { override fun visitEnd() {
argumentMap[name] = FirArrayOfCallImpl(null).apply { argumentMap[name] = buildArrayOfCall {
arguments += elements arguments += elements
} }
} }
@@ -266,11 +267,14 @@ class KotlinDeserializedJvmSymbolsProvider(
} }
override fun visitEnd() { override fun visitEnd() {
result += FirAnnotationCallImpl(null, null, symbol.toDefaultResolvedTypeRef(annotationClassId)).apply { result += buildAnnotationCall {
annotationTypeRef = symbol.toDefaultResolvedTypeRef(annotationClassId)
for ((name, expression) in argumentMap) { for ((name, expression) in argumentMap) {
arguments += FirNamedArgumentExpressionImpl( arguments += buildNamedArgumentExpression {
null, expression, false, name this.expression = expression
) this.name = name
isSpread = false
}
} }
} }
} }
@@ -282,7 +286,7 @@ class KotlinDeserializedJvmSymbolsProvider(
} }
private fun loadAnnotationIfNotSpecial( private fun loadAnnotationIfNotSpecial(
annotationClassId: ClassId, result: MutableList<FirAnnotationCall> annotationClassId: ClassId, result: MutableList<FirAnnotationCall>,
): KotlinJvmBinaryClass.AnnotationArgumentVisitor? { ): KotlinJvmBinaryClass.AnnotationArgumentVisitor? {
if (annotationClassId in AbstractBinaryClassAnnotationAndConstantLoader.SPECIAL_ANNOTATIONS) return null if (annotationClassId in AbstractBinaryClassAnnotationAndConstantLoader.SPECIAL_ANNOTATIONS) return null
return loadAnnotation(annotationClassId, result) return loadAnnotation(annotationClassId, result)
@@ -290,7 +294,7 @@ class KotlinDeserializedJvmSymbolsProvider(
private fun findAndDeserializeClass( private fun findAndDeserializeClass(
classId: ClassId, classId: ClassId,
parentContext: FirDeserializationContext? = null parentContext: FirDeserializationContext? = null,
): FirRegularClassSymbol? { ): FirRegularClassSymbol? {
if (hasNoTopLevelClassOf(classId)) return null if (hasNoTopLevelClassOf(classId)) return null
if (classesCache.containsKey(classId)) return classesCache[classId] if (classesCache.containsKey(classId)) return classesCache[classId]
@@ -326,34 +330,35 @@ class KotlinDeserializedJvmSymbolsProvider(
classId, classProto, symbol, nameResolver, session, classId, classProto, symbol, nameResolver, session,
JvmBinaryAnnotationDeserializer(session), JvmBinaryAnnotationDeserializer(session),
kotlinScopeProvider, kotlinScopeProvider,
parentContext, this::findAndDeserializeClass parentContext, this::findAndDeserializeClass,
) )
classesCache[classId] = symbol classesCache[classId] = symbol
val annotations = mutableListOf<FirAnnotationCall>() val annotations = mutableListOf<FirAnnotationCall>()
kotlinJvmBinaryClass.loadClassAnnotations(object : KotlinJvmBinaryClass.AnnotationVisitor { kotlinJvmBinaryClass.loadClassAnnotations(
override fun visitAnnotation(classId: ClassId, source: SourceElement): KotlinJvmBinaryClass.AnnotationArgumentVisitor? { object : KotlinJvmBinaryClass.AnnotationVisitor {
return loadAnnotationIfNotSpecial(classId, annotations) 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] return classesCache[classId]
// }
} }
private fun loadFunctionsByName(part: PackagePartsCacheData, name: Name): List<FirCallableSymbol<*>> { private fun loadFunctionsByName(part: PackagePartsCacheData, name: Name): List<FirCallableSymbol<*>> {
val functionIds = part.topLevelFunctionNameIndex[name] ?: return emptyList() val functionIds = part.topLevelFunctionNameIndex[name] ?: return emptyList()
return functionIds.map { part.proto.getFunction(it) } return functionIds.map { part.proto.getFunction(it) }
.map { .map {
val firNamedFunction = part.context.memberDeserializer.loadFunction(it) as FirSimpleFunctionImpl val firNamedFunction = part.context.memberDeserializer.loadFunction(it, containerSource = part.source) as FirSimpleFunctionImpl
firNamedFunction.containerSource = part.source
firNamedFunction.symbol firNamedFunction.symbol
} }
} }
@@ -362,8 +367,7 @@ class KotlinDeserializedJvmSymbolsProvider(
val propertyIds = part.topLevelPropertyNameIndex[name] ?: return emptyList() val propertyIds = part.topLevelPropertyNameIndex[name] ?: return emptyList()
return propertyIds.map { part.proto.getProperty(it) } return propertyIds.map { part.proto.getProperty(it) }
.map { .map {
val firProperty = part.context.memberDeserializer.loadProperty(it) as FirPropertyImpl val firProperty = part.context.memberDeserializer.loadProperty(it, containerSource = part.source)
firProperty.containerSource = part.source
firProperty.symbol firProperty.symbol
} }
} }
@@ -11,14 +11,14 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.FirConstExpressionImpl import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirQualifiedAccessExpressionImpl import org.jetbrains.kotlin.fir.expressions.builder.buildQualifiedAccessExpression
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
import org.jetbrains.kotlin.fir.java.declarations.FirJavaField import org.jetbrains.kotlin.fir.java.declarations.FirJavaField
import org.jetbrains.kotlin.fir.java.toConeProjection import org.jetbrains.kotlin.fir.java.toConeProjection
import org.jetbrains.kotlin.fir.java.toNotNullConeKotlinType 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.*
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag 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.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.typeContext import org.jetbrains.kotlin.fir.typeContext
import org.jetbrains.kotlin.fir.types.* 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.fir.types.jvm.FirJavaTypeRef
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.DEFAULT_NULL_FQ_NAME import org.jetbrains.kotlin.load.java.JvmAnnotationNames.DEFAULT_NULL_FQ_NAME
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.DEFAULT_VALUE_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 this.annotations += annotations
} }
} }
@@ -361,19 +362,21 @@ internal fun ConeKotlinType.lexicalCastFrom(session: FirSession, value: String):
val name = Name.identifier(value) val name = Name.identifier(value)
val firEnumEntry = firElement.collectEnumEntries().find { it.name == name } val firEnumEntry = firElement.collectEnumEntries().find { it.name == name }
return if (firEnumEntry != null) FirQualifiedAccessExpressionImpl(null).apply { return if (firEnumEntry != null) buildQualifiedAccessExpression {
calleeReference = FirResolvedNamedReferenceImpl( calleeReference = buildResolvedNamedReference {
null, name, firEnumEntry.symbol this.name = name
) resolvedSymbol = firEnumEntry.symbol
}
} else if (firElement is FirJavaClass) { } else if (firElement is FirJavaClass) {
val firStaticProperty = firElement.declarations.filterIsInstance<FirJavaField>().find { val firStaticProperty = firElement.declarations.filterIsInstance<FirJavaField>().find {
it.isStatic && it.modality == Modality.FINAL && it.name == name it.isStatic && it.modality == Modality.FINAL && it.name == name
} }
if (firStaticProperty != null) { if (firStaticProperty != null) {
FirQualifiedAccessExpressionImpl(null).apply { buildQualifiedAccessExpression {
calleeReference = FirResolvedNamedReferenceImpl( calleeReference = buildResolvedNamedReference {
null, name, firStaticProperty.symbol as FirCallableSymbol<*> this.name = name
) resolvedSymbol = firStaticProperty.symbol as FirCallableSymbol<*>
}
} }
} else null } else null
} else null } else null
@@ -385,15 +388,15 @@ internal fun ConeKotlinType.lexicalCastFrom(session: FirSession, value: String):
val (number, radix) = extractRadix(value) val (number, radix) = extractRadix(value)
return when (classId.relativeClassName.asString()) { return when (classId.relativeClassName.asString()) {
"Boolean" -> FirConstExpressionImpl(null, FirConstKind.Boolean, value.toBoolean()) "Boolean" -> buildConstExpression(null, FirConstKind.Boolean, value.toBoolean())
"Char" -> FirConstExpressionImpl(null, FirConstKind.Char, value.singleOrNull() ?: return null) "Char" -> buildConstExpression(null, FirConstKind.Char, value.singleOrNull() ?: return null)
"Byte" -> FirConstExpressionImpl(null, FirConstKind.Byte, number.toByteOrNull(radix) ?: return null) "Byte" -> buildConstExpression(null, FirConstKind.Byte, number.toByteOrNull(radix) ?: return null)
"Short" -> FirConstExpressionImpl(null, FirConstKind.Short, number.toShortOrNull(radix) ?: return null) "Short" -> buildConstExpression(null, FirConstKind.Short, number.toShortOrNull(radix) ?: return null)
"Int" -> FirConstExpressionImpl(null, FirConstKind.Int, number.toIntOrNull(radix) ?: return null) "Int" -> buildConstExpression(null, FirConstKind.Int, number.toIntOrNull(radix) ?: return null)
"Long" -> FirConstExpressionImpl(null, FirConstKind.Long, number.toLongOrNull(radix) ?: return null) "Long" -> buildConstExpression(null, FirConstKind.Long, number.toLongOrNull(radix) ?: return null)
"Float" -> FirConstExpressionImpl(null, FirConstKind.Float, value.toFloatOrNull() ?: return null) "Float" -> buildConstExpression(null, FirConstKind.Float, value.toFloatOrNull() ?: return null)
"Double" -> FirConstExpressionImpl(null, FirConstKind.Double, value.toDoubleOrNull() ?: return null) "Double" -> buildConstExpression(null, FirConstKind.Double, value.toDoubleOrNull() ?: return null)
"String" -> FirConstExpressionImpl(null, FirConstKind.String, value) "String" -> buildConstExpression(null, FirConstKind.String, value)
else -> null else -> null
} }
} }
@@ -9,14 +9,17 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.FirAnnotationContainer
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* 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.FirConstKind
import org.jetbrains.kotlin.fir.expressions.FirExpression 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.JavaTypeParameterStack
import org.jetbrains.kotlin.fir.java.declarations.* import org.jetbrains.kotlin.fir.java.declarations.*
import org.jetbrains.kotlin.fir.java.enhancement.* 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.render
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.jvm.computeJvmDescriptor 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.symbols.impl.*
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef 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.AnnotationTypeQualifierResolver
import org.jetbrains.kotlin.load.java.descriptors.NullDefaultValue import org.jetbrains.kotlin.load.java.descriptors.NullDefaultValue
import org.jetbrains.kotlin.load.java.descriptors.StringDefaultValue import org.jetbrains.kotlin.load.java.descriptors.StringDefaultValue
@@ -86,20 +90,17 @@ class JavaClassEnhancementScope(
val newReturnTypeRef = enhanceReturnType(firElement, emptyList(), memberContext, null) val newReturnTypeRef = enhanceReturnType(firElement, emptyList(), memberContext, null)
val symbol = FirFieldSymbol(original.callableId) val symbol = FirFieldSymbol(original.callableId)
with(firElement) { buildJavaField {
FirJavaField( source = firElement.source
firElement.source, session = this@JavaClassEnhancementScope.session
this@JavaClassEnhancementScope.session, this.symbol = symbol
symbol, this.name = name
name, visibility = firElement.visibility
visibility, modality = firElement.modality
modality, returnTypeRef = newReturnTypeRef
newReturnTypeRef, isVar = firElement.isVar
isVar, isStatic = firElement.isStatic
isStatic annotations += firElement.annotations
).apply {
annotations += firElement.annotations
}
} }
return symbol return symbol
} }
@@ -173,67 +174,68 @@ class JavaClassEnhancementScope(
val newValueParameters = firMethod.valueParameters.zip(newValueParameterInfo) { valueParameter, newInfo -> val newValueParameters = firMethod.valueParameters.zip(newValueParameterInfo) { valueParameter, newInfo ->
val (newTypeRef, newDefaultValue) = newInfo val (newTypeRef, newDefaultValue) = newInfo
with(valueParameter) { buildValueParameter {
FirValueParameterImpl( source = valueParameter.source
source, this@JavaClassEnhancementScope.session, session = this@JavaClassEnhancementScope.session
newTypeRef, this.name, returnTypeRef = newTypeRef
FirVariableSymbol(this.name), this.name = valueParameter.name
defaultValue ?: newDefaultValue, isCrossinline, isNoinline, isVararg symbol = FirVariableSymbol(this.name)
).apply { defaultValue = valueParameter.defaultValue ?: newDefaultValue
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES isCrossinline = valueParameter.isCrossinline
annotations += valueParameter.annotations isNoinline = valueParameter.isNoinline
} isVararg = valueParameter.isVararg
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
annotations += valueParameter.annotations
} }
} }
val function = when (firMethod) { val function = when (firMethod) {
is FirJavaConstructor -> { is FirJavaConstructor -> {
val symbol = FirConstructorSymbol(methodId) val symbol = FirConstructorSymbol(methodId)
val status = FirDeclarationStatusImpl(firMethod.visibility, Modality.FINAL).apply {
isExpect = false
isActual = false
isInner = firMethod.isInner
}
if (firMethod.isPrimary) { if (firMethod.isPrimary) {
FirPrimaryConstructorImpl( FirPrimaryConstructorBuilder().apply {
firMethod.source, source = firMethod.source
this@JavaClassEnhancementScope.session, session = this@JavaClassEnhancementScope.session
newReturnTypeRef, returnTypeRef = newReturnTypeRef
null, status = FirDeclarationStatusImpl(firMethod.visibility, Modality.FINAL).apply {
status, isExpect = false
symbol isActual = false
) isInner = firMethod.isInner
}
this.symbol = symbol
}
} else { } else {
FirConstructorImpl( FirConstructorBuilder().apply {
firMethod.source, source = firMethod.source
this@JavaClassEnhancementScope.session, session = this@JavaClassEnhancementScope.session
newReturnTypeRef, returnTypeRef = newReturnTypeRef
newReceiverTypeRef, status = firMethod.status
firMethod.status, this.symbol = symbol
symbol }
)
}.apply { }.apply {
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
this.valueParameters += newValueParameters this.valueParameters += newValueParameters
this.typeParameters += firMethod.typeParameters this.typeParameters += firMethod.typeParameters
} }
} }
is FirJavaMethod -> FirSimpleFunctionImpl( is FirJavaMethod -> {
firMethod.source, FirSimpleFunctionBuilder().apply {
this@JavaClassEnhancementScope.session, source = firMethod.source
newReturnTypeRef, session = this@JavaClassEnhancementScope.session
newReceiverTypeRef, returnTypeRef = newReturnTypeRef
firMethod.status, receiverTypeRef = newReceiverTypeRef
name, this.name = name
if (!isAccessor) FirNamedFunctionSymbol(methodId) status = firMethod.status
else FirAccessorSymbol(callableId = propertyId!!, accessorId = methodId) symbol = if (!isAccessor) FirNamedFunctionSymbol(methodId)
).apply { else FirAccessorSymbol(callableId = propertyId!!, accessorId = methodId)
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
this.valueParameters += newValueParameters valueParameters += newValueParameters
this.typeParameters += firMethod.typeParameters typeParameters += firMethod.typeParameters
}
} }
else -> throw AssertionError("Unknown Java method to enhance: ${firMethod.render()}") else -> throw AssertionError("Unknown Java method to enhance: ${firMethod.render()}")
} }.apply {
function.annotations += firMethod.annotations annotations += firMethod.annotations
}.build()
return function.symbol return function.symbol
} }
@@ -275,7 +277,7 @@ class JavaClassEnhancementScope(
).enhance(session, jsr305State, predefinedEnhancementInfo?.parametersInfo?.getOrNull(index)) ).enhance(session, jsr305State, predefinedEnhancementInfo?.parametersInfo?.getOrNull(index))
val firResolvedTypeRef = signatureParts.type val firResolvedTypeRef = signatureParts.type
val defaultValueExpression = when (val defaultValue = ownerParameter.getDefaultValueFromAnnotation()) { 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) is StringDefaultValue -> firResolvedTypeRef.type.lexicalCastFrom(session, defaultValue.value)
null -> null null -> null
} }
@@ -7,13 +7,11 @@ package org.jetbrains.kotlin.fir.java.scopes
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl import org.jetbrains.kotlin.fir.declarations.builder.FirValueParameterBuilder
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass import org.jetbrains.kotlin.fir.java.declarations.*
import org.jetbrains.kotlin.fir.java.declarations.FirJavaMethod
import org.jetbrains.kotlin.fir.java.declarations.FirJavaValueParameter
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertiesScope import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertiesScope
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.AbstractFirUseSiteMemberScope 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) if (firSimpleFunction !is FirJavaMethod) return super.createFunctionCopy(firSimpleFunction, newSymbol)
return FirJavaMethod( return FirJavaMethodBuilder().apply {
firSimpleFunction.session, session = firSimpleFunction.session
firSimpleFunction.source, source = firSimpleFunction.source
newSymbol, symbol = newSymbol
firSimpleFunction.name, name = firSimpleFunction.name
firSimpleFunction.visibility, visibility = firSimpleFunction.visibility
firSimpleFunction.modality, modality = firSimpleFunction.modality
firSimpleFunction.returnTypeRef as FirJavaTypeRef, returnTypeRef = firSimpleFunction.returnTypeRef
firSimpleFunction.status.isStatic 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) if (parameter !is FirJavaValueParameter) return super.createValueParameterCopy(parameter, newDefaultValue)
return FirJavaValueParameter( return FirJavaValueParameterBuilder().apply {
parameter.session, session = parameter.session
parameter.source, source = parameter.source
parameter.name, name = parameter.name
parameter.returnTypeRef as FirJavaTypeRef, returnTypeRef = parameter.returnTypeRef as FirJavaTypeRef
parameter.isVararg isVararg = parameter.isVararg
) }
} }
override fun processPropertiesByName(name: Name, processor: (FirCallableSymbol<*>) -> Unit) { override fun processPropertiesByName(name: Name, processor: (FirCallableSymbol<*>) -> Unit) {
@@ -67,6 +67,8 @@ class LightTree2Fir(
val lightTree = buildLightTree(code) val lightTree = buildLightTree(code)
return DeclarationsConverter(session, scopeProvider, stubMode, lightTree) return DeclarationsConverter(session, scopeProvider, stubMode, lightTree)
.convertFile(lightTree.root, fileName) .convertFile(lightTree.root, fileName).also {
it
}
} }
} }
@@ -10,22 +10,30 @@ import com.intellij.openapi.util.Ref
import com.intellij.psi.tree.IElementType import com.intellij.psi.tree.IElementType
import com.intellij.util.diff.FlyweightCapableTreeStructure import com.intellij.util.diff.FlyweightCapableTreeStructure
import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.KtNodeTypes
import org.jetbrains.kotlin.fir.FirLightSourceElement
import org.jetbrains.kotlin.fir.FirSession 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.BaseFirBuilder
import org.jetbrains.kotlin.fir.builder.Context import org.jetbrains.kotlin.fir.builder.Context
import org.jetbrains.kotlin.fir.builder.escapedStringToCharacter 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.KtToken
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
open class BaseConverter( open class BaseConverter(
session: FirSession, baseSession: FirSession,
private val tree: FlyweightCapableTreeStructure<LighterASTNode>, private val tree: FlyweightCapableTreeStructure<LighterASTNode>,
context: Context = Context() context: Context<LighterASTNode> = Context()
) : BaseFirBuilder<LighterASTNode>(session, context) { ) : BaseFirBuilder<LighterASTNode>(baseSession, context) {
protected val implicitType = FirImplicitTypeRefImpl(null) protected val implicitType = buildImplicitTypeRef()
override fun LighterASTNode.toFirSourceElement(): FirSourceElement {
return FirLightSourceElement(this)
}
override val LighterASTNode.elementType: IElementType override val LighterASTNode.elementType: IElementType
get() = this.tokenType get() = this.tokenType
@@ -98,6 +106,7 @@ open class BaseConverter(
return kidsRef.get() return kidsRef.get()
} }
@UseExperimental(ExperimentalContracts::class)
protected inline fun LighterASTNode.forEachChildren(vararg skipTokens: KtToken, f: (LighterASTNode) -> Unit) { protected inline fun LighterASTNode.forEachChildren(vararg skipTokens: KtToken, f: (LighterASTNode) -> Unit) {
val kidsArray = this.getChildrenAsArray() val kidsArray = this.getChildrenAsArray()
for (kid in kidsArray) { for (kid in kidsArray) {
@@ -14,22 +14,18 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.builder.generateResolvedAccessExpression 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.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.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.FirExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirBlockImpl import org.jetbrains.kotlin.fir.expressions.builder.FirAnnotationCallBuilder
import org.jetbrains.kotlin.fir.expressions.impl.FirCallWithArgumentList import org.jetbrains.kotlin.fir.expressions.builder.FirCallBuilder
import org.jetbrains.kotlin.fir.expressions.impl.FirComponentCallImpl 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.DestructuringDeclaration
import org.jetbrains.kotlin.fir.lightTree.fir.TypeConstraint 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.FirPropertySymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.lexer.KtSingleValueToken import org.jetbrains.kotlin.lexer.KtSingleValueToken
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -77,22 +73,8 @@ fun LighterASTNode.isExpression(): Boolean {
} }
} }
fun FirTypeParametersOwner.joinTypeParameters(typeConstraints: List<TypeConstraint>) { fun <T : FirCallBuilder> T.extractArgumentsFrom(container: List<FirExpression>, stubMode: Boolean): T {
typeConstraints.forEach { typeConstraint -> if (!stubMode || this is FirAnnotationCallBuilder) {
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) {
this.arguments += container this.arguments += container
} }
return this return this
@@ -125,27 +107,25 @@ fun generateDestructuringBlock(
container: FirVariable<*>, container: FirVariable<*>,
tmpVariable: Boolean tmpVariable: Boolean
): FirExpression { ): FirExpression {
return FirBlockImpl(null).apply { return buildBlock {
if (tmpVariable) { if (tmpVariable) {
statements += container statements += container
} }
val isVar = multiDeclaration.isVar val isVar = multiDeclaration.isVar
for ((index, entry) in multiDeclaration.entries.withIndex()) { for ((index, entry) in multiDeclaration.entries.withIndex()) {
statements += FirPropertyImpl( statements += buildProperty {
null, this.session = session
session, returnTypeRef = entry.returnTypeRef
entry.returnTypeRef, name = entry.name
null, initializer = buildComponentCall {
entry.name, explicitReceiver = generateResolvedAccessExpression(null, container)
FirComponentCallImpl(null, generateResolvedAccessExpression(null, container), index + 1), componentIndex = index + 1
null, }
isVar, this.isVar = isVar
FirPropertySymbol(entry.name), // TODO? symbol = FirPropertySymbol(entry.name) // TODO?
true, isLocal = true
FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL) status = FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL)
).apply {
annotations += entry.annotations annotations += entry.annotations
symbol.bind(this)
} }
} }
} }
@@ -11,40 +11,36 @@ import com.intellij.util.diff.FlyweightCapableTreeStructure
import org.jetbrains.kotlin.KtNodeTypes.* import org.jetbrains.kotlin.KtNodeTypes.*
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirWhenSubject
import org.jetbrains.kotlin.fir.builder.* import org.jetbrains.kotlin.fir.builder.*
import org.jetbrains.kotlin.fir.declarations.FirVariable 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.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.DiagnosticKind
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.* 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.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.expressions.impl.FirModifiableQualifiedAccess
import org.jetbrains.kotlin.fir.impl.FirLabelImpl 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.LightTree2Fir
import org.jetbrains.kotlin.fir.lightTree.fir.ValueParameter import org.jetbrains.kotlin.fir.lightTree.fir.ValueParameter
import org.jetbrains.kotlin.fir.lightTree.fir.WhenEntry import org.jetbrains.kotlin.fir.lightTree.fir.WhenEntry
import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
import org.jetbrains.kotlin.fir.references.impl.FirExplicitSuperReference import org.jetbrains.kotlin.fir.references.builder.buildExplicitSuperReference
import org.jetbrains.kotlin.fir.references.impl.FirExplicitThisReference import org.jetbrains.kotlin.fir.references.builder.buildExplicitThisReference
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference import org.jetbrains.kotlin.fir.references.builder.buildSimpleNamedReference
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef 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.lexer.KtTokens.*
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.psi.stubs.elements.KtConstantExpressionElementType import org.jetbrains.kotlin.psi.stubs.elements.KtConstantExpressionElementType
import org.jetbrains.kotlin.types.expressions.OperatorConventions import org.jetbrains.kotlin.types.expressions.OperatorConventions
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
@@ -54,11 +50,11 @@ class ExpressionsConverter(
private val stubMode: Boolean, private val stubMode: Boolean,
tree: FlyweightCapableTreeStructure<LighterASTNode>, tree: FlyweightCapableTreeStructure<LighterASTNode>,
private val declarationsConverter: DeclarationsConverter, private val declarationsConverter: DeclarationsConverter,
context: Context = Context() context: Context<LighterASTNode> = Context()
) : BaseConverter(session, tree, context) { ) : BaseConverter(session, tree, context) {
inline fun <reified R : FirElement> getAsFirExpression(expression: LighterASTNode?, errorReason: String = ""): R { 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 *****/ /***** EXPRESSIONS *****/
@@ -67,7 +63,7 @@ class ExpressionsConverter(
return when (expression.tokenType) { return when (expression.tokenType) {
LAMBDA_EXPRESSION -> { LAMBDA_EXPRESSION -> {
val lambdaTree = LightTree2Fir.buildLightTreeLambdaExpression(expression.asText) val lambdaTree = LightTree2Fir.buildLightTreeLambdaExpression(expression.asText)
ExpressionsConverter(session, stubMode, lambdaTree, declarationsConverter, context) ExpressionsConverter(baseSession, stubMode, lambdaTree, declarationsConverter, context)
.convertLambdaExpression(lambdaTree.root) .convertLambdaExpression(lambdaTree.root)
} }
BINARY_EXPRESSION -> convertBinaryExpression(expression) BINARY_EXPRESSION -> convertBinaryExpression(expression)
@@ -106,11 +102,11 @@ class ExpressionsConverter(
OBJECT_LITERAL -> declarationsConverter.convertObjectLiteral(expression) OBJECT_LITERAL -> declarationsConverter.convertObjectLiteral(expression)
FUN -> declarationsConverter.convertFunctionDeclaration(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 BLOCK -> block = it
} }
} }
return FirAnonymousFunctionImpl(null, session, implicitType, implicitType, FirAnonymousFunctionSymbol(), isLambda = true).apply { val target = FirFunctionTarget(labelName = lambdaExpression.getLabelName(), isLambda = true)
context.firFunctions += this return buildAnonymousFunction {
source = lambdaExpression.toFirSourceElement()
session = baseSession
returnTypeRef = implicitType
receiverTypeRef = implicitType
symbol = FirAnonymousFunctionSymbol()
isLambda = true
context.firFunctionTargets += target
var destructuringBlock: FirExpression? = null var destructuringBlock: FirExpression? = null
for (valueParameter in valueParameterList) { for (valueParameter in valueParameterList) {
val multiDeclaration = valueParameter.destructuringDeclaration val multiDeclaration = valueParameter.destructuringDeclaration
valueParameters += if (multiDeclaration != null) { valueParameters += if (multiDeclaration != null) {
val name = Name.special("<destruct>") val name = Name.special("<destruct>")
val multiParameter = FirValueParameterImpl( val multiParameter = buildValueParameter {
null, session = baseSession
this@ExpressionsConverter.session, returnTypeRef = buildImplicitTypeRef()
FirImplicitTypeRefImpl(null), this.name = name
name, symbol = FirVariableSymbol(name)
FirVariableSymbol(name), defaultValue = null
defaultValue = null, isCrossinline = false
isCrossinline = false, isNoinline = false
isNoinline = false,
isVararg = false isVararg = false
) }
destructuringBlock = generateDestructuringBlock( destructuringBlock = generateDestructuringBlock(
this@ExpressionsConverter.session, this@ExpressionsConverter.baseSession,
multiDeclaration, multiDeclaration,
multiParameter, multiParameter,
tmpVariable = false tmpVariable = false
@@ -157,25 +159,26 @@ class ExpressionsConverter(
} }
} }
label = context.firLabels.pop() ?: context.firFunctionCalls.lastOrNull()?.calleeReference?.name?.let { 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 (block != null) {
body = if (bodyExpression is FirBlockImpl) { declarationsConverter.convertBlockExpressionWithoutBuilding(block!!).apply {
if (bodyExpression.statements.isEmpty()) { if (statements.isEmpty()) {
bodyExpression.statements.add(FirUnitExpression(null)) statements.add(buildUnitExpression())
}
if (destructuringBlock is FirBlock) {
for ((index, statement) in destructuringBlock.statements.withIndex()) {
bodyExpression.statements.add(index, statement)
} }
} if (destructuringBlock is FirBlock) {
bodyExpression for ((index, statement) in destructuringBlock.statements.withIndex()) {
statements.add(index, statement)
}
}
}.build()
} else { } else {
FirSingleExpressionBlock(bodyExpression.toReturn()) buildSingleExpressionBlock(buildErrorExpression(null, FirSimpleDiagnostic("Lambda has no body", DiagnosticKind.Syntax)))
} }
context.firFunctionTargets.removeLast()
context.firFunctions.removeLast() }.also {
target.bind(it)
} }
} }
@@ -187,7 +190,7 @@ class ExpressionsConverter(
var isLeftArgument = true var isLeftArgument = true
lateinit var operationTokenName: String lateinit var operationTokenName: String
var leftArgNode: LighterASTNode? = null 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 { binaryExpression.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
OPERATION_REFERENCE -> { OPERATION_REFERENCE -> {
@@ -208,7 +211,7 @@ class ExpressionsConverter(
when (operationToken) { when (operationToken) {
ELVIS -> ELVIS ->
return getAsFirExpression<FirExpression>(leftArgNode, "No left operand").generateNotNullOrOther( return getAsFirExpression<FirExpression>(leftArgNode, "No left operand").generateNotNullOrOther(
session, rightArgAsFir, "elvis", null baseSession, rightArgAsFir, "elvis", null
) )
ANDAND, OROR -> ANDAND, OROR ->
return getAsFirExpression<FirExpression>(leftArgNode, "No left operand").generateLazyLogicalOperation( return getAsFirExpression<FirExpression>(leftArgNode, "No left operand").generateLazyLogicalOperation(
@@ -221,10 +224,11 @@ class ExpressionsConverter(
} }
val conventionCallName = operationToken.toBinaryName() val conventionCallName = operationToken.toBinaryName()
return if (conventionCallName != null || operationToken == IDENTIFIER) { return if (conventionCallName != null || operationToken == IDENTIFIER) {
FirFunctionCallImpl(null).apply { buildFunctionCall {
calleeReference = FirSimpleNamedReference( source = binaryExpression.toFirSourceElement()
null, conventionCallName ?: operationTokenName.nameAsSafeName(), null calleeReference = buildSimpleNamedReference {
) name = conventionCallName ?: operationTokenName.nameAsSafeName()
}
explicitReceiver = getAsFirExpression(leftArgNode, "No left operand") explicitReceiver = getAsFirExpression(leftArgNode, "No left operand")
arguments += rightArgAsFir arguments += rightArgAsFir
} }
@@ -233,7 +237,9 @@ class ExpressionsConverter(
if (firOperation in FirOperation.ASSIGNMENTS) { if (firOperation in FirOperation.ASSIGNMENTS) {
return leftArgNode.generateAssignment(null, rightArgAsFir, firOperation) { getAsFirExpression(this) } return leftArgNode.generateAssignment(null, rightArgAsFir, firOperation) { getAsFirExpression(this) }
} else { } else {
FirOperatorCallImpl(null, firOperation).apply { buildOperatorCall {
source = binaryExpression.toFirSourceElement()
operation = firOperation
arguments += getAsFirExpression<FirExpression>(leftArgNode, "No left operand") arguments += getAsFirExpression<FirExpression>(leftArgNode, "No left operand")
arguments += rightArgAsFir arguments += rightArgAsFir
} }
@@ -251,7 +257,7 @@ class ExpressionsConverter(
toFirOperation: String.() -> FirOperation toFirOperation: String.() -> FirOperation
): FirTypeOperatorCall { ): FirTypeOperatorCall {
lateinit var operationTokenName: String 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 lateinit var firType: FirTypeRef
binaryExpression.forEachChildren { binaryExpression.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
@@ -260,9 +266,11 @@ class ExpressionsConverter(
else -> if (it.isExpression()) leftArgAsFir = getAsFirExpression(it, "No left operand") else -> if (it.isExpression()) leftArgAsFir = getAsFirExpression(it, "No left operand")
} }
} }
val operation = operationTokenName.toFirOperation() return buildTypeOperatorCall {
return FirTypeOperatorCallImpl(null, operation, firType).apply { source = binaryExpression.toFirSourceElement()
operation = operationTokenName.toFirOperation()
conversionTypeRef = firType
arguments += leftArgAsFir arguments += leftArgAsFir
} }
} }
@@ -276,7 +284,7 @@ class ExpressionsConverter(
var firExpression: FirElement? = null var firExpression: FirElement? = null
labeledExpression.forEachChildren { labeledExpression.forEachChildren {
when (it.tokenType) { 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) BLOCK -> firExpression = declarationsConverter.convertBlock(it)
PROPERTY -> firExpression = declarationsConverter.convertPropertyDeclaration(it) PROPERTY -> firExpression = declarationsConverter.convertPropertyDeclaration(it)
else -> if (it.isExpression()) firExpression = getAsFirExpression(it) else -> if (it.isExpression()) firExpression = getAsFirExpression(it)
@@ -287,7 +295,7 @@ class ExpressionsConverter(
context.firLabels.removeLast() context.firLabels.removeLast()
//println("Unused label: ${labeledExpression.getAsString()}") //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() val conventionCallName = operationToken.toUnaryName()
return when { return when {
operationToken == EXCLEXCL -> { operationToken == EXCLEXCL -> {
FirCheckNotNullCallImpl(null).apply { buildCheckNotNullCall {
source = unaryExpression.toFirSourceElement()
arguments += getAsFirExpression<FirExpression>(argument, "No operand") arguments += getAsFirExpression<FirExpression>(argument, "No operand")
} }
@@ -323,14 +332,17 @@ class ExpressionsConverter(
prefix = unaryExpression.tokenType == PREFIX_EXPRESSION prefix = unaryExpression.tokenType == PREFIX_EXPRESSION
) { getAsFirExpression(this) } ) { getAsFirExpression(this) }
} }
FirFunctionCallImpl(null).apply { buildFunctionCall{
calleeReference = FirSimpleNamedReference(null, conventionCallName, null) source = unaryExpression.toFirSourceElement()
calleeReference = buildSimpleNamedReference { name = conventionCallName }
explicitReceiver = getAsFirExpression(argument, "No operand") explicitReceiver = getAsFirExpression(argument, "No operand")
} }
} }
else -> { else -> {
val firOperation = operationToken.toFirOperation() val firOperation = operationToken.toFirOperation()
FirOperatorCallImpl(null, firOperation).apply { buildOperatorCall {
source = unaryExpression.toFirSourceElement()
operation = firOperation
arguments += getAsFirExpression<FirExpression>(argument, "No operand") arguments += getAsFirExpression<FirExpression>(argument, "No operand")
} }
} }
@@ -352,9 +364,10 @@ class ExpressionsConverter(
} }
} }
return (firExpression as? FirAbstractAnnotatedElement)?.apply { return firExpression?.also {
annotations += firAnnotationList require(it is FirAnnotationContainer)
} ?: FirErrorExpressionImpl(null, FirSimpleDiagnostic("Strange annotated expression: ${firExpression?.render()}", DiagnosticKind.Syntax)) (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 * @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitClassLiteralExpression
*/ */
private fun convertClassLiteralExpression(classLiteralExpression: LighterASTNode): FirExpression { 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 { classLiteralExpression.forEachChildren {
if (it.isExpression()) firReceiverExpression = getAsFirExpression(it, "No receiver in class literal") if (it.isExpression()) firReceiverExpression = getAsFirExpression(it, "No receiver in class literal")
} }
return FirGetClassCallImpl(null).apply { return buildGetClassCall {
source = classLiteralExpression.toFirSourceElement()
arguments += firReceiverExpression arguments += firReceiverExpression
} }
} }
@@ -395,7 +409,8 @@ class ExpressionsConverter(
} }
} }
return FirCallableReferenceAccessImpl(null).apply { return buildCallableReferenceAccess {
source = callableReferenceExpression.toFirSourceElement()
calleeReference = firCallableReference.calleeReference as FirNamedReference calleeReference = firCallableReference.calleeReference as FirNamedReference
explicitReceiver = firReceiverExpression explicitReceiver = firReceiverExpression
this.safe = safe this.safe = safe
@@ -409,7 +424,7 @@ class ExpressionsConverter(
private fun convertQualifiedExpression(dotQualifiedExpression: LighterASTNode): FirExpression { private fun convertQualifiedExpression(dotQualifiedExpression: LighterASTNode): FirExpression {
var isSelector = false var isSelector = false
var isSafe = 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 var firReceiver: FirExpression? = null //before dot
dotQualifiedExpression.forEachChildren { dotQualifiedExpression.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
@@ -469,15 +484,16 @@ class ExpressionsConverter(
} }
val (calleeReference, explicitReceiver) = when { val (calleeReference, explicitReceiver) = when {
name != null -> FirSimpleNamedReference(null, name.nameAsSafeName(), null) to null name != null -> buildSimpleNamedReference { this.name = name.nameAsSafeName() } to null
additionalArgument != 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) { val builder: FirQualifiedAccessBuilder = if (hasArguments) {
FirFunctionCallImpl(null).apply { FirFunctionCallBuilder().apply {
source = callSuffix.toFirSourceElement()
this.calleeReference = calleeReference this.calleeReference = calleeReference
context.firFunctionCalls += this context.firFunctionCalls += this
@@ -485,13 +501,15 @@ class ExpressionsConverter(
context.firFunctionCalls.removeLast() context.firFunctionCalls.removeLast()
} }
} else { } else {
FirQualifiedAccessExpressionImpl(null).apply { FirQualifiedAccessExpressionBuilder().apply {
source = callSuffix.toFirSourceElement()
this.calleeReference = calleeReference this.calleeReference = calleeReference
} }
}.apply { }
return builder.apply {
this.explicitReceiver = explicitReceiver this.explicitReceiver = explicitReceiver
typeArguments += firTypeArguments typeArguments += firTypeArguments
} }.build() as FirExpression
} }
/** /**
@@ -502,7 +520,7 @@ class ExpressionsConverter(
} }
private fun LighterASTNode?.convertShortOrLongStringTemplate(errorReason: String): FirExpression { 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) { this?.forEachChildren(LONG_TEMPLATE_ENTRY_START, LONG_TEMPLATE_ENTRY_END) {
firExpression = getAsFirExpression(it, errorReason) firExpression = getAsFirExpression(it, errorReason)
} }
@@ -523,55 +541,65 @@ class ExpressionsConverter(
private fun convertWhenExpression(whenExpression: LighterASTNode): FirExpression { private fun convertWhenExpression(whenExpression: LighterASTNode): FirExpression {
var subjectExpression: FirExpression? = null var subjectExpression: FirExpression? = null
var subjectVariable: FirVariable<*>? = null var subjectVariable: FirVariable<*>? = null
val whenEntryNodes = mutableListOf<LighterASTNode>()
val whenEntries = mutableListOf<WhenEntry>() val whenEntries = mutableListOf<WhenEntry>()
whenExpression.forEachChildren { whenExpression.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
PROPERTY -> subjectVariable = (declarationsConverter.convertPropertyDeclaration(it) as FirVariable<*>).let { variable -> PROPERTY -> subjectVariable = (declarationsConverter.convertPropertyDeclaration(it) as FirVariable<*>).let { variable ->
FirPropertyImpl( buildProperty {
null, source = it.toFirSourceElement()
session, session = baseSession
variable.returnTypeRef, returnTypeRef = variable.returnTypeRef
null, name = variable.name
variable.name, initializer = variable.initializer
variable.initializer, isVar = false
null, symbol = FirPropertySymbol(variable.name)
false, isLocal = true
FirPropertySymbol(variable.name), status = FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL)
true, }
FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL)
)
} }
DESTRUCTURING_DECLARATION -> subjectExpression = DESTRUCTURING_DECLARATION -> subjectExpression =
getAsFirExpression(it, "Incorrect when subject expression: ${whenExpression.asText}") getAsFirExpression(it, "Incorrect when subject expression: ${whenExpression.asText}")
WHEN_ENTRY -> whenEntries += convertWhenEntry(it) WHEN_ENTRY -> whenEntryNodes += it
else -> if (it.isExpression()) subjectExpression = else -> if (it.isExpression()) subjectExpression =
getAsFirExpression(it, "Incorrect when subject expression: ${whenExpression.asText}") getAsFirExpression(it, "Incorrect when subject expression: ${whenExpression.asText}")
} }
} }
subjectExpression = subjectVariable?.initializer ?: subjectExpression subjectExpression = subjectVariable?.initializer ?: subjectExpression
val hasSubject = subjectExpression != null val hasSubject = subjectExpression != null
val subject = FirWhenSubject() val subject = FirWhenSubject()
return FirWhenExpressionImpl(null, subjectExpression, subjectVariable).apply { whenEntryNodes.mapTo(whenEntries) { convertWhenEntry(it, subject.takeIf { hasSubject }) }
if (hasSubject) { return buildWhenExpression {
subject.bind(this) source = whenExpression.toFirSourceElement()
} this.subject = subjectExpression
this.subjectVariable = subjectVariable
for (entry in whenEntries) { for (entry in whenEntries) {
val branch = entry.firBlock val branch = entry.firBlock
branches += if (!entry.isElse) { branches += if (!entry.isElse) {
if (hasSubject) { if (hasSubject) {
val firCondition = entry.toFirWhenCondition(subject) val firCondition = entry.toFirWhenCondition()
FirWhenBranchImpl(null, firCondition, branch) buildWhenBranch {
condition = firCondition
result = branch
}
} else { } else {
val firCondition = entry.toFirWhenConditionWithoutSubject() val firCondition = entry.toFirWhenConditionWithoutSubject()
FirWhenBranchImpl(null, firCondition, branch) buildWhenBranch {
condition = firCondition
result = branch
}
} }
} else { } else {
FirWhenBranchImpl( buildWhenBranch {
null, FirElseIfTrueCondition(null), branch 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.parseWhenEntry
* @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parseWhenEntryNotElse * @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 isElse = false
var firBlock: FirBlock = FirEmptyExpressionBlock() var firBlock: FirBlock = buildEmptyExpressionBlock()
val conditions = mutableListOf<FirExpression>() val conditions = mutableListOf<FirExpression>()
whenEntry.forEachChildren { whenEntry.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
WHEN_CONDITION_EXPRESSION -> conditions += convertWhenConditionExpression(it) WHEN_CONDITION_EXPRESSION -> conditions += convertWhenConditionExpression(it, subject)
WHEN_CONDITION_IN_RANGE -> conditions += convertWhenConditionInRange(it) WHEN_CONDITION_IN_RANGE -> conditions += convertWhenConditionInRange(it, subject)
WHEN_CONDITION_IS_PATTERN -> conditions += convertWhenConditionIsPattern(it) WHEN_CONDITION_IS_PATTERN -> conditions += convertWhenConditionIsPattern(it, subject)
ELSE_KEYWORD -> isElse = true ELSE_KEYWORD -> isElse = true
BLOCK -> firBlock = declarationsConverter.convertBlock(it) BLOCK -> firBlock = declarationsConverter.convertBlock(it)
else -> if (it.isExpression()) firBlock = declarationsConverter.convertBlock(it) else -> if (it.isExpression()) firBlock = declarationsConverter.convertBlock(it)
@@ -597,22 +625,31 @@ class ExpressionsConverter(
return WhenEntry(conditions, firBlock, isElse) return WhenEntry(conditions, firBlock, isElse)
} }
private fun convertWhenConditionExpression(whenCondition: LighterASTNode): FirExpression { private fun convertWhenConditionExpression(whenCondition: LighterASTNode, subject: FirWhenSubject?): FirExpression {
var firExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No expression in condition with expression", DiagnosticKind.Syntax)) var firExpression: FirExpression = buildErrorExpression(null, FirSimpleDiagnostic("No expression in condition with expression", DiagnosticKind.Syntax))
whenCondition.forEachChildren { whenCondition.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
else -> if (it.isExpression()) firExpression = getAsFirExpression(it, "No expression in condition with expression") 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 { } else {
arguments += firExpression firExpression
} }
} }
private fun convertWhenConditionInRange(whenCondition: LighterASTNode): FirExpression { private fun convertWhenConditionInRange(whenCondition: LighterASTNode, subject: FirWhenSubject?): FirExpression {
var isNegate = false 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 { whenCondition.forEachChildren {
when { when {
it.tokenType == OPERATION_REFERENCE && it.asText == NOT_IN.value -> isNegate = true 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 val subjectExpression = if (subject != null) {
return FirFunctionCallImpl(null).apply { buildWhenSubjectExpression {
calleeReference = FirSimpleNamedReference(null, name, null) whenSubject = subject
explicitReceiver = firExpression }
} 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 firOperation: FirOperation
lateinit var firType: FirTypeRef lateinit var firType: FirTypeRef
whenCondition.forEachChildren { 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 * @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitArrayAccessExpression
*/ */
private fun convertArrayAccessExpression(arrayAccess: LighterASTNode): FirFunctionCall { 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() val indices: MutableList<FirExpression> = mutableListOf()
arrayAccess.forEachChildren { arrayAccess.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
@@ -654,10 +719,15 @@ class ExpressionsConverter(
else -> if (it.isExpression()) firExpression = getAsFirExpression(it, "No array expression") else -> if (it.isExpression()) firExpression = getAsFirExpression(it, "No array expression")
} }
} }
return FirFunctionCallImpl(null).apply { val getArgument = context.arraySetArgument.remove(arrayAccess)
calleeReference = FirSimpleNamedReference(null, OperatorNameConventions.GET, null) return buildFunctionCall {
source = arrayAccess.toFirSourceElement()
calleeReference = buildSimpleNamedReference {
name = if (getArgument == null) OperatorNameConventions.GET else OperatorNameConventions.SET
}
explicitReceiver = firExpression explicitReceiver = firExpression
arguments += indices arguments += indices
getArgument?.let { arguments += it }
} }
} }
@@ -670,7 +740,8 @@ class ExpressionsConverter(
if (it.isExpression()) firExpressionList += getAsFirExpression<FirExpression>(it, "Incorrect collection literal argument") if (it.isExpression()) firExpressionList += getAsFirExpression<FirExpression>(it, "Incorrect collection literal argument")
} }
return FirArrayOfCallImpl(null).apply { return buildArrayOfCall {
source = expression.toFirSourceElement()
arguments += firExpressionList arguments += firExpressionList
} }
} }
@@ -692,9 +763,9 @@ class ExpressionsConverter(
* @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitSimpleNameExpression * @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitSimpleNameExpression
*/ */
private fun convertSimpleNameExpression(referenceExpression: LighterASTNode): FirQualifiedAccessExpression { private fun convertSimpleNameExpression(referenceExpression: LighterASTNode): FirQualifiedAccessExpression {
return FirQualifiedAccessExpressionImpl(null).apply { return buildQualifiedAccessExpression {
calleeReference = source = referenceExpression.toFirSourceElement()
FirSimpleNamedReference(null, referenceExpression.asText.nameAsSafeName(), null) calleeReference = buildSimpleNamedReference { name = referenceExpression.asText.nameAsSafeName() }
} }
} }
@@ -704,7 +775,7 @@ class ExpressionsConverter(
*/ */
private fun convertDoWhile(doWhileLoop: LighterASTNode): FirElement { private fun convertDoWhile(doWhileLoop: LighterASTNode): FirElement {
var block: LighterASTNode? = null 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 { doWhileLoop.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
BODY -> block = it 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 { private fun convertWhile(whileLoop: LighterASTNode): FirElement {
var block: LighterASTNode? = null 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 { whileLoop.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
BODY -> block = it 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 { private fun convertFor(forLoop: LighterASTNode): FirElement {
var parameter: ValueParameter? = null 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 var blockNode: LighterASTNode? = null
forLoop.forEachChildren { forLoop.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
@@ -748,57 +825,58 @@ class ExpressionsConverter(
} }
} }
return FirBlockImpl(null).apply { return buildBlock {
source = forLoop.toFirSourceElement()
val rangeVal = val rangeVal =
generateTemporaryVariable(this@ExpressionsConverter.session, null, Name.special("<range>"), rangeExpression) generateTemporaryVariable(this@ExpressionsConverter.baseSession, null, Name.special("<range>"), rangeExpression)
statements += rangeVal statements += rangeVal
val iteratorVal = generateTemporaryVariable( val iteratorVal = generateTemporaryVariable(
this@ExpressionsConverter.session, null, Name.special("<iterator>"), this@ExpressionsConverter.baseSession, null, Name.special("<iterator>"),
FirFunctionCallImpl(null).apply { buildFunctionCall {
calleeReference = FirSimpleNamedReference(null, Name.identifier("iterator"), null) calleeReference = buildSimpleNamedReference { name = Name.identifier("iterator") }
explicitReceiver = generateResolvedAccessExpression(null, rangeVal) explicitReceiver = generateResolvedAccessExpression(null, rangeVal)
} }
) )
statements += iteratorVal statements += iteratorVal
statements += FirWhileLoopImpl( statements += FirWhileLoopBuilder().apply {
null, source = forLoop.toFirSourceElement()
FirFunctionCallImpl(null).apply { condition = buildFunctionCall {
calleeReference = FirSimpleNamedReference(null, Name.identifier("hasNext"), null) calleeReference = buildSimpleNamedReference { name = Name.identifier("hasNext") }
explicitReceiver = generateResolvedAccessExpression(null, iteratorVal) explicitReceiver = generateResolvedAccessExpression(null, iteratorVal)
} }
).configure { }.configure {
// NB: just body.toFirBlock() isn't acceptable here because we need to add some statements // 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 statements += convertLoopBody(blockNode).statements
} if (parameter == null) return@block
if (parameter != null) {
val multiDeclaration = parameter!!.destructuringDeclaration val multiDeclaration = parameter!!.destructuringDeclaration
val firLoopParameter = generateTemporaryVariable( val firLoopParameter = generateTemporaryVariable(
this@ExpressionsConverter.session, null, this@ExpressionsConverter.baseSession, null,
if (multiDeclaration != null) Name.special("<destruct>") else parameter!!.firValueParameter.name, if (multiDeclaration != null) Name.special("<destruct>") else parameter!!.firValueParameter.name,
FirFunctionCallImpl(null).apply { buildFunctionCall {
calleeReference = FirSimpleNamedReference(null, Name.identifier("next"), null) calleeReference = buildSimpleNamedReference { name = Name.identifier("next") }
explicitReceiver = generateResolvedAccessExpression(null, iteratorVal) explicitReceiver = generateResolvedAccessExpression(null, iteratorVal)
}, },
parameter!!.firValueParameter.returnTypeRef parameter!!.firValueParameter.returnTypeRef
) )
if (multiDeclaration != null) { if (multiDeclaration != null) {
val destructuringBlock = generateDestructuringBlock( val destructuringBlock = generateDestructuringBlock(
this@ExpressionsConverter.session, this@ExpressionsConverter.baseSession,
multiDeclaration, multiDeclaration,
firLoopParameter, firLoopParameter,
tmpVariable = true tmpVariable = true
) )
if (destructuringBlock is FirBlock) { if (destructuringBlock is FirBlock) {
for ((index, statement) in destructuringBlock.statements.withIndex()) { for ((index, statement) in destructuringBlock.statements.withIndex()) {
block.statements.add(index, statement) statements.add(index, statement)
} }
} }
} else { } else {
block.statements.add(0, firLoopParameter) statements.add(0, firLoopParameter)
} }
} }
block
} }
} }
} }
@@ -819,7 +897,7 @@ class ExpressionsConverter(
return when { return when {
firStatement != null -> FirSingleExpressionBlock(firStatement!!) firStatement != null -> FirSingleExpressionBlock(firStatement!!)
firBlock == null -> FirEmptyExpressionBlock() firBlock == null -> buildEmptyExpressionBlock()
else -> firBlock!! else -> firBlock!!
} }
} }
@@ -839,10 +917,16 @@ class ExpressionsConverter(
FINALLY -> finallyBlock = convertFinally(it) 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) { for ((parameter, block) in catchClauses) {
if (parameter == null) continue 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 * @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitIfExpression
*/ */
private fun convertIfExpression(ifExpression: LighterASTNode): FirExpression { 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 thenBlock: LighterASTNode? = null
var elseBlock: LighterASTNode? = null var elseBlock: LighterASTNode? = null
ifExpression.forEachChildren { ifExpression.forEachChildren {
@@ -893,14 +977,21 @@ class ExpressionsConverter(
} }
} }
return FirWhenExpressionImpl(null, null, null).apply { return buildWhenExpression {
val trueBranch = convertLoopBody(thenBlock) val trueBranch = convertLoopBody(thenBlock)
branches += FirWhenBranchImpl(null, firCondition, trueBranch) branches += buildWhenBranch {
val elseBranch = convertLoopBody(elseBlock) source = thenBlock?.toFirSourceElement()
if (elseBranch !is FirEmptyExpressionBlock) { condition = firCondition
branches += FirWhenBranchImpl( result = trueBranch
null, FirElseIfTrueCondition(null), elseBranch }
) 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 { private fun convertReturn(returnExpression: LighterASTNode): FirExpression {
var labelName: String? = null var labelName: String? = null
var firExpression: FirExpression = FirUnitExpression(null) var firExpression: FirExpression = buildUnitExpression()
returnExpression.forEachChildren { returnExpression.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
LABEL_QUALIFIER -> labelName = it.getAsStringWithoutBacktick().replace("@", "") LABEL_QUALIFIER -> labelName = it.getAsStringWithoutBacktick().replace("@", "")
@@ -944,12 +1038,15 @@ class ExpressionsConverter(
* @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitThrowExpression * @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitThrowExpression
*/ */
private fun convertThrow(throwExpression: LighterASTNode): FirExpression { 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 { throwExpression.forEachChildren {
if (it.isExpression()) firExpression = getAsFirExpression(it, "Nothing to throw") 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 { private fun convertThisExpression(thisExpression: LighterASTNode): FirQualifiedAccessExpression {
val label: String? = thisExpression.getLabelName() 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 { return buildQualifiedAccessExpression {
calleeReference = FirExplicitSuperReference(null, superTypeRef) source = superExpression.toFirSourceElement()
calleeReference = buildExplicitSuperReference {
this.superTypeRef = superTypeRef
}
} }
} }
@@ -987,7 +1090,10 @@ class ExpressionsConverter(
VALUE_ARGUMENT -> container += convertValueArgument(node) VALUE_ARGUMENT -> container += convertValueArgument(node)
LAMBDA_EXPRESSION, LAMBDA_EXPRESSION,
LABELED_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 { private fun convertValueArgument(valueArgument: LighterASTNode): FirExpression {
var identifier: String? = null var identifier: String? = null
var isSpread = false 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 { valueArgument.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
VALUE_ARGUMENT_NAME -> identifier = it.asText VALUE_ARGUMENT_NAME -> identifier = it.asText
@@ -1010,13 +1116,16 @@ class ExpressionsConverter(
} }
} }
return when { return when {
identifier != null -> FirNamedArgumentExpressionImpl( identifier != null -> buildNamedArgumentExpression {
null, source = valueArgument.toFirSourceElement()
firExpression, expression = firExpression
isSpread, this.isSpread = isSpread
identifier.nameAsSafeName() name = identifier.nameAsSafeName()
) }
isSpread -> FirSpreadArgumentExpressionImpl(null, firExpression) isSpread -> buildSpreadArgumentExpression {
source = valueArgument.toFirSourceElement()
expression = firExpression
}
else -> 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.lightTree.fir.modifier.Modifier
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.FirUserTypeRef 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.FirQualifierPartImpl
import org.jetbrains.kotlin.fir.types.impl.FirUserTypeRefImpl
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.name.SpecialNames
@@ -65,15 +65,9 @@ class ClassWrapper(
} }
fun getFirUserTypeFromClassName(): FirUserTypeRef { fun getFirUserTypeFromClassName(): FirUserTypeRef {
val qualifier = FirQualifierPartImpl( return buildUserTypeRef {
className isMarkedNullable = false
) qualifier.add(FirQualifierPartImpl(className))
return FirUserTypeRefImpl(
null,
false
).apply {
this.qualifier.add(qualifier)
} }
} }
} }
@@ -9,19 +9,19 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.builder.convertToArrayType import org.jetbrains.kotlin.fir.builder.convertToArrayType
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirValueParameter 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.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter 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.DiagnosticKind
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic 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.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.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef 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( class ValueParameter(
private val isVal: Boolean, private val isVal: Boolean,
@@ -41,34 +41,30 @@ class ValueParameter(
type = type.convertToArrayType() type = type.convertToArrayType()
} }
if (type is FirImplicitTypeRef) { 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 { return buildProperty {
isExpect = modifiers.hasExpect() source = firValueParameter.source
isActual = modifiers.hasActual() this.session = session
isOverride = modifiers.hasOverride() returnTypeRef = type
isConst = false this.name = name
isLateInit = false initializer = buildQualifiedAccessExpression {
} calleeReference = buildPropertyFromParameterResolvedNamedReference {
this.name = name
return FirPropertyImpl( resolvedSymbol = this@ValueParameter.firValueParameter.symbol
null, }
session, }
type, isVar = this@ValueParameter.isVar
null, symbol = FirPropertySymbol(callableId)
name, isLocal = false
FirQualifiedAccessExpressionImpl(null).apply { status = FirDeclarationStatusImpl(modifiers.getVisibility(), modifiers.getModality()).apply {
calleeReference = FirPropertyFromParameterResolvedNamedReference( isExpect = modifiers.hasExpect()
null, name, this@ValueParameter.firValueParameter.symbol isActual = modifiers.hasActual()
) isOverride = modifiers.hasOverride()
}, isConst = false
null, isLateInit = false
this.isVar, }
FirPropertySymbol(callableId),
false,
status
).apply {
annotations += this@ValueParameter.firValueParameter.annotations annotations += this@ValueParameter.firValueParameter.annotations
getter = FirDefaultPropertyGetter(null, session, type, modifiers.getVisibility()) getter = FirDefaultPropertyGetter(null, session, type, modifiers.getVisibility())
setter = if (this.isVar) FirDefaultPropertySetter(null, session, type, modifiers.getVisibility()) else null setter = if (this.isVar) FirDefaultPropertySetter(null, session, type, modifiers.getVisibility()) else null
@@ -6,26 +6,24 @@
package org.jetbrains.kotlin.fir.lightTree.fir package org.jetbrains.kotlin.fir.lightTree.fir
import org.jetbrains.kotlin.fir.FirWhenSubject 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.builder.generateLazyLogicalOperation
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.impl.FirErrorExpressionImpl import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirOperatorCallImpl import org.jetbrains.kotlin.fir.expressions.FirOperatorCall
import org.jetbrains.kotlin.fir.expressions.impl.FirTypeOperatorCallImpl import org.jetbrains.kotlin.fir.expressions.buildErrorExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirWhenSubjectExpressionImpl import org.jetbrains.kotlin.fir.expressions.builder.buildWhenSubjectExpression
import org.jetbrains.kotlin.util.OperatorNameConventions
data class WhenEntry( data class WhenEntry(
val conditions: List<FirExpression>, val conditions: List<FirExpression>,
val firBlock: FirBlock, val firBlock: FirBlock,
val isElse: Boolean = false val isElse: Boolean = false
) { ) {
fun toFirWhenCondition(subject: FirWhenSubject): FirExpression { fun toFirWhenCondition(): FirExpression {
var firCondition: FirExpression? = null var firCondition: FirExpression? = null
for (condition in conditions) { for (condition in conditions) {
val firConditionElement = condition.toFirWhenCondition(subject) val firConditionElement = condition.toFirWhenCondition()
firCondition = when (firCondition) { firCondition = when (firCondition) {
null -> firConditionElement null -> firConditionElement
else -> firCondition.generateLazyLogicalOperation(firConditionElement, false, null) else -> firCondition.generateLazyLogicalOperation(firConditionElement, false, null)
@@ -34,34 +32,15 @@ data class WhenEntry(
return firCondition!! return firCondition!!
} }
private fun FirExpression.toFirWhenCondition(subject: FirWhenSubject): FirExpression { private fun FirExpression.toFirWhenCondition(): FirExpression {
val firSubjectExpression = FirWhenSubjectExpressionImpl(null, subject) return this
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))
}
}
} }
fun toFirWhenConditionWithoutSubject(): FirExpression { fun toFirWhenConditionWithoutSubject(): FirExpression {
return when (val condition = conditions.first()) { return when (val condition = conditions.firstOrNull()) {
is FirOperatorCallImpl -> condition.arguments.first() // is FirOperatorCall -> condition.arguments.first()
else -> FirErrorExpressionImpl(null, FirSimpleDiagnostic("No expression in condition with expression", DiagnosticKind.Syntax)) null -> buildErrorExpression(null, FirSimpleDiagnostic("No expression in condition with expression", DiagnosticKind.Syntax))
else -> condition
} }
} }
} }
@@ -9,9 +9,7 @@ import com.intellij.lang.LighterASTNode
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall 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.CLASS_MODIFIER
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.FUNCTION_MODIFIER import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.FUNCTION_MODIFIER
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.INHERITANCE_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.PLATFORM_MODIFIER
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.PROPERTY_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.lightTree.fir.modifier.ModifierSets.VISIBILITY_MODIFIER
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
class Modifier( class Modifier(
override val source: FirSourceElement? = null,
private val classModifiers: MutableList<ClassModifier> = mutableListOf(), private val classModifiers: MutableList<ClassModifier> = mutableListOf(),
private val memberModifiers: MutableList<MemberModifier> = mutableListOf(), private val memberModifiers: MutableList<MemberModifier> = mutableListOf(),
private val visibilityModifiers: MutableList<VisibilityModifier> = mutableListOf(), private val visibilityModifiers: MutableList<VisibilityModifier> = mutableListOf(),
@@ -33,8 +28,8 @@ class Modifier(
private val inheritanceModifiers: MutableList<InheritanceModifier> = mutableListOf(), private val inheritanceModifiers: MutableList<InheritanceModifier> = mutableListOf(),
private val parameterModifiers: MutableList<ParameterModifier> = mutableListOf(), private val parameterModifiers: MutableList<ParameterModifier> = mutableListOf(),
private val platformModifiers: MutableList<PlatformModifier> = mutableListOf() private val platformModifiers: MutableList<PlatformModifier> = mutableListOf()
) : FirAbstractAnnotatedElement { ) {
override val annotations: MutableList<FirAnnotationCall> = mutableListOf() val annotations: MutableList<FirAnnotationCall> = mutableListOf()
fun addModifier(modifier: LighterASTNode) { fun addModifier(modifier: LighterASTNode) {
val tokenType = modifier.tokenType val tokenType = modifier.tokenType
@@ -157,10 +152,4 @@ class Modifier(
fun hasActual(): Boolean { fun hasActual(): Boolean {
return platformModifiers.contains(PlatformModifier.ACTUAL) || platformModifiers.contains(PlatformModifier.IMPL) 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
}
} }
@@ -6,18 +6,11 @@
package org.jetbrains.kotlin.fir.lightTree.fir.modifier package org.jetbrains.kotlin.fir.lightTree.fir.modifier
import com.intellij.lang.LighterASTNode import com.intellij.lang.LighterASTNode
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall 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 import org.jetbrains.kotlin.lexer.KtTokens
class TypeModifier( class TypeModifier(var hasSuspend: Boolean = false) {
override val source: FirSourceElement? = null, val annotations: MutableList<FirAnnotationCall> = mutableListOf()
var hasSuspend: Boolean = false
) : FirAbstractAnnotatedElement {
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
fun addModifier(modifier: LighterASTNode) { fun addModifier(modifier: LighterASTNode) {
when (modifier.tokenType) { when (modifier.tokenType) {
@@ -28,10 +21,4 @@ class TypeModifier(
fun hasNoAnnotations(): Boolean { fun hasNoAnnotations(): Boolean {
return annotations.isEmpty() 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
}
} }
@@ -6,21 +6,16 @@
package org.jetbrains.kotlin.fir.lightTree.fir.modifier package org.jetbrains.kotlin.fir.lightTree.fir.modifier
import com.intellij.lang.LighterASTNode import com.intellij.lang.LighterASTNode
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall 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.REIFICATION_MODIFIER
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.VARIANCE_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 import org.jetbrains.kotlin.types.Variance
class TypeParameterModifier( class TypeParameterModifier(
override val source: FirSourceElement? = null,
private val varianceModifiers: MutableList<VarianceModifier> = mutableListOf(), private val varianceModifiers: MutableList<VarianceModifier> = mutableListOf(),
private var reificationModifier: ReificationModifier? = null private var reificationModifier: ReificationModifier? = null
) : FirAbstractAnnotatedElement { ) {
override val annotations: MutableList<FirAnnotationCall> = mutableListOf() val annotations: MutableList<FirAnnotationCall> = mutableListOf()
fun addModifier(modifier: LighterASTNode) { fun addModifier(modifier: LighterASTNode) {
val tokenType = modifier.tokenType val tokenType = modifier.tokenType
@@ -42,10 +37,4 @@ class TypeParameterModifier(
fun hasReified(): Boolean { fun hasReified(): Boolean {
return reificationModifier == ReificationModifier.REIFIED 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
}
} }
@@ -8,17 +8,14 @@ package org.jetbrains.kotlin.fir.lightTree.fir.modifier
import com.intellij.lang.LighterASTNode import com.intellij.lang.LighterASTNode
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall 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.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 import org.jetbrains.kotlin.types.Variance
class TypeProjectionModifier( class TypeProjectionModifier(
override val source: FirSourceElement? = null, val source: FirSourceElement? = null,
private val varianceModifiers: MutableList<VarianceModifier> = mutableListOf() private val varianceModifiers: MutableList<VarianceModifier> = mutableListOf()
) : FirAbstractAnnotatedElement { ) {
override val annotations: MutableList<FirAnnotationCall> = mutableListOf() val annotations: MutableList<FirAnnotationCall> = mutableListOf()
fun addModifier(modifier: LighterASTNode) { fun addModifier(modifier: LighterASTNode) {
val tokenType = modifier.tokenType val tokenType = modifier.tokenType
@@ -34,10 +31,4 @@ class TypeProjectionModifier(
else -> Variance.INVARIANT 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.PsiElement
import com.intellij.psi.tree.IElementType import com.intellij.psi.tree.IElementType
import org.jetbrains.kotlin.KtNodeTypes.* 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.*
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.impl.FirErrorFunctionImpl 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.DiagnosticKind
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.* 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.FirReference
import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl import org.jetbrains.kotlin.fir.references.builder.*
import org.jetbrains.kotlin.fir.references.impl.FirExplicitThisReference
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.FirErrorFunctionSymbol 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.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.* 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.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl 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.CLOSING_QUOTE
import org.jetbrains.kotlin.lexer.KtTokens.OPEN_QUOTE import org.jetbrains.kotlin.lexer.KtTokens.OPEN_QUOTE
import org.jetbrains.kotlin.name.FqName 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.KtStringTemplateExpression
import org.jetbrains.kotlin.psi.KtUnaryExpression import org.jetbrains.kotlin.psi.KtUnaryExpression
import org.jetbrains.kotlin.resolve.constants.evaluate.* import org.jetbrains.kotlin.resolve.constants.evaluate.*
import org.jetbrains.kotlin.util.OperatorNameConventions
//T can be either PsiElement, or LighterASTNode //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 abstract fun T.toFirSourceElement(): FirSourceElement
protected val implicitAnyType = session.builtinTypes.anyType
protected val implicitEnumType = session.builtinTypes.enumType protected val implicitUnitType = baseSession.builtinTypes.unitType
protected val implicitAnnotationType = session.builtinTypes.annotationType 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.elementType: IElementType
abstract val T.asText: String abstract val T.asText: String
@@ -56,9 +68,11 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
/**** Class name utils ****/ /**** Class name utils ****/
inline fun <T> withChildClassName(name: Name, l: () -> T): T { inline fun <T> withChildClassName(name: Name, l: () -> T): T {
context.className = context.className.child(name) context.className = context.className.child(name)
val t = l() return try {
context.className = context.className.parent() l()
return t } finally {
context.className = context.className.parent()
}
} }
fun callableIdForName(name: Name, local: Boolean = false) = 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 { fun FirExpression.toReturn(baseSource: FirSourceElement? = source, labelName: String? = null): FirReturnExpression {
return FirReturnExpressionImpl( return buildReturnExpression {
baseSource, fun FirFunctionTarget.bindToErrorFunction(message: String, kind: DiagnosticKind) {
this bind(
).apply { buildErrorFunction {
target = FirFunctionTarget(labelName) source = baseSource
session = this@BaseFirBuilder.baseSession
diagnostic = FirSimpleDiagnostic(message, kind)
symbol = FirErrorFunctionSymbol()
}
)
}
source = baseSource
result = this@toReturn
if (labelName == null) { if (labelName == null) {
val lastFunction = context.firFunctions.lastOrNull { !(it is FirAnonymousFunction && it.isLambda) } target = context.firFunctionTargets.lastOrNull { !it.isLambda } ?: FirFunctionTarget(labelName, isLambda = false).apply {
if (lastFunction != null) { bindToErrorFunction("Cannot bind unlabeled return to a function", DiagnosticKind.ReturnNotAllowed)
target.bind(lastFunction)
} else {
target.bind(
FirErrorFunctionImpl(
source,
this@BaseFirBuilder.session,
FirSimpleDiagnostic("Cannot bind unlabeled return to a function", DiagnosticKind.ReturnNotAllowed),
FirErrorFunctionSymbol()
)
)
} }
} else { } else {
for (firFunction in context.firFunctions.asReversed()) { for (functionTarget in context.firFunctionTargets.asReversed()) {
when (firFunction) { if (functionTarget.labelName == labelName) {
is FirAnonymousFunction -> { target = functionTarget
if (firFunction.label?.name == labelName) { return@buildReturnExpression
target.bind(firFunction)
return@apply
}
}
is FirSimpleFunction -> {
if (firFunction.name.asString() == labelName) {
target.bind(firFunction)
return@apply
}
}
} }
} }
target.bind( target = FirFunctionTarget(labelName, false).apply {
FirErrorFunctionImpl( bindToErrorFunction("Cannot bind label $labelName to a function", DiagnosticKind.UnresolvedLabel)
source, }
this@BaseFirBuilder.session,
FirSimpleDiagnostic("Cannot bind label $labelName to a function", DiagnosticKind.UnresolvedLabel),
FirErrorFunctionSymbol()
)
)
} }
} }
} }
fun KtClassOrObject?.toDelegatedSelfType(firClass: FirRegularClass): FirResolvedTypeRef { fun T?.toDelegatedSelfType(firClass: AbstractFirRegularClassBuilder): FirResolvedTypeRef {
return FirResolvedTypeRefImpl( return buildResolvedTypeRef {
this?.toFirSourceElement(), source = this@toDelegatedSelfType?.toFirSourceElement()
ConeClassLikeTypeImpl( type = ConeClassLikeTypeImpl(
firClass.symbol.toLookupTag(), firClass.symbol.toLookupTag(),
firClass.typeParameters.map { ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false) }.toTypedArray(), firClass.typeParameters.map { ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false) }.toTypedArray(),
false false
) )
) }
} }
fun typeParametersFromSelfType(delegatedSelfTypeRef: FirTypeRef): List<FirTypeParameter> { fun typeParametersFromSelfType(delegatedSelfTypeRef: FirTypeRef): List<FirTypeParameter> {
@@ -159,40 +157,43 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
?: emptyList() ?: emptyList()
} }
fun FirAbstractLoop.configure(generateBlock: () -> FirBlock): FirAbstractLoop { fun FirLoopBuilder.configure(generateBlock: () -> FirBlock): FirLoop {
label = context.firLabels.pop() label = context.firLabels.pop()
context.firLoops += this val target = FirLoopTarget(label?.name)
context.firLoopTargets += target
block = generateBlock() block = generateBlock()
context.firLoops.removeLast() val loop = build()
return this context.firLoopTargets.removeLast()
target.bind(loop)
return loop
} }
fun FirAbstractLoopJump.bindLabel(expression: T): FirAbstractLoopJump { fun FirLoopJumpBuilder.bindLabel(expression: T): FirLoopJumpBuilder {
val labelName = expression.getLabelName() val labelName = expression.getLabelName()
target = FirLoopTarget(labelName) val lastLoopTarget = context.firLoopTargets.lastOrNull()
val lastLoop = context.firLoops.lastOrNull()
if (labelName == null) { if (labelName == null) {
if (lastLoop != null) { target = lastLoopTarget ?: FirLoopTarget(labelName).apply {
target.bind(lastLoop) bind(
} else { buildErrorLoop(
target.bind( expression.getSourceOrNull(),
FirErrorLoop( FirSimpleDiagnostic("Cannot bind unlabeled jump to a loop", DiagnosticKind.Syntax)
expression.getSourceOrNull(), FirSimpleDiagnostic("Cannot bind unlabeled jump to a loop", DiagnosticKind.Syntax)
) )
) )
} }
} else { } else {
for (firLoop in context.firLoops.asReversed()) { for (firLoopTarget in context.firLoopTargets.asReversed()) {
if (firLoop.label?.name == labelName) { if (firLoopTarget.labelName == labelName) {
target.bind(firLoop) target = firLoopTarget
return this return this
} }
} }
target.bind( target = FirLoopTarget(labelName).apply {
FirErrorLoop( bind(
expression.getSourceOrNull(), FirSimpleDiagnostic("Cannot bind label $labelName to a loop", DiagnosticKind.Syntax) buildErrorLoop(
expression.getSourceOrNull(), FirSimpleDiagnostic("Cannot bind label $labelName to a loop", DiagnosticKind.Syntax)
)
) )
) }
} }
return this return this
} }
@@ -213,13 +214,13 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
return when (type) { return when (type) {
INTEGER_CONSTANT -> { INTEGER_CONSTANT -> {
val kind = when { val kind = when {
convertedText !is Long -> return FirErrorExpressionImpl( convertedText !is Long -> return buildErrorExpression {
expression.getSourceOrNull(), source = expression.getSourceOrNull()
FirSimpleDiagnostic( diagnostic = FirSimpleDiagnostic(
"Incorrect constant expression: $text", "Incorrect constant expression: $text",
DiagnosticKind.IllegalConstExpression DiagnosticKind.IllegalConstExpression
) )
) }
hasLongSuffix(text) || hasUnsignedSuffix(text) || hasUnsignedLongSuffix(text) -> { hasLongSuffix(text) || hasUnsignedSuffix(text) || hasUnsignedLongSuffix(text) -> {
FirConstKind.Long FirConstKind.Long
@@ -230,7 +231,7 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
} }
} }
FirConstExpressionImpl( buildConstOrErrorExpression(
expression.getSourceOrNull(), expression.getSourceOrNull(),
kind, kind,
convertedText, convertedText,
@@ -239,25 +240,39 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
} }
FLOAT_CONSTANT -> FLOAT_CONSTANT ->
if (convertedText is Float) { if (convertedText is Float) {
FirConstExpressionImpl( buildConstOrErrorExpression(
expression.getSourceOrNull(), FirConstKind.Float, convertedText, expression.getSourceOrNull(),
FirConstKind.Float,
convertedText,
FirSimpleDiagnostic("Incorrect float: $text", DiagnosticKind.Syntax) FirSimpleDiagnostic("Incorrect float: $text", DiagnosticKind.Syntax)
) )
} else { } else {
FirConstExpressionImpl( buildConstOrErrorExpression(
expression.getSourceOrNull(), FirConstKind.Double, convertedText as Double, expression.getSourceOrNull(),
FirConstKind.Double,
convertedText as Double,
FirSimpleDiagnostic("Incorrect double: $text", DiagnosticKind.Syntax) FirSimpleDiagnostic("Incorrect double: $text", DiagnosticKind.Syntax)
) )
} }
CHARACTER_CONSTANT -> CHARACTER_CONSTANT ->
FirConstExpressionImpl( buildConstOrErrorExpression(
expression.getSourceOrNull(), FirConstKind.Char, text.parseCharacter(), expression.getSourceOrNull(),
FirConstKind.Char,
text.parseCharacter(),
FirSimpleDiagnostic("Incorrect character: $text", DiagnosticKind.Syntax) FirSimpleDiagnostic("Incorrect character: $text", DiagnosticKind.Syntax)
) )
BOOLEAN_CONSTANT -> BOOLEAN_CONSTANT ->
FirConstExpressionImpl(expression.getSourceOrNull(), FirConstKind.Boolean, convertedText as Boolean) buildConstExpression(
expression.getSourceOrNull(),
FirConstKind.Boolean,
convertedText as Boolean
)
NULL -> NULL ->
FirConstExpressionImpl(expression.getSourceOrNull(), FirConstKind.Null, null) buildConstExpression(
expression.getSourceOrNull(),
FirConstKind.Null,
null
)
else -> else ->
throw AssertionError("Unknown literal type: $type, $text") throw AssertionError("Unknown literal type: $type, $text")
} }
@@ -267,53 +282,48 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
base: KtStringTemplateExpression?, base: KtStringTemplateExpression?,
convertTemplateEntry: T?.(String) -> FirExpression convertTemplateEntry: T?.(String) -> FirExpression
): FirExpression { ): FirExpression {
val sb = StringBuilder() return buildStringConcatenationCall {
var hasExpressions = false val sb = StringBuilder()
var result: FirExpression? = null var hasExpressions = false
var callCreated = false L@ for (entry in this@toInterpolatingCall) {
L@ for (entry in this) { if (entry == null) continue
if (entry == null) continue arguments += when (entry.elementType) {
val nextArgument = when (entry.elementType) { OPEN_QUOTE, CLOSING_QUOTE -> continue@L
OPEN_QUOTE, CLOSING_QUOTE -> continue@L LITERAL_STRING_TEMPLATE_ENTRY -> {
LITERAL_STRING_TEMPLATE_ENTRY -> { sb.append(entry.asText)
sb.append(entry.asText) buildConstExpression(entry.getSourceOrNull(), FirConstKind.String, 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)
} }
} ESCAPE_STRING_TEMPLATE_ENTRY -> {
else -> { sb.append(entry.unescapedValue)
hasExpressions = true buildConstExpression(entry.getSourceOrNull(), FirConstKind.String, entry.unescapedValue)
FirErrorExpressionImpl( }
entry.getSourceOrNull(), FirSimpleDiagnostic("Incorrect template entry: ${entry.asText}", DiagnosticKind.Syntax) SHORT_STRING_TEMPLATE_ENTRY, LONG_STRING_TEMPLATE_ENTRY -> {
) hasExpressions = true
} val firExpression = entry.convertTemplateEntry("Incorrect template argument")
} val source = firExpression.source
result = when { buildFunctionCall {
result == null -> nextArgument this.source = source
callCreated && result is FirStringConcatenationCallImpl -> result.apply { explicitReceiver = firExpression
arguments += nextArgument calleeReference = buildSimpleNamedReference {
} this.source = source
else -> { name = Name.identifier("toString")
callCreated = true }
FirStringConcatenationCallImpl(base?.toFirSourceElement()).apply { }
arguments += result!! }
arguments += nextArgument 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 convert: T.() -> FirExpression
): FirExpression { ): FirExpression {
if (argument == null) { 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 buildBlock {
return FirBlockImpl(source).apply { val baseSource = baseExpression?.toFirSourceElement()
source = baseSource
val tempName = Name.special("<unary>") 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 statements += temporaryVariable
val resultName = Name.special("<unary-result>") val resultName = Name.special("<unary-result>")
val resultInitializer = FirFunctionCallImpl(source).apply { val resultInitializer = buildFunctionCall {
this.calleeReference = FirSimpleNamedReference(baseExpression?.operationReference?.toFirSourceElement(), callName, null) source = baseSource
this.explicitReceiver = generateResolvedAccessExpression(source, temporaryVariable) 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( val assignment = argument.generateAssignment(
source, source,
if (prefix && argument.elementType != REFERENCE_EXPRESSION) 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?, left: T?,
convertQualified: T.() -> FirQualifiedAccess? convertQualified: T.() -> FirQualifiedAccess?
): FirReference { ): FirReference {
@@ -402,10 +420,16 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
if (left != null) { if (left != null) {
when (tokenType) { when (tokenType) {
REFERENCE_EXPRESSION -> { REFERENCE_EXPRESSION -> {
return FirSimpleNamedReference(left.getSourceOrNull(), left.getReferencedNameAsName(), null) return buildSimpleNamedReference {
source = left.getSourceOrNull()
name = left.getReferencedNameAsName()
}
} }
THIS_EXPRESSION -> { THIS_EXPRESSION -> {
return FirExplicitThisReference(left.getSourceOrNull(), left.getLabelName()) return buildExplicitThisReference {
source = left.getSourceOrNull()
labelName = left.getLabelName()
}
} }
DOT_QUALIFIED_EXPRESSION, SAFE_ACCESS_EXPRESSION -> { DOT_QUALIFIED_EXPRESSION, SAFE_ACCESS_EXPRESSION -> {
val firMemberAccess = left.convertQualified() val firMemberAccess = left.convertQualified()
@@ -414,10 +438,10 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
safe = firMemberAccess.safe safe = firMemberAccess.safe
firMemberAccess.calleeReference firMemberAccess.calleeReference
} else { } else {
FirErrorNamedReferenceImpl( buildErrorNamedReference {
left.getSourceOrNull(), source = left.getSourceOrNull()
FirSimpleDiagnostic("Unsupported qualified LValue: ${left.asText}", DiagnosticKind.Syntax) diagnostic = FirSimpleDiagnostic("Unsupported qualified LValue: ${left.asText}", DiagnosticKind.Syntax)
) }
} }
} }
PARENTHESIZED -> { PARENTHESIZED -> {
@@ -425,62 +449,178 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
} }
} }
} }
return FirErrorNamedReferenceImpl( return buildErrorNamedReference {
left.getSourceOrNull(), FirSimpleDiagnostic("Unsupported LValue: $tokenType", DiagnosticKind.Syntax) source = left.getSourceOrNull()
) diagnostic = FirSimpleDiagnostic("Unsupported LValue: $tokenType", DiagnosticKind.Syntax)
}
} }
fun T?.generateAssignment( fun T?.generateAssignment(
source: FirSourceElement?, baseSource: FirSourceElement?,
value: FirExpression, value: FirExpression,
operation: FirOperation, operation: FirOperation,
convert: T.() -> FirExpression convert: T.() -> FirExpression
): FirStatement { ): FirStatement {
val tokenType = this?.elementType val tokenType = this?.elementType
if (tokenType == PARENTHESIZED) { if (tokenType == PARENTHESIZED) {
return this!!.getExpressionInParentheses().generateAssignment(source, value, operation, convert) return this!!.getExpressionInParentheses().generateAssignment(baseSource, value, operation, convert)
} }
if (tokenType == ARRAY_ACCESS_EXPRESSION) { if (tokenType == ARRAY_ACCESS_EXPRESSION) {
val firArrayAccess = this!!.convert() as FirFunctionCallImpl if (operation == FirOperation.ASSIGN) {
val arraySet = if (operation != FirOperation.ASSIGN) { context.arraySetArgument[this!!] = value
FirArraySetCallImpl(source, value, operation).apply { }
indexes += firArrayAccess.arguments val firArrayAccess = this!!.convert() as FirFunctionCall
} if (operation == FirOperation.ASSIGN) {
} else { return firArrayAccess
return firArrayAccess.apply { }
calleeReference = FirSimpleNamedReference(source, OperatorNameConventions.SET, null) val arraySetCallBuilder = FirArraySetCallBuilder().apply {
arguments += value source = baseSource
} rValue = value
this.operation = operation
indexes += firArrayAccess.arguments
} }
val arrayExpression = this.getChildNodeByType(REFERENCE_EXPRESSION) val arrayExpression = this.getChildNodeByType(REFERENCE_EXPRESSION)
if (arrayExpression != null) { if (arrayExpression != null) {
return arraySet.apply { return arraySetCallBuilder.apply {
lValue = initializeLValue(arrayExpression) { convert() as? FirQualifiedAccess } calleeReference = initializeLValue(arrayExpression) { convert() as? FirQualifiedAccess }
} }.build()
} }
val psiArrayExpression = firArrayAccess.explicitReceiver?.psi val psiArrayExpression = firArrayAccess.explicitReceiver?.psi
return FirBlockImpl(psiArrayExpression?.toFirSourceElement()).apply { return buildBlock {
source = psiArrayExpression?.toFirSourceElement()
val name = Name.special("<array-set>") val name = Name.special("<array-set>")
statements += generateTemporaryVariable( 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) { if (operation in FirOperation.ASSIGNMENTS && operation != FirOperation.ASSIGN) {
return FirOperatorCallImpl(source, operation).apply { return buildOperatorCall {
source = baseSource
this.operation = operation
// TODO: take good psi // TODO: take good psi
arguments += this@generateAssignment?.convert() ?: arguments += this@generateAssignment?.convert() ?:
FirErrorExpressionImpl( buildErrorExpression {
null, FirSimpleDiagnostic("Unsupported left value of assignment: ${source?.psi?.text}", DiagnosticKind.Syntax) source = null
) diagnostic = FirSimpleDiagnostic("Unsupported left value of assignment: ${baseSource?.psi?.text}", DiagnosticKind.Syntax)
}
arguments += value arguments += value
} }
} }
require(operation == FirOperation.ASSIGN) require(operation == FirOperation.ASSIGN)
return FirVariableAssignmentImpl(source, false, value).apply { return buildVariableAssignment {
lValue = initializeLValue(this@generateAssignment) { convert() as? FirQualifiedAccess } 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 package org.jetbrains.kotlin.fir.builder
import org.jetbrains.kotlin.fir.FirFunctionTarget
import org.jetbrains.kotlin.fir.FirLabel import org.jetbrains.kotlin.fir.FirLabel
import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.FirLoopTarget
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirLoop import org.jetbrains.kotlin.fir.expressions.builder.FirFunctionCallBuilder
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
class Context { class Context<T> {
lateinit var packageFqName: FqName lateinit var packageFqName: FqName
var className: FqName = FqName.ROOT 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 firFunctionTargets = mutableListOf<FirFunctionTarget>()
val firFunctionCalls = mutableListOf<FirFunctionCall>() val firFunctionCalls = mutableListOf<FirFunctionCallBuilder>()
val firLabels = mutableListOf<FirLabel>() 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.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.* 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.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.DiagnosticKind
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.* 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.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock
import org.jetbrains.kotlin.fir.references.impl.FirDelegateFieldReferenceImpl import org.jetbrains.kotlin.fir.expressions.impl.buildSingleExpressionBlock
import org.jetbrains.kotlin.fir.references.impl.FirExplicitThisReference import org.jetbrains.kotlin.fir.references.builder.buildDelegateFieldReference
import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl import org.jetbrains.kotlin.fir.references.builder.buildExplicitThisReference
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference 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.StandardClassIds
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.ConeStarProjection import org.jetbrains.kotlin.fir.types.ConeStarProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.FirUserTypeRef 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.lexer.KtTokens
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
@@ -135,55 +147,68 @@ fun IElementType.toFirOperation(): FirOperation =
} }
fun FirExpression.generateNotNullOrOther( fun FirExpression.generateNotNullOrOther(
session: FirSession, other: FirExpression, caseId: String, baseSource: FirSourceElement? session: FirSession, other: FirExpression, caseId: String, baseSource: FirSourceElement?,
): FirWhenExpression { ): FirWhenExpression {
val subjectName = Name.special("<$caseId>") val subjectName = Name.special("<$caseId>")
val subjectVariable = generateTemporaryVariable(session, baseSource, subjectName, this) val subjectVariable = generateTemporaryVariable(session, baseSource, subjectName, this)
val subject = FirWhenSubject() val subject = FirWhenSubject()
val subjectExpression = FirWhenSubjectExpressionImpl(baseSource, subject) val subjectExpression = buildWhenSubjectExpression {
return FirWhenExpressionImpl( source = baseSource
baseSource, this, subjectVariable whenSubject = subject
).apply { }
subject.bind(this)
branches += FirWhenBranchImpl( return buildWhenExpression {
baseSource, source = baseSource
FirOperatorCallImpl(baseSource, FirOperation.EQ).apply { this.subject = this@generateNotNullOrOther
this.subjectVariable = subjectVariable
branches += buildWhenBranch {
source = baseSource
condition = buildOperatorCall {
source = baseSource
operation = FirOperation.EQ
arguments += subjectExpression arguments += subjectExpression
arguments += FirConstExpressionImpl(baseSource, FirConstKind.Null, null) arguments += buildConstExpression(baseSource, FirConstKind.Null, null)
}, }
FirSingleExpressionBlock(other) result = buildSingleExpressionBlock(other)
) }
branches += FirWhenBranchImpl( branches += buildWhenBranch {
other.source, FirElseIfTrueCondition(baseSource), source = other.source
FirSingleExpressionBlock( condition = buildElseIfTrueCondition {
generateResolvedAccessExpression(baseSource, subjectVariable) source = baseSource
) }
) result = buildSingleExpressionBlock(generateResolvedAccessExpression(baseSource, subjectVariable))
}
}.also {
subject.bind(it)
} }
} }
fun FirExpression.generateLazyLogicalOperation( fun FirExpression.generateLazyLogicalOperation(
other: FirExpression, isAnd: Boolean, baseSource: FirSourceElement? other: FirExpression, isAnd: Boolean, baseSource: FirSourceElement?,
): FirBinaryLogicExpression { ): FirBinaryLogicExpression {
val kind = if (isAnd) return buildBinaryLogicExpression {
LogicOperationKind.AND source = baseSource
else leftOperand = this@generateLazyLogicalOperation
LogicOperationKind.OR rightOperand = other
return FirBinaryLogicExpressionImpl(baseSource, this, other, kind) kind = if (isAnd) LogicOperationKind.AND else LogicOperationKind.OR
}
} }
internal fun KtWhenCondition.toFirWhenCondition( internal fun KtWhenCondition.toFirWhenCondition(
subject: FirWhenSubject, subject: FirWhenSubject,
convert: KtExpression?.(String) -> FirExpression, convert: KtExpression?.(String) -> FirExpression,
toFirOrErrorTypeRef: KtTypeReference?.() -> FirTypeRef toFirOrErrorTypeRef: KtTypeReference?.() -> FirTypeRef,
): FirExpression { ): FirExpression {
val firSubjectExpression = FirWhenSubjectExpressionImpl(this.toFirSourceElement(), subject) val baseSource = this.toFirSourceElement()
val firSubjectExpression = buildWhenSubjectExpression {
source = baseSource
whenSubject = subject
}
return when (this) { return when (this) {
is KtWhenConditionWithExpression -> { is KtWhenConditionWithExpression -> {
FirOperatorCallImpl( buildOperatorCall {
expression?.toFirSourceElement(), source = expression?.toFirSourceElement()
FirOperation.EQ operation = FirOperation.EQ
).apply {
arguments += firSubjectExpression arguments += firSubjectExpression
arguments += expression.convert("No expression in condition with expression") arguments += expression.convert("No expression in condition with expression")
} }
@@ -193,16 +218,15 @@ internal fun KtWhenCondition.toFirWhenCondition(
firRange.generateContainsOperation(firSubjectExpression, isNegated, rangeExpression, operationReference) firRange.generateContainsOperation(firSubjectExpression, isNegated, rangeExpression, operationReference)
} }
is KtWhenConditionIsPattern -> { is KtWhenConditionIsPattern -> {
FirTypeOperatorCallImpl( buildTypeOperatorCall {
typeReference?.toFirSourceElement(), source = typeReference?.toFirSourceElement()
if (isNegated) FirOperation.NOT_IS else FirOperation.IS, operation = if (isNegated) FirOperation.NOT_IS else FirOperation.IS
typeReference.toFirOrErrorTypeRef() conversionTypeRef = typeReference.toFirOrErrorTypeRef()
).apply {
arguments += firSubjectExpression arguments += firSubjectExpression
} }
} }
else -> { 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?, baseSource: FirSourceElement?,
subject: FirWhenSubject, subject: FirWhenSubject,
convert: KtExpression?.(String) -> FirExpression, convert: KtExpression?.(String) -> FirExpression,
toFirOrErrorTypeRef: KtTypeReference?.() -> FirTypeRef toFirOrErrorTypeRef: KtTypeReference?.() -> FirTypeRef,
): FirExpression { ): FirExpression {
var firCondition: FirExpression? = null var firCondition: FirExpression? = null
for (condition in this) { for (condition in this) {
@@ -219,7 +243,7 @@ internal fun Array<KtWhenCondition>.toFirWhenCondition(
firCondition = when (firCondition) { firCondition = when (firCondition) {
null -> firConditionElement null -> firConditionElement
else -> firCondition.generateLazyLogicalOperation( else -> firCondition.generateLazyLogicalOperation(
firConditionElement, false, baseSource firConditionElement, false, baseSource,
) )
} }
} }
@@ -230,30 +254,47 @@ fun FirExpression.generateContainsOperation(
argument: FirExpression, argument: FirExpression,
inverted: Boolean, inverted: Boolean,
base: KtExpression?, base: KtExpression?,
operationReference: KtOperationReferenceExpression? operationReference: KtOperationReferenceExpression?,
): FirFunctionCall { ): FirFunctionCall {
val baseSource = base?.toFirSourceElement() val baseSource = base?.toFirSourceElement()
val operationReferenceSource = operationReference?.toFirSourceElement() val operationReferenceSource = operationReference?.toFirSourceElement()
val containsCall = FirFunctionCallImpl(baseSource).apply { val containsCall = buildFunctionCall {
calleeReference = FirSimpleNamedReference(operationReferenceSource, OperatorNameConventions.CONTAINS, null) source = baseSource
calleeReference = buildSimpleNamedReference {
source = operationReferenceSource
name = OperatorNameConventions.CONTAINS
}
explicitReceiver = this@generateContainsOperation explicitReceiver = this@generateContainsOperation
arguments += argument arguments += argument
} }
if (!inverted) return containsCall if (!inverted) return containsCall
return FirFunctionCallImpl(baseSource).apply { return buildFunctionCall {
calleeReference = FirSimpleNamedReference(operationReferenceSource, OperatorNameConventions.NOT, null) source = baseSource
calleeReference = buildSimpleNamedReference {
source = operationReferenceSource
name = OperatorNameConventions.NOT
}
explicitReceiver = containsCall explicitReceiver = containsCall
} }
} }
fun generateAccessExpression(source: FirSourceElement?, name: Name): FirQualifiedAccessExpression = fun generateAccessExpression(source: FirSourceElement?, name: Name): FirQualifiedAccessExpression =
FirQualifiedAccessExpressionImpl(source).apply { buildQualifiedAccessExpression {
calleeReference = FirSimpleNamedReference(source, name, null) this.source = source
calleeReference = buildSimpleNamedReference {
this.source = source
this.name = name
}
} }
fun generateResolvedAccessExpression(source: FirSourceElement?, variable: FirVariable<*>): FirQualifiedAccessExpression = fun generateResolvedAccessExpression(source: FirSourceElement?, variable: FirVariable<*>): FirQualifiedAccessExpression =
FirQualifiedAccessExpressionImpl(source).apply { buildQualifiedAccessExpression {
calleeReference = FirResolvedNamedReferenceImpl(source, variable.name, variable.symbol) this.source = source
calleeReference = buildResolvedNamedReference {
this.source = source
name = variable.name
resolvedSymbol = variable.symbol
}
} }
internal fun generateDestructuringBlock( internal fun generateDestructuringBlock(
@@ -261,142 +302,165 @@ internal fun generateDestructuringBlock(
multiDeclaration: KtDestructuringDeclaration, multiDeclaration: KtDestructuringDeclaration,
container: FirVariable<*>, container: FirVariable<*>,
tmpVariable: Boolean, tmpVariable: Boolean,
extractAnnotationsTo: KtAnnotated.(FirAbstractAnnotatedElement) -> Unit, extractAnnotationsTo: KtAnnotated.(FirAnnotationContainerBuilder) -> Unit,
toFirOrImplicitTypeRef: KtTypeReference?.() -> FirTypeRef toFirOrImplicitTypeRef: KtTypeReference?.() -> FirTypeRef,
): FirExpression { ): FirExpression {
return FirBlockImpl(multiDeclaration.toFirSourceElement()).apply { return buildBlock {
source = multiDeclaration.toFirSourceElement()
if (tmpVariable) { if (tmpVariable) {
statements += container statements += container
} }
val isVar = multiDeclaration.isVar val isVar = multiDeclaration.isVar
for ((index, entry) in multiDeclaration.entries.withIndex()) { for ((index, entry) in multiDeclaration.entries.withIndex()) {
val entrySource = entry.toFirSourceElement() val entrySource = entry.toFirSourceElement()
statements += FirPropertyImpl( val name = entry.nameAsSafeName
entrySource, statements += buildProperty {
session, source = entrySource
entry.typeReference.toFirOrImplicitTypeRef(), this.session = session
null, returnTypeRef = entry.typeReference.toFirOrImplicitTypeRef()
entry.nameAsSafeName, this.name = name
FirComponentCallImpl(entrySource, generateResolvedAccessExpression(entrySource, container), index + 1), initializer = buildComponentCall {
null, source = entrySource
isVar, explicitReceiver = generateResolvedAccessExpression(entrySource, container)
FirPropertySymbol(entry.nameAsSafeName), // TODO? componentIndex = index + 1
true, }
FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL) this.isVar = isVar
).apply { isLocal = true
status = FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL)
symbol = FirPropertySymbol(name)
entry.extractAnnotationsTo(this) entry.extractAnnotationsTo(this)
symbol.bind(this)
} }
} }
} }
} }
fun generateTemporaryVariable( 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<*> = ): FirVariable<*> =
FirPropertyImpl( buildProperty {
source, this.source = source
session, this.session = session
typeRef ?: FirImplicitTypeRefImpl(source), returnTypeRef = typeRef ?: buildImplicitTypeRef {
null, this.source = source
name, }
initializer, this.name = name
null, this.initializer = initializer
false, symbol = FirPropertySymbol(name)
FirPropertySymbol(name), isVar = false
true, isLocal = true
FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL) status = FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL)
).apply {
symbol.bind(this)
} }
fun generateTemporaryVariable( 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) ): FirVariable<*> = generateTemporaryVariable(session, source, Name.special("<$specialName>"), initializer)
fun FirModifiableVariable<*>.generateAccessorsByDelegate( fun FirPropertyBuilder.generateAccessorsByDelegate(
delegateBuilder: FirWrappedDelegateExpressionBuilder?,
session: FirSession, session: FirSession,
member: Boolean, member: Boolean,
extension: Boolean, extension: Boolean,
stubMode: Boolean, stubMode: Boolean,
receiver: FirExpression? receiver: FirExpression?
) { ) {
val variable = this as FirVariable<*> if (delegateBuilder == null) return
val delegateFieldSymbol = delegateFieldSymbol ?: return val delegateFieldSymbol = FirDelegateFieldSymbol<FirProperty>(symbol.callableId).also {
val delegate = delegate as? FirWrappedDelegateExpressionImpl ?: return this.delegateFieldSymbol = it
fun delegateAccess() = FirQualifiedAccessExpressionImpl(null).apply { }
calleeReference = FirDelegateFieldReferenceImpl(null, null, delegateFieldSymbol) fun delegateAccess() = buildQualifiedAccessExpression {
source = null
calleeReference = buildDelegateFieldReference {
resolvedSymbol = delegateFieldSymbol
}
} }
fun thisRef(): FirExpression = fun thisRef(): FirExpression =
when { if (member || extension) buildQualifiedAccessExpression {
member || extension -> FirQualifiedAccessExpressionImpl(null).apply { source = null
calleeReference = FirExplicitThisReference(null, null) calleeReference = buildExplicitThisReference {}
}
else -> FirConstExpressionImpl(null, FirConstKind.Null, null)
} }
else buildConstExpression(null, FirConstKind.Null, null)
fun propertyRef() = FirCallableReferenceAccessImpl(null).apply { fun propertyRef() = buildCallableReferenceAccess {
calleeReference = FirResolvedNamedReferenceImpl(null, variable.name, variable.symbol) source = null
calleeReference = buildResolvedNamedReference {
source = null
name = this@generateAccessorsByDelegate.name
resolvedSymbol = this@generateAccessorsByDelegate.symbol
}
typeRef = FirImplicitKPropertyTypeRef(null, ConeStarProjection) typeRef = FirImplicitKPropertyTypeRef(null, ConeStarProjection)
} }
delegate.delegateProvider = if (stubMode) FirExpressionStub(null) else FirFunctionCallImpl(null).apply { delegateBuilder.delegateProvider = if (stubMode) buildExpressionStub() else buildFunctionCall {
explicitReceiver = receiver explicitReceiver = receiver
calleeReference = FirSimpleNamedReference(null, PROVIDE_DELEGATE, null) calleeReference = buildSimpleNamedReference {
source = null
name = PROVIDE_DELEGATE
}
arguments += thisRef() arguments += thisRef()
arguments += propertyRef() arguments += propertyRef()
} }
delegate = delegateBuilder.build()
if (stubMode) return if (stubMode) return
if (getter == null || getter is FirDefaultPropertyAccessor) { if (getter == null || getter is FirDefaultPropertyAccessor) {
getter = FirPropertyAccessorImpl( val returnTarget = FirFunctionTarget(null, isLambda = false)
null, getter = buildPropertyAccessor {
session, this.session = session
FirImplicitTypeRefImpl(null), returnTypeRef = buildImplicitTypeRef()
FirPropertyAccessorSymbol(), isGetter = true
true, status = FirDeclarationStatusImpl(Visibilities.UNKNOWN, Modality.FINAL)
FirDeclarationStatusImpl(Visibilities.UNKNOWN, Modality.FINAL) symbol = FirPropertyAccessorSymbol()
).apply Accessor@{
body = FirSingleExpressionBlock( body = FirSingleExpressionBlock(
FirReturnExpressionImpl( buildReturnExpression {
null, result = buildFunctionCall {
FirFunctionCallImpl(null).apply { source = null
explicitReceiver = delegateAccess() explicitReceiver = delegateAccess()
calleeReference = FirSimpleNamedReference(null, GET_VALUE, null) calleeReference = buildSimpleNamedReference {
source = null
name = GET_VALUE
}
arguments += thisRef() arguments += thisRef()
arguments += propertyRef() arguments += propertyRef()
} }
).apply { target = returnTarget
target = FirFunctionTarget(null)
target.bind(this@Accessor)
} }
) )
}.also {
returnTarget.bind(it)
} }
} }
if (variable.isVar && (setter == null || setter is FirDefaultPropertyAccessor)) { if (isVar && (setter == null || setter is FirDefaultPropertyAccessor)) {
setter = FirPropertyAccessorImpl( setter = buildPropertyAccessor {
null, this.session = session
session, returnTypeRef = session.builtinTypes.unitType
session.builtinTypes.unitType, isGetter = false
FirPropertyAccessorSymbol(), status = FirDeclarationStatusImpl(Visibilities.UNKNOWN, Modality.FINAL)
false, val parameter = buildValueParameter {
FirDeclarationStatusImpl(Visibilities.UNKNOWN, Modality.FINAL) this.session = session
).apply { returnTypeRef = buildImplicitTypeRef()
val parameter = FirValueParameterImpl( name = DELEGATED_SETTER_PARAM
null, session, FirImplicitTypeRefImpl(null), symbol = FirVariableSymbol(this@generateAccessorsByDelegate.name)
DELEGATED_SETTER_PARAM, FirVariableSymbol(name), isCrossinline = false
defaultValue = null, isCrossinline = false, isNoinline = false
isNoinline = false, isVararg = false isVararg = false
) }
valueParameters += parameter valueParameters += parameter
symbol = FirPropertyAccessorSymbol()
body = FirSingleExpressionBlock( body = FirSingleExpressionBlock(
FirFunctionCallImpl(null).apply { buildFunctionCall {
explicitReceiver = delegateAccess() explicitReceiver = delegateAccess()
calleeReference = FirSimpleNamedReference(null, SET_VALUE, null) calleeReference = buildSimpleNamedReference {
name = SET_VALUE
}
arguments += thisRef() arguments += thisRef()
arguments += propertyRef() arguments += propertyRef()
arguments += FirQualifiedAccessExpressionImpl(null).apply { arguments += buildQualifiedAccessExpression {
calleeReference = FirResolvedNamedReferenceImpl(source, DELEGATED_SETTER_PARAM, parameter.symbol) 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 { qualifier += FirQualifierPartImpl(StandardClassIds.Array.shortClassName).apply {
typeArguments += FirTypeProjectionWithVarianceImpl( typeArguments += buildTypeProjectionWithVariance {
source, this@convertToArrayType, Variance.OUT_VARIANCE 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
@@ -22,6 +22,8 @@ import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression 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.render
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.isExtensionFunctionAnnotationCall import org.jetbrains.kotlin.fir.types.isExtensionFunctionAnnotationCall
@@ -161,7 +163,8 @@ abstract class AbstractRawFirBuilderTestCase : KtParsingTestCase(
private fun throwTwiceVisitingError(element: FirElement) { private fun throwTwiceVisitingError(element: FirElement) {
if (element is FirTypeRef || element is FirNoReceiverExpression || element is FirTypeParameter || 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 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.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.declarations.impl.FirAnonymousFunctionImpl import org.jetbrains.kotlin.fir.declarations.builder.buildAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl import org.jetbrains.kotlin.fir.declarations.builder.buildTypeParameter
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.FirCheckNotNullCallImpl import org.jetbrains.kotlin.fir.expressions.builder.*
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.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.scopes.impl.FirIntegerOperatorCall 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.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef 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( fun FirFunctionCall.copy(
annotations: List<FirAnnotationCall> = this.annotations, annotations: List<FirAnnotationCall> = this.annotations,
@@ -38,21 +36,27 @@ fun FirFunctionCall.copy(
typeArguments: List<FirTypeProjection> = this.typeArguments, typeArguments: List<FirTypeProjection> = this.typeArguments,
resultType: FirTypeRef = this.typeRef resultType: FirTypeRef = this.typeRef
): FirFunctionCall { ): FirFunctionCall {
return if (this is FirIntegerOperatorCall) { val builder = if (this is FirIntegerOperatorCall) {
FirIntegerOperatorCall(source) FirIntegerOperatorCallBuilder().apply {
this.calleeReference = calleeReference
}
} else { } else {
FirFunctionCallImpl(source) FirFunctionCallBuilder().apply {
}.apply { this.calleeReference = calleeReference
}
}
builder.apply {
this.source = source
this.safe = safe this.safe = safe
this.annotations.addAll(annotations) this.annotations.addAll(annotations)
this.arguments.addAll(arguments) this.arguments.addAll(arguments)
this.calleeReference = calleeReference
this.explicitReceiver = explicitReceiver this.explicitReceiver = explicitReceiver
this.dispatchReceiver = dispatchReceiver this.dispatchReceiver = dispatchReceiver
this.extensionReceiver = extensionReceiver this.extensionReceiver = extensionReceiver
this.typeArguments.addAll(typeArguments) this.typeArguments.addAll(typeArguments)
this.typeRef = resultType this.typeRef = resultType
} }
return (builder as FirCallBuilder).build() as FirFunctionCall
} }
fun FirAnonymousFunction.copy( fun FirAnonymousFunction.copy(
@@ -68,7 +72,13 @@ fun FirAnonymousFunction.copy(
controlFlowGraphReference: FirControlFlowGraphReference = this.controlFlowGraphReference, controlFlowGraphReference: FirControlFlowGraphReference = this.controlFlowGraphReference,
invocationKind: InvocationKind? = this.invocationKind invocationKind: InvocationKind? = this.invocationKind
): FirAnonymousFunction { ): 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.valueParameters.addAll(valueParameters)
this.body = body this.body = body
this.annotations.addAll(annotations) this.annotations.addAll(annotations)
@@ -83,7 +93,9 @@ fun FirAnonymousFunction.copy(
fun FirTypeRef.resolvedTypeFromPrototype( fun FirTypeRef.resolvedTypeFromPrototype(
type: ConeKotlinType type: ConeKotlinType
): FirResolvedTypeRef { ): FirResolvedTypeRef {
return FirResolvedTypeRefImpl(source, type).apply { return buildResolvedTypeRef {
source = this@resolvedTypeFromPrototype.source
this.type = type
annotations += this@resolvedTypeFromPrototype.annotations annotations += this@resolvedTypeFromPrototype.annotations
} }
} }
@@ -91,10 +103,14 @@ fun FirTypeRef.resolvedTypeFromPrototype(
fun FirTypeParameter.copy( fun FirTypeParameter.copy(
bounds: List<FirTypeRef> = this.bounds, bounds: List<FirTypeRef> = this.bounds,
annotations: List<FirAnnotationCall> = this.annotations annotations: List<FirAnnotationCall> = this.annotations
): FirTypeParameterImpl { ): FirTypeParameter {
return FirTypeParameterImpl( return buildTypeParameter {
source, session, name, symbol, variance, isReified source = this@copy.source
).apply { session = this@copy.session
name = this@copy.name
symbol = this@copy.symbol
variance = this@copy.variance
isReified = this@copy.isReified
this.bounds += bounds this.bounds += bounds
this.annotations += annotations this.annotations += annotations
} }
@@ -104,10 +120,13 @@ fun FirWhenExpression.copy(
resultType: FirTypeRef = this.typeRef, resultType: FirTypeRef = this.typeRef,
calleeReference: FirReference = this.calleeReference, calleeReference: FirReference = this.calleeReference,
annotations: List<FirAnnotationCall> = this.annotations 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.calleeReference = calleeReference
this@apply.branches.addAll(this@copy.branches) branches += this@copy.branches
this.typeRef = resultType typeRef = resultType
this.annotations += annotations this.annotations += annotations
} }
@@ -115,10 +134,13 @@ fun FirTryExpression.copy(
resultType: FirTypeRef = this.typeRef, resultType: FirTypeRef = this.typeRef,
calleeReference: FirReference = this.calleeReference, calleeReference: FirReference = this.calleeReference,
annotations: List<FirAnnotationCall> = this.annotations 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.calleeReference = calleeReference
this@apply.catches.addAll(this@copy.catches) catches += this@copy.catches
this.typeRef = resultType typeRef = resultType
this.annotations += annotations this.annotations += annotations
} }
@@ -126,9 +148,10 @@ fun FirCheckNotNullCall.copy(
resultType: FirTypeRef = this.typeRef, resultType: FirTypeRef = this.typeRef,
calleeReference: FirReference = this.calleeReference, calleeReference: FirReference = this.calleeReference,
annotations: List<FirAnnotationCall> = this.annotations annotations: List<FirAnnotationCall> = this.annotations
): FirCheckNotNullCallImpl = FirCheckNotNullCallImpl(source).apply { ): FirCheckNotNullCall = buildCheckNotNullCall {
source = this@copy.source
this.calleeReference = calleeReference this.calleeReference = calleeReference
this@apply.arguments.addAll(this@copy.arguments) arguments += this@copy.arguments
this.typeRef = resultType this.typeRef = resultType
this.annotations += annotations 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.FirFile
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub import org.jetbrains.kotlin.fir.expressions.builder.buildExpressionStub
import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedQualifierImpl import org.jetbrains.kotlin.fir.expressions.builder.buildResolvedQualifier
import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedReifiedParameterReferenceImpl import org.jetbrains.kotlin.fir.expressions.builder.buildResolvedReifiedParameterReference
import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.references.FirSuperReference import org.jetbrains.kotlin.fir.references.FirSuperReference
import org.jetbrains.kotlin.fir.references.impl.FirBackingFieldReferenceImpl import org.jetbrains.kotlin.fir.references.builder.buildBackingFieldReference
import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.calls.* 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.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.* 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.name.Name
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder
import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator
@@ -46,7 +46,7 @@ class FirCallResolver(
topLevelScopes: List<FirScope>, topLevelScopes: List<FirScope>,
localScopes: List<FirLocalScope>, localScopes: List<FirLocalScope>,
override val implicitReceiverStack: ImplicitReceiverStack, override val implicitReceiverStack: ImplicitReceiverStack,
private val qualifiedResolver: FirQualifiedNameResolver private val qualifiedResolver: FirQualifiedNameResolver,
) : BodyResolveComponents by components { ) : BodyResolveComponents by components {
private lateinit var transformer: FirExpressionsResolveTransformer private lateinit var transformer: FirExpressionsResolveTransformer
@@ -58,7 +58,7 @@ class FirCallResolver(
private val towerResolver = FirTowerResolver( private val towerResolver = FirTowerResolver(
returnTypeCalculator, this, resolutionStageRunner, returnTypeCalculator, this, resolutionStageRunner,
topLevelScopes = topLevelScopes.asReversed(), topLevelScopes = topLevelScopes.asReversed(),
localScopes = localScopes.asReversed() localScopes = localScopes.asReversed(),
) )
private val conflictResolver = private val conflictResolver =
@@ -86,7 +86,7 @@ class FirCallResolver(
functionCall.calleeReference, functionCall.calleeReference,
functionCall.calleeReference.name, functionCall.calleeReference.name,
result.candidates, result.candidates,
result.applicability result.applicability,
) )
val resultExpression = functionCall.transformCalleeReference(StoreNameReference, nameReference) val resultExpression = functionCall.transformCalleeReference(StoreNameReference, nameReference)
@@ -99,7 +99,7 @@ class FirCallResolver(
dispatchReceiver = candidate.dispatchReceiverExpression(), dispatchReceiver = candidate.dispatchReceiverExpression(),
extensionReceiver = candidate.extensionReceiverExpression(), extensionReceiver = candidate.extensionReceiverExpression(),
arguments = candidate.callInfo.arguments, arguments = candidate.callInfo.arguments,
safe = candidate.callInfo.isSafeCall safe = candidate.callInfo.isSafeCall,
) )
} else { } else {
resultExpression resultExpression
@@ -112,7 +112,7 @@ class FirCallResolver(
} }
private data class ResolutionResult( 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 { private fun collectCandidates(functionCall: FirFunctionCall): ResolutionResult {
@@ -129,12 +129,12 @@ class FirCallResolver(
typeArguments, typeArguments,
session, session,
file, file,
transformer.components.implicitReceiverStack transformer.components.implicitReceiverStack,
) )
towerResolver.reset() towerResolver.reset()
val result = towerResolver.runResolver( val result = towerResolver.runResolver(
implicitReceiverStack.receiversAsReversed(), implicitReceiverStack.receiversAsReversed(),
info info,
) )
val bestCandidates = result.bestCandidates() val bestCandidates = result.bestCandidates()
val reducedCandidates = if (result.currentApplicability < CandidateApplicability.SYNTHETIC_RESOLVED) { val reducedCandidates = if (result.currentApplicability < CandidateApplicability.SYNTHETIC_RESOLVED) {
@@ -168,12 +168,12 @@ class FirCallResolver(
emptyList(), emptyList(),
session, session,
file, file,
transformer.components.implicitReceiverStack transformer.components.implicitReceiverStack,
) )
towerResolver.reset() towerResolver.reset()
val result = towerResolver.runResolver( val result = towerResolver.runResolver(
implicitReceiverStack.receiversAsReversed(), implicitReceiverStack.receiversAsReversed(),
info info,
) )
val bestCandidates = result.bestCandidates() val bestCandidates = result.bestCandidates()
@@ -189,7 +189,7 @@ class FirCallResolver(
callee, callee,
callee.name, callee.name,
reducedCandidates, reducedCandidates,
result.currentApplicability result.currentApplicability,
) )
if (qualifiedAccess.explicitReceiver == null) { if (qualifiedAccess.explicitReceiver == null) {
@@ -214,10 +214,13 @@ class FirCallResolver(
when { when {
referencedSymbol is FirClassLikeSymbol<*> -> { referencedSymbol is FirClassLikeSymbol<*> -> {
val classId = referencedSymbol.classId val classId = referencedSymbol.classId
return FirResolvedQualifierImpl( return buildResolvedQualifier {
nameReference.source, classId.packageFqName, classId.relativeClassName, safe = false source = nameReference.source
).apply { packageFqName = classId.packageFqName
relativeClassFqName = classId.relativeClassName
safe = false
typeArguments.addAll(qualifiedAccess.typeArguments) typeArguments.addAll(qualifiedAccess.typeArguments)
}.apply {
resultType = if (classId.isLocal) { resultType = if (classId.isLocal) {
typeForQualifierByDeclaration(referencedSymbol.fir, resultType, session) typeForQualifierByDeclaration(referencedSymbol.fir, resultType, session)
?: session.builtinTypes.unitType ?: session.builtinTypes.unitType
@@ -227,8 +230,10 @@ class FirCallResolver(
} }
} }
referencedSymbol is FirTypeParameterSymbol && referencedSymbol.fir.isReified -> { referencedSymbol is FirTypeParameterSymbol && referencedSymbol.fir.isReified -> {
return FirResolvedReifiedParameterReferenceImpl(nameReference.source, referencedSymbol).apply { return buildResolvedReifiedParameterReference {
resultType = typeForReifiedParameterReference(this) source = nameReference.source
symbol = referencedSymbol
typeRef = typeForReifiedParameterReference(this)
} }
} }
} }
@@ -246,7 +251,7 @@ class FirCallResolver(
fun resolveCallableReference( fun resolveCallableReference(
constraintSystemBuilder: ConstraintSystemBuilder, constraintSystemBuilder: ConstraintSystemBuilder,
resolvedCallableReferenceAtom: ResolvedCallableReferenceAtom resolvedCallableReferenceAtom: ResolvedCallableReferenceAtom,
): Boolean { ): Boolean {
val callableReferenceAccess = resolvedCallableReferenceAtom.reference val callableReferenceAccess = resolvedCallableReferenceAtom.reference
val lhs = resolvedCallableReferenceAtom.lhs val lhs = resolvedCallableReferenceAtom.lhs
@@ -255,14 +260,14 @@ class FirCallResolver(
val info = createCallableReferencesInfoForLHS( val info = createCallableReferencesInfoForLHS(
callableReferenceAccess, lhs, callableReferenceAccess, lhs,
expectedType, constraintSystemBuilder expectedType, constraintSystemBuilder,
) )
// No reset here! // No reset here!
val result = towerResolver.runResolver( val result = towerResolver.runResolver(
implicitReceiverStack.receiversAsReversed(), implicitReceiverStack.receiversAsReversed(),
info, info,
collector = CandidateCollector(this, resolutionStageRunner), collector = CandidateCollector(this, resolutionStageRunner),
manager = TowerResolveManager(towerResolver) manager = TowerResolveManager(towerResolver),
) )
val bestCandidates = result.bestCandidates() val bestCandidates = result.bestCandidates()
val noSuccessfulCandidates = result.currentApplicability < CandidateApplicability.SYNTHETIC_RESOLVED val noSuccessfulCandidates = result.currentApplicability < CandidateApplicability.SYNTHETIC_RESOLVED
@@ -298,7 +303,7 @@ class FirCallResolver(
fun resolveDelegatingConstructorCall( fun resolveDelegatingConstructorCall(
delegatedConstructorCall: FirDelegatedConstructorCall, delegatedConstructorCall: FirDelegatedConstructorCall,
symbol: FirClassSymbol<*>, symbol: FirClassSymbol<*>,
typeArguments: List<FirTypeProjection> typeArguments: List<FirTypeProjection>,
): FirDelegatedConstructorCall? { ): FirDelegatedConstructorCall? {
val scope = symbol.fir.unsubstitutedScope(session, scopeSession) val scope = symbol.fir.unsubstitutedScope(session, scopeSession)
val className = symbol.classId.shortClassName val className = symbol.classId.shortClassName
@@ -311,7 +316,7 @@ class FirCallResolver(
typeArguments = typeArguments, typeArguments = typeArguments,
session, session,
file, file,
implicitReceiverStack implicitReceiverStack,
) )
val candidateFactory = CandidateFactory(this, callInfo) val candidateFactory = CandidateFactory(this, callInfo)
val candidates = mutableListOf<Candidate>() val candidates = mutableListOf<Candidate>()
@@ -325,7 +330,7 @@ class FirCallResolver(
} }
private fun <T> selectCandidateFromGivenCandidates( private fun <T> selectCandidateFromGivenCandidates(
call: T, name: Name, candidates: Collection<Candidate> call: T, name: Name, candidates: Collection<Candidate>,
): T where T : FirResolvable, T : FirCall { ): T where T : FirResolvable, T : FirCall {
val result = CandidateCollector(this, resolutionStageRunner) val result = CandidateCollector(this, resolutionStageRunner)
candidates.forEach { result.consumeCandidate(TowerGroup.Start, it) } candidates.forEach { result.consumeCandidate(TowerGroup.Start, it) }
@@ -340,7 +345,7 @@ class FirCallResolver(
call.calleeReference, call.calleeReference,
name, name,
reducedCandidates, reducedCandidates,
result.currentApplicability result.currentApplicability,
) )
return call.transformCalleeReference(StoreNameReference, nameReference) as T return call.transformCalleeReference(StoreNameReference, nameReference) as T
@@ -350,7 +355,7 @@ class FirCallResolver(
callableReferenceAccess: FirCallableReferenceAccess, callableReferenceAccess: FirCallableReferenceAccess,
lhs: DoubleColonLHS?, lhs: DoubleColonLHS?,
expectedType: ConeKotlinType?, expectedType: ConeKotlinType?,
outerConstraintSystemBuilder: ConstraintSystemBuilder? outerConstraintSystemBuilder: ConstraintSystemBuilder?,
): CallInfo { ): CallInfo {
return CallInfo( return CallInfo(
CallKind.CallableReference, CallKind.CallableReference,
@@ -366,9 +371,12 @@ class FirCallResolver(
expectedType, expectedType,
outerConstraintSystemBuilder, outerConstraintSystemBuilder,
lhs, lhs,
stubReceiver = if (lhs !is DoubleColonLHS.Type) null else FirExpressionStub(callableReferenceAccess.source).apply { stubReceiver = if (lhs !is DoubleColonLHS.Type) null else buildExpressionStub {
replaceTypeRef(FirResolvedTypeRefImpl(null, lhs.type)) source = callableReferenceAccess.source
} typeRef = buildResolvedTypeRef {
type = lhs.type
}
},
) )
} }
@@ -376,40 +384,54 @@ class FirCallResolver(
reference: FirReference, reference: FirReference,
name: Name, name: Name,
candidates: Collection<Candidate>, candidates: Collection<Candidate>,
applicability: CandidateApplicability applicability: CandidateApplicability,
): FirNamedReference { ): FirNamedReference {
val source = reference.source val source = reference.source
return when { return when {
candidates.isEmpty() -> FirErrorNamedReferenceImpl( candidates.isEmpty() -> buildErrorNamedReference {
source, FirUnresolvedNameError(name) this.source = source
) diagnostic = FirUnresolvedNameError(name)
}
applicability < CandidateApplicability.SYNTHETIC_RESOLVED -> { applicability < CandidateApplicability.SYNTHETIC_RESOLVED -> {
FirErrorNamedReferenceImpl( buildErrorNamedReference {
source, this.source = source
FirInapplicableCandidateError(applicability, candidates.map { diagnostic = FirInapplicableCandidateError(
FirInapplicableCandidateError.CandidateInfo( applicability,
it.symbol, candidates.map {
if (it.systemInitialized) it.system.diagnostics else emptyList() FirInapplicableCandidateError.CandidateInfo(
) it.symbol,
}) if (it.systemInitialized) it.system.diagnostics else emptyList(),
) )
},
)
}
} }
candidates.size == 1 -> { candidates.size == 1 -> {
val candidate = candidates.single() val candidate = candidates.single()
val coneSymbol = candidate.symbol val coneSymbol = candidate.symbol
when { when {
coneSymbol is FirBackingFieldSymbol -> FirBackingFieldReferenceImpl(source, null, coneSymbol) coneSymbol is FirBackingFieldSymbol -> buildBackingFieldReference {
this.source = source
resolvedSymbol = coneSymbol
}
coneSymbol is FirVariableSymbol && ( coneSymbol is FirVariableSymbol && (
coneSymbol !is FirPropertySymbol || coneSymbol !is FirPropertySymbol ||
(coneSymbol.phasedFir() as FirMemberDeclaration).typeParameters.isEmpty() (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 -> FirNamedReferenceWithCandidate(source, name, candidate)
} }
} }
else -> FirErrorNamedReferenceImpl( else -> buildErrorNamedReference {
source, FirAmbiguityError(name, candidates.map { it.symbol }) 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.FirQualifiedAccess
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
import org.jetbrains.kotlin.fir.expressions.FirStatement 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.references.impl.FirSimpleNamedReference
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
@@ -62,12 +62,14 @@ class FirQualifiedNameResolver(components: BodyResolveComponents) : BodyResolveC
if (resolved != null) { if (resolved != null) {
qualifierPartsToDrop = qualifierParts.size - 1 qualifierPartsToDrop = qualifierParts.size - 1
return FirResolvedQualifierImpl( return buildResolvedQualifier {
source, this.source = source
resolved.packageFqName, packageFqName = resolved.packageFqName
resolved.relativeClassFqName, relativeClassFqName = resolved.relativeClassFqName
safe = false safe = false
).apply { resultType = typeForQualifier(this) } }.apply {
resultType = typeForQualifier(this)
}
} }
return null return null
@@ -13,19 +13,19 @@ import org.jetbrains.kotlin.fir.declarations.collectEnumEntries
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall 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.FirExpression
import org.jetbrains.kotlin.fir.expressions.impl.* import org.jetbrains.kotlin.fir.expressions.builder.*
import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
import org.jetbrains.kotlin.fir.resolve.constructType import org.jetbrains.kotlin.fir.resolve.constructType
import org.jetbrains.kotlin.fir.resolve.diagnostics.FirUnresolvedSymbolError import org.jetbrains.kotlin.fir.resolve.diagnostics.FirUnresolvedSymbolError
import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
import org.jetbrains.kotlin.fir.expressions.FirConstKind
import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.Argument.Value.Type.* import org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.Argument.Value.Type.*
import org.jetbrains.kotlin.metadata.deserialization.Flags import org.jetbrains.kotlin.metadata.deserialization.Flags
@@ -87,21 +87,21 @@ abstract class AbstractAnnotationDeserializer(
val name = nameResolver.getName(it.nameId) val name = nameResolver.getName(it.nameId)
val parameter = parameterByName[name] ?: return@mapNotNull null val parameter = parameterByName[name] ?: return@mapNotNull null
val value = resolveValue(parameter.returnTypeRef, it.value, nameResolver) ?: return@mapNotNull null val value = resolveValue(parameter.returnTypeRef, it.value, nameResolver) ?: return@mapNotNull null
FirNamedArgumentExpressionImpl( buildNamedArgumentExpression {
null, value, false, name expression = value
) isSpread = false
this.name = name
}
} }
} }
} }
return FirAnnotationCallImpl( return buildAnnotationCall {
null, null, annotationTypeRef = symbol?.let {
symbol?.let { buildResolvedTypeRef {
FirResolvedTypeRefImpl( type = it.constructType(emptyList(), isNullable = false)
null, it.constructType(emptyList(), isNullable = false) }
) } ?: buildErrorTypeRef { diagnostic =FirUnresolvedSymbolError(classId) }
} ?: FirErrorTypeRefImpl(null, FirUnresolvedSymbolError(classId))
).apply {
this.arguments += arguments this.arguments += arguments
} }
} }
@@ -122,16 +122,17 @@ abstract class AbstractAnnotationDeserializer(
BOOLEAN -> const(FirConstKind.Boolean, (value.intValue != 0L)) BOOLEAN -> const(FirConstKind.Boolean, (value.intValue != 0L))
STRING -> const(FirConstKind.String, nameResolver.getString(value.stringValue)) STRING -> const(FirConstKind.String, nameResolver.getString(value.stringValue))
ANNOTATION -> deserializeAnnotation(value.annotation, nameResolver) ANNOTATION -> deserializeAnnotation(value.annotation, nameResolver)
CLASS -> FirGetClassCallImpl(null).apply { CLASS -> buildGetClassCall {
val classId = nameResolver.getClassId(value.classId) val classId = nameResolver.getClassId(value.classId)
val lookupTag = ConeClassLikeLookupTagImpl(classId) val lookupTag = ConeClassLikeLookupTagImpl(classId)
val referencedType = lookupTag.constructType(emptyArray(), isNullable = false) val referencedType = lookupTag.constructType(emptyArray(), isNullable = false)
arguments += FirClassReferenceExpressionImpl( arguments += buildClassReferenceExpression {
null, classTypeRef = buildResolvedTypeRef {
FirResolvedTypeRefImpl(null, referencedType) type = referencedType
) }
}
} }
ENUM -> FirFunctionCallImpl(null).apply { ENUM -> buildFunctionCall {
val classId = nameResolver.getClassId(value.classId) val classId = nameResolver.getClassId(value.classId)
val entryName = nameResolver.getName(value.enumValueId) val entryName = nameResolver.getName(value.enumValueId)
@@ -142,11 +143,13 @@ abstract class AbstractAnnotationDeserializer(
val enumEntries = firClass?.collectEnumEntries() ?: emptyList() val enumEntries = firClass?.collectEnumEntries() ?: emptyList()
val enumEntrySymbol = enumEntries.find { it.name == entryName } val enumEntrySymbol = enumEntries.find { it.name == entryName }
this.calleeReference = enumEntrySymbol?.let { this.calleeReference = enumEntrySymbol?.let {
FirResolvedNamedReferenceImpl(null, entryName, it.symbol) buildResolvedNamedReference {
} ?: FirErrorNamedReferenceImpl( name = entryName
null, resolvedSymbol = it.symbol
FirSimpleDiagnostic("Strange deserialized enum value: $classId.$entryName", DiagnosticKind.DeserializationError) }
) } ?: buildErrorNamedReference {
diagnostic = FirSimpleDiagnostic("Strange deserialized enum value: $classId.$entryName", DiagnosticKind.DeserializationError)
}
} }
// ARRAY -> { // ARRAY -> {
// TODO: see AnnotationDeserializer // TODO: see AnnotationDeserializer
@@ -157,5 +160,5 @@ abstract class AbstractAnnotationDeserializer(
return result 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)
} }
@@ -11,16 +11,16 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.calculateSAM import org.jetbrains.kotlin.fir.calculateSAM
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.addDeclarations 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.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.scopes.KotlinScopeProvider
import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol 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.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.Flags import org.jetbrains.kotlin.metadata.deserialization.Flags
import org.jetbrains.kotlin.metadata.deserialization.NameResolver import org.jetbrains.kotlin.metadata.deserialization.NameResolver
@@ -57,28 +57,15 @@ fun deserializeClassToSymbol(
isInline = Flags.IS_INLINE_CLASS.get(classProto.flags) isInline = Flags.IS_INLINE_CLASS.get(classProto.flags)
} }
val isSealed = modality == Modality.SEALED val isSealed = modality == Modality.SEALED
val firClass = if (isSealed) { val classBuilder = if (isSealed) FirSealedClassBuilder() else FirClassImplBuilder()
FirSealedClassImpl( classBuilder.apply {
null, this.session = session
session, name = classId.shortClassName
status, this.status = status
ProtoEnumFlags.classKind(kind), classKind = ProtoEnumFlags.classKind(kind)
scopeProvider, this.scopeProvider = scopeProvider
classId.shortClassName, this.symbol = symbol
symbol
)
} else {
FirClassImpl(
null,
session,
status,
ProtoEnumFlags.classKind(kind),
scopeProvider,
classId.shortClassName,
symbol
)
}
firClass.apply {
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
val context = val context =
parentContext?.childContext( parentContext?.childContext(
@@ -102,7 +89,7 @@ fun deserializeClassToSymbol(
superTypesDeserialized.mapNotNullTo(superTypeRefs) { superTypesDeserialized.mapNotNullTo(superTypeRefs) {
if (it == null) return@mapNotNullTo null if (it == null) return@mapNotNullTo null
FirResolvedTypeRefImpl(null, it) buildResolvedTypeRef { type = it }
} }
addDeclarations(classProto.functionList.map(classDeserializer::loadFunction)) addDeclarations(classProto.functionList.map(classDeserializer::loadFunction))
@@ -126,17 +113,14 @@ fun deserializeClassToSymbol(
val enumEntryName = nameResolver.getName(enumEntryProto.name) val enumEntryName = nameResolver.getName(enumEntryProto.name)
val enumType = ConeClassLikeTypeImpl(symbol.toLookupTag(), emptyArray(), false) val enumType = ConeClassLikeTypeImpl(symbol.toLookupTag(), emptyArray(), false)
val property = FirEnumEntryImpl( val property = buildEnumEntry {
null, this.session = session
session, returnTypeRef = buildResolvedTypeRef { type = enumType }
FirResolvedTypeRefImpl(null, enumType), name = enumEntryName
enumEntryName, this.symbol = FirVariableSymbol(CallableId(classId, enumEntryName))
initializer = null, this.status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL).apply {
symbol = FirVariableSymbol(CallableId(classId, enumEntryName)),
status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL).apply {
isStatic = true isStatic = true
} }
).apply {
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
} }
@@ -145,10 +129,10 @@ fun deserializeClassToSymbol(
) )
if (isSealed) { if (isSealed) {
classProto.sealedSubclassFqNameList.mapTo((firClass as FirSealedClassImpl).inheritors) { classProto.sealedSubclassFqNameList.mapTo((this as FirSealedClassBuilder).inheritors) {
ClassId.fromString(nameResolver.getQualifiedClassName(it)) ClassId.fromString(nameResolver.getQualifiedClassName(it))
} }
} }
calculateSAM()
} }
firClass.calculateSAM()
} }
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.fir.deserialization
import org.jetbrains.kotlin.contracts.description.InvocationKind import org.jetbrains.kotlin.contracts.description.InvocationKind
import org.jetbrains.kotlin.fir.contracts.FirContractDescription 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.description.*
import org.jetbrains.kotlin.fir.contracts.impl.FirContractDescriptionImpl
import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.expressions.LogicOperationKind import org.jetbrains.kotlin.fir.expressions.LogicOperationKind
@@ -22,8 +22,8 @@ import org.jetbrains.kotlin.utils.addIfNotNull
class FirContractDeserializer(private val c: FirDeserializationContext) { class FirContractDeserializer(private val c: FirDeserializationContext) {
fun loadContract(proto: ProtoBuf.Contract, owner: FirContractDescriptionOwner): FirContractDescription? { fun loadContract(proto: ProtoBuf.Contract, owner: FirContractDescriptionOwner): FirContractDescription? {
val effects = proto.effectList.map { loadPossiblyConditionalEffect(it, owner) ?: return null } val effects = proto.effectList.map { loadPossiblyConditionalEffect(it, owner) ?: return null }
return FirContractDescriptionImpl(null).apply { return buildContractDescription {
this.effects.addAll(effects) this.effects += effects
} }
} }
@@ -9,20 +9,22 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* 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.declarations.impl.*
import org.jetbrains.kotlin.fir.expressions.FirExpression 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.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.FirTypeRef 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.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl 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.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.* import org.jetbrains.kotlin.metadata.deserialization.*
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
import org.jetbrains.kotlin.serialization.deserialization.getName import org.jetbrains.kotlin.serialization.deserialization.getName
class FirDeserializationContext( class FirDeserializationContext(
@@ -131,59 +133,50 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
val flags = proto.flags val flags = proto.flags
val name = c.nameResolver.getName(proto.name) val name = c.nameResolver.getName(proto.name)
val local = c.childContext(proto.typeParameterList) val local = c.childContext(proto.typeParameterList)
val status = FirDeclarationStatusImpl(ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)), Modality.FINAL).apply { return buildTypeAlias {
isExpect = Flags.IS_EXPECT_CLASS.get(flags) session = c.session
isActual = false this.name = name
} status = FirDeclarationStatusImpl(ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)), Modality.FINAL).apply {
return FirTypeAliasImpl( isExpect = Flags.IS_EXPECT_CLASS.get(flags)
null, isActual = false
c.session, }
status, symbol = FirTypeAliasSymbol(ClassId(c.packageFqName, name))
name, expandedTypeRef = buildResolvedTypeRef {
FirTypeAliasSymbol(ClassId(c.packageFqName, name)), type = local.typeDeserializer.type(proto.underlyingType(c.typeTable))
FirResolvedTypeRefImpl( }
null,
local.typeDeserializer.type(proto.underlyingType(c.typeTable))
)
).apply {
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir } 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 flags = if (proto.hasFlags()) proto.flags else loadOldFlags(proto.oldFlags)
val callableName = c.nameResolver.getName(proto.name) val callableName = c.nameResolver.getName(proto.name)
val symbol = FirPropertySymbol(CallableId(c.packageFqName, c.relativeClassName, callableName)) val symbol = FirPropertySymbol(CallableId(c.packageFqName, c.relativeClassName, callableName))
val local = c.childContext(proto.typeParameterList) val local = c.childContext(proto.typeParameterList)
val returnTypeRef = proto.returnType(c.typeTable).toTypeRef(local)
val getterFlags = if (proto.hasGetterFlags()) proto.getterFlags else flags val getterFlags = if (proto.hasGetterFlags()) proto.getterFlags else flags
val setterFlags = if (proto.hasSetterFlags()) proto.setterFlags else flags val setterFlags = if (proto.hasSetterFlags()) proto.setterFlags else flags
val isVar = Flags.IS_VAR.get(flags) val isVar = Flags.IS_VAR.get(flags)
val status = FirDeclarationStatusImpl( return buildProperty {
ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)), session = c.session
ProtoEnumFlags.modality(Flags.MODALITY.get(flags)) returnTypeRef = proto.returnType(c.typeTable).toTypeRef(local)
).apply { receiverTypeRef = proto.receiverType(c.typeTable)?.toTypeRef(local)
isExpect = Flags.IS_EXPECT_PROPERTY.get(flags) name = callableName
isActual = false this.isVar = isVar
isOverride = false this.symbol = symbol
isConst = Flags.IS_CONST.get(flags) isLocal = false
isLateInit = Flags.IS_LATEINIT.get(flags) status = FirDeclarationStatusImpl(
} ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)),
return FirPropertyImpl( ProtoEnumFlags.modality(Flags.MODALITY.get(flags))
null, ).apply {
c.session, isExpect = Flags.IS_EXPECT_PROPERTY.get(flags)
returnTypeRef, isActual = false
proto.receiverType(c.typeTable)?.toTypeRef(local), isOverride = false
callableName, isConst = Flags.IS_CONST.get(flags)
null, isLateInit = Flags.IS_LATEINIT.get(flags)
null, }
isVar,
symbol,
false,
status
).apply {
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir } typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir }
annotations += c.annotationDeserializer.loadPropertyAnnotations(proto, local.nameResolver) annotations += c.annotationDeserializer.loadPropertyAnnotations(proto, local.nameResolver)
@@ -191,10 +184,11 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
setter = if (isVar) { setter = if (isVar) {
FirDefaultPropertySetter(null, c.session, returnTypeRef, ProtoEnumFlags.visibility(Flags.VISIBILITY.get(setterFlags))) FirDefaultPropertySetter(null, c.session, returnTypeRef, ProtoEnumFlags.visibility(Flags.VISIBILITY.get(setterFlags)))
} else null } 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 flags = if (proto.hasFlags()) proto.flags else loadOldFlags(proto.oldFlags)
val receiverAnnotations = val receiverAnnotations =
@@ -208,99 +202,83 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
val callableName = c.nameResolver.getName(proto.name) val callableName = c.nameResolver.getName(proto.name)
val symbol = FirNamedFunctionSymbol(CallableId(c.packageFqName, c.relativeClassName, callableName)) val symbol = FirNamedFunctionSymbol(CallableId(c.packageFqName, c.relativeClassName, callableName))
val local = c.childContext(proto.typeParameterList) 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 // TODO: support contracts
val simpleFunction = FirSimpleFunctionImpl( val simpleFunction = buildSimpleFunction {
null, session = c.session
c.session, returnTypeRef = proto.returnType(local.typeTable).toTypeRef(local)
proto.returnType(local.typeTable).toTypeRef(local), receiverTypeRef = proto.receiverType(local.typeTable)?.toTypeRef(local)
proto.receiverType(local.typeTable)?.toTypeRef(local), name = callableName
status, status = FirDeclarationStatusImpl(
callableName, ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)),
symbol ProtoEnumFlags.modality(Flags.MODALITY.get(flags))
).apply { ).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 resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir } typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir }
valueParameters += local.memberDeserializer.valueParameters(proto.valueParameterList) valueParameters += local.memberDeserializer.valueParameters(proto.valueParameterList)
annotations += local.annotationDeserializer.loadFunctionAnnotations(proto, local.nameResolver) annotations += local.annotationDeserializer.loadFunctionAnnotations(proto, local.nameResolver)
this.containerSource = containerSource
} }
if (proto.hasContract()) { if (proto.hasContract()) {
val contractDescription = contractDeserializer.loadContract(proto.contract, simpleFunction) val contractDescription = contractDeserializer.loadContract(proto.contract, simpleFunction)
if (contractDescription != null) { if (contractDescription != null) {
simpleFunction.contractDescription = contractDescription simpleFunction.replaceContractDescription(contractDescription)
} }
} }
return simpleFunction return simpleFunction
} }
fun loadConstructor(proto: ProtoBuf.Constructor, klass: FirRegularClass): FirConstructor { fun loadConstructor(proto: ProtoBuf.Constructor, classBuilder: AbstractFirRegularClassBuilder): FirConstructor {
val flags = proto.flags val flags = proto.flags
val relativeClassName = c.relativeClassName!! val relativeClassName = c.relativeClassName!!
val symbol = FirConstructorSymbol(CallableId(c.packageFqName, relativeClassName, relativeClassName.shortName())) val symbol = FirConstructorSymbol(CallableId(c.packageFqName, relativeClassName, relativeClassName.shortName()))
val local = c.childContext(emptyList()) val local = c.childContext(emptyList())
val isPrimary = !Flags.IS_SECONDARY.get(flags) val isPrimary = !Flags.IS_SECONDARY.get(flags)
val typeParameters = klass.typeParameters val typeParameters = classBuilder.typeParameters
val delegatedSelfType = FirResolvedTypeRefImpl( val delegatedSelfType = buildResolvedTypeRef {
null, type = ConeClassLikeTypeImpl(
ConeClassLikeTypeImpl( classBuilder.symbol.toLookupTag(),
klass.symbol.toLookupTag(),
typeParameters.map { ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false) }.toTypedArray(), typeParameters.map { ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false) }.toTypedArray(),
false 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) { return if (isPrimary) {
FirPrimaryConstructorImpl( FirPrimaryConstructorBuilder()
null,
c.session,
delegatedSelfType,
null,
status,
symbol
)
} else { } else {
FirConstructorImpl( FirConstructorBuilder()
null,
c.session,
delegatedSelfType,
null,
status,
symbol
)
}.apply { }.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 resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
this.typeParameters += typeParameters this.typeParameters += typeParameters
valueParameters += local.memberDeserializer.valueParameters(proto.valueParameterList) valueParameters += local.memberDeserializer.valueParameters(proto.valueParameterList)
annotations += local.annotationDeserializer.loadConstructorAnnotations(proto, local.nameResolver) annotations += local.annotationDeserializer.loadConstructorAnnotations(proto, local.nameResolver)
} }.build()
} }
private fun defaultValue(flags: Int): FirExpression? { private fun defaultValue(flags: Int): FirExpression? {
if (Flags.DECLARES_DEFAULT_VALUE.get(flags)) { if (Flags.DECLARES_DEFAULT_VALUE.get(flags)) {
return FirExpressionStub(null) return buildExpressionStub()
} }
return null return null
} }
@@ -311,27 +289,23 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
return valueParameters.map { proto -> return valueParameters.map { proto ->
val flags = if (proto.hasFlags()) proto.flags else 0 val flags = if (proto.hasFlags()) proto.flags else 0
val name = c.nameResolver.getName(proto.name) val name = c.nameResolver.getName(proto.name)
FirValueParameterImpl( buildValueParameter {
null, session = c.session
c.session, returnTypeRef = proto.type(c.typeTable).toTypeRef(c)
proto.type(c.typeTable).toTypeRef(c), this.name = name
name, symbol = FirVariableSymbol(name)
FirVariableSymbol(name), defaultValue = defaultValue(flags)
defaultValue(flags), isCrossinline = Flags.IS_CROSSINLINE.get(flags)
isCrossinline = Flags.IS_CROSSINLINE.get(flags), isNoinline = Flags.IS_NOINLINE.get(flags)
isNoinline = Flags.IS_NOINLINE.get(flags),
isVararg = proto.varargElementType(c.typeTable) != null isVararg = proto.varargElementType(c.typeTable) != null
).apply {
annotations += c.annotationDeserializer.loadValueParameterAnnotations(proto, c.nameResolver) annotations += c.annotationDeserializer.loadValueParameterAnnotations(proto, c.nameResolver)
} }
}.toList() }.toList()
} }
private fun ProtoBuf.Type.toTypeRef(context: FirDeserializationContext): FirTypeRef { private fun ProtoBuf.Type.toTypeRef(context: FirDeserializationContext): FirTypeRef {
val coneType = context.typeDeserializer.type(this) return buildResolvedTypeRef {
return FirResolvedTypeRefImpl( type = context.typeDeserializer.type(this@toTypeRef)
null, coneType
).apply {
annotations += context.annotationDeserializer.loadTypeAnnotations(this@toTypeRef, context.nameResolver) annotations += context.annotationDeserializer.loadTypeAnnotations(this@toTypeRef, context.nameResolver)
} }
} }
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.fir.deserialization
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner
import org.jetbrains.kotlin.fir.declarations.addDefaultBoundIfNecessary 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.resolve.toTypeProjection
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag 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.FirClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.types.* 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.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl 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.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.* import org.jetbrains.kotlin.metadata.deserialization.*
import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags
@@ -35,6 +35,51 @@ class FirTypeDeserializer(
typeParameterProtos: List<ProtoBuf.TypeParameter>, typeParameterProtos: List<ProtoBuf.TypeParameter>,
val parent: FirTypeDeserializer? 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? { private fun computeClassifier(fqNameIndex: Int): ConeClassLikeLookupTag? {
try { try {
@@ -47,7 +92,6 @@ class FirTypeDeserializer(
fun type(proto: ProtoBuf.Type): ConeKotlinType { fun type(proto: ProtoBuf.Type): ConeKotlinType {
if (proto.hasFlexibleTypeCapabilitiesId()) { if (proto.hasFlexibleTypeCapabilitiesId()) {
val id = nameResolver.getString(proto.flexibleTypeCapabilitiesId)
val lowerBound = simpleType(proto) val lowerBound = simpleType(proto)
val upperBound = simpleType(proto.flexibleUpperBound(typeTable)!!) val upperBound = simpleType(proto.flexibleUpperBound(typeTable)!!)
return ConeFlexibleType(lowerBound!!, upperBound!!) return ConeFlexibleType(lowerBound!!, upperBound!!)
@@ -57,7 +101,6 @@ class FirTypeDeserializer(
return simpleType(proto) ?: ConeKotlinErrorType("?!id:0") return simpleType(proto) ?: ConeKotlinErrorType("?!id:0")
} }
private fun typeParameterSymbol(typeParameterId: Int): ConeTypeParameterLookupTag? = private fun typeParameterSymbol(typeParameterId: Int): ConeTypeParameterLookupTag? =
typeParameterDescriptors[typeParameterId]?.toLookupTag() ?: parent?.typeParameterSymbol(typeParameterId) 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> = fun FirClassLikeSymbol<*>.typeParameters(): List<FirTypeParameterSymbol> =
(fir as? FirTypeParametersOwner)?.typeParameters?.map { it.symbol }.orEmpty() (fir as? FirTypeParametersOwner)?.typeParameters?.map { it.symbol }.orEmpty()
@@ -146,9 +149,7 @@ class FirTypeDeserializer(
proto.hasTypeParameter() -> typeParameterSymbol(proto.typeParameter) proto.hasTypeParameter() -> typeParameterSymbol(proto.typeParameter)
proto.hasTypeParameterName() -> { proto.hasTypeParameterName() -> {
val name = nameResolver.getString(proto.typeParameterName) val name = nameResolver.getString(proto.typeParameterName)
typeParameterNames[name]?.toLookupTag()
// TODO: Optimize
ownTypeParameters.find { it.name.asString() == name }?.toLookupTag()
} }
else -> null 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.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.FirStubDiagnostic import org.jetbrains.kotlin.fir.diagnostics.FirStubDiagnostic
import org.jetbrains.kotlin.fir.expressions.* 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.expressions.impl.FirExpressionWithSmartcastImpl
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference 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.*
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.* 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.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl 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.name.Name
import org.jetbrains.kotlin.types.AbstractStrictEqualityTypeChecker import org.jetbrains.kotlin.types.AbstractStrictEqualityTypeChecker
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
@@ -65,7 +67,7 @@ fun ConeClassLikeLookupTag.toSymbol(useSiteSession: FirSession): FirClassLikeSym
fun ConeClassLikeType.fullyExpandedType( fun ConeClassLikeType.fullyExpandedType(
useSiteSession: FirSession, useSiteSession: FirSession,
expandedConeType: (FirTypeAlias) -> ConeClassLikeType? = FirTypeAlias::expandedConeType expandedConeType: (FirTypeAlias) -> ConeClassLikeType? = FirTypeAlias::expandedConeType,
): ConeClassLikeType { ): ConeClassLikeType {
if (this is ConeClassLikeTypeImpl) { if (this is ConeClassLikeTypeImpl) {
val expandedTypeAndSession = cachedExpandedType val expandedTypeAndSession = cachedExpandedType
@@ -83,7 +85,7 @@ fun ConeClassLikeType.fullyExpandedType(
private fun ConeClassLikeType.fullyExpandedTypeNoCache( private fun ConeClassLikeType.fullyExpandedTypeNoCache(
useSiteSession: FirSession, useSiteSession: FirSession,
expandedConeType: (FirTypeAlias) -> ConeClassLikeType? expandedConeType: (FirTypeAlias) -> ConeClassLikeType?,
): ConeClassLikeType { ): ConeClassLikeType {
val directExpansionType = directExpansionType(useSiteSession, expandedConeType) ?: return this val directExpansionType = directExpansionType(useSiteSession, expandedConeType) ?: return this
return directExpansionType.fullyExpandedType(useSiteSession, expandedConeType) return directExpansionType.fullyExpandedType(useSiteSession, expandedConeType)
@@ -91,7 +93,7 @@ private fun ConeClassLikeType.fullyExpandedTypeNoCache(
fun ConeClassLikeType.directExpansionType( fun ConeClassLikeType.directExpansionType(
useSiteSession: FirSession, useSiteSession: FirSession,
expandedConeType: (FirTypeAlias) -> ConeClassLikeType? = FirTypeAlias::expandedConeType expandedConeType: (FirTypeAlias) -> ConeClassLikeType? = FirTypeAlias::expandedConeType,
): ConeClassLikeType? { ): ConeClassLikeType? {
val typeAlias = lookupTag val typeAlias = lookupTag
.toSymbol(useSiteSession) .toSymbol(useSiteSession)
@@ -105,7 +107,7 @@ fun ConeClassLikeType.directExpansionType(
private fun mapTypeAliasArguments( private fun mapTypeAliasArguments(
typeAlias: FirTypeAlias, typeAlias: FirTypeAlias,
abbreviatedType: ConeClassLikeType, abbreviatedType: ConeClassLikeType,
resultingType: ConeClassLikeType resultingType: ConeClassLikeType,
): ConeKotlinType { ): ConeKotlinType {
val typeAliasMap = typeAlias.typeParameters.map { it.symbol }.zip(abbreviatedType.typeArguments).toMap() 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 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) return ConeClassLikeTypeImpl(this, typeArguments, isNullable)
} }
@@ -165,7 +170,7 @@ fun FirClassifierSymbol<*>.constructType(typeArguments: Array<ConeKotlinTypeProj
ConeClassLikeTypeImpl( ConeClassLikeTypeImpl(
this.toLookupTag(), this.toLookupTag(),
typeArguments = typeArguments, typeArguments = typeArguments,
isNullable = isNullable isNullable = isNullable,
) )
} }
else -> error("!") else -> error("!")
@@ -178,7 +183,7 @@ fun FirClassifierSymbol<*>.constructType(parts: List<FirQualifierPart>, isNullab
fun FirClassifierSymbol<*>.constructType( fun FirClassifierSymbol<*>.constructType(
parts: List<FirQualifierPart>, parts: List<FirQualifierPart>,
isNullable: Boolean, isNullable: Boolean,
symbolOriginSession: FirSession symbolOriginSession: FirSession,
): ConeKotlinType = ): ConeKotlinType =
constructType(parts.toTypeProjections(), isNullable) constructType(parts.toTypeProjections(), isNullable)
.also { .also {
@@ -211,7 +216,7 @@ private fun List<FirQualifierPart>.toTypeProjections(): Array<ConeKotlinTypeProj
fun coneFlexibleOrSimpleType( fun coneFlexibleOrSimpleType(
typeContext: ConeInferenceContext?, typeContext: ConeInferenceContext?,
lowerBound: ConeKotlinType, lowerBound: ConeKotlinType,
upperBound: ConeKotlinType upperBound: ConeKotlinType,
): ConeKotlinType { ): ConeKotlinType {
if (lowerBound is ConeFlexibleType) { if (lowerBound is ConeFlexibleType) {
return coneFlexibleOrSimpleType(typeContext, lowerBound.lowerBound, upperBound) return coneFlexibleOrSimpleType(typeContext, lowerBound.lowerBound, upperBound)
@@ -296,14 +301,17 @@ fun FirFunction<*>.constructFunctionalTypeRef(session: FirSession): FirResolvedT
val functionalType = createFunctionalType(parameters, receiverTypeRef?.coneTypeSafe(), rawReturnType) val functionalType = createFunctionalType(parameters, receiverTypeRef?.coneTypeSafe(), rawReturnType)
return FirResolvedTypeRefImpl(source, functionalType) return buildResolvedTypeRef {
source = this@constructFunctionalTypeRef.source
type = functionalType
}
} }
fun createFunctionalType( fun createFunctionalType(
parameters: List<ConeKotlinType>, parameters: List<ConeKotlinType>,
receiverType: ConeKotlinType?, receiverType: ConeKotlinType?,
rawReturnType: ConeKotlinType, rawReturnType: ConeKotlinType,
isKFunctionType: Boolean = false isKFunctionType: Boolean = false,
): ConeLookupTagBasedType { ): ConeLookupTagBasedType {
val receiverAndParameterTypes = listOfNotNull(receiverType) + parameters + listOf(rawReturnType) val receiverAndParameterTypes = listOfNotNull(receiverType) + parameters + listOf(rawReturnType)
@@ -315,7 +323,7 @@ fun createFunctionalType(
fun createKPropertyType( fun createKPropertyType(
receiverType: ConeKotlinType?, receiverType: ConeKotlinType?,
rawReturnType: ConeKotlinType, rawReturnType: ConeKotlinType,
isMutable: Boolean isMutable: Boolean,
): ConeLookupTagBasedType { ): ConeLookupTagBasedType {
val arguments = if (receiverType != null) listOf(receiverType, rawReturnType) else listOf(rawReturnType) val arguments = if (receiverType != null) listOf(receiverType, rawReturnType) else listOf(rawReturnType)
val classId = StandardClassIds.reflectByName("K${if (isMutable) "Mutable" else ""}Property${arguments.size - 1}") 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 val resultType = resolvedQualifier.resultType
if (classId != null) { if (classId != null) {
val classSymbol = symbolProvider.getClassLikeSymbolByFqName(classId) 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 val declaration = classSymbol.phasedFir
if (declaration !is FirTypeAlias || resolvedQualifier.typeArguments.isEmpty()) { if (declaration !is FirTypeAlias || resolvedQualifier.typeArguments.isEmpty()) {
typeForQualifierByDeclaration(declaration, resultType, session)?.let { return it } typeForQualifierByDeclaration(declaration, resultType, session)?.let { return it }
@@ -337,9 +347,9 @@ fun BodyResolveComponents.typeForQualifier(resolvedQualifier: FirResolvedQualifi
return session.builtinTypes.unitType return session.builtinTypes.unitType
} }
internal fun typeForReifiedParameterReference(parameterReference: FirResolvedReifiedParameterReference): FirTypeRef { internal fun typeForReifiedParameterReference(parameterReferenceBuilder: FirResolvedReifiedParameterReferenceBuilder): FirTypeRef {
val resultType = parameterReference.resultType val resultType = parameterReferenceBuilder.typeRef
val typeParameterSymbol = parameterReference.symbol val typeParameterSymbol = parameterReferenceBuilder.symbol
return resultType.resolvedTypeFromPrototype(typeParameterSymbol.constructType(emptyArray(), false)) return resultType.resolvedTypeFromPrototype(typeParameterSymbol.constructType(emptyArray(), false))
} }
@@ -351,13 +361,13 @@ internal fun typeForQualifierByDeclaration(declaration: FirDeclaration, resultTy
if (declaration is FirRegularClass) { if (declaration is FirRegularClass) {
if (declaration.classKind == ClassKind.OBJECT) { if (declaration.classKind == ClassKind.OBJECT) {
return resultType.resolvedTypeFromPrototype( return resultType.resolvedTypeFromPrototype(
declaration.symbol.constructType(emptyArray(), false) declaration.symbol.constructType(emptyArray(), false),
) )
} else { } else {
val companionObject = declaration.companionObject val companionObject = declaration.companionObject
if (companionObject != null) { if (companionObject != null) {
return resultType.resolvedTypeFromPrototype( 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) { return when (val newCallee = access.calleeReference) {
is FirErrorNamedReference -> is FirErrorNamedReference ->
FirErrorTypeRefImpl(access.source, FirStubDiagnostic(newCallee.diagnostic)) buildErrorTypeRef {
source = access.source
diagnostic = FirStubDiagnostic(newCallee.diagnostic)
}
is FirNamedReferenceWithCandidate -> { is FirNamedReferenceWithCandidate -> {
typeFromSymbol(newCallee.candidateSymbol, makeNullable) typeFromSymbol(newCallee.candidateSymbol, makeNullable)
} }
@@ -395,10 +408,16 @@ fun <T : FirResolvable> BodyResolveComponents.typeFromCallee(access: T): FirReso
is FirThisReference -> { is FirThisReference -> {
val labelName = newCallee.labelName val labelName = newCallee.labelName
val implicitReceiver = implicitReceiverStack[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 -> { 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") else -> error("Failed to extract type from: $newCallee")
} }
@@ -410,7 +429,7 @@ private fun BodyResolveComponents.typeFromSymbol(symbol: AbstractFirBasedSymbol<
val returnType = returnTypeCalculator.tryCalculateReturnType(symbol.phasedFir) val returnType = returnTypeCalculator.tryCalculateReturnType(symbol.phasedFir)
if (makeNullable) { if (makeNullable) {
returnType.withReplacedConeType( returnType.withReplacedConeType(
returnType.coneTypeUnsafe<ConeKotlinType>().withNullability(ConeNullability.NULLABLE, session.inferenceContext) returnType.coneTypeUnsafe<ConeKotlinType>().withNullability(ConeNullability.NULLABLE, session.inferenceContext),
) )
} else { } else {
returnType returnType
@@ -419,9 +438,10 @@ private fun BodyResolveComponents.typeFromSymbol(symbol: AbstractFirBasedSymbol<
is FirClassifierSymbol<*> -> { is FirClassifierSymbol<*> -> {
val fir = (symbol as? AbstractFirBasedSymbol<*>)?.phasedFir val fir = (symbol as? AbstractFirBasedSymbol<*>)?.phasedFir
// TODO: unhack // TODO: unhack
FirResolvedTypeRefImpl( buildResolvedTypeRef {
null, symbol.constructType(emptyArray(), isNullable = false) source = null
) type = symbol.constructType(emptyArray(), isNullable = false)
}
} }
else -> error("WTF ! $symbol") else -> error("WTF ! $symbol")
} }
@@ -434,7 +454,9 @@ fun BodyResolveComponents.transformQualifiedAccessUsingSmartcastInfo(qualifiedAc
} }
val intersectedType = ConeTypeIntersector.intersectTypes(inferenceComponents.ctx as ConeInferenceContext, allTypes) val intersectedType = ConeTypeIntersector.intersectTypes(inferenceComponents.ctx as ConeInferenceContext, allTypes)
// TODO: add check that intersectedType is not equal to original type // 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 annotations += qualifiedAccessExpression.resultType.annotations
} }
return FirExpressionWithSmartcastImpl(qualifiedAccessExpression, intersectedTypeRef, typesFromSmartCast) 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.FirSession
import org.jetbrains.kotlin.fir.FirSessionComponent import org.jetbrains.kotlin.fir.FirSessionComponent
import org.jetbrains.kotlin.fir.declarations.* 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.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.inferenceContext
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticFunctionSymbol import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticFunctionSymbol
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap 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.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.* 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.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl 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.ClassId
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
@@ -43,7 +43,7 @@ val SAM_PARAMETER_NAME = Name.identifier("block")
class FirSamResolverImpl( class FirSamResolverImpl(
private val firSession: FirSession, private val firSession: FirSession,
private val scopeSession: ScopeSession private val scopeSession: ScopeSession,
) : FirSamResolver { ) : FirSamResolver {
private val resolvedFunctionType: MutableMap<FirRegularClass, Any> = mutableMapOf() private val resolvedFunctionType: MutableMap<FirRegularClass, Any> = mutableMapOf()
@@ -54,13 +54,14 @@ class FirSamResolverImpl(
is ConeClassLikeType -> getFunctionTypeForPossibleSamType(type) is ConeClassLikeType -> getFunctionTypeForPossibleSamType(type)
is ConeFlexibleType -> ConeFlexibleType( is ConeFlexibleType -> ConeFlexibleType(
getFunctionTypeForPossibleSamType(type.lowerBound) ?: return null, getFunctionTypeForPossibleSamType(type.lowerBound) ?: return null,
getFunctionTypeForPossibleSamType(type.upperBound) ?: return null getFunctionTypeForPossibleSamType(type.upperBound) ?: return null,
) )
is ConeClassErrorType, is ConeStubType -> null is ConeClassErrorType, is ConeStubType -> null
// TODO: support those types as well // TODO: support those types as well
is ConeTypeParameterType, is ConeTypeVariableType, is ConeTypeParameterType, is ConeTypeVariableType,
is ConeCapturedType, is ConeDefinitelyNotNullType, is ConeIntersectionType, 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 // TODO: Thing of getting rid of this branch since ConeLookupTagBasedType should be a sealed class
is ConeLookupTagBasedType -> null is ConeLookupTagBasedType -> null
} }
@@ -78,12 +79,14 @@ class FirSamResolverImpl(
substitutorByMap( substitutorByMap(
firRegularClass.typeParameters firRegularClass.typeParameters
.map { it.symbol } .map { it.symbol }
.zip(type.typeArguments.map { .zip(
(it as? ConeTypedProjection)?.type type.typeArguments.map {
?: firSession.builtinTypes.nullableAnyType.type (it as? ConeTypedProjection)?.type
//ConeClassLikeTypeImpl(ConeClassLikeLookupTagImpl(StandardClassIds.Any), emptyArray(), isNullable = true) ?: firSession.builtinTypes.nullableAnyType.type
}) //ConeClassLikeTypeImpl(ConeClassLikeLookupTagImpl(StandardClassIds.Any), emptyArray(), isNullable = true)
.toMap() },
)
.toMap(),
) )
val result = val result =
@@ -112,19 +115,18 @@ class FirSamResolverImpl(
CallableId( CallableId(
classId.packageFqName, classId.packageFqName,
classId.relativeClassName.parent().takeIf { !it.isRoot }, classId.relativeClassName.parent().takeIf { !it.isRoot },
classId.shortClassName classId.shortClassName,
) ),
) )
val newTypeParameters = firRegularClass.typeParameters.map { typeParameter -> val newTypeParameters = firRegularClass.typeParameters.map { typeParameter ->
FirTypeParameterImpl( FirTypeParameterBuilder().apply {
typeParameter.source, source = typeParameter.source
firSession, session = firSession
typeParameter.name, name = typeParameter.name
FirTypeParameterSymbol(), this.symbol = FirTypeParameterSymbol()
Variance.INVARIANT, variance = Variance.INVARIANT
isReified = false isReified = false
).apply {
annotations += typeParameter.annotations annotations += typeParameter.annotations
} }
} }
@@ -136,59 +138,57 @@ class FirSamResolverImpl(
val substitutor = substitutorByMap( val substitutor = substitutorByMap(
firRegularClass.typeParameters firRegularClass.typeParameters
.map { it.symbol } .map { it.symbol }
.zip(newTypeParameterTypes).toMap() .zip(newTypeParameterTypes).toMap(),
) )
for ((newTypeParameter, oldTypeParameter) in newTypeParameters.zip(firRegularClass.typeParameters)) { for ((newTypeParameter, oldTypeParameter) in newTypeParameters.zip(firRegularClass.typeParameters)) {
newTypeParameter.bounds += oldTypeParameter.bounds.mapNotNull { typeRef -> newTypeParameter.bounds += oldTypeParameter.bounds.mapNotNull { typeRef ->
FirResolvedTypeRefImpl( buildResolvedTypeRef {
typeRef.source, source = typeRef.source
substitutor.substituteOrSelf(typeRef.coneTypeSafe() ?: return@mapNotNull null) type = substitutor.substituteOrSelf(typeRef.coneTypeSafe() ?: return@mapNotNull null)
) }
} }
} }
val substitutedFunctionType = substitutor.substituteOrSelf(functionType) val substitutedFunctionType = substitutor.substituteOrSelf(functionType)
val substitutedReturnType = val substitutedReturnType =
ConeClassLikeTypeImpl( ConeClassLikeTypeImpl(
firRegularClass.symbol.toLookupTag(), newTypeParameterTypes.toTypedArray(), isNullable = false firRegularClass.symbol.toLookupTag(), newTypeParameterTypes.toTypedArray(), isNullable = false,
) )
val status = FirDeclarationStatusImpl(firRegularClass.visibility, Modality.FINAL).apply { return buildSimpleFunction {
isExpect = firRegularClass.isExpect session = firSession
isActual = firRegularClass.isActual returnTypeRef = buildResolvedTypeRef {
isOverride = false source = null
isOperator = false type = substitutedReturnType
isInfix = false }
isExternal = false name = classId.shortClassName
isInline = false status = FirDeclarationStatusImpl(firRegularClass.visibility, Modality.FINAL).apply {
isSuspend = false isExpect = firRegularClass.isExpect
isTailRec = false 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( typeParameters += newTypeParameters.map { it.build() }
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
resolvePhase = FirResolvePhase.BODY_RESOLVE resolvePhase = FirResolvePhase.BODY_RESOLVE
} }
} }
@@ -210,7 +210,7 @@ class FirSamResolverImpl(
private fun FirRegularClass.getSingleAbstractMethodOrNull( private fun FirRegularClass.getSingleAbstractMethodOrNull(
session: FirSession, session: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession,
): FirSimpleFunction? { ): FirSimpleFunction? {
// TODO: restrict to Java interfaces // TODO: restrict to Java interfaces
if (classKind != ClassKind.INTERFACE || hasMoreThenOneAbstractFunctionOrHasAbstractProperty()) return null if (classKind != ClassKind.INTERFACE || hasMoreThenOneAbstractFunctionOrHasAbstractProperty()) return null
@@ -247,7 +247,7 @@ private fun FirRegularClass.computeSamCandidateNames(session: FirSession): Set<N
private fun FirRegularClass.findSingleAbstractMethodByNames( private fun FirRegularClass.findSingleAbstractMethodByNames(
session: FirSession, session: FirSession,
scopeSession: ScopeSession, scopeSession: ScopeSession,
samCandidateNames: Set<Name> samCandidateNames: Set<Name>,
): FirSimpleFunction? { ): FirSimpleFunction? {
if (status.isNotSAM) return null if (status.isNotSAM) return null
@@ -351,6 +351,6 @@ private fun FirSimpleFunction.getFunctionTypeForAbstractMethod(): ConeLookupTagB
return createFunctionalType( return createFunctionalType(
parameterTypes, receiverType = null, 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"),
) )
} }
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.fir.resolve.calls
import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.progress.ProcessCanceledException
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirConstructorImpl import org.jetbrains.kotlin.fir.declarations.builder.buildConstructor
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
@@ -223,29 +223,28 @@ private fun prepareSubstitutingScopeForTypeAliasConstructors(
expandedType, expandedType,
session session
) factory@{ newReturnType, newParameterTypes, newTypeParameters -> ) factory@{ newReturnType, newParameterTypes, newTypeParameters ->
FirConstructorImpl( buildConstructor {
source, session, source = this@factory.source
returnTypeRef.withReplacedConeType(newReturnType), this.session = session
receiverTypeRef, status, returnTypeRef = this@factory.returnTypeRef.withReplacedConeType(newReturnType)
FirConstructorSymbol(symbol.callableId, overriddenSymbol = symbol) receiverTypeRef = this@factory.receiverTypeRef
).apply { status = this@factory.status
symbol = FirConstructorSymbol(this@factory.symbol.callableId, overriddenSymbol = this@factory.symbol)
resolvePhase = this@factory.resolvePhase resolvePhase = this@factory.resolvePhase
valueParameters += valueParameters +=
this@factory.valueParameters.zip( this@factory.valueParameters.zip(
newParameterTypes newParameterTypes
) { valueParameter, newParameterType -> ) { valueParameter, newParameterType ->
with(valueParameter) { buildValueParameter {
FirValueParameterImpl( source = valueParameter.source
source, this.session = session
session, returnTypeRef = valueParameter.returnTypeRef.withReplacedConeType(newParameterType)
returnTypeRef.withReplacedConeType(newParameterType), name = valueParameter.name
name, symbol = FirVariableSymbol(valueParameter.symbol.callableId)
FirVariableSymbol(valueParameter.symbol.callableId), defaultValue = valueParameter.defaultValue
defaultValue, isCrossinline = valueParameter.isCrossinline
isCrossinline, isNoinline = valueParameter.isNoinline
isNoinline, isVararg = valueParameter.isVararg
isVararg
)
} }
} }
this.typeParameters += newTypeParameters this.typeParameters += newTypeParameters
@@ -5,11 +5,13 @@
package org.jetbrains.kotlin.fir.resolve.calls package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@UseExperimental(FirImplementationDetail::class)
class FirNamedReferenceWithCandidate( class FirNamedReferenceWithCandidate(
source: FirSourceElement?, source: FirSourceElement?,
name: Name, name: Name,
@@ -6,24 +6,30 @@
package org.jetbrains.kotlin.fir.resolve.calls package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.FirSession 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.FirTypeParametersOwner
import org.jetbrains.kotlin.fir.declarations.expandedConeType
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirThisReceiverExpressionImpl import org.jetbrains.kotlin.fir.expressions.builder.buildThisReceiverExpression
import org.jetbrains.kotlin.fir.references.impl.FirImplicitThisReference import org.jetbrains.kotlin.fir.references.builder.buildImplicitThisReference
import org.jetbrains.kotlin.fir.renderWithType import org.jetbrains.kotlin.fir.renderWithType
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.constructType import org.jetbrains.kotlin.fir.resolve.constructType
import org.jetbrains.kotlin.fir.resolve.scope import org.jetbrains.kotlin.fir.resolve.scope
import org.jetbrains.kotlin.fir.scopes.FirScope 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.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol 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.ConeKotlinErrorType
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.ConeStarProjection 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.coneTypeSafe
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl import org.jetbrains.kotlin.name.ClassId
interface Receiver { interface Receiver {
fun scope(useSiteSession: FirSession, scopeSession: ScopeSession): FirScope? fun scope(useSiteSession: FirSession, scopeSession: ScopeSession): FirScope?
@@ -39,8 +45,13 @@ interface ReceiverValue : Receiver {
} }
private fun receiverExpression(symbol: AbstractFirBasedSymbol<*>, type: ConeKotlinType): FirExpression = private fun receiverExpression(symbol: AbstractFirBasedSymbol<*>, type: ConeKotlinType): FirExpression =
FirThisReceiverExpressionImpl(null, FirImplicitThisReference(symbol)).apply { buildThisReceiverExpression {
typeRef = FirResolvedTypeRefImpl(null, type) calleeReference = buildImplicitThisReference {
boundSymbol = symbol
}
typeRef = buildResolvedTypeRef {
this.type = type
}
} }
class ClassDispatchReceiverValue(klassSymbol: FirClassSymbol<*>) : ReceiverValue { 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.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.impl.FirImportImpl import org.jetbrains.kotlin.fir.declarations.builder.buildImport
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl import org.jetbrains.kotlin.fir.declarations.builder.buildResolvedImport
import org.jetbrains.kotlin.fir.declarations.isCompanion import org.jetbrains.kotlin.fir.declarations.isCompanion
import org.jetbrains.kotlin.fir.declarations.isInner import org.jetbrains.kotlin.fir.declarations.isInner
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -89,11 +89,13 @@ class FirTowerResolver(
listOf( listOf(
FirExplicitSimpleImportingScope( FirExplicitSimpleImportingScope(
listOf( listOf(
FirResolvedImportImpl( buildResolvedImport {
FirImportImpl(source = null, importedFqName = FqName.topLevel(info.name), isAllUnder = false, aliasName = null), delegate = buildImport {
resolvedQualifier.packageFqName, importedFqName = FqName.topLevel(info.name)
relativeClassName = null isAllUnder = false
) }
packageFqName = resolvedQualifier.packageFqName
}
), session, components.scopeSession ), session, components.scopeSession
) )
) )
@@ -9,11 +9,11 @@ import org.jetbrains.kotlin.fir.FirCallResolver
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirStatement 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.diagnostics.FirUnresolvedReferenceError
import org.jetbrains.kotlin.fir.resolve.transformers.StoreNameReference import org.jetbrains.kotlin.fir.resolve.transformers.StoreNameReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType 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.InferenceSession
import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzer import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzer
import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystemConstraintPosition import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystemConstraintPosition
@@ -78,10 +78,10 @@ class PostponedArgumentsAnalyzer(
val namedReference = when { val namedReference = when {
candidate == null || applicability < CandidateApplicability.SYNTHETIC_RESOLVED -> candidate == null || applicability < CandidateApplicability.SYNTHETIC_RESOLVED ->
FirErrorNamedReferenceImpl( buildErrorNamedReference {
callableReferenceAccess.source, source = callableReferenceAccess.source
FirUnresolvedReferenceError(callableReferenceAccess.calleeReference.name) diagnostic = FirUnresolvedReferenceError(callableReferenceAccess.calleeReference.name)
) }
else -> FirNamedReferenceWithCandidate(callableReferenceAccess.source, callableReferenceAccess.calleeReference.name, candidate) else -> FirNamedReferenceWithCandidate(callableReferenceAccess.source, callableReferenceAccess.calleeReference.name, candidate)
} }
@@ -90,7 +90,7 @@ class PostponedArgumentsAnalyzer(
namedReference namedReference
).apply { ).apply {
if (candidate != null) { if (candidate != null) {
replaceTypeRef(FirResolvedTypeRefImpl(null, candidate.resultingTypeForCallableReference!!)) replaceTypeRef(buildResolvedTypeRef { type = candidate.resultingTypeForCallableReference!! })
} }
} }
} }
@@ -7,9 +7,8 @@ package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirClass 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.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.expressions.FirResolvedQualifier
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider 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) val (classSymbol, callableScopes) = getClassSymbolWithCallableScopes(classId, useSiteSession, scopeSession)
if (classSymbol != null) { if (classSymbol != null) {
val klass = classSymbol.fir val klass = classSymbol.fir
val classifierScope = if (klass is FirClassImpl || klass is FirSealedClassImpl) { val classifierScope = if ((klass as? FirRegularClass)?.hasLazyNestedClassifiers == false) {
nestedClassifierScope(klass) nestedClassifierScope(klass)
} else { } else {
useSiteSession.firSymbolProvider.getNestedClassifierScope(classId) useSiteSession.firSymbolProvider.getNestedClassifierScope(classId)
@@ -99,7 +99,8 @@ internal sealed class CheckReceivers : ResolutionStage() {
val receiverType = (callable.receiverTypeRef as FirResolvedTypeRef?)?.type val receiverType = (callable.receiverTypeRef as FirResolvedTypeRef?)?.type
if (receiverType != null) return receiverType if (receiverType != null) return receiverType
val returnTypeRef = callable.returnTypeRef as? FirResolvedTypeRef ?: return null 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
} }
} }
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier 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.constructClassType
import org.jetbrains.kotlin.fir.resolve.transformQualifiedAccessUsingSmartcastInfo import org.jetbrains.kotlin.fir.resolve.transformQualifiedAccessUsingSmartcastInfo
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe 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 explicitReceiverKind: ExplicitReceiverKind,
val group: TowerGroup val group: TowerGroup
) { ) {
private fun createExplicitReceiverForInvoke(candidate: Candidate): FirQualifiedAccessExpressionImpl { private fun createExplicitReceiverForInvoke(candidate: Candidate): FirQualifiedAccessExpressionBuilder {
val symbol = candidate.symbol as FirCallableSymbol<*> val symbol = candidate.symbol as FirCallableSymbol<*>
return FirQualifiedAccessExpressionImpl(null).apply { return FirQualifiedAccessExpressionBuilder().apply {
calleeReference = FirNamedReferenceWithCandidate( calleeReference = FirNamedReferenceWithCandidate(
null, null,
symbol.callableId.callableName, symbol.callableId.callableName,
@@ -184,7 +184,7 @@ class TowerResolveManager internal constructor(private val towerResolver: FirTow
it.explicitReceiver = info.explicitReceiver it.explicitReceiver = info.explicitReceiver
it.safe = info.isSafeCall it.safe = info.isSafeCall
} }
towerResolver.components.transformQualifiedAccessUsingSmartcastInfo(it) towerResolver.components.transformQualifiedAccessUsingSmartcastInfo(it.build())
} }
val invokeFunctionInfo = val invokeFunctionInfo =
@@ -6,15 +6,13 @@
package org.jetbrains.kotlin.fir.resolve.dfa package org.jetbrains.kotlin.fir.resolve.dfa
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSymbolOwner import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.* 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.expressions.impl.FirNoReceiverExpression
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.references.FirThisReference 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.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
@UseExperimental(DfaInternals::class) @UseExperimental(DfaInternals::class)
class VariableStorage { class VariableStorage {
@@ -8,10 +8,11 @@ package org.jetbrains.kotlin.fir.resolve.dfa.contracts
import org.jetbrains.kotlin.fir.contracts.description.* import org.jetbrains.kotlin.fir.contracts.description.*
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.expressions.* 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.references.impl.FirSimpleNamedReference
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
import org.jetbrains.kotlin.fir.expressions.FirConstKind 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 import org.jetbrains.kotlin.util.OperatorNameConventions
private object ConeConditionalEffectToFirVisitor : ConeContractDescriptionVisitor<FirExpression?, Map<Int, FirExpression>>() { 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? { override fun visitConstantDescriptor(constantReference: ConeConstantReference, data: Map<Int, FirExpression>): FirExpression? {
return when (constantReference) { return when (constantReference) {
ConeBooleanConstantReference.TRUE -> FirConstExpressionImpl(null, FirConstKind.Boolean, true) ConeBooleanConstantReference.TRUE -> buildConstExpression(null, FirConstKind.Boolean, true)
ConeBooleanConstantReference.FALSE -> FirConstExpressionImpl(null, FirConstKind.Boolean, false) ConeBooleanConstantReference.FALSE -> buildConstExpression(null, FirConstKind.Boolean, false)
ConeConstantReference.NULL -> createConstNull() ConeConstantReference.NULL -> createConstNull()
else -> null else -> null
} }
@@ -34,34 +35,40 @@ private object ConeConditionalEffectToFirVisitor : ConeContractDescriptionVisito
): FirExpression? { ): FirExpression? {
val leftExpression = binaryLogicExpression.left.accept(this, data) ?: return null val leftExpression = binaryLogicExpression.left.accept(this, data) ?: return null
val rightExpression = binaryLogicExpression.right.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? { override fun visitLogicalNot(logicalNot: ConeLogicalNot, data: Map<Int, FirExpression>): FirExpression? {
val explicitReceiver = logicalNot.arg.accept(this, data) ?: return null val explicitReceiver = logicalNot.arg.accept(this, data) ?: return null
return FirFunctionCallImpl(null).apply { return buildFunctionCall {
calleeReference = FirSimpleNamedReference(null, OperatorNameConventions.NOT, null) calleeReference = buildSimpleNamedReference { name = OperatorNameConventions.NOT }
this.explicitReceiver = explicitReceiver this.explicitReceiver = explicitReceiver
} }
} }
override fun visitIsInstancePredicate(isInstancePredicate: ConeIsInstancePredicate, data: Map<Int, FirExpression>): FirExpression? { override fun visitIsInstancePredicate(isInstancePredicate: ConeIsInstancePredicate, data: Map<Int, FirExpression>): FirExpression? {
val operation = if (isInstancePredicate.isNegated) { return buildTypeOperatorCall {
FirOperation.NOT_IS operation = if (isInstancePredicate.isNegated) {
} else { FirOperation.NOT_IS
FirOperation.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? { override fun visitIsNullPredicate(isNullPredicate: ConeIsNullPredicate, data: Map<Int, FirExpression>): FirExpression? {
val argument = isNullPredicate.arg.accept(this, data) ?: return null val argument = isNullPredicate.arg.accept(this, data) ?: return null
val operation = if (isNullPredicate.isNegated) { return buildOperatorCall {
FirOperation.NOT_EQ operation = if (isNullPredicate.isNegated) {
} else { FirOperation.NOT_EQ
FirOperation.EQ } else {
} FirOperation.EQ
return FirOperatorCallImpl(null, operation).apply { }
arguments += argument arguments += argument
arguments += createConstNull() arguments += createConstNull()
} }
@@ -71,7 +78,7 @@ private object ConeConditionalEffectToFirVisitor : ConeContractDescriptionVisito
return data[valueParameterReference.parameterIndex] 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? { fun ConeConditionalEffectDeclaration.buildContractFir(argumentMapping: Map<Int, FirExpression>): FirExpression? {
@@ -13,6 +13,10 @@ import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* 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.declarations.impl.*
import org.jetbrains.kotlin.fir.deserialization.FirBuiltinAnnotationDeserializer import org.jetbrains.kotlin.fir.deserialization.FirBuiltinAnnotationDeserializer
import org.jetbrains.kotlin.fir.deserialization.FirDeserializationContext 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.StandardClassIds
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef 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.ConeTypeParameterTypeImpl
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion
import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl
@@ -46,7 +50,7 @@ import java.io.InputStream
class FirBuiltinSymbolProvider(val session: FirSession, val kotlinScopeProvider: KotlinScopeProvider) : FirSymbolProvider() { class FirBuiltinSymbolProvider(val session: FirSession, val kotlinScopeProvider: KotlinScopeProvider) : FirSymbolProvider() {
private class BuiltInsPackageFragment( private class BuiltInsPackageFragment(
stream: InputStream, val fqName: FqName, val session: FirSession, stream: InputStream, val fqName: FqName, val session: FirSession,
val kotlinScopeProvider: KotlinScopeProvider val kotlinScopeProvider: KotlinScopeProvider,
) { ) {
lateinit var version: BuiltInsBinaryVersion lateinit var version: BuiltInsBinaryVersion
@@ -59,7 +63,7 @@ class FirBuiltinSymbolProvider(val session: FirSession, val kotlinScopeProvider:
throw UnsupportedOperationException( throw UnsupportedOperationException(
"Kotlin built-in definition format version is not supported: " + "Kotlin built-in definition format version is not supported: " +
"expected ${BuiltInsBinaryVersion.INSTANCE}, actual $version. " + "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 { private val memberDeserializer by lazy {
FirDeserializationContext.createForPackage( FirDeserializationContext.createForPackage(
fqName, packageProto.`package`, nameResolver, session, fqName, packageProto.`package`, nameResolver, session,
FirBuiltinAnnotationDeserializer(session) FirBuiltinAnnotationDeserializer(session),
).memberDeserializer ).memberDeserializer
} }
@@ -84,7 +88,7 @@ class FirBuiltinSymbolProvider(val session: FirSession, val kotlinScopeProvider:
private fun findAndDeserializeClass( private fun findAndDeserializeClass(
classId: ClassId, classId: ClassId,
parentContext: FirDeserializationContext? = null parentContext: FirDeserializationContext? = null,
): FirRegularClassSymbol? { ): FirRegularClassSymbol? {
val classIdExists = classId in classDataFinder.allClassIds val classIdExists = classId in classDataFinder.allClassIds
if (!classIdExists) return null if (!classIdExists) return null
@@ -95,7 +99,7 @@ class FirBuiltinSymbolProvider(val session: FirSession, val kotlinScopeProvider:
deserializeClassToSymbol( deserializeClassToSymbol(
classId, classProto, symbol, nameResolver, session, classId, classProto, symbol, nameResolver, session,
null, kotlinScopeProvider, parentContext, null, kotlinScopeProvider, parentContext,
this::findAndDeserializeClass this::findAndDeserializeClass,
) )
} }
} }
@@ -148,48 +152,43 @@ class FirBuiltinSymbolProvider(val session: FirSession, val kotlinScopeProvider:
val prefix = kind.classNamePrefix val prefix = kind.classNamePrefix
val arity = className.substring(prefix.length).toIntOrNull() ?: return null val arity = className.substring(prefix.length).toIntOrNull() ?: return null
syntheticFunctionalInterfaceSymbols.getOrPut(SyntheticFunctionalInterfaceSymbolKey(kind, arity)) { syntheticFunctionalInterfaceSymbols.getOrPut(SyntheticFunctionalInterfaceSymbolKey(kind, arity)) {
val status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.ABSTRACT).apply { FirRegularClassSymbol(this).apply symbol@{
isExpect = false buildClassImpl klass@{
isActual = false session = this@FirBuiltinSymbolProvider.session
isInner = false name = relativeClassName.shortName()
isCompanion = false status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.ABSTRACT).apply {
isData = false isExpect = false
isInline = false isActual = false
} isInner = false
FirRegularClassSymbol(this).apply { isCompanion = false
FirClassImpl( isData = false
null, isInline = false
session, }
status, classKind = ClassKind.INTERFACE
ClassKind.INTERFACE, scopeProvider = kotlinScopeProvider
kotlinScopeProvider, symbol = this@symbol
relativeClassName.shortName(),
this
).apply klass@{
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
typeParameters.addAll((1..arity).map { typeParameters.addAll(
FirTypeParameterImpl( (1..arity).map {
null, buildTypeParameter {
this@FirBuiltinSymbolProvider.session, session = this@FirBuiltinSymbolProvider.session
Name.identifier("P$it"), name = Name.identifier("P$it")
FirTypeParameterSymbol(), symbol = FirTypeParameterSymbol()
Variance.IN_VARIANCE, variance = Variance.IN_VARIANCE
false isReified = false
).apply { bounds += session.builtinTypes.nullableAnyType
bounds += session.builtinTypes.nullableAnyType }
} },
}) )
typeParameters.add( typeParameters.add(
FirTypeParameterImpl( buildTypeParameter {
null, session = this@FirBuiltinSymbolProvider.session
this@FirBuiltinSymbolProvider.session, name = Name.identifier("R")
Name.identifier("R"), symbol = FirTypeParameterSymbol()
FirTypeParameterSymbol(), variance = Variance.OUT_VARIANCE
Variance.OUT_VARIANCE, isReified = false
false
).apply {
bounds += session.builtinTypes.nullableAnyType bounds += session.builtinTypes.nullableAnyType
} },
) )
val name = OperatorNameConventions.INVOKE val name = OperatorNameConventions.INVOKE
val functionStatus = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.ABSTRACT).apply { val functionStatus = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.ABSTRACT).apply {
@@ -206,70 +205,60 @@ class FirBuiltinSymbolProvider(val session: FirSession, val kotlinScopeProvider:
kind == FunctionClassDescriptor.Kind.KSuspendFunction kind == FunctionClassDescriptor.Kind.KSuspendFunction
} }
val typeArguments = typeParameters.map { val typeArguments = typeParameters.map {
FirResolvedTypeRefImpl( buildResolvedTypeRef {
null, type = ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false)
ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false) }
)
} }
addDeclaration( addDeclaration(
FirSimpleFunctionImpl( buildSimpleFunction {
null, session = this@FirBuiltinSymbolProvider.session
this@FirBuiltinSymbolProvider.session, returnTypeRef = typeArguments.last()
typeArguments.last(), this.name = name
null, status = functionStatus
functionStatus, symbol = FirNamedFunctionSymbol(CallableId(packageFqName, relativeClassName, name))
name,
FirNamedFunctionSymbol(CallableId(packageFqName, relativeClassName, name))
).apply {
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
valueParameters += typeArguments.dropLast(1).mapIndexed { index, typeArgument -> valueParameters += typeArguments.dropLast(1).mapIndexed { index, typeArgument ->
val parameterName = Name.identifier("p${index + 1}") val parameterName = Name.identifier("p${index + 1}")
FirValueParameterImpl( buildValueParameter {
null, session = this@FirBuiltinSymbolProvider.session
this@FirBuiltinSymbolProvider.session, returnTypeRef = typeArgument
typeArgument, this.name = parameterName
parameterName, symbol = FirVariableSymbol(parameterName)
FirVariableSymbol(parameterName), defaultValue = null
defaultValue = null, isCrossinline = false
isCrossinline = false, isNoinline = false
isNoinline = false,
isVararg = false isVararg = false
) }
} }
} },
) )
fun createSuperType( fun createSuperType(
kind: FunctionClassDescriptor.Kind kind: FunctionClassDescriptor.Kind,
): FirResolvedTypeRef { ): FirResolvedTypeRef {
return FirResolvedTypeRefImpl( return buildResolvedTypeRef {
null, type = ConeClassLikeLookupTagImpl(kind.classId(arity))
ConeClassLikeLookupTagImpl(kind.classId(arity))
.constructClassType(typeArguments.map { it.type }.toTypedArray(), isNullable = false) .constructClassType(typeArguments.map { it.type }.toTypedArray(), isNullable = false)
) }
} }
val superTypes = when (kind) { superTypeRefs += when (kind) {
FunctionClassDescriptor.Kind.Function -> FunctionClassDescriptor.Kind.Function ->
listOf( buildResolvedTypeRef {
FirResolvedTypeRefImpl( type = ConeClassLikeLookupTagImpl(StandardClassIds.Function)
source = null, .constructClassType(arrayOf(typeArguments.last().type), isNullable = false)
ConeClassLikeLookupTagImpl(StandardClassIds.Function) }
.constructClassType(arrayOf(typeArguments.last().type), isNullable = false)
)
)
FunctionClassDescriptor.Kind.SuspendFunction -> FunctionClassDescriptor.Kind.SuspendFunction ->
listOf(session.builtinTypes.anyType) session.builtinTypes.anyType
FunctionClassDescriptor.Kind.KFunction -> FunctionClassDescriptor.Kind.KFunction ->
listOf(createSuperType(FunctionClassDescriptor.Kind.Function)) createSuperType(FunctionClassDescriptor.Kind.Function)
FunctionClassDescriptor.Kind.KSuspendFunction -> FunctionClassDescriptor.Kind.KSuspendFunction ->
listOf(createSuperType(FunctionClassDescriptor.Kind.SuspendFunction)) createSuperType(FunctionClassDescriptor.Kind.SuspendFunction)
} }
replaceSuperTypeRefs(superTypes)
} }
} }
} }
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.fir.resolve.inference package org.jetbrains.kotlin.fir.resolve.inference
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction 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.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirResolvable 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.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.calls.* import org.jetbrains.kotlin.fir.resolve.calls.*
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.transformers.FirCallCompletionResultsWriterTransformer import org.jetbrains.kotlin.fir.resolve.transformers.*
import org.jetbrains.kotlin.fir.resolve.transformers.InvocationKindTransformer 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.FirAbstractBodyResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirBodyResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirBodyResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType 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.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef 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.fir.visitors.transformSingle
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.calls.components.InferenceSession import org.jetbrains.kotlin.resolve.calls.components.InferenceSession
@@ -119,17 +119,16 @@ class FirCallCompleter(
needItParam -> { needItParam -> {
val name = Name.identifier("it") val name = Name.identifier("it")
val itType = parameters.single() val itType = parameters.single()
FirValueParameterImpl( buildValueParameter {
null, session = this@FirCallCompleter.session
session, returnTypeRef = buildResolvedTypeRef { type = itType.approximateLambdaInputType() }
FirResolvedTypeRefImpl(null, itType.approximateLambdaInputType()), this.name = name
name, symbol = FirVariableSymbol(name)
FirVariableSymbol(name), defaultValue = null
defaultValue = null, isCrossinline = false
isCrossinline = false, isNoinline = false
isNoinline = false,
isVararg = false isVararg = false
) }
} }
else -> null else -> null
} }
@@ -9,10 +9,10 @@ import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.* 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.FirFunctionCallImpl
import org.jetbrains.kotlin.fir.expressions.impl.FirVarargArgumentsExpressionImpl import org.jetbrains.kotlin.fir.references.builder.buildResolvedCallableReference
import org.jetbrains.kotlin.fir.references.impl.FirResolvedCallableReferenceImpl import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl
import org.jetbrains.kotlin.fir.resolve.calls.Candidate import org.jetbrains.kotlin.fir.resolve.calls.Candidate
import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate
import org.jetbrains.kotlin.fir.resolve.calls.isBuiltinFunctionalType 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.FirIntegerOperatorCall
import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType
import org.jetbrains.kotlin.fir.types.* 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.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.CompositeTransformResult
import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.fir.visitors.compose
import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.fir.visitors.transformSingle
@@ -43,12 +43,12 @@ class FirCallCompletionResultsWriterTransformer(
private val typeCalculator: ReturnTypeCalculator, private val typeCalculator: ReturnTypeCalculator,
private val typeApproximator: AbstractTypeApproximator, private val typeApproximator: AbstractTypeApproximator,
private val integerOperatorsTypeUpdater: IntegerOperatorsTypeUpdater, private val integerOperatorsTypeUpdater: IntegerOperatorsTypeUpdater,
private val integerApproximator: IntegerLiteralTypeApproximationTransformer private val integerApproximator: IntegerLiteralTypeApproximationTransformer,
) : FirAbstractTreeTransformer<ExpectedArgumentType?>(phase = FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { ) : FirAbstractTreeTransformer<ExpectedArgumentType?>(phase = FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) {
override fun transformQualifiedAccessExpression( override fun transformQualifiedAccessExpression(
qualifiedAccessExpression: FirQualifiedAccessExpression, qualifiedAccessExpression: FirQualifiedAccessExpression,
data: ExpectedArgumentType? data: ExpectedArgumentType?,
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
val calleeReference = val calleeReference =
qualifiedAccessExpression.calleeReference as? FirNamedReferenceWithCandidate ?: return qualifiedAccessExpression.compose() qualifiedAccessExpression.calleeReference as? FirNamedReferenceWithCandidate ?: return qualifiedAccessExpression.compose()
@@ -56,26 +56,26 @@ class FirCallCompletionResultsWriterTransformer(
val candidateFir = calleeReference.candidateSymbol.phasedFir val candidateFir = calleeReference.candidateSymbol.phasedFir
val typeRef = (candidateFir as? FirTypedDeclaration)?.let { val typeRef = (candidateFir as? FirTypedDeclaration)?.let {
typeCalculator.tryCalculateReturnType(it) typeCalculator.tryCalculateReturnType(it)
} ?: FirErrorTypeRefImpl( } ?: buildErrorTypeRef {
calleeReference.source, source = calleeReference.source
FirSimpleDiagnostic("Callee reference to candidate without return type: ${candidateFir.render()}") diagnostic = FirSimpleDiagnostic("Callee reference to candidate without return type: ${candidateFir.render()}")
) }
qualifiedAccessExpression.replaceTypeRefWithSubstituted(calleeReference, typeRef) qualifiedAccessExpression.replaceTypeRefWithSubstituted(calleeReference, typeRef)
return qualifiedAccessExpression.transformCalleeReference( return qualifiedAccessExpression.transformCalleeReference(
StoreCalleeReference, StoreCalleeReference,
FirResolvedNamedReferenceImpl( buildResolvedNamedReference {
calleeReference.source, source = calleeReference.source
calleeReference.name, name = calleeReference.name
calleeReference.candidateSymbol resolvedSymbol = calleeReference.candidateSymbol
) },
).compose() ).compose()
} }
private fun <D : FirExpression> D.replaceTypeRefWithSubstituted( private fun <D : FirExpression> D.replaceTypeRefWithSubstituted(
calleeReference: FirNamedReferenceWithCandidate, calleeReference: FirNamedReferenceWithCandidate,
typeRef: FirResolvedTypeRef typeRef: FirResolvedTypeRef,
): D { ): D {
val resultTypeRef = typeRef.substituteTypeRef(calleeReference.candidate) val resultTypeRef = typeRef.substituteTypeRef(calleeReference.candidate)
replaceTypeRef(resultTypeRef) replaceTypeRef(resultTypeRef)
@@ -83,12 +83,12 @@ class FirCallCompletionResultsWriterTransformer(
} }
private fun FirResolvedTypeRef.substituteTypeRef( private fun FirResolvedTypeRef.substituteTypeRef(
candidate: Candidate candidate: Candidate,
): FirResolvedTypeRef { ): FirResolvedTypeRef {
val initialType = candidate.substitutor.substituteOrNull(type) val initialType = candidate.substitutor.substituteOrNull(type)
val finalType = finalSubstitutor.substituteOrNull(initialType)?.let { substitutedType -> val finalType = finalSubstitutor.substituteOrNull(initialType)?.let { substitutedType ->
typeApproximator.approximateToSuperType( typeApproximator.approximateToSuperType(
substitutedType, TypeApproximatorConfiguration.FinalApproximationAfterResolutionAndInference substitutedType, TypeApproximatorConfiguration.FinalApproximationAfterResolutionAndInference,
) as ConeKotlinType? ?: substitutedType ) as ConeKotlinType? ?: substitutedType
} }
@@ -97,7 +97,7 @@ class FirCallCompletionResultsWriterTransformer(
override fun transformCallableReferenceAccess( override fun transformCallableReferenceAccess(
callableReferenceAccess: FirCallableReferenceAccess, callableReferenceAccess: FirCallableReferenceAccess,
data: ExpectedArgumentType? data: ExpectedArgumentType?,
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
val calleeReference = val calleeReference =
callableReferenceAccess.calleeReference as? FirNamedReferenceWithCandidate ?: return callableReferenceAccess.compose() callableReferenceAccess.calleeReference as? FirNamedReferenceWithCandidate ?: return callableReferenceAccess.compose()
@@ -112,29 +112,28 @@ class FirCallCompletionResultsWriterTransformer(
return callableReferenceAccess.transformCalleeReference( return callableReferenceAccess.transformCalleeReference(
StoreCalleeReference, StoreCalleeReference,
FirResolvedCallableReferenceImpl( buildResolvedCallableReference {
calleeReference.source, source = calleeReference.source
calleeReference.name, name = calleeReference.name
calleeReference.candidateSymbol resolvedSymbol = calleeReference.candidateSymbol
).apply {
inferredTypeArguments.addAll(computeTypeArguments(calleeReference.candidate)) inferredTypeArguments.addAll(computeTypeArguments(calleeReference.candidate))
} },
).compose() ).compose()
} }
override fun transformVariableAssignment( override fun transformVariableAssignment(
variableAssignment: FirVariableAssignment, variableAssignment: FirVariableAssignment,
data: ExpectedArgumentType? data: ExpectedArgumentType?,
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
val calleeReference = variableAssignment.calleeReference as? FirNamedReferenceWithCandidate val calleeReference = variableAssignment.calleeReference as? FirNamedReferenceWithCandidate
?: return variableAssignment.compose() ?: return variableAssignment.compose()
return variableAssignment.transformCalleeReference( return variableAssignment.transformCalleeReference(
StoreCalleeReference, StoreCalleeReference,
FirResolvedNamedReferenceImpl( buildResolvedNamedReference {
calleeReference.source, source = calleeReference.source
calleeReference.name, name = calleeReference.name
calleeReference.candidateSymbol resolvedSymbol = calleeReference.candidateSymbol
) },
).compose() ).compose()
} }
@@ -148,18 +147,20 @@ class FirCallCompletionResultsWriterTransformer(
when (val argument = functionCall.typeArguments.getOrNull(index)) { when (val argument = functionCall.typeArguments.getOrNull(index)) {
is FirTypeProjectionWithVariance -> { is FirTypeProjectionWithVariance -> {
val typeRef = argument.typeRef as FirResolvedTypeRef val typeRef = argument.typeRef as FirResolvedTypeRef
FirTypeProjectionWithVarianceImpl( buildTypeProjectionWithVariance {
argument.source, source = argument.source
typeRef.withReplacedConeType(type), this.typeRef = typeRef.withReplacedConeType(type)
argument.variance variance = argument.variance
) }
} }
else -> { else -> {
FirTypeProjectionWithVarianceImpl( buildTypeProjectionWithVariance {
argument?.source, source = argument?.source
FirResolvedTypeRefImpl(null, type), typeRef = buildResolvedTypeRef {
Variance.INVARIANT this.type = type
) }
variance = Variance.INVARIANT
}
} }
} }
} }
@@ -176,11 +177,11 @@ class FirCallCompletionResultsWriterTransformer(
var result = functionCall.transformSingle(integerOperatorsTypeUpdater, null) var result = functionCall.transformSingle(integerOperatorsTypeUpdater, null)
.transformCalleeReference( .transformCalleeReference(
StoreCalleeReference, StoreCalleeReference,
FirResolvedNamedReferenceImpl( buildResolvedNamedReference {
calleeReference.source, source = calleeReference.source
calleeReference.name, name = calleeReference.name
calleeReference.candidateSymbol resolvedSymbol = calleeReference.candidateSymbol
) },
) )
.transformDispatchReceiver(StoreReceiver, subCandidate.dispatchReceiverExpression()) .transformDispatchReceiver(StoreReceiver, subCandidate.dispatchReceiverExpression())
.transformExtensionReceiver(StoreReceiver, subCandidate.extensionReceiverExpression()) .transformExtensionReceiver(StoreReceiver, subCandidate.extensionReceiverExpression())
@@ -195,27 +196,24 @@ class FirCallCompletionResultsWriterTransformer(
else -> { else -> {
resultType = typeRef.substituteTypeRef(subCandidate) resultType = typeRef.substituteTypeRef(subCandidate)
val vararg = subCandidate.argumentMapping?.values?.firstOrNull { it.isVararg } 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) { if (vararg != null && this is FirFunctionCallImpl) {
// Create a FirVarargArgumentExpression for the vararg arguments // Create a FirVarargArgumentExpression for the vararg arguments
val resolvedArrayType = vararg.returnTypeRef.substitute(subCandidate) val resolvedArrayType = vararg.returnTypeRef.substitute(subCandidate)
val resolvedElementType = resolvedArrayType.arrayElementType(session) val resolvedElementType = resolvedArrayType.arrayElementType(session)
val varargArgument = FirVarargArgumentsExpressionImpl( var firstIndex = this@call.arguments.size
null, val varargArgument = buildVarargArgumentsExpression {
vararg.returnTypeRef.withReplacedConeType(resolvedElementType) varargElementType = vararg.returnTypeRef.withReplacedConeType(resolvedElementType)
) this.typeRef = vararg.returnTypeRef.withReplacedConeType(
varargArgument.replaceTypeRef(
vararg.returnTypeRef.withReplacedConeType(
vararg.returnTypeRef.substitute( vararg.returnTypeRef.substitute(
subCandidate subCandidate
) )
) )
) for ((i, arg) in this@call.arguments.withIndex()) {
var firstIndex = arguments.size if (subCandidate.argumentMapping!![arg]?.isVararg ?: false) {
for ((i, arg) in arguments.withIndex()) { firstIndex = min(firstIndex, i)
if (subCandidate.argumentMapping!![arg]?.isVararg ?: false) { arguments += arg
firstIndex = min(firstIndex, i) }
varargArgument.arguments.add(arg)
} }
} }
for (arg in varargArgument.arguments) { for (arg in varargArgument.arguments) {
@@ -229,7 +227,7 @@ class FirCallCompletionResultsWriterTransformer(
return result.copy( return result.copy(
resultType = resultType, resultType = resultType,
typeArguments = typeArguments typeArguments = typeArguments,
).compose() ).compose()
} }
@@ -248,7 +246,7 @@ class FirCallCompletionResultsWriterTransformer(
override fun transformDelegatedConstructorCall( override fun transformDelegatedConstructorCall(
delegatedConstructorCall: FirDelegatedConstructorCall, delegatedConstructorCall: FirDelegatedConstructorCall,
data: ExpectedArgumentType? data: ExpectedArgumentType?,
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
val calleeReference = val calleeReference =
delegatedConstructorCall.calleeReference as? FirNamedReferenceWithCandidate ?: return delegatedConstructorCall.compose() delegatedConstructorCall.calleeReference as? FirNamedReferenceWithCandidate ?: return delegatedConstructorCall.compose()
@@ -256,16 +254,16 @@ class FirCallCompletionResultsWriterTransformer(
val result = delegatedConstructorCall.transformArguments(this, calleeReference.candidate.createArgumentsMapping()) val result = delegatedConstructorCall.transformArguments(this, calleeReference.candidate.createArgumentsMapping())
return result.transformCalleeReference( return result.transformCalleeReference(
StoreCalleeReference, StoreCalleeReference,
FirResolvedNamedReferenceImpl( buildResolvedNamedReference {
calleeReference.source, source = calleeReference.source
calleeReference.name, name = calleeReference.name
calleeReference.candidateSymbol resolvedSymbol = calleeReference.candidateSymbol
) },
).compose() ).compose()
} }
private fun computeTypeArguments( private fun computeTypeArguments(
candidate: Candidate candidate: Candidate,
): List<ConeKotlinType> { ): List<ConeKotlinType> {
val declaration = candidate.symbol.phasedFir as? FirCallableMemberDeclaration<*> ?: return emptyList() val declaration = candidate.symbol.phasedFir as? FirCallableMemberDeclaration<*> ?: return emptyList()
@@ -276,7 +274,7 @@ class FirCallCompletionResultsWriterTransformer(
override fun transformAnonymousFunction( override fun transformAnonymousFunction(
anonymousFunction: FirAnonymousFunction, anonymousFunction: FirAnonymousFunction,
data: ExpectedArgumentType? data: ExpectedArgumentType?,
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
val expectedReturnType = data?.getExpectedType(anonymousFunction) val expectedReturnType = data?.getExpectedType(anonymousFunction)
?.takeIf { it.isBuiltinFunctionalType(session) } ?.takeIf { it.isBuiltinFunctionalType(session) }
@@ -321,7 +319,7 @@ class FirCallCompletionResultsWriterTransformer(
private inline fun <reified D> transformSyntheticCall( private inline fun <reified D> transformSyntheticCall(
syntheticCall: D, syntheticCall: D,
data: ExpectedArgumentType? data: ExpectedArgumentType?,
): CompositeTransformResult<FirStatement> ): CompositeTransformResult<FirStatement>
where D : FirResolvable, D : FirExpression { where D : FirResolvable, D : FirExpression {
val syntheticCall = syntheticCall.transformChildren(this, data?.getExpectedType(syntheticCall)?.toExpectedType()) as D val syntheticCall = syntheticCall.transformChildren(this, data?.getExpectedType(syntheticCall)?.toExpectedType()) as D
@@ -334,17 +332,17 @@ class FirCallCompletionResultsWriterTransformer(
return (syntheticCall.transformCalleeReference( return (syntheticCall.transformCalleeReference(
StoreCalleeReference, StoreCalleeReference,
FirResolvedNamedReferenceImpl( buildResolvedNamedReference {
calleeReference.source, source = calleeReference.source
calleeReference.name, name = calleeReference.name
calleeReference.candidateSymbol resolvedSymbol = calleeReference.candidateSymbol
) },
) as D).compose() ) as D).compose()
} }
override fun <T> transformConstExpression( override fun <T> transformConstExpression(
constExpression: FirConstExpression<T>, constExpression: FirConstExpression<T>,
data: ExpectedArgumentType? data: ExpectedArgumentType?,
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
if (data == ExpectedArgumentType.NoApproximation) return constExpression.compose() if (data == ExpectedArgumentType.NoApproximation) return constExpression.compose()
val expectedType = data?.getExpectedType(constExpression) val expectedType = data?.getExpectedType(constExpression)
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirImport import org.jetbrains.kotlin.fir.declarations.FirImport
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase 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.resolve.FirSymbolProvider
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
import org.jetbrains.kotlin.fir.visitors.compose 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> { private fun transformImportForFqName(fqName: FqName, delegate: FirImport): CompositeTransformResult<FirImport> {
val (packageFqName, relativeClassFqName) = resolveToPackageOrClass(symbolProvider, fqName) ?: return delegate.compose() 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? { fun resolveToPackageOrClass(symbolProvider: FirSymbolProvider, fqName: FqName): PackageOrClass? {
@@ -10,8 +10,8 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.resolve.FirTypeResolver import org.jetbrains.kotlin.fir.resolve.FirTypeResolver
import org.jetbrains.kotlin.fir.scopes.FirIterableScope import org.jetbrains.kotlin.fir.scopes.FirIterableScope
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.FirResolvedFunctionTypeRefImpl import org.jetbrains.kotlin.fir.types.builder.buildResolvedFunctionTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.fir.visitors.compose
@@ -28,23 +28,21 @@ class FirSpecificTypeResolverTransformer(
override fun transformFunctionTypeRef(functionTypeRef: FirFunctionTypeRef, data: Nothing?): CompositeTransformResult<FirTypeRef> { override fun transformFunctionTypeRef(functionTypeRef: FirFunctionTypeRef, data: Nothing?): CompositeTransformResult<FirTypeRef> {
functionTypeRef.transformChildren(this, data) functionTypeRef.transformChildren(this, data)
return FirResolvedFunctionTypeRefImpl( return buildResolvedFunctionTypeRef {
functionTypeRef.source, source = functionTypeRef.source
typeResolver.resolveType(functionTypeRef, towerScope), type = typeResolver.resolveType(functionTypeRef, towerScope)
functionTypeRef.isMarkedNullable, isMarkedNullable = functionTypeRef.isMarkedNullable
functionTypeRef.receiverTypeRef, receiverTypeRef = functionTypeRef.receiverTypeRef
functionTypeRef.returnTypeRef returnTypeRef = functionTypeRef.returnTypeRef
).apply {
annotations += functionTypeRef.annotations annotations += functionTypeRef.annotations
valueParameters += functionTypeRef.valueParameters valueParameters += functionTypeRef.valueParameters
}.compose() }.compose()
} }
private fun transformType(typeRef: FirTypeRef, resolvedType: ConeKotlinType): CompositeTransformResult<FirTypeRef> { private fun transformType(typeRef: FirTypeRef, resolvedType: ConeKotlinType): CompositeTransformResult<FirTypeRef> {
return FirResolvedTypeRefImpl( return buildResolvedTypeRef {
typeRef.source, source = typeRef.source
resolvedType type = resolvedType
).apply {
annotations += typeRef.annotations annotations += typeRef.annotations
delegatedTypeRef = typeRef delegatedTypeRef = typeRef
}.compose() }.compose()
@@ -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.scopes.impl.nestedClassifierScope
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
import org.jetbrains.kotlin.fir.types.* 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.fir.visitors.*
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.addToStdlib.safeAs 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 class SupertypeComputationSession {
private val fileScopesMap = hashMapOf<FirFile, FirImmutableCompositeScope>() private val fileScopesMap = hashMapOf<FirFile, FirImmutableCompositeScope>()
@@ -8,19 +8,19 @@ package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirElement 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.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.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.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.*
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.inferenceContext
import org.jetbrains.kotlin.fir.references.FirReference 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.references.impl.FirStubReference
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
import org.jetbrains.kotlin.fir.resolve.calls.* 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.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.* 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.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.CompositeTransformResult
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.fir.visitors.compose
@@ -48,10 +48,10 @@ class FirSyntheticCallGenerator(
private val components: FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents, private val components: FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents,
private val callCompleter: FirCallCompleter private val callCompleter: FirCallCompleter
) : BodyResolveComponents by components { ) : BodyResolveComponents by components {
private val whenSelectFunction: FirSimpleFunctionImpl = generateSyntheticSelectFunction(SyntheticCallableId.WHEN) private val whenSelectFunction: FirSimpleFunction = generateSyntheticSelectFunction(SyntheticCallableId.WHEN)
private val trySelectFunction: FirSimpleFunctionImpl = generateSyntheticSelectFunction(SyntheticCallableId.TRY) private val trySelectFunction: FirSimpleFunction = generateSyntheticSelectFunction(SyntheticCallableId.TRY)
private val idFunction: FirSimpleFunctionImpl = generateSyntheticSelectFunction(SyntheticCallableId.ID) private val idFunction: FirSimpleFunction = generateSyntheticSelectFunction(SyntheticCallableId.ID)
private val checkNotNullFunction: FirSimpleFunctionImpl = generateSyntheticCheckNotNullFunction() private val checkNotNullFunction: FirSimpleFunction = generateSyntheticCheckNotNullFunction()
fun generateCalleeForWhenExpression(whenExpression: FirWhenExpression): FirWhenExpression? { fun generateCalleeForWhenExpression(whenExpression: FirWhenExpression): FirWhenExpression? {
val stubReference = whenExpression.calleeReference val stubReference = whenExpression.calleeReference
@@ -115,19 +115,22 @@ class FirSyntheticCallGenerator(
idFunction, arguments, SyntheticCallableId.ID.callableName, CallKind.SyntheticIdForCallableReferencesResolution idFunction, arguments, SyntheticCallableId.ID.callableName, CallKind.SyntheticIdForCallableReferencesResolution
) ?: return callableReferenceAccess.transformCalleeReference( ) ?: return callableReferenceAccess.transformCalleeReference(
StoreCalleeReference, StoreCalleeReference,
FirErrorNamedReferenceImpl( buildErrorNamedReference {
callableReferenceAccess.source, source = callableReferenceAccess.source
FirUnresolvedNameError(callableReferenceAccess.calleeReference.name) 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] val argument = callCompleter.completeCall(fakeCallElement, expectedTypeRef).arguments[0]
return ((argument as? FirVarargArgumentsExpression)?.arguments?.get(0) ?: argument) as FirCallableReferenceAccess? return ((argument as? FirVarargArgumentsExpression)?.arguments?.get(0) ?: argument) as FirCallableReferenceAccess?
} }
private fun generateCalleeReferenceWithCandidate( private fun generateCalleeReferenceWithCandidate(
function: FirSimpleFunctionImpl, function: FirSimpleFunction,
arguments: List<FirExpression>, arguments: List<FirExpression>,
name: Name, name: Name,
callKind: CallKind = CallKind.SyntheticSelect callKind: CallKind = CallKind.SyntheticSelect
@@ -142,7 +145,7 @@ class FirSyntheticCallGenerator(
return FirNamedReferenceWithCandidate(null, name, candidate) 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( CandidateFactory(components, callInfo).createCandidate(
symbol = function.symbol, symbol = function.symbol,
explicitReceiverKind = ExplicitReceiverKind.NO_EXPLICIT_RECEIVER explicitReceiverKind = ExplicitReceiverKind.NO_EXPLICIT_RECEIVER
@@ -160,28 +163,36 @@ class FirSyntheticCallGenerator(
implicitReceiverStack = implicitReceiverStack implicitReceiverStack = implicitReceiverStack
) )
private fun generateSyntheticSelectFunction(callableId: CallableId): FirSimpleFunctionImpl { private fun generateSyntheticSelectFunction(callableId: CallableId): FirSimpleFunction {
// Synthetic function signature: // Synthetic function signature:
// fun <K> select(vararg values: K): K // fun <K> select(vararg values: K): K
val functionSymbol = FirSyntheticFunctionSymbol(callableId) val functionSymbol = FirSyntheticFunctionSymbol(callableId)
val typeParameterSymbol = FirTypeParameterSymbol() val typeParameterSymbol = FirTypeParameterSymbol()
val typeParameter = 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() 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 argumentType = buildResolvedTypeRef { type = returnType.coneTypeUnsafe<ConeKotlinType>().createArrayOf(session) }
val typeArgument = FirTypeProjectionWithVarianceImpl(null, returnType, Variance.INVARIANT) val typeArgument = buildTypeProjectionWithVariance {
typeRef = returnType
return generateMemberFunction(session, functionSymbol, callableId.callableName, typeArgument.typeRef).apply { variance = Variance.INVARIANT
typeParameters += typeParameter
valueParameters += argumentType.toValueParameter(session, "branches", isVararg = true)
} }
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: // Synthetic function signature:
// fun <K> checkNotNull(arg: K?): K // fun <K> checkNotNull(arg: K?): K
// //
@@ -191,74 +202,71 @@ class FirSyntheticCallGenerator(
val functionSymbol = FirSyntheticFunctionSymbol(SyntheticCallableId.CHECK_NOT_NULL) val functionSymbol = FirSyntheticFunctionSymbol(SyntheticCallableId.CHECK_NOT_NULL)
val typeParameterSymbol = FirTypeParameterSymbol() val typeParameterSymbol = FirTypeParameterSymbol()
val typeParameter = 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() addDefaultBoundIfNecessary()
} }
val returnType = FirResolvedTypeRefImpl(null, ConeTypeParameterTypeImpl(typeParameterSymbol.toLookupTag(), false)) val returnType = buildResolvedTypeRef { type = ConeTypeParameterTypeImpl(typeParameterSymbol.toLookupTag(), false) }
val argumentType = val argumentType = buildResolvedTypeRef {
FirResolvedTypeRefImpl( type = returnType.coneTypeUnsafe<ConeKotlinType>().withNullability(ConeNullability.NULLABLE, session.inferenceContext)
null, returnType.coneTypeUnsafe<ConeKotlinType>().withNullability( }
ConeNullability.NULLABLE, session.inferenceContext val typeArgument = buildTypeProjectionWithVariance {
) typeRef = returnType
) variance = Variance.INVARIANT
val typeArgument = FirTypeProjectionWithVarianceImpl(null, returnType, Variance.INVARIANT) }
return generateMemberFunction( return generateMemberFunction(
session,
functionSymbol, functionSymbol,
SyntheticCallableId.CHECK_NOT_NULL.callableName, SyntheticCallableId.CHECK_NOT_NULL.callableName,
typeArgument.typeRef typeArgument.typeRef
).apply { ).apply {
typeParameters += typeParameter typeParameters += typeParameter
valueParameters += argumentType.toValueParameter(session, "arg") valueParameters += argumentType.toValueParameter("arg")
} }.build()
} }
private fun generateMemberFunction( private fun generateMemberFunction(
session: FirSession, symbol: FirNamedFunctionSymbol, name: Name, returnType: FirTypeRef symbol: FirNamedFunctionSymbol, name: Name, returnType: FirTypeRef
): FirSimpleFunctionImpl { ): FirSimpleFunctionBuilder {
val status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL).apply { return FirSimpleFunctionBuilder().apply {
isExpect = false session = this@FirSyntheticCallGenerator.session
isActual = false this.symbol = symbol
isOverride = false this.name = name
isOperator = false status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL).apply {
isInfix = false isExpect = false
isInline = false isActual = false
isTailRec = false isOverride = false
isExternal = false isOperator = false
isSuspend = false isInfix = false
} isInline = false
return FirSimpleFunctionImpl( isTailRec = false
session = session, isExternal = false
source = null, isSuspend = false
symbol = symbol, }
name = name,
status = status,
receiverTypeRef = null,
returnTypeRef = returnType returnTypeRef = returnType
).apply { resolvePhase = FirResolvePhase.BODY_RESOLVE
this.resolvePhase = FirResolvePhase.BODY_RESOLVE
} }
} }
private fun FirResolvedTypeRef.toValueParameter( private fun FirResolvedTypeRef.toValueParameter(
session: FirSession, nameAsString: String, isVararg: Boolean = false nameAsString: String, isVararg: Boolean = false
): FirValueParameterImpl { ): FirValueParameter {
val name = Name.identifier(nameAsString) val name = Name.identifier(nameAsString)
return FirValueParameterImpl( return buildValueParameter {
session = session, session = this@FirSyntheticCallGenerator.session
source = null, this.name = name
name = name, returnTypeRef = this@toValueParameter
returnTypeRef = this, isCrossinline = false
defaultValue = null, isNoinline = false
isCrossinline = false, this.isVararg = isVararg
isNoinline = false,
isVararg = isVararg,
symbol = FirVariableSymbol(name) symbol = FirVariableSymbol(name)
).apply { resolvePhase = FirResolvePhase.BODY_RESOLVE
this.resolvePhase = FirResolvePhase.BODY_RESOLVE
} }
} }
} }
@@ -18,7 +18,6 @@ import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol 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.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType
import org.jetbrains.kotlin.fir.types.ConeNullability import org.jetbrains.kotlin.fir.types.ConeNullability
@@ -6,10 +6,11 @@
package org.jetbrains.kotlin.fir.resolve.transformers package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference 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.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.calls.ConeInferenceContext import org.jetbrains.kotlin.fir.resolve.calls.ConeInferenceContext
import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate 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 // e.g. Byte doesn't have `and` in member scope. It's an extension
if (resultSymbol == null) return functionCall.compose() if (resultSymbol == null) return functionCall.compose()
functionCall.resultType = data?.let { functionCall.resultType.resolvedTypeFromPrototype(it) } ?: resultSymbol.fir.returnTypeRef 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> { 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 { private fun FirFunctionCall.toOperatorCall(): FirIntegerOperatorCall {
if (this is FirIntegerOperatorCall) return this if (this is FirIntegerOperatorCall) return this
return FirIntegerOperatorCall(source).also { return FirIntegerOperatorCall(
it.typeRef = typeRef source,
it.annotations += annotations typeRef,
it.safe = safe annotations.toMutableList(),
it.typeArguments += typeArguments safe,
it.explicitReceiver = explicitReceiver typeArguments.toMutableList(),
it.dispatchReceiver = dispatchReceiver explicitReceiver,
it.extensionReceiver = extensionReceiver dispatchReceiver,
it.arguments += arguments extensionReceiver,
it.calleeReference = calleeReference arguments.toMutableList(),
} calleeReference,
)
} }
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef 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 { interface ReturnTypeCalculator {
fun tryCalculateReturnType(declaration: FirTypedDeclaration): FirResolvedTypeRef fun tryCalculateReturnType(declaration: FirTypedDeclaration): FirResolvedTypeRef
@@ -22,12 +22,11 @@ class ReturnTypeCalculatorForFullBodyResolve : ReturnTypeCalculator {
val returnTypeRef = declaration.returnTypeRef val returnTypeRef = declaration.returnTypeRef
if (returnTypeRef is FirResolvedTypeRef) return returnTypeRef if (returnTypeRef is FirResolvedTypeRef) return returnTypeRef
return FirErrorTypeRefImpl( return buildErrorTypeRef {
null, diagnostic = FirSimpleDiagnostic(
FirSimpleDiagnostic(
"Cannot calculate return type during full-body resolution (local class/object?): ${declaration.render()}", "Cannot calculate return type during full-body resolution (local class/object?): ${declaration.render()}",
DiagnosticKind.InferenceError DiagnosticKind.InferenceError
) )
) }
} }
} }
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.* 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.expressions.impl.FirSingleExpressionBlock
import org.jetbrains.kotlin.fir.references.* import org.jetbrains.kotlin.fir.references.*
import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType 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() if (block.statements.isEmpty()) return block.compose()
val transformedStatement = block.statements.last().transformSingle(this@MapArguments, data) val transformedStatement = block.statements.last().transformSingle(this@MapArguments, data)
when (block) { when (block) {
is FirBlockImpl -> block.statements[block.statements.size - 1] = transformedStatement
is FirSingleExpressionBlock -> block.statement = transformedStatement is FirSingleExpressionBlock -> block.statement = transformedStatement
// TODO: dirty cast
else -> (block.statements as MutableList<FirStatement>)[block.statements.size - 1] = transformedStatement
} }
return block.compose() return block.compose()
} }
@@ -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.scopes.impl.FirTypeResolveScopeForBodyResolve
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef 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 class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAbstractPhaseTransformer<ResolutionMode>(phase) {
abstract val components: BodyResolveTransformerComponents abstract val components: BodyResolveTransformerComponents
@@ -97,7 +97,7 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
val topLevelScopes: MutableList<FirScope> = mutableListOf() val topLevelScopes: MutableList<FirScope> = mutableListOf()
val localScopes: MutableList<FirLocalScope> = mutableListOf() val localScopes: MutableList<FirLocalScope> = mutableListOf()
override val noExpectedType: FirTypeRef = FirImplicitTypeRefImpl(null) override val noExpectedType: FirTypeRef = buildImplicitTypeRef()
override lateinit var file: FirFile override lateinit var file: FirFile
internal set internal set
@@ -15,13 +15,12 @@ import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.resolve.ResolutionMode import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.transformers.FirSyntheticCallGenerator import org.jetbrains.kotlin.fir.resolve.transformers.FirSyntheticCallGenerator
import org.jetbrains.kotlin.fir.resolve.transformers.FirWhenExhaustivenessTransformer 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.resolvedTypeFromPrototype
import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef 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.coneTypeSafe
import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.fir.visitors.compose
import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.fir.visitors.transformSingle
@@ -77,7 +76,9 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran
whenExpression = syntheticCallGenerator.generateCalleeForWhenExpression(whenExpression) ?: run { whenExpression = syntheticCallGenerator.generateCalleeForWhenExpression(whenExpression) ?: run {
whenExpression = whenExpression.transformSingle(whenExhaustivenessTransformer, null) whenExpression = whenExpression.transformSingle(whenExhaustivenessTransformer, null)
dataFlowAnalyzer.exitWhenExpression(whenExpression) 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() return@with whenExpression.compose()
} }
@@ -103,7 +104,7 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran
if (branches.size == 1) return true if (branches.size == 1) return true
if (branches.size > 2) return false if (branches.size > 2) return false
val lastBranch = branches.last() 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> { override fun transformWhenBranch(whenBranch: FirWhenBranch, data: ResolutionMode): CompositeTransformResult<FirWhenBranch> {
@@ -143,7 +144,9 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran
val expectedTypeRef = data.expectedType val expectedTypeRef = data.expectedType
callCompleter.completeCall(it, expectedTypeRef) callCompleter.completeCall(it, expectedTypeRef)
} ?: run { } ?: 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 tryExpression
} }
@@ -9,15 +9,15 @@ import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirFunctionTarget import org.jetbrains.kotlin.fir.FirFunctionTarget
import org.jetbrains.kotlin.fir.copy import org.jetbrains.kotlin.fir.copy
import org.jetbrains.kotlin.fir.declarations.* 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.FirDefaultPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirReturnExpression import org.jetbrains.kotlin.fir.expressions.FirReturnExpression
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.expressions.impl.FirReturnExpressionImpl import org.jetbrains.kotlin.fir.expressions.builder.buildReturnExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirUnitExpression import org.jetbrains.kotlin.fir.expressions.builder.buildUnitExpression
import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.calls.* import org.jetbrains.kotlin.fir.resolve.calls.*
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor 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.scopes.impl.FirMemberTypeParameterScope
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.* 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.types.impl.FirImplicitTypeRefImpl import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
@@ -256,7 +256,10 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
prepareLocalClassForBodyResolve(anonymousObject) prepareLocalClassForBodyResolve(anonymousObject)
return withScopeCleanup(topLevelScopes) { return withScopeCleanup(topLevelScopes) {
val type = anonymousObject.defaultType() 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) { val result = withLabelAndReceiverType(null, anonymousObject, type) {
transformDeclaration(anonymousObject, data) transformDeclaration(anonymousObject, data)
} }
@@ -342,9 +345,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
} else { } else {
result.transformReturnTypeRef( result.transformReturnTypeRef(
transformer, transformer,
withExpectedType( withExpectedType(buildErrorTypeRef { diagnostic = FirSimpleDiagnostic("empty body", DiagnosticKind.Other) })
FirErrorTypeRefImpl(null, FirSimpleDiagnostic("empty body", DiagnosticKind.Other))
)
) )
} }
} }
@@ -413,7 +414,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
transformAnonymousFunctionWithLambdaResolution(anonymousFunction, data).addReturn().compose() transformAnonymousFunctionWithLambdaResolution(anonymousFunction, data).addReturn().compose()
} }
is ResolutionMode.WithExpectedType, is ResolutionMode.ContextIndependent -> { 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 { val resolvedLambdaAtom = (expectedTypeRef as? FirResolvedTypeRef)?.let {
extractLambdaInfoFromFunctionalType( extractLambdaInfoFromFunctionalType(
it.type, it, anonymousFunction, session it.type, it, anonymousFunction, session
@@ -427,17 +428,15 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
val itParam = when { val itParam = when {
af.valueParameters.isEmpty() && singleParameterType != null -> { af.valueParameters.isEmpty() && singleParameterType != null -> {
val name = Name.identifier("it") val name = Name.identifier("it")
FirValueParameterImpl( buildValueParameter {
null, session = this@FirDeclarationsResolveTransformer.session
session, returnTypeRef = buildResolvedTypeRef { type = singleParameterType }
FirResolvedTypeRefImpl(null, singleParameterType), this.name = name
name, symbol = FirVariableSymbol(name)
FirVariableSymbol(name), isCrossinline = false
defaultValue = null, isNoinline = false
isCrossinline = false,
isNoinline = false,
isVararg = false isVararg = false
) }
} }
else -> null else -> null
} }
@@ -502,9 +501,13 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
object : FirDefaultTransformer<FirExpression>() { object : FirDefaultTransformer<FirExpression>() {
override fun <E : FirElement> transformElement(element: E, data: FirExpression): CompositeTransformResult<E> { override fun <E : FirElement> transformElement(element: E, data: FirExpression): CompositeTransformResult<E> {
if (element == lastStatement) { if (element == lastStatement) {
val returnExpression = FirReturnExpressionImpl(element.source, lastStatement) val returnExpression = buildReturnExpression {
returnExpression.target = FirFunctionTarget(null) source = element.source
(returnExpression.target as FirFunctionTarget).bind(this@addReturn) result = lastStatement
target = FirFunctionTarget(null, isLambda = this@addReturn.isLambda).also {
it.bind(this@addReturn)
}
}
return (returnExpression as E).compose() return (returnExpression as E).compose()
} }
return element.compose() return element.compose()
@@ -517,7 +520,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
return returnExpression.compose() return returnExpression.compose()
} }
}, },
FirUnitExpression(null) buildUnitExpression()
) )
} }
return this return this
@@ -577,10 +580,9 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
when { when {
initializer != null -> { initializer != null -> {
val expectedType = when (val resultType = initializer.resultType) { val expectedType = when (val resultType = initializer.resultType) {
is FirImplicitTypeRef -> FirErrorTypeRefImpl( is FirImplicitTypeRef -> buildErrorTypeRef {
null, diagnostic = FirSimpleDiagnostic("No result type for initializer", DiagnosticKind.InferenceError)
FirSimpleDiagnostic("No result type for initializer", DiagnosticKind.InferenceError) }
)
else -> resultType else -> resultType
} }
variable.transformReturnTypeRef( variable.transformReturnTypeRef(
@@ -590,10 +592,9 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
} }
variable.getter != null && variable.getter !is FirDefaultPropertyAccessor -> { variable.getter != null && variable.getter !is FirDefaultPropertyAccessor -> {
val expectedType = when (val resultType = variable.getter?.returnTypeRef) { val expectedType = when (val resultType = variable.getter?.returnTypeRef) {
is FirImplicitTypeRef -> FirErrorTypeRefImpl( is FirImplicitTypeRef -> buildErrorTypeRef {
null, diagnostic = FirSimpleDiagnostic("No result type for getter", DiagnosticKind.InferenceError)
FirSimpleDiagnostic("No result type for getter", DiagnosticKind.InferenceError) }
)
else -> resultType else -> resultType
} }
variable.transformReturnTypeRef( variable.transformReturnTypeRef(
@@ -603,7 +604,15 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
} }
else -> { else -> {
variable.transformReturnTypeRef( 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,
)
},
)
) )
} }
} }
@@ -11,13 +11,15 @@ import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.FirErrorExpressionImpl import org.jetbrains.kotlin.fir.expressions.builder.buildErrorExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl import org.jetbrains.kotlin.fir.expressions.builder.buildFunctionCall
import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedQualifierImpl import org.jetbrains.kotlin.fir.expressions.builder.buildVariableAssignment
import org.jetbrains.kotlin.fir.expressions.impl.FirVariableAssignmentImpl import org.jetbrains.kotlin.fir.references.FirDelegateFieldReference
import org.jetbrains.kotlin.fir.references.* import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl import org.jetbrains.kotlin.fir.references.FirSuperReference
import org.jetbrains.kotlin.fir.references.impl.FirExplicitThisReference 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.references.impl.FirSimpleNamedReference
import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.calls.candidate 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.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.symbols.invoke import org.jetbrains.kotlin.fir.symbols.invoke
import org.jetbrains.kotlin.fir.types.* 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.CompositeTransformResult
import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.fir.visitors.compose
import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.fir.visitors.transformSingle
@@ -51,10 +54,11 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
override fun transformExpression(expression: FirExpression, data: ResolutionMode): CompositeTransformResult<FirStatement> { override fun transformExpression(expression: FirExpression, data: ResolutionMode): CompositeTransformResult<FirStatement> {
if (expression.resultType is FirImplicitTypeRef && expression !is FirWrappedExpression) { if (expression.resultType is FirImplicitTypeRef && expression !is FirWrappedExpression) {
val type = FirErrorTypeRefImpl( val type = buildErrorTypeRef {
expression.source, source = expression.source
FirSimpleDiagnostic("Type calculating for ${expression::class} is not supported", DiagnosticKind.InferenceError) diagnostic =
) FirSimpleDiagnostic("Type calculating for ${expression::class} is not supported", DiagnosticKind.InferenceError)
}
expression.resultType = type expression.resultType = type
} }
return (expression.transformChildren(transformer, data) as FirStatement).compose() return (expression.transformChildren(transformer, data) as FirStatement).compose()
@@ -62,21 +66,22 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
override fun transformQualifiedAccessExpression( override fun transformQualifiedAccessExpression(
qualifiedAccessExpression: FirQualifiedAccessExpression, qualifiedAccessExpression: FirQualifiedAccessExpression,
data: ResolutionMode data: ResolutionMode,
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
qualifiedAccessExpression.annotations.forEach { it.accept(this, data) } qualifiedAccessExpression.annotations.forEach { it.accept(this, data) }
qualifiedAccessExpression.transformTypeArguments(transformer, ResolutionMode.ContextIndependent) qualifiedAccessExpression.transformTypeArguments(transformer, ResolutionMode.ContextIndependent)
var result = when (val callee = qualifiedAccessExpression.calleeReference) { var result = when (val callee = qualifiedAccessExpression.calleeReference) {
is FirExplicitThisReference -> { // TODO: there was FirExplicitThisReference
is FirThisReference -> {
val labelName = callee.labelName val labelName = callee.labelName
val implicitReceiver = implicitReceiverStack[labelName] val implicitReceiver = implicitReceiverStack[labelName]
implicitReceiver?.boundSymbol?.let { implicitReceiver?.boundSymbol?.let {
callee.replaceBoundSymbol(it) callee.replaceBoundSymbol(it)
} }
qualifiedAccessExpression.resultType = FirResolvedTypeRefImpl( qualifiedAccessExpression.resultType = buildResolvedTypeRef {
null, implicitReceiver?.type ?: ConeKotlinErrorType("Unresolved this@$labelName") type = implicitReceiver?.type ?: ConeKotlinErrorType("Unresolved this@$labelName")
) }
qualifiedAccessExpression qualifiedAccessExpression
} }
is FirSuperReference -> { is FirSuperReference -> {
@@ -92,16 +97,18 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
val superTypeRefs = implicitReceiverStack.lastDispatchReceiver()?.boundSymbol?.phasedFir?.superTypeRefs val superTypeRefs = implicitReceiverStack.lastDispatchReceiver()?.boundSymbol?.phasedFir?.superTypeRefs
val resultType = when { val resultType = when {
superTypeRefs?.isNotEmpty() != true -> { superTypeRefs?.isNotEmpty() != true -> {
FirErrorTypeRefImpl( buildErrorTypeRef {
qualifiedAccessExpression.source, FirSimpleDiagnostic("No super type", DiagnosticKind.NoSupertype) source = qualifiedAccessExpression.source
) diagnostic = FirSimpleDiagnostic("No super type", DiagnosticKind.NoSupertype)
}
} }
superTypeRefs.size == 1 -> { superTypeRefs.size == 1 -> {
superTypeRefs.single() superTypeRefs.single()
} }
else -> { else -> {
FirComposedSuperTypeRefImpl(qualifiedAccessExpression.source).apply { buildComposedSuperTypeRef {
this.superTypeRefs += superTypeRefs.map { it as FirResolvedTypeRef } 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 = if (resultExpression == null) {
block.resultType.resolvedTypeFromPrototype(session.builtinTypes.unitType.type) block.resultType.resolvedTypeFromPrototype(session.builtinTypes.unitType.type)
} else { } 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) dataFlowAnalyzer.exitBlock(block)
return block.compose() return block.compose()
@@ -196,7 +205,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
override fun transformThisReceiverExpression( override fun transformThisReceiverExpression(
thisReceiverExpression: FirThisReceiverExpression, thisReceiverExpression: FirThisReceiverExpression,
data: ResolutionMode data: ResolutionMode,
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
return transformQualifiedAccessExpression(thisReceiverExpression, data) return transformQualifiedAccessExpression(thisReceiverExpression, data)
} }
@@ -219,14 +228,15 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
val operatorCall = operatorCall.transformArguments(this, ResolutionMode.ContextIndependent) val operatorCall = operatorCall.transformArguments(this, ResolutionMode.ContextIndependent)
val (leftArgument, rightArgument) = operatorCall.arguments val (leftArgument, rightArgument) = operatorCall.arguments
fun createFunctionCall(name: Name) = FirFunctionCallImpl(operatorCall.source).apply { fun createFunctionCall(name: Name) = buildFunctionCall {
source = operatorCall.source
explicitReceiver = leftArgument explicitReceiver = leftArgument
arguments += rightArgument arguments += rightArgument
calleeReference = FirSimpleNamedReference( calleeReference = buildSimpleNamedReference {
operatorCall.source, source = operatorCall.source
name, this.name = name
candidateSymbol = null candidateSymbol = null
) }
} }
// TODO: disable DataFlowAnalyzer for resolving that two calls // TODO: disable DataFlowAnalyzer for resolving that two calls
@@ -248,18 +258,24 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
operatorCallReference == null || (!lhsIsVar && !assignIsError) -> resolvedAssignCall.compose() operatorCallReference == null || (!lhsIsVar && !assignIsError) -> resolvedAssignCall.compose()
assignCallReference == null -> { assignCallReference == null -> {
val assignment = val assignment =
FirVariableAssignmentImpl(operatorCall.source, false, resolvedOperatorCall).apply { buildVariableAssignment {
lValue = if (lhsIsVar) source = operatorCall.source
safe = false
rValue = resolvedOperatorCall
calleeReference = if (lhsIsVar)
lhsReference!! lhsReference!!
else else
FirErrorNamedReferenceImpl(operatorCall.arguments.first().source, FirVariableExpectedError()) buildErrorNamedReference {
source = operatorCall.arguments.first().source
diagnostic = FirVariableExpectedError()
}
} }
assignment.transform(transformer, ResolutionMode.ContextIndependent) assignment.transform(transformer, ResolutionMode.ContextIndependent)
} }
else -> FirErrorExpressionImpl( else -> buildErrorExpression {
operatorCall.source, source = operatorCall.source
FirOperatorAmbiguityError(listOf(operatorCallReference.resolvedSymbol, assignCallReference.resolvedSymbol)) diagnostic = FirOperatorAmbiguityError(listOf(operatorCallReference.resolvedSymbol, assignCallReference.resolvedSymbol))
).compose() }.compose()
} }
} }
@@ -268,7 +284,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
override fun transformTypeOperatorCall( override fun transformTypeOperatorCall(
typeOperatorCall: FirTypeOperatorCall, typeOperatorCall: FirTypeOperatorCall,
data: ResolutionMode data: ResolutionMode,
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
val symbolProvider = session.firSymbolProvider val symbolProvider = session.firSymbolProvider
val resolved = (transformExpression(typeOperatorCall, data).single as FirTypeOperatorCall) val resolved = (transformExpression(typeOperatorCall, data).single as FirTypeOperatorCall)
@@ -284,8 +300,8 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
resolved.resultType = resolved.resultType =
resolved.conversionTypeRef.withReplacedConeType( resolved.conversionTypeRef.withReplacedConeType(
resolved.conversionTypeRef.coneTypeUnsafe<ConeKotlinType>().withNullability( resolved.conversionTypeRef.coneTypeUnsafe<ConeKotlinType>().withNullability(
ConeNullability.NULLABLE, session.inferenceContext ConeNullability.NULLABLE, session.inferenceContext,
) ),
) )
} }
else -> error("Unknown type operator") else -> error("Unknown type operator")
@@ -296,7 +312,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
override fun transformCheckNotNullCall( override fun transformCheckNotNullCall(
checkNotNullCall: FirCheckNotNullCall, checkNotNullCall: FirCheckNotNullCall,
data: ResolutionMode data: ResolutionMode,
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
// Resolve the return type of a call to the synthetic function with signature: // Resolve the return type of a call to the synthetic function with signature:
// fun <K> checkNotNull(arg: K?): K // fun <K> checkNotNull(arg: K?): K
@@ -312,7 +328,9 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
callCompleter.completeCall(it, data.expectedType) callCompleter.completeCall(it, data.expectedType)
} ?: run { } ?: run {
checkNotNullCall.resultType = checkNotNullCall.resultType =
FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Can't resolve !! operator call", DiagnosticKind.InferenceError)) buildErrorTypeRef {
diagnostic = FirSimpleDiagnostic("Can't resolve !! operator call", DiagnosticKind.InferenceError)
}
checkNotNullCall checkNotNullCall
} }
dataFlowAnalyzer.exitCheckNotNullCall(result) dataFlowAnalyzer.exitCheckNotNullCall(result)
@@ -321,18 +339,20 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
override fun transformBinaryLogicExpression( override fun transformBinaryLogicExpression(
binaryLogicExpression: FirBinaryLogicExpression, binaryLogicExpression: FirBinaryLogicExpression,
data: ResolutionMode data: ResolutionMode,
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
val booleanType = binaryLogicExpression.typeRef.resolvedTypeFromPrototype(builtinTypes.booleanType.type) val booleanType = binaryLogicExpression.typeRef.resolvedTypeFromPrototype(builtinTypes.booleanType.type)
return when (binaryLogicExpression.kind) { return when (binaryLogicExpression.kind) {
LogicOperationKind.AND -> LogicOperationKind.AND ->
binaryLogicExpression.also(dataFlowAnalyzer::enterBinaryAnd) 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) .transformRightOperand(this, ResolutionMode.WithExpectedType(booleanType)).also(dataFlowAnalyzer::exitBinaryAnd)
LogicOperationKind.OR -> LogicOperationKind.OR ->
binaryLogicExpression.also(dataFlowAnalyzer::enterBinaryOr) 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) .transformRightOperand(this, ResolutionMode.WithExpectedType(booleanType)).also(dataFlowAnalyzer::exitBinaryOr)
}.transformOtherChildren(transformer, ResolutionMode.WithExpectedType(booleanType)).also { }.transformOtherChildren(transformer, ResolutionMode.WithExpectedType(booleanType)).also {
it.resultType = booleanType it.resultType = booleanType
@@ -341,7 +361,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
override fun transformVariableAssignment( override fun transformVariableAssignment(
variableAssignment: FirVariableAssignment, variableAssignment: FirVariableAssignment,
data: ResolutionMode data: ResolutionMode,
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
// val resolvedAssignment = transformCallee(variableAssignment) // val resolvedAssignment = transformCallee(variableAssignment)
variableAssignment.annotations.forEach { it.accept(this, data) } variableAssignment.annotations.forEach { it.accept(this, data) }
@@ -362,7 +382,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
override fun transformCallableReferenceAccess( override fun transformCallableReferenceAccess(
callableReferenceAccess: FirCallableReferenceAccess, callableReferenceAccess: FirCallableReferenceAccess,
data: ResolutionMode data: ResolutionMode,
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
if (callableReferenceAccess.calleeReference is FirResolvedNamedReference) { if (callableReferenceAccess.calleeReference is FirResolvedNamedReference) {
return callableReferenceAccess.compose() return callableReferenceAccess.compose()
@@ -371,8 +391,8 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
callableReferenceAccess.annotations.forEach { it.accept(this, data) } callableReferenceAccess.annotations.forEach { it.accept(this, data) }
val explicitReceiver = callableReferenceAccess.explicitReceiver val explicitReceiver = callableReferenceAccess.explicitReceiver
val transformedLHS = explicitReceiver?.transformSingle(this, ResolutionMode.ContextIndependent)?.apply { val transformedLHS = explicitReceiver?.transformSingle(this, ResolutionMode.ContextIndependent)?.apply {
if (this is FirResolvedQualifierImpl && callableReferenceAccess.safe) { if (this is FirResolvedQualifier && callableReferenceAccess.safe) {
this.safe = true replaceSafe(true)
} }
} }
@@ -385,7 +405,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
if (data !is ResolutionMode.ContextDependent) { if (data !is ResolutionMode.ContextDependent) {
val resolvedReference = val resolvedReference =
components.syntheticCallGenerator.resolveCallableReferenceWithSyntheticOuterCall( components.syntheticCallGenerator.resolveCallableReferenceWithSyntheticOuterCall(
callableReferenceAccess, data.expectedType callableReferenceAccess, data.expectedType,
) ?: callableReferenceAccess ) ?: callableReferenceAccess
return resolvedReference.compose() return resolvedReference.compose()
@@ -408,7 +428,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
Array((symbol.phasedFir as? FirTypeParametersOwner)?.typeParameters?.size ?: 0) { Array((symbol.phasedFir as? FirTypeParametersOwner)?.typeParameters?.size ?: 0) {
ConeStarProjection ConeStarProjection
}, },
isNullable = false isNullable = false,
) )
} else { } else {
null null
@@ -424,16 +444,15 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
} }
transformedGetClassCall.resultType = transformedGetClassCall.resultType =
FirResolvedTypeRefImpl( buildResolvedTypeRef {
null, type = kClassSymbol.constructType(arrayOf(typeOfExpression), false)
kClassSymbol.constructType(arrayOf(typeOfExpression), false) }
)
return transformedGetClassCall.compose() return transformedGetClassCall.compose()
} }
override fun transformWrappedDelegateExpression( override fun transformWrappedDelegateExpression(
wrappedDelegateExpression: FirWrappedDelegateExpression, wrappedDelegateExpression: FirWrappedDelegateExpression,
data: ResolutionMode data: ResolutionMode,
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
transformExpression(wrappedDelegateExpression, data) transformExpression(wrappedDelegateExpression, data)
with(wrappedDelegateExpression) { 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) } constExpression.annotations.forEach { it.accept(this, data) }
val kind = constExpression.kind val kind = constExpression.kind
val symbol = when (kind) { val symbol = when (kind) {
@@ -473,10 +495,10 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
if (newConstKind == null) { if (newConstKind == null) {
constExpression.replaceKind(FirConstKind.Int as FirConstKind<T>) constExpression.replaceKind(FirConstKind.Int as FirConstKind<T>)
dataFlowAnalyzer.exitConstExpresion(constExpression as FirConstExpression<*>) dataFlowAnalyzer.exitConstExpresion(constExpression as FirConstExpression<*>)
constExpression.resultType = FirErrorTypeRefImpl( constExpression.resultType = buildErrorTypeRef {
constExpression.source, source = constExpression.source
FirTypeMismatchError(expectedType, integerLiteralType.getApproximatedType()) diagnostic = FirTypeMismatchError(expectedType, integerLiteralType.getApproximatedType())
) }
return constExpression.compose() return constExpression.compose()
} }
constExpression.replaceKind(newConstKind as FirConstKind<T>) constExpression.replaceKind(newConstKind as FirConstKind<T>)
@@ -500,29 +522,29 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
} }
private fun ConeKotlinTypeProjection.toFirTypeProjection(): FirTypeProjection = when (this) { private fun ConeKotlinTypeProjection.toFirTypeProjection(): FirTypeProjection = when (this) {
is ConeStarProjection -> FirStarProjectionImpl(null) is ConeStarProjection -> buildStarProjection()
else -> { 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) { val type = when (this) {
is ConeKotlinTypeProjectionIn -> type is ConeKotlinTypeProjectionIn -> type
is ConeKotlinTypeProjectionOut -> type is ConeKotlinTypeProjectionOut -> type
is ConeStarProjection -> throw IllegalStateException() is ConeStarProjection -> throw IllegalStateException()
else -> this as ConeKotlinType else -> this as ConeKotlinType
} }
FirTypeProjectionWithVarianceImpl( buildTypeProjectionWithVariance {
null, FirResolvedTypeRefImpl(null, type), variance 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( override fun transformDelegatedConstructorCall(
delegatedConstructorCall: FirDelegatedConstructorCall, delegatedConstructorCall: FirDelegatedConstructorCall,
data: ResolutionMode data: ResolutionMode,
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
if (transformer.implicitTypeOnly) return delegatedConstructorCall.compose() if (transformer.implicitTypeOnly) return delegatedConstructorCall.compose()
delegatedConstructorCall.transformChildren(transformer, ResolutionMode.ContextDependent) delegatedConstructorCall.transformChildren(transformer, ResolutionMode.ContextDependent)
@@ -553,7 +575,8 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
} }
else -> return delegatedConstructorCall.compose() 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() return callCompleter.completeCall(result, noExpectedType).compose()
} }
@@ -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.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef 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.CompositeTransformResult
import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
@@ -152,10 +152,9 @@ private class ReturnTypeCalculatorWithJump(
// TODO? // TODO?
declaration.transformReturnTypeRef( declaration.transformReturnTypeRef(
TransformImplicitType, TransformImplicitType,
FirErrorTypeRefImpl( buildErrorTypeRef {
null, diagnostic = FirSimpleDiagnostic("Unsupported: implicit VP type")
FirSimpleDiagnostic("Unsupported: implicit VP type") }
)
) )
} }
@@ -167,7 +166,7 @@ private class ReturnTypeCalculatorWithJump(
return when (val status = implicitBodyResolveComputationSession.getStatus(declaration.symbol)) { return when (val status = implicitBodyResolveComputationSession.getStatus(declaration.symbol)) {
is ImplicitBodyResolveComputationStatus.Computed -> status.resolvedTypeRef is ImplicitBodyResolveComputationStatus.Computed -> status.resolvedTypeRef
is ImplicitBodyResolveComputationStatus.Computing -> is ImplicitBodyResolveComputationStatus.Computing ->
FirErrorTypeRefImpl(null, FirSimpleDiagnostic("cycle", DiagnosticKind.RecursionInImplicitTypes)) buildErrorTypeRef {diagnostic = FirSimpleDiagnostic("cycle", DiagnosticKind.RecursionInImplicitTypes) }
else -> computeReturnTypeRef(declaration) else -> computeReturnTypeRef(declaration)
} }
} }
@@ -185,13 +184,12 @@ private class ReturnTypeCalculatorWithJump(
}.mapTo(mutableListOf()) { provider.getFirClassifierByFqName(it) } }.mapTo(mutableListOf()) { provider.getFirClassifierByFqName(it) }
if (file == null || outerClasses.any { it == null }) { if (file == null || outerClasses.any { it == null }) {
return FirErrorTypeRefImpl( return buildErrorTypeRef {
null, diagnostic = FirSimpleDiagnostic(
FirSimpleDiagnostic(
"Cannot calculate return type (local class/object?)", "Cannot calculate return type (local class/object?)",
DiagnosticKind.InferenceError DiagnosticKind.InferenceError
) )
) }
} }
val designation = (listOf(file) + outerClasses.filterNotNull().asReversed() + listOf(declaration)) val designation = (listOf(file) + outerClasses.filterNotNull().asReversed() + listOf(declaration))
val transformer = FirDesignatedBodyResolveTransformerForReturnTypeCalculator( val transformer = FirDesignatedBodyResolveTransformerForReturnTypeCalculator(
@@ -9,6 +9,9 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.FirValueParameter 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.FirSimpleFunctionImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -82,41 +85,40 @@ abstract class AbstractFirUseSiteMemberScope(
if (overriddenParameter.defaultValue != null) if (overriddenParameter.defaultValue != null)
createValueParameterCopy(overrideParameter, overriddenParameter.defaultValue).apply { createValueParameterCopy(overrideParameter, overriddenParameter.defaultValue).apply {
annotations += overrideParameter.annotations annotations += overrideParameter.annotations
} }.build()
else else
overrideParameter overrideParameter
} }
} }.build()
return newSymbol return newSymbol
} }
protected open fun createFunctionCopy(firSimpleFunction: FirSimpleFunction, newSymbol: FirNamedFunctionSymbol): FirSimpleFunctionImpl = protected open fun createFunctionCopy(firSimpleFunction: FirSimpleFunction, newSymbol: FirNamedFunctionSymbol): FirSimpleFunctionBuilder =
FirSimpleFunctionImpl( FirSimpleFunctionBuilder().apply {
firSimpleFunction.source, source = firSimpleFunction.source
firSimpleFunction.session, session = firSimpleFunction.session
firSimpleFunction.returnTypeRef, returnTypeRef = firSimpleFunction.returnTypeRef
firSimpleFunction.receiverTypeRef, receiverTypeRef = firSimpleFunction.receiverTypeRef
firSimpleFunction.status, name = firSimpleFunction.name
firSimpleFunction.name, status = firSimpleFunction.status
newSymbol symbol = 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 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( override fun processClassifiersByName(
name: Name, name: Name,
processor: (FirClassifierSymbol<*>) -> Unit processor: (FirClassifierSymbol<*>) -> Unit
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.fir.scopes.impl package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.FirSession 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.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.calls.TowerScopeLevel import org.jetbrains.kotlin.fir.resolve.calls.TowerScopeLevel
@@ -20,7 +20,7 @@ abstract class FirAbstractSimpleImportingScope(
scopeSession: ScopeSession scopeSession: ScopeSession
) : FirAbstractImportingScope(session, scopeSession, lookupInFir = true) { ) : FirAbstractImportingScope(session, scopeSession, lookupInFir = true) {
protected abstract val simpleImports: Map<Name, List<FirResolvedImportImpl>> protected abstract val simpleImports: Map<Name, List<FirResolvedImport>>
override fun processClassifiersByName( override fun processClassifiersByName(
name: Name, name: Name,
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirField
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter 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.ScopeSession
import org.jetbrains.kotlin.fir.resolve.substitution.ChainedSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ChainedSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor 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.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef 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.coneTypeUnsafe
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirClassSubstitutionScope( class FirClassSubstitutionScope(
@@ -127,10 +127,13 @@ class FirClassSubstitutionScope(
): Pair<List<FirTypeParameter>, ConeSubstitutor> { ): Pair<List<FirTypeParameter>, ConeSubstitutor> {
if (member.typeParameters.isEmpty()) return Pair(member.typeParameters, substitutor) if (member.typeParameters.isEmpty()) return Pair(member.typeParameters, substitutor)
val newTypeParameters = member.typeParameters.map { originalParameter -> val newTypeParameters = member.typeParameters.map { originalParameter ->
FirTypeParameterImpl( FirTypeParameterBuilder().apply {
originalParameter.source, originalParameter.session, originalParameter.name, source = originalParameter.source
FirTypeParameterSymbol(), originalParameter.variance, originalParameter.isReified session = originalParameter.session
).apply { name = originalParameter.name
symbol = FirTypeParameterSymbol()
variance = originalParameter.variance
isReified = originalParameter.isReified
annotations += originalParameter.annotations annotations += originalParameter.annotations
} }
} }
@@ -151,9 +154,10 @@ class FirClassSubstitutionScope(
} }
newTypeParameter.bounds += newTypeParameter.bounds +=
FirResolvedTypeRefImpl( buildResolvedTypeRef {
boundTypeRef.source, additionalSubstitutor.substituteOrSelf(substitutedBound ?: typeForBound) source = boundTypeRef.source
) type = additionalSubstitutor.substituteOrSelf(substitutedBound ?: typeForBound)
}
} }
} }
@@ -162,7 +166,7 @@ class FirClassSubstitutionScope(
// While common Ir contracts expect them to be different // While common Ir contracts expect them to be different
// if (!wereChangesInTypeParameters) return Pair(member.typeParameters, substitutor) // 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 { private fun createFakeOverrideProperty(original: FirPropertySymbol): FirPropertySymbol {
@@ -217,47 +221,43 @@ class FirClassSubstitutionScope(
newParameterTypes: List<ConeKotlinType?>? = null, newParameterTypes: List<ConeKotlinType?>? = null,
newTypeParameters: List<FirTypeParameter>? = null newTypeParameters: List<FirTypeParameter>? = null
): FirSimpleFunction { ): FirSimpleFunction {
return with(baseFunction) { // TODO: consider using here some light-weight functions instead of pseudo-real FirMemberFunctionImpl
// 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
// As second alternative, we can invent some light-weight kind of FirRegularClass return buildSimpleFunction {
FirSimpleFunctionImpl( source = baseFunction.source
source, this.session = session
session, returnTypeRef = baseFunction.returnTypeRef.withReplacedReturnType(newReturnType)
baseFunction.returnTypeRef.withReplacedReturnType(newReturnType), receiverTypeRef = baseFunction.receiverTypeRef?.withReplacedConeType(newReceiverType)
baseFunction.receiverTypeRef?.withReplacedConeType(newReceiverType), name = baseFunction.name
baseFunction.status, status = baseFunction.status
name, symbol = fakeOverrideSymbol
fakeOverrideSymbol annotations += baseFunction.annotations
).apply { resolvePhase = baseFunction.resolvePhase
annotations += baseFunction.annotations valueParameters += baseFunction.valueParameters.zip(
resolvePhase = baseFunction.resolvePhase newParameterTypes ?: List(baseFunction.valueParameters.size) { null }
valueParameters += baseFunction.valueParameters.zip( ) { valueParameter, newType ->
newParameterTypes ?: List(baseFunction.valueParameters.size) { null } buildValueParameter {
) { valueParameter, newType -> source = valueParameter.source
with(valueParameter) { this.session = session
FirValueParameterImpl( returnTypeRef = valueParameter.returnTypeRef.withReplacedConeType(newType)
source, name = valueParameter.name
session, symbol = FirVariableSymbol(valueParameter.symbol.callableId)
this.returnTypeRef.withReplacedConeType(newType), defaultValue = valueParameter.defaultValue
name, isCrossinline = valueParameter.isCrossinline
FirVariableSymbol(valueParameter.symbol.callableId), isNoinline = valueParameter.isNoinline
defaultValue, isVararg = valueParameter.isVararg
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: 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( fun createFakeOverrideFunction(
@@ -284,23 +284,18 @@ class FirClassSubstitutionScope(
newReturnType: ConeKotlinType? = null newReturnType: ConeKotlinType? = null
): FirPropertySymbol { ): FirPropertySymbol {
val symbol = FirPropertySymbol(baseSymbol.callableId, true, baseSymbol) val symbol = FirPropertySymbol(baseSymbol.callableId, true, baseSymbol)
with(baseProperty) { buildProperty {
FirPropertyImpl( source = baseProperty.source
source, this.session = session
session, returnTypeRef = baseProperty.returnTypeRef.withReplacedReturnType(newReturnType)
baseProperty.returnTypeRef.withReplacedReturnType(newReturnType), receiverTypeRef = baseProperty.receiverTypeRef?.withReplacedConeType(newReceiverType)
baseProperty.receiverTypeRef?.withReplacedConeType(newReceiverType), name = baseProperty.name
name, isVar = baseProperty.isVar
null, this.symbol = symbol
null, isLocal = false
isVar, status = baseProperty.status
symbol, resolvePhase = baseProperty.resolvePhase
false, annotations += baseProperty.annotations
baseProperty.status
).apply {
resolvePhase = baseProperty.resolvePhase
annotations += baseProperty.annotations
}
} }
return symbol return symbol
} }
@@ -312,15 +307,16 @@ class FirClassSubstitutionScope(
newReturnType: ConeKotlinType? = null newReturnType: ConeKotlinType? = null
): FirFieldSymbol { ): FirFieldSymbol {
val symbol = FirFieldSymbol(baseSymbol.callableId) val symbol = FirFieldSymbol(baseSymbol.callableId)
with(baseField) { buildField {
FirFieldImpl( source = baseField.source
source, session, this.session = session
baseField.returnTypeRef.withReplacedConeType(newReturnType), returnTypeRef = baseField.returnTypeRef.withReplacedConeType(newReturnType)
name, symbol, isVar, baseField.status name = baseField.name
).apply { this.symbol = symbol
resolvePhase = baseField.resolvePhase isVar = baseField.isVar
annotations += baseField.annotations status = baseField.status
} resolvePhase = baseField.resolvePhase
annotations += baseField.annotations
} }
return symbol return symbol
} }
@@ -345,7 +341,9 @@ fun FirTypeRef.withReplacedReturnType(newType: ConeKotlinType?): FirTypeRef {
require(this is FirResolvedTypeRef || newType == null) require(this is FirResolvedTypeRef || newType == null)
if (newType == null) return this if (newType == null) return this
return FirResolvedTypeRefImpl(source, newType).apply { return buildResolvedTypeRef {
source = this@withReplacedReturnType.source
type = newType
annotations += this@withReplacedReturnType.annotations annotations += this@withReplacedReturnType.annotations
} }
} }
@@ -354,7 +352,9 @@ fun FirTypeRef.withReplacedConeType(newType: ConeKotlinType?): FirResolvedTypeRe
require(this is FirResolvedTypeRef) require(this is FirResolvedTypeRef)
if (newType == null) return this if (newType == null) return this
return FirResolvedTypeRefImpl(source, newType).apply { return buildResolvedTypeRef {
source = this@withReplacedConeType.source
type = newType
annotations += this@withReplacedConeType.annotations annotations += this@withReplacedConeType.annotations
} }
} }
@@ -7,8 +7,9 @@ package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.impl.FirImportImpl 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.declarations.builder.buildImport
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer
@@ -18,8 +19,8 @@ class FirDefaultSimpleImportingScope(
priority: DefaultImportPriority priority: DefaultImportPriority
) : FirAbstractSimpleImportingScope(session, scopeSession) { ) : FirAbstractSimpleImportingScope(session, scopeSession) {
private fun FirImportImpl.resolve(importResolveTransformer: FirImportResolveTransformer) = private fun FirImport.resolve(importResolveTransformer: FirImportResolveTransformer) =
importResolveTransformer.transformImport(this, null).single as FirResolvedImportImpl importResolveTransformer.transformImport(this, null).single as FirResolvedImport
override val simpleImports = run { override val simpleImports = run {
val importResolveTransformer = FirImportResolveTransformer(session) val importResolveTransformer = FirImportResolveTransformer(session)
@@ -28,8 +29,10 @@ class FirDefaultSimpleImportingScope(
allDefaultImports allDefaultImports
?.filter { !it.isAllUnder } ?.filter { !it.isAllUnder }
?.map { ?.map {
FirImportImpl(null, it.fqName, isAllUnder = false, aliasName = null) buildImport {
.resolve(importResolveTransformer) importedFqName = it.fqName
isAllUnder = false
}.resolve(importResolveTransformer)
}?.groupBy { it.importedName!! } ?: emptyMap() }?.groupBy { it.importedName!! } ?: emptyMap()
} }
} }
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.impl.FirImportImpl import org.jetbrains.kotlin.fir.declarations.builder.buildImport
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl import org.jetbrains.kotlin.fir.declarations.builder.buildResolvedImport
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
class FirDefaultStarImportingScope( class FirDefaultStarImportingScope(
@@ -24,11 +24,13 @@ class FirDefaultStarImportingScope(
allDefaultImports allDefaultImports
?.filter { it.isAllUnder } ?.filter { it.isAllUnder }
?.map { ?.map {
FirResolvedImportImpl( buildResolvedImport {
FirImportImpl(null, it.fqName, isAllUnder = true, aliasName = null), delegate = buildImport {
it.fqName, importedFqName = it.fqName
null isAllUnder = true
) }
packageFqName = it.fqName
}
} ?: emptyList() } ?: emptyList()
} }
} }
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirImport 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 import org.jetbrains.kotlin.fir.resolve.ScopeSession
class FirExplicitSimpleImportingScope( class FirExplicitSimpleImportingScope(
@@ -17,7 +17,7 @@ class FirExplicitSimpleImportingScope(
) : FirAbstractSimpleImportingScope(session, scopeSession) { ) : FirAbstractSimpleImportingScope(session, scopeSession) {
override val simpleImports = override val simpleImports =
imports.filterIsInstance<FirResolvedImportImpl>() imports.filterIsInstance<FirResolvedImport>()
.filter { !it.isAllUnder && it.importedName != null } .filter { !it.isAllUnder && it.importedName != null }
.groupBy { it.aliasName ?: it.importedName!! } .groupBy { it.aliasName ?: it.importedName!! }
} }
@@ -7,19 +7,15 @@ package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.FirSymbolOwner
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction 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.FirResolvedDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl 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.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl
import org.jetbrains.kotlin.fir.resolve.scopeSessionKey import org.jetbrains.kotlin.fir.resolve.scopeSessionKey
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
@@ -80,17 +76,17 @@ class FirIntegerLiteralTypeScope(private val session: FirSession) : FirScope() {
name to FirNamedFunctionSymbol(CallableId(name)).apply { name to FirNamedFunctionSymbol(CallableId(name)).apply {
createFirFunction(name, this).apply { createFirFunction(name, this).apply {
val valueParameterName = Name.identifier("arg") val valueParameterName = Name.identifier("arg")
valueParameters += FirValueParameterImpl( valueParameters += buildValueParameter {
source = null, source = null
session, session = this@FirIntegerLiteralTypeScope.session
FirILTTypeRefPlaceHolder(), returnTypeRef = FirILTTypeRefPlaceHolder()
valueParameterName, this.name = valueParameterName
FirVariableSymbol(name), symbol = FirVariableSymbol(valueParameterName)
defaultValue = null, defaultValue = null
isCrossinline = false, isCrossinline = false
isNoinline = false, isNoinline = false
isVararg = false isVararg = false
) }
} }
} }
}.toMap() }.toMap()
@@ -99,6 +95,7 @@ class FirIntegerLiteralTypeScope(private val session: FirSession) : FirScope() {
name to FirNamedFunctionSymbol(CallableId(name)).apply { createFirFunction(name, this) } name to FirNamedFunctionSymbol(CallableId(name)).apply { createFirFunction(name, this) }
}.toMap() }.toMap()
@UseExperimental(FirImplementationDetail::class)
private fun createFirFunction(name: Name, symbol: FirNamedFunctionSymbol): FirSimpleFunctionImpl = FirIntegerOperator( private fun createFirFunction(name: Name, symbol: FirNamedFunctionSymbol): FirSimpleFunctionImpl = FirIntegerOperator(
source = null, source = null,
session, session,
@@ -126,7 +123,8 @@ class FirIntegerLiteralTypeScope(private val session: FirSession) : FirScope() {
} }
} }
class FirIntegerOperator( @UseExperimental(FirImplementationDetail::class)
class FirIntegerOperator @FirImplementationDetail constructor(
source: FirSourceElement?, source: FirSourceElement?,
session: FirSession, session: FirSession,
returnTypeRef: FirTypeRef, returnTypeRef: FirTypeRef,
@@ -134,7 +132,21 @@ class FirIntegerOperator(
val kind: Kind, val kind: Kind,
status: FirDeclarationStatus, status: FirDeclarationStatus,
symbol: FirFunctionSymbol<FirSimpleFunction> 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) { enum class Kind(val unary: Boolean, val operatorName: Name) {
PLUS(false, OperatorNameConventions.PLUS), PLUS(false, OperatorNameConventions.PLUS),
MINUS(false, OperatorNameConventions.MINUS), MINUS(false, OperatorNameConventions.MINUS),
@@ -166,4 +178,3 @@ class FirILTTypeRefPlaceHolder : FirResolvedTypeRef() {
} }
} }
class FirIntegerOperatorCall(source: FirSourceElement?) : FirFunctionCallImpl(source)
@@ -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 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.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.fir.types.impl.FirUserTypeRefImpl
import org.jetbrains.kotlin.load.java.structure.JavaType import org.jetbrains.kotlin.load.java.structure.JavaType
class FirJavaTypeRef( class FirJavaTypeRef(
annotations: List<FirAnnotationCall>, val type: JavaType,
val type: JavaType annotations: MutableList<FirAnnotationCall>,
) : FirUserTypeRefImpl(source = null, isMarkedNullable = false) { qualifier: MutableList<FirQualifierPart>
init { ) : FirUserTypeRefImpl(
this.annotations += annotations 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 var firFile: FirFile? = null
val time = measureNanoTime { val time = measureNanoTime {
firFile = builder.buildFirFile(file) firFile = builder.buildFirFile(file)
(builder.session.firProvider as FirProviderImpl).recordFile(firFile!!) (builder.baseSession.firProvider as FirProviderImpl).recordFile(firFile!!)
} }
val after = vmStateSnapshot() val after = vmStateSnapshot()
val diff = after - before val diff = after - before
+1 -1
View File
@@ -28,7 +28,7 @@ dependencies {
generatorClasspath(project("tree-generator")) 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) { val generateTree by tasks.registering(NoDebugJavaExec::class) {
-1
View File
@@ -1 +0,0 @@
*.kt eol=lf
@@ -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()
}
@@ -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()
}
@@ -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()
}
@@ -15,11 +15,10 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
*/ */
class FirContractDescriptionImpl( internal class FirContractDescriptionImpl(
override val source: FirSourceElement? override val source: FirSourceElement?,
override val effects: MutableList<ConeEffectDeclaration>,
) : FirContractDescription() { ) : FirContractDescription() {
override val effects: MutableList<ConeEffectDeclaration> = mutableListOf()
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {} override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirContractDescriptionImpl { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirContractDescriptionImpl {
@@ -21,5 +21,7 @@ interface FirContractDescriptionOwner : FirElement {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitContractDescriptionOwner(this, data) 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 fun <D> transformContractDescription(transformer: FirTransformer<D>, data: D): FirContractDescriptionOwner
} }
@@ -33,6 +33,7 @@ interface FirRegularClass : FirMemberDeclaration, FirTypeParametersOwner, FirCla
val name: Name val name: Name
override val symbol: FirRegularClassSymbol override val symbol: FirRegularClassSymbol
val companionObject: FirRegularClass? val companionObject: FirRegularClass?
val hasLazyNestedClassifiers: Boolean
override val superTypeRefs: List<FirTypeRef> override val superTypeRefs: List<FirTypeRef>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitRegularClass(this, data) 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 name: Name
abstract override val symbol: FirRegularClassSymbol abstract override val symbol: FirRegularClassSymbol
abstract override val companionObject: FirRegularClass? abstract override val companionObject: FirRegularClass?
abstract override val hasLazyNestedClassifiers: Boolean
abstract override val superTypeRefs: List<FirTypeRef> abstract override val superTypeRefs: List<FirTypeRef>
abstract val inheritors: List<ClassId> abstract val inheritors: List<ClassId>
@@ -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
}
@@ -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
}
@@ -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()
}
@@ -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()
}
@@ -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()
}
@@ -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<*>
}
@@ -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()
}
@@ -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()
}
@@ -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()
}
@@ -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()
}
@@ -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()
}
@@ -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