[FIR] Introduce type parameter ref in generated tree

This commit is contained in:
simon.ogorodnik
2020-04-09 21:36:36 +03:00
parent 0f7a9c44b4
commit 7c56209cef
59 changed files with 382 additions and 94 deletions
@@ -26,6 +26,10 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
fields from typeParametersOwner
}
val typeParameterRefsOwnerBuilder by builder {
fields from typeParameterRefsOwner
}
val classBuilder by builder {
parents += annotationContainerBuilder
fields from klass without listOf("symbol", "resolvePhase")
@@ -33,7 +37,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
val regularClassBuilder by builder("AbstractFirRegularClassBuilder") {
parents += classBuilder
parents += typeParametersOwnerBuilder
parents += typeParameterRefsOwnerBuilder
fields from regularClass
}
@@ -51,7 +55,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
val functionBuilder by builder {
parents += annotationContainerBuilder
fields from function without listOf("symbol", "resolvePhase", "controlFlowGraphReference", "receiverTypeRef")
fields from function without listOf("symbol", "resolvePhase", "controlFlowGraphReference", "receiverTypeRef", "typeParameters")
}
val loopJumpBuilder by builder {
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.tree.generator.FirTreeBuilder.declarationStatus
import org.jetbrains.kotlin.fir.tree.generator.FirTreeBuilder.expression
import org.jetbrains.kotlin.fir.tree.generator.FirTreeBuilder.reference
import org.jetbrains.kotlin.fir.tree.generator.FirTreeBuilder.typeParameter
import org.jetbrains.kotlin.fir.tree.generator.FirTreeBuilder.typeParameterRef
import org.jetbrains.kotlin.fir.tree.generator.FirTreeBuilder.typeProjection
import org.jetbrains.kotlin.fir.tree.generator.FirTreeBuilder.typeRef
import org.jetbrains.kotlin.fir.tree.generator.FirTreeBuilder.valueParameter
@@ -59,7 +60,9 @@ object FieldSets {
val valueParameters = fieldList(valueParameter)
val typeParameters = fieldList(typeParameter)
val typeParameters = fieldList("typeParameters", typeParameter)
val typeParameterRefs = fieldList("typeParameters", typeParameterRef)
val name = field(nameType)
@@ -29,32 +29,34 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val anonymousInitializer = element("AnonymousInitializer", Declaration, declaration, symbolOwner)
val typedDeclaration = element("TypedDeclaration", Declaration, declaration, annotationContainer)
val callableDeclaration = element("CallableDeclaration", Declaration, typedDeclaration, symbolOwner)
val typeParameter = element("TypeParameter", Declaration, declaration, symbolOwner, annotationContainer)
val typeParametersOwner = element("TypeParametersOwner", Declaration)
val typeParameterRef = element("TypeParameterRef", Declaration)
val typeParameter = element("TypeParameter", Declaration, typeParameterRef, declaration, symbolOwner, annotationContainer)
val typeParameterRefsOwner = element("TypeParameterRefsOwner", Declaration)
val typeParametersOwner = element("TypeParametersOwner", Declaration, typeParameterRefsOwner)
val memberDeclaration = element("MemberDeclaration", Declaration, declaration, annotationContainer)
val callableMemberDeclaration = element("CallableMemberDeclaration", Declaration, callableDeclaration, memberDeclaration)
val variable = element("Variable", Declaration, callableDeclaration, declaration, statement)
val valueParameter = element("ValueParameter", Declaration, variable)
val property = element("Property", Declaration, variable, typeParametersOwner, callableMemberDeclaration)
val field = element("Field", Declaration, variable, callableMemberDeclaration)
val field = element("Field", Declaration, variable, typeParametersOwner, callableMemberDeclaration)
val enumEntry = element("EnumEntry", Declaration, variable, callableMemberDeclaration)
val classLikeDeclaration = element("ClassLikeDeclaration", Declaration, declaration, statement, symbolOwner)
val klass = element("Class", Declaration, classLikeDeclaration, statement, annotationContainer)
val regularClass = element("RegularClass", Declaration, memberDeclaration, typeParametersOwner, klass)
val klass = element("Class", Declaration, classLikeDeclaration, statement, annotationContainer, typeParameterRefsOwner)
val regularClass = element("RegularClass", Declaration, memberDeclaration, typeParameterRefsOwner, klass)
val sealedClass = element("SealedClass", Declaration, regularClass)
val typeAlias = element("TypeAlias", Declaration, classLikeDeclaration, memberDeclaration, typeParametersOwner)
val function = element("Function", Declaration, callableDeclaration, targetElement, annotationContainer, typeParametersOwner, statement)
val function = element("Function", Declaration, callableDeclaration, targetElement, annotationContainer, typeParameterRefsOwner, statement)
val contractDescriptionOwner = element("ContractDescriptionOwner", Declaration)
val simpleFunction = element("SimpleFunction", Declaration, function, callableMemberDeclaration, contractDescriptionOwner)
val propertyAccessor = element("PropertyAccessor", Declaration, function, contractDescriptionOwner)
val constructor = element("Constructor", Declaration, function, callableMemberDeclaration)
val simpleFunction = element("SimpleFunction", Declaration, function, callableMemberDeclaration, contractDescriptionOwner, typeParametersOwner)
val propertyAccessor = element("PropertyAccessor", Declaration, function, contractDescriptionOwner, typeParametersOwner)
val constructor = element("Constructor", Declaration, function, callableMemberDeclaration, typeParameterRefsOwner)
val file = element("File", Declaration, annotationContainer, declaration)
val anonymousFunction = element("AnonymousFunction", Declaration, function, expression)
val anonymousFunction = element("AnonymousFunction", Declaration, function, expression, typeParametersOwner)
val anonymousObject = element("AnonymousObject", Declaration, klass, expression)
val diagnosticHolder = element("DiagnosticHolder", Diagnostics)
@@ -92,7 +94,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val arraySetCall = element("AugmentedArraySetCall", Expression, statement)
val classReferenceExpression = element("ClassReferenceExpression", Expression, expression)
val errorExpression = element("ErrorExpression", Expression, expression, diagnosticHolder)
val errorFunction = element("ErrorFunction", Declaration, function, diagnosticHolder)
val errorFunction = element("ErrorFunction", Declaration, function, diagnosticHolder, typeParametersOwner)
val qualifiedAccessExpression = element("QualifiedAccessExpression", Expression, expression, qualifiedAccess)
val functionCall = element("FunctionCall", Expression, qualifiedAccessExpression, call)
val delegatedConstructorCall = element("DelegatedConstructorCall", Expression, resolvable, call)
@@ -31,6 +31,8 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
}
}
impl(typeParameterRef, "FirOuterClassTypeParameterRef")
impl(typeParameterRef, "FirConstructedClassTypeParameterRef")
noImpl(declarationStatus)
noImpl(resolvedDeclarationStatus)
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.tree.generator.FieldSets.superTypeRefs
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.symbol
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.symbolWithPackage
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.typeArguments
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.typeParameterRefs
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.typeParameters
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.typeRefField
import org.jetbrains.kotlin.fir.tree.generator.FieldSets.valueParameters
@@ -48,10 +49,18 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+symbolWithPackage("fir.symbols", "AbstractFirBasedSymbol", "E")
}
typeParameterRef.configure {
+symbol(typeParameterSymbolType.type)
}
typeParametersOwner.configure {
+typeParameters
}
typeParameterRefsOwner.configure {
+typeParameterRefs
}
resolvable.configure {
+field("calleeReference", reference).withTransform()
}
@@ -94,10 +103,11 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
errorFunction.configure {
parentArg(function, "F", errorFunction)
+symbol("FirErrorFunctionSymbol")
+typeParameters
}
memberDeclaration.configure {
+typeParameters
+typeParameterRefs
+status.withTransform()
}
@@ -245,6 +255,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
}
typeAlias.configure {
+typeParameters
parentArg(classLikeDeclaration, "F", typeAlias)
+name
+symbol("FirTypeAliasSymbol")
@@ -260,6 +271,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
isMutable = true
}
+booleanField("isLambda")
+typeParameters
}
typeParameter.configure {
@@ -278,6 +290,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+name
+symbol("FirFunctionSymbol<FirSimpleFunction>")
+annotations
+typeParameters
}
contractDescriptionOwner.configure {
@@ -302,6 +315,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+booleanField("isSetter")
+status.withTransform()
+annotations
+typeParameters
}
declarationStatus.configure {
@@ -97,10 +97,13 @@ fun SmartPrinter.printImplementation(implementation: Implementation) {
}
}
element.allFields.filter { it.type.contains("Symbol") && it !is FieldList }
.takeIf {
it.isNotEmpty() && !isInterface && !isAbstract &&
!element.type.contains("Reference") && !element.type.contains("ResolvedQualifier")
!element.type.contains("Reference")
&& !element.type.contains("ResolvedQualifier")
&& !element.type.endsWith("Ref")
}
?.let { symbolFields ->
println("init {")