[IR] Improve partial linkage error messages
^KT-50775
This commit is contained in:
+25
-18
@@ -56,7 +56,7 @@ internal class UnlinkedDeclarationsProcessor(
|
|||||||
|
|
||||||
klass.reportWarning("Class", klass.fqNameForIrSerialization.asString())
|
klass.reportWarning("Class", klass.fqNameForIrSerialization.asString())
|
||||||
|
|
||||||
anonInitializer.body.statements.add(klass.throwLinkageError(klass.symbol.signature?.render()))
|
anonInitializer.body.statements.add(klass.throwLinkageError(klass.symbol))
|
||||||
|
|
||||||
klass.superTypes = klass.superTypes.filter { !it.isUnlinked() }
|
klass.superTypes = klass.superTypes.filter { !it.isUnlinked() }
|
||||||
}
|
}
|
||||||
@@ -122,7 +122,7 @@ internal class UnlinkedDeclarationsProcessor(
|
|||||||
declaration.body?.let { body ->
|
declaration.body?.let { body ->
|
||||||
val bb = (body as IrBlockBody)
|
val bb = (body as IrBlockBody)
|
||||||
bb.statements.clear()
|
bb.statements.clear()
|
||||||
bb.statements.add(declaration.throwLinkageError("Unlinked type in function signature"))
|
bb.statements.add(declaration.throwLinkageError(unlinkedSymbol = null, "Unlinked type in IR function signature"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return declaration
|
return declaration
|
||||||
@@ -187,11 +187,12 @@ internal class UnlinkedDeclarationsProcessor(
|
|||||||
return with(unlinkedMarkerTypeHandler) { isUnlinkedMarkerType() }
|
return with(unlinkedMarkerTypeHandler) { isUnlinkedMarkerType() }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun IrElement.throwLinkageError(message: String?): IrCall {
|
private fun IrElement.throwLinkageError(unlinkedSymbol: IrSymbol?, message: String = "Unlinked IR symbol"): IrCall {
|
||||||
return IrCallImpl(startOffset, endOffset, builtIns.nothingType, builtIns.linkageErrorSymbol, 0, 1, errorOrigin).also { call ->
|
val messageLiteral = message + unlinkedSymbol?.signature?.render()?.let { " $it" }.orEmpty()
|
||||||
val messageLiteral = "Linkage error of symbol: ${message ?: ""}"
|
|
||||||
call.putValueArgument(0, IrConstImpl.string(startOffset, endOffset, builtIns.stringType, messageLiteral))
|
val irCall = IrCallImpl(startOffset, endOffset, builtIns.nothingType, builtIns.linkageErrorSymbol, 0, 1, errorOrigin)
|
||||||
}
|
irCall.putValueArgument(0, IrConstImpl.string(startOffset, endOffset, builtIns.stringType, messageLiteral))
|
||||||
|
return irCall
|
||||||
}
|
}
|
||||||
|
|
||||||
fun usageTransformer(): IrElementTransformerVoid = UsageTransformer()
|
fun usageTransformer(): IrElementTransformerVoid = UsageTransformer()
|
||||||
@@ -220,7 +221,7 @@ internal class UnlinkedDeclarationsProcessor(
|
|||||||
val composite = IrCompositeImpl(expression.startOffset, expression.endOffset, builtIns.nothingType)
|
val composite = IrCompositeImpl(expression.startOffset, expression.endOffset, builtIns.nothingType)
|
||||||
|
|
||||||
composite.statements.add(expression.argument)
|
composite.statements.add(expression.argument)
|
||||||
composite.statements.add(expression.throwLinkageError(expression.typeOperandClassifier.signature?.render()))
|
composite.statements.add(expression.throwLinkageError(expression.typeOperandClassifier))
|
||||||
|
|
||||||
return composite
|
return composite
|
||||||
}
|
}
|
||||||
@@ -228,7 +229,7 @@ internal class UnlinkedDeclarationsProcessor(
|
|||||||
override fun visitExpression(expression: IrExpression): IrExpression {
|
override fun visitExpression(expression: IrExpression): IrExpression {
|
||||||
if (expression.type.isUnlinked() || expression.type.isUnlinkedMarkerType()) {
|
if (expression.type.isUnlinked() || expression.type.isUnlinkedMarkerType()) {
|
||||||
reportWarning("Expression type contains unlinked symbol", currentFile?.location(expression.startOffset))
|
reportWarning("Expression type contains unlinked symbol", currentFile?.location(expression.startOffset))
|
||||||
return expression.throwLinkageError("Unlinked type of expression")
|
return expression.throwLinkageError(unlinkedSymbol = null, "Unlinked type of IR expression")
|
||||||
}
|
}
|
||||||
return super.visitExpression(expression)
|
return super.visitExpression(expression)
|
||||||
}
|
}
|
||||||
@@ -254,9 +255,12 @@ internal class UnlinkedDeclarationsProcessor(
|
|||||||
arg?.let { composite.statements.add(it) }
|
arg?.let { composite.statements.add(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
val message =
|
composite.statements.add(
|
||||||
if (!symbol.isBound) "Unlinked symbol: ${symbol.signature?.render()}" else "Unlinked type in signature of ${symbol.signature?.render()}"
|
if (!symbol.isBound)
|
||||||
composite.statements.add(expression.throwLinkageError(message))
|
expression.throwLinkageError(symbol)
|
||||||
|
else
|
||||||
|
expression.throwLinkageError(symbol, "Unlinked type in signature of IR symbol")
|
||||||
|
)
|
||||||
|
|
||||||
return composite
|
return composite
|
||||||
}
|
}
|
||||||
@@ -269,7 +273,7 @@ internal class UnlinkedDeclarationsProcessor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
reportWarning(
|
reportWarning(
|
||||||
"Accessing field contains unlinked symbol ${symbol.signature?.render() ?: ""}",
|
"Accessing field contains unlinked symbol ${symbol.signature?.render()}",
|
||||||
currentFile?.location(expression.startOffset)
|
currentFile?.location(expression.startOffset)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -278,19 +282,22 @@ internal class UnlinkedDeclarationsProcessor(
|
|||||||
if (expression is IrSetField) {
|
if (expression is IrSetField) {
|
||||||
composite.statements.add(expression.value)
|
composite.statements.add(expression.value)
|
||||||
}
|
}
|
||||||
val message = if (!symbol.isBound) "Unlinked symbol: ${symbol.signature?.render()}" else "Field type is unlinked"
|
composite.statements.add(
|
||||||
composite.statements.add(expression.throwLinkageError(message))
|
if (!symbol.isBound)
|
||||||
|
expression.throwLinkageError(symbol)
|
||||||
|
else
|
||||||
|
expression.throwLinkageError(symbol, "Field type is unlinked in IR symbol")
|
||||||
|
)
|
||||||
return composite
|
return composite
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitClassReference(expression: IrClassReference): IrExpression {
|
override fun visitClassReference(expression: IrClassReference): IrExpression {
|
||||||
if (expression.symbol.isUnlinked()) {
|
if (expression.symbol.isUnlinked()) {
|
||||||
val signRender = expression.symbol.signature?.render()
|
|
||||||
reportWarning(
|
reportWarning(
|
||||||
"Accessing class contains unlinked symbol ${signRender ?: ""}",
|
"Accessing class contains unlinked symbol ${expression.symbol.signature?.render()}",
|
||||||
currentFile?.location(expression.startOffset)
|
currentFile?.location(expression.startOffset)
|
||||||
)
|
)
|
||||||
return expression.throwLinkageError(signRender)
|
return expression.throwLinkageError(expression.symbol)
|
||||||
}
|
}
|
||||||
return expression
|
return expression
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user