Kotlin: Add support for interfaces

This commit is contained in:
Ian Lynagh
2021-09-02 16:12:28 +01:00
parent 14e970044a
commit 486cff5df1
7 changed files with 39 additions and 7 deletions

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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 |

View File

@@ -16,3 +16,15 @@ open class ClassFour: ClassThree() {
class ClassFive: ClassFour() {
}
interface IF1 {
fun funIF1() {}
}
interface IF2 {
fun funIF2() {}
}
class ClassSix: ClassFour(), IF1, IF2 {
}

View File

@@ -0,0 +1,2 @@
| classes.kt:20:1:22:1 | IF1 |
| classes.kt:24:1:26:1 | IF2 |

View File

@@ -0,0 +1,5 @@
import java
from Interface i
select i

View File

@@ -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 |