diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt index 37cf98f8601..2a3204f1e3f 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt @@ -39,24 +39,34 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator { fun KotlinType.toIrType() = typeTranslator.translateType(this) - fun generateMemberDeclaration(ktDeclaration: KtDeclaration): IrDeclaration? = - when (ktDeclaration) { - is KtNamedFunction -> - FunctionGenerator(this).generateFunctionDeclaration(ktDeclaration) - is KtProperty -> - PropertyGenerator(this).generatePropertyDeclaration(ktDeclaration) - is KtClassOrObject -> - generateClassOrObjectDeclaration(ktDeclaration) - is KtTypeAlias -> - generateTypeAliasDeclaration(ktDeclaration) - is KtScript -> - ScriptGenerator(this).generateScriptDeclaration(ktDeclaration) - else -> + fun generateMemberDeclaration(ktDeclaration: KtDeclaration): IrDeclaration? { + return try { + when (ktDeclaration) { + is KtNamedFunction -> + FunctionGenerator(this).generateFunctionDeclaration(ktDeclaration) + is KtProperty -> + PropertyGenerator(this).generatePropertyDeclaration(ktDeclaration) + is KtClassOrObject -> + generateClassOrObjectDeclaration(ktDeclaration) + is KtTypeAlias -> + generateTypeAliasDeclaration(ktDeclaration) + is KtScript -> + ScriptGenerator(this).generateScriptDeclaration(ktDeclaration) + else -> + context.irFactory.createErrorDeclaration( + ktDeclaration.startOffsetSkippingComments, ktDeclaration.endOffset, + getOrFail(BindingContext.DECLARATION_TO_DESCRIPTOR, ktDeclaration) + ) + } + } catch (e: Throwable) { + if (context.configuration.ignoreErrors) { context.irFactory.createErrorDeclaration( ktDeclaration.startOffsetSkippingComments, ktDeclaration.endOffset, getOrFail(BindingContext.DECLARATION_TO_DESCRIPTOR, ktDeclaration) ) + } else throw e } + } fun generateSyntheticClassOrObject(syntheticDeclaration: KtPureClassOrObject): IrClass { return generateClassOrObjectDeclaration(syntheticDeclaration) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ErrorExpressionGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ErrorExpressionGenerator.kt index 4b405e91ad5..e627764d0b7 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ErrorExpressionGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ErrorExpressionGenerator.kt @@ -27,13 +27,13 @@ import org.jetbrains.kotlin.types.ErrorUtils class ErrorExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) { private val ignoreErrors: Boolean get() = context.configuration.ignoreErrors - private inline fun generateErrorExpression(ktElement: KtElement, e: Exception? = null, body: () -> IrExpression) = + private inline fun generateErrorExpression(ktElement: KtElement, e: Throwable? = null, body: () -> IrExpression) = if (ignoreErrors) body() else throw RuntimeException("${e?.message}: ${ktElement::class.java.simpleName}:\n${ktElement.text}", e) - fun generateErrorExpression(ktElement: KtElement, e: Exception): IrExpression = + fun generateErrorExpression(ktElement: KtElement, e: Throwable): IrExpression = generateErrorExpression(ktElement, e) { val errorExpressionType = if (ktElement is KtExpression) @@ -43,14 +43,14 @@ class ErrorExpressionGenerator(statementGenerator: StatementGenerator) : Stateme IrErrorExpressionImpl( ktElement.startOffsetSkippingComments, ktElement.endOffset, errorExpressionType.toIrType(), - e.message ?: "" + e.message ?: ktElement.text ) } fun generateErrorCall(ktCall: KtCallExpression): IrExpression = generateErrorExpression(ktCall) { val type = getErrorExpressionType(ktCall).toIrType() - val irErrorCall = IrErrorCallExpressionImpl(ktCall.startOffsetSkippingComments, ktCall.endOffset, type, "") // TODO problem description? + val irErrorCall = IrErrorCallExpressionImpl(ktCall.startOffsetSkippingComments, ktCall.endOffset, type, ktCall.text) // TODO problem description? irErrorCall.explicitReceiver = (ktCall.parent as? KtDotQualifiedExpression)?.run { receiverExpression.genExpr() } @@ -71,7 +71,7 @@ class ErrorExpressionGenerator(statementGenerator: StatementGenerator) : Stateme fun generateErrorSimpleName(ktName: KtSimpleNameExpression): IrExpression = generateErrorExpression(ktName) { val type = getErrorExpressionType(ktName).toIrType() - val irErrorCall = IrErrorCallExpressionImpl(ktName.startOffsetSkippingComments, ktName.endOffset, type, "") // TODO problem description? + val irErrorCall = IrErrorCallExpressionImpl(ktName.startOffsetSkippingComments, ktName.endOffset, type, ktName.text) // TODO problem description? irErrorCall.explicitReceiver = (ktName.parent as? KtDotQualifiedExpression)?.let { ktParent -> if (ktParent.receiverExpression == ktName) null else ktParent.receiverExpression.genExpr() diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt index 510944e0eca..c3cf23c3e0f 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt @@ -73,7 +73,7 @@ class StatementGenerator( private fun KtElement.genStmt(): IrStatement = try { deparenthesize().accept(this@StatementGenerator, null) - } catch (e: Exception) { + } catch (e: Throwable) { ErrorExpressionGenerator(this@StatementGenerator).generateErrorExpression(this, e) }