PSI2IR: ignore enum annotation arguments of error type
Similar to references to error type, this may happen if library A uses an entity from library B annotated with an annotation from C, but A is compiled without C on the classpath.
This commit is contained in:
@@ -77,8 +77,8 @@ class ConstantValueGenerator(
|
||||
startOffset, endOffset,
|
||||
constantType,
|
||||
arrayElementType.toIrType(),
|
||||
constantValue.value.map {
|
||||
generateConstantValueAsExpression(startOffset, endOffset, it, null)
|
||||
constantValue.value.mapNotNull {
|
||||
generateConstantOrAnnotationValueAsExpression(startOffset, endOffset, it, null)
|
||||
}
|
||||
)
|
||||
}
|
||||
@@ -90,6 +90,14 @@ class ConstantValueGenerator(
|
||||
if (enumEntryDescriptor !is ClassDescriptor) {
|
||||
throw AssertionError("Enum entry $enumEntryDescriptor should be a ClassDescriptor")
|
||||
}
|
||||
if (!DescriptorUtils.isEnumEntry(enumEntryDescriptor)) {
|
||||
// Error class descriptor for an unresolved entry.
|
||||
// TODO this `null` may actually reach codegen if the annotation is on an interface member's default implementation,
|
||||
// as any bridge generated in an implementation of that interface will have a copy of the annotation. See
|
||||
// `missingEnumReferencedInAnnotationArgumentIr` in `testData/compileKotlinAgainstCustomBinaries`: replace
|
||||
// `open class B` with `interface B` and watch things break. (`KClassValue` below likely has a similar problem.)
|
||||
return null
|
||||
}
|
||||
IrGetEnumValueImpl(
|
||||
startOffset, endOffset,
|
||||
constantType,
|
||||
@@ -115,6 +123,8 @@ class ConstantValueGenerator(
|
||||
}
|
||||
}
|
||||
|
||||
is ErrorValue -> null
|
||||
|
||||
else -> TODO("Unexpected constant value: ${constantValue.javaClass.simpleName} $constantValue")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user