1616import java .util .List ;
1717
1818public class SingleLineStatementVisitor extends AbstractJavaSyntaxVisitor {
19+ // Minimal line number of visited statements
1920 protected int minLineNumber ;
21+ // Maximal line number of visited statements
2022 protected int maxLineNumber ;
23+ // Estimated number of statements if line numbers are unknown
24+ protected int statementCount ;
2125
2226 public void init () {
2327 minLineNumber = -2 ;
2428 maxLineNumber = -1 ;
29+ statementCount = 0 ;
2530 }
2631
2732 public boolean isSingleLineStatement () {
28- return minLineNumber == maxLineNumber ;
33+ if (minLineNumber <= 0 ) {
34+ // Line numbers are unknown
35+ return statementCount <= 1 ;
36+ } else {
37+ return minLineNumber == maxLineNumber ;
38+ }
2939 }
3040
41+ // -- Statement -- //
3142 @ Override
3243 public void visit (AssertStatement statement ) {
3344 statement .getCondition ().accept (this );
3445 safeAccept (statement .getMessage ());
3546 minLineNumber = statement .getCondition ().getLineNumber ();
47+ statementCount = 1 ;
3648 }
3749
3850 @ Override
3951 public void visit (DoWhileStatement statement ) {
4052 minLineNumber = statement .getCondition ().getLineNumber ();
4153 safeAccept (statement .getStatements ());
4254 statement .getCondition ().accept (this );
55+ statementCount = 2 ;
4356 }
4457
4558 @ Override
4659 public void visit (ExpressionStatement statement ) {
4760 statement .getExpression ().accept (this );
4861 minLineNumber = statement .getExpression ().getLineNumber ();
62+ statementCount = 1 ;
4963 }
5064
5165 @ Override
5266 public void visit (ForEachStatement statement ) {
5367 statement .getExpression ().accept (this );
5468 safeAccept (statement .getStatements ());
5569 minLineNumber = statement .getExpression ().getLineNumber ();
70+ statementCount = 2 ;
5671 }
5772
5873 @ Override
@@ -66,7 +81,7 @@ public void visit(ForStatement statement) {
6681 } else if (statement .getInit () != null ) {
6782 statement .getInit ().accept (this );
6883 } else {
69- maxLineNumber = Integer . MAX_VALUE ;
84+ maxLineNumber = 0 ;
7085 }
7186
7287 if (statement .getCondition () != null ) {
@@ -76,62 +91,73 @@ public void visit(ForStatement statement) {
7691 } else {
7792 minLineNumber = maxLineNumber ;
7893 }
94+
95+ statementCount = 2 ;
7996 }
8097
8198 @ Override
8299 public void visit (IfStatement statement ) {
83100 statement .getCondition ().accept (this );
84101 safeAccept (statement .getStatements ());
85102 minLineNumber = statement .getCondition ().getLineNumber ();
103+ statementCount = 2 ;
86104 }
87105
88106 @ Override
89107 public void visit (IfElseStatement statement ) {
90108 statement .getCondition ().accept (this );
91109 statement .getElseStatements ().accept (this );
92110 minLineNumber = statement .getCondition ().getLineNumber ();
111+ statementCount = 2 ;
93112 }
94113
95114 @ Override
96115 public void visit (LabelStatement statement ) {
97- minLineNumber = maxLineNumber = Integer . MAX_VALUE ;
116+ minLineNumber = maxLineNumber = 0 ;
98117 safeAccept (statement .getStatement ());
118+ statementCount = 1 ;
99119 }
100120
101121 @ Override
102122 public void visit (LambdaExpressionStatement statement ) {
103123 statement .getExpression ().accept (this );
104124 minLineNumber = statement .getExpression ().getLineNumber ();
125+ statementCount = 1 ;
105126 }
106127
107128 @ Override
108129 public void visit (LocalVariableDeclarationStatement statement ) {
109130 visit ((LocalVariableDeclaration ) statement );
131+ statementCount = 1 ;
110132 }
111133
112134 @ Override public void visit (ReturnExpressionStatement statement ) {
113135 statement .getExpression ().accept (this );
114136 minLineNumber = statement .getExpression ().getLineNumber ();
137+ statementCount = 1 ;
115138 }
116139
117140 @ Override
118141 public void visit (SwitchStatement statement ) {
119142 statement .getCondition ().accept (this );
120143 acceptListStatement (statement .getBlocks ());
121144 minLineNumber = statement .getCondition ().getLineNumber ();
145+ statementCount = 2 ;
122146 }
123147
124148 @ Override
125149 public void visit (SynchronizedStatement statement ) {
126150 statement .getMonitor ().accept (this );
127151 safeAccept (statement .getStatements ());
128152 minLineNumber = statement .getMonitor ().getLineNumber ();
153+ statementCount = 2 ;
129154 }
130155
131156 @ Override
132157 public void visit (ThrowStatement statement ) {
133158 statement .getExpression ().accept (this );
134159 minLineNumber = statement .getExpression ().getLineNumber ();
160+ statementCount = 1 ;
135161 }
136162
137163 @ Override
@@ -143,6 +169,7 @@ public void visit(TryStatement statement) {
143169 safeAcceptListStatement (statement .getCatchClauses ());
144170 safeAccept (statement .getFinallyStatements ());
145171 minLineNumber = min ;
172+ statementCount = 2 ;
146173 }
147174
148175 @ Override
@@ -152,22 +179,24 @@ public void visit(TryStatement.CatchClause statement) {
152179
153180 @ Override
154181 public void visit (TypeDeclarationStatement statement ) {
155- minLineNumber = maxLineNumber = Integer .MAX_VALUE ;
182+ minLineNumber = maxLineNumber = 0 ;
183+ statementCount = 1 ;
156184 }
157185
158186 @ Override
159187 public void visit (WhileStatement statement ) {
160188 statement .getCondition ().accept (this );
161189 safeAccept (statement .getStatements ());
162190 minLineNumber = statement .getCondition ().getLineNumber ();
191+ statementCount = 2 ;
163192 }
164193
165194 protected void acceptListStatement (List <? extends Statement > list ) {
166195 int size = list .size ();
167196
168197 switch (size ) {
169198 case 0 :
170- minLineNumber = maxLineNumber = Integer . MAX_VALUE ;
199+ minLineNumber = maxLineNumber = 0 ;
171200 break ;
172201 case 1 :
173202 list .get (0 ).accept (this );
@@ -180,18 +209,20 @@ protected void acceptListStatement(List<? extends Statement> list) {
180209 list .get (size - 1 ).accept (this );
181210
182211 minLineNumber = min ;
212+ statementCount = size ;
183213 break ;
184214 }
185215 }
186216
187217 protected void safeAcceptListStatement (List <? extends Statement > list ) {
188218 if (list == null ) {
189- minLineNumber = maxLineNumber = Integer . MAX_VALUE ;
219+ minLineNumber = maxLineNumber = 0 ;
190220 } else {
191221 acceptListStatement (list );
192222 }
193223 }
194224
225+ // -- Expression -- //
195226 @ Override
196227 public void visit (ConstructorInvocationExpression expression ) {
197228 BaseExpression parameters = expression .getParameters ();
@@ -249,7 +280,7 @@ public void visit(NewExpression expression) {
249280 parameters .accept (this );
250281 }
251282 } else {
252- maxLineNumber = Integer . MAX_VALUE ;
283+ maxLineNumber = expression . getLineNumber () + 1 ;
253284 }
254285 }
255286
@@ -262,7 +293,7 @@ protected void acceptListExpression(List<? extends Expression> list) {
262293 int size = list .size ();
263294
264295 if (size == 0 ) {
265- maxLineNumber = Integer . MAX_VALUE ;
296+ maxLineNumber = 0 ;
266297 } else {
267298 list .get (size - 1 ).accept (this );
268299 }
0 commit comments