Skip to content

Commit bdc82de

Browse files
committed
Working on supporting BaseNode in compiler plugin
1 parent 6e98d37 commit bdc82de

File tree

5 files changed

+53
-20
lines changed

5 files changed

+53
-20
lines changed

ast/src/commonMain/kotlin/com/strumenta/kolasu/model/BaseNode.kt

+17-5
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ abstract class BaseNode : NodeLike {
3333
TODO("Not yet implemented")
3434
}
3535

36-
override fun <T : NodeLike> addToContainment(containmentName: String, child: T) {
36+
override fun <T : NodeLike> addToContainment(
37+
containmentName: String,
38+
child: T,
39+
) {
3740
TODO("Not yet implemented")
3841
}
3942

@@ -65,19 +68,28 @@ abstract class BaseNode : NodeLike {
6568
TODO("Not yet implemented")
6669
}
6770

68-
override fun <T : NodeLike> removeFromContainment(containmentName: String, child: T) {
71+
override fun <T : NodeLike> removeFromContainment(
72+
containmentName: String,
73+
child: T,
74+
) {
6975
TODO("Not yet implemented")
7076
}
7177

72-
override fun <T> setAttribute(attributeName: String, value: T) {
78+
override fun <T> setAttribute(
79+
attributeName: String,
80+
value: T,
81+
) {
7382
TODO("Not yet implemented")
7483
}
7584

76-
override fun <T : PossiblyNamed> setReferenceReferred(referenceName: String, referred: T) {
85+
override fun <T : PossiblyNamed> setReferenceReferred(
86+
referenceName: String,
87+
referred: T,
88+
) {
7789
TODO("Not yet implemented")
7890
}
7991

8092
override fun subscribe(observer: ObservableObserver<NodeNotification<in NodeLike>>) {
8193
TODO("Not yet implemented")
8294
}
83-
}
95+
}

ast/src/commonMain/kotlin/com/strumenta/kolasu/model/FeatureDescription.kt

+4-5
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,18 @@ data class FeatureDescription(
44
val name: String,
55
val provideNodes: Boolean,
66
val multiplicity: Multiplicity,
7-
val valueProvider: ()->Any?,
7+
val valueProvider: () -> Any?,
88
val featureType: FeatureType,
9-
val derived: Boolean = false
9+
val derived: Boolean = false,
1010
) {
1111
constructor(
1212
name: String,
1313
provideNodes: Boolean,
1414
multiplicity: Multiplicity,
1515
value: Any?,
1616
featureType: FeatureType,
17-
derived: Boolean = false
18-
) : this(name, provideNodes, multiplicity, {value}, featureType, derived)
17+
derived: Boolean = false,
18+
) : this(name, provideNodes, multiplicity, { value }, featureType, derived)
1919

2020
val isMultiple: Boolean
2121
get() = multiplicity == Multiplicity.MANY
@@ -25,5 +25,4 @@ data class FeatureDescription(
2525

2626
val value: Any?
2727
get() = valueProvider.invoke()
28-
2928
}

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
version=1.6.0-RC1-SNAPSHOT
2-
kotlinVersion=2.0.0-Beta2
2+
kotlinVersion=2.0.0-Beta3
33
dokkaVersion=1.9.10
44
antlr_version=4.9.3
55
clikt_version=3.5.2

kotlin-ir-plugin/src/main/kotlin/com/strumenta/kolasu/kcp/StarLasuComponentRegistrar.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter
1515
@AutoService(CompilerPluginRegistrar::class)
1616
class StarLasuComponentRegistrar : CompilerPluginRegistrar() {
1717
override val supportsK2: Boolean
18-
get() = false
18+
get() = true
1919

2020
override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) {
2121
val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE)

kotlin-ir-plugin/src/main/kotlin/com/strumenta/kolasu/kcp/StarLasuIrGenerationExtension.kt

+30-8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
package com.strumenta.kolasu.kcp
44

5+
import com.strumenta.kolasu.model.BaseNode
56
import com.strumenta.kolasu.model.Node
67
import org.jetbrains.kotlin.backend.common.extensions.FirIncompatiblePluginAPI
78
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
@@ -21,6 +22,7 @@ class StarLasuIrGenerationExtension(
2122
private fun checkASTNode(
2223
irClass: IrClass,
2324
pluginContext: IrPluginContext,
25+
isBaseNode: Boolean,
2426
) {
2527
irClass.primaryConstructor?.valueParameters?.forEach { param ->
2628
if (param.isVal() && (param.isSingleContainment() || param.isSingleAttribute())) {
@@ -33,25 +35,45 @@ class StarLasuIrGenerationExtension(
3335
}
3436
irClass.accept(FieldObservableExtension(pluginContext), null)
3537
irClass.accept(SettingParentExtension(pluginContext, messageCollector), null)
38+
if (isBaseNode) {
39+
// override val properties: List<FeatureDescription>
40+
// get() = TODO("Not yet implemented")
41+
}
3642
}
3743

3844
override fun generate(
3945
moduleFragment: IrModuleFragment,
4046
pluginContext: IrPluginContext,
4147
) {
48+
messageCollector.report(
49+
CompilerMessageSeverity.WARNING,
50+
"COMPILER PLUGIN IS GENERATING",
51+
)
4252
moduleFragment.files.forEach { irFile ->
43-
irFile.declarations.filterIsInstance(IrClass::class.java).forEach { irClass ->
53+
irFile.declarations.filterIsInstance<IrClass>().forEach { irClass ->
4454
val isASTNode =
4555
irClass.getAllSuperclasses().any {
4656
it.kotlinFqName.toString() == Node::class.qualifiedName
4757
}
48-
if (isASTNode) {
49-
messageCollector.report(
50-
CompilerMessageSeverity.INFO,
51-
"AST class ${irClass.kotlinFqName} identified",
52-
irClass.compilerSourceLocation,
53-
)
54-
checkASTNode(irClass, pluginContext)
58+
val isBaseNode =
59+
irClass.getAllSuperclasses().any {
60+
it.kotlinFqName.toString() == BaseNode::class.qualifiedName
61+
}
62+
if (isASTNode || isBaseNode) {
63+
if (isASTNode) {
64+
messageCollector.report(
65+
CompilerMessageSeverity.INFO,
66+
"AST class ${irClass.kotlinFqName} identified",
67+
irClass.compilerSourceLocation,
68+
)
69+
} else {
70+
messageCollector.report(
71+
CompilerMessageSeverity.INFO,
72+
"BaseNode subclass ${irClass.kotlinFqName} identified",
73+
irClass.compilerSourceLocation,
74+
)
75+
}
76+
checkASTNode(irClass, pluginContext, isBaseNode)
5577
}
5678
}
5779
}

0 commit comments

Comments
 (0)