You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Eric Milles (Jira)" <ji...@apache.org> on 2023/04/16 17:17:00 UTC

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

     [ https://issues.apache.org/jira/browse/GROOVY-9209?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Eric Milles closed GROOVY-9209.
-------------------------------
    Resolution: Information Provided

As noted, ClassNode#isResolved is not a sufficient check to determine if ClassNode#getTypeClass will or won't throw exception.  Caller of getTypeClass() needs to be prepared for null or throw.  It should be considered an internal API IMO.

> 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
>            Priority: Critical
>
> {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 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]



--
This message was sent by Atlassian Jira
(v8.20.10#820010)