Skip to content

Commit e17e3be

Browse files
committed
GROOVY-11642: include annotations and modifiers in inner class offset
1 parent 899d582 commit e17e3be

4 files changed

Lines changed: 144 additions & 84 deletions

File tree

src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1581,7 +1581,7 @@ public Void visitMemberDeclaration(final MemberDeclarationContext ctx) {
15811581
} else if (asBoolean(ctx.classDeclaration())) {
15821582
ctx.classDeclaration().putNodeMetaData(TYPE_DECLARATION_MODIFIERS, this.visitModifiersOpt(ctx.modifiersOpt()));
15831583
ctx.classDeclaration().putNodeMetaData(CLASS_DECLARATION_CLASS_NODE, classNode);
1584-
this.visitClassDeclaration(ctx.classDeclaration());
1584+
configureAST(this.visitClassDeclaration(ctx.classDeclaration()), ctx);
15851585
}
15861586

15871587
return null;

src/test-resources/bugs/BUG-GROOVY-8426.groovy

Lines changed: 0 additions & 49 deletions
This file was deleted.

src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import org.codehaus.groovy.syntax.Token
3232
import org.junit.jupiter.api.Disabled
3333
import org.junit.jupiter.api.Test
3434

35-
import static org.apache.groovy.parser.antlr4.TestUtils.doRunAndTest
3635
import static org.apache.groovy.parser.antlr4.TestUtils.doRunAndTestAntlr4
3736
import static org.apache.groovy.parser.antlr4.TestUtils.doTest
3837

@@ -537,7 +536,6 @@ final class GroovyParserTest {
537536
doTest('bugs/BUG-GROOVY-8161.groovy')
538537
doRunAndTestAntlr4('bugs/GROOVY-8228.groovy')
539538
doRunAndTestAntlr4('bugs/BUG-GROOVY-8311.groovy')
540-
doRunAndTest('bugs/BUG-GROOVY-8426.groovy')
541539
doTest('bugs/BUG-GROOVY-8511.groovy')
542540
doRunAndTestAntlr4('bugs/BUG-GROOVY-8613.groovy')
543541
doTest('bugs/BUG-GROOVY-8641.groovy')

src/test/groovy/org/codehaus/groovy/antlr/AstBuilderTest.groovy

Lines changed: 143 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,74 +18,185 @@
1818
*/
1919
package org.codehaus.groovy.antlr
2020

21-
import groovy.test.GroovyTestCase
21+
import org.codehaus.groovy.ast.ASTNode
2222
import org.codehaus.groovy.ast.ClassNode
23-
import org.codehaus.groovy.ast.InnerClassNode
24-
import org.codehaus.groovy.ast.MethodNode
2523
import org.codehaus.groovy.ast.builder.AstBuilder
2624
import org.codehaus.groovy.ast.stmt.BlockStatement
2725
import org.codehaus.groovy.ast.stmt.ExpressionStatement
2826
import org.codehaus.groovy.ast.stmt.Statement
27+
import org.codehaus.groovy.control.CompilePhase
28+
import org.junit.jupiter.api.Test
2929

30-
import static org.codehaus.groovy.control.CompilePhase.CONVERSION
30+
final class AstBuilderTest {
3131

32-
/**
33-
* Test for AstBuilder.
34-
*/
35-
class AstBuilderTest extends GroovyTestCase {
32+
private static ASTNode buildAST(boolean statementsOnly = false, String source) {
33+
List<ASTNode> nodes = new AstBuilder().buildFromString(CompilePhase.CONVERSION, statementsOnly, source)
34+
if (statementsOnly) {
35+
assert nodes.size() == 1
36+
return nodes[0] // stmts
37+
}
38+
nodes[1] // type
39+
}
3640

41+
@Test
3742
void testStatementsOnly() {
38-
def nodes = new AstBuilder().buildFromString CONVERSION, '''
43+
def node = buildAST true, '''
3944
println 'hello world'
4045
'''
4146

42-
assert nodes.size() == 1
43-
assert nodes[0] instanceof BlockStatement
44-
assert nodes[0].statements[0] instanceof ExpressionStatement
47+
assert node instanceof BlockStatement stmt
48+
&& stmt.statements[0] instanceof ExpressionStatement
4549
}
4650

47-
void testInnerClassLineNumbers() {
48-
def nodes = new AstBuilder().buildFromString CONVERSION, '''
51+
@Test
52+
void testAnonymousInnerClass() {
53+
ClassNode node = buildAST '''\
4954
new Object() {
5055
5156
}
5257
'''
5358

54-
assert nodes[1].getClass() == InnerClassNode
55-
assert nodes[1].lineNumber == 2
56-
assert nodes[1].lastLineNumber == 4
57-
assert nodes[1].columnNumber == 26
58-
assert nodes[1].lastColumnNumber == 14
59+
node = node.innerClasses.next()
60+
61+
assert node.lineNumber == 1
62+
assert node.columnNumber == 26 // TODO: 13
63+
assert node.lastLineNumber == 3
64+
assert node.lastColumnNumber == 14
65+
}
66+
67+
// GROOVY-11642
68+
@Test
69+
void testInnerClass1() {
70+
ClassNode outer = buildAST '''\
71+
class Outer {
72+
protected class Inner {
73+
}
74+
}
75+
'''
76+
77+
def inner = outer.innerClasses.next()
78+
79+
assert inner.lineNumber == 2
80+
assert inner.columnNumber == 17
81+
assert inner.lastLineNumber == 3
82+
assert inner.lastColumnNumber == 18
83+
}
84+
85+
// GROOVY-11642
86+
@Test
87+
void testInnerClass2() {
88+
ClassNode outer = buildAST '''\
89+
class Outer {
90+
@Deprecated class Inner {
91+
}
92+
}
93+
'''
94+
95+
def inner = outer.innerClasses.next()
96+
97+
assert inner.lineNumber == 2
98+
assert inner.columnNumber == 17
99+
assert inner.lastLineNumber == 3
100+
assert inner.lastColumnNumber == 18
101+
}
102+
103+
@Test
104+
void testClass() {
105+
ClassNode node = buildAST '''\
106+
public class C {
107+
}
108+
'''
109+
110+
assert node.lineNumber == 1
111+
assert node.columnNumber == 13
112+
assert node.lastLineNumber == 2
113+
assert node.lastColumnNumber == 14
114+
}
115+
116+
@Test
117+
void testEnum() {
118+
ClassNode node = buildAST '''\
119+
public enum E {
120+
}
121+
'''
122+
123+
assert node.lineNumber == 1
124+
assert node.columnNumber == 13
125+
assert node.lastLineNumber == 2
126+
assert node.lastColumnNumber == 14
59127
}
60128

61-
void testEnumLineNumbers() {
62-
def result = new AstBuilder().buildFromString CONVERSION, '''
63-
enum Color {
129+
@Test
130+
void testField() {
131+
ClassNode node = buildAST '''\
132+
class C {
133+
@Deprecated
134+
protected
135+
int f =
136+
123
137+
}
138+
'''
64139

140+
def field = node.getField('f')
141+
142+
assert field.lineNumber == 2
143+
assert field.columnNumber == 17
144+
assert field.lastLineNumber == 5
145+
assert field.lastColumnNumber == 20
146+
}
147+
148+
@Test
149+
void testMethod() {
150+
ClassNode node = buildAST '''\
151+
class C {
152+
@Deprecated
153+
protected
154+
void
155+
m(){
156+
}
65157
}
66158
'''
67159

68-
assert result[1].getClass() == ClassNode
69-
assert result[1].lineNumber == 2
70-
assert result[1].lastLineNumber == 4
71-
assert result[1].columnNumber == 13
72-
assert result[1].lastColumnNumber == 14
160+
def method = node.getMethod('m')
161+
162+
assert method.lineNumber == 2
163+
assert method.columnNumber == 17
164+
assert method.lastLineNumber == 6
165+
assert method.lastColumnNumber == 18
73166
}
74167

168+
// GROOVY-8426
169+
@Test
170+
void testMethodBlock() {
171+
ClassNode node = buildAST '''
172+
def method() {
173+
'return value'
174+
175+
}
176+
'''
177+
178+
Statement statement = node.getMethod('method').code
179+
180+
assert statement.lineNumber == 2
181+
assert statement.columnNumber == 26
182+
assert statement.lastLineNumber == 5
183+
assert statement.lastColumnNumber == 14
184+
}
185+
186+
@Test
75187
void testStatementAfterLabel() {
76-
def nodes = new AstBuilder().buildFromString CONVERSION, false, '''
188+
ClassNode node = buildAST '''
77189
def method() {
78190
label:
79191
assert i == 9
80192
}
81193
'''
82194

83-
assert nodes[1].getClass() == ClassNode
84-
MethodNode method = nodes[1].getMethods('method')[0]
85-
Statement statement = method.code.statements[0]
195+
Statement statement = node.getMethod('method').code.statements[0]
196+
86197
assert statement.lineNumber == 4
87-
assert statement.lastLineNumber == 4
88198
assert statement.columnNumber == 21
199+
assert statement.lastLineNumber == 4
89200
assert statement.lastColumnNumber == 34
90201
assert statement.statementLabels[0] == 'label'
91202
}

0 commit comments

Comments
 (0)