Skip to content

Commit f3b7194

Browse files
committed
test(mps-sync-plugin): test synchronization of model imports during checkout
1 parent 703a258 commit f3b7194

File tree

23 files changed

+753
-1
lines changed

23 files changed

+753
-1
lines changed

model-datastructure/src/commonMain/kotlin/org/modelix/model/mutable/SingleThreadMutableModelTree.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package org.modelix.model.mutable
33
import org.modelix.datastructures.model.IGenericModelTree
44
import org.modelix.datastructures.model.MutationParameters
55
import org.modelix.model.TreeId
6+
import org.modelix.model.api.IModel
67
import org.modelix.model.api.IMutableModel
78
import org.modelix.model.api.INodeReference
89
import org.modelix.streams.getBlocking
@@ -58,3 +59,4 @@ class SingleThreadMutableModelTree<NodeId>(
5859

5960
fun <T> IGenericModelTree<T>.asMutableSingleThreaded(): IGenericMutableModelTree<T> = SingleThreadMutableModelTree(this)
6061
fun IGenericModelTree<INodeReference>.asModelSingleThreaded(): IMutableModel = asMutableSingleThreaded().asModel()
62+
fun IGenericModelTree<INodeReference>.asReadOnlyModel(): IModel = asModelSingleThreaded()

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ data class MPSDevkitAsNode(override val module: DevKit) : MPSModuleAsNode<DevKit
522522
override fun getConcept(): IConcept = BuiltinLanguages.MPSRepositoryConcepts.DevKit
523523
}
524524

525-
private fun <T : SModel> Iterable<T>.withoutDescriptorModel(): List<T> {
525+
fun <T : SModel> Iterable<T>.withoutDescriptorModel(): List<T> {
526526
return filter { it.name.stereotype != "descriptor" }
527527
}
528528

mps-sync-plugin3/src/test/kotlin/org/modelix/mps/sync3/ProjectSyncTest.kt

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import jetbrains.mps.core.tool.environment.util.SetLibraryContributor
1111
import jetbrains.mps.ide.MPSCoreComponents
1212
import jetbrains.mps.ide.project.ProjectHelper
1313
import jetbrains.mps.library.contributor.LibDescriptor
14+
import jetbrains.mps.smodel.Language
1415
import jetbrains.mps.smodel.MPSModuleRepository
16+
import jetbrains.mps.smodel.ModelImports
1517
import jetbrains.mps.smodel.SNodePointer
1618
import jetbrains.mps.smodel.SNodeUtil
1719
import jetbrains.mps.smodel.adapter.ids.SConceptId
@@ -46,13 +48,17 @@ import org.modelix.model.mpsadapters.MPSModuleAsNode
4648
import org.modelix.model.mpsadapters.MPSProjectReference
4749
import org.modelix.model.mpsadapters.MPSProperty
4850
import org.modelix.model.mpsadapters.computeRead
51+
import org.modelix.model.mpsadapters.toMPS
4952
import org.modelix.model.mpsadapters.toModelix
53+
import org.modelix.model.mpsadapters.withoutDescriptorModel
5054
import org.modelix.model.mutable.asModelSingleThreaded
55+
import org.modelix.model.mutable.asReadOnlyModel
5156
import org.modelix.model.oauth.IAuthConfig
5257
import org.modelix.model.operations.IOperation
5358
import org.modelix.model.operations.SetPropertyOp
5459
import org.modelix.model.server.ModelServerPermissionSchema
5560
import org.modelix.mps.multiplatform.model.MPSIdGenerator
61+
import org.modelix.mps.multiplatform.model.MPSModelReference
5662
import org.modelix.mps.multiplatform.model.MPSNodeReference
5763
import org.modelix.mps.sync3.ui.OpenFrontendAction
5864
import org.modelix.streams.getBlocking
@@ -513,6 +519,79 @@ class ProjectSyncTest : MPSTestBase() {
513519
assertEquals(expectedSnapshot, project.captureSnapshot())
514520
}
515521

522+
/**
523+
* This reproduces a bug observed in the SECURE project.
524+
*/
525+
fun `test sync of model dependencies`(): Unit = runWithModelServer { port ->
526+
// An initialized repository exists on the server.
527+
val branchRef = RepositoryId("sync-test").getBranchReference("branchA")
528+
val version1 = syncProjectToServer("model-dependencies", port, branchRef)
529+
530+
// The repository is then checked out by an MPS client using a modelix.xml without a commit hash.
531+
openTestProject(null) { projectDir ->
532+
projectDir.resolve(".mps").resolve("modelix.xml").writeText(
533+
"""
534+
<?xml version="1.0" encoding="UTF-8"?>
535+
<project version="4">
536+
<component name="modelix-sync">
537+
<binding>
538+
<enabled>true</enabled>
539+
<url>http://localhost:$port</url>
540+
<repository>${branchRef.repositoryId.id}</repository>
541+
<branch>${branchRef.branchName}</branch>
542+
</binding>
543+
</component>
544+
</project>
545+
""".trimIndent(),
546+
)
547+
}
548+
val connections = IModelSyncService.getInstance(mpsProject)
549+
.getServerConnections()
550+
assertEquals(1, connections.flatMap { it.getBindings() }.count { it.isEnabled() })
551+
connections.flatMap { it.getBindings() }.forEach { it.flushIfEnabled() }
552+
553+
// The repository is expected to remain unchanged.
554+
val client = ModelClientV2.builder().url("http://localhost:$port").lazyAndBlockingQueries().build()
555+
assertEquals(version1.getContentHash(), client.pull(branchRef, null).getContentHash())
556+
557+
// The following bug was observed:
558+
// Dependencies to local models that are not stored on the server are not properly created,
559+
// even though the dependency itself exist on the server.
560+
//
561+
// It was also observed that this might be the case for dependencies that involve a devkit.
562+
563+
val mpsModels = readAction {
564+
mpsProject
565+
.projectModules
566+
.flatMap {
567+
when (it) {
568+
is Language -> listOf(it) + it.generators
569+
else -> listOf(it)
570+
}
571+
}
572+
.flatMap { it.models }
573+
.withoutDescriptorModel()
574+
.associateBy { it.name.value }
575+
}
576+
val serverModels = version1.getModelTree().asReadOnlyModel().getRootNode().getDescendants(true)
577+
.filter { it.getConceptReference() == BuiltinLanguages.MPSRepositoryConcepts.Model.getReference() }
578+
.associateBy { it.getPropertyValue(BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name.toReference()).orEmpty() }
579+
580+
assertEquals(serverModels.keys, mpsModels.keys)
581+
582+
for (modelName in mpsModels.keys) {
583+
val mpsModel = mpsModels.getValue(modelName)
584+
val serverModel = serverModels.getValue(modelName)
585+
586+
val importsInMPS = readAction { ModelImports(mpsModel).importedModels.toSet() }
587+
val importsOnServer = serverModel.getChildren(BuiltinLanguages.MPSRepositoryConcepts.Model.modelImports.toReference())
588+
.mapNotNull { it.getReferenceTargetRef(BuiltinLanguages.MPSRepositoryConcepts.ModelReference.model.toReference()) }
589+
.mapNotNull { MPSModelReference.tryConvert(it)?.toMPS() }
590+
.toSet()
591+
assertEquals(importsOnServer, importsInMPS)
592+
}
593+
}
594+
516595
private fun getMPSPlatformVersion(): Int {
517596
val info = ApplicationInfo.getInstance()
518597
return (info.majorVersion.toInt() - 2000) * 10 + info.minorVersionMainPart.toInt()
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Default ignored files
2+
/shelf/
3+
/workspace.xml
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project version="4">
3+
<component name="MigrationProperties">
4+
<entry key="project.baseline.version" value="211" />
5+
</component>
6+
</project>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project version="4">
3+
<component name="MPSProject">
4+
<projectModules>
5+
<modulePath path="$PROJECT_DIR$/devkits/NewDevkit/NewDevkit.devkit" folder="" />
6+
<modulePath path="$PROJECT_DIR$/languages/NewLanguage/NewLanguage.mpl" folder="" />
7+
<modulePath path="$PROJECT_DIR$/solutions/NewRuntimeSolution/NewRuntimeSolution.msd" folder="" />
8+
<modulePath path="$PROJECT_DIR$/solutions/NewSolution/NewSolution.msd" folder="" />
9+
<modulePath path="$PROJECT_DIR$/solutions/ToBeDeleted/ToBeDeleted.msd" folder="" />
10+
</projectModules>
11+
</component>
12+
</project>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project version="4">
3+
<component name="VcsDirectoryMappings">
4+
<mapping directory="$PROJECT_DIR$/../../.." vcs="Git" />
5+
</component>
6+
</project>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<dev-kit name="NewDevkit" uuid="568b2514-a608-45b5-aea5-6ffd231cea1d">
3+
<exported-language name="96c7c023-6829-44d0-b358-661f058f1c31(NewLanguage)" />
4+
<extendedDevKits>
5+
<extendedDevKit>fbc25dd2-5da4-483a-8b19-70928e1b62d7(jetbrains.mps.devkit.general-purpose)</extendedDevKit>
6+
</extendedDevKits>
7+
<exported-solutions>
8+
<exported-solution>4eb87a8f-881e-4d34-9514-f5002000c363(NewRuntimeSolution)</exported-solution>
9+
<exported-solution>6354ebe7-c22a-4a0f-ac54-50b52ab9b065(JDK)</exported-solution>
10+
</exported-solutions>
11+
</dev-kit>
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<language namespace="NewLanguage" uuid="96c7c023-6829-44d0-b358-661f058f1c31" languageVersion="0" moduleVersion="0">
3+
<models>
4+
<modelRoot contentPath="${module}" type="default">
5+
<sourceRoot location="models" />
6+
</modelRoot>
7+
</models>
8+
<facets>
9+
<facet type="java">
10+
<classes generated="true" path="${module}/classes_gen" />
11+
</facet>
12+
</facets>
13+
<accessoryModels />
14+
<generators>
15+
<generator alias="main" namespace="NewLanguage.generator" uuid="6d5e9772-42f2-4376-adca-80393565af00">
16+
<models>
17+
<modelRoot contentPath="${module}/generator" type="default">
18+
<sourceRoot location="templates" />
19+
</modelRoot>
20+
</models>
21+
<facets>
22+
<facet type="java">
23+
<classes generated="true" path="${module}/generator/classes_gen" />
24+
</facet>
25+
</facets>
26+
<external-templates />
27+
<languageVersions>
28+
<language slang="l:f3061a53-9226-4cc5-a443-f952ceaf5816:jetbrains.mps.baseLanguage" version="11" />
29+
<language slang="l:fd392034-7849-419d-9071-12563d152375:jetbrains.mps.baseLanguage.closures" version="0" />
30+
<language slang="l:83888646-71ce-4f1c-9c53-c54016f6ad4f:jetbrains.mps.baseLanguage.collections" version="1" />
31+
<language slang="l:f2801650-65d5-424e-bb1b-463a8781b786:jetbrains.mps.baseLanguage.javadoc" version="2" />
32+
<language slang="l:760a0a8c-eabb-4521-8bfd-65db761a9ba3:jetbrains.mps.baseLanguage.logging" version="0" />
33+
<language slang="l:a247e09e-2435-45ba-b8d2-07e93feba96a:jetbrains.mps.baseLanguage.tuples" version="0" />
34+
<language slang="l:ceab5195-25ea-4f22-9b92-103b95ca8c0c:jetbrains.mps.lang.core" version="2" />
35+
<language slang="l:b401a680-8325-4110-8fd3-84331ff25bef:jetbrains.mps.lang.generator" version="4" />
36+
<language slang="l:d7706f63-9be2-479c-a3da-ae92af1e64d5:jetbrains.mps.lang.generator.generationContext" version="2" />
37+
<language slang="l:289fcc83-6543-41e8-a5ca-768235715ce4:jetbrains.mps.lang.generator.generationParameters" version="0" />
38+
<language slang="l:446c26eb-2b7b-4bf0-9b35-f83fa582753e:jetbrains.mps.lang.modelapi" version="0" />
39+
<language slang="l:3a13115c-633c-4c5c-bbcc-75c4219e9555:jetbrains.mps.lang.quotation" version="5" />
40+
<language slang="l:13744753-c81f-424a-9c1b-cf8943bf4e86:jetbrains.mps.lang.sharedConcepts" version="0" />
41+
<language slang="l:7866978e-a0f0-4cc7-81bc-4d213d9375e1:jetbrains.mps.lang.smodel" version="18" />
42+
<language slang="l:c7fb639f-be78-4307-89b0-b5959c3fa8c8:jetbrains.mps.lang.text" version="0" />
43+
<language slang="l:9ded098b-ad6a-4657-bfd9-48636cfe8bc3:jetbrains.mps.lang.traceable" version="0" />
44+
</languageVersions>
45+
<dependencyVersions>
46+
<module reference="3f233e7f-b8a6-46d2-a57f-795d56775243(Annotations)" version="0" />
47+
<module reference="6354ebe7-c22a-4a0f-ac54-50b52ab9b065(JDK)" version="0" />
48+
<module reference="6ed54515-acc8-4d1e-a16c-9fd6cfe951ea(MPS.Core)" version="0" />
49+
<module reference="8865b7a8-5271-43d3-884c-6fd1d9cfdd34(MPS.OpenAPI)" version="0" />
50+
<module reference="96c7c023-6829-44d0-b358-661f058f1c31(NewLanguage)" version="0" />
51+
<module reference="6d5e9772-42f2-4376-adca-80393565af00(NewLanguage.generator)" version="0" />
52+
<module reference="ceab5195-25ea-4f22-9b92-103b95ca8c0c(jetbrains.mps.lang.core)" version="0" />
53+
</dependencyVersions>
54+
<mapping-priorities />
55+
</generator>
56+
<generator alias="toBeDeletedGenerator" namespace="NewLanguage.generator01" uuid="a8303696-b490-4dad-9595-e52191c9dddf" generatorOutputPath="${module}/generator1/source_gen">
57+
<models>
58+
<modelRoot contentPath="${module}/generator1" type="default">
59+
<sourceRoot location="templates" />
60+
</modelRoot>
61+
</models>
62+
<facets>
63+
<facet type="java">
64+
<classes generated="true" path="${module}/generator1/classes_gen" />
65+
</facet>
66+
</facets>
67+
<external-templates />
68+
<languageVersions>
69+
<language slang="l:f3061a53-9226-4cc5-a443-f952ceaf5816:jetbrains.mps.baseLanguage" version="11" />
70+
<language slang="l:fd392034-7849-419d-9071-12563d152375:jetbrains.mps.baseLanguage.closures" version="0" />
71+
<language slang="l:83888646-71ce-4f1c-9c53-c54016f6ad4f:jetbrains.mps.baseLanguage.collections" version="1" />
72+
<language slang="l:f2801650-65d5-424e-bb1b-463a8781b786:jetbrains.mps.baseLanguage.javadoc" version="2" />
73+
<language slang="l:760a0a8c-eabb-4521-8bfd-65db761a9ba3:jetbrains.mps.baseLanguage.logging" version="0" />
74+
<language slang="l:a247e09e-2435-45ba-b8d2-07e93feba96a:jetbrains.mps.baseLanguage.tuples" version="0" />
75+
<language slang="l:ceab5195-25ea-4f22-9b92-103b95ca8c0c:jetbrains.mps.lang.core" version="2" />
76+
<language slang="l:b401a680-8325-4110-8fd3-84331ff25bef:jetbrains.mps.lang.generator" version="4" />
77+
<language slang="l:d7706f63-9be2-479c-a3da-ae92af1e64d5:jetbrains.mps.lang.generator.generationContext" version="2" />
78+
<language slang="l:289fcc83-6543-41e8-a5ca-768235715ce4:jetbrains.mps.lang.generator.generationParameters" version="0" />
79+
<language slang="l:446c26eb-2b7b-4bf0-9b35-f83fa582753e:jetbrains.mps.lang.modelapi" version="0" />
80+
<language slang="l:3a13115c-633c-4c5c-bbcc-75c4219e9555:jetbrains.mps.lang.quotation" version="5" />
81+
<language slang="l:13744753-c81f-424a-9c1b-cf8943bf4e86:jetbrains.mps.lang.sharedConcepts" version="0" />
82+
<language slang="l:7866978e-a0f0-4cc7-81bc-4d213d9375e1:jetbrains.mps.lang.smodel" version="18" />
83+
<language slang="l:c7fb639f-be78-4307-89b0-b5959c3fa8c8:jetbrains.mps.lang.text" version="0" />
84+
<language slang="l:9ded098b-ad6a-4657-bfd9-48636cfe8bc3:jetbrains.mps.lang.traceable" version="0" />
85+
</languageVersions>
86+
<dependencyVersions>
87+
<module reference="3f233e7f-b8a6-46d2-a57f-795d56775243(Annotations)" version="0" />
88+
<module reference="6354ebe7-c22a-4a0f-ac54-50b52ab9b065(JDK)" version="0" />
89+
<module reference="6ed54515-acc8-4d1e-a16c-9fd6cfe951ea(MPS.Core)" version="0" />
90+
<module reference="8865b7a8-5271-43d3-884c-6fd1d9cfdd34(MPS.OpenAPI)" version="0" />
91+
<module reference="96c7c023-6829-44d0-b358-661f058f1c31(NewLanguage)" version="0" />
92+
<module reference="a8303696-b490-4dad-9595-e52191c9dddf(NewLanguage.generator01)" version="0" />
93+
<module reference="ceab5195-25ea-4f22-9b92-103b95ca8c0c(jetbrains.mps.lang.core)" version="0" />
94+
</dependencyVersions>
95+
<mapping-priorities />
96+
</generator>
97+
</generators>
98+
<sourcePath />
99+
<languageVersions>
100+
<language slang="l:f3061a53-9226-4cc5-a443-f952ceaf5816:jetbrains.mps.baseLanguage" version="11" />
101+
<language slang="l:443f4c36-fcf5-4eb6-9500-8d06ed259e3e:jetbrains.mps.baseLanguage.classifiers" version="0" />
102+
<language slang="l:fd392034-7849-419d-9071-12563d152375:jetbrains.mps.baseLanguage.closures" version="0" />
103+
<language slang="l:83888646-71ce-4f1c-9c53-c54016f6ad4f:jetbrains.mps.baseLanguage.collections" version="1" />
104+
<language slang="l:f2801650-65d5-424e-bb1b-463a8781b786:jetbrains.mps.baseLanguage.javadoc" version="2" />
105+
<language slang="l:760a0a8c-eabb-4521-8bfd-65db761a9ba3:jetbrains.mps.baseLanguage.logging" version="0" />
106+
<language slang="l:a247e09e-2435-45ba-b8d2-07e93feba96a:jetbrains.mps.baseLanguage.tuples" version="0" />
107+
<language slang="l:aee9cad2-acd4-4608-aef2-0004f6a1cdbd:jetbrains.mps.lang.actions" version="4" />
108+
<language slang="l:af65afd8-f0dd-4942-87d9-63a55f2a9db1:jetbrains.mps.lang.behavior" version="2" />
109+
<language slang="l:3f4bc5f5-c6c1-4a28-8b10-c83066ffa4a1:jetbrains.mps.lang.constraints" version="6" />
110+
<language slang="l:e51810c5-7308-4642-bcb6-469e61b5dd18:jetbrains.mps.lang.constraints.msg.specification" version="0" />
111+
<language slang="l:47257bf3-78d3-470b-89d9-8c3261a61d15:jetbrains.mps.lang.constraints.rules" version="0" />
112+
<language slang="l:5dae8159-ab99-46bb-a40d-0cee30ee7018:jetbrains.mps.lang.constraints.rules.kinds" version="0" />
113+
<language slang="l:134c38d4-e3af-4d9e-b069-1c7df0a4005d:jetbrains.mps.lang.constraints.rules.skeleton" version="0" />
114+
<language slang="l:3ad5badc-1d9c-461c-b7b1-fa2fcd0a0ae7:jetbrains.mps.lang.context" version="0" />
115+
<language slang="l:ea3159bf-f48e-4720-bde2-86dba75f0d34:jetbrains.mps.lang.context.defs" version="0" />
116+
<language slang="l:ceab5195-25ea-4f22-9b92-103b95ca8c0c:jetbrains.mps.lang.core" version="2" />
117+
<language slang="l:f4ad079d-bc71-4ffb-9600-9328705cf998:jetbrains.mps.lang.descriptor" version="0" />
118+
<language slang="l:18bc6592-03a6-4e29-a83a-7ff23bde13ba:jetbrains.mps.lang.editor" version="14" />
119+
<language slang="l:ad93155d-79b2-4759-b10c-55123e763903:jetbrains.mps.lang.messages" version="0" />
120+
<language slang="l:446c26eb-2b7b-4bf0-9b35-f83fa582753e:jetbrains.mps.lang.modelapi" version="0" />
121+
<language slang="l:d4615e3b-d671-4ba9-af01-2b78369b0ba7:jetbrains.mps.lang.pattern" version="2" />
122+
<language slang="l:3a13115c-633c-4c5c-bbcc-75c4219e9555:jetbrains.mps.lang.quotation" version="5" />
123+
<language slang="l:982eb8df-2c96-4bd7-9963-11712ea622e5:jetbrains.mps.lang.resources" version="2" />
124+
<language slang="l:b3551702-269c-4f05-ba61-58060cef4292:jetbrains.mps.lang.rulesAndMessages" version="0" />
125+
<language slang="l:d8f591ec-4d86-4af2-9f92-a9e93c803ffa:jetbrains.mps.lang.scopes" version="0" />
126+
<language slang="l:13744753-c81f-424a-9c1b-cf8943bf4e86:jetbrains.mps.lang.sharedConcepts" version="0" />
127+
<language slang="l:7866978e-a0f0-4cc7-81bc-4d213d9375e1:jetbrains.mps.lang.smodel" version="18" />
128+
<language slang="l:c72da2b9-7cce-4447-8389-f407dc1158b7:jetbrains.mps.lang.structure" version="9" />
129+
<language slang="l:c7fb639f-be78-4307-89b0-b5959c3fa8c8:jetbrains.mps.lang.text" version="0" />
130+
<language slang="l:9ded098b-ad6a-4657-bfd9-48636cfe8bc3:jetbrains.mps.lang.traceable" version="0" />
131+
<language slang="l:7a5dda62-9140-4668-ab76-d5ed1746f2b2:jetbrains.mps.lang.typesystem" version="5" />
132+
</languageVersions>
133+
<dependencyVersions>
134+
<module reference="3f233e7f-b8a6-46d2-a57f-795d56775243(Annotations)" version="0" />
135+
<module reference="6354ebe7-c22a-4a0f-ac54-50b52ab9b065(JDK)" version="0" />
136+
<module reference="6ed54515-acc8-4d1e-a16c-9fd6cfe951ea(MPS.Core)" version="0" />
137+
<module reference="8865b7a8-5271-43d3-884c-6fd1d9cfdd34(MPS.OpenAPI)" version="0" />
138+
<module reference="96c7c023-6829-44d0-b358-661f058f1c31(NewLanguage)" version="0" />
139+
<module reference="ceab5195-25ea-4f22-9b92-103b95ca8c0c(jetbrains.mps.lang.core)" version="0" />
140+
<module reference="a9e4c532-c5f5-4bb7-99ef-42abb73bbb70(jetbrains.mps.lang.descriptor.aspects)" version="0" />
141+
</dependencyVersions>
142+
<extendedLanguages />
143+
</language>

0 commit comments

Comments
 (0)