Skip to content

Commit f2f6899

Browse files
committed
feat: MPS model checker integration for react
1 parent 37e37d7 commit f2f6899

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package org.modelix.react.ssr.mps
2+
3+
import jetbrains.mps.checkers.ConstraintsChecker
4+
import jetbrains.mps.errors.item.NodeReportItem
5+
import jetbrains.mps.progress.EmptyProgressMonitor
6+
import jetbrains.mps.smodel.MPSModuleRepository
7+
import jetbrains.mps.typesystemEngine.checker.NonTypesystemChecker
8+
import jetbrains.mps.typesystemEngine.checker.TypesystemChecker
9+
import org.jetbrains.mps.openapi.model.SNode
10+
import org.jetbrains.mps.openapi.util.Consumer
11+
import org.modelix.incremental.incrementalFunction
12+
import org.modelix.model.api.BuiltinLanguages
13+
import org.modelix.model.api.INode
14+
import org.modelix.model.api.INodeReference
15+
import org.modelix.model.mpsadapters.MPSNodeReference
16+
import org.modelix.model.mpsadapters.tomps.ModelixNodeAsMPSNode
17+
import org.modelix.react.ssr.server.IRenderer
18+
19+
object ModelCheckerIntegration {
20+
21+
private val checkRootNode = incrementalFunction<List<NodeReportItem>, INode>("check") { context, node ->
22+
runCheck(ModelixNodeAsMPSNode.toMPSNode(node))
23+
}
24+
25+
@JvmStatic
26+
fun getMessages(node: INode): List<NodeReportItem> {
27+
return checkRoot(getRootNode(node))[node.reference] ?: emptyList()
28+
}
29+
30+
@JvmStatic
31+
fun getMessages(node: SNode): List<NodeReportItem> {
32+
return getMessages(ModelixNodeAsMPSNode.toModelixNode(node))
33+
}
34+
35+
private fun checkRoot(rootNode: INode): Map<INodeReference, List<NodeReportItem>> {
36+
val messages: List<NodeReportItem> = checkRootNode(rootNode).bind(IRenderer.contextIncrementalEngine.getValue()).invoke()
37+
return messages.groupBy { MPSNodeReference(it.node) }
38+
}
39+
40+
private fun getRootNode(node: INode): INode {
41+
if (node.getContainmentLink()?.getUID() == BuiltinLanguages.MPSRepositoryConcepts.Model.rootNodes.getUID()) {
42+
return node
43+
} else {
44+
return getRootNode(node.parent ?: return node)
45+
}
46+
}
47+
48+
private fun runCheck(root: SNode): List<NodeReportItem> {
49+
val items = ArrayList<NodeReportItem>()
50+
val consumer: Consumer<NodeReportItem> = object : Consumer<NodeReportItem> {
51+
override fun consume(item: NodeReportItem) {
52+
items.add(item)
53+
}
54+
}
55+
56+
@Suppress("removal")
57+
val repository = MPSModuleRepository.getInstance()
58+
TypesystemChecker().check(root, repository, consumer, EmptyProgressMonitor())
59+
NonTypesystemChecker().check(root, repository, consumer, EmptyProgressMonitor())
60+
ConstraintsChecker(null).asRootChecker().check(root, repository, consumer, EmptyProgressMonitor())
61+
return items
62+
}
63+
}

0 commit comments

Comments
 (0)