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 <[email protected]>
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)

Reply via email to