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 2024/01/14 17:07:00 UTC
[jira] [Commented] (GROOVY-11117) return first nested interface when GroovyClassLoader.parseClass parse interfaces with nested interfaces
[ https://issues.apache.org/jira/browse/GROOVY-11117?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17806497#comment-17806497 ]
Eric Milles commented on GROOVY-11117:
--------------------------------------
{{AstBuilder#visitClassDeclaration}} is doing this when it parses source. In your case, the outer class is an interface so it is not added to {{classNodeList}} until after its body is processed, so the inner class is added first.
{code:java}
// we put the class already in output to avoid the most inner classes
// will be used as first class later in the loader. The first class
// there determines what GCL#parseClass for example will return, so we
// have here to ensure it won't be the inner class
if (asBoolean(ctx.CLASS()) || asBoolean(ctx.TRAIT())) {
classNodeList.add(classNode);
}
classNodeStack.push(classNode);
ctx.classBody().putNodeMetaData(CLASS_DECLARATION_CLASS_NODE, classNode);
this.visitClassBody(ctx.classBody());
if (isRecord) {
classNode.getFields().stream().filter(f -> !isTrue(f, IS_RECORD_GENERATED) && !f.isStatic()).findFirst()
.ifPresent(fn -> this.createParsingFailedException("Instance field is not allowed in `record`", fn));
}
classNodeStack.pop();
if (!(asBoolean(ctx.CLASS()) || asBoolean(ctx.TRAIT()))) {
classNodeList.add(classNode);
}
{code}
> return first nested interface when GroovyClassLoader.parseClass parse interfaces with nested interfaces
> -------------------------------------------------------------------------------------------------------
>
> Key: GROOVY-11117
> URL: https://issues.apache.org/jira/browse/GROOVY-11117
> Project: Groovy
> Issue Type: Bug
> Reporter: Hai Shi
> Priority: Major
>
> When I have a groovy file:
> {code:groovy}
> interface A {
> interface B { }
> interface C { }
> }
> {code}
> When I use classLoader to parse this file, I only get the interface {{B}}
> {code:groovy}
> def gcl = new GroovyClassLoader()
> // this just get the interface B, Something Do I missed?
> def loadedClass = gcl.parseClass(new File("xxxx"))
> {code}
> my version:
> * jdk:18.0.1
> * groovy: 4.0.2
--
This message was sent by Atlassian Jira
(v8.20.10#820010)