Skip to content

Commit

Permalink
define transformations
Browse files Browse the repository at this point in the history
  • Loading branch information
ftomassetti committed May 30, 2023
1 parent 310c065 commit 79f9c1f
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 6 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,4 @@ generated-test-src
/*.json
/*.xmi
**/bin/
.netlify
Original file line number Diff line number Diff line change
Expand Up @@ -235,9 +235,9 @@ open class ASTTransformer(
* Performs the transformation of a node and, recursively, its descendants.
*/
@JvmOverloads
open fun transform(source: Any?, parent: Node? = null): Node? {
open fun transform(source: Any?, parent: Node? = null): List<Node> {
if (source == null) {
return null
return emptyList()
}
if (source is Collection<*>) {
throw Error("Mapping error: received collection when value was expected")
Expand All @@ -247,7 +247,7 @@ open class ASTTransformer(
if (factory != null) {
node = makeNode(factory, source, allowGenericNode = allowGenericNode)
if (node == null) {
return null
return emptyList()
}
if (!factory.skipChildren && !factory.childrenSetAtConstruction) {
setChildren(factory, source, node)
Expand All @@ -269,7 +269,7 @@ open class ASTTransformer(
throw IllegalStateException("Unable to translate node $source (class ${source.javaClass})")
}
}
return node
return listOf(node)
}

private fun setChildren(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ class ASTTransformerTest {
DisplayIntStatement(value = 456)
)
)
val transformedCU = transformer.transform(cu)!!
val transformedCU = transformer.transform(cu)!!.first()
assertASTsAreEqual(cu, transformedCU, considerPosition = true)
assertTrue { transformedCU.hasValidParents() }
assertEquals(transformedCU.origin, cu)
Expand Down Expand Up @@ -280,4 +280,37 @@ class ASTTransformerTest {
assertEquals(transformedCU.origin, cu)
assertIs<GenericNode>(transformedCU.statements[0].origin)
}

@Test
fun testTransforingOneNodeToMany() {
val transformer = ASTTransformer()
transformer.registerNodeFactory(BarRoot::class, BazRoot::class)
.withChild(BarRoot::stmts, BazRoot::stmts)
transformer.registerNodeFactory(BarStmt::class) { s ->
listOf(BazStmt("${s.desc}-1"), BazStmt("${s.desc}-2"))
}

val original = BarRoot(
stmts = mutableListOf(
BarStmt("a"),
BarStmt("b")
)
)
val transformed = transformer.transform(original) as BazRoot
assertTrue { transformed.hasValidParents() }
assertEquals(transformed.origin, original)
assertASTsAreEqual(BazRoot(mutableListOf(
BazStmt("a-1"),
BazStmt("a-2"),
BazStmt("b-1"),
BazStmt("b-2")
)))
}
}

data class BazRoot(var stmts: MutableList<BazStmt> = mutableListOf()) : Node()

data class BazStmt(val desc: String) : Node()

data class BarRoot(var stmts: MutableList<BarStmt> = mutableListOf()) : Node()
data class BarStmt(val desc: String) : Node()
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
version=1.5.16-SNAPSHOT
kotlin_version=1.8.10
kotlin_version=1.8.21
dokka_version=1.8.10
antlr_version=4.9.3
clikt_version=3.5.0
Expand Down

0 comments on commit 79f9c1f

Please sign in to comment.