[Psi2Ir] Fix generation of IrError* nodes
- Provide detailed description - Support syntax-incorrect statements - Generate an error declaration if normal generation has failed
This commit is contained in:
+23
-13
@@ -39,24 +39,34 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator {
|
|||||||
|
|
||||||
fun KotlinType.toIrType() = typeTranslator.translateType(this)
|
fun KotlinType.toIrType() = typeTranslator.translateType(this)
|
||||||
|
|
||||||
fun generateMemberDeclaration(ktDeclaration: KtDeclaration): IrDeclaration? =
|
fun generateMemberDeclaration(ktDeclaration: KtDeclaration): IrDeclaration? {
|
||||||
when (ktDeclaration) {
|
return try {
|
||||||
is KtNamedFunction ->
|
when (ktDeclaration) {
|
||||||
FunctionGenerator(this).generateFunctionDeclaration(ktDeclaration)
|
is KtNamedFunction ->
|
||||||
is KtProperty ->
|
FunctionGenerator(this).generateFunctionDeclaration(ktDeclaration)
|
||||||
PropertyGenerator(this).generatePropertyDeclaration(ktDeclaration)
|
is KtProperty ->
|
||||||
is KtClassOrObject ->
|
PropertyGenerator(this).generatePropertyDeclaration(ktDeclaration)
|
||||||
generateClassOrObjectDeclaration(ktDeclaration)
|
is KtClassOrObject ->
|
||||||
is KtTypeAlias ->
|
generateClassOrObjectDeclaration(ktDeclaration)
|
||||||
generateTypeAliasDeclaration(ktDeclaration)
|
is KtTypeAlias ->
|
||||||
is KtScript ->
|
generateTypeAliasDeclaration(ktDeclaration)
|
||||||
ScriptGenerator(this).generateScriptDeclaration(ktDeclaration)
|
is KtScript ->
|
||||||
else ->
|
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(
|
context.irFactory.createErrorDeclaration(
|
||||||
ktDeclaration.startOffsetSkippingComments, ktDeclaration.endOffset,
|
ktDeclaration.startOffsetSkippingComments, ktDeclaration.endOffset,
|
||||||
getOrFail(BindingContext.DECLARATION_TO_DESCRIPTOR, ktDeclaration)
|
getOrFail(BindingContext.DECLARATION_TO_DESCRIPTOR, ktDeclaration)
|
||||||
)
|
)
|
||||||
|
} else throw e
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun generateSyntheticClassOrObject(syntheticDeclaration: KtPureClassOrObject): IrClass {
|
fun generateSyntheticClassOrObject(syntheticDeclaration: KtPureClassOrObject): IrClass {
|
||||||
return generateClassOrObjectDeclaration(syntheticDeclaration)
|
return generateClassOrObjectDeclaration(syntheticDeclaration)
|
||||||
|
|||||||
+5
-5
@@ -27,13 +27,13 @@ import org.jetbrains.kotlin.types.ErrorUtils
|
|||||||
class ErrorExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
|
class ErrorExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
|
||||||
private val ignoreErrors: Boolean get() = context.configuration.ignoreErrors
|
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)
|
if (ignoreErrors)
|
||||||
body()
|
body()
|
||||||
else
|
else
|
||||||
throw RuntimeException("${e?.message}: ${ktElement::class.java.simpleName}:\n${ktElement.text}", e)
|
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) {
|
generateErrorExpression(ktElement, e) {
|
||||||
val errorExpressionType =
|
val errorExpressionType =
|
||||||
if (ktElement is KtExpression)
|
if (ktElement is KtExpression)
|
||||||
@@ -43,14 +43,14 @@ class ErrorExpressionGenerator(statementGenerator: StatementGenerator) : Stateme
|
|||||||
IrErrorExpressionImpl(
|
IrErrorExpressionImpl(
|
||||||
ktElement.startOffsetSkippingComments, ktElement.endOffset,
|
ktElement.startOffsetSkippingComments, ktElement.endOffset,
|
||||||
errorExpressionType.toIrType(),
|
errorExpressionType.toIrType(),
|
||||||
e.message ?: ""
|
e.message ?: ktElement.text
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun generateErrorCall(ktCall: KtCallExpression): IrExpression = generateErrorExpression(ktCall) {
|
fun generateErrorCall(ktCall: KtCallExpression): IrExpression = generateErrorExpression(ktCall) {
|
||||||
val type = getErrorExpressionType(ktCall).toIrType()
|
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 {
|
irErrorCall.explicitReceiver = (ktCall.parent as? KtDotQualifiedExpression)?.run {
|
||||||
receiverExpression.genExpr()
|
receiverExpression.genExpr()
|
||||||
}
|
}
|
||||||
@@ -71,7 +71,7 @@ class ErrorExpressionGenerator(statementGenerator: StatementGenerator) : Stateme
|
|||||||
fun generateErrorSimpleName(ktName: KtSimpleNameExpression): IrExpression = generateErrorExpression(ktName) {
|
fun generateErrorSimpleName(ktName: KtSimpleNameExpression): IrExpression = generateErrorExpression(ktName) {
|
||||||
val type = getErrorExpressionType(ktName).toIrType()
|
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 ->
|
irErrorCall.explicitReceiver = (ktName.parent as? KtDotQualifiedExpression)?.let { ktParent ->
|
||||||
if (ktParent.receiverExpression == ktName) null
|
if (ktParent.receiverExpression == ktName) null
|
||||||
else ktParent.receiverExpression.genExpr()
|
else ktParent.receiverExpression.genExpr()
|
||||||
|
|||||||
+1
-1
@@ -73,7 +73,7 @@ class StatementGenerator(
|
|||||||
private fun KtElement.genStmt(): IrStatement =
|
private fun KtElement.genStmt(): IrStatement =
|
||||||
try {
|
try {
|
||||||
deparenthesize().accept(this@StatementGenerator, null)
|
deparenthesize().accept(this@StatementGenerator, null)
|
||||||
} catch (e: Exception) {
|
} catch (e: Throwable) {
|
||||||
ErrorExpressionGenerator(this@StatementGenerator).generateErrorExpression(this, e)
|
ErrorExpressionGenerator(this@StatementGenerator).generateErrorExpression(this, e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user