mirror of
https://github.com/github/codeql.git
synced 2026-04-30 03:05:15 +02:00
Kotlin: Add support for interfaces
This commit is contained in:
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin.*
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
|
||||
class KotlinExtractorExtension(private val tests: List<String>) : IrGenerationExtension {
|
||||
override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) {
|
||||
@@ -315,13 +316,13 @@ class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter, val file: IrFi
|
||||
return label
|
||||
}
|
||||
|
||||
fun addClassLabel(c: IrClass): Label<out DbClass> {
|
||||
fun addClassLabel(c: IrClass): Label<out DbClassorinterface> {
|
||||
val label = getClassLabel(c)
|
||||
val id: Label<DbClass> = tw.getLabelFor(label)
|
||||
val id: Label<DbClassorinterface> = tw.getLabelFor(label)
|
||||
return id
|
||||
}
|
||||
|
||||
fun useClass(c: IrClass): Label<out DbClass> {
|
||||
fun useClass(c: IrClass): Label<out DbClassorinterface> {
|
||||
if(c.name.asString() == "Any" || c.name.asString() == "Unit") {
|
||||
if(tw.getExistingLabelFor<DbClass>(getClassLabel(c)) == null) {
|
||||
return extractClass(c)
|
||||
@@ -330,13 +331,21 @@ class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter, val file: IrFi
|
||||
return addClassLabel(c)
|
||||
}
|
||||
|
||||
fun extractClass(c: IrClass): Label<out DbClass> {
|
||||
fun extractClass(c: IrClass): Label<out DbClassorinterface> {
|
||||
val id = addClassLabel(c)
|
||||
val locId = tw.getLocation(c.startOffset, c.endOffset)
|
||||
val pkg = c.packageFqName?.asString() ?: ""
|
||||
val cls = c.name.asString()
|
||||
val pkgId = extractPackage(pkg)
|
||||
tw.writeClasses(id, cls, pkgId, id)
|
||||
if(c.kind == ClassKind.INTERFACE) {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
val interfaceId = id as Label<out DbInterface>
|
||||
tw.writeInterfaces(interfaceId, cls, pkgId, interfaceId)
|
||||
} else {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
val classId = id as Label<out DbClass>
|
||||
tw.writeClasses(classId, cls, pkgId, classId)
|
||||
}
|
||||
tw.writeHasLocation(id, locId)
|
||||
for(t in c.superTypes) {
|
||||
when(t) {
|
||||
|
||||
@@ -882,7 +882,7 @@ javadocText(
|
||||
@classorarray = @class | @array;
|
||||
@type = @primitive | @reftype;
|
||||
@callable = @method | @constructor;
|
||||
@element = @file | @package | @primitive | @class | @interface | @method | @constructor | @modifier | @param | @exception | @field |
|
||||
@element = @file | @package | @primitive | @classorinterface | @method | @constructor | @modifier | @param | @exception | @field |
|
||||
@annotation | @boundedtype | @array | @localvar | @expr | @stmt | @import | @fielddecl;
|
||||
|
||||
@modifiable = @member_modifiable| @param | @localvar ;
|
||||
@@ -891,7 +891,7 @@ javadocText(
|
||||
|
||||
@member = @method | @constructor | @field | @reftype ;
|
||||
|
||||
@locatable = @file | @class | @interface | @fielddecl | @field | @constructor | @method | @param | @exception
|
||||
@locatable = @file | @classorinterface | @fielddecl | @field | @constructor | @method | @param | @exception
|
||||
| @boundedtype | @typebound | @array | @primitive
|
||||
| @import | @stmt | @expr | @whenbranch | @localvar | @javadoc | @javadocTag | @javadocText
|
||||
| @xmllocatable;
|
||||
|
||||
@@ -5,3 +5,4 @@
|
||||
| classes.kt:8:1:10:1 | ClassThree |
|
||||
| classes.kt:12:1:15:1 | ClassFour |
|
||||
| classes.kt:17:1:18:1 | ClassFive |
|
||||
| classes.kt:28:1:29:1 | ClassSix |
|
||||
|
||||
@@ -16,3 +16,15 @@ open class ClassFour: ClassThree() {
|
||||
|
||||
class ClassFive: ClassFour() {
|
||||
}
|
||||
|
||||
interface IF1 {
|
||||
fun funIF1() {}
|
||||
}
|
||||
|
||||
interface IF2 {
|
||||
fun funIF2() {}
|
||||
}
|
||||
|
||||
class ClassSix: ClassFour(), IF1, IF2 {
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
| classes.kt:20:1:22:1 | IF1 |
|
||||
| classes.kt:24:1:26:1 | IF2 |
|
||||
5
java/ql/test/kotlin/library-tests/classes/interfaces.ql
Normal file
5
java/ql/test/kotlin/library-tests/classes/interfaces.ql
Normal file
@@ -0,0 +1,5 @@
|
||||
import java
|
||||
|
||||
from Interface i
|
||||
select i
|
||||
|
||||
@@ -4,3 +4,6 @@
|
||||
| classes.kt:8:1:10:1 | ClassThree | classes.kt:0:0:0:0 | Any |
|
||||
| classes.kt:12:1:15:1 | ClassFour | classes.kt:8:1:10:1 | ClassThree |
|
||||
| classes.kt:17:1:18:1 | ClassFive | classes.kt:12:1:15:1 | ClassFour |
|
||||
| classes.kt:28:1:29:1 | ClassSix | classes.kt:12:1:15:1 | ClassFour |
|
||||
| classes.kt:28:1:29:1 | ClassSix | classes.kt:20:1:22:1 | IF1 |
|
||||
| classes.kt:28:1:29:1 | ClassSix | classes.kt:24:1:26:1 | IF2 |
|
||||
|
||||
Reference in New Issue
Block a user