Skip to content

Commit 8577625

Browse files
committed
GROOVY-11642: include annotations and modifiers in inner class offset
1 parent ad477e1 commit 8577625

4 files changed

Lines changed: 151 additions & 80 deletions

File tree

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

Lines changed: 150 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,63 +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
24+
import org.codehaus.groovy.ast.stmt.BlockStatement
25+
import org.codehaus.groovy.ast.stmt.ExpressionStatement
2626
import org.codehaus.groovy.ast.stmt.Statement
27+
import org.codehaus.groovy.control.CompilePhase
28+
import org.junit.Test
2729

28-
import static org.codehaus.groovy.control.CompilePhase.CONVERSION
30+
final class AntlrParserPluginTest {
2931

30-
/**
31-
* Test for AntlrParserPlugin.
32-
*/
33-
class AntlrParserPluginTest 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+
}
40+
41+
@Test
42+
void testStatementsOnly() {
43+
def node = buildAST true, '''
44+
println 'hello world'
45+
'''
3446

35-
void testInnerClassLineNumbers() {
47+
assert node instanceof BlockStatement
48+
assert node.statements[0] instanceof ExpressionStatement
49+
}
3650

37-
def result = new AstBuilder().buildFromString CONVERSION, false, '''
51+
@Test
52+
void testAnonymousInnerClass() {
53+
ClassNode node = buildAST '''\
3854
new Object() {
3955
4056
}
4157
'''
4258

43-
assert result[2].getClass() == InnerClassNode
44-
assert result[2].lineNumber == 2
45-
assert result[2].lastLineNumber == 4
46-
assert result[2].columnNumber == 26
47-
assert result[2].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
4865
}
4966

50-
void testEnumLineNumbers() {
51-
def result = new AstBuilder().buildFromString CONVERSION, false, '''
52-
enum Color {
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()
5378

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+
}
5492
}
5593
'''
5694

57-
assert result[1].getClass() == ClassNode
58-
assert result[1].lineNumber == 2
59-
assert result[1].lastLineNumber == 4
60-
assert result[1].columnNumber == 13
61-
assert result[1].lastColumnNumber == 14
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
62101
}
63102

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 testField() {
131+
ClassNode node = buildAST '''\
132+
class C {
133+
@Deprecated
134+
protected
135+
int f =
136+
123
137+
}
138+
'''
139+
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+
}
157+
}
158+
'''
159+
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
166+
}
167+
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
64187
void testStatementAfterLabel() {
65-
def result = new AstBuilder().buildFromString CONVERSION, false, '''
188+
ClassNode node = buildAST '''
66189
def method() {
67190
label:
68191
assert i == 9
69192
}
70193
'''
71194

72-
assert result[1].getClass() == ClassNode
73-
MethodNode method = result[1].getMethods('method')[0]
74-
Statement statement = method.code.statements[0]
195+
Statement statement = node.getMethod('method').code.statements[0]
196+
75197
assert statement.lineNumber == 4
76-
assert statement.lastLineNumber == 4
77198
assert statement.columnNumber == 21
199+
assert statement.lastLineNumber == 4
78200
assert statement.lastColumnNumber == 34
79201
assert statement.statementLabels[0] == 'label'
80202
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1191,7 +1191,7 @@ public Void visitMemberDeclaration(final MemberDeclarationContext ctx) {
11911191
} else if (asBoolean(ctx.classDeclaration())) {
11921192
ctx.classDeclaration().putNodeMetaData(TYPE_DECLARATION_MODIFIERS, this.visitModifiersOpt(ctx.modifiersOpt()));
11931193
ctx.classDeclaration().putNodeMetaData(CLASS_DECLARATION_CLASS_NODE, classNode);
1194-
this.visitClassDeclaration(ctx.classDeclaration());
1194+
configureAST(this.visitClassDeclaration(ctx.classDeclaration()), ctx);
11951195
}
11961196

11971197
return null;

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import org.codehaus.groovy.ast.stmt.ExpressionStatement
3131
import org.codehaus.groovy.control.CompilerConfiguration
3232
import org.codehaus.groovy.syntax.Token
3333

34-
import static org.apache.groovy.parser.antlr4.TestUtils.doRunAndTest
3534
import static org.apache.groovy.parser.antlr4.TestUtils.doRunAndTestAntlr4
3635
import static org.apache.groovy.parser.antlr4.TestUtils.doTest
3736

@@ -429,7 +428,6 @@ final class GroovyParserTest extends GroovyTestCase {
429428
doRunAndTestAntlr4('bugs/GROOVY-3898.groovy')
430429
doRunAndTestAntlr4('bugs/GROOVY-8228.groovy')
431430
doRunAndTestAntlr4('bugs/BUG-GROOVY-8311.groovy')
432-
doRunAndTest('bugs/BUG-GROOVY-8426.groovy')
433431
doTest('bugs/BUG-GROOVY-8511.groovy')
434432
doRunAndTestAntlr4('bugs/BUG-GROOVY-8613.groovy')
435433
doTest('bugs/BUG-GROOVY-8641.groovy')

subprojects/parser-antlr4/src/test/resources/bugs/BUG-GROOVY-8426.groovy

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

0 commit comments

Comments
 (0)