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

Skip to content

Commit ccf21b7

Browse files
smowtonigfoo
authored andcommitted
Implement Java signature extraction
1 parent 6391484 commit ccf21b7

10 files changed

Lines changed: 135 additions & 59 deletions

File tree

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

Lines changed: 39 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -323,9 +323,9 @@ open class KotlinUsesExtractor(
323323
return id
324324
}
325325

326-
data class UseClassInstanceResult(val classLabel: Label<out DbClassorinterface>, val javaClass: IrClass, val shortName: String)
327-
data class TypeResult<LabelType>(val id: Label<LabelType>, val signature: String, val shortName: String)
328-
data class TypeResults(val javaResult: TypeResult<out DbType>, val kotlinResult: TypeResult<out DbKt_type>)
326+
data class UseClassInstanceResult(val typeResult: TypeResult<DbClassorinterface>, val javaClass: IrClass)
327+
data class TypeResult<out LabelType>(val id: Label<out LabelType>, val signature: String?, val shortName: String)
328+
data class TypeResults(val javaResult: TypeResult<DbType>, val kotlinResult: TypeResult<DbKt_type>)
329329

330330
fun useType(t: IrType, canReturnPrimitiveTypes: Boolean = true) =
331331
when(t) {
@@ -382,7 +382,7 @@ open class KotlinUsesExtractor(
382382
substituteClass?.let { extractClassLaterIfExternal(it) }
383383
})
384384

385-
return UseClassInstanceResult(classLabel, extractClass, classId.shortName)
385+
return UseClassInstanceResult(TypeResult(classLabel, extractClass.fqNameWhenAvailable?.asString(), classId.shortName), extractClass)
386386
}
387387

388388
fun isExternalDeclaration(d: IrDeclaration): Boolean {
@@ -412,22 +412,20 @@ open class KotlinUsesExtractor(
412412
externalClassExtractor.extractLater(c)
413413
}
414414

415-
fun addClassLabel(c: IrClass, typeArgs: List<IrTypeArgument>): TypeResult<out DbClassorinterface> {
415+
fun addClassLabel(c: IrClass, typeArgs: List<IrTypeArgument>): TypeResult<DbClassorinterface> {
416416
val classLabelResult = getClassLabel(c, typeArgs)
417417
return TypeResult(
418418
tw.getLabelFor(classLabelResult.classLabel),
419-
"TODO",
419+
c.fqNameWhenAvailable?.asString(),
420420
classLabelResult.shortName)
421421
}
422422

423423
fun useSimpleTypeClass(c: IrClass, args: List<IrTypeArgument>, hasQuestionMark: Boolean): TypeResults {
424424
val classInstanceResult = useClassInstance(c, args)
425-
val javaClassId = classInstanceResult.classLabel
425+
val javaClassId = classInstanceResult.typeResult.id
426426
val kotlinQualClassName = getUnquotedClassLabel(c, args).classLabel
427-
val javaQualClassName = classInstanceResult.javaClass.fqNameForIrSerialization.asString()
428-
val javaSignature = javaQualClassName // TODO: Is this right?
429427
// TODO: args ought to be substituted, so e.g. MutableList<MutableList<String>> gets the Java type List<List<String>>
430-
val javaResult = TypeResult(javaClassId, javaSignature, classInstanceResult.shortName)
428+
val javaResult = classInstanceResult.typeResult
431429
val kotlinResult = if (hasQuestionMark) {
432430
val kotlinSignature = "$kotlinQualClassName?" // TODO: Is this right?
433431
val kotlinLabel = "@\"kt_type;nullable;$kotlinQualClassName\""
@@ -547,10 +545,10 @@ open class KotlinUsesExtractor(
547545
TypeResult(label, primitiveName, primitiveName)
548546
} else {
549547
val label = makeClass(javaPackageName, javaClassName)
550-
val signature = "$javaPackageName.$javaClassName" // TODO: Is this right?
548+
val signature = "$javaPackageName.$javaClassName"
551549
TypeResult(label, signature, javaClassName)
552550
}
553-
val kotlinClassId = useClassInstance(kotlinClass, listOf()).classLabel
551+
val kotlinClassId = useClassInstance(kotlinClass, listOf()).typeResult.id
554552
val kotlinResult = if (s.hasQuestionMark) {
555553
val kotlinSignature = "$kotlinPackageName.$kotlinClassName?" // TODO: Is this right?
556554
val kotlinLabel = "@\"kt_type;nullable;$kotlinPackageName.$kotlinClassName\""
@@ -700,7 +698,7 @@ class X {
700698

701699
fun getTypeArgumentLabel(
702700
arg: IrTypeArgument
703-
): TypeResult<out DbReftype> {
701+
): TypeResult<DbReftype> {
704702

705703
fun extractBoundedWildcard(wildcardKind: Int, wildcardLabelStr: String, wildcardShortName: String, boundLabel: Label<out DbReftype>): Label<DbWildcard> =
706704
tw.getLabelFor(wildcardLabelStr) { wildcardLabel ->
@@ -711,11 +709,12 @@ class X {
711709
}
712710
}
713711

712+
// Note this function doesn't return a signature because type arguments are never incorporated into function signatures.
714713
return when (arg) {
715714
is IrStarProjection -> {
716715
@Suppress("UNCHECKED_CAST")
717716
val anyTypeLabel = useType(pluginContext.irBuiltIns.anyType).javaResult.id as Label<out DbReftype>
718-
TypeResult(extractBoundedWildcard(1, "@\"wildcard;\"", "?", anyTypeLabel), "?", "?")
717+
TypeResult(extractBoundedWildcard(1, "@\"wildcard;\"", "?", anyTypeLabel), null, "?")
719718
}
720719
is IrTypeProjection -> {
721720
val boundResults = useType(arg.type, false)
@@ -724,14 +723,14 @@ class X {
724723

725724
return if(arg.variance == Variance.INVARIANT)
726725
@Suppress("UNCHECKED_CAST")
727-
boundResults.javaResult as TypeResult<out DbReftype>
726+
boundResults.javaResult as TypeResult<DbReftype>
728727
else {
729728
val keyPrefix = if (arg.variance == Variance.IN_VARIANCE) "super" else "extends"
730729
val wildcardKind = if (arg.variance == Variance.IN_VARIANCE) 2 else 1
731730
val wildcardShortName = "? $keyPrefix ${boundResults.javaResult.shortName}"
732731
TypeResult(
733732
extractBoundedWildcard(wildcardKind, "@\"wildcard;$keyPrefix{$boundLabel}\"", wildcardShortName, boundLabel),
734-
"TODO",
733+
null,
735734
wildcardShortName)
736735
}
737736
}
@@ -799,7 +798,7 @@ class X {
799798
// in extractClassSource or extractFunction
800799
logger.warn(Severity.ErrorSevere, "Missing type parameter label")
801800
},
802-
param.name.asString(),
801+
useType(eraseTypeParameter(param)).javaResult.signature,
803802
param.name.asString()
804803
)
805804

@@ -828,7 +827,7 @@ class X {
828827
is IrClass -> {
829828
val classifier: IrClassifierSymbol = t.classifier
830829
val tcls: IrClass = classifier.owner as IrClass
831-
val l = useClassInstance(tcls, t.arguments).classLabel
830+
val l = useClassInstance(tcls, t.arguments).typeResult.id
832831
tw.writeExtendsReftype(id, l)
833832
}
834833
else -> {
@@ -857,7 +856,7 @@ class X {
857856
val classifier = t.classifier
858857
val owner = classifier.owner
859858
if(owner is IrTypeParameter) {
860-
return erase(owner.superTypes[0])
859+
return eraseTypeParameter(owner)
861860
}
862861

863862
// todo: fix this:
@@ -874,6 +873,9 @@ class X {
874873
return t
875874
}
876875

876+
fun eraseTypeParameter(t: IrTypeParameter) =
877+
erase(t.superTypes[0])
878+
877879
fun getValueParameterLabel(vp: IrValueParameter): String {
878880
@Suppress("UNCHECKED_CAST")
879881
val parentId: Label<out DbMethod> = useDeclarationParent(vp.parent) as Label<out DbMethod>
@@ -1062,7 +1064,7 @@ open class KotlinFileExtractor(
10621064

10631065
val parent = c.parent
10641066
if (parent is IrClass) {
1065-
val parentId = useClassInstance(parent, listOf()).classLabel
1067+
val parentId = useClassInstance(parent, listOf()).typeResult.id
10661068
tw.writeEnclInReftype(id, parentId)
10671069
if(c.isCompanion) {
10681070
// If we are a companion then our parent has a
@@ -1116,7 +1118,7 @@ open class KotlinFileExtractor(
11161118
logger.warn(Severity.ErrorSevere, "Using companion instance for non-companion class")
11171119
return null
11181120
} else {
1119-
val parentId = useClassInstance(parent, listOf()).classLabel
1121+
val parentId = useClassInstance(parent, listOf()).typeResult.id
11201122
val instanceName = c.name.asString()
11211123
val instanceLabel = "@\"field;{$parentId};$instanceName\""
11221124
val instanceId: Label<DbField> = tw.getLabelFor(instanceLabel)
@@ -1128,20 +1130,21 @@ open class KotlinFileExtractor(
11281130
if(!c.isNonCompanionObject) {
11291131
logger.warn(Severity.ErrorSevere, "Using instance for non-object class")
11301132
}
1131-
val classId = useClassInstance(c, listOf()).classLabel
1133+
val classId = useClassInstance(c, listOf()).typeResult.id
11321134
val instanceName = "INSTANCE"
11331135
val instanceLabel = "@\"field;{$classId};$instanceName\""
11341136
val instanceId: Label<DbField> = tw.getLabelFor(instanceLabel)
11351137
return FieldResult(instanceId, instanceName)
11361138
}
11371139

1138-
fun extractValueParameter(vp: IrValueParameter, parent: Label<out DbCallable>, idx: Int) {
1140+
fun extractValueParameter(vp: IrValueParameter, parent: Label<out DbCallable>, idx: Int): TypeResults {
11391141
val id = useValueParameter(vp)
11401142
val type = useType(vp.type)
11411143
val locId = tw.getLocation(vp)
11421144
tw.writeParams(id, type.javaResult.id, type.kotlinResult.id, idx, parent, id)
11431145
tw.writeHasLocation(id, locId)
11441146
tw.writeParamName(id, vp.name.asString())
1147+
return type
11451148
}
11461149

11471150
private fun extractObjectInitializerFunction(c: IrClass, parentId: Label<out DbReftype>) {
@@ -1152,9 +1155,8 @@ open class KotlinFileExtractor(
11521155
// add method:
11531156
val obinitLabel = getFunctionLabel(c, "<obinit>", listOf(), pluginContext.irBuiltIns.unitType)
11541157
val obinitId = tw.getLabelFor<DbMethod>(obinitLabel)
1155-
val signature = "TODO"
11561158
val returnType = useType(pluginContext.irBuiltIns.unitType)
1157-
tw.writeMethods(obinitId, "<obinit>", signature, returnType.javaResult.id, returnType.kotlinResult.id, parentId, obinitId)
1159+
tw.writeMethods(obinitId, "<obinit>", "<obinit>()", returnType.javaResult.id, returnType.kotlinResult.id, parentId, obinitId)
11581160

11591161
val locId = tw.getLocation(c)
11601162
tw.writeHasLocation(obinitId, locId)
@@ -1216,17 +1218,23 @@ open class KotlinFileExtractor(
12161218
f.typeParameters.map { extractTypeParameter(it) }
12171219

12181220
val locId = tw.getLocation(f)
1219-
val signature = "TODO"
12201221

1221-
val id: Label<out DbCallable>
1222+
val id = useFunction<DbCallable>(f)
1223+
val paramTypes = f.valueParameters.mapIndexed { i, vp ->
1224+
extractValueParameter(vp, id, i)
1225+
}
1226+
val paramsSignature = paramTypes.joinToString(separator = ",", prefix = "(", postfix = ")") { it.javaResult.signature!! }
1227+
12221228
if (f.symbol is IrConstructorSymbol) {
12231229
val returnType = useType(erase(f.returnType))
1224-
id = useFunction<DbConstructor>(f)
1225-
tw.writeConstrs(id, f.returnType.classFqName?.shortName()?.asString() ?: f.name.asString(), signature, returnType.javaResult.id, returnType.kotlinResult.id, parentId, id)
1230+
val shortName = f.returnType.classFqName?.shortName()?.asString() ?: f.name.asString()
1231+
@Suppress("UNCHECKED_CAST")
1232+
tw.writeConstrs(id as Label<DbConstructor>, shortName, "$shortName$paramsSignature", returnType.javaResult.id, returnType.kotlinResult.id, parentId, id)
12261233
} else {
12271234
val returnType = useType(f.returnType)
1228-
id = useFunction<DbMethod>(f)
1229-
tw.writeMethods(id, f.name.asString(), signature, returnType.javaResult.id, returnType.kotlinResult.id, parentId, id)
1235+
val shortName = f.name.asString()
1236+
@Suppress("UNCHECKED_CAST")
1237+
tw.writeMethods(id as Label<DbMethod>, shortName, "$shortName$paramsSignature", returnType.javaResult.id, returnType.kotlinResult.id, parentId, id)
12301238

12311239
val extReceiver = f.extensionReceiverParameter
12321240
if (extReceiver != null) {
@@ -1240,9 +1248,6 @@ open class KotlinFileExtractor(
12401248
if(body != null) {
12411249
extractBody(body, id)
12421250
}
1243-
f.valueParameters.forEachIndexed { i, vp ->
1244-
extractValueParameter(vp, id, i)
1245-
}
12461251

12471252
currentFunction = null
12481253
return id

java/ql/test/kotlin/library-tests/arrays/test.expected

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ cloneMethods
33
| file://:0:0:0:0 | clone | clone() | file://:0:0:0:0 | Integer[][] | file://:0:0:0:0 | Integer[][] | file://:0:0:0:0 | Kotlin nullable Array<Integer[]> |
44
| file://:0:0:0:0 | clone | clone() | file://:0:0:0:0 | int[] | file://:0:0:0:0 | int[] | file://:0:0:0:0 | Kotlin nullable IntArray |
55
| file://:0:0:0:0 | clone | clone() | file://:0:0:0:0 | int[][] | file://:0:0:0:0 | int[][] | file://:0:0:0:0 | Kotlin nullable Array<int[]> |
6+
sourceSignatures
7+
| primitiveArrays.kt:3:1:7:1 | <obinit> | <obinit>() |
8+
| primitiveArrays.kt:3:1:7:1 | Test | Test() |
9+
| primitiveArrays.kt:3:1:7:1 | equals | equals(java.lang.Object) |
10+
| primitiveArrays.kt:3:1:7:1 | hashCode | hashCode() |
11+
| primitiveArrays.kt:3:1:7:1 | toString | toString() |
12+
| primitiveArrays.kt:5:3:5:123 | test | test(java.lang.Integer[],java.lang.Integer[],int[],java.lang.Integer[][],java.lang.Integer[][],int[][]) |
613
#select
714
| primitiveArrays.kt:5:12:5:24 | a | file://:0:0:0:0 | Integer[] | Integer | Integer | file://:0:0:0:0 | Kotlin not-null Array<Integer> |
815
| primitiveArrays.kt:5:27:5:40 | b | file://:0:0:0:0 | Integer[] | Integer | Integer | file://:0:0:0:0 | Kotlin not-null Array<Integer> |

java/ql/test/kotlin/library-tests/arrays/test.ql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,7 @@ query predicate cloneMethods(Method m, string signature, Array declType, Type re
1717
returnType = m.getReturnType() and
1818
ktReturnType = m.getReturnKotlinType()
1919
}
20+
21+
query predicate sourceSignatures(Callable c, string signature) {
22+
c.getSignature() = signature and c.fromSource()
23+
}

java/ql/test/kotlin/library-tests/generics/generics.expected

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ genericType
22
| generics.kt:11:1:11:19 | C0 | generics.kt:11:15:11:15 | V | 0 |
33
| generics.kt:13:1:18:1 | C1 | generics.kt:13:10:13:10 | T | 0 |
44
| generics.kt:13:1:18:1 | C1 | generics.kt:13:13:13:13 | W | 1 |
5+
| generics.kt:36:1:40:1 | BoundedTest | generics.kt:36:19:36:34 | T | 0 |
6+
| generics.kt:36:1:40:1 | BoundedTest | generics.kt:36:37:36:41 | S | 1 |
57
parameterizedType
68
| generics.kt:11:1:11:19 | C0 | generics.kt:11:1:11:19 | C0 | 0 | V |
79
| generics.kt:11:1:11:19 | C0<?> | generics.kt:11:1:11:19 | C0 | 0 | ? |
@@ -18,6 +20,37 @@ parameterizedType
1820
| generics.kt:13:1:18:1 | C1<String,String> | generics.kt:13:1:18:1 | C1 | 1 | String |
1921
| generics.kt:13:1:18:1 | C1<U,U> | generics.kt:13:1:18:1 | C1 | 0 | U |
2022
| generics.kt:13:1:18:1 | C1<U,U> | generics.kt:13:1:18:1 | C1 | 1 | U |
23+
| generics.kt:36:1:40:1 | BoundedTest | generics.kt:36:1:40:1 | BoundedTest | 0 | T |
24+
| generics.kt:36:1:40:1 | BoundedTest | generics.kt:36:1:40:1 | BoundedTest | 1 | S |
25+
function
26+
| generics.kt:3:1:5:1 | f0 | f0(java.lang.Object) |
27+
| generics.kt:7:1:9:1 | f1 | f1(java.lang.Object) |
28+
| generics.kt:11:1:11:19 | <obinit> | <obinit>() |
29+
| generics.kt:11:6:11:19 | C0 | C0() |
30+
| generics.kt:11:6:11:19 | equals | equals(java.lang.Object) |
31+
| generics.kt:11:6:11:19 | hashCode | hashCode() |
32+
| generics.kt:11:6:11:19 | toString | toString() |
33+
| generics.kt:13:1:18:1 | <obinit> | <obinit>() |
34+
| generics.kt:13:1:18:1 | C1 | C1(java.lang.Object) |
35+
| generics.kt:13:1:18:1 | equals | equals(java.lang.Object) |
36+
| generics.kt:13:1:18:1 | hashCode | hashCode() |
37+
| generics.kt:13:1:18:1 | toString | toString() |
38+
| generics.kt:13:16:13:23 | <get-t> | <get-t>() |
39+
| generics.kt:14:5:14:19 | f1 | f1(java.lang.Object) |
40+
| generics.kt:15:5:17:5 | f2 | f2(java.lang.Object) |
41+
| generics.kt:20:1:22:1 | <obinit> | <obinit>() |
42+
| generics.kt:20:1:22:1 | C2 | C2() |
43+
| generics.kt:20:1:22:1 | equals | equals(java.lang.Object) |
44+
| generics.kt:20:1:22:1 | hashCode | hashCode() |
45+
| generics.kt:20:1:22:1 | toString | toString() |
46+
| generics.kt:21:5:21:23 | f4 | f4(java.lang.Object) |
47+
| generics.kt:24:1:34:1 | m | m() |
48+
| generics.kt:36:1:40:1 | <obinit> | <obinit>() |
49+
| generics.kt:36:1:40:1 | BoundedTest | BoundedTest() |
50+
| generics.kt:36:1:40:1 | equals | equals(java.lang.Object) |
51+
| generics.kt:36:1:40:1 | hashCode | hashCode() |
52+
| generics.kt:36:1:40:1 | toString | toString() |
53+
| generics.kt:38:5:38:25 | m | m(java.lang.CharSequence,java.lang.CharSequence) |
2154
genericFunction
2255
| generics.kt:3:1:5:1 | f0 | generics.kt:3:6:3:6 | S | 0 |
2356
| generics.kt:7:1:9:1 | f1 | generics.kt:7:6:7:6 | S | 0 |

java/ql/test/kotlin/library-tests/generics/generics.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,10 @@ fun m() {
3131
val c3 = C2()
3232
c3.f4(5)
3333
val c4: C0<*> = C0<Int>()
34-
}
34+
}
35+
36+
class BoundedTest<T : CharSequence, S : T> {
37+
38+
fun m(s: S, t: T) { }
39+
40+
}

java/ql/test/kotlin/library-tests/generics/generics.ql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ query predicate parameterizedType(ParameterizedType t, GenericType gt, int i, st
1010
t.getFile().getExtension() = "kt"
1111
}
1212

13+
query predicate function(Callable c, string signature) {
14+
signature = c.getSignature() and
15+
c.getFile().getExtension() = "kt"
16+
}
17+
1318
query predicate genericFunction(GenericCallable c, TypeVariable tv, int i) {
1419
c.getTypeParameter(i) = tv and
1520
c.getFile().getExtension() = "kt"

java/ql/test/kotlin/library-tests/methods/exprs.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
| methods2.kt:7:1:10:1 | <obinit>(...) | MethodAccess |
22
| methods3.kt:5:1:7:1 | <obinit>(...) | MethodAccess |
3+
| methods4.kt:3:1:11:1 | <obinit>(...) | MethodAccess |
4+
| methods4.kt:5:3:9:3 | <obinit>(...) | MethodAccess |
35
| methods.kt:5:1:13:1 | <obinit>(...) | MethodAccess |
46
| methods.kt:10:9:10:25 | classMethod(...) | MethodAccess |
57
| methods.kt:10:9:10:25 | this | ThisAccess |
Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,38 @@
11
methods
2-
| methods2.kt:4:1:5:1 | fooBarTopLevelMethod |
3-
| methods2.kt:7:1:10:1 | <obinit> |
4-
| methods2.kt:7:1:10:1 | equals |
5-
| methods2.kt:7:1:10:1 | hashCode |
6-
| methods2.kt:7:1:10:1 | toString |
7-
| methods2.kt:8:5:9:5 | fooBarClassMethod |
8-
| methods3.kt:3:1:3:39 | fooBarTopLevelMethod |
9-
| methods3.kt:5:1:7:1 | <obinit> |
10-
| methods3.kt:5:1:7:1 | equals |
11-
| methods3.kt:5:1:7:1 | hashCode |
12-
| methods3.kt:5:1:7:1 | toString |
13-
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod |
14-
| methods.kt:2:1:3:1 | topLevelMethod |
15-
| methods.kt:5:1:13:1 | <obinit> |
16-
| methods.kt:5:1:13:1 | equals |
17-
| methods.kt:5:1:13:1 | hashCode |
18-
| methods.kt:5:1:13:1 | toString |
19-
| methods.kt:6:5:7:5 | classMethod |
20-
| methods.kt:9:5:12:5 | anotherClassMethod |
2+
| methods2.kt:4:1:5:1 | fooBarTopLevelMethod | fooBarTopLevelMethod(int,int) |
3+
| methods2.kt:7:1:10:1 | <obinit> | <obinit>() |
4+
| methods2.kt:7:1:10:1 | equals | equals(java.lang.Object) |
5+
| methods2.kt:7:1:10:1 | hashCode | hashCode() |
6+
| methods2.kt:7:1:10:1 | toString | toString() |
7+
| methods2.kt:8:5:9:5 | fooBarClassMethod | fooBarClassMethod(int,int) |
8+
| methods3.kt:3:1:3:39 | fooBarTopLevelMethod | fooBarTopLevelMethod(int) |
9+
| methods3.kt:5:1:7:1 | <obinit> | <obinit>() |
10+
| methods3.kt:5:1:7:1 | equals | equals(java.lang.Object) |
11+
| methods3.kt:5:1:7:1 | hashCode | hashCode() |
12+
| methods3.kt:5:1:7:1 | toString | toString() |
13+
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod | fooBarTopLevelMethod(int) |
14+
| methods4.kt:3:1:11:1 | <obinit> | <obinit>() |
15+
| methods4.kt:3:1:11:1 | equals | equals(java.lang.Object) |
16+
| methods4.kt:3:1:11:1 | hashCode | hashCode() |
17+
| methods4.kt:3:1:11:1 | toString | toString() |
18+
| methods4.kt:5:3:9:3 | <obinit> | <obinit>() |
19+
| methods4.kt:5:3:9:3 | equals | equals(java.lang.Object) |
20+
| methods4.kt:5:3:9:3 | hashCode | hashCode() |
21+
| methods4.kt:5:3:9:3 | toString | toString() |
22+
| methods4.kt:7:5:7:34 | m | m(foo.bar.NestedTest.InsideNestedTest) |
23+
| methods.kt:2:1:3:1 | topLevelMethod | topLevelMethod(int,int) |
24+
| methods.kt:5:1:13:1 | <obinit> | <obinit>() |
25+
| methods.kt:5:1:13:1 | equals | equals(java.lang.Object) |
26+
| methods.kt:5:1:13:1 | hashCode | hashCode() |
27+
| methods.kt:5:1:13:1 | toString | toString() |
28+
| methods.kt:6:5:7:5 | classMethod | classMethod(int,int) |
29+
| methods.kt:9:5:12:5 | anotherClassMethod | anotherClassMethod(int,int) |
2130
constructors
22-
| methods2.kt:7:1:10:1 | Class2 |
23-
| methods3.kt:5:1:7:1 | Class3 |
24-
| methods.kt:5:1:13:1 | Class |
31+
| methods2.kt:7:1:10:1 | Class2 | Class2() |
32+
| methods3.kt:5:1:7:1 | Class3 | Class3() |
33+
| methods4.kt:3:1:11:1 | NestedTest | NestedTest() |
34+
| methods4.kt:5:3:9:3 | InsideNestedTest | InsideNestedTest() |
35+
| methods.kt:5:1:13:1 | Class | Class() |
2536
extensions
2637
| methods3.kt:3:1:3:39 | fooBarTopLevelMethod | file://:0:0:0:0 | int |
2738
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod | file://:0:0:0:0 | int |

0 commit comments

Comments
 (0)