Skip to content

Commit 7b7df55

Browse files
abstraktorslisson
authored andcommitted
feat(mps-model-adapters): all MPS specific INodeReferences are now available in JS
BREAKING CHANGE: The package name of the MPS specific implementations of `INodeReference` has changed from `org.modelix.model.mpsadapters` to `org.modelix.mps.multiplatform.model` and also the constructors expect platform independent types. refactor(mps-multiplatform-lib): id generation of mps-compatible models and modules without mps
1 parent 2027d4c commit 7b7df55

File tree

22 files changed

+331
-266
lines changed

22 files changed

+331
-266
lines changed

commitlint.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ module.exports = {
2323
"mps-model-adapters",
2424
"mps-model-server",
2525
"mps-sync-plugin",
26+
"mps-multiplatform-lib",
2627
"openapi",
2728
"streams",
2829
"ts-model-api",

model-api/src/commonMain/kotlin/org/modelix/model/api/INodeReference.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,10 @@ class NodeReferenceKSerializer : KSerializer<INodeReference> {
6666
}
6767

6868
class UnresolvableNodeReferenceException(val reference: INodeReference) : IllegalArgumentException("Node not found: $reference")
69+
70+
interface NodeReferenceConverter<E : INodeReference> {
71+
fun tryConvert(ref: INodeReference): E?
72+
fun convert(ref: INodeReference): E = requireNotNull(tryConvert(ref)) {
73+
"Reference cannot be converted to $this: $ref"
74+
}
75+
}

mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSArea.kt

Lines changed: 35 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,20 @@ import org.modelix.model.api.IConcept
1414
import org.modelix.model.api.IConceptReference
1515
import org.modelix.model.api.INode
1616
import org.modelix.model.api.INodeReference
17-
import org.modelix.model.api.NodeReference
1817
import org.modelix.model.area.IArea
1918
import org.modelix.model.area.IAreaListener
2019
import org.modelix.model.area.IAreaReference
20+
import org.modelix.mps.multiplatform.model.MPSDevKitDependencyReference
21+
import org.modelix.mps.multiplatform.model.MPSJavaModuleFacetReference
22+
import org.modelix.mps.multiplatform.model.MPSModelImportReference
2123
import org.modelix.mps.multiplatform.model.MPSModelReference
24+
import org.modelix.mps.multiplatform.model.MPSModuleDependencyReference
2225
import org.modelix.mps.multiplatform.model.MPSModuleReference
2326
import org.modelix.mps.multiplatform.model.MPSNodeReference
27+
import org.modelix.mps.multiplatform.model.MPSProjectModuleReference
28+
import org.modelix.mps.multiplatform.model.MPSProjectReference
29+
import org.modelix.mps.multiplatform.model.MPSRepositoryReference
30+
import org.modelix.mps.multiplatform.model.MPSSingleLanguageDependencyReference
2431

2532
data class MPSArea(val repository: SRepository) : IArea, IAreaReference {
2633

@@ -162,89 +169,38 @@ data class MPSArea(val repository: SRepository) : IArea, IAreaReference {
162169
}
163170

164171
private fun resolveMPSDevKitDependencyReference(ref: INodeReference): MPSDevKitDependencyAsNode? {
165-
if (ref is MPSDevKitDependencyReference) {
166-
return when {
167-
ref.userModule != null -> ref.userModule.resolve(repository)
168-
?.let { MPSModuleAsNode(it).findDevKitDependency(ref.usedModuleId) }
169-
ref.userModel != null -> ref.userModel.resolve(repository)
170-
?.let { MPSModelAsNode(it).findDevKitDependency(ref.usedModuleId) }
171-
else -> error("No importer found.")
172-
}
173-
}
174-
val serialized = ref.serialize()
175-
val serializedModuleId = serialized.substringAfter("${MPSDevKitDependencyReference.PREFIX}:")
176-
.substringBefore(MPSDevKitDependencyReference.SEPARATOR)
177-
178-
val importer = serialized.substringAfter(MPSDevKitDependencyReference.SEPARATOR)
179-
val foundImporter = resolveNode(NodeReference(importer))?.asWritableNode()
180-
181-
val moduleId = PersistenceFacade.getInstance().createModuleId(serializedModuleId)
182-
183-
return when (foundImporter) {
184-
is MPSModelAsNode -> foundImporter.findDevKitDependency(moduleId)
185-
is MPSModuleAsNode<*> -> foundImporter.findDevKitDependency(moduleId)
186-
else -> null
172+
val ref = MPSDevKitDependencyReference.tryConvert(ref) ?: return null
173+
val userModule = ref.userModule
174+
val userModel = ref.userModel
175+
return when {
176+
userModule != null -> userModule.toMPS().resolve(repository)
177+
?.let { MPSModuleAsNode(it).findDevKitDependency(ref.usedModuleId.toMPS().moduleId) }
178+
userModel != null -> userModel.toMPS().resolve(repository)
179+
?.let { MPSModelAsNode(it).findDevKitDependency(ref.usedModuleId.toMPS().moduleId) }
180+
else -> error("No importer found.")
187181
}
188182
}
189183

190184
private fun resolveMPSJavaModuleFacetReference(ref: INodeReference): MPSJavaModuleFacetAsNode? {
191-
val moduleRef = if (ref is MPSJavaModuleFacetReference) {
192-
ref.moduleReference
193-
} else {
194-
val serialized = ref.serialize()
195-
val serializedModuleRef = serialized.substringAfter("${MPSJavaModuleFacetReference.PREFIX}:")
196-
MPSReferenceParser.parseSModuleReference(serializedModuleRef)
197-
}
198-
199-
val facet = moduleRef.resolve(repository)?.getFacetOfType(JavaModuleFacet.FACET_TYPE)
185+
val ref = MPSJavaModuleFacetReference.tryConvert(ref) ?: return null
186+
val facet = ref.moduleReference.toMPS().resolve(repository)?.getFacetOfType(JavaModuleFacet.FACET_TYPE)
200187
return facet?.let { MPSJavaModuleFacetAsNode(it as JavaModuleFacet) }
201188
}
202189

203190
private fun resolveMPSModelImportReference(ref: INodeReference): MPSModelImportAsNode? {
204-
val serialized = ref.serialize()
205-
val importedModelRef = if (ref is MPSModelImportReference) {
206-
ref.importedModel
207-
} else {
208-
val serializedModelRef = serialized
209-
.substringAfter("${MPSModelImportReference.PREFIX}:")
210-
.substringBefore(MPSModelImportReference.SEPARATOR)
211-
MPSReferenceParser.parseSModelReference(serializedModelRef)
212-
}
213-
214-
val importingModelRef = if (ref is MPSModelImportReference) {
215-
ref.importingModel
216-
} else {
217-
val serializedModelRef = serialized.substringAfter(MPSModelImportReference.SEPARATOR)
218-
MPSReferenceParser.parseSModelReference(serializedModelRef)
219-
}
191+
val ref = MPSModelImportReference.tryConvert(ref) ?: return null
220192

221-
val importingModel = importingModelRef.resolve(repository) ?: return null
222-
if (!ModelImports(importingModel).importedModels.contains(importedModelRef)) return null
193+
val importingModel = ref.importingModel.toMPS().resolve(repository) ?: return null
194+
if (!ModelImports(importingModel).importedModels.contains(ref.importedModel.toMPS())) return null
223195

224-
return MPSModelImportAsNode(importedModel = importedModelRef, importingModel = importingModel)
196+
return MPSModelImportAsNode(importedModel = ref.importedModel.toMPS(), importingModel = importingModel)
225197
}
226198

227199
private fun resolveMPSModuleDependencyReference(ref: INodeReference): MPSModuleDependencyAsNode? {
228-
val serialized = ref.serialize()
229-
val usedModuleId = if (ref is MPSModuleDependencyReference) {
230-
ref.usedModuleId
231-
} else {
232-
val serializedModuleId = serialized
233-
.substringAfter("${MPSModuleDependencyReference.PREFIX}:")
234-
.substringBefore(MPSModuleDependencyReference.SEPARATOR)
235-
PersistenceFacade.getInstance().createModuleId(serializedModuleId)
236-
}
237-
238-
val userModuleReference = if (ref is MPSModuleDependencyReference) {
239-
ref.userModuleReference
240-
} else {
241-
val serializedModuleRef = serialized.substringAfter(MPSModuleDependencyReference.SEPARATOR)
242-
MPSReferenceParser.parseSModuleReference(serializedModuleRef)
243-
}
244-
245-
return userModuleReference.resolve(repository)
200+
val ref = MPSModuleDependencyReference.tryConvert(ref) ?: return null
201+
return ref.userModuleReference.toMPS().resolve(repository)
246202
?.let { MPSModuleAsNode(it) }
247-
?.findModuleDependency(usedModuleId)
203+
?.findModuleDependency(ref.usedModuleId.toMPS().moduleId)
248204
}
249205

250206
private fun resolveMPSModuleReferenceReference(ref: INodeReference): MPSModuleReferenceAsNode? {
@@ -281,28 +237,15 @@ data class MPSArea(val repository: SRepository) : IArea, IAreaReference {
281237
}
282238

283239
private fun resolveMPSSingleLanguageDependencyReference(ref: INodeReference): MPSSingleLanguageDependencyAsNode? {
284-
if (ref is MPSSingleLanguageDependencyReference) {
285-
return when {
286-
ref.userModule != null -> ref.userModule.resolve(repository)
287-
?.let { MPSModuleAsNode(it).findSingleLanguageDependency(ref.usedModuleId) }
288-
ref.userModel != null -> ref.userModel.resolve(repository)
289-
?.let { MPSModelAsNode(it).findSingleLanguageDependency(ref.usedModuleId) }
290-
else -> error("No importer found.")
291-
}
292-
}
293-
val serialized = ref.serialize()
294-
val serializedModuleId = serialized.substringAfter("${MPSSingleLanguageDependencyReference.PREFIX}:")
295-
.substringBefore(MPSSingleLanguageDependencyReference.SEPARATOR)
296-
297-
val importer = serialized.substringAfter(MPSSingleLanguageDependencyReference.SEPARATOR)
298-
val foundImporter = resolveNode(NodeReference(importer))?.asWritableNode()
299-
300-
val moduleId = PersistenceFacade.getInstance().createModuleId(serializedModuleId)
301-
302-
return when (foundImporter) {
303-
is MPSModelAsNode -> foundImporter.findSingleLanguageDependency(moduleId)
304-
is MPSModuleAsNode<*> -> foundImporter.findSingleLanguageDependency(moduleId)
305-
else -> null
240+
val ref = MPSSingleLanguageDependencyReference.tryConvert(ref) ?: return null
241+
val userModule = ref.userModule
242+
val userModel = ref.userModel
243+
return when {
244+
userModule != null -> userModule.toMPS().resolve(repository)
245+
?.let { MPSModuleAsNode(it).findSingleLanguageDependency(ref.usedModuleId.toMPS().moduleId) }
246+
userModel != null -> userModel.toMPS().resolve(repository)
247+
?.let { MPSModelAsNode(it).findSingleLanguageDependency(ref.usedModuleId.toMPS().moduleId) }
248+
else -> error("No importer found.")
306249
}
307250
}
308251

mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSModelImportAsNode.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import org.modelix.model.api.INodeReference
99
import org.modelix.model.api.IPropertyReference
1010
import org.modelix.model.api.IReferenceLinkReference
1111
import org.modelix.model.api.IWritableNode
12+
import org.modelix.mps.multiplatform.model.MPSModelImportReference
1213

1314
data class MPSModelImportAsNode(val importedModel: SModelReference, val importingModel: SModel) : MPSGenericNodeAdapter<MPSModelImportAsNode>() {
1415

@@ -60,8 +61,8 @@ data class MPSModelImportAsNode(val importedModel: SModelReference, val importin
6061

6162
override fun getNodeReference(): INodeReference {
6263
return MPSModelImportReference(
63-
importedModel = importedModel,
64-
importingModel = importingModel.reference,
64+
importedModel = importedModel.toModelix(),
65+
importingModel = importingModel.reference.toModelix(),
6566
)
6667
}
6768

mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSModuleDependencyAsNode.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import org.modelix.model.api.INodeReference
1313
import org.modelix.model.api.IPropertyReference
1414
import org.modelix.model.api.IReferenceLinkReference
1515
import org.modelix.model.api.IWritableNode
16+
import org.modelix.mps.multiplatform.model.MPSModuleDependencyReference
1617

1718
data class MPSModuleDependencyAsNode(
1819
val owner: SModule,
@@ -167,8 +168,8 @@ data class MPSModuleDependencyAsNode(
167168

168169
override fun getNodeReference(): INodeReference {
169170
return MPSModuleDependencyReference(
170-
usedModuleId = moduleReference.moduleId,
171-
userModuleReference = owner.moduleReference,
171+
usedModuleId = moduleReference.moduleId.toModelix(),
172+
userModuleReference = owner.moduleReference.toModelix(),
172173
)
173174
}
174175

mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSProjectAsNode.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import org.modelix.model.api.IReferenceLinkReference
1111
import org.modelix.model.api.IWritableNode
1212
import org.modelix.mps.api.ModelixMpsApi
1313
import org.modelix.mps.multiplatform.model.MPSModuleReference
14+
import org.modelix.mps.multiplatform.model.MPSProjectReference
1415

1516
data class MPSProjectAsNode(val project: IMPSProject) : MPSGenericNodeAdapter<IMPSProject>() {
1617

0 commit comments

Comments
 (0)