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

Skip to content

Commit 0726b64

Browse files
tamasvajkigfoo
authored andcommitted
Change location of methods inside parameterized types
1 parent 3813e6f commit 0726b64

13 files changed

Lines changed: 107 additions & 122 deletions

File tree

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
88
import org.jetbrains.kotlin.ir.declarations.*
99
import org.jetbrains.kotlin.ir.util.isFileClass
1010
import org.jetbrains.kotlin.ir.util.packageFqName
11-
import org.jetbrains.kotlin.ir.util.parentAsClass
1211
import org.jetbrains.kotlin.ir.util.parentClassOrNull
1312
import java.io.File
1413
import java.util.ArrayList
@@ -63,10 +62,7 @@ class ExternalDeclExtractor(val logger: FileLogger, val invocationTrapFile: Stri
6362
val trapFile = manager.file
6463
val trapTmpFile = File.createTempFile("${trapFile.nameWithoutExtension}.", ".${trapFile.extension}.tmp", trapFile.parentFile)
6564

66-
val containingClass = when(irDecl) {
67-
is IrClass -> irDecl
68-
else -> irDecl.parentClassOrNull
69-
}
65+
val containingClass = getContainingClassOrSelf(irDecl)
7066
if (containingClass == null) {
7167
logger.warnElement("Unable to get containing class", irDecl)
7268
return

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

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -287,14 +287,7 @@ open class KotlinFileExtractor(
287287
extractClassModifiers(c, id)
288288
extractClassSupertypes(c, id, if (argsIncludingOuterClasses == null) ExtractSupertypesMode.Raw else ExtractSupertypesMode.Specialised(argsIncludingOuterClasses))
289289

290-
val locId = if (argsIncludingOuterClasses != null && argsIncludingOuterClasses.isNotEmpty()) {
291-
val binaryPath = getIrClassBinaryPath(c)
292-
val newTrapWriter = tw.makeFileTrapWriter(binaryPath, true)
293-
newTrapWriter.getWholeFileLocation()
294-
} else {
295-
tw.getLocation(c)
296-
}
297-
290+
val locId = getLocation(c, argsIncludingOuterClasses)
298291
tw.writeHasLocation(id, locId)
299292

300293
// Extract the outer <-> inner class relationship, passing on any type arguments in excess to this class' parameters.
@@ -304,6 +297,21 @@ open class KotlinFileExtractor(
304297
}
305298
}
306299

300+
private fun getLocation(decl: IrDeclaration, typeArgs: List<IrTypeArgument>?): Label<DbLocation> {
301+
return if (typeArgs != null && typeArgs.isNotEmpty()) {
302+
val c = getContainingClassOrSelf(decl)
303+
if (c == null) {
304+
tw.getLocation(decl)
305+
} else {
306+
val binaryPath = getIrClassBinaryPath(c)
307+
val newTrapWriter = tw.makeFileTrapWriter(binaryPath, true)
308+
newTrapWriter.getWholeFileLocation()
309+
}
310+
} else {
311+
tw.getLocation(decl)
312+
}
313+
}
314+
307315
// `typeArgs` can be null to describe a raw generic type.
308316
// For non-generic types it will be zero-length list.
309317
fun extractMemberPrototypes(c: IrClass, argsIncludingOuterClasses: List<IrTypeArgument>?, id: Label<out DbClassorinterface>) {
@@ -630,8 +638,6 @@ open class KotlinFileExtractor(
630638

631639
getFunctionTypeParameters(f).mapIndexed { idx, tp -> extractTypeParameter(tp, idx) }
632640

633-
val locId = tw.getLocation(f)
634-
635641
val id =
636642
if (idOverride != null)
637643
idOverride
@@ -686,6 +692,7 @@ open class KotlinFileExtractor(
686692
tw.writeMethodsKotlinType(methodId, returnType.kotlinResult.id)
687693
}
688694

695+
val locId = getLocation(f, classTypeArgsIncludingOuterClasses)
689696
tw.writeHasLocation(id, locId)
690697
val body = f.body
691698
if (body != null && extractBody) {

java/kotlin-extractor/src/main/kotlin/utils/ClassNames.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement
88

99
import com.intellij.openapi.vfs.VirtualFile
1010
import org.jetbrains.kotlin.ir.declarations.*
11+
import org.jetbrains.kotlin.ir.util.parentClassOrNull
1112
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
1213

1314
// Adapted from Kotlin's interpreter/Utils.kt function 'internalName'
@@ -77,3 +78,10 @@ fun getIrClassBinaryPath(irClass: IrClass): String {
7778
// Otherwise, make up a fake location:
7879
?: "/!unknown-binary-location/${getIrDeclBinaryName(irClass).replace(".", "/")}.class"
7980
}
81+
82+
fun getContainingClassOrSelf(decl: IrDeclaration): IrClass? {
83+
return when(decl) {
84+
is IrClass -> decl
85+
else -> decl.parentClassOrNull
86+
}
87+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
| A.kt:4:21:4:29 | someFun(...) | A.kt:15:6:17:6 | someFun | file:///!unknown-binary-location/OC$C.class:0:0:0:0 | C<D1,D2,E1,E2> | file:///!unknown-binary-location/OC.class:0:0:0:0 | OC<F1,F2> |
1+
| A.kt:4:21:4:29 | someFun(...) | file:///!unknown-binary-location/OC$C.class:0:0:0:0 | someFun | file:///!unknown-binary-location/OC$C.class:0:0:0:0 | C<D1,D2,E1,E2> | file:///!unknown-binary-location/OC.class:0:0:0:0 | OC<F1,F2> |

java/ql/test/kotlin/library-tests/generic-inner-classes/test.expected

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,16 @@ paramTypes
3434
constructors
3535
| KotlinUser.kt:3:1:18:1 | User |
3636
| OuterGeneric.kt:3:8:21:1 | OuterGeneric |
37-
| OuterGeneric.kt:3:8:21:1 | OuterGeneric<Integer> |
3837
| OuterGeneric.kt:5:16:9:3 | InnerNotGeneric |
39-
| OuterGeneric.kt:5:16:9:3 | InnerNotGeneric<> |
4038
| OuterGeneric.kt:13:5:13:21 | InnerGeneric |
41-
| OuterGeneric.kt:13:5:13:21 | InnerGeneric<String> |
4239
| OuterGeneric.kt:15:5:15:25 | InnerGeneric |
43-
| OuterGeneric.kt:15:5:15:25 | InnerGeneric<String> |
4440
| OuterNotGeneric.kt:3:8:11:1 | OuterNotGeneric |
4541
| OuterNotGeneric.kt:5:16:9:3 | InnerGeneric |
46-
| OuterNotGeneric.kt:5:16:9:3 | InnerGeneric<String> |
42+
| file:///!unknown-binary-location/testuser/OuterGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric<String> |
43+
| file:///!unknown-binary-location/testuser/OuterGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric<String> |
44+
| file:///!unknown-binary-location/testuser/OuterGeneric$InnerNotGeneric.class:0:0:0:0 | InnerNotGeneric<> |
45+
| file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric<Integer> |
46+
| file:///!unknown-binary-location/testuser/OuterNotGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric<String> |
4747
nestedTypes
4848
| OuterGeneric.kt:5:3:9:3 | InnerNotGeneric | OuterGeneric.kt:3:1:21:1 | OuterGeneric |
4949
| OuterGeneric.kt:11:3:19:3 | InnerGeneric | OuterGeneric.kt:3:1:21:1 | OuterGeneric |
@@ -52,9 +52,9 @@ nestedTypes
5252
| file:///!unknown-binary-location/testuser/OuterGeneric$InnerNotGeneric.class:0:0:0:0 | InnerNotGeneric<> | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric<Integer> |
5353
| file:///!unknown-binary-location/testuser/OuterNotGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric<String> | OuterNotGeneric.kt:3:1:11:1 | OuterNotGeneric |
5454
#select
55-
| KotlinUser.kt:7:13:7:31 | new OuterGeneric<Integer>(...) | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric<Integer> | OuterGeneric.kt:3:8:21:1 | OuterGeneric<Integer> | KotlinUser.kt:7:13:7:31 | Integer |
56-
| KotlinUser.kt:7:33:7:61 | new InnerGeneric<String>(...) | file:///!unknown-binary-location/testuser/OuterGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric<String> | OuterGeneric.kt:15:5:15:25 | InnerGeneric<String> | KotlinUser.kt:7:33:7:61 | String |
57-
| KotlinUser.kt:8:14:8:32 | new OuterGeneric<Integer>(...) | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric<Integer> | OuterGeneric.kt:3:8:21:1 | OuterGeneric<Integer> | KotlinUser.kt:8:14:8:32 | Integer |
58-
| KotlinUser.kt:8:34:8:54 | new InnerGeneric<String>(...) | file:///!unknown-binary-location/testuser/OuterGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric<String> | OuterGeneric.kt:15:5:15:25 | InnerGeneric<String> | KotlinUser.kt:8:34:8:54 | String |
59-
| KotlinUser.kt:9:13:9:31 | new OuterGeneric<Integer>(...) | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric<Integer> | OuterGeneric.kt:3:8:21:1 | OuterGeneric<Integer> | KotlinUser.kt:9:13:9:31 | Integer |
60-
| KotlinUser.kt:10:31:10:52 | new InnerGeneric<String>(...) | file:///!unknown-binary-location/testuser/OuterNotGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric<String> | OuterNotGeneric.kt:5:16:9:3 | InnerGeneric<String> | KotlinUser.kt:10:31:10:52 | String |
55+
| KotlinUser.kt:7:13:7:31 | new OuterGeneric<Integer>(...) | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric<Integer> | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric<Integer> | KotlinUser.kt:7:13:7:31 | Integer |
56+
| KotlinUser.kt:7:33:7:61 | new InnerGeneric<String>(...) | file:///!unknown-binary-location/testuser/OuterGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric<String> | file:///!unknown-binary-location/testuser/OuterGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric<String> | KotlinUser.kt:7:33:7:61 | String |
57+
| KotlinUser.kt:8:14:8:32 | new OuterGeneric<Integer>(...) | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric<Integer> | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric<Integer> | KotlinUser.kt:8:14:8:32 | Integer |
58+
| KotlinUser.kt:8:34:8:54 | new InnerGeneric<String>(...) | file:///!unknown-binary-location/testuser/OuterGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric<String> | file:///!unknown-binary-location/testuser/OuterGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric<String> | KotlinUser.kt:8:34:8:54 | String |
59+
| KotlinUser.kt:9:13:9:31 | new OuterGeneric<Integer>(...) | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric<Integer> | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric<Integer> | KotlinUser.kt:9:13:9:31 | Integer |
60+
| KotlinUser.kt:10:31:10:52 | new InnerGeneric<String>(...) | file:///!unknown-binary-location/testuser/OuterNotGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric<String> | file:///!unknown-binary-location/testuser/OuterNotGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric<String> | KotlinUser.kt:10:31:10:52 | String |

0 commit comments

Comments
 (0)