Skip to content

Commit 5423c06

Browse files
committed
Introducing the LionWebPartition annotation
1 parent af02398 commit 5423c06

File tree

3 files changed

+111
-0
lines changed

3 files changed

+111
-0
lines changed

lionweb/src/main/kotlin/com/strumenta/kolasu/lionweb/LionWebLanguageConverter.kt

+2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import io.lionweb.lioncore.java.language.Property
2222
import kotlin.reflect.KClass
2323
import kotlin.reflect.KType
2424
import kotlin.reflect.full.createType
25+
import kotlin.reflect.full.findAnnotations
2526

2627
/**
2728
* This class is able to convert between Kolasu and LionWeb languages, tracking the mapping.
@@ -59,6 +60,7 @@ class LionWebLanguageConverter {
5960
kolasuLanguage.astClasses.forEach { astClass ->
6061
if (astClass.isConcept) {
6162
val concept = Concept(lionwebLanguage, astClass.simpleName)
63+
concept.isPartition = astClass.findAnnotations(LionWebPartition::class).isNotEmpty()
6264
concept.key = lionwebLanguage.key + "_" + concept.name
6365
concept.id = lionwebLanguage.id + "_" + concept.name
6466
concept.isAbstract = astClass.isAbstract || astClass.isSealed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.strumenta.kolasu.lionweb
2+
3+
/**
4+
* This is used to include node classes corresponding to LionWeb Partition Concepts.
5+
*/
6+
@Target(AnnotationTarget.CLASS)
7+
@Retention(AnnotationRetention.RUNTIME)
8+
annotation class LionWebPartition

lionweb/src/test/kotlin/com/strumenta/kolasu/lionweb/LionWebLanguageConverterTest.kt

+101
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ data class SimpleNodeA(
2222
val child: SimpleNodeB?
2323
) : Named, SimpleDecl(), MyRelevantInterface, MyIrrelevantInterface
2424

25+
@LionWebPartition
26+
data class MyPartition(val roots: MutableList<SimpleRoot>) : Node()
27+
2528
interface MyIrrelevantInterface
2629

2730
@NodeType
@@ -116,6 +119,104 @@ class LionWebLanguageConverterTest {
116119
assertEquals(true, validationResult.isSuccessful, validationResult.issues.toString())
117120
}
118121

122+
@Test
123+
fun exportSimpleLanguageWithPartitions() {
124+
val kLanguage = KolasuLanguage("com.strumenta.SimpleLang").apply {
125+
addClass(SimpleRoot::class)
126+
addClass(MyPartition::class)
127+
}
128+
assertEquals(6, kLanguage.astClasses.size)
129+
val lwLanguage = LionWebLanguageConverter().exportToLionWeb(kLanguage)
130+
assertEquals("1", lwLanguage.version)
131+
assertEquals(6, lwLanguage.elements.size)
132+
133+
val myPartition = lwLanguage.getConceptByName("MyPartition")!!
134+
val simpleRoot = lwLanguage.getConceptByName("SimpleRoot")!!
135+
val simpleDecl = lwLanguage.getConceptByName("SimpleDecl")!!
136+
val simpleNodeA = lwLanguage.getConceptByName("SimpleNodeA")!!
137+
val simpleNodeB = lwLanguage.getConceptByName("SimpleNodeB")!!
138+
val myRelevantInterface = lwLanguage.getInterfaceByName("MyRelevantInterface")!!
139+
assertNull(lwLanguage.getInterfaceByName("MyIrrelevantInterface"))
140+
141+
assertEquals("MyPartition", myPartition.name)
142+
assertEquals(true, myPartition.isPartition)
143+
assertSame(lwLanguage, myPartition.language)
144+
assertEquals(StarLasuLWLanguage.ASTNode, simpleRoot.extendedConcept)
145+
assertEquals(emptyList(), simpleRoot.implemented)
146+
assertEquals(false, simpleRoot.isAbstract)
147+
assertEquals(2, simpleRoot.features.size)
148+
assertEquals(2, simpleRoot.allFeatures().size)
149+
150+
assertEquals("SimpleRoot", simpleRoot.name)
151+
assertEquals(false, simpleRoot.isPartition)
152+
assertSame(lwLanguage, simpleRoot.language)
153+
assertEquals(StarLasuLWLanguage.ASTNode, simpleRoot.extendedConcept)
154+
assertEquals(emptyList(), simpleRoot.implemented)
155+
assertEquals(false, simpleRoot.isAbstract)
156+
assertEquals(2, simpleRoot.features.size)
157+
assertEquals(2, simpleRoot.allFeatures().size)
158+
159+
val simpleRootID = simpleRoot.getPropertyByName("id")!!
160+
assertEquals("id", simpleRootID.name)
161+
assertEquals(false, simpleRootID.isOptional)
162+
assertEquals(LionCoreBuiltins.getInteger(), simpleRootID.type)
163+
164+
val simpleRootChildren = simpleRoot.getContainmentByName("childrez")!!
165+
assertEquals("childrez", simpleRootChildren.name)
166+
assertEquals(true, simpleRootChildren.isOptional)
167+
assertEquals(true, simpleRootChildren.isMultiple)
168+
assertEquals(simpleDecl, simpleRootChildren.type)
169+
170+
assertEquals("SimpleDecl", simpleDecl.name)
171+
assertEquals(false, simpleDecl.isPartition)
172+
assertSame(lwLanguage, simpleDecl.language)
173+
assertEquals(StarLasuLWLanguage.ASTNode, simpleDecl.extendedConcept)
174+
assertEquals(emptyList(), simpleRoot.implemented)
175+
assertEquals(true, simpleDecl.isAbstract)
176+
177+
assertEquals("SimpleNodeA", simpleNodeA.name)
178+
assertEquals(false, simpleNodeA.isPartition)
179+
assertSame(lwLanguage, simpleNodeA.language)
180+
assertEquals(simpleDecl, simpleNodeA.extendedConcept)
181+
assertEquals(listOf(LionCoreBuiltins.getINamed(), myRelevantInterface), simpleNodeA.implemented)
182+
assertEquals(false, simpleNodeA.isAbstract)
183+
assertEquals(2, simpleNodeA.features.size)
184+
assertEquals(3, simpleNodeA.allFeatures().size)
185+
186+
assertEquals(
187+
true,
188+
LionCoreBuiltins.getINamed().getPropertyByName("name") in simpleNodeA.allFeatures()
189+
)
190+
191+
val simpleNodeARef = simpleNodeA.getReferenceByName("ref")!!
192+
assertEquals("ref", simpleNodeARef.name)
193+
assertEquals(false, simpleNodeARef.isOptional)
194+
assertEquals(false, simpleNodeARef.isMultiple)
195+
assertEquals(simpleNodeA, simpleNodeARef.type)
196+
197+
val simpleNodeAChild = simpleNodeA.getContainmentByName("child")!!
198+
assertEquals("child", simpleNodeAChild.name)
199+
assertEquals(true, simpleNodeAChild.isOptional)
200+
assertEquals(false, simpleNodeAChild.isMultiple)
201+
assertEquals(simpleNodeB, simpleNodeAChild.type)
202+
203+
assertEquals("SimpleNodeB", simpleNodeB.name)
204+
assertEquals(false, simpleNodeB.isPartition)
205+
assertSame(lwLanguage, simpleNodeB.language)
206+
assertEquals(simpleDecl, simpleNodeB.extendedConcept)
207+
assertEquals(false, simpleNodeB.isAbstract)
208+
assertEquals(1, simpleNodeB.features.size)
209+
assertEquals(1, simpleNodeB.allFeatures().size)
210+
211+
val simpleNodeBValue = simpleNodeB.getPropertyByName("value")!!
212+
assertEquals("value", simpleNodeBValue.name)
213+
assertEquals(false, simpleNodeBValue.isOptional)
214+
assertEquals(LionCoreBuiltins.getString(), simpleNodeBValue.type)
215+
216+
val validationResult = LanguageValidator().validate(lwLanguage)
217+
assertEquals(true, validationResult.isSuccessful, validationResult.issues.toString())
218+
}
219+
119220
@Test(expected = RuntimeException::class)
120221
fun conversionOfNullableContainmentListIsForbidden() {
121222
val kLanguage = KolasuLanguage("com.strumenta.SimpleLang").apply {

0 commit comments

Comments
 (0)