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:37:00 UTC

[jira] [Updated] (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 ]

Daniil Ovchinnikov updated GROOVY-9209:
---------------------------------------
    Description: 
{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]

  was:
{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]


> 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
(v7.6.14#76016)