Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-9209

Compiler throws an exception in ClassNode#getTypeClass after checking ClassNode#isResolved

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Open
    • Priority: Critical
    • Resolution: Unresolved
    • Affects Version/s: 2.5.6
    • Fix Version/s: None
    • Component/s: Compiler
    • Labels:
      None
    • Environment:
      intellij idea

      Description

      Error:Groovyc: While compiling mn-gorm-example.main: BUG! exception in phase 'canonicalization' in source unit '/Users/pditommaso/Projects/mn-gorm-example/src/main/groovy/example/gorm/Bootstrap.groovy' JVM class can't be loaded for example.gorm.service.PersonService
      	at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveJvmClass(AsmReferenceResolver.java:86)
      	at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.getTypeClass(DecompiledClassNode.java:175)
      	at org.codehaus.groovy.ast.ClassNode.getTypeClass(ClassNode.java:1381)
      	at io.micronaut.ast.groovy.InjectTransform$InjectVisitor.resolveParameterType(InjectTransform.groovy:1117)
      ...
      
      InjectVisitor#resolveParameterType
      ClassNode parameterType = parameter.type
      if (parameterType.isResolved()) {
        parameterType.typeClass // here 
      } else {
        parameterType.name
      }
      

      Code: https://github.com/pditommaso/mn-gorm-example
      Steps to reproduce:
      1. make sure the build is not delegated to Gradle in Preferences | Build, Execution, Deployment | Build Tools | Gradle
      2. rebuild project
      3. make changes in Person.groovy and Bootstrap.groovy (to mark them as subject for recompilation)
      4. build project

      What happens with -Dgroovyc.asm.resolving.only=false:
      1. Bootstrap.groovy and Person.groovy are added to CompilationUnit#queuedSources
      2. ResolveVisitor visits Bootstrap.groovy and tries to load PersonService
      3. asmResolving flag is set to false by IntelliJ, this results in skipping findDecompiled call inside ClassNodeResolver#tryAsLoaderClassOrScript
      4. the PersonService class fails to load because of missing Person class
      5. tryAsScript kicks in and adds PersonService to CompilationUnit#queuedSources
      6. when it comes to Micronaut ClassNode#isResolved returns false for PersonService

      What happens without -Dgroovyc.asm.resolving.only=false:
      1. same
      2. same
      3. asmResolving is not set by IntellliJ
      4. findDecompiled returns DecompiledClassNode for PersonService
      5. when it comes to Micronaut ClassNode#isResolved returns true for PersonService, and this results in an exception because the class cannot be loaded actually.

      I've tried to fix it in the compiler but I'm not sure what's the proper fix would be.
      Please let me know if I can do something within IntelliJ.
      The issue in JB YouTrack for the reference: https://youtrack.jetbrains.com/issue/IDEA-218698

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              daniilo Daniil Ovchinnikov
            • Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

              • Created:
                Updated: