[FIR] Introduce FirDiagnostic in FIR instead of errorReason

This commit is contained in:
Dmitriy Novozhilov
2019-10-30 17:45:03 +03:00
parent 8eabe08e7a
commit 8b5f568a15
46 changed files with 296 additions and 152 deletions
@@ -59,7 +59,10 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val anonymousFunction = element("AnonymousFunction", Declaration, function, expression)
val anonymousObject = element("AnonymousObject", Declaration, klass, expression)
val diagnosticHolder = element("DiagnosticHolder", Diagnostics)
val loop = element("Loop", Expression, statement, targetElement, annotationContainer)
val errorLoop = element("ErrorLoop", Expression, loop, diagnosticHolder)
val doWhileLoop = element("DoWhileLoop", Expression, loop)
val whileLoop = element("WhileLoop", Expression, loop)
@@ -88,8 +91,8 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val arrayOfCall = element("ArrayOfCall", Expression, expression, call)
val arraySetCall = element("ArraySetCall", Expression, qualifiedAccess, call)
val classReferenceExpression = element("ClassReferenceExpression", Expression, expression)
val errorExpression = element("ErrorExpression", Expression, expression)
val errorFunction = element("ErrorFunction", Declaration, function)
val errorExpression = element("ErrorExpression", Expression, expression, diagnosticHolder)
val errorFunction = element("ErrorFunction", Declaration, function, diagnosticHolder)
val qualifiedAccessExpression = element("QualifiedAccessExpression", Expression, expression, qualifiedAccess)
val functionCall = element("FunctionCall", Expression, qualifiedAccessExpression, call)
val componentCall = element("ComponentCall", Expression, functionCall)
@@ -113,7 +116,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val wrappedDelegateExpression = element("WrappedDelegateExpression", Expression, wrappedExpression)
val namedReference = element("NamedReference", Reference, reference)
val errorNamedReference = element("ErrorNamedReference", Reference, namedReference)
val errorNamedReference = element("ErrorNamedReference", Reference, namedReference, diagnosticHolder)
val superReference = element("SuperReference", Reference, reference)
val thisReference = element("ThisReference", Reference, reference)
val controlFlowGraphReference = element("ControlFlowGraphReference", Reference, reference)
@@ -125,7 +128,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val resolvedCallableReference = element("ResolvedCallableReference", Reference, resolvedNamedReference)
val resolvedTypeRef = element("ResolvedTypeRef", TypeRef, typeRef)
val errorTypeRef = element("ErrorTypeRef", TypeRef, resolvedTypeRef)
val errorTypeRef = element("ErrorTypeRef", TypeRef, resolvedTypeRef, diagnosticHolder)
val delegatedTypeRef = element("DelegatedTypeRef", TypeRef, typeRef)
val typeRefWithNullability = element("TypeRefWithNullability", TypeRef, typeRef)
val userTypeRef = element("UserTypeRef", TypeRef, typeRefWithNullability)
@@ -224,11 +224,9 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
noSource()
}
impl(errorExpression)
impl(loop, "FirErrorLoop") {
impl(errorLoop) {
default("block", "FirEmptyExpressionBlock()")
default("condition", "FirErrorExpressionImpl(source, \"error loop\")")
default("condition", "FirErrorExpressionImpl(source, diagnostic)")
defaultNull("label")
useTypes(emptyExpressionBlock)
}
@@ -496,13 +494,13 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
impl(resolvedTypeRef)
val errorTypeRefImpl = impl(errorTypeRef) {
default("type", "ConeClassErrorType(reason)")
default("type", "ConeClassErrorType(diagnostic.reason)")
useTypes(coneClassErrorTypeType)
}
impl(errorFunction) {
defaultNull("receiverTypeRef", "body", withGetter = true)
default("returnTypeRef", "FirErrorTypeRefImpl(null, reason)")
default("returnTypeRef", "FirErrorTypeRefImpl(null, diagnostic)")
useTypes(errorTypeRefImpl)
}
@@ -524,7 +522,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
}
impl(errorNamedReference) {
default("name", "Name.special(\"<\$errorReason>\")")
default("name", "Name.special(\"<\$diagnostic.reason>\")")
defaultNull("candidateSymbol", withGetter = true)
}
@@ -59,6 +59,10 @@ object NodeConfigurator : AbstractFieldConfigurator() {
+field("calleeReference", reference).withTransform()
}
diagnosticHolder.configure {
+field("diagnostic", firDiagnosticType)
}
declaration.configure {
+field("session", firSessionType)
+field("resolvePhase", resolvePhaseType, withReplace = true).apply { isMutable = true }
@@ -95,7 +99,6 @@ object NodeConfigurator : AbstractFieldConfigurator() {
errorFunction.configure {
parentArg(function, "F", errorFunction)
+stringField("reason")
+symbol("FirErrorFunctionSymbol")
}
@@ -398,10 +401,6 @@ object NodeConfigurator : AbstractFieldConfigurator() {
+intField("componentIndex")
}
errorExpression.configure {
+stringField("reason")
}
expressionWithSmartcast.configure {
+field("originalExpression", qualifiedAccessExpression)
+field("typesFromSmartcast", "Collection<ConeKotlinType>", null, customType = coneKotlinTypeType)
@@ -493,10 +492,6 @@ object NodeConfigurator : AbstractFieldConfigurator() {
+field("type", coneKotlinTypeType)
}
errorTypeRef.configure {
+stringField("reason")
}
delegatedTypeRef.configure {
+field("delegate", expression, nullable = true)
+field(typeRef)
@@ -533,10 +528,6 @@ object NodeConfigurator : AbstractFieldConfigurator() {
+field(varianceType)
}
errorNamedReference.configure {
+stringField("errorReason")
}
contractDescription.configure {
+fieldList("effects", effectDeclarationType)
}
@@ -62,4 +62,5 @@ val classSymbolType = type("fir.symbols.impl", "FirClassSymbol")
val pureAbstractElementType = generatedType("FirPureAbstractElement")
val effectDeclarationType = type("fir.contracts.description", "ConeEffectDeclaration")
val emptyContractDescriptionType = generatedType("contracts.impl", "FirEmptyContractDescription")
val emptyContractDescriptionType = generatedType("contracts.impl", "FirEmptyContractDescription")
val firDiagnosticType = generatedType("diagnostics", "FirDiagnostic")
@@ -125,6 +125,7 @@ class Element(val name: String, kind: Kind) : AbstractElement {
Reference("references"),
TypeRef("types"),
Contracts("contracts"),
Diagnostics("diagnostics"),
Other("")
}
}