[Low Level FIR] fix exception when creating symbol by invalid code

This commit is contained in:
Ilya Kirillov
2022-10-02 13:07:20 +02:00
committed by teamcity
parent 24bf273b93
commit 49f2f85927
29 changed files with 553 additions and 39 deletions
@@ -23,6 +23,7 @@ abstract class FirErrorExpression : FirExpression(), FirDiagnosticHolder {
abstract override val annotations: List<FirAnnotation>
abstract override val diagnostic: ConeDiagnostic
abstract val expression: FirExpression?
abstract val nonExpressionElement: FirElement?
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitErrorExpression(this, data)
@@ -9,6 +9,7 @@ package org.jetbrains.kotlin.fir.expressions.builder
import kotlin.contracts.*
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
@@ -33,6 +34,7 @@ class FirErrorExpressionBuilder : FirAnnotationContainerBuilder, FirExpressionBu
override val annotations: MutableList<FirAnnotation> = mutableListOf()
lateinit var diagnostic: ConeDiagnostic
var expression: FirExpression? = null
var nonExpressionElement: FirElement? = null
override fun build(): FirErrorExpression {
return FirErrorExpressionImpl(
@@ -40,6 +42,7 @@ class FirErrorExpressionBuilder : FirAnnotationContainerBuilder, FirExpressionBu
annotations,
diagnostic,
expression,
nonExpressionElement,
)
}
@@ -8,6 +8,7 @@
package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.ConeStubDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
@@ -27,6 +28,7 @@ internal class FirErrorExpressionImpl(
override val annotations: MutableList<FirAnnotation>,
override val diagnostic: ConeDiagnostic,
override var expression: FirExpression?,
override var nonExpressionElement: FirElement?,
) : FirErrorExpression() {
override var typeRef: FirTypeRef = FirErrorTypeRefImpl(source, null, ConeStubDiagnostic(diagnostic), false)
@@ -34,12 +36,14 @@ internal class FirErrorExpressionImpl(
typeRef.accept(visitor, data)
annotations.forEach { it.accept(visitor, data) }
expression?.accept(visitor, data)
nonExpressionElement?.accept(visitor, data)
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirErrorExpressionImpl {
typeRef = typeRef.transform(transformer, data)
transformAnnotations(transformer, data)
expression = expression?.transform(transformer, data)
nonExpressionElement = nonExpressionElement?.transform(transformer, data)
return this
}
@@ -30,7 +30,7 @@ internal class FirErrorLoopImpl(
override val diagnostic: ConeDiagnostic,
) : FirErrorLoop() {
override var block: FirBlock = FirEmptyExpressionBlock()
override var condition: FirExpression = FirErrorExpressionImpl(source, mutableListOf(), ConeStubDiagnostic(diagnostic), null)
override var condition: FirExpression = FirErrorExpressionImpl(source, mutableListOf(), ConeStubDiagnostic(diagnostic), null, null)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
annotations.forEach { it.accept(visitor, data) }