Skip to content

Commit 63fc772

Browse files
committed
feat: new method runWithProject
1 parent 044001c commit 63fc772

File tree

5 files changed

+42
-3
lines changed

5 files changed

+42
-3
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.modelix.mps.api
2+
3+
import org.jetbrains.mps.openapi.project.Project
4+
5+
object ContextProject {
6+
private val threadLocal = ThreadLocal<Project>()
7+
8+
fun <R> runWith(project: Project, body: () -> R): R {
9+
val oldValue = threadLocal.get()
10+
try {
11+
threadLocal.set(project)
12+
return body()
13+
} finally {
14+
threadLocal.set(oldValue)
15+
}
16+
}
17+
18+
fun getProject(): Project? = threadLocal.get()
19+
}

api/src/main/kotlin/org/modelix/mps/api/IModelixMpsApi.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,10 @@ interface IModelixMpsApi {
3131
fun setReference(node: SNode, link: SReferenceLink, target: SNodeReference)
3232

3333
fun forceSave(model: SModel)
34+
35+
fun getIdeaProject(project: Project): com.intellij.openapi.project.Project
36+
fun getMPSProject(project: com.intellij.openapi.project.Project): Project
37+
fun <R> runWithProject(project: Project, body: () -> R): R =
38+
ContextProject.runWith(project, body)
39+
fun <R> runWithProject(project: com.intellij.openapi.project.Project, body: () -> R): R = runWithProject(getMPSProject(project), body)
3440
}

impl203/src/main/kotlin/org/modelix/mps/api/ModelixMpsApiImpl203.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import java.awt.Component
2323

2424
open class ModelixMpsApiImpl203 : IModelixMpsApi {
2525
override fun getMPSProjects(): List<Project> {
26-
return ProjectManager.getInstance().openedProjects
26+
return (listOfNotNull(ContextProject.getProject()) + ProjectManager.getInstance().openedProjects).distinct()
2727
}
2828

2929
override fun getVirtualFolder(
@@ -48,7 +48,7 @@ open class ModelixMpsApiImpl203 : IModelixMpsApi {
4848
}
4949

5050
override fun getRepository(project: com.intellij.openapi.project.Project): SRepository {
51-
return getRepository(checkNotNull(ProjectHelper.fromIdeaProject(project)) { "No MPS project found in $project" })
51+
return getRepository(getMPSProject(project))
5252
}
5353

5454
override fun getRepository(editorContext: EditorContext): SRepository {
@@ -76,4 +76,14 @@ open class ModelixMpsApiImpl203 : IModelixMpsApi {
7676
if (model !is EditableSModel) return
7777
model.save(SaveOptions.FORCE)
7878
}
79+
80+
override fun getIdeaProject(project: Project): com.intellij.openapi.project.Project {
81+
return ProjectHelper.toIdeaProject(project as jetbrains.mps.project.Project)
82+
}
83+
84+
override fun getMPSProject(project: com.intellij.openapi.project.Project): Project {
85+
return checkNotNull(ProjectHelper.fromIdeaProject(project)) {
86+
"No MPS project found in $project"
87+
}
88+
}
7989
}

impl223/src/main/kotlin/org/modelix/mps/api/ModelixMpsApiImpl223.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ import org.jetbrains.mps.openapi.project.Project
77
open class ModelixMpsApiImpl223 : ModelixMpsApiImpl222() {
88
override fun getMPSProjects(): List<Project> {
99
val manager = MPSCoreComponents.getInstance()?.platform?.findComponent(ProjectManager::class.java) ?: return emptyList()
10-
return manager.openedProjects
10+
return (listOfNotNull(ContextProject.getProject()) + manager.openedProjects).distinct()
1111
}
1212
}

lib/api/lib.api

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ public final class org/modelix/mps/api/ModelixMpsApi : org/modelix/mps/api/IMode
33
public fun fixVersions (Lorg/jetbrains/mps/openapi/project/Project;Lorg/jetbrains/mps/openapi/module/SModule;)V
44
public fun forceSave (Lorg/jetbrains/mps/openapi/model/SModel;)V
55
public fun getGlobalRepository ()Lorg/jetbrains/mps/openapi/module/SRepository;
6+
public fun getIdeaProject (Lorg/jetbrains/mps/openapi/project/Project;)Lcom/intellij/openapi/project/Project;
7+
public fun getMPSProject (Lcom/intellij/openapi/project/Project;)Lorg/jetbrains/mps/openapi/project/Project;
68
public fun getMPSProjects ()Ljava/util/List;
79
public fun getProjectRepository ()Lorg/jetbrains/mps/openapi/module/SRepository;
810
public fun getRepository ()Lorg/jetbrains/mps/openapi/module/SRepository;
@@ -13,6 +15,8 @@ public final class org/modelix/mps/api/ModelixMpsApi : org/modelix/mps/api/IMode
1315
public fun getVirtualFolder (Lorg/jetbrains/mps/openapi/module/SModule;)Ljava/lang/String;
1416
public fun getVirtualFolder (Lorg/jetbrains/mps/openapi/project/Project;Lorg/jetbrains/mps/openapi/module/SModule;)Ljava/lang/String;
1517
public fun getVirtualFolders (Lorg/jetbrains/mps/openapi/module/SModule;)Ljava/util/List;
18+
public fun runWithProject (Lcom/intellij/openapi/project/Project;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object;
19+
public fun runWithProject (Lorg/jetbrains/mps/openapi/project/Project;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object;
1620
public fun setReference (Lorg/jetbrains/mps/openapi/model/SNode;Lorg/jetbrains/mps/openapi/language/SReferenceLink;Lorg/jetbrains/mps/openapi/model/SNodeReference;)V
1721
}
1822

0 commit comments

Comments
 (0)