Fixes in IrValidator

This commit is contained in:
Igor Chevdar
2019-06-21 17:23:49 +03:00
parent 595a549188
commit b62e9487d1
@@ -25,9 +25,8 @@ import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.isAnnotationClass import org.jetbrains.kotlin.ir.types.defaultType
import org.jetbrains.kotlin.ir.util.isUnsigned import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.util.render
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
@@ -51,15 +50,19 @@ class CheckIrElementVisitor(
// Nothing to do. // Nothing to do.
} }
private fun IrExpression.ensureTypeIs(expectedType: IrType) { private fun IrExpression.ensureTypesEqual(actualType: IrType, expectedType: IrType) {
if (!config.checkTypes) if (!config.checkTypes)
return return
if (type != expectedType) { if (actualType != expectedType) {
reportError(this, "unexpected expression.type: expected ${expectedType.render()}, got ${type.render()}") reportError(this, "unexpected type: expected ${expectedType.render()}, got ${actualType.render()}")
} }
} }
private fun IrExpression.ensureTypeIs(expectedType: IrType) {
ensureTypesEqual(type, expectedType)
}
private fun IrSymbol.ensureBound(expression: IrExpression) { private fun IrSymbol.ensureBound(expression: IrExpression) {
if (!this.isBound && expression.type !is IrDynamicType) { if (!this.isBound && expression.type !is IrDynamicType) {
reportError(expression, "Unbound symbol ${this}") reportError(expression, "Unbound symbol ${this}")
@@ -82,13 +85,12 @@ class CheckIrElementVisitor(
IrConstKind.Double -> irBuiltIns.doubleType IrConstKind.Double -> irBuiltIns.doubleType
} }
if (expression.type.isUnsigned()) { var type = expression.type
// TODO: There are no unsigned builtins. while (true) {
// And the CONST kind for an unsigned is signed. val inlinedClass = type.getInlinedClass() ?: break
} else { type = getInlineClassUnderlyingType(inlinedClass)
expression.ensureTypeIs(naturalType)
} }
expression.ensureTypesEqual(type, naturalType)
} }
override fun visitStringConcatenation(expression: IrStringConcatenation) { override fun visitStringConcatenation(expression: IrStringConcatenation) {
@@ -120,7 +122,14 @@ class CheckIrElementVisitor(
override fun visitGetField(expression: IrGetField) { override fun visitGetField(expression: IrGetField) {
super.visitGetField(expression) super.visitGetField(expression)
expression.ensureTypeIs(expression.symbol.owner.type) val fieldType = expression.symbol.owner.type
// TODO: We don't have the proper type substitution yet, so skip generics for now.
if (fieldType is IrSimpleType &&
fieldType.classifier is IrClassSymbol &&
fieldType.arguments.isEmpty()
) {
expression.ensureTypeIs(fieldType)
}
} }
override fun visitSetField(expression: IrSetField) { override fun visitSetField(expression: IrSetField) {
@@ -137,6 +146,7 @@ class CheckIrElementVisitor(
if (function.dispatchReceiverParameter?.type is IrDynamicType) { if (function.dispatchReceiverParameter?.type is IrDynamicType) {
reportError(expression, "Dispatch receivers with 'dynamic' type are not allowed") reportError(expression, "Dispatch receivers with 'dynamic' type are not allowed")
} }
// TODO: Why don't we check parameters as well?
val returnType = expression.symbol.owner.returnType val returnType = expression.symbol.owner.returnType
// TODO: We don't have the proper type substitution yet, so skip generics for now. // TODO: We don't have the proper type substitution yet, so skip generics for now.