You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Daniil Ovchinnikov (JIRA)" <ji...@apache.org> on 2019/07/29 18:35:00 UTC

[jira] [Created] (GROOVY-9209) Compiler throws an exception in ClassNode#getTypeClass after checking ClassNode#isResolved

Daniil Ovchinnikov created GROOVY-9209:
------------------------------------------

             Summary: Compiler throws an exception in ClassNode#getTypeClass after checking ClassNode#isResolved
                 Key: GROOVY-9209
                 URL: https://issues.apache.org/jira/browse/GROOVY-9209
             Project: Groovy
          Issue Type: Bug
          Components: Compiler
    Affects Versions: 2.5.6
         Environment: intellij idea
            Reporter: Daniil Ovchinnikov


{noformat}
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)
...
{noformat}
{code:java|title=InjectVisitor#resolveParameterType}
ClassNode parameterType = parameter.type
if (parameterType.isResolved()) {
  parameterType.typeClass // here 
} else {
  parameterType.name
}
{code}
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 with {{asmResolving}}:
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]



--
This message was sent by Atlassian JIRA
(v7.6.14#76016)