Skip to content

Commit ecf13af

Browse files
committed
Move most initialization code away from components
Since this plugin is Facet based, we should be using the Facet lifecycle for handling init and depose of any features instead of components.
1 parent df0011a commit ecf13af

File tree

11 files changed

+83
-166
lines changed

11 files changed

+83
-166
lines changed

src/main/kotlin/com/demonwav/mcdev/facet/MinecraftFacet.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,15 @@ class MinecraftFacet(module: Module, name: String, configuration: MinecraftFacet
9090
updateRoots()
9191

9292
// Add modules which are new
93+
val newlyEnabled = mutableListOf<AbstractModule>()
9394
allEnabled
9495
.map { it.type }
9596
.filter { !moduleMap.containsKey(it) }
96-
.forEach(this::register)
97+
.forEach {
98+
newlyEnabled += register(it)
99+
}
100+
101+
newlyEnabled.forEach(AbstractModule::init)
97102

98103
ProjectView.getInstance(module.project).refresh()
99104
}
@@ -115,9 +120,11 @@ class MinecraftFacet(module: Module, name: String, configuration: MinecraftFacet
115120
}
116121
}
117122

118-
private fun register(type: AbstractModuleType<*>) {
123+
private fun register(type: AbstractModuleType<*>): AbstractModule {
119124
type.performCreationSettingSetup(module.project)
120-
moduleMap[type] = type.generateModule(this)
125+
val module = type.generateModule(this)
126+
moduleMap[type] = module
127+
return module
121128
}
122129

123130
val modules get() = moduleMap.values

src/main/kotlin/com/demonwav/mcdev/i18n/I18nFileListener.kt

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,32 +11,16 @@
1111
package com.demonwav.mcdev.i18n
1212

1313
import com.demonwav.mcdev.i18n.lang.I18nFileType
14-
import com.intellij.openapi.application.ApplicationManager
15-
import com.intellij.openapi.components.ApplicationComponent
16-
import com.intellij.openapi.vfs.VirtualFileManager
1714
import com.intellij.openapi.vfs.newvfs.BulkFileListener
1815
import com.intellij.openapi.vfs.newvfs.events.VFileEvent
1916
import com.intellij.ui.EditorNotifications
2017

21-
class I18nFileListener : ApplicationComponent, BulkFileListener {
22-
private val connection = ApplicationManager.getApplication().messageBus.connect()
23-
24-
override fun initComponent() {
25-
connection.subscribe(VirtualFileManager.VFS_CHANGES, this)
26-
}
27-
28-
override fun disposeComponent() {
29-
connection.disconnect()
30-
}
31-
32-
override fun before(events: List<VFileEvent>) {
33-
}
18+
object I18nFileListener : BulkFileListener {
19+
override fun before(events: List<VFileEvent>) {}
3420

3521
override fun after(events: List<VFileEvent>) {
3622
if (events.any { it.file?.fileType == I18nFileType }) {
3723
EditorNotifications.updateAll()
3824
}
3925
}
40-
41-
override fun getComponentName() = "I18nFileListener"
4226
}

src/main/kotlin/com/demonwav/mcdev/platform/AbstractModule.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,5 +83,6 @@ abstract class AbstractModule(protected val facet: MinecraftFacet) {
8383
return parameters.isNotEmpty() && refResolve != parameters[0]
8484
}
8585

86+
open fun init() {}
8687
open fun dispose() {}
8788
}

src/main/kotlin/com/demonwav/mcdev/platform/canary/CanaryModule.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ import com.demonwav.mcdev.platform.PlatformType
1919
import com.demonwav.mcdev.platform.canary.generation.CanaryGenerationData
2020
import com.demonwav.mcdev.platform.canary.util.CanaryConstants
2121
import com.demonwav.mcdev.util.nullable
22+
import com.demonwav.mcdev.util.runWriteTaskLater
23+
import com.intellij.lang.properties.PropertiesFileType
24+
import com.intellij.openapi.fileTypes.FileNameMatcher
25+
import com.intellij.openapi.fileTypes.FileTypeManager
2226
import com.intellij.openapi.project.Project
2327
import com.intellij.psi.JavaPsiFacade
2428
import com.intellij.psi.PsiAnnotationMemberValue
@@ -37,6 +41,15 @@ class CanaryModule<out T : AbstractModuleType<*>>(facet: MinecraftFacet, overrid
3741
var neptuneInf by nullable { facet.findFile(CanaryConstants.NEPTUNE_INF, SourceType.RESOURCE) }
3842
private set
3943

44+
override fun init() {
45+
runWriteTaskLater {
46+
FileTypeManager.getInstance().associate(PropertiesFileType.INSTANCE, object : FileNameMatcher {
47+
override fun accept(fileName: String) = fileName == CanaryConstants.CANARY_INF
48+
override fun getPresentableString() = CanaryConstants.CANARY_INF
49+
})
50+
}
51+
}
52+
4053
override fun isEventClassValid(eventClass: PsiClass, method: PsiMethod?) =
4154
CanaryConstants.HOOK_CLASS == eventClass.qualifiedName
4255

src/main/kotlin/com/demonwav/mcdev/platform/canary/CanaryProjectComponent.kt

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/main/kotlin/com/demonwav/mcdev/platform/forge/ForgeModule.kt

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,21 @@ import com.demonwav.mcdev.insight.generation.GenerationData
1717
import com.demonwav.mcdev.inspection.IsCancelled
1818
import com.demonwav.mcdev.platform.AbstractModule
1919
import com.demonwav.mcdev.platform.PlatformType
20+
import com.demonwav.mcdev.platform.forge.inspections.sideonly.SidedProxyAnnotator
2021
import com.demonwav.mcdev.platform.forge.util.ForgeConstants
2122
import com.demonwav.mcdev.util.extendsOrImplements
2223
import com.demonwav.mcdev.util.nullable
24+
import com.demonwav.mcdev.util.runWriteTaskLater
25+
import com.intellij.json.JsonFileType
26+
import com.intellij.openapi.application.runReadAction
27+
import com.intellij.openapi.fileTypes.FileNameMatcher
28+
import com.intellij.openapi.fileTypes.FileTypeManager
29+
import com.intellij.openapi.progress.DumbProgressIndicator
30+
import com.intellij.openapi.progress.ProgressIndicator
31+
import com.intellij.openapi.progress.ProgressManager
32+
import com.intellij.openapi.progress.Task
33+
import com.intellij.openapi.project.DumbAwareAction
34+
import com.intellij.openapi.project.DumbService
2335
import com.intellij.psi.JavaPsiFacade
2436
import com.intellij.psi.PsiClass
2537
import com.intellij.psi.PsiClassType
@@ -29,6 +41,7 @@ import com.intellij.psi.PsiMethod
2941
import com.intellij.psi.PsiMethodCallExpression
3042
import com.intellij.psi.PsiType
3143
import com.intellij.psi.search.GlobalSearchScope
44+
import com.intellij.psi.search.searches.AnnotatedElementsSearch
3245
import org.jetbrains.annotations.Contract
3346

3447
class ForgeModule internal constructor(facet: MinecraftFacet) : AbstractModule(facet) {
@@ -40,6 +53,38 @@ class ForgeModule internal constructor(facet: MinecraftFacet) : AbstractModule(f
4053
override val type = PlatformType.FORGE
4154
override val icon = PlatformAssets.FORGE_ICON
4255

56+
override fun init() {
57+
runWriteTaskLater {
58+
FileTypeManager.getInstance().associate(JsonFileType.INSTANCE, object : FileNameMatcher {
59+
override fun accept(fileName: String) = fileName == ForgeConstants.MCMOD_INFO
60+
override fun getPresentableString() = ForgeConstants.MCMOD_INFO
61+
})
62+
}
63+
64+
DumbService.getInstance(project).runWhenSmart {
65+
ProgressManager.getInstance().run(object : Task.Backgroundable(project, "Indexing @SidedProxy", true, null) {
66+
override fun run(indicator: ProgressIndicator) {
67+
runReadAction {
68+
indicator.isIndeterminate = true
69+
val scope = GlobalSearchScope.projectScope(myProject)
70+
val sidedProxy = JavaPsiFacade.getInstance(myProject)
71+
.findClass(ForgeConstants.SIDED_PROXY_ANNOTATION, scope) ?: return@runReadAction
72+
val annotatedFields = AnnotatedElementsSearch.searchPsiFields(sidedProxy, scope).findAll()
73+
74+
indicator.isIndeterminate = false
75+
var index = 0.0
76+
77+
for (field in annotatedFields) {
78+
SidedProxyAnnotator.check(field)
79+
index++
80+
indicator.fraction = index / annotatedFields.size
81+
}
82+
}
83+
}
84+
})
85+
}
86+
}
87+
4388
override fun isEventClassValid(eventClass: PsiClass, method: PsiMethod?): Boolean {
4489
if (method == null) {
4590
return ForgeConstants.FML_EVENT == eventClass.qualifiedName || ForgeConstants.EVENT == eventClass.qualifiedName

src/main/kotlin/com/demonwav/mcdev/platform/forge/ForgeProjectComponent.kt

Lines changed: 0 additions & 36 deletions
This file was deleted.

src/main/kotlin/com/demonwav/mcdev/platform/forge/inspections/sideonly/SideOnlyProjectComponent.kt

Lines changed: 0 additions & 61 deletions
This file was deleted.

src/main/kotlin/com/demonwav/mcdev/platform/mcp/McpModule.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,36 @@
1111
package com.demonwav.mcdev.platform.mcp
1212

1313
import com.demonwav.mcdev.facet.MinecraftFacet
14+
import com.demonwav.mcdev.i18n.I18nFileListener
1415
import com.demonwav.mcdev.platform.AbstractModule
1516
import com.demonwav.mcdev.platform.PlatformType
1617
import com.demonwav.mcdev.platform.mcp.srg.SrgManager
1718
import com.intellij.openapi.vfs.VirtualFile
19+
import com.intellij.openapi.vfs.VirtualFileManager
1820
import com.intellij.psi.PsiClass
1921
import com.intellij.psi.PsiMethod
22+
import com.intellij.util.messages.MessageBusConnection
2023
import javax.swing.Icon
2124

2225
class McpModule(facet: MinecraftFacet) : AbstractModule(facet) {
2326

27+
private lateinit var connection: MessageBusConnection
28+
2429
private val settings: McpModuleSettings = McpModuleSettings.getInstance(module)
2530
val accessTransformers = mutableSetOf<VirtualFile>()
2631

2732
var srgManager: SrgManager? = null
2833
private set
2934

30-
init {
35+
override fun init() {
3136
val files = getSettings().mappingFiles
3237
if (!files.isEmpty()) {
3338
srgManager = SrgManager.getInstance(files)
34-
srgManager!!.parse()
39+
srgManager?.parse()
3540
}
41+
42+
connection = project.messageBus.connect()
43+
connection.subscribe(VirtualFileManager.VFS_CHANGES, I18nFileListener)
3644
}
3745

3846
override val moduleType = McpModuleType
@@ -46,7 +54,7 @@ class McpModule(facet: MinecraftFacet) : AbstractModule(facet) {
4654
fun updateSettings(data: McpModuleSettings.State) {
4755
this.settings.loadState(data)
4856
srgManager = SrgManager.getInstance(data.mappingFiles)
49-
srgManager!!.parse()
57+
srgManager?.parse()
5058
}
5159

5260
fun addAccessTransformerFile(file: VirtualFile) {
@@ -56,6 +64,7 @@ class McpModule(facet: MinecraftFacet) : AbstractModule(facet) {
5664
override fun dispose() {
5765
super.dispose()
5866

67+
connection.disconnect()
5968
accessTransformers.clear()
6069
srgManager = null
6170
}

src/main/kotlin/com/demonwav/mcdev/transition/TransitionProjectComponent.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import com.intellij.openapi.project.Project
1818
class TransitionProjectComponent(project: Project) : AbstractProjectComponent(project) {
1919

2020
override fun projectOpened() {
21-
super.projectOpened()
2221
// Reset all Modules back to JavaModuleType
2322
for (module in ModuleManager.getInstance(project).modules) {
2423
for (type in types) {

0 commit comments

Comments
 (0)