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

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

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Critical
    • Resolution: Information Provided
    • 2.5.6
    • None
    • Compiler
    • None
    • 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

            Unassigned Unassigned
            daniilo Daniil Ovchinnikov
            Votes:
            1 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: