Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 70294bd

Browse files
smowtonigfoo
authored andcommitted
Array types: distinguish (e.g.) Array<Int> from IntArray
1 parent 380da46 commit 70294bd

4 files changed

Lines changed: 31 additions & 8 deletions

File tree

java/kotlin-extractor/src/main/kotlin/KotlinExtractorExtension.kt

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,11 @@ open class KotlinUsesExtractor(
410410
else
411411
primitiveInfo.primitiveName
412412

413-
type.isBoxedArray || type.isPrimitiveArray() -> shortName(type.getArrayElementType(pluginContext.irBuiltIns)) + "[]"
413+
type.isBoxedArray || type.isPrimitiveArray() -> {
414+
val elementType = type.getArrayElementType(pluginContext.irBuiltIns)
415+
val javaElementType = if (type.isPrimitiveArray()) elementType else elementType.makeNullable()
416+
shortName(javaElementType) + "[]"
417+
}
414418

415419
type.classifier.owner is IrClass -> {
416420
val c = type.classifier.owner as IrClass
@@ -549,22 +553,20 @@ open class KotlinUsesExtractor(
549553
// Note the stripping of any type projection from `componentType` here mirrors the action of `IrType.getArrayElementType`,
550554
// and is required if we are not to produce different kotlin types for the same Java type (e.g. List[] -> Array<out List> or Array<List>)
551555
val owner: IrClass = arrayType.classifier.owner as IrClass
552-
val kotlinClassName = getUnquotedClassLabel(owner, listOf(makeTypeProjection(componentType, Variance.INVARIANT)))
556+
val kotlinTypeArgs = if (arrayType.arguments.isEmpty()) listOf() else listOf(makeTypeProjection(componentType, Variance.INVARIANT))
557+
val kotlinClassName = getUnquotedClassLabel(owner, kotlinTypeArgs)
553558
val kotlinSignature = "$javaSignature?" // TODO: Wrong
554559
val kotlinLabel = "@\"kt_type;nullable;${kotlinClassName}\""
555560
val kotlinId: Label<DbKt_nullable_type> = tw.getLabelFor(kotlinLabel, {
556561
tw.writeKt_nullable_types(it, id)
557562
})
558563
val kotlinResult = TypeResult(kotlinId, kotlinSignature)
559564

560-
/*
561-
TODO
562565
tw.getLabelFor<DbMethod>("@\"callable;{$id}.clone(){$id}\"") {
563566
tw.writeMethods(it, "clone", "clone()", javaResult.id, kotlinResult.id, javaResult.id, it)
564567
// TODO: modifiers
565568
// tw.writeHasModifier(clone, getModifierKey("public"))
566569
}
567-
*/
568570

569571
return TypeResults(javaResult, kotlinResult)
570572
}
@@ -657,19 +659,22 @@ class X {
657659

658660
(s.isBoxedArray && s.arguments.isNotEmpty()) || s.isPrimitiveArray() -> {
659661
var dimensions = 1
662+
var isPrimitiveArray = s.isPrimitiveArray()
660663
val componentType = s.getArrayElementType(pluginContext.irBuiltIns)
661664
var elementType = componentType
662665
while (elementType.isBoxedArray || elementType.isPrimitiveArray()) {
663666
dimensions++
667+
if(elementType.isPrimitiveArray())
668+
isPrimitiveArray = true
664669
elementType = elementType.getArrayElementType(pluginContext.irBuiltIns)
665670
}
666671

667-
fun nullableIfRefType(type: IrType) = if (type.isPrimitiveType()) type else type.makeNullable()
672+
fun nullableUnlessPrimitive(type: IrType) = if (isPrimitiveArray && type.isPrimitiveType()) type else type.makeNullable()
668673

669674
return useArrayType(
670675
s,
671-
nullableIfRefType(componentType),
672-
nullableIfRefType(elementType),
676+
nullableUnlessPrimitive(componentType),
677+
nullableUnlessPrimitive(elementType),
673678
dimensions
674679
)
675680
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package test
2+
3+
class Test {
4+
5+
fun test(a: Array<Int>, b: Array<Int?>, c: IntArray, d: Array<Array<Int?>>, e: Array<Array<Int>>, f: Array<IntArray>) { }
6+
7+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
| primitiveArrays.kt:5:12:5:24 | a | file://:0:0:0:0 | Integer[] | file://:0:0:0:0 | Integer | file://:0:0:0:0 | Integer | file://:0:0:0:0 | Kotlin nullable Integer | file://:0:0:0:0 | Kotlin nullable Integer |
2+
| primitiveArrays.kt:5:27:5:40 | b | file://:0:0:0:0 | Integer[] | file://:0:0:0:0 | Integer | file://:0:0:0:0 | Integer | file://:0:0:0:0 | Kotlin nullable Integer | file://:0:0:0:0 | Kotlin nullable Integer |
3+
| primitiveArrays.kt:5:43:5:53 | c | file://:0:0:0:0 | int[] | file://:0:0:0:0 | int | file://:0:0:0:0 | int | file://:0:0:0:0 | Kotlin not-null Integer | file://:0:0:0:0 | Kotlin not-null Integer |
4+
| primitiveArrays.kt:5:56:5:76 | d | file://:0:0:0:0 | Integer[][] | file://:0:0:0:0 | Integer[] | file://:0:0:0:0 | Integer | file://:0:0:0:0 | Kotlin nullable Integer[] | file://:0:0:0:0 | Kotlin nullable Integer |
5+
| primitiveArrays.kt:5:79:5:98 | e | file://:0:0:0:0 | Integer[][] | file://:0:0:0:0 | Integer[] | file://:0:0:0:0 | Integer | file://:0:0:0:0 | Kotlin nullable Integer[] | file://:0:0:0:0 | Kotlin nullable Integer |
6+
| primitiveArrays.kt:5:101:5:118 | f | file://:0:0:0:0 | int[][] | file://:0:0:0:0 | int[] | file://:0:0:0:0 | int | file://:0:0:0:0 | Kotlin nullable int[] | file://:0:0:0:0 | Kotlin not-null Integer |
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import java
2+
3+
from Parameter p, Array a
4+
where p.getType() = a and p.getFile().getBaseName() = "primitiveArrays.kt"
5+
select p, a, a.getComponentType(), a.getElementType(), a.getComponentKotlinType(), a.getElementKotlinType()

0 commit comments

Comments
 (0)