Skip to content

Commit 0d6ad7e

Browse files
committed
GROOVY-11642: include annotations and modifiers in inner class offset
1 parent 71ca3e0 commit 0d6ad7e

4 files changed

Lines changed: 125 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: 124 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,74 +18,166 @@
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
127+
}
128+
129+
@Test
130+
void testMethod1() {
131+
ClassNode node = buildAST '''\
132+
class C {
133+
@Deprecated
134+
protected
135+
void
136+
m(){
137+
}
138+
}
139+
'''
140+
141+
def method = node.getMethod('m')
142+
143+
assert method.lineNumber == 2
144+
assert method.columnNumber == 17
145+
assert method.lastLineNumber == 6
146+
assert method.lastColumnNumber == 18
59147
}
60148

61-
void testEnumLineNumbers() {
62-
def result = new AstBuilder().buildFromString CONVERSION, '''
63-
enum Color {
149+
// GROOVY-8426
150+
@Test
151+
void testMethod2() {
152+
ClassNode node = buildAST '''
153+
def method() {
154+
'return value'
64155
65156
}
66157
'''
67158

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
159+
Statement statement = node.getMethod('method').code
160+
161+
assert statement.lineNumber == 2
162+
assert statement.columnNumber == 26
163+
assert statement.lastLineNumber == 5
164+
assert statement.lastColumnNumber == 14
73165
}
74166

167+
@Test
75168
void testStatementAfterLabel() {
76-
def nodes = new AstBuilder().buildFromString CONVERSION, false, '''
169+
ClassNode node = buildAST '''
77170
def method() {
78171
label:
79172
assert i == 9
80173
}
81174
'''
82175

83-
assert nodes[1].getClass() == ClassNode
84-
MethodNode method = nodes[1].getMethods('method')[0]
85-
Statement statement = method.code.statements[0]
176+
Statement statement = node.getMethod('method').code.statements[0]
177+
86178
assert statement.lineNumber == 4
87-
assert statement.lastLineNumber == 4
88179
assert statement.columnNumber == 21
180+
assert statement.lastLineNumber == 4
89181
assert statement.lastColumnNumber == 34
90182
assert statement.statementLabels[0] == 'label'
91183
}

0 commit comments

Comments
 (0)