You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by jd...@apache.org on 2026/07/20 19:10:03 UTC

(grails-intellij-plugin) branch main updated: Fix toolbar resolution

This is an automated email from the ASF dual-hosted git repository.

jdaugherty pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/grails-intellij-plugin.git


The following commit(s) were added to refs/heads/main by this push:
     new b19e81b  Fix toolbar resolution
b19e81b is described below

commit b19e81bac9756131f29ac1488a5c8f4b967c772a
Author: James Daugherty <jd...@jdresources.net>
AuthorDate: Mon Jul 20 14:07:48 2026 -0500

    Fix toolbar resolution
---
 .../builder/GrailsModuleModelBuilderImpl.java      | 14 +++++++++++--
 .../plugins/grails/actions/GrailsActionUtil.kt     | 22 ++++++++++++---------
 .../grails/structure/GrailsApplicationManager.java |  1 +
 .../structure/impl/Grails3ApplicationProvider.kt   | 23 ++++++++++++++++++----
 4 files changed, 45 insertions(+), 15 deletions(-)

diff --git a/gradle-tooling/src/org/jetbrains/plugins/grails/gradle/tooling/builder/GrailsModuleModelBuilderImpl.java b/gradle-tooling/src/org/jetbrains/plugins/grails/gradle/tooling/builder/GrailsModuleModelBuilderImpl.java
index a2ba3c9..e397813 100644
--- a/gradle-tooling/src/org/jetbrains/plugins/grails/gradle/tooling/builder/GrailsModuleModelBuilderImpl.java
+++ b/gradle-tooling/src/org/jetbrains/plugins/grails/gradle/tooling/builder/GrailsModuleModelBuilderImpl.java
@@ -45,11 +45,20 @@ public class GrailsModuleModelBuilderImpl implements ModelBuilderService {
     if (context == null) return null;
 
     GrailsVersionInfo grailsVersionInfo = context.myGrailsVersionInfo;
-    DefaultExternalModuleDependency dependency = new DefaultExternalModuleDependency(grailsVersionInfo.gradleDependencyGroup, grailsVersionInfo.shellArtifactId, null);
+
+    // Prefer the explicit grailsVersion project property. This must be known before adding the shell
+    // dependency: the shell artifact is not always version-managed by the platform/BOM (e.g. Grails 7's
+    // org.apache.grails:grails-shell-cli), so adding it without a version fails to resolve and the whole
+    // model build throws, leaving the module untagged as a Grails module.
+    String version = (String) project.getProperties().get("grailsVersion");
+
     Configuration configuration = getConfiguration(project);
+    DefaultExternalModuleDependency dependency = new DefaultExternalModuleDependency(
+      grailsVersionInfo.gradleDependencyGroup,
+      grailsVersionInfo.shellArtifactId,
+      (version == null || version.isEmpty()) ? null : version);
     configuration.getDependencies().add(dependency);
 
-    String version = (String) project.getProperties().get("grailsVersion");
     if (version == null || version.isEmpty()) {
       version = configuration.getResolvedConfiguration().getFirstLevelModuleDependencies()
         .stream()
@@ -97,6 +106,7 @@ public class GrailsModuleModelBuilderImpl implements ModelBuilderService {
      *
      */
     private static final String[] GRAILS_PLUGIN_NAME_ARRAY = {
+      "grails-app",
       "grails-core",
       "grails-plugin",
       "grails-web",
diff --git a/src/org/jetbrains/plugins/grails/actions/GrailsActionUtil.kt b/src/org/jetbrains/plugins/grails/actions/GrailsActionUtil.kt
index f8e5e2f..70dd0c1 100644
--- a/src/org/jetbrains/plugins/grails/actions/GrailsActionUtil.kt
+++ b/src/org/jetbrains/plugins/grails/actions/GrailsActionUtil.kt
@@ -48,13 +48,16 @@ class ArtefactData(
     val isView: Boolean = false
 )
 
+private val LOG = com.intellij.openapi.diagnostic.logger<ArtefactData>()
+
 fun getArtefactData(context: DataContext?): ArtefactData? {
-  if (context == null) return null
-  val project = context.getData(LangDataKeys.PROJECT) ?: return null
-  if (DumbService.isDumb(project)) return null
-  val module = context.getData(PlatformCoreDataKeys.MODULE) ?: return null
-  val file = context.getData(LangDataKeys.VIRTUAL_FILE) ?: return null
-  val application = GrailsApplicationManager.getInstance(project).findApplication(file) ?: return null
+  if (context == null) { LOG.warn("GRAILS-DBG getArtefactData: context is null"); return null }
+  val project = context.getData(LangDataKeys.PROJECT) ?: run { LOG.warn("GRAILS-DBG getArtefactData: PROJECT null"); return null }
+  if (DumbService.isDumb(project)) { LOG.warn("GRAILS-DBG getArtefactData: dumb mode"); return null }
+  val module = context.getData(PlatformCoreDataKeys.MODULE) ?: run { LOG.warn("GRAILS-DBG getArtefactData: MODULE null"); return null }
+  val file = context.getData(LangDataKeys.VIRTUAL_FILE) ?: run { LOG.warn("GRAILS-DBG getArtefactData: VIRTUAL_FILE null"); return null }
+  val application = GrailsApplicationManager.getInstance(project).findApplication(file) ?: run { LOG.warn("GRAILS-DBG getArtefactData: findApplication null for ${file.name}"); return null }
+  LOG.warn("GRAILS-DBG getArtefactData: passed gates for ${file.name}, module=${module.name}")
   val publicClass = GroovyUtils.getPublicClass(project, file)
 
   val isView: Boolean
@@ -76,11 +79,12 @@ fun getArtefactData(context: DataContext?): ArtefactData? {
     else {
       publicClass
     }
-    artefactClass ?: return null
+    artefactClass ?: run { LOG.warn("GRAILS-DBG getArtefactData: artefactClass null"); return null }
     isView = false
-    packageName = StringUtil.getPackageName(artefactClass.qualifiedName ?: return null)
-    artefactName = GrailsArtifact.getType(artefactClass)?.getArtifactName(artefactClass) ?: return null
+    packageName = StringUtil.getPackageName(artefactClass.qualifiedName ?: run { LOG.warn("GRAILS-DBG getArtefactData: qualifiedName null"); return null })
+    artefactName = GrailsArtifact.getType(artefactClass)?.getArtifactName(artefactClass) ?: run { LOG.warn("GRAILS-DBG getArtefactData: artifact type/name null for ${artefactClass.qualifiedName}"); return null }
   }
+  LOG.warn("GRAILS-DBG getArtefactData: SUCCESS name=$artefactName isView=$isView")
 
   return ArtefactData(project, module, file, packageName, artefactName, application, isView)
 }
diff --git a/src/org/jetbrains/plugins/grails/structure/GrailsApplicationManager.java b/src/org/jetbrains/plugins/grails/structure/GrailsApplicationManager.java
index c78c949..1c3d30b 100644
--- a/src/org/jetbrains/plugins/grails/structure/GrailsApplicationManager.java
+++ b/src/org/jetbrains/plugins/grails/structure/GrailsApplicationManager.java
@@ -152,6 +152,7 @@ public final class GrailsApplicationManager implements ModificationTracker, Disp
     ProgressManager.checkCanceled();
     final Collection<VirtualFile> appRoots = FilenameIndex
       .getVirtualFilesByName("grails-app", GlobalSearchScope.allScope(myProject));
+    LOG.warn("GRAILS-DBG doGetApplications: found " + appRoots.size() + " grails-app roots: " + ContainerUtil.map(appRoots, VirtualFile::getPath));
     if (appRoots.isEmpty()) return Collections.emptyMap();
 
     final Map<VirtualFile, GrailsApplication> result = new HashMap<>();
diff --git a/src/org/jetbrains/plugins/grails/structure/impl/Grails3ApplicationProvider.kt b/src/org/jetbrains/plugins/grails/structure/impl/Grails3ApplicationProvider.kt
index 7a490d5..9b65942 100644
--- a/src/org/jetbrains/plugins/grails/structure/impl/Grails3ApplicationProvider.kt
+++ b/src/org/jetbrains/plugins/grails/structure/impl/Grails3ApplicationProvider.kt
@@ -28,19 +28,34 @@ import org.jetbrains.plugins.grails.gradle.GrailsModuleData
 import org.jetbrains.plugins.grails.structure.GrailsApplication
 import org.jetbrains.plugins.grails.structure.GrailsApplicationProvider
 
+private val LOG = com.intellij.openapi.diagnostic.logger<Grails3ApplicationProvider>()
+
 class Grails3ApplicationProvider : GrailsApplicationProvider() {
 
   override fun createApplication(project: Project, root: VirtualFile): GrailsApplication? {
     val path = root.path
 
     val settings = ExternalSystemApiUtil.getSettings(project, SYSTEM_ID)
-    val linkedProjectSettings = settings.getLinkedProjectSettings(path) as? GradleProjectSettings ?: return null
+    val linkedProjectSettings = settings.getLinkedProjectSettings(path) as? GradleProjectSettings ?: run {
+      LOG.warn("GRAILS-DBG createApplication: no linkedProjectSettings for path=$path; linked=${settings.linkedProjectsSettings.map { it.externalProjectPath }}")
+      return null
+    }
     val gradleProjectInfo = ProjectDataManager.getInstance().getExternalProjectData(
         project, SYSTEM_ID, linkedProjectSettings.externalProjectPath
-    ) ?: return null
+    ) ?: run {
+      LOG.warn("GRAILS-DBG createApplication: no externalProjectData for ${linkedProjectSettings.externalProjectPath}")
+      return null
+    }
 
-    val moduleData = findModule(gradleProjectInfo.externalProjectStructure, path) ?: return null
-    if (ExternalSystemApiUtil.find(moduleData, GrailsModuleData.KEY) == null) return null
+    val moduleData = findModule(gradleProjectInfo.externalProjectStructure, path) ?: run {
+      LOG.warn("GRAILS-DBG createApplication: findModule null for path=$path")
+      return null
+    }
+    if (ExternalSystemApiUtil.find(moduleData, GrailsModuleData.KEY) == null) {
+      LOG.warn("GRAILS-DBG createApplication: no GrailsModuleData for path=$path")
+      return null
+    }
+    LOG.warn("GRAILS-DBG createApplication: SUCCESS for path=$path")
 
     return if (linkedProjectSettings.isResolveModulePerSourceSet) {
       Grails3MultiModuleApplication(project, root, moduleData)