@@ -512,18 +512,24 @@ open class KotlinFileExtractor(
512
512
annotationClass : IrClass ,
513
513
containerClass : IrClass ,
514
514
entries : List <IrConstructorCall >,
515
- ): IrConstructorCall {
515
+ ): IrConstructorCall ? {
516
516
val annotationType = annotationClass.typeWith()
517
- return IrConstructorCallImpl .fromSymbolOwner(containerClass.defaultType, containerClass.primaryConstructor!! .symbol).apply {
518
- putValueArgument(
519
- 0 ,
520
- IrVarargImpl (
521
- UNDEFINED_OFFSET , UNDEFINED_OFFSET ,
522
- pluginContext.irBuiltIns.arrayClass.typeWith(annotationType),
523
- annotationType,
524
- entries
517
+ val containerConstructor = containerClass.primaryConstructor
518
+ if (containerConstructor == null ) {
519
+ logger.warnElement(" Expected container class to have a primary constructor" , containerClass)
520
+ return null
521
+ } else {
522
+ return IrConstructorCallImpl .fromSymbolOwner(containerClass.defaultType, containerConstructor.symbol).apply {
523
+ putValueArgument(
524
+ 0 ,
525
+ IrVarargImpl (
526
+ UNDEFINED_OFFSET , UNDEFINED_OFFSET ,
527
+ pluginContext.irBuiltIns.arrayClass.typeWith(annotationType),
528
+ annotationType,
529
+ entries
530
+ )
525
531
)
526
- )
532
+ }
527
533
}
528
534
}
529
535
@@ -560,11 +566,15 @@ open class KotlinFileExtractor(
560
566
.filterIsInstance<IrProperty >()
561
567
.first { it.name == param.name }
562
568
val v = constructorCall.getValueArgument(i) ? : param.defaultValue?.expression
563
- val getter = prop.getter!!
564
- val getterId = useFunction<DbMethod >(getter)
565
- val exprId = extractAnnotationValueExpression(v, id, i, " {${getterId} }" , getter.returnType)
566
- if (exprId != null ) {
567
- tw.writeAnnotValue(id, getterId, exprId)
569
+ val getter = prop.getter
570
+ if (getter == null ) {
571
+ logger.warnElement(" Expected annotation property to define a getter" , prop)
572
+ } else {
573
+ val getterId = useFunction<DbMethod >(getter)
574
+ val exprId = extractAnnotationValueExpression(v, id, i, " {${getterId} }" , getter.returnType)
575
+ if (exprId != null ) {
576
+ tw.writeAnnotValue(id, getterId, exprId)
577
+ }
568
578
}
569
579
}
570
580
return id
@@ -599,22 +609,26 @@ open class KotlinFileExtractor(
599
609
// Use the context type (i.e., the type the annotation expects, not the actual type of the array)
600
610
// because the Java extractor fills in array types using the same technique. These should only
601
611
// differ for generic annotations.
602
- val type = useType(kClassToJavaClass(contextType!! ))
603
- tw.writeExprs_arrayinit(arrayId, type.javaResult.id, parent, idx)
604
- tw.writeExprsKotlinType(arrayId, type.kotlinResult.id)
605
- tw.writeHasLocation(arrayId, tw.getLocation(v))
606
-
607
- v.elements.forEachIndexed { index, irVarargElement -> run {
608
- val argExpr = when (irVarargElement) {
609
- is IrExpression -> irVarargElement
610
- is IrSpreadElement -> irVarargElement.expression
611
- else -> {
612
- logger.errorElement(" Unrecognised IrVarargElement: " + irVarargElement.javaClass, irVarargElement)
613
- null
612
+ if (contextType == null ) {
613
+ logger.warnElement(" Expected an annotation array to have an enclosing context" , v)
614
+ } else {
615
+ val type = useType(kClassToJavaClass(contextType))
616
+ tw.writeExprs_arrayinit(arrayId, type.javaResult.id, parent, idx)
617
+ tw.writeExprsKotlinType(arrayId, type.kotlinResult.id)
618
+ tw.writeHasLocation(arrayId, tw.getLocation(v))
619
+
620
+ v.elements.forEachIndexed { index, irVarargElement -> run {
621
+ val argExpr = when (irVarargElement) {
622
+ is IrExpression -> irVarargElement
623
+ is IrSpreadElement -> irVarargElement.expression
624
+ else -> {
625
+ logger.errorElement(" Unrecognised IrVarargElement: " + irVarargElement.javaClass, irVarargElement)
626
+ null
627
+ }
614
628
}
615
- }
616
- extractAnnotationValueExpression(argExpr, arrayId, index, " child; $index " , null )
617
- } }
629
+ extractAnnotationValueExpression(argExpr, arrayId, index, " child; $index " , null )
630
+ } }
631
+ }
618
632
}
619
633
}
620
634
// is IrErrorExpression
@@ -900,9 +914,14 @@ open class KotlinFileExtractor(
900
914
c.declarations
901
915
.filterIsInstance<IrProperty >()
902
916
.map {
903
- val getter = it.getter!!
904
- val label = extractFunction(getter, id, extractBody = false , extractMethodAndParameterTypeAccesses = true , extractAnnotations = true , null , listOf ())
905
- tw.writeIsAnnotElem(label!! .cast<DbMethod >())
917
+ val getter = it.getter
918
+ if (getter == null ) {
919
+ logger.warnElement(" Expected an annotation property to have a getter" , it)
920
+ } else {
921
+ extractFunction(getter, id, extractBody = false , extractMethodAndParameterTypeAccesses = true , extractAnnotations = true , null , listOf ())?.also { functionLabel ->
922
+ tw.writeIsAnnotElem(functionLabel.cast())
923
+ }
924
+ }
906
925
}
907
926
} else {
908
927
c.declarations.forEach { extractDeclaration(it, extractPrivateMembers = extractPrivateMembers, extractFunctionBodies = extractFunctionBodies, extractAnnotations = true ) }
0 commit comments