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)