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

Skip to content

Commit 1a6d693

Browse files
tamasvajkigfoo
authored andcommitted
Implement review findings + fix ID of nested types
1 parent 85e713f commit 1a6d693

3 files changed

Lines changed: 63 additions & 27 deletions

File tree

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

Lines changed: 53 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
1313
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
1414
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
1515
import org.jetbrains.kotlin.ir.types.*
16-
import org.jetbrains.kotlin.ir.util.dumpKotlinLike
1716
import org.jetbrains.kotlin.ir.util.packageFqName
18-
import org.jetbrains.kotlin.ir.util.parentAsClass
1917
import org.jetbrains.kotlin.ir.util.render
2018
import java.io.File
2119
import java.io.FileOutputStream
@@ -221,7 +219,7 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
221219

222220
fun extractDeclaration(declaration: IrDeclaration) {
223221
when (declaration) {
224-
is IrClass -> useClass(declaration, listOf())
222+
is IrClass -> extractClass(declaration, listOf())
225223
is IrFunction -> extractFunction(declaration)
226224
is IrAnonymousInitializer -> {
227225
// Leaving this intentionally empty. init blocks are extracted during class extraction.
@@ -321,7 +319,19 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
321319

322320
fun useTypeParameter(param: IrTypeParameter): Label<out DbTypevariable> {
323321
val l = getTypeParameterLabel(param)
324-
return tw.getExistingLabelFor(l) ?: extractTypeParameter(param)
322+
val label = tw.getExistingLabelFor<DbTypevariable>(l)
323+
if (label != null) {
324+
return label
325+
}
326+
327+
// todo: fix this
328+
if (param.origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB ||
329+
param.origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB){
330+
return extractTypeParameter(param)
331+
}
332+
333+
logger.warnElement(Severity.ErrorSevere, "Missing type parameter label", param)
334+
return tw.getLabelFor(l)
325335
}
326336

327337
private fun extractTypeParameter(tp: IrTypeParameter): Label<out DbTypevariable> {
@@ -348,14 +358,21 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
348358
private fun getClassLabel(c: IrClass, typeArgs: List<IrTypeArgument>): String {
349359
val pkg = c.packageFqName?.asString() ?: ""
350360
val cls = c.name.asString()
351-
val qualClassName = if (pkg.isEmpty()) cls else "$pkg.$cls"
352-
var label = "@\"class;$qualClassName"
361+
var label: String
362+
val parent = c.parent
363+
if (parent is IrClass) {
364+
// todo: fix this. Ugly string concat to handle nested class IDs.
365+
// todo: Can the containing class have type arguments?
366+
val p = getClassLabel(parent, listOf())
367+
label = "${p.substring(0, p.length - 1)}\$$cls"
368+
} else {
369+
val qualClassName = if (pkg.isEmpty()) cls else "$pkg.$cls"
370+
label = "@\"class;$qualClassName"
371+
}
353372

354-
if (typeArgs.isNotEmpty()) {
355-
for (arg in typeArgs) {
356-
val argId = getTypeArgumentLabel(arg, c)
357-
label += ";{$argId}"
358-
}
373+
for (arg in typeArgs) {
374+
val argId = getTypeArgumentLabel(arg, c)
375+
label += ";{$argId}"
359376
}
360377

361378
label += "\""
@@ -403,7 +420,23 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
403420
}
404421

405422
val classId = getClassLabel(c, args)
406-
return tw.getExistingLabelFor<DbClass>(classId) ?: extractClass(c, args)
423+
val label = tw.getExistingLabelFor<DbClass>(classId)
424+
if (label != null) {
425+
return label
426+
}
427+
428+
if (typeArgs.isNotEmpty()) {
429+
return extractClass(c, typeArgs)
430+
}
431+
432+
// todo: fix this
433+
if (c.origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB ||
434+
c.origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB){
435+
return extractClass(c, listOf())
436+
}
437+
438+
logger.warnElement(Severity.ErrorSevere, "Missing class label", c)
439+
return tw.getLabelFor(classId)
407440
}
408441

409442
private fun typeArgsMatchTypeParameters(typeArgs: List<IrTypeArgument>, typeParameters: List<IrTypeParameter>): Boolean {
@@ -437,6 +470,11 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
437470
}
438471
val locId = tw.getLocation(c)
439472
tw.writeHasLocation(id, locId)
473+
474+
if (typeArgs.isEmpty()) {
475+
c.typeParameters.map { extractTypeParameter(it) }
476+
}
477+
440478
for(t in c.superTypes) {
441479
when(t) {
442480
is IrSimpleType -> {
@@ -465,8 +503,6 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
465503
val unbound = useClass(c, listOf())
466504
tw.writeErasure(id, unbound)
467505
} else {
468-
c.typeParameters.map { extractTypeParameter(it) }
469-
470506
c.declarations.map { extractDeclaration(it) }
471507

472508
extractObjectInitializerFunction(c, id)
@@ -650,6 +686,8 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
650686
fun extractFunction(f: IrFunction) {
651687
currentFunction = f
652688

689+
f.typeParameters.map { extractTypeParameter(it) }
690+
653691
val locId = tw.getLocation(f)
654692
val signature = "TODO"
655693
val returnTypeId = useType(f.returnType)
@@ -680,8 +718,6 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
680718
extractValueParameter(vp, id, i)
681719
}
682720

683-
f.typeParameters.map { extractTypeParameter(it) }
684-
685721
currentFunction = null
686722
}
687723

@@ -882,7 +918,7 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
882918
) {
883919
for (argIdx in 0 until c.typeArgumentsCount) {
884920
val arg = c.getTypeArgument(argIdx)!!
885-
val argTypeId = useType(arg)
921+
val argTypeId = useType(arg, false)
886922
val argId = tw.getFreshIdLabel<DbUnannotatedtypeaccess>()
887923
val mul = if (reverse) -1 else 1
888924
tw.writeExprs_unannotatedtypeaccess(argId, argTypeId, id, argIdx * mul + startIndex)

java/ql/lib/semmle/code/java/Generics.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ class GenericCall extends Call {
475475
result.(Wildcard).getUpperBound().getType() = v.getUpperBoundType()
476476
}
477477

478-
private Type getAnExplicitTypeArgument(TypeVariable v) {
478+
private RefType getAnExplicitTypeArgument(TypeVariable v) {
479479
exists(GenericCallable gen, MethodAccess call, int i |
480480
this = call and
481481
gen = call.getCallee() and
@@ -485,7 +485,7 @@ class GenericCall extends Call {
485485
}
486486

487487
/** Gets a type argument of the call for the given `TypeVariable`. */
488-
Type getATypeArgument(TypeVariable v) {
488+
RefType getATypeArgument(TypeVariable v) {
489489
result = getAnExplicitTypeArgument(v)
490490
or
491491
not exists(this.getAnExplicitTypeArgument(v)) and

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@ genericFunction
2424
| generics.kt:15:5:17:5 | f2 | generics.kt:15:10:15:10 | U | 0 |
2525
| generics.kt:21:5:21:23 | f4 | generics.kt:21:10:21:10 | P | 0 |
2626
genericCall
27-
| generics.kt:27:17:27:22 | f2(...) | generics.kt:15:10:15:10 | U | file://:0:0:0:0 | string |
28-
| generics.kt:30:17:30:21 | f2(...) | generics.kt:15:10:15:10 | U | file://:0:0:0:0 | int |
29-
| generics.kt:32:8:32:12 | f4(...) | generics.kt:21:10:21:10 | P | file://:0:0:0:0 | int |
27+
| generics.kt:27:17:27:22 | f2(...) | generics.kt:15:10:15:10 | U | file://:0:0:0:0 | String |
28+
| generics.kt:30:17:30:21 | f2(...) | generics.kt:15:10:15:10 | U | file://:0:0:0:0 | Int |
29+
| generics.kt:32:8:32:12 | f4(...) | generics.kt:21:10:21:10 | P | file://:0:0:0:0 | Int |
3030
genericCtor
3131
| generics.kt:16:16:16:26 | new C1(...) | 0 | generics.kt:15:10:15:10 | U |
3232
| generics.kt:16:16:16:26 | new C1(...) | 1 | generics.kt:15:10:15:10 | U |
33-
| generics.kt:25:14:25:28 | new C1(...) | 0 | file://:0:0:0:0 | int |
34-
| generics.kt:25:14:25:28 | new C1(...) | 1 | file://:0:0:0:0 | int |
35-
| generics.kt:28:14:28:32 | new C1(...) | 0 | file://:0:0:0:0 | string |
36-
| generics.kt:28:14:28:32 | new C1(...) | 1 | file://:0:0:0:0 | int |
37-
| generics.kt:33:21:33:29 | new C0(...) | 0 | file://:0:0:0:0 | int |
33+
| generics.kt:25:14:25:28 | new C1(...) | 0 | file://:0:0:0:0 | Int |
34+
| generics.kt:25:14:25:28 | new C1(...) | 1 | file://:0:0:0:0 | Int |
35+
| generics.kt:28:14:28:32 | new C1(...) | 0 | file://:0:0:0:0 | String |
36+
| generics.kt:28:14:28:32 | new C1(...) | 1 | file://:0:0:0:0 | Int |
37+
| generics.kt:33:21:33:29 | new C0(...) | 0 | file://:0:0:0:0 | Int |

0 commit comments

Comments
 (0)