[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
@@ -758,7 +758,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
private fun FlowContent.generate(typeRef: FirTypeRef) { private fun FlowContent.generate(typeRef: FirTypeRef) {
when (typeRef) { when (typeRef) {
is FirErrorTypeRef -> error { +typeRef.reason } is FirErrorTypeRef -> error { +typeRef.diagnostic.reason }
is FirResolvedTypeRef -> generate(typeRef.type) is FirResolvedTypeRef -> generate(typeRef.type)
is FirImplicitTypeRef -> unresolved { keyword("<implicit>") } is FirImplicitTypeRef -> unresolved { keyword("<implicit>") }
is FirUserTypeRef -> unresolved { is FirUserTypeRef -> unresolved {
@@ -956,7 +956,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
} }
is FirErrorNamedReference -> { is FirErrorNamedReference -> {
error { error {
title = reference.errorReason title = reference.diagnostic.reason
simpleName(reference.name) simpleName(reference.name)
} }
} }
@@ -969,7 +969,7 @@ class Fir2IrVisitor(
IrErrorExpressionImpl( IrErrorExpressionImpl(
startOffset, endOffset, startOffset, endOffset,
errorExpression.typeRef.toIrType(session, declarationStorage), errorExpression.typeRef.toIrType(session, declarationStorage),
errorExpression.reason errorExpression.diagnostic.reason
) )
} }
} }
@@ -12,6 +12,7 @@ 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.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.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.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -260,7 +261,7 @@ private fun JavaAnnotationArgument.toFirExpression(
null null
} }
this.calleeReference = calleeReference this.calleeReference = calleeReference
?: FirErrorNamedReferenceImpl(null, "Strange Java enum value: $classId.$entryName") ?: FirErrorNamedReferenceImpl(null, FirSimpleDiagnostic("Strange Java enum value: $classId.$entryName"))
} }
} }
is JavaClassObjectAnnotationArgument -> FirGetClassCallImpl(null).apply { is JavaClassObjectAnnotationArgument -> FirGetClassCallImpl(null).apply {
@@ -270,7 +271,7 @@ private fun JavaAnnotationArgument.toFirExpression(
) )
} }
is JavaAnnotationAsAnnotationArgument -> getAnnotation().toFirAnnotationCall(session, javaTypeParameterStack) is JavaAnnotationAsAnnotationArgument -> getAnnotation().toFirAnnotationCall(session, javaTypeParameterStack)
else -> FirErrorExpressionImpl(null, "Unknown JavaAnnotationArgument: ${this::class.java}") else -> FirErrorExpressionImpl(null, FirSimpleDiagnostic("Unknown JavaAnnotationArgument: ${this::class.java}"))
} }
} }
@@ -304,7 +305,7 @@ internal fun Any?.createConstant(session: FirSession): FirExpression {
is BooleanArray -> toList().createArrayOfCall(session, IrConstKind.Boolean) is BooleanArray -> toList().createArrayOfCall(session, IrConstKind.Boolean)
null -> FirConstExpressionImpl(null, IrConstKind.Null, null) null -> FirConstExpressionImpl(null, IrConstKind.Null, null)
else -> FirErrorExpressionImpl(null, "Unknown value in JavaLiteralAnnotationArgument: $this") else -> FirErrorExpressionImpl(null, FirSimpleDiagnostic("Unknown value in JavaLiteralAnnotationArgument: $this"))
} }
} }
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirPropertyImpl 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.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
@@ -174,7 +175,7 @@ class KotlinDeserializedJvmSymbolsProvider(
FirResolvedTypeRefImpl( FirResolvedTypeRefImpl(
null, it.constructType(emptyList(), isNullable = false) null, it.constructType(emptyList(), isNullable = false)
) )
} ?: FirErrorTypeRefImpl(null, "Symbol not found for $classId") } ?: FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Symbol not found for $classId"))
} }
@@ -226,7 +227,7 @@ class KotlinDeserializedJvmSymbolsProvider(
else -> { else -> {
FirErrorNamedReferenceImpl( FirErrorNamedReferenceImpl(
null, null,
errorReason = "Strange deserialized enum value: ${this@toEnumEntryReferenceExpression}.$name" FirSimpleDiagnostic("Strange deserialized enum value: ${this@toEnumEntryReferenceExpression}.$name")
) )
} }
} }
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.fir.builder.generateComponentFunctions
import org.jetbrains.kotlin.fir.builder.generateCopyFunction import org.jetbrains.kotlin.fir.builder.generateCopyFunction
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.impl.*
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.impl.*
import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir
@@ -664,7 +665,7 @@ class DeclarationsConverter(
} }
val delegatedSelfTypeRef = val delegatedSelfTypeRef =
if (classWrapper.isObjectLiteral()) FirErrorTypeRefImpl(null, "Constructor in object") if (classWrapper.isObjectLiteral()) FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Constructor in object"))
else classWrapper.delegatedSelfTypeRef else classWrapper.delegatedSelfTypeRef
val status = FirDeclarationStatusImpl(modifiers.getVisibility(), Modality.FINAL).apply { val status = FirDeclarationStatusImpl(modifiers.getVisibility(), Modality.FINAL).apply {
@@ -714,8 +715,8 @@ class DeclarationsConverter(
val isThis = (isImplicit && classWrapper.hasPrimaryConstructor) || thisKeywordPresent val isThis = (isImplicit && classWrapper.hasPrimaryConstructor) || thisKeywordPresent
val delegatedType = val delegatedType =
if (classWrapper.isObjectLiteral() || classWrapper.isInterface()) when { if (classWrapper.isObjectLiteral() || classWrapper.isInterface()) when {
isThis -> FirErrorTypeRefImpl(null, "Constructor in object") isThis -> FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Constructor in object"))
else -> FirErrorTypeRefImpl(null, "No super type") else -> FirErrorTypeRefImpl(null, FirSimpleDiagnostic("No super type"))
} }
else when { else when {
isThis -> classWrapper.delegatedSelfTypeRef isThis -> classWrapper.delegatedSelfTypeRef
@@ -869,7 +870,7 @@ class DeclarationsConverter(
private fun convertDestructingDeclaration(destructingDeclaration: LighterASTNode): DestructuringDeclaration { private fun convertDestructingDeclaration(destructingDeclaration: LighterASTNode): DestructuringDeclaration {
var isVar = false var isVar = false
val entries = mutableListOf<FirVariable<*>>() val entries = mutableListOf<FirVariable<*>>()
var firExpression: FirExpression = FirErrorExpressionImpl(null, "Destructuring declaration without initializer") var firExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("Destructuring declaration without initializer"))
destructingDeclaration.forEachChildren { destructingDeclaration.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
VAR_KEYWORD -> isVar = true VAR_KEYWORD -> isVar = true
@@ -1165,7 +1166,7 @@ class DeclarationsConverter(
*/ */
private fun convertExplicitDelegation(explicitDelegation: LighterASTNode): FirDelegatedTypeRef { private fun convertExplicitDelegation(explicitDelegation: LighterASTNode): FirDelegatedTypeRef {
lateinit var firTypeRef: FirTypeRef lateinit var firTypeRef: FirTypeRef
var firExpression: FirExpression? = FirErrorExpressionImpl(null, "Should have delegate") var firExpression: FirExpression? = FirErrorExpressionImpl(null, FirSimpleDiagnostic("Should have delegate"))
explicitDelegation.forEachChildren { explicitDelegation.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
TYPE_REFERENCE -> firTypeRef = convertType(it) TYPE_REFERENCE -> firTypeRef = convertType(it)
@@ -1255,10 +1256,10 @@ class DeclarationsConverter(
*/ */
fun convertType(type: LighterASTNode): FirTypeRef { fun convertType(type: LighterASTNode): FirTypeRef {
if (type.asText.isEmpty()) { if (type.asText.isEmpty()) {
return FirErrorTypeRefImpl(null, "Unwrapped type is null") return FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Unwrapped type is null"))
} }
var typeModifiers = TypeModifier() //TODO what with suspend? var typeModifiers = TypeModifier() //TODO what with suspend?
var firType: FirTypeRef = FirErrorTypeRefImpl(null, "Incomplete code") var firType: FirTypeRef = FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Incomplete code"))
var afterLPar = false var afterLPar = false
type.forEachChildren { type.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
@@ -1269,7 +1270,7 @@ class DeclarationsConverter(
NULLABLE_TYPE -> firType = convertNullableType(it) NULLABLE_TYPE -> firType = convertNullableType(it)
FUNCTION_TYPE -> firType = convertFunctionType(it) FUNCTION_TYPE -> firType = convertFunctionType(it)
DYNAMIC_TYPE -> firType = FirDynamicTypeRefImpl(null, false) DYNAMIC_TYPE -> firType = FirDynamicTypeRefImpl(null, false)
TokenType.ERROR_ELEMENT -> firType = FirErrorTypeRefImpl(null, "Unwrapped type is null") TokenType.ERROR_ELEMENT -> firType = FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Unwrapped type is null"))
} }
} }
@@ -1324,7 +1325,7 @@ class DeclarationsConverter(
} }
if (identifier == null) if (identifier == null)
return FirErrorTypeRefImpl(null, "Incomplete user type") return FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Incomplete user type"))
val qualifier = FirQualifierPartImpl( val qualifier = FirQualifierPartImpl(
identifier.nameAsSafeName() identifier.nameAsSafeName()
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirAnonymousFunctionImpl
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.FirPropertyImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
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.impl.*
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
@@ -56,7 +57,7 @@ class ExpressionsConverter(
) : 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, errorReason) as R) return expression?.let { convertExpression(it, errorReason) } as? R ?: (FirErrorExpressionImpl(null, FirSimpleDiagnostic(errorReason)) as R)
} }
/***** EXPRESSIONS *****/ /***** EXPRESSIONS *****/
@@ -104,7 +105,7 @@ class ExpressionsConverter(
OBJECT_LITERAL -> declarationsConverter.convertObjectLiteral(expression) OBJECT_LITERAL -> declarationsConverter.convertObjectLiteral(expression)
FUN -> declarationsConverter.convertFunctionDeclaration(expression) FUN -> declarationsConverter.convertFunctionDeclaration(expression)
else -> FirErrorExpressionImpl(null, errorReason) else -> FirErrorExpressionImpl(null, FirSimpleDiagnostic(errorReason))
} }
} }
@@ -158,7 +159,7 @@ class ExpressionsConverter(
FirLabelImpl(null, it.asString()) FirLabelImpl(null, it.asString())
} }
val bodyExpression = block?.let { declarationsConverter.convertBlockExpression(it) } val bodyExpression = block?.let { declarationsConverter.convertBlockExpression(it) }
?: FirErrorExpressionImpl(null, "Lambda has no body") ?: FirErrorExpressionImpl(null, FirSimpleDiagnostic("Lambda has no body"))
body = if (bodyExpression is FirBlockImpl) { body = if (bodyExpression is FirBlockImpl) {
if (bodyExpression.statements.isEmpty()) { if (bodyExpression.statements.isEmpty()) {
bodyExpression.statements.add(FirUnitExpression(null)) bodyExpression.statements.add(FirUnitExpression(null))
@@ -185,7 +186,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, "No right operand") var rightArgAsFir: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No right operand"))
binaryExpression.forEachChildren { binaryExpression.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
OPERATION_REFERENCE -> { OPERATION_REFERENCE -> {
@@ -249,7 +250,7 @@ class ExpressionsConverter(
toFirOperation: String.() -> FirOperation toFirOperation: String.() -> FirOperation
): FirTypeOperatorCall { ): FirTypeOperatorCall {
lateinit var operationTokenName: String lateinit var operationTokenName: String
var leftArgAsFir: FirExpression = FirErrorExpressionImpl(null, "No left operand") var leftArgAsFir: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No left operand"))
lateinit var firType: FirTypeRef lateinit var firType: FirTypeRef
binaryExpression.forEachChildren { binaryExpression.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
@@ -285,7 +286,7 @@ class ExpressionsConverter(
context.firLabels.removeLast() context.firLabels.removeLast()
//println("Unused label: ${labeledExpression.getAsString()}") //println("Unused label: ${labeledExpression.getAsString()}")
} }
return firExpression ?: FirErrorExpressionImpl(null, "Empty label") return firExpression ?: FirErrorExpressionImpl(null, FirSimpleDiagnostic("Empty label"))
} }
/** /**
@@ -347,7 +348,7 @@ class ExpressionsConverter(
return (firExpression as? FirAbstractAnnotatedElement)?.apply { return (firExpression as? FirAbstractAnnotatedElement)?.apply {
annotations += firAnnotationList annotations += firAnnotationList
} ?: FirErrorExpressionImpl(null, "Strange annotated expression: ${firExpression?.render()}") } ?: FirErrorExpressionImpl(null, FirSimpleDiagnostic("Strange annotated expression: ${firExpression?.render()}"))
} }
/** /**
@@ -355,7 +356,7 @@ 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, "No receiver in class literal") var firReceiverExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No receiver in class literal"))
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")
} }
@@ -399,7 +400,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, "Qualified expression without selector") //after dot var firSelector: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("Qualified expression without selector")) //after dot
var firReceiver: FirExpression? = null //before dot var firReceiver: FirExpression? = null //before dot
dotQualifiedExpression.forEachChildren { dotQualifiedExpression.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
@@ -449,7 +450,7 @@ class ExpressionsConverter(
arguments += additionalArgument!! arguments += additionalArgument!!
FirSimpleNamedReference(null, OperatorNameConventions.INVOKE, null) FirSimpleNamedReference(null, OperatorNameConventions.INVOKE, null)
} }
else -> FirErrorNamedReferenceImpl(null, "Call has no callee") else -> FirErrorNamedReferenceImpl(null, FirSimpleDiagnostic("Call has no callee"))
} }
context.firFunctionCalls += this context.firFunctionCalls += this
@@ -467,7 +468,7 @@ class ExpressionsConverter(
} }
private fun LighterASTNode?.convertShortOrLongStringTemplate(errorReason: String): FirExpression { private fun LighterASTNode?.convertShortOrLongStringTemplate(errorReason: String): FirExpression {
var firExpression: FirExpression = FirErrorExpressionImpl(null, errorReason) var firExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic(errorReason))
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)
} }
@@ -563,7 +564,7 @@ class ExpressionsConverter(
} }
private fun convertWhenConditionExpression(whenCondition: LighterASTNode): FirExpression { private fun convertWhenConditionExpression(whenCondition: LighterASTNode): FirExpression {
var firExpression: FirExpression = FirErrorExpressionImpl(null, "No expression in condition with expression") var firExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No expression in condition with expression"))
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")
@@ -577,7 +578,7 @@ class ExpressionsConverter(
private fun convertWhenConditionInRange(whenCondition: LighterASTNode): FirExpression { private fun convertWhenConditionInRange(whenCondition: LighterASTNode): FirExpression {
var isNegate = false var isNegate = false
var firExpression: FirExpression = FirErrorExpressionImpl(null, "No range in condition with range") var firExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No range in condition with range"))
whenCondition.forEachChildren { whenCondition.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
NOT_IN -> isNegate = true NOT_IN -> isNegate = true
@@ -611,7 +612,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, "No array expression") var firExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No array expression"))
val indices: MutableList<FirExpression> = mutableListOf() val indices: MutableList<FirExpression> = mutableListOf()
arrayAccess.forEachChildren { arrayAccess.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
@@ -669,7 +670,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, "No condition in do-while loop") var firCondition: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No condition in do-while loop"))
doWhileLoop.forEachChildren { doWhileLoop.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
BODY -> block = it BODY -> block = it
@@ -686,7 +687,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, "No condition in while loop") var firCondition: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No condition in while loop"))
whileLoop.forEachChildren { whileLoop.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
BODY -> block = it BODY -> block = it
@@ -703,7 +704,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, "No range in for loop") var rangeExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("No range in for loop"))
var blockNode: LighterASTNode? = null var blockNode: LighterASTNode? = null
forLoop.forEachChildren { forLoop.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
@@ -846,7 +847,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, "If statement should have condition") var firCondition: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("If statement should have condition"))
var thenBlock: LighterASTNode? = null var thenBlock: LighterASTNode? = null
var elseBlock: LighterASTNode? = null var elseBlock: LighterASTNode? = null
ifExpression.forEachChildren { ifExpression.forEachChildren {
@@ -908,7 +909,7 @@ 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, "Nothing to throw") var firExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("Nothing to throw"))
throwExpression.forEachChildren { throwExpression.forEachChildren {
if (it.isExpression()) firExpression = getAsFirExpression(it, "Nothing to throw") if (it.isExpression()) firExpression = getAsFirExpression(it, "Nothing to throw")
} }
@@ -963,7 +964,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, "Argument is absent") var firExpression: FirExpression = FirErrorExpressionImpl(null, FirSimpleDiagnostic("Argument is absent"))
valueArgument.forEachChildren { valueArgument.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
VALUE_ARGUMENT_NAME -> identifier = it.asText VALUE_ARGUMENT_NAME -> identifier = it.asText
@@ -12,6 +12,7 @@ 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.declarations.impl.FirPropertyImpl
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.impl.FirQualifiedAccessExpressionImpl import org.jetbrains.kotlin.fir.expressions.impl.FirQualifiedAccessExpressionImpl
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.impl.FirPropertyFromParameterResolvedNamedReference
@@ -35,7 +36,7 @@ class ValueParameter(
val name = this.firValueParameter.name val name = this.firValueParameter.name
var type = this.firValueParameter.returnTypeRef var type = this.firValueParameter.returnTypeRef
if (type is FirImplicitTypeRef) { if (type is FirImplicitTypeRef) {
type = FirErrorTypeRefImpl(null, "Incomplete code") type = FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Incomplete code"))
} }
val status = FirDeclarationStatusImpl(modifiers.getVisibility(), modifiers.getModality()).apply { val status = FirDeclarationStatusImpl(modifiers.getVisibility(), modifiers.getModality()).apply {
@@ -8,6 +8,7 @@ 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.generateContainsOperation
import org.jetbrains.kotlin.fir.builder.generateLazyLogicalOperation import org.jetbrains.kotlin.fir.builder.generateLazyLogicalOperation
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.impl.FirErrorExpressionImpl
import org.jetbrains.kotlin.fir.expressions.impl.FirOperatorCallImpl import org.jetbrains.kotlin.fir.expressions.impl.FirOperatorCallImpl
@@ -51,7 +52,7 @@ data class WhenEntry(
} }
} }
else -> { else -> {
FirErrorExpressionImpl(null, "Unsupported when condition: ${this.javaClass}") FirErrorExpressionImpl(null, FirSimpleDiagnostic("Unsupported when condition: ${this.javaClass}"))
} }
} }
} }
@@ -59,7 +60,7 @@ data class WhenEntry(
fun toFirWhenConditionWithoutSubject(): FirExpression { fun toFirWhenConditionWithoutSubject(): FirExpression {
return when (val condition = conditions.first()) { return when (val condition = conditions.first()) {
is FirOperatorCallImpl -> condition.arguments.first() is FirOperatorCallImpl -> condition.arguments.first()
else -> FirErrorExpressionImpl(null, "No expression in condition with expression") else -> FirErrorExpressionImpl(null, FirSimpleDiagnostic("No expression in condition with expression"))
} }
} }
} }
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirErrorFunctionImpl import org.jetbrains.kotlin.fir.declarations.impl.FirErrorFunctionImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl
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.impl.*
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
@@ -110,7 +111,7 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
FirErrorFunctionImpl( FirErrorFunctionImpl(
source, source,
this@BaseFirBuilder.session, this@BaseFirBuilder.session,
"Cannot bind unlabeled return to a function", FirSimpleDiagnostic("Cannot bind unlabeled return to a function"),
FirErrorFunctionSymbol() FirErrorFunctionSymbol()
) )
) )
@@ -136,7 +137,7 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
FirErrorFunctionImpl( FirErrorFunctionImpl(
source, source,
this@BaseFirBuilder.session, this@BaseFirBuilder.session,
"Cannot bind label $labelName to a function", FirSimpleDiagnostic("Cannot bind label $labelName to a function"),
FirErrorFunctionSymbol() FirErrorFunctionSymbol()
) )
) )
@@ -238,7 +239,7 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
expression.getSourceOrNull(), IrConstKind.Int, convertedText.toInt(), "Incorrect int: $text" expression.getSourceOrNull(), IrConstKind.Int, convertedText.toInt(), "Incorrect int: $text"
) )
} else { } else {
FirErrorExpressionImpl(expression.getSourceOrNull(), reason = "Incorrect constant expression: $text") FirErrorExpressionImpl(expression.getSourceOrNull(), diagnostic = FirSimpleDiagnostic("Incorrect constant expression: $text"))
} }
FLOAT_CONSTANT -> FLOAT_CONSTANT ->
if (convertedText is Float) { if (convertedText is Float) {
@@ -290,7 +291,7 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
else -> { else -> {
hasExpressions = true hasExpressions = true
FirErrorExpressionImpl( FirErrorExpressionImpl(
entry.getSourceOrNull(), "Incorrect template entry: ${entry.asText}" entry.getSourceOrNull(), FirSimpleDiagnostic("Incorrect template entry: ${entry.asText}")
) )
} }
} }
@@ -343,7 +344,7 @@ 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, "Inc/dec without operand") return FirErrorExpressionImpl(argument, FirSimpleDiagnostic("Inc/dec without operand"))
} }
val source = baseExpression?.toFirSourceElement() val source = baseExpression?.toFirSourceElement()
return FirBlockImpl(source).apply { return FirBlockImpl(source).apply {
@@ -410,7 +411,7 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
firMemberAccess.calleeReference firMemberAccess.calleeReference
} else { } else {
FirErrorNamedReferenceImpl( FirErrorNamedReferenceImpl(
left.getSourceOrNull(), "Unsupported qualified LValue: ${left.asText}" left.getSourceOrNull(), FirSimpleDiagnostic("Unsupported qualified LValue: ${left.asText}")
) )
} }
} }
@@ -419,7 +420,7 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
} }
} }
} }
return FirErrorNamedReferenceImpl(left.getSourceOrNull(), "Unsupported LValue: $tokenType") return FirErrorNamedReferenceImpl(left.getSourceOrNull(), FirSimpleDiagnostic("Unsupported LValue: $tokenType"))
} }
fun T?.generateAssignment( fun T?.generateAssignment(
@@ -468,7 +469,7 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
statements += generateTemporaryVariable( statements += generateTemporaryVariable(
this@BaseFirBuilder.session, this@generateAssignment.getSourceOrNull(), name, this@BaseFirBuilder.session, this@generateAssignment.getSourceOrNull(), name,
this@generateAssignment?.convert() this@generateAssignment?.convert()
?: FirErrorExpressionImpl(this.getSourceOrNull(), "No LValue in assignment") ?: FirErrorExpressionImpl(this.getSourceOrNull(), FirSimpleDiagnostic("No LValue in assignment"))
) )
statements += FirVariableAssignmentImpl(source, false, value, operation).apply { statements += FirVariableAssignmentImpl(source, false, value, operation).apply {
lValue = FirSimpleNamedReference(this.getSourceOrNull(), name, null) lValue = FirSimpleNamedReference(this.getSourceOrNull(), name, null)
@@ -479,7 +480,7 @@ abstract class BaseFirBuilder<T>(val session: FirSession, val context: Context =
if (operation in FirOperation.ASSIGNMENTS && operation != FirOperation.ASSIGN) { if (operation in FirOperation.ASSIGNMENTS && operation != FirOperation.ASSIGN) {
return FirOperatorCallImpl(source, operation).apply { return FirOperatorCallImpl(source, operation).apply {
// TODO: take good psi // TODO: take good psi
arguments += this@generateAssignment?.convert() ?: FirErrorExpressionImpl(null, "Unsupported left value of assignment: ${source?.psi?.text}") arguments += this@generateAssignment?.convert() ?: FirErrorExpressionImpl(null, FirSimpleDiagnostic("Unsupported left value of assignment: ${source?.psi?.text}"))
arguments += value arguments += value
} }
} }
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
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.impl.*
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.impl.*
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
@@ -200,7 +201,7 @@ internal fun KtWhenCondition.toFirWhenCondition(
} }
} }
else -> { else -> {
FirErrorExpressionImpl(this.toFirSourceElement(), "Unsupported when condition: ${this.javaClass}") FirErrorExpressionImpl(this.toFirSourceElement(), FirSimpleDiagnostic("Unsupported when condition: ${this.javaClass}"))
} }
} }
} }
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
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.impl.*
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.impl.*
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
@@ -105,21 +106,21 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder
convertSafe() ?: implicitUnitType convertSafe() ?: implicitUnitType
private fun KtTypeReference?.toFirOrErrorType(): FirTypeRef = private fun KtTypeReference?.toFirOrErrorType(): FirTypeRef =
convertSafe() ?: FirErrorTypeRefImpl(this?.toFirSourceElement(), if (this == null) "Incomplete code" else "Conversion failed") convertSafe() ?: FirErrorTypeRefImpl(this?.toFirSourceElement(), FirSimpleDiagnostic(if (this == null) "Incomplete code" else "Conversion failed"))
// Here we accept lambda as receiver to prevent expression calculation in stub mode // Here we accept lambda as receiver to prevent expression calculation in stub mode
private fun (() -> KtExpression?).toFirExpression(errorReason: String): FirExpression = private fun (() -> KtExpression?).toFirExpression(errorReason: String): FirExpression =
if (stubMode) FirExpressionStub(null) if (stubMode) FirExpressionStub(null)
else with(this()) { else with(this()) {
convertSafe<FirExpression>() ?: FirErrorExpressionImpl(this?.toFirSourceElement(), errorReason) convertSafe<FirExpression>() ?: FirErrorExpressionImpl(this?.toFirSourceElement(), FirSimpleDiagnostic(errorReason))
} }
private fun KtExpression?.toFirExpression(errorReason: String): FirExpression = private fun KtExpression?.toFirExpression(errorReason: String): FirExpression =
if (stubMode) FirExpressionStub(null) if (stubMode) FirExpressionStub(null)
else convertSafe<FirExpression>() ?: FirErrorExpressionImpl(this?.toFirSourceElement(), errorReason) else convertSafe<FirExpression>() ?: FirErrorExpressionImpl(this?.toFirSourceElement(), FirSimpleDiagnostic(errorReason))
private fun KtExpression.toFirStatement(errorReason: String): FirStatement = private fun KtExpression.toFirStatement(errorReason: String): FirStatement =
convertSafe() ?: FirErrorExpressionImpl(this.toFirSourceElement(), errorReason) convertSafe() ?: FirErrorExpressionImpl(this.toFirSourceElement(), FirSimpleDiagnostic(errorReason))
private fun KtExpression.toFirStatement(): FirStatement = private fun KtExpression.toFirStatement(): FirStatement =
convert() convert()
@@ -130,7 +131,7 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder
return when (this) { return when (this) {
is KtSecondaryConstructor -> toFirConstructor( is KtSecondaryConstructor -> toFirConstructor(
delegatedSuperType, delegatedSuperType,
delegatedSelfType ?: FirErrorTypeRefImpl(this.toFirSourceElement(), "Constructor in object"), delegatedSelfType ?: FirErrorTypeRefImpl(this.toFirSourceElement(), FirSimpleDiagnostic("Constructor in object")),
owner, owner,
hasPrimaryConstructor hasPrimaryConstructor
) )
@@ -165,7 +166,7 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder
} }
private fun ValueArgument?.toFirExpression(): FirExpression { private fun ValueArgument?.toFirExpression(): FirExpression {
this ?: return FirErrorExpressionImpl((this as? KtElement)?.toFirSourceElement(), "No argument given") this ?: return FirErrorExpressionImpl((this as? KtElement)?.toFirSourceElement(), FirSimpleDiagnostic("No argument given"))
val name = this.getArgumentName()?.asName val name = this.getArgumentName()?.asName
val expression = this.getArgumentExpression() val expression = this.getArgumentExpression()
val firExpression = when (expression) { val firExpression = when (expression) {
@@ -718,7 +719,7 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder
val source = this.toFirSourceElement() val source = this.toFirSourceElement()
val delegatedType = when { val delegatedType = when {
isThis -> delegatedSelfTypeRef isThis -> delegatedSelfTypeRef
else -> delegatedSuperTypeRef ?: FirErrorTypeRefImpl(source, "No super type") else -> delegatedSuperTypeRef ?: FirErrorTypeRefImpl(source, FirSimpleDiagnostic("No super type"))
} }
return FirDelegatedConstructorCallImpl( return FirDelegatedConstructorCallImpl(
source, source,
@@ -837,7 +838,7 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder
userType userType
} else { } else {
FirErrorTypeRefImpl(source, "Incomplete user type") FirErrorTypeRefImpl(source, FirSimpleDiagnostic("Incomplete user type"))
} }
} }
is KtFunctionType -> { is KtFunctionType -> {
@@ -856,7 +857,7 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder
} }
functionType functionType
} }
null -> FirErrorTypeRefImpl(source, "Unwrapped type is null") null -> FirErrorTypeRefImpl(source, FirSimpleDiagnostic("Unwrapped type is null"))
else -> throw AssertionError("Unexpected type element: ${unwrappedElement.text}") else -> throw AssertionError("Unexpected type element: ${unwrappedElement.text}")
} }
@@ -1230,7 +1231,7 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder
calleeExpression.toFirSourceElement(), calleeExpression.getReferencedNameAsName(), null calleeExpression.toFirSourceElement(), calleeExpression.getReferencedNameAsName(), null
) )
null -> FirErrorNamedReferenceImpl( null -> FirErrorNamedReferenceImpl(
null, "Call has no callee" null, FirSimpleDiagnostic("Call has no callee")
) )
else -> { else -> {
arguments += calleeExpression.toFirExpression("Incorrect invoke receiver") arguments += calleeExpression.toFirExpression("Incorrect invoke receiver")
@@ -1263,7 +1264,7 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder
override fun visitQualifiedExpression(expression: KtQualifiedExpression, data: Unit): FirElement { override fun visitQualifiedExpression(expression: KtQualifiedExpression, data: Unit): FirElement {
val selector = expression.selectorExpression val selector = expression.selectorExpression
?: return FirErrorExpressionImpl(expression.toFirSourceElement(), "Qualified expression without selector") ?: return FirErrorExpressionImpl(expression.toFirSourceElement(), FirSimpleDiagnostic("Qualified expression without selector"))
val firSelector = selector.toFirExpression("Incorrect selector expression") val firSelector = selector.toFirExpression("Incorrect selector expression")
if (firSelector is FirModifiableQualifiedAccess) { if (firSelector is FirModifiableQualifiedAccess) {
firSelector.safe = expression is KtSafeQualifiedExpression firSelector.safe = expression is KtSafeQualifiedExpression
@@ -1287,7 +1288,7 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder
} }
override fun visitParenthesizedExpression(expression: KtParenthesizedExpression, data: Unit): FirElement { override fun visitParenthesizedExpression(expression: KtParenthesizedExpression, data: Unit): FirElement {
return expression.expression?.accept(this, data) ?: FirErrorExpressionImpl(expression.toFirSourceElement(), "Empty parentheses") return expression.expression?.accept(this, data) ?: FirErrorExpressionImpl(expression.toFirSourceElement(), FirSimpleDiagnostic("Empty parentheses"))
} }
override fun visitLabeledExpression(expression: KtLabeledExpression, data: Unit): FirElement { override fun visitLabeledExpression(expression: KtLabeledExpression, data: Unit): FirElement {
@@ -1297,7 +1298,7 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder
if (labelName != null) { if (labelName != null) {
context.firLabels += FirLabelImpl(source, labelName) context.firLabels += FirLabelImpl(source, labelName)
} }
val result = expression.baseExpression?.accept(this, data) ?: FirErrorExpressionImpl(source, "Empty label") val result = expression.baseExpression?.accept(this, data) ?: FirErrorExpressionImpl(source, FirSimpleDiagnostic("Empty label"))
if (size != context.firLabels.size) { if (size != context.firLabels.size) {
context.firLabels.removeLast() context.firLabels.removeLast()
println("Unused label: ${expression.text}") println("Unused label: ${expression.text}")
@@ -1308,7 +1309,7 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder
override fun visitAnnotatedExpression(expression: KtAnnotatedExpression, data: Unit): FirElement { override fun visitAnnotatedExpression(expression: KtAnnotatedExpression, data: Unit): FirElement {
val rawResult = expression.baseExpression?.accept(this, data) val rawResult = expression.baseExpression?.accept(this, data)
val result = rawResult as? FirAbstractAnnotatedElement val result = rawResult as? FirAbstractAnnotatedElement
?: FirErrorExpressionImpl(expression.toFirSourceElement(), "Strange annotated expression: ${rawResult?.render()}") ?: FirErrorExpressionImpl(expression.toFirSourceElement(), FirSimpleDiagnostic("Strange annotated expression: ${rawResult?.render()}"))
expression.extractAnnotationsTo(result) expression.extractAnnotationsTo(result)
return result return result
} }
@@ -76,7 +76,7 @@ class RawFirBuilderTotalKotlinTestCase : AbstractRawFirBuilderTestCase() {
val calleeReference = qualifiedAccess.calleeReference val calleeReference = qualifiedAccess.calleeReference
if (calleeReference is FirErrorNamedReference) { if (calleeReference is FirErrorNamedReference) {
errorReferences++ errorReferences++
println(calleeReference.errorReason) println(calleeReference.diagnostic.reason)
} else { } else {
normalReferences++ normalReferences++
} }
@@ -7,6 +7,7 @@ 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.diagnostics.FirSimpleDiagnostic
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.impl.FirExpressionStub
import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedQualifierImpl import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedQualifierImpl
@@ -365,12 +366,12 @@ class FirCallResolver(
val source = namedReference.source val source = namedReference.source
return when { return when {
candidates.isEmpty() -> FirErrorNamedReferenceImpl( candidates.isEmpty() -> FirErrorNamedReferenceImpl(
source, "Unresolved name: $name" source, FirSimpleDiagnostic("Unresolved name: $name")
) )
applicability < CandidateApplicability.SYNTHETIC_RESOLVED -> { applicability < CandidateApplicability.SYNTHETIC_RESOLVED -> {
FirErrorNamedReferenceImpl( FirErrorNamedReferenceImpl(
source, source,
"Inapplicable($applicability): ${candidates.map { describeSymbol(it.symbol) }}" FirSimpleDiagnostic("Inapplicable($applicability): ${candidates.map { describeSymbol(it.symbol) }}")
) )
} }
candidates.size == 1 -> { candidates.size == 1 -> {
@@ -387,7 +388,7 @@ class FirCallResolver(
} }
} }
else -> FirErrorNamedReferenceImpl( else -> FirErrorNamedReferenceImpl(
source, "Ambiguity: $name, ${candidates.map { describeSymbol(it.symbol) }}" source, FirSimpleDiagnostic("Ambiguity: $name, ${candidates.map { describeSymbol(it.symbol) }}")
) )
} }
} }
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.deserialization
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.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirConstructor
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.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.impl.* import org.jetbrains.kotlin.fir.expressions.impl.*
@@ -96,7 +97,7 @@ abstract class AbstractAnnotationDeserializer(
FirResolvedTypeRefImpl( FirResolvedTypeRefImpl(
null, it.constructType(emptyList(), isNullable = false) null, it.constructType(emptyList(), isNullable = false)
) )
} ?: FirErrorTypeRefImpl(null, "Symbol not found for $classId") } ?: FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Symbol not found for $classId"))
).apply { ).apply {
this.arguments += arguments this.arguments += arguments
} }
@@ -137,7 +138,7 @@ abstract class AbstractAnnotationDeserializer(
FirResolvedNamedReferenceImpl(null, entryName, it) FirResolvedNamedReferenceImpl(null, entryName, it)
} ?: FirErrorNamedReferenceImpl( } ?: FirErrorNamedReferenceImpl(
null, null,
errorReason = "Strange deserialized enum value: $classId.$entryName" FirSimpleDiagnostic("Strange deserialized enum value: $classId.$entryName")
) )
} }
// ARRAY -> { // ARRAY -> {
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.componentArrayAccessor import org.jetbrains.kotlin.fir.componentArrayAccessor
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
import org.jetbrains.kotlin.fir.expressions.FirResolvable import org.jetbrains.kotlin.fir.expressions.FirResolvable
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
@@ -295,7 +296,7 @@ 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, newCallee.errorReason) FirErrorTypeRefImpl(access.source, newCallee.diagnostic)
is FirNamedReferenceWithCandidate -> { is FirNamedReferenceWithCandidate -> {
typeFromSymbol(newCallee.candidateSymbol, makeNullable) typeFromSymbol(newCallee.candidateSymbol, makeNullable)
} }
@@ -329,7 +330,7 @@ private fun BodyResolveComponents.typeFromSymbol(symbol: AbstractFirBasedSymbol<
if (fir is FirEnumEntry) { if (fir is FirEnumEntry) {
(fir.superTypeRefs.firstOrNull() as? FirResolvedTypeRef) ?: FirErrorTypeRefImpl( (fir.superTypeRefs.firstOrNull() as? FirResolvedTypeRef) ?: FirErrorTypeRefImpl(
null, null,
"no enum item supertype" FirSimpleDiagnostic("no enum item supertype")
) )
} else } else
FirResolvedTypeRefImpl( FirResolvedTypeRefImpl(
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.FirCallResolver 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.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl
import org.jetbrains.kotlin.fir.resolve.constructType import org.jetbrains.kotlin.fir.resolve.constructType
@@ -84,7 +85,7 @@ class PostponedArgumentsAnalyzer(
candidate == null || applicability < CandidateApplicability.SYNTHETIC_RESOLVED -> candidate == null || applicability < CandidateApplicability.SYNTHETIC_RESOLVED ->
FirErrorNamedReferenceImpl( FirErrorNamedReferenceImpl(
callableReferenceAccess.source, callableReferenceAccess.source,
"Unresolved reference: ${callableReferenceAccess.calleeReference.name}" FirSimpleDiagnostic("Unresolved reference: ${callableReferenceAccess.calleeReference.name}")
) )
else -> FirNamedReferenceWithCandidate(callableReferenceAccess.source, callableReferenceAccess.calleeReference.name, candidate) else -> FirNamedReferenceWithCandidate(callableReferenceAccess.source, callableReferenceAccess.calleeReference.name, candidate)
} }
@@ -104,9 +104,7 @@ class FirTypeResolverImpl(private val session: FirSession) : FirTypeResolver {
is FirUserTypeRef -> { is FirUserTypeRef -> {
resolveUserType(typeRef, resolveToSymbol(typeRef, scope), scope) resolveUserType(typeRef, resolveToSymbol(typeRef, scope), scope)
} }
is FirErrorTypeRef -> { is FirErrorTypeRef -> typeRef.type
ConeKotlinErrorType(typeRef.reason)
}
is FirFunctionTypeRef -> { is FirFunctionTypeRef -> {
createFunctionalType(typeRef) createFunctionalType(typeRef)
} }
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.transformers
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.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
@@ -164,7 +165,7 @@ class FirSupertypeResolverTransformer : FirAbstractTreeTransformer(phase = FirRe
val coneType = (superTypeRef as FirResolvedTypeRef).type val coneType = (superTypeRef as FirResolvedTypeRef).type
if (coneType is ConeTypeParameterType) { if (coneType is ConeTypeParameterType) {
resultingTypeRefs.add( resultingTypeRefs.add(
FirErrorTypeRefImpl(superTypeRef.source, "Type parameter cannot be a super-type: ${coneType.render()}") FirErrorTypeRefImpl(superTypeRef.source, FirSimpleDiagnostic("Type parameter cannot be a super-type: ${coneType.render()}"))
) )
continue continue
} }
@@ -173,7 +174,7 @@ class FirSupertypeResolverTransformer : FirAbstractTreeTransformer(phase = FirRe
if (superTypeClassId.outerClasses().any { it.areSupertypesComputing() }) { if (superTypeClassId.outerClasses().any { it.areSupertypesComputing() }) {
resultingTypeRefs.add( resultingTypeRefs.add(
FirErrorTypeRefImpl(superTypeRef.source, "Recursion detected: ${superTypeRef.render()}") FirErrorTypeRefImpl(superTypeRef.source, FirSimpleDiagnostic("Recursion detected: ${superTypeRef.render()}"))
) )
continue continue
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirTypedDeclaration import org.jetbrains.kotlin.fir.declarations.FirTypedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.firProvider
@@ -31,7 +32,7 @@ class ReturnTypeCalculatorWithJump(val session: FirSession, val scopeSession: Sc
if (declaration.returnTypeRef is FirComputingImplicitTypeRef) { if (declaration.returnTypeRef is FirComputingImplicitTypeRef) {
declaration.transformReturnTypeRef( declaration.transformReturnTypeRef(
TransformImplicitType, TransformImplicitType,
FirErrorTypeRefImpl(null, "cycle") FirErrorTypeRefImpl(null, FirSimpleDiagnostic("cycle"))
) )
return declaration.returnTypeRef as FirResolvedTypeRef return declaration.returnTypeRef as FirResolvedTypeRef
} }
@@ -46,7 +47,7 @@ class ReturnTypeCalculatorWithJump(val session: FirSession, val scopeSession: Sc
TransformImplicitType, TransformImplicitType,
FirErrorTypeRefImpl( FirErrorTypeRefImpl(
null, null,
"Unsupported: implicit VP type" FirSimpleDiagnostic("Unsupported: implicit VP type")
) )
) )
} }
@@ -68,7 +69,7 @@ class ReturnTypeCalculatorWithJump(val session: FirSession, val scopeSession: Sc
}.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(null, "Cannot calculate return type (local class/object?)") return FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Cannot calculate return type (local class/object?)"))
} }
declaration.transformReturnTypeRef( declaration.transformReturnTypeRef(
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve
import org.jetbrains.kotlin.fir.FirTargetElement import org.jetbrains.kotlin.fir.FirTargetElement
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.FirElseIfTrueCondition import org.jetbrains.kotlin.fir.expressions.impl.FirElseIfTrueCondition
import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyExpressionBlock import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyExpressionBlock
@@ -71,7 +72,7 @@ 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, "") whenExpression.resultType = FirErrorTypeRefImpl(null, FirSimpleDiagnostic(""))
return@with whenExpression.compose() return@with whenExpression.compose()
} }
@@ -136,7 +137,7 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran
val expectedTypeRef = data as FirTypeRef? val expectedTypeRef = data as FirTypeRef?
callCompleter.completeCall(it, expectedTypeRef) callCompleter.completeCall(it, expectedTypeRef)
} ?: run { } ?: run {
tryExpression.resultType = FirErrorTypeRefImpl(null, "") tryExpression.resultType = FirErrorTypeRefImpl(null, FirSimpleDiagnostic(""))
tryExpression tryExpression
} }
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.copy
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
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.declarations.impl.FirValueParameterImpl
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.resolve.calls.ImplicitDispatchReceiverValue import org.jetbrains.kotlin.fir.resolve.calls.ImplicitDispatchReceiverValue
import org.jetbrains.kotlin.fir.resolve.calls.ImplicitExtensionReceiverValue import org.jetbrains.kotlin.fir.resolve.calls.ImplicitExtensionReceiverValue
@@ -336,7 +337,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
val bodyExpectedType = returnTypeRefFromResolvedAtom ?: data val bodyExpectedType = returnTypeRefFromResolvedAtom ?: data
af = transformFunction(af, bodyExpectedType).single as FirAnonymousFunction af = transformFunction(af, bodyExpectedType).single as FirAnonymousFunction
af = af.copy( af = af.copy(
returnTypeRef = af.body?.resultType ?: FirErrorTypeRefImpl(af.source, "No result type for lambda") returnTypeRef = af.body?.resultType ?: FirErrorTypeRefImpl(af.source, FirSimpleDiagnostic("No result type for lambda"))
) )
af.replaceTypeRef(af.constructFunctionalTypeRef(session)) af.replaceTypeRef(af.constructFunctionalTypeRef(session))
af.compose() af.compose()
@@ -383,7 +384,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
when (val resultType = initializer.resultType) { when (val resultType = initializer.resultType) {
is FirImplicitTypeRef -> FirErrorTypeRefImpl( is FirImplicitTypeRef -> FirErrorTypeRefImpl(
null, null,
"No result type for initializer" FirSimpleDiagnostic("No result type for initializer")
) )
else -> resultType else -> resultType
} }
@@ -395,7 +396,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
when (val resultType = variable.getter?.returnTypeRef) { when (val resultType = variable.getter?.returnTypeRef) {
is FirImplicitTypeRef -> FirErrorTypeRefImpl( is FirImplicitTypeRef -> FirErrorTypeRefImpl(
null, null,
"No result type for getter" FirSimpleDiagnostic("No result type for getter")
) )
else -> resultType else -> resultType
} }
@@ -403,7 +404,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
} }
else -> { else -> {
variable.transformReturnTypeRef( variable.transformReturnTypeRef(
transformer, FirErrorTypeRefImpl(null, "Cannot infer variable type without initializer / getter / delegate") transformer, FirErrorTypeRefImpl(null, FirSimpleDiagnostic("Cannot infer variable type without initializer / getter / delegate"))
) )
} }
} }
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve
import org.jetbrains.kotlin.fir.BuiltinTypes import org.jetbrains.kotlin.fir.BuiltinTypes
import org.jetbrains.kotlin.fir.FirCallResolver import org.jetbrains.kotlin.fir.FirCallResolver
import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner
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.impl.FirErrorExpressionImpl
import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionWithSmartcastImpl import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionWithSmartcastImpl
@@ -55,7 +56,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
override fun transformExpression(expression: FirExpression, data: Any?): CompositeTransformResult<FirStatement> { override fun transformExpression(expression: FirExpression, data: Any?): CompositeTransformResult<FirStatement> {
if (expression.resultType is FirImplicitTypeRef && expression !is FirWrappedExpression) { if (expression.resultType is FirImplicitTypeRef && expression !is FirWrappedExpression) {
val type = FirErrorTypeRefImpl(expression.source, "Type calculating for ${expression::class} is not supported") val type = FirErrorTypeRefImpl(expression.source, FirSimpleDiagnostic("Type calculating for ${expression::class} is not supported"))
expression.resultType = type expression.resultType = type
} }
return (expression.transformChildren(transformer, data) as FirStatement).compose() return (expression.transformChildren(transformer, data) as FirStatement).compose()
@@ -83,7 +84,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
} else { } else {
val superTypeRef = implicitReceiverStack.lastDispatchReceiver() val superTypeRef = implicitReceiverStack.lastDispatchReceiver()
?.boundSymbol?.phasedFir?.superTypeRefs?.firstOrNull() ?.boundSymbol?.phasedFir?.superTypeRefs?.firstOrNull()
?: FirErrorTypeRefImpl(qualifiedAccessExpression.source, "No super type") ?: FirErrorTypeRefImpl(qualifiedAccessExpression.source, FirSimpleDiagnostic("No super type"))
qualifiedAccessExpression.resultType = superTypeRef qualifiedAccessExpression.resultType = superTypeRef
callee.replaceSuperTypeRef(superTypeRef) callee.replaceSuperTypeRef(superTypeRef)
} }
@@ -171,7 +172,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
block.resultType = if (resultExpression == null) { block.resultType = if (resultExpression == null) {
FirImplicitUnitTypeRef(block.source) FirImplicitUnitTypeRef(block.source)
} else { } else {
(resultExpression.resultType as? FirResolvedTypeRef) ?: FirErrorTypeRefImpl(null, "No type for block") (resultExpression.resultType as? FirResolvedTypeRef) ?: FirErrorTypeRefImpl(null, FirSimpleDiagnostic("No type for block"))
} }
dataFlowAnalyzer.exitBlock(block) dataFlowAnalyzer.exitBlock(block)
return block.compose() return block.compose()
@@ -228,13 +229,13 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
val assignment = val assignment =
FirVariableAssignmentImpl(operatorCall.source, false, resolvedOperatorCall, FirOperation.ASSIGN).apply { FirVariableAssignmentImpl(operatorCall.source, false, resolvedOperatorCall, FirOperation.ASSIGN).apply {
lValue = (leftArgument as? FirQualifiedAccess)?.calleeReference lValue = (leftArgument as? FirQualifiedAccess)?.calleeReference
?: FirErrorNamedReferenceImpl(null, "Unresolved reference") ?: FirErrorNamedReferenceImpl(null, FirSimpleDiagnostic("Unresolved reference"))
} }
assignment.transform(transformer, noExpectedType) assignment.transform(transformer, noExpectedType)
} }
else -> FirErrorExpressionImpl( else -> FirErrorExpressionImpl(
operatorCall.source, operatorCall.source,
"Operator overload ambiguity. $assignmentOperatorName and $simpleOperatorName are compatible" FirSimpleDiagnostic("Operator overload ambiguity. $assignmentOperatorName and $simpleOperatorName are compatible")
).compose() ).compose()
} }
} }
@@ -703,7 +703,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef) { override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef) {
visitTypeRef(errorTypeRef) visitTypeRef(errorTypeRef)
print("<ERROR TYPE REF: ${errorTypeRef.reason}>") print("<ERROR TYPE REF: ${errorTypeRef.diagnostic.reason}>")
} }
override fun visitImplicitTypeRef(implicitTypeRef: FirImplicitTypeRef) { override fun visitImplicitTypeRef(implicitTypeRef: FirImplicitTypeRef) {
@@ -790,7 +790,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
symbol != null -> { symbol != null -> {
print("R?C|${symbol.render()}|") print("R?C|${symbol.render()}|")
} }
namedReference is FirErrorNamedReference -> print("<${namedReference.errorReason}>#") namedReference is FirErrorNamedReference -> print("<${namedReference.diagnostic.reason}>#")
else -> print("${namedReference.name}#") else -> print("${namedReference.name}#")
} }
} }
@@ -1000,7 +1000,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
} }
override fun visitErrorExpression(errorExpression: FirErrorExpression) { override fun visitErrorExpression(errorExpression: FirErrorExpression) {
print("ERROR_EXPR(${errorExpression.reason})") print("ERROR_EXPR(${errorExpression.diagnostic.reason})")
} }
override fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier) { override fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier) {
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.fir.declarations
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.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder
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.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
@@ -20,7 +22,7 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
*/ */
abstract class FirErrorFunction : FirPureAbstractElement(), FirFunction<FirErrorFunction> { abstract class FirErrorFunction : FirPureAbstractElement(), FirFunction<FirErrorFunction>, FirDiagnosticHolder {
abstract override val source: FirSourceElement? abstract override val source: FirSourceElement?
abstract override val session: FirSession abstract override val session: FirSession
abstract override val resolvePhase: FirResolvePhase abstract override val resolvePhase: FirResolvePhase
@@ -31,7 +33,7 @@ abstract class FirErrorFunction : FirPureAbstractElement(), FirFunction<FirError
abstract override val typeParameters: List<FirTypeParameter> abstract override val typeParameters: List<FirTypeParameter>
abstract override val valueParameters: List<FirValueParameter> abstract override val valueParameters: List<FirValueParameter>
abstract override val body: FirBlock? abstract override val body: FirBlock?
abstract val reason: String abstract override val diagnostic: FirDiagnostic
abstract override val symbol: FirErrorFunctionSymbol abstract override val symbol: FirErrorFunctionSymbol
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitErrorFunction(this, data) override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitErrorFunction(this, data)
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.FirErrorFunction
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
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.FirDiagnostic
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.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
@@ -29,12 +30,12 @@ import org.jetbrains.kotlin.fir.visitors.*
class FirErrorFunctionImpl( class FirErrorFunctionImpl(
override val source: FirSourceElement?, override val source: FirSourceElement?,
override val session: FirSession, override val session: FirSession,
override val reason: String, override val diagnostic: FirDiagnostic,
override val symbol: FirErrorFunctionSymbol override val symbol: FirErrorFunctionSymbol
) : FirErrorFunction(), FirAbstractAnnotatedElement { ) : FirErrorFunction(), FirAbstractAnnotatedElement {
override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
override val annotations: MutableList<FirAnnotationCall> = mutableListOf() override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
override var returnTypeRef: FirTypeRef = FirErrorTypeRefImpl(null, reason) override var returnTypeRef: FirTypeRef = FirErrorTypeRefImpl(null, diagnostic)
override val receiverTypeRef: FirTypeRef? get() = null override val receiverTypeRef: FirTypeRef? get() = null
override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference() override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference()
override val typeParameters: MutableList<FirTypeParameter> = mutableListOf() override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
@@ -0,0 +1,10 @@
/*
* 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.diagnostics
abstract class FirDiagnostic {
abstract val reason: String
}
@@ -0,0 +1,22 @@
/*
* 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.diagnostics
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
interface FirDiagnosticHolder : FirElement {
override val source: FirSourceElement?
val diagnostic: FirDiagnostic
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitDiagnosticHolder(this, data)
}
@@ -0,0 +1,8 @@
/*
* 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.diagnostics
class FirSimpleDiagnostic(override val reason: String) : FirDiagnostic()
@@ -7,6 +7,8 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.FirPureAbstractElement import org.jetbrains.kotlin.fir.FirPureAbstractElement
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
@@ -15,11 +17,11 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
*/ */
abstract class FirErrorExpression : FirPureAbstractElement(), FirExpression { abstract class FirErrorExpression : FirPureAbstractElement(), FirExpression, FirDiagnosticHolder {
abstract override val source: FirSourceElement? abstract override val source: FirSourceElement?
abstract override val typeRef: FirTypeRef abstract override val typeRef: FirTypeRef
abstract override val annotations: List<FirAnnotationCall> abstract override val annotations: List<FirAnnotationCall>
abstract val reason: String abstract override val diagnostic: FirDiagnostic
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitErrorExpression(this, data) override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitErrorExpression(this, data)
} }
@@ -0,0 +1,35 @@
/*
* 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.expressions
import org.jetbrains.kotlin.fir.FirLabel
import org.jetbrains.kotlin.fir.FirPureAbstractElement
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
abstract class FirErrorLoop : FirPureAbstractElement(), FirLoop, FirDiagnosticHolder {
abstract override val source: FirSourceElement?
abstract override val annotations: List<FirAnnotationCall>
abstract override val block: FirBlock
abstract override val condition: FirExpression
abstract override val label: FirLabel?
abstract override val diagnostic: FirDiagnostic
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitErrorLoop(this, data)
abstract override fun <D> transformBlock(transformer: FirTransformer<D>, data: D): FirErrorLoop
abstract override fun <D> transformCondition(transformer: FirTransformer<D>, data: D): FirErrorLoop
abstract override fun <D> transformOtherChildren(transformer: FirTransformer<D>, data: D): FirErrorLoop
}
@@ -6,9 +6,10 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.impl.FirConstExpressionImpl import org.jetbrains.kotlin.fir.expressions.impl.FirConstExpressionImpl
import org.jetbrains.kotlin.fir.expressions.impl.FirErrorExpressionImpl import org.jetbrains.kotlin.fir.expressions.impl.FirErrorExpressionImpl
import org.jetbrains.kotlin.fir.expressions.impl.FirErrorLoop import org.jetbrains.kotlin.fir.expressions.impl.FirErrorLoopImpl
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.types.ConeClassErrorType import org.jetbrains.kotlin.fir.types.ConeClassErrorType
@@ -24,7 +25,7 @@ inline val FirAnnotationCall.classId: ClassId?
get() = coneClassLikeType?.lookupTag?.classId get() = coneClassLikeType?.lookupTag?.classId
fun <T> FirConstExpressionImpl(source: FirSourceElement?, kind: IrConstKind<T>, value: T?, errorReason: String): FirExpression = fun <T> FirConstExpressionImpl(source: FirSourceElement?, kind: IrConstKind<T>, value: T?, errorReason: String): FirExpression =
value?.let { FirConstExpressionImpl(source, kind, it) } ?: FirErrorExpressionImpl(source, errorReason) value?.let { FirConstExpressionImpl(source, kind, it) } ?: FirErrorExpressionImpl(source, FirSimpleDiagnostic(errorReason))
inline val FirTypeOperatorCall.argument: FirExpression get() = arguments.first() inline val FirTypeOperatorCall.argument: FirExpression get() = arguments.first()
@@ -36,6 +37,9 @@ fun FirExpression.toResolvedCallableSymbol(): FirCallableSymbol<*>? {
return toResolvedCallableReference()?.resolvedSymbol as FirCallableSymbol<*>? return toResolvedCallableReference()?.resolvedSymbol as FirCallableSymbol<*>?
} }
fun FirErrorLoop(source: FirSourceElement?, reason: String): FirErrorLoop = FirErrorLoop(source).apply { fun FirErrorLoop(source: FirSourceElement?, reason: String): FirErrorLoop {
condition = FirErrorExpressionImpl(source, reason) val diagnostic = FirSimpleDiagnostic(reason)
return FirErrorLoopImpl(source, diagnostic).apply {
condition = FirErrorExpressionImpl(source, diagnostic)
}
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirErrorExpression import org.jetbrains.kotlin.fir.expressions.FirErrorExpression
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
@@ -20,7 +21,7 @@ import org.jetbrains.kotlin.fir.visitors.*
class FirErrorExpressionImpl( class FirErrorExpressionImpl(
override val source: FirSourceElement?, override val source: FirSourceElement?,
override val reason: String override val diagnostic: FirDiagnostic
) : FirErrorExpression(), FirAbstractAnnotatedElement { ) : FirErrorExpression(), FirAbstractAnnotatedElement {
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null) override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
override val annotations: MutableList<FirAnnotationCall> = mutableListOf() override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
@@ -6,12 +6,12 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.fir.FirLabel import org.jetbrains.kotlin.fir.FirLabel
import org.jetbrains.kotlin.fir.FirPureAbstractElement
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnostic
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.FirErrorLoop
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirLoop
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
@@ -20,12 +20,13 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
*/ */
class FirErrorLoop( class FirErrorLoopImpl(
override val source: FirSourceElement? override val source: FirSourceElement?,
) : FirPureAbstractElement(), FirLoop, FirAbstractAnnotatedElement { override val diagnostic: FirDiagnostic
) : FirErrorLoop(), FirAbstractAnnotatedElement {
override val annotations: MutableList<FirAnnotationCall> = mutableListOf() override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
override var block: FirBlock = FirEmptyExpressionBlock() override var block: FirBlock = FirEmptyExpressionBlock()
override var condition: FirExpression = FirErrorExpressionImpl(source, "error loop") override var condition: FirExpression = FirErrorExpressionImpl(source, diagnostic)
override var label: FirLabel? = null override var label: FirLabel? = null
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
@@ -35,24 +36,24 @@ class FirErrorLoop(
label?.accept(visitor, data) label?.accept(visitor, data)
} }
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirErrorLoop { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirErrorLoopImpl {
transformBlock(transformer, data) transformBlock(transformer, data)
transformCondition(transformer, data) transformCondition(transformer, data)
transformOtherChildren(transformer, data) transformOtherChildren(transformer, data)
return this return this
} }
override fun <D> transformBlock(transformer: FirTransformer<D>, data: D): FirErrorLoop { override fun <D> transformBlock(transformer: FirTransformer<D>, data: D): FirErrorLoopImpl {
block = block.transformSingle(transformer, data) block = block.transformSingle(transformer, data)
return this return this
} }
override fun <D> transformCondition(transformer: FirTransformer<D>, data: D): FirErrorLoop { override fun <D> transformCondition(transformer: FirTransformer<D>, data: D): FirErrorLoopImpl {
condition = condition.transformSingle(transformer, data) condition = condition.transformSingle(transformer, data)
return this return this
} }
override fun <D> transformOtherChildren(transformer: FirTransformer<D>, data: D): FirErrorLoop { override fun <D> transformOtherChildren(transformer: FirTransformer<D>, data: D): FirErrorLoopImpl {
annotations.transformInplace(transformer, data) annotations.transformInplace(transformer, data)
label = label?.transformSingle(transformer, data) label = label?.transformSingle(transformer, data)
return this return this
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.fir.references package org.jetbrains.kotlin.fir.references
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder
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
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
@@ -15,11 +17,11 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
*/ */
abstract class FirErrorNamedReference : FirNamedReference() { abstract class FirErrorNamedReference : FirNamedReference(), FirDiagnosticHolder {
abstract override val source: FirSourceElement? abstract override val source: FirSourceElement?
abstract override val name: Name abstract override val name: Name
abstract override val candidateSymbol: AbstractFirBasedSymbol<*>? abstract override val candidateSymbol: AbstractFirBasedSymbol<*>?
abstract val errorReason: String abstract override val diagnostic: FirDiagnostic
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitErrorNamedReference(this, data) override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitErrorNamedReference(this, data)
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.references.impl package org.jetbrains.kotlin.fir.references.impl
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
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
@@ -18,9 +19,9 @@ import org.jetbrains.kotlin.fir.visitors.*
class FirErrorNamedReferenceImpl( class FirErrorNamedReferenceImpl(
override val source: FirSourceElement?, override val source: FirSourceElement?,
override val errorReason: String override val diagnostic: FirDiagnostic
) : FirErrorNamedReference() { ) : FirErrorNamedReference() {
override val name: Name = Name.special("<$errorReason>") override val name: Name = Name.special("<${diagnostic.reason}>")
override val candidateSymbol: AbstractFirBasedSymbol<*>? get() = null override val candidateSymbol: AbstractFirBasedSymbol<*>? get() = null
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {} override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.fir.types package org.jetbrains.kotlin.fir.types
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
@@ -14,11 +16,11 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
*/ */
abstract class FirErrorTypeRef : FirResolvedTypeRef() { abstract class FirErrorTypeRef : FirResolvedTypeRef(), FirDiagnosticHolder {
abstract override val source: FirSourceElement? abstract override val source: FirSourceElement?
abstract override val annotations: List<FirAnnotationCall> abstract override val annotations: List<FirAnnotationCall>
abstract override val type: ConeKotlinType abstract override val type: ConeKotlinType
abstract val reason: String abstract override val diagnostic: FirDiagnostic
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitErrorTypeRef(this, data) override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitErrorTypeRef(this, data)
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.types.impl package org.jetbrains.kotlin.fir.types.impl
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnostic
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.impl.FirAbstractAnnotatedElement
import org.jetbrains.kotlin.fir.types.ConeClassErrorType import org.jetbrains.kotlin.fir.types.ConeClassErrorType
@@ -20,10 +21,10 @@ import org.jetbrains.kotlin.fir.visitors.*
class FirErrorTypeRefImpl( class FirErrorTypeRefImpl(
override val source: FirSourceElement?, override val source: FirSourceElement?,
override val reason: String override val diagnostic: FirDiagnostic
) : FirErrorTypeRef(), FirAbstractAnnotatedElement { ) : FirErrorTypeRef(), FirAbstractAnnotatedElement {
override val annotations: MutableList<FirAnnotationCall> = mutableListOf() override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
override val type: ConeKotlinType = ConeClassErrorType(reason) override val type: ConeKotlinType = ConeClassErrorType(diagnostic.reason)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
annotations.forEach { it.accept(visitor, data) } annotations.forEach { it.accept(visitor, data) }
@@ -48,7 +48,9 @@ import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder
import org.jetbrains.kotlin.fir.expressions.FirLoop import org.jetbrains.kotlin.fir.expressions.FirLoop
import org.jetbrains.kotlin.fir.expressions.FirErrorLoop
import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirWhileLoop import org.jetbrains.kotlin.fir.expressions.FirWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
@@ -294,10 +296,18 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformElement(anonymousObject, data) return transformElement(anonymousObject, data)
} }
open fun transformDiagnosticHolder(diagnosticHolder: FirDiagnosticHolder, data: D): CompositeTransformResult<FirDiagnosticHolder> {
return transformElement(diagnosticHolder, data)
}
open fun transformLoop(loop: FirLoop, data: D): CompositeTransformResult<FirStatement> { open fun transformLoop(loop: FirLoop, data: D): CompositeTransformResult<FirStatement> {
return transformElement(loop, data) return transformElement(loop, data)
} }
open fun transformErrorLoop(errorLoop: FirErrorLoop, data: D): CompositeTransformResult<FirStatement> {
return transformElement(errorLoop, data)
}
open fun transformDoWhileLoop(doWhileLoop: FirDoWhileLoop, data: D): CompositeTransformResult<FirStatement> { open fun transformDoWhileLoop(doWhileLoop: FirDoWhileLoop, data: D): CompositeTransformResult<FirStatement> {
return transformElement(doWhileLoop, data) return transformElement(doWhileLoop, data)
} }
@@ -734,10 +744,18 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformAnonymousObject(anonymousObject, data) return transformAnonymousObject(anonymousObject, data)
} }
final override fun visitDiagnosticHolder(diagnosticHolder: FirDiagnosticHolder, data: D): CompositeTransformResult<FirDiagnosticHolder> {
return transformDiagnosticHolder(diagnosticHolder, data)
}
final override fun visitLoop(loop: FirLoop, data: D): CompositeTransformResult<FirStatement> { final override fun visitLoop(loop: FirLoop, data: D): CompositeTransformResult<FirStatement> {
return transformLoop(loop, data) return transformLoop(loop, data)
} }
final override fun visitErrorLoop(errorLoop: FirErrorLoop, data: D): CompositeTransformResult<FirStatement> {
return transformErrorLoop(errorLoop, data)
}
final override fun visitDoWhileLoop(doWhileLoop: FirDoWhileLoop, data: D): CompositeTransformResult<FirStatement> { final override fun visitDoWhileLoop(doWhileLoop: FirDoWhileLoop, data: D): CompositeTransformResult<FirStatement> {
return transformDoWhileLoop(doWhileLoop, data) return transformDoWhileLoop(doWhileLoop, data)
} }
@@ -48,7 +48,9 @@ import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder
import org.jetbrains.kotlin.fir.expressions.FirLoop import org.jetbrains.kotlin.fir.expressions.FirLoop
import org.jetbrains.kotlin.fir.expressions.FirErrorLoop
import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirWhileLoop import org.jetbrains.kotlin.fir.expressions.FirWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
@@ -208,8 +210,12 @@ abstract class FirVisitor<out R, in D> {
open fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: D): R = visitElement(anonymousObject, data) open fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: D): R = visitElement(anonymousObject, data)
open fun visitDiagnosticHolder(diagnosticHolder: FirDiagnosticHolder, data: D): R = visitElement(diagnosticHolder, data)
open fun visitLoop(loop: FirLoop, data: D): R = visitElement(loop, data) open fun visitLoop(loop: FirLoop, data: D): R = visitElement(loop, data)
open fun visitErrorLoop(errorLoop: FirErrorLoop, data: D): R = visitElement(errorLoop, data)
open fun visitDoWhileLoop(doWhileLoop: FirDoWhileLoop, data: D): R = visitElement(doWhileLoop, data) open fun visitDoWhileLoop(doWhileLoop: FirDoWhileLoop, data: D): R = visitElement(doWhileLoop, data)
open fun visitWhileLoop(whileLoop: FirWhileLoop, data: D): R = visitElement(whileLoop, data) open fun visitWhileLoop(whileLoop: FirWhileLoop, data: D): R = visitElement(whileLoop, data)
@@ -48,7 +48,9 @@ import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder
import org.jetbrains.kotlin.fir.expressions.FirLoop import org.jetbrains.kotlin.fir.expressions.FirLoop
import org.jetbrains.kotlin.fir.expressions.FirErrorLoop
import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirWhileLoop import org.jetbrains.kotlin.fir.expressions.FirWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
@@ -292,10 +294,18 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(anonymousObject) visitElement(anonymousObject)
} }
open fun visitDiagnosticHolder(diagnosticHolder: FirDiagnosticHolder) {
visitElement(diagnosticHolder)
}
open fun visitLoop(loop: FirLoop) { open fun visitLoop(loop: FirLoop) {
visitElement(loop) visitElement(loop)
} }
open fun visitErrorLoop(errorLoop: FirErrorLoop) {
visitElement(errorLoop)
}
open fun visitDoWhileLoop(doWhileLoop: FirDoWhileLoop) { open fun visitDoWhileLoop(doWhileLoop: FirDoWhileLoop) {
visitElement(doWhileLoop) visitElement(doWhileLoop)
} }
@@ -732,10 +742,18 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitAnonymousObject(anonymousObject) visitAnonymousObject(anonymousObject)
} }
final override fun visitDiagnosticHolder(diagnosticHolder: FirDiagnosticHolder, data: Nothing?) {
visitDiagnosticHolder(diagnosticHolder)
}
final override fun visitLoop(loop: FirLoop, data: Nothing?) { final override fun visitLoop(loop: FirLoop, data: Nothing?) {
visitLoop(loop) visitLoop(loop)
} }
final override fun visitErrorLoop(errorLoop: FirErrorLoop, data: Nothing?) {
visitErrorLoop(errorLoop)
}
final override fun visitDoWhileLoop(doWhileLoop: FirDoWhileLoop, data: Nothing?) { final override fun visitDoWhileLoop(doWhileLoop: FirDoWhileLoop, data: Nothing?) {
visitDoWhileLoop(doWhileLoop) visitDoWhileLoop(doWhileLoop)
} }
@@ -59,7 +59,10 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val anonymousFunction = element("AnonymousFunction", Declaration, function, expression) val anonymousFunction = element("AnonymousFunction", Declaration, function, expression)
val anonymousObject = element("AnonymousObject", Declaration, klass, expression) val anonymousObject = element("AnonymousObject", Declaration, klass, expression)
val diagnosticHolder = element("DiagnosticHolder", Diagnostics)
val loop = element("Loop", Expression, statement, targetElement, annotationContainer) val loop = element("Loop", Expression, statement, targetElement, annotationContainer)
val errorLoop = element("ErrorLoop", Expression, loop, diagnosticHolder)
val doWhileLoop = element("DoWhileLoop", Expression, loop) val doWhileLoop = element("DoWhileLoop", Expression, loop)
val whileLoop = element("WhileLoop", Expression, loop) val whileLoop = element("WhileLoop", Expression, loop)
@@ -88,8 +91,8 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val arrayOfCall = element("ArrayOfCall", Expression, expression, call) val arrayOfCall = element("ArrayOfCall", Expression, expression, call)
val arraySetCall = element("ArraySetCall", Expression, qualifiedAccess, call) val arraySetCall = element("ArraySetCall", Expression, qualifiedAccess, call)
val classReferenceExpression = element("ClassReferenceExpression", Expression, expression) val classReferenceExpression = element("ClassReferenceExpression", Expression, expression)
val errorExpression = element("ErrorExpression", Expression, expression) val errorExpression = element("ErrorExpression", Expression, expression, diagnosticHolder)
val errorFunction = element("ErrorFunction", Declaration, function) val errorFunction = element("ErrorFunction", Declaration, function, diagnosticHolder)
val qualifiedAccessExpression = element("QualifiedAccessExpression", Expression, expression, qualifiedAccess) val qualifiedAccessExpression = element("QualifiedAccessExpression", Expression, expression, qualifiedAccess)
val functionCall = element("FunctionCall", Expression, qualifiedAccessExpression, call) val functionCall = element("FunctionCall", Expression, qualifiedAccessExpression, call)
val componentCall = element("ComponentCall", Expression, functionCall) val componentCall = element("ComponentCall", Expression, functionCall)
@@ -113,7 +116,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val wrappedDelegateExpression = element("WrappedDelegateExpression", Expression, wrappedExpression) val wrappedDelegateExpression = element("WrappedDelegateExpression", Expression, wrappedExpression)
val namedReference = element("NamedReference", Reference, reference) 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 superReference = element("SuperReference", Reference, reference)
val thisReference = element("ThisReference", Reference, reference) val thisReference = element("ThisReference", Reference, reference)
val controlFlowGraphReference = element("ControlFlowGraphReference", Reference, reference) val controlFlowGraphReference = element("ControlFlowGraphReference", Reference, reference)
@@ -125,7 +128,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val resolvedCallableReference = element("ResolvedCallableReference", Reference, resolvedNamedReference) val resolvedCallableReference = element("ResolvedCallableReference", Reference, resolvedNamedReference)
val resolvedTypeRef = element("ResolvedTypeRef", TypeRef, typeRef) 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 delegatedTypeRef = element("DelegatedTypeRef", TypeRef, typeRef)
val typeRefWithNullability = element("TypeRefWithNullability", TypeRef, typeRef) val typeRefWithNullability = element("TypeRefWithNullability", TypeRef, typeRef)
val userTypeRef = element("UserTypeRef", TypeRef, typeRefWithNullability) val userTypeRef = element("UserTypeRef", TypeRef, typeRefWithNullability)
@@ -224,11 +224,9 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
noSource() noSource()
} }
impl(errorExpression) impl(errorLoop) {
impl(loop, "FirErrorLoop") {
default("block", "FirEmptyExpressionBlock()") default("block", "FirEmptyExpressionBlock()")
default("condition", "FirErrorExpressionImpl(source, \"error loop\")") default("condition", "FirErrorExpressionImpl(source, diagnostic)")
defaultNull("label") defaultNull("label")
useTypes(emptyExpressionBlock) useTypes(emptyExpressionBlock)
} }
@@ -496,13 +494,13 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
impl(resolvedTypeRef) impl(resolvedTypeRef)
val errorTypeRefImpl = impl(errorTypeRef) { val errorTypeRefImpl = impl(errorTypeRef) {
default("type", "ConeClassErrorType(reason)") default("type", "ConeClassErrorType(diagnostic.reason)")
useTypes(coneClassErrorTypeType) useTypes(coneClassErrorTypeType)
} }
impl(errorFunction) { impl(errorFunction) {
defaultNull("receiverTypeRef", "body", withGetter = true) defaultNull("receiverTypeRef", "body", withGetter = true)
default("returnTypeRef", "FirErrorTypeRefImpl(null, reason)") default("returnTypeRef", "FirErrorTypeRefImpl(null, diagnostic)")
useTypes(errorTypeRefImpl) useTypes(errorTypeRefImpl)
} }
@@ -524,7 +522,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
} }
impl(errorNamedReference) { impl(errorNamedReference) {
default("name", "Name.special(\"<\$errorReason>\")") default("name", "Name.special(\"<\$diagnostic.reason>\")")
defaultNull("candidateSymbol", withGetter = true) defaultNull("candidateSymbol", withGetter = true)
} }
@@ -59,6 +59,10 @@ object NodeConfigurator : AbstractFieldConfigurator() {
+field("calleeReference", reference).withTransform() +field("calleeReference", reference).withTransform()
} }
diagnosticHolder.configure {
+field("diagnostic", firDiagnosticType)
}
declaration.configure { declaration.configure {
+field("session", firSessionType) +field("session", firSessionType)
+field("resolvePhase", resolvePhaseType, withReplace = true).apply { isMutable = true } +field("resolvePhase", resolvePhaseType, withReplace = true).apply { isMutable = true }
@@ -95,7 +99,6 @@ object NodeConfigurator : AbstractFieldConfigurator() {
errorFunction.configure { errorFunction.configure {
parentArg(function, "F", errorFunction) parentArg(function, "F", errorFunction)
+stringField("reason")
+symbol("FirErrorFunctionSymbol") +symbol("FirErrorFunctionSymbol")
} }
@@ -398,10 +401,6 @@ object NodeConfigurator : AbstractFieldConfigurator() {
+intField("componentIndex") +intField("componentIndex")
} }
errorExpression.configure {
+stringField("reason")
}
expressionWithSmartcast.configure { expressionWithSmartcast.configure {
+field("originalExpression", qualifiedAccessExpression) +field("originalExpression", qualifiedAccessExpression)
+field("typesFromSmartcast", "Collection<ConeKotlinType>", null, customType = coneKotlinTypeType) +field("typesFromSmartcast", "Collection<ConeKotlinType>", null, customType = coneKotlinTypeType)
@@ -493,10 +492,6 @@ object NodeConfigurator : AbstractFieldConfigurator() {
+field("type", coneKotlinTypeType) +field("type", coneKotlinTypeType)
} }
errorTypeRef.configure {
+stringField("reason")
}
delegatedTypeRef.configure { delegatedTypeRef.configure {
+field("delegate", expression, nullable = true) +field("delegate", expression, nullable = true)
+field(typeRef) +field(typeRef)
@@ -533,10 +528,6 @@ object NodeConfigurator : AbstractFieldConfigurator() {
+field(varianceType) +field(varianceType)
} }
errorNamedReference.configure {
+stringField("errorReason")
}
contractDescription.configure { contractDescription.configure {
+fieldList("effects", effectDeclarationType) +fieldList("effects", effectDeclarationType)
} }
@@ -62,4 +62,5 @@ val classSymbolType = type("fir.symbols.impl", "FirClassSymbol")
val pureAbstractElementType = generatedType("FirPureAbstractElement") val pureAbstractElementType = generatedType("FirPureAbstractElement")
val effectDeclarationType = type("fir.contracts.description", "ConeEffectDeclaration") 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"), Reference("references"),
TypeRef("types"), TypeRef("types"),
Contracts("contracts"), Contracts("contracts"),
Diagnostics("diagnostics"),
Other("") Other("")
} }
} }
@@ -358,7 +358,7 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() {
override fun visitNamedReference(namedReference: FirNamedReference, data: StringBuilder) { override fun visitNamedReference(namedReference: FirNamedReference, data: StringBuilder) {
if (namedReference is FirErrorNamedReference) { if (namedReference is FirErrorNamedReference) {
data.append("[ERROR : ${namedReference.errorReason}]") data.append("[ERROR : ${namedReference.diagnostic.reason}]")
return return
} }
visitElement(namedReference, data) visitElement(namedReference, data)
@@ -416,7 +416,7 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() {
functionCall.typeRef.accept(this, data) functionCall.typeRef.accept(this, data)
} }
} }
is FirErrorNamedReference -> data.append("[ERROR : ${callee.errorReason}]") is FirErrorNamedReference -> data.append("[ERROR : ${callee.diagnostic.reason}]")
} }
} }
@@ -470,7 +470,7 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() {
} }
override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef, data: StringBuilder) { override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef, data: StringBuilder) {
data.append("[ERROR : ${errorTypeRef.reason}]") data.append("[ERROR : ${errorTypeRef.diagnostic.reason}]")
} }
override fun visitResolvedFunctionTypeRef(resolvedFunctionTypeRef: FirResolvedFunctionTypeRef, data: StringBuilder) { override fun visitResolvedFunctionTypeRef(resolvedFunctionTypeRef: FirResolvedFunctionTypeRef, data: StringBuilder) {