Skip to content

Commit e490a85

Browse files
committed
Simplify kotlinFunctionToJavaEquivalent and accept consistency errors
1 parent c448711 commit e490a85

File tree

15 files changed

+190
-18
lines changed

15 files changed

+190
-18
lines changed

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

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,32 +1258,26 @@ open class KotlinUsesExtractor(
12581258
return tw.lm.locallyVisibleFunctionLabelMapping[f]?.function
12591259
}
12601260

1261-
// These are classes with Java equivalents, but whose methods don't all exist on those Java equivalents--
1262-
// for example, the numeric classes define arithmetic functions (Int.plus, Long.or and so on) that lower to
1263-
// primitive arithmetic on the JVM, but which we extract as calls to reflect the source syntax more closely.
1264-
private val expectedMissingEquivalents = setOf(
1265-
"kotlin.Boolean", "kotlin.Byte", "kotlin.Char", "kotlin.Double", "kotlin.Float", "kotlin.Int", "kotlin.Long", "kotlin.Number", "kotlin.Short"
1266-
)
1267-
12681261
private fun kotlinFunctionToJavaEquivalent(f: IrFunction, noReplace: Boolean): IrFunction =
12691262
if (noReplace)
12701263
f
12711264
else
12721265
f.parentClassOrNull?.let { parentClass ->
12731266
getJavaEquivalentClass(parentClass)?.let { javaClass ->
12741267
if (javaClass != parentClass) {
1275-
val jvmName = getJvmName(f) ?: f.name.asString()
1268+
var jvmName = getFunctionShortName(f).nameInDB
1269+
if (f.name.asString() == "get" && parentClass.fqNameWhenAvailable?.asString() == "kotlin.String") {
1270+
// `kotlin.String.get` has an equivalent `java.lang.String.get`, which in turn will be stored in the DB as `java.lang.String.charAt`.
1271+
// Maybe all operators should be handled the same way, but so far I only found this case that needed to be special cased. This is the
1272+
// only operator in `JvmNames.specialFunctions`
1273+
jvmName = "get"
1274+
}
12761275
// Look for an exact type match...
12771276
javaClass.declarations.findSubType<IrFunction> { decl ->
12781277
decl.name.asString() == jvmName &&
12791278
decl.valueParameters.size == f.valueParameters.size &&
12801279
decl.valueParameters.zip(f.valueParameters).all { p -> erase(p.first.type) == erase(p.second.type) }
12811280
} ?:
1282-
// Or if there is none, look for the only viable overload
1283-
javaClass.declarations.singleOrNullSubType<IrFunction> { decl ->
1284-
decl.name.asString() == jvmName &&
1285-
decl.valueParameters.size == f.valueParameters.size
1286-
} ?:
12871281
// Or check property accessors:
12881282
(f.propertyIfAccessor as? IrProperty)?.let { kotlinProp ->
12891283
val javaProp = javaClass.declarations.findSubType<IrProperty> { decl ->
@@ -1296,9 +1290,7 @@ open class KotlinUsesExtractor(
12961290
else null
12971291
} ?: run {
12981292
val parentFqName = parentClass.fqNameWhenAvailable?.asString()
1299-
if (!expectedMissingEquivalents.contains(parentFqName)) {
1300-
logger.warn("Couldn't find a Java equivalent function to $parentFqName.${f.name} in ${javaClass.fqNameWhenAvailable}")
1301-
}
1293+
logger.warn("Couldn't find a Java equivalent function to $parentFqName.${f.name} in ${javaClass.fqNameWhenAvailable}")
13021294
null
13031295
}
13041296
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Enum.<init> in java.lang.Enum |
2+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Enum.<init> in java.lang.Enum |
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.String.get in java.lang.String |
1+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Enum.<init> in java.lang.Enum |
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.String.get in java.lang.String |
1+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Int.dec in java.lang.Integer |
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Int.dec in java.lang.Integer |
2+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Int.dec in java.lang.Integer |
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Enum.<init> in java.lang.Enum |
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Boolean.not in java.lang.Boolean |
2+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Boolean.not in java.lang.Boolean |
3+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toInt in java.lang.Byte |
4+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toInt in java.lang.Byte |
5+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toInt in java.lang.Byte |
6+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toInt in java.lang.Byte |
7+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toInt in java.lang.Byte |
8+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toInt in java.lang.Byte |
9+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toInt in java.lang.Byte |
10+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toInt in java.lang.Byte |
11+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toInt in java.lang.Byte |
12+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toInt in java.lang.Byte |
13+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toInt in java.lang.Byte |
14+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toInt in java.lang.Byte |
15+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Enum.<init> in java.lang.Enum |
16+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Enum.<init> in java.lang.Enum |
17+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Int.and in java.lang.Integer |
18+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Int.dec in java.lang.Integer |
19+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Int.inv in java.lang.Integer |
20+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Int.or in java.lang.Integer |
21+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Int.rangeTo in java.lang.Integer |
22+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Int.rangeTo in java.lang.Integer |
23+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Int.shl in java.lang.Integer |
24+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Int.shr in java.lang.Integer |
25+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Int.ushr in java.lang.Integer |
26+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Int.xor in java.lang.Integer |
27+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Long.and in java.lang.Long |
28+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Long.inv in java.lang.Long |
29+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Long.or in java.lang.Long |
30+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Long.shl in java.lang.Long |
31+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Long.shr in java.lang.Long |
32+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Long.ushr in java.lang.Long |
33+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Long.xor in java.lang.Long |
34+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Short.toInt in java.lang.Short |
35+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Short.toInt in java.lang.Short |
36+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Short.toInt in java.lang.Short |
37+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Short.toInt in java.lang.Short |
38+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Short.toInt in java.lang.Short |
39+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Short.toInt in java.lang.Short |
40+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Short.toInt in java.lang.Short |
41+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Short.toInt in java.lang.Short |
42+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Short.toInt in java.lang.Short |
43+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Short.toInt in java.lang.Short |
44+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Short.toInt in java.lang.Short |
45+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Short.toInt in java.lang.Short |
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Enum.<init> in java.lang.Enum |
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toByte in java.lang.Byte |
2+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toDouble in java.lang.Byte |
3+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toFloat in java.lang.Byte |
4+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toInt in java.lang.Byte |
5+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toLong in java.lang.Byte |
6+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Byte.toShort in java.lang.Byte |
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Number.toChar in java.lang.Number |

0 commit comments

Comments
 (0)