Skip to content

Commit bfdca11

Browse files
authored
Merge pull request #5 from github/igfoo/interfaces
Kotlin: Add support for interfaces
2 parents cf7f03e + 0a617c1 commit bfdca11

File tree

7 files changed

+39
-7
lines changed

7 files changed

+39
-7
lines changed

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

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.ir.expressions.*
2525
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin.*
2626
import org.jetbrains.kotlin.ir.IrStatement
2727
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
28+
import org.jetbrains.kotlin.descriptors.ClassKind
2829

2930
class KotlinExtractorExtension(private val tests: List<String>) : IrGenerationExtension {
3031
override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) {
@@ -315,13 +316,13 @@ class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter, val file: IrFi
315316
return label
316317
}
317318

318-
fun addClassLabel(c: IrClass): Label<out DbClass> {
319+
fun addClassLabel(c: IrClass): Label<out DbClassorinterface> {
319320
val label = getClassLabel(c)
320-
val id: Label<DbClass> = tw.getLabelFor(label)
321+
val id: Label<DbClassorinterface> = tw.getLabelFor(label)
321322
return id
322323
}
323324

324-
fun useClass(c: IrClass): Label<out DbClass> {
325+
fun useClass(c: IrClass): Label<out DbClassorinterface> {
325326
if(c.name.asString() == "Any" || c.name.asString() == "Unit") {
326327
if(tw.getExistingLabelFor<DbClass>(getClassLabel(c)) == null) {
327328
return extractClass(c)
@@ -330,13 +331,21 @@ class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter, val file: IrFi
330331
return addClassLabel(c)
331332
}
332333

333-
fun extractClass(c: IrClass): Label<out DbClass> {
334+
fun extractClass(c: IrClass): Label<out DbClassorinterface> {
334335
val id = addClassLabel(c)
335336
val locId = tw.getLocation(c.startOffset, c.endOffset)
336337
val pkg = c.packageFqName?.asString() ?: ""
337338
val cls = c.name.asString()
338339
val pkgId = extractPackage(pkg)
339-
tw.writeClasses(id, cls, pkgId, id)
340+
if(c.kind == ClassKind.INTERFACE) {
341+
@Suppress("UNCHECKED_CAST")
342+
val interfaceId = id as Label<out DbInterface>
343+
tw.writeInterfaces(interfaceId, cls, pkgId, interfaceId)
344+
} else {
345+
@Suppress("UNCHECKED_CAST")
346+
val classId = id as Label<out DbClass>
347+
tw.writeClasses(classId, cls, pkgId, classId)
348+
}
340349
tw.writeHasLocation(id, locId)
341350
for(t in c.superTypes) {
342351
when(t) {

java/ql/lib/config/semmlecode.dbscheme

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -885,7 +885,7 @@ javadocText(
885885
@classorarray = @class | @array;
886886
@type = @primitive | @reftype;
887887
@callable = @method | @constructor;
888-
@element = @file | @package | @primitive | @class | @interface | @method | @constructor | @modifier | @param | @exception | @field |
888+
@element = @file | @package | @primitive | @classorinterface | @method | @constructor | @modifier | @param | @exception | @field |
889889
@annotation | @boundedtype | @array | @localvar | @expr | @stmt | @import | @fielddecl;
890890

891891
@modifiable = @member_modifiable| @param | @localvar ;
@@ -894,7 +894,7 @@ javadocText(
894894

895895
@member = @method | @constructor | @field | @reftype ;
896896

897-
@locatable = @file | @class | @interface | @fielddecl | @field | @constructor | @method | @param | @exception
897+
@locatable = @file | @classorinterface | @fielddecl | @field | @constructor | @method | @param | @exception
898898
| @boundedtype | @typebound | @array | @primitive
899899
| @import | @stmt | @expr | @whenbranch | @localvar | @javadoc | @javadocTag | @javadocText
900900
| @xmllocatable;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
| classes.kt:8:1:10:1 | ClassThree |
66
| classes.kt:12:1:15:1 | ClassFour |
77
| classes.kt:17:1:18:1 | ClassFive |
8+
| classes.kt:28:1:29:1 | ClassSix |

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,15 @@ open class ClassFour: ClassThree() {
1616

1717
class ClassFive: ClassFour() {
1818
}
19+
20+
interface IF1 {
21+
fun funIF1() {}
22+
}
23+
24+
interface IF2 {
25+
fun funIF2() {}
26+
}
27+
28+
class ClassSix: ClassFour(), IF1, IF2 {
29+
}
30+
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
| classes.kt:20:1:22:1 | IF1 |
2+
| classes.kt:24:1:26:1 | IF2 |
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import java
2+
3+
from Interface i
4+
select i
5+

java/ql/test/kotlin/library-tests/classes/superTypes.expected

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,6 @@
44
| classes.kt:8:1:10:1 | ClassThree | classes.kt:0:0:0:0 | Any |
55
| classes.kt:12:1:15:1 | ClassFour | classes.kt:8:1:10:1 | ClassThree |
66
| classes.kt:17:1:18:1 | ClassFive | classes.kt:12:1:15:1 | ClassFour |
7+
| classes.kt:28:1:29:1 | ClassSix | classes.kt:12:1:15:1 | ClassFour |
8+
| classes.kt:28:1:29:1 | ClassSix | classes.kt:20:1:22:1 | IF1 |
9+
| classes.kt:28:1:29:1 | ClassSix | classes.kt:24:1:26:1 | IF2 |

0 commit comments

Comments
 (0)