[FIR] Implement builders for leaf nodes of FIR tree
This commit is contained in:
@@ -16,8 +16,8 @@ import org.jetbrains.kotlin.fir.expressions.impl.*
|
|||||||
import org.jetbrains.kotlin.fir.references.FirReference
|
import org.jetbrains.kotlin.fir.references.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()
|
||||||
|
}
|
||||||
+87
-28
@@ -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()
|
||||||
|
}
|
||||||
+84
-13
@@ -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()
|
||||||
|
}
|
||||||
+60
-56
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+66
-64
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+22
-24
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+15
-6
@@ -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) {
|
||||||
|
|||||||
+21
-41
@@ -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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+421
-416
File diff suppressed because it is too large
Load Diff
+294
-185
@@ -11,40 +11,36 @@ import com.intellij.util.diff.FlyweightCapableTreeStructure
|
|||||||
import org.jetbrains.kotlin.KtNodeTypes.*
|
import org.jetbrains.kotlin.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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+26
-30
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+2
-13
@@ -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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-15
@@ -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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-13
@@ -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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-12
@@ -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
+4
-1
@@ -22,6 +22,8 @@ import org.jetbrains.kotlin.fir.declarations.FirFile
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
import org.jetbrains.kotlin.fir.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
|
||||||
|
|||||||
+32
-29
@@ -13,19 +13,19 @@ import org.jetbrains.kotlin.fir.declarations.collectEnumEntries
|
|||||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
import org.jetbrains.kotlin.fir.diagnostics.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)
|
||||||
}
|
}
|
||||||
|
|||||||
+22
-38
@@ -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()
|
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+87
-113
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+48
-47
@@ -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"),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+19
-20
@@ -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
|
||||||
|
|||||||
+2
@@ -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
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|||||||
+7
-7
@@ -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!! })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-3
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.calls
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
import org.jetbrains.kotlin.fir.expressions.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 {
|
||||||
|
|||||||
+26
-19
@@ -8,10 +8,11 @@ package org.jetbrains.kotlin.fir.resolve.dfa.contracts
|
|||||||
import org.jetbrains.kotlin.fir.contracts.description.*
|
import org.jetbrains.kotlin.fir.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? {
|
||||||
|
|||||||
+75
-86
@@ -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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-14
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+75
-77
@@ -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)
|
||||||
|
|||||||
+6
-4
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.FirSession
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
import org.jetbrains.kotlin.fir.declarations.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? {
|
||||||
|
|||||||
+11
-13
@@ -10,8 +10,8 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
|||||||
import org.jetbrains.kotlin.fir.resolve.FirTypeResolver
|
import org.jetbrains.kotlin.fir.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()
|
||||||
|
|||||||
+5
-2
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirMemberTypeParameterScope
|
|||||||
import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope
|
import org.jetbrains.kotlin.fir.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>()
|
||||||
|
|||||||
+85
-77
@@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-1
@@ -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
|
||||||
|
|||||||
+22
-13
@@ -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,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
+4
-5
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
|||||||
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
|
import org.jetbrains.kotlin.fir.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
|
||||||
)
|
)
|
||||||
)
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope
|
|||||||
import org.jetbrains.kotlin.fir.scopes.impl.FirTypeResolveScopeForBodyResolve
|
import org.jetbrains.kotlin.fir.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
|
||||||
|
|||||||
+8
-5
@@ -15,13 +15,12 @@ import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
|||||||
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
|
import org.jetbrains.kotlin.fir.resolve.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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+43
-34
@@ -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,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+95
-72
@@ -11,13 +11,15 @@ import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner
|
|||||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
import org.jetbrains.kotlin.fir.diagnostics.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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+8
-10
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.fir.resolve.transformers.TransformImplicitType
|
|||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
import org.jetbrains.kotlin.fir.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(
|
||||||
|
|||||||
+28
-26
@@ -9,6 +9,9 @@ import org.jetbrains.kotlin.fir.FirSession
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirFunction
|
import org.jetbrains.kotlin.fir.declarations.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
|
||||||
|
|||||||
+2
-2
@@ -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,
|
||||||
|
|||||||
+76
-76
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirField
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
import org.jetbrains.kotlin.fir.declarations.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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-6
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-7
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -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!! }
|
||||||
}
|
}
|
||||||
|
|||||||
+30
-19
@@ -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)
|
|
||||||
+83
@@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.scopes.impl
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirImplementationDetail
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.builder.FirCallBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
||||||
|
import org.jetbrains.kotlin.fir.references.FirNamedReference
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeProjection
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef
|
||||||
|
|
||||||
|
@UseExperimental(FirImplementationDetail::class)
|
||||||
|
class FirIntegerOperatorCall @FirImplementationDetail constructor(
|
||||||
|
source: FirSourceElement?,
|
||||||
|
typeRef: FirTypeRef,
|
||||||
|
annotations: MutableList<FirAnnotationCall>,
|
||||||
|
safe: Boolean,
|
||||||
|
typeArguments: MutableList<FirTypeProjection>,
|
||||||
|
explicitReceiver: FirExpression?,
|
||||||
|
dispatchReceiver: FirExpression,
|
||||||
|
extensionReceiver: FirExpression,
|
||||||
|
arguments: MutableList<FirExpression>,
|
||||||
|
calleeReference: FirNamedReference,
|
||||||
|
) : FirFunctionCallImpl(
|
||||||
|
source,
|
||||||
|
typeRef,
|
||||||
|
annotations,
|
||||||
|
safe,
|
||||||
|
typeArguments,
|
||||||
|
explicitReceiver,
|
||||||
|
dispatchReceiver,
|
||||||
|
extensionReceiver,
|
||||||
|
arguments,
|
||||||
|
calleeReference,
|
||||||
|
)
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
class FirIntegerOperatorCallBuilder : FirQualifiedAccessBuilder, FirCallBuilder, FirAnnotationContainerBuilder, FirExpressionBuilder {
|
||||||
|
override var source: FirSourceElement? = null
|
||||||
|
override var typeRef: FirTypeRef = buildImplicitTypeRef()
|
||||||
|
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||||
|
override var safe: Boolean = false
|
||||||
|
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
|
||||||
|
override var explicitReceiver: FirExpression? = null
|
||||||
|
override var dispatchReceiver: FirExpression = FirNoReceiverExpression
|
||||||
|
override var extensionReceiver: FirExpression = FirNoReceiverExpression
|
||||||
|
override val arguments: MutableList<FirExpression> = mutableListOf()
|
||||||
|
lateinit var calleeReference: FirNamedReference
|
||||||
|
|
||||||
|
@UseExperimental(FirImplementationDetail::class)
|
||||||
|
override fun build(): FirIntegerOperatorCall {
|
||||||
|
return FirIntegerOperatorCall(
|
||||||
|
source,
|
||||||
|
typeRef,
|
||||||
|
annotations,
|
||||||
|
safe,
|
||||||
|
typeArguments,
|
||||||
|
explicitReceiver,
|
||||||
|
dispatchReceiver,
|
||||||
|
extensionReceiver,
|
||||||
|
arguments,
|
||||||
|
calleeReference,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun buildFunctionCall(init: FirIntegerOperatorCallBuilder.() -> Unit): FirIntegerOperatorCall {
|
||||||
|
return FirIntegerOperatorCallBuilder().apply(init).build()
|
||||||
|
}
|
||||||
@@ -5,15 +5,43 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.types.jvm
|
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
|
||||||
|
|||||||
@@ -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 +0,0 @@
|
|||||||
*.kt eol=lf
|
|
||||||
+42
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.builder
|
||||||
|
|
||||||
|
import kotlin.contracts.*
|
||||||
|
import org.jetbrains.kotlin.fir.FirAnnotationContainer
|
||||||
|
import org.jetbrains.kotlin.fir.FirPureAbstractElement
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
class FirAbstractAnnotatedElementBuilder {
|
||||||
|
var source: FirSourceElement? = null
|
||||||
|
val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||||
|
|
||||||
|
fun build(): FirAnnotationContainer {
|
||||||
|
return FirAbstractAnnotatedElement(
|
||||||
|
source,
|
||||||
|
annotations,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseExperimental(ExperimentalContracts::class)
|
||||||
|
inline fun buildAbstractAnnotatedElement(init: FirAbstractAnnotatedElementBuilder.() -> Unit = {}): FirAnnotationContainer {
|
||||||
|
contract {
|
||||||
|
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||||
|
}
|
||||||
|
return FirAbstractAnnotatedElementBuilder().apply(init).build()
|
||||||
|
}
|
||||||
+25
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.builder
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirAnnotationContainer
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
interface FirAnnotationContainerBuilder {
|
||||||
|
abstract var source: FirSourceElement?
|
||||||
|
abstract val annotations: MutableList<FirAnnotationCall>
|
||||||
|
|
||||||
|
fun build(): FirAnnotationContainer
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.builder
|
||||||
|
|
||||||
|
import kotlin.contracts.*
|
||||||
|
import org.jetbrains.kotlin.fir.FirLabel
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.impl.FirLabelImpl
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
class FirLabelBuilder {
|
||||||
|
var source: FirSourceElement? = null
|
||||||
|
lateinit var name: String
|
||||||
|
|
||||||
|
fun build(): FirLabel {
|
||||||
|
return FirLabelImpl(
|
||||||
|
source,
|
||||||
|
name,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseExperimental(ExperimentalContracts::class)
|
||||||
|
inline fun buildLabel(init: FirLabelBuilder.() -> Unit): FirLabel {
|
||||||
|
contract {
|
||||||
|
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||||
|
}
|
||||||
|
return FirLabelBuilder().apply(init).build()
|
||||||
|
}
|
||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.contracts.builder
|
||||||
|
|
||||||
|
import kotlin.contracts.*
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
|
||||||
|
import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.contracts.impl.FirContractDescriptionImpl
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
class FirContractDescriptionBuilder {
|
||||||
|
var source: FirSourceElement? = null
|
||||||
|
val effects: MutableList<ConeEffectDeclaration> = mutableListOf()
|
||||||
|
|
||||||
|
fun build(): FirContractDescription {
|
||||||
|
return FirContractDescriptionImpl(
|
||||||
|
source,
|
||||||
|
effects,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseExperimental(ExperimentalContracts::class)
|
||||||
|
inline fun buildContractDescription(init: FirContractDescriptionBuilder.() -> Unit = {}): FirContractDescription {
|
||||||
|
contract {
|
||||||
|
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||||
|
}
|
||||||
|
return FirContractDescriptionBuilder().apply(init).build()
|
||||||
|
}
|
||||||
+3
-4
@@ -15,11 +15,10 @@ import org.jetbrains.kotlin.fir.visitors.*
|
|||||||
* DO NOT MODIFY IT MANUALLY
|
* 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 {
|
||||||
|
|||||||
+2
@@ -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>
|
||||||
|
|
||||||
|
|||||||
+48
@@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.declarations.builder
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.builder.FirClassBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParametersOwnerBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
interface AbstractFirRegularClassBuilder : FirClassBuilder, FirTypeParametersOwnerBuilder {
|
||||||
|
abstract override var source: FirSourceElement?
|
||||||
|
abstract override val annotations: MutableList<FirAnnotationCall>
|
||||||
|
abstract override var session: FirSession
|
||||||
|
abstract override var classKind: ClassKind
|
||||||
|
abstract override val superTypeRefs: MutableList<FirTypeRef>
|
||||||
|
abstract override val declarations: MutableList<FirDeclaration>
|
||||||
|
abstract override var scopeProvider: FirScopeProvider
|
||||||
|
abstract override val typeParameters: MutableList<FirTypeParameter>
|
||||||
|
abstract var resolvePhase: FirResolvePhase
|
||||||
|
abstract var status: FirDeclarationStatus
|
||||||
|
abstract var name: Name
|
||||||
|
abstract var symbol: FirRegularClassSymbol
|
||||||
|
abstract var companionObject: FirRegularClass?
|
||||||
|
abstract var hasLazyNestedClassifiers: Boolean
|
||||||
|
override fun build(): FirRegularClass
|
||||||
|
}
|
||||||
+48
@@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.declarations.builder
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.builder.FirFunctionBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
|
||||||
|
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
interface FirAbstractConstructorBuilder : FirFunctionBuilder {
|
||||||
|
abstract override var source: FirSourceElement?
|
||||||
|
abstract override val annotations: MutableList<FirAnnotationCall>
|
||||||
|
abstract override var session: FirSession
|
||||||
|
abstract override var returnTypeRef: FirTypeRef
|
||||||
|
abstract override val typeParameters: MutableList<FirTypeParameter>
|
||||||
|
abstract override val valueParameters: MutableList<FirValueParameter>
|
||||||
|
abstract override var body: FirBlock?
|
||||||
|
abstract var resolvePhase: FirResolvePhase
|
||||||
|
abstract var receiverTypeRef: FirTypeRef?
|
||||||
|
abstract var controlFlowGraphReference: FirControlFlowGraphReference
|
||||||
|
abstract var status: FirDeclarationStatus
|
||||||
|
abstract var containerSource: DeserializedContainerSource?
|
||||||
|
abstract var symbol: FirConstructorSymbol
|
||||||
|
abstract var delegatedConstructor: FirDelegatedConstructorCall?
|
||||||
|
override fun build(): FirConstructor
|
||||||
|
}
|
||||||
+81
@@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.declarations.builder
|
||||||
|
|
||||||
|
import kotlin.contracts.*
|
||||||
|
import org.jetbrains.kotlin.contracts.description.InvocationKind
|
||||||
|
import org.jetbrains.kotlin.fir.FirLabel
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.builder.FirFunctionBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirAnonymousFunctionImpl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableFunction
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||||
|
import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReference
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
class FirAnonymousFunctionBuilder : FirFunctionBuilder, FirAnnotationContainerBuilder, FirExpressionBuilder {
|
||||||
|
override var source: FirSourceElement? = null
|
||||||
|
override lateinit var session: FirSession
|
||||||
|
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||||
|
override lateinit var returnTypeRef: FirTypeRef
|
||||||
|
var receiverTypeRef: FirTypeRef? = null
|
||||||
|
override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||||
|
var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference
|
||||||
|
override val valueParameters: MutableList<FirValueParameter> = mutableListOf()
|
||||||
|
override var body: FirBlock? = null
|
||||||
|
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
|
||||||
|
lateinit var symbol: FirAnonymousFunctionSymbol
|
||||||
|
var label: FirLabel? = null
|
||||||
|
var invocationKind: InvocationKind? = null
|
||||||
|
var isLambda: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
|
||||||
|
|
||||||
|
override fun build(): FirAnonymousFunction {
|
||||||
|
return FirAnonymousFunctionImpl(
|
||||||
|
source,
|
||||||
|
session,
|
||||||
|
annotations,
|
||||||
|
returnTypeRef,
|
||||||
|
receiverTypeRef,
|
||||||
|
typeParameters,
|
||||||
|
controlFlowGraphReference,
|
||||||
|
valueParameters,
|
||||||
|
body,
|
||||||
|
typeRef,
|
||||||
|
symbol,
|
||||||
|
label,
|
||||||
|
invocationKind,
|
||||||
|
isLambda,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseExperimental(ExperimentalContracts::class)
|
||||||
|
inline fun buildAnonymousFunction(init: FirAnonymousFunctionBuilder.() -> Unit): FirAnonymousFunction {
|
||||||
|
contract {
|
||||||
|
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||||
|
}
|
||||||
|
return FirAnonymousFunctionBuilder().apply(init).build()
|
||||||
|
}
|
||||||
+47
@@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.declarations.builder
|
||||||
|
|
||||||
|
import kotlin.contracts.*
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirAnonymousInitializer
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirAnonymousInitializerImpl
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
class FirAnonymousInitializerBuilder {
|
||||||
|
var source: FirSourceElement? = null
|
||||||
|
lateinit var session: FirSession
|
||||||
|
var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||||
|
var body: FirBlock? = null
|
||||||
|
|
||||||
|
fun build(): FirAnonymousInitializer {
|
||||||
|
return FirAnonymousInitializerImpl(
|
||||||
|
source,
|
||||||
|
session,
|
||||||
|
resolvePhase,
|
||||||
|
body,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseExperimental(ExperimentalContracts::class)
|
||||||
|
inline fun buildAnonymousInitializer(init: FirAnonymousInitializerBuilder.() -> Unit): FirAnonymousInitializer {
|
||||||
|
contract {
|
||||||
|
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||||
|
}
|
||||||
|
return FirAnonymousInitializerBuilder().apply(init).build()
|
||||||
|
}
|
||||||
+69
@@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.declarations.builder
|
||||||
|
|
||||||
|
import kotlin.contracts.*
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.builder.FirClassBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirAnonymousObjectImpl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableClass
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
class FirAnonymousObjectBuilder : FirClassBuilder, FirAnnotationContainerBuilder, FirExpressionBuilder {
|
||||||
|
override var source: FirSourceElement? = null
|
||||||
|
override lateinit var session: FirSession
|
||||||
|
var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||||
|
override lateinit var classKind: ClassKind
|
||||||
|
override val superTypeRefs: MutableList<FirTypeRef> = mutableListOf()
|
||||||
|
override val declarations: MutableList<FirDeclaration> = mutableListOf()
|
||||||
|
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||||
|
override lateinit var scopeProvider: FirScopeProvider
|
||||||
|
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
|
||||||
|
lateinit var symbol: FirAnonymousObjectSymbol
|
||||||
|
|
||||||
|
override fun build(): FirAnonymousObject {
|
||||||
|
return FirAnonymousObjectImpl(
|
||||||
|
source,
|
||||||
|
session,
|
||||||
|
resolvePhase,
|
||||||
|
classKind,
|
||||||
|
superTypeRefs,
|
||||||
|
declarations,
|
||||||
|
annotations,
|
||||||
|
scopeProvider,
|
||||||
|
typeRef,
|
||||||
|
symbol,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseExperimental(ExperimentalContracts::class)
|
||||||
|
inline fun buildAnonymousObject(init: FirAnonymousObjectBuilder.() -> Unit): FirAnonymousObject {
|
||||||
|
contract {
|
||||||
|
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||||
|
}
|
||||||
|
return FirAnonymousObjectBuilder().apply(init).build()
|
||||||
|
}
|
||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.declarations.builder
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
interface FirClassBuilder : FirAnnotationContainerBuilder {
|
||||||
|
abstract override var source: FirSourceElement?
|
||||||
|
abstract override val annotations: MutableList<FirAnnotationCall>
|
||||||
|
abstract var session: FirSession
|
||||||
|
abstract var classKind: ClassKind
|
||||||
|
abstract val superTypeRefs: MutableList<FirTypeRef>
|
||||||
|
abstract val declarations: MutableList<FirDeclaration>
|
||||||
|
abstract var scopeProvider: FirScopeProvider
|
||||||
|
override fun build(): FirClass<*>
|
||||||
|
}
|
||||||
+84
@@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.declarations.builder
|
||||||
|
|
||||||
|
import kotlin.contracts.*
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
|
import org.jetbrains.kotlin.fir.FirPureAbstractElement
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.builder.AbstractFirRegularClassBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirClassImpl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableRegularClass
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
open class FirClassImplBuilder : AbstractFirRegularClassBuilder, FirAnnotationContainerBuilder {
|
||||||
|
override var source: FirSourceElement? = null
|
||||||
|
override lateinit var session: FirSession
|
||||||
|
override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||||
|
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||||
|
override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||||
|
override lateinit var status: FirDeclarationStatus
|
||||||
|
override lateinit var classKind: ClassKind
|
||||||
|
override val declarations: MutableList<FirDeclaration> = mutableListOf()
|
||||||
|
override lateinit var scopeProvider: FirScopeProvider
|
||||||
|
override lateinit var name: Name
|
||||||
|
override lateinit var symbol: FirRegularClassSymbol
|
||||||
|
override var companionObject: FirRegularClass? = null
|
||||||
|
override val superTypeRefs: MutableList<FirTypeRef> = mutableListOf()
|
||||||
|
|
||||||
|
override fun build(): FirRegularClass {
|
||||||
|
return FirClassImpl(
|
||||||
|
source,
|
||||||
|
session,
|
||||||
|
resolvePhase,
|
||||||
|
annotations,
|
||||||
|
typeParameters,
|
||||||
|
status,
|
||||||
|
classKind,
|
||||||
|
declarations,
|
||||||
|
scopeProvider,
|
||||||
|
name,
|
||||||
|
symbol,
|
||||||
|
companionObject,
|
||||||
|
superTypeRefs,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Deprecated("Modification of 'hasLazyNestedClassifiers' has no impact for FirClassImplBuilder", level = DeprecationLevel.HIDDEN)
|
||||||
|
override var hasLazyNestedClassifiers: Boolean
|
||||||
|
get() = throw IllegalStateException()
|
||||||
|
set(value) {
|
||||||
|
throw IllegalStateException()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseExperimental(ExperimentalContracts::class)
|
||||||
|
inline fun buildClassImpl(init: FirClassImplBuilder.() -> Unit): FirRegularClass {
|
||||||
|
contract {
|
||||||
|
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||||
|
}
|
||||||
|
return FirClassImplBuilder().apply(init).build()
|
||||||
|
}
|
||||||
+85
@@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.declarations.builder
|
||||||
|
|
||||||
|
import kotlin.contracts.*
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.builder.FirAbstractConstructorBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirConstructorImpl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableConstructor
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
|
||||||
|
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||||
|
import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReference
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
open class FirConstructorBuilder : FirAbstractConstructorBuilder, FirAnnotationContainerBuilder {
|
||||||
|
override var source: FirSourceElement? = null
|
||||||
|
override lateinit var session: FirSession
|
||||||
|
override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||||
|
override lateinit var returnTypeRef: FirTypeRef
|
||||||
|
override var receiverTypeRef: FirTypeRef? = null
|
||||||
|
override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||||
|
override val valueParameters: MutableList<FirValueParameter> = mutableListOf()
|
||||||
|
override lateinit var status: FirDeclarationStatus
|
||||||
|
override var containerSource: DeserializedContainerSource? = null
|
||||||
|
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||||
|
override lateinit var symbol: FirConstructorSymbol
|
||||||
|
override var delegatedConstructor: FirDelegatedConstructorCall? = null
|
||||||
|
override var body: FirBlock? = null
|
||||||
|
|
||||||
|
override fun build(): FirConstructor {
|
||||||
|
return FirConstructorImpl(
|
||||||
|
source,
|
||||||
|
session,
|
||||||
|
resolvePhase,
|
||||||
|
returnTypeRef,
|
||||||
|
receiverTypeRef,
|
||||||
|
typeParameters,
|
||||||
|
valueParameters,
|
||||||
|
status,
|
||||||
|
containerSource,
|
||||||
|
annotations,
|
||||||
|
symbol,
|
||||||
|
delegatedConstructor,
|
||||||
|
body,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Deprecated("Modification of 'controlFlowGraphReference' has no impact for FirConstructorBuilder", level = DeprecationLevel.HIDDEN)
|
||||||
|
override var controlFlowGraphReference: FirControlFlowGraphReference
|
||||||
|
get() = throw IllegalStateException()
|
||||||
|
set(value) {
|
||||||
|
throw IllegalStateException()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseExperimental(ExperimentalContracts::class)
|
||||||
|
inline fun buildConstructor(init: FirConstructorBuilder.() -> Unit): FirConstructor {
|
||||||
|
contract {
|
||||||
|
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||||
|
}
|
||||||
|
return FirConstructorBuilder().apply(init).build()
|
||||||
|
}
|
||||||
+82
@@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.declarations.builder
|
||||||
|
|
||||||
|
import kotlin.contracts.*
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultSetterValueParameter
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
class FirDefaultSetterValueParameterBuilder : FirAnnotationContainerBuilder {
|
||||||
|
override var source: FirSourceElement? = null
|
||||||
|
lateinit var session: FirSession
|
||||||
|
var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||||
|
lateinit var returnTypeRef: FirTypeRef
|
||||||
|
var receiverTypeRef: FirTypeRef? = null
|
||||||
|
lateinit var symbol: FirVariableSymbol<FirValueParameter>
|
||||||
|
var initializer: FirExpression? = null
|
||||||
|
var delegate: FirExpression? = null
|
||||||
|
var delegateFieldSymbol: FirDelegateFieldSymbol<FirValueParameter>? = null
|
||||||
|
var isVar: Boolean = false
|
||||||
|
var isVal: Boolean = true
|
||||||
|
var getter: FirPropertyAccessor? = null
|
||||||
|
var setter: FirPropertyAccessor? = null
|
||||||
|
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||||
|
var defaultValue: FirExpression? = null
|
||||||
|
var isCrossinline: Boolean = false
|
||||||
|
var isNoinline: Boolean = false
|
||||||
|
var isVararg: Boolean = false
|
||||||
|
|
||||||
|
override fun build(): FirValueParameter {
|
||||||
|
return FirDefaultSetterValueParameter(
|
||||||
|
source,
|
||||||
|
session,
|
||||||
|
resolvePhase,
|
||||||
|
returnTypeRef,
|
||||||
|
receiverTypeRef,
|
||||||
|
symbol,
|
||||||
|
initializer,
|
||||||
|
delegate,
|
||||||
|
delegateFieldSymbol,
|
||||||
|
isVar,
|
||||||
|
isVal,
|
||||||
|
getter,
|
||||||
|
setter,
|
||||||
|
annotations,
|
||||||
|
defaultValue,
|
||||||
|
isCrossinline,
|
||||||
|
isNoinline,
|
||||||
|
isVararg,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseExperimental(ExperimentalContracts::class)
|
||||||
|
inline fun buildDefaultSetterValueParameter(init: FirDefaultSetterValueParameterBuilder.() -> Unit): FirValueParameter {
|
||||||
|
contract {
|
||||||
|
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||||
|
}
|
||||||
|
return FirDefaultSetterValueParameterBuilder().apply(init).build()
|
||||||
|
}
|
||||||
+71
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.declarations.builder
|
||||||
|
|
||||||
|
import kotlin.contracts.*
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirEnumEntryImpl
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
class FirEnumEntryBuilder : FirAnnotationContainerBuilder {
|
||||||
|
override var source: FirSourceElement? = null
|
||||||
|
lateinit var session: FirSession
|
||||||
|
var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||||
|
lateinit var returnTypeRef: FirTypeRef
|
||||||
|
lateinit var name: Name
|
||||||
|
lateinit var symbol: FirVariableSymbol<FirEnumEntry>
|
||||||
|
var initializer: FirExpression? = null
|
||||||
|
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||||
|
val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||||
|
lateinit var status: FirDeclarationStatus
|
||||||
|
var containerSource: DeserializedContainerSource? = null
|
||||||
|
|
||||||
|
override fun build(): FirEnumEntry {
|
||||||
|
return FirEnumEntryImpl(
|
||||||
|
source,
|
||||||
|
session,
|
||||||
|
resolvePhase,
|
||||||
|
returnTypeRef,
|
||||||
|
name,
|
||||||
|
symbol,
|
||||||
|
initializer,
|
||||||
|
annotations,
|
||||||
|
typeParameters,
|
||||||
|
status,
|
||||||
|
containerSource,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseExperimental(ExperimentalContracts::class)
|
||||||
|
inline fun buildEnumEntry(init: FirEnumEntryBuilder.() -> Unit): FirEnumEntry {
|
||||||
|
contract {
|
||||||
|
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||||
|
}
|
||||||
|
return FirEnumEntryBuilder().apply(init).build()
|
||||||
|
}
|
||||||
+65
@@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.declarations.builder
|
||||||
|
|
||||||
|
import kotlin.contracts.*
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirErrorFunction
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirErrorFunctionImpl
|
||||||
|
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnostic
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||||
|
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||||
|
import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReference
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirErrorFunctionSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
class FirErrorFunctionBuilder : FirAnnotationContainerBuilder {
|
||||||
|
override var source: FirSourceElement? = null
|
||||||
|
lateinit var session: FirSession
|
||||||
|
var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||||
|
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||||
|
val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||||
|
val valueParameters: MutableList<FirValueParameter> = mutableListOf()
|
||||||
|
lateinit var diagnostic: FirDiagnostic
|
||||||
|
lateinit var symbol: FirErrorFunctionSymbol
|
||||||
|
|
||||||
|
override fun build(): FirErrorFunction {
|
||||||
|
return FirErrorFunctionImpl(
|
||||||
|
source,
|
||||||
|
session,
|
||||||
|
resolvePhase,
|
||||||
|
annotations,
|
||||||
|
typeParameters,
|
||||||
|
valueParameters,
|
||||||
|
diagnostic,
|
||||||
|
symbol,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseExperimental(ExperimentalContracts::class)
|
||||||
|
inline fun buildErrorFunction(init: FirErrorFunctionBuilder.() -> Unit): FirErrorFunction {
|
||||||
|
contract {
|
||||||
|
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||||
|
}
|
||||||
|
return FirErrorFunctionBuilder().apply(init).build()
|
||||||
|
}
|
||||||
+71
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.declarations.builder
|
||||||
|
|
||||||
|
import kotlin.contracts.*
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirField
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirFieldImpl
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
open class FirFieldBuilder : FirAnnotationContainerBuilder {
|
||||||
|
override var source: FirSourceElement? = null
|
||||||
|
open lateinit var session: FirSession
|
||||||
|
open var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||||
|
open lateinit var returnTypeRef: FirTypeRef
|
||||||
|
open lateinit var name: Name
|
||||||
|
open lateinit var symbol: FirVariableSymbol<FirField>
|
||||||
|
open var isVar: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
|
||||||
|
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||||
|
open val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||||
|
open lateinit var status: FirDeclarationStatus
|
||||||
|
open var containerSource: DeserializedContainerSource? = null
|
||||||
|
|
||||||
|
override fun build(): FirField {
|
||||||
|
return FirFieldImpl(
|
||||||
|
source,
|
||||||
|
session,
|
||||||
|
resolvePhase,
|
||||||
|
returnTypeRef,
|
||||||
|
name,
|
||||||
|
symbol,
|
||||||
|
isVar,
|
||||||
|
annotations,
|
||||||
|
typeParameters,
|
||||||
|
status,
|
||||||
|
containerSource,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseExperimental(ExperimentalContracts::class)
|
||||||
|
inline fun buildField(init: FirFieldBuilder.() -> Unit): FirField {
|
||||||
|
contract {
|
||||||
|
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||||
|
}
|
||||||
|
return FirFieldBuilder().apply(init).build()
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.declarations.builder
|
||||||
|
|
||||||
|
import kotlin.contracts.*
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirImport
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirFileImpl
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
class FirFileBuilder : FirAnnotationContainerBuilder {
|
||||||
|
override var source: FirSourceElement? = null
|
||||||
|
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||||
|
lateinit var session: FirSession
|
||||||
|
var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||||
|
val imports: MutableList<FirImport> = mutableListOf()
|
||||||
|
val declarations: MutableList<FirDeclaration> = mutableListOf()
|
||||||
|
lateinit var name: String
|
||||||
|
lateinit var packageFqName: FqName
|
||||||
|
|
||||||
|
override fun build(): FirFile {
|
||||||
|
return FirFileImpl(
|
||||||
|
source,
|
||||||
|
annotations,
|
||||||
|
session,
|
||||||
|
resolvePhase,
|
||||||
|
imports,
|
||||||
|
declarations,
|
||||||
|
name,
|
||||||
|
packageFqName,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseExperimental(ExperimentalContracts::class)
|
||||||
|
inline fun buildFile(init: FirFileBuilder.() -> Unit): FirFile {
|
||||||
|
contract {
|
||||||
|
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||||
|
}
|
||||||
|
return FirFileBuilder().apply(init).build()
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user