User: rednesto Date: 17 Jul 24 12:55 Revision: 8d8b3acd4586ca9042c96f5408185ba519eecce9 Summary: Fix #2331 Support fabric.mod.json in test resources TeamCity URL: http://ci.mcdev.io:80/viewModification.html?tab=vcsModificationFiles&modId=9481&personal=false Index: src/main/kotlin/platform/fabric/reference/FabricModJsonResolveScopeEnlarger.kt =================================================================== --- src/main/kotlin/platform/fabric/reference/FabricModJsonResolveScopeEnlarger.kt (revision 1579723a3f7834ce8f03a090c6f9e06505da71b6) +++ src/main/kotlin/platform/fabric/reference/FabricModJsonResolveScopeEnlarger.kt (revision 8d8b3acd4586ca9042c96f5408185ba519eecce9) @@ -25,6 +25,7 @@ import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.ProjectRootManager import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.ResolveScopeEnlarger import com.intellij.psi.search.GlobalSearchScope @@ -49,11 +50,13 @@ val moduleScopes = mutableListOf() val moduleManager = ModuleManager.getInstance(project) val parentPath = module.name.substringBeforeLast('.') + val rootType = ProjectRootManager.getInstance(project).fileIndex.getContainingSourceRootType(file) + ?: return null for ((_, sourceSets) in modSourceSets) { for (sourceSet in sourceSets) { val childModule = moduleManager.findModuleByName("$parentPath.$sourceSet") if (childModule != null) { - moduleScopes.add(childModule.getModuleScope(false)) + moduleScopes.add(childModule.getModuleScope(rootType.isForTests)) } } } Index: src/main/kotlin/platform/fabric/reference/ResourceFileReference.kt =================================================================== --- src/main/kotlin/platform/fabric/reference/ResourceFileReference.kt (revision 1579723a3f7834ce8f03a090c6f9e06505da71b6) +++ src/main/kotlin/platform/fabric/reference/ResourceFileReference.kt (revision 8d8b3acd4586ca9042c96f5408185ba519eecce9) @@ -30,8 +30,9 @@ import com.intellij.openapi.application.runReadAction import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleManager +import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.project.rootManager -import com.intellij.openapi.roots.ModuleRootManager +import com.intellij.openapi.roots.ProjectRootManager import com.intellij.openapi.vfs.findPsiFile import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile @@ -54,24 +55,33 @@ private inner class Reference(desc: String, element: JsonStringLiteral) : PsiReferenceBase(element), InspectionReference { + + val isInTestSourceSet: Boolean = run { + val containingVFile = element.containingFile.originalFile.virtualFile + val inTestSourceContent = + ProjectRootManager.getInstance(element.project).fileIndex.isInTestSourceContent(containingVFile) + inTestSourceContent + } + override val description = desc override val unresolved = resolve() == null override fun resolve(): PsiElement? { fun findFileIn(module: Module): PsiFile? { val facet = MinecraftFacet.getInstance(module) ?: return null - val virtualFile = facet.findFile(element.value, SourceType.RESOURCE) ?: return null + var virtualFile = facet.findFile(element.value, SourceType.RESOURCE) + if (virtualFile == null && isInTestSourceSet) { + virtualFile = facet.findFile(element.value, SourceType.TEST_RESOURCE) + } + + if (virtualFile == null) { + return null + } + return PsiManager.getInstance(element.project).findFile(virtualFile) } - val module = element.findModule() ?: return null - return findFileIn(module) - ?: ModuleRootManager.getInstance(module) - .getDependencies(false) - .mapFirstNotNull(::findFileIn) - ?: ModuleManager.getInstance(element.project) - .getModuleDependentModules(module) - .mapFirstNotNull(::findFileIn) + return getRelevantModules().mapFirstNotNull(::findFileIn) } override fun bindToElement(newTarget: PsiElement): PsiElement? { @@ -87,13 +97,19 @@ return emptyArray() } - val module = element.findModule() ?: return emptyArray() val variants = mutableListOf() - val relevantModules = ModuleManager.getInstance(element.project).getModuleDependentModules(module) + module runReadAction { + val relevantModules = getRelevantModules() + + val relevantRootTypes = mutableSetOf(JavaResourceRootType.RESOURCE) + if (isInTestSourceSet) { + relevantRootTypes.add(JavaResourceRootType.TEST_RESOURCE) + } + val relevantRoots = relevantModules.flatMap { - it.rootManager.getSourceRoots(JavaResourceRootType.RESOURCE) + it.rootManager.getSourceRoots(relevantRootTypes) } + for (roots in relevantRoots) { for (child in roots.children) { val relativePath = child.path.removePrefix(roots.path) @@ -107,4 +123,15 @@ return variants.toTypedArray() } } + + private fun Reference.getRelevantModules(): Set { + val module = element.findModule() ?: return emptySet() + val relevantModules = mutableSetOf() + val moduleManager = ModuleManager.getInstance(element.project) + ModuleUtilCore.getDependencies(module, relevantModules) + relevantModules.flatMapTo(relevantModules) { + moduleManager.getModuleDependentModules(it) -} + } + return relevantModules + } +}