Skip to content

Commit ed3b446

Browse files
committed
replace getChild(0) with getFirstChild(), getNextSibling()
1 parent 27fb990 commit ed3b446

File tree

1 file changed

+88
-69
lines changed

1 file changed

+88
-69
lines changed

cxx-squid/src/main/java/org/sonar/cxx/preprocessor/ExpressionEvaluator.java

Lines changed: 88 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ private BigInteger evalOneChildAst(AstNode exprAst) {
110110
if ("bool".equals(nodeType)) {
111111
return evalBool(exprAst.getTokenValue());
112112
}
113-
return evalToInt(exprAst.getChild(0)); //@todo deprecated getChild
113+
return evalToInt(exprAst.getFirstChild());
114114
}
115115

116116
private BigInteger evalComplexAst(AstNode exprAst) {
@@ -176,33 +176,45 @@ BigInteger evalCharacter(String charValue) {
176176
return "'\0'".equals(charValue) ? BigInteger.ZERO : BigInteger.ONE;
177177
}
178178

179+
AstNode getNextOperand(AstNode node) {
180+
if( node != null) {
181+
node = node.getNextSibling();
182+
if( node != null) {
183+
node = node.getNextSibling();
184+
}
185+
}
186+
return node;
187+
}
188+
179189
// ////////////// logical expressions ///////////////////////////
180190
BigInteger evalLogicalOrExpression(AstNode exprAst) {
181-
int noChildren = exprAst.getNumberOfChildren();
182-
boolean result = eval(exprAst.getChild(0)); //@todo deprecated getChild
183-
for (int i = 2; i < noChildren && result != true; i += 2) {
184-
AstNode operand = exprAst.getChild(i); //@todo deprecated getChild
191+
AstNode operand = exprAst.getFirstChild();
192+
boolean result = eval(operand);
193+
194+
while ((result != true) && ((operand = getNextOperand(operand)) != null)) {
185195
result = result || eval(operand);
186196
}
187197

188198
return result ? BigInteger.ONE : BigInteger.ZERO;
189199
}
190200

191201
BigInteger evalLogicalAndExpression(AstNode exprAst) {
192-
int noChildren = exprAst.getNumberOfChildren();
193-
boolean result = eval(exprAst.getChild(0)); //@todo deprecated getChild
194-
for (int i = 2; i < noChildren && result != false; i += 2) {
195-
AstNode operand = exprAst.getChild(i); //@todo deprecated getChild
202+
AstNode operand = exprAst.getFirstChild();
203+
boolean result = eval(operand);
204+
205+
while ((result != false) && ((operand = getNextOperand(operand)) != null)) {
196206
result = result && eval(operand);
197207
}
198208

199209
return result ? BigInteger.ONE : BigInteger.ZERO;
200210
}
201211

202212
BigInteger evalEqualityExpression(AstNode exprAst) {
203-
String operator = exprAst.getChild(1).getTokenValue(); //@todo deprecated getChild
204-
AstNode lhs = exprAst.getChild(0); //@todo deprecated getChild
205-
AstNode rhs = exprAst.getChild(2); //@todo deprecated getChild
213+
AstNode lhs = exprAst.getFirstChild();
214+
AstNode op = lhs.getNextSibling();
215+
AstNode rhs = op.getNextSibling();
216+
String operator = op.getTokenValue();
217+
206218
boolean result;
207219
if ("==".equals(operator)) {
208220
result = evalToInt(lhs).compareTo(evalToInt(rhs)) == 0;
@@ -212,10 +224,9 @@ BigInteger evalEqualityExpression(AstNode exprAst) {
212224
throw new EvaluationException("Unknown equality operator '" + operator + "'");
213225
}
214226

215-
int noChildren = exprAst.getNumberOfChildren();
216-
for (int i = 4; i < noChildren; i += 2) {
217-
operator = exprAst.getChild(i - 1).getTokenValue(); //@todo deprecated getChild
218-
rhs = exprAst.getChild(i); //@todo deprecated getChild
227+
while ((op = rhs.getNextSibling()) != null) {
228+
operator = op.getTokenValue();
229+
rhs = op.getNextSibling();
219230
if ("==".equals(operator)) {
220231
result = result == eval(rhs);
221232
} else if ("!=".equals(operator)) {
@@ -229,9 +240,11 @@ BigInteger evalEqualityExpression(AstNode exprAst) {
229240
}
230241

231242
BigInteger evalRelationalExpression(AstNode exprAst) {
232-
String operator = exprAst.getChild(1).getTokenValue(); //@todo deprecated getChild
233-
AstNode lhs = exprAst.getChild(0); //@todo deprecated getChild
234-
AstNode rhs = exprAst.getChild(2); //@todo deprecated getChild
243+
AstNode lhs = exprAst.getFirstChild();
244+
AstNode op = lhs.getNextSibling();
245+
AstNode rhs = op.getNextSibling();
246+
String operator = op.getTokenValue();
247+
235248
boolean result;
236249
if ("<".equals(operator)) {
237250
result = evalToInt(lhs).compareTo(evalToInt(rhs)) < 0;
@@ -246,10 +259,9 @@ BigInteger evalRelationalExpression(AstNode exprAst) {
246259
}
247260

248261
BigInteger resultAsInt;
249-
int noChildren = exprAst.getNumberOfChildren();
250-
for (int i = 4; i < noChildren; i += 2) {
251-
operator = exprAst.getChild(i - 1).getTokenValue(); //@todo deprecated getChild
252-
rhs = exprAst.getChild(i); //@todo deprecated getChild
262+
while ((op = rhs.getNextSibling()) != null) {
263+
operator = op.getTokenValue();
264+
rhs = op.getNextSibling();
253265

254266
resultAsInt = result ? BigInteger.ONE : BigInteger.ZERO;
255267
if ("<".equals(operator)) {
@@ -270,32 +282,32 @@ BigInteger evalRelationalExpression(AstNode exprAst) {
270282

271283
// ///////////////// bitwise expressions ///////////////////////
272284
BigInteger evalAndExpression(AstNode exprAst) {
273-
int noChildren = exprAst.getNumberOfChildren();
274-
BigInteger result = evalToInt(exprAst.getChild(0)); //@todo deprecated getChild
275-
for (int i = 2; i < noChildren; i += 2) {
276-
AstNode operand = exprAst.getChild(i); //@todo deprecated getChild
285+
AstNode operand = exprAst.getFirstChild();
286+
BigInteger result = evalToInt(operand);
287+
288+
while ((operand = getNextOperand(operand)) != null) {
277289
result = result.and(evalToInt(operand));
278290
}
279291

280292
return result;
281293
}
282294

283295
BigInteger evalInclusiveOrExpression(AstNode exprAst) {
284-
int noChildren = exprAst.getNumberOfChildren();
285-
BigInteger result = evalToInt(exprAst.getChild(0)); //@todo deprecated getChild
286-
for (int i = 2; i < noChildren; i += 2) {
287-
AstNode operand = exprAst.getChild(i); //@todo deprecated getChild
296+
AstNode operand = exprAst.getFirstChild();
297+
BigInteger result = evalToInt(operand);
298+
299+
while ((operand = getNextOperand(operand)) != null) {
288300
result = result.or(evalToInt(operand));
289301
}
290302

291303
return result;
292304
}
293305

294306
BigInteger evalExclusiveOrExpression(AstNode exprAst) {
295-
int noChildren = exprAst.getNumberOfChildren();
296-
BigInteger result = evalToInt(exprAst.getChild(0)); //@todo deprecated getChild
297-
for (int i = 2; i < noChildren; i += 2) {
298-
AstNode operand = exprAst.getChild(i); //@todo deprecated getChild
307+
AstNode operand = exprAst.getFirstChild();
308+
BigInteger result = evalToInt(operand);
309+
310+
while ((operand = getNextOperand(operand)) != null) {
299311
result = result.xor(evalToInt(operand));
300312
}
301313

@@ -306,8 +318,10 @@ BigInteger evalExclusiveOrExpression(AstNode exprAst) {
306318
BigInteger evalUnaryExpression(AstNode exprAst) {
307319
// only 'unary-operator cast-expression' production is allowed in #if-context
308320

309-
String operator = exprAst.getChild(0).getTokenValue(); //@todo deprecated getChild
310-
AstNode operand = exprAst.getChild(1); //@todo deprecated getChild
321+
AstNode op = exprAst.getFirstChild();
322+
AstNode operand = op.getNextSibling();
323+
String operator = op.getTokenValue();
324+
311325
if ("+".equals(operator)) {
312326
return evalToInt(operand);
313327
} else if ("-".equals(operator)) {
@@ -324,17 +338,15 @@ BigInteger evalUnaryExpression(AstNode exprAst) {
324338
}
325339

326340
BigInteger evalShiftExpression(AstNode exprAst) {
327-
String operator;
328-
AstNode rhs;
329-
BigInteger result = evalToInt(exprAst.getChild(0)); //@todo deprecated getChild
330-
int noChildren = exprAst.getNumberOfChildren();
341+
AstNode rhs = exprAst.getFirstChild();
342+
AstNode op;
343+
BigInteger result = evalToInt(rhs);
331344

332-
for (int i = 2; i < noChildren; i += 2) {
333-
operator = exprAst.getChild(i - 1).getTokenValue(); //@todo deprecated getChild
334-
rhs = exprAst.getChild(i); //@todo deprecated getChild
345+
while ((op = rhs.getNextSibling()) != null) {
346+
String operator = op.getTokenValue();
347+
rhs = op.getNextSibling();
335348

336349
if ("<<".equals(operator)) {
337-
//todo: limit to UINT64_MAX?
338350
result = result.shiftLeft(evalToInt(rhs).intValue()).and(UINT64_MAX);
339351
} else if (">>".equals(operator)) {
340352
result = result.shiftRight(evalToInt(rhs).intValue());
@@ -347,14 +359,13 @@ BigInteger evalShiftExpression(AstNode exprAst) {
347359
}
348360

349361
BigInteger evalAdditiveExpression(AstNode exprAst) {
350-
String operator;
351-
AstNode rhs;
352-
BigInteger result = evalToInt(exprAst.getChild(0)); //@todo deprecated getChild
353-
int noChildren = exprAst.getNumberOfChildren();
362+
AstNode rhs = exprAst.getFirstChild();
363+
AstNode op;
364+
BigInteger result = evalToInt(rhs);
354365

355-
for (int i = 2; i < noChildren; i += 2) {
356-
operator = exprAst.getChild(i - 1).getTokenValue(); //@todo deprecated getChild
357-
rhs = exprAst.getChild(i); //@todo deprecated getChild
366+
while ((op = rhs.getNextSibling()) != null) {
367+
String operator = op.getTokenValue();
368+
rhs = op.getNextSibling();
358369

359370
if ("+".equals(operator)) {
360371
result = result.add(evalToInt(rhs));
@@ -369,14 +380,13 @@ BigInteger evalAdditiveExpression(AstNode exprAst) {
369380
}
370381

371382
BigInteger evalMultiplicativeExpression(AstNode exprAst) {
372-
String operator;
373-
AstNode rhs;
374-
BigInteger result = evalToInt(exprAst.getChild(0)); //@todo deprecated getChild
375-
int noChildren = exprAst.getNumberOfChildren();
383+
AstNode rhs = exprAst.getFirstChild();
384+
AstNode op;
385+
BigInteger result = evalToInt(rhs);
376386

377-
for (int i = 2; i < noChildren; i += 2) {
378-
operator = exprAst.getChild(i - 1).getTokenValue(); //@todo deprecated getChild
379-
rhs = exprAst.getChild(i); //@todo deprecated getChild
387+
while ((op = rhs.getNextSibling()) != null) {
388+
String operator = op.getTokenValue();
389+
rhs = op.getNextSibling();
380390

381391
if ("*".equals(operator)) {
382392
result = result.multiply(evalToInt(rhs));
@@ -394,35 +404,44 @@ BigInteger evalMultiplicativeExpression(AstNode exprAst) {
394404

395405
BigInteger evalConditionalExpression(AstNode exprAst) {
396406
if (exprAst.getNumberOfChildren() == 5) {
397-
AstNode decisionOperand = exprAst.getChild(0); //@todo deprecated getChild
398-
AstNode trueCaseOperand = exprAst.getChild(2); //@todo deprecated getChild
399-
AstNode falseCaseOperand = exprAst.getChild(4); //@todo deprecated getChild
407+
AstNode decisionOperand = exprAst.getFirstChild();
408+
AstNode operator = decisionOperand.getNextSibling();
409+
AstNode trueCaseOperand = operator.getNextSibling();
410+
operator = trueCaseOperand.getNextSibling();
411+
AstNode falseCaseOperand = operator.getNextSibling();
400412
return eval(decisionOperand) ? evalToInt(trueCaseOperand) : evalToInt(falseCaseOperand);
401413
} else {
402-
AstNode decisionOperand = exprAst.getChild(0); //@todo deprecated getChild
403-
AstNode falseCaseOperand = exprAst.getChild(3); //@todo deprecated getChild
414+
AstNode decisionOperand = exprAst.getFirstChild();
415+
AstNode operator = decisionOperand.getNextSibling();
416+
operator = operator.getNextSibling();
417+
AstNode falseCaseOperand = operator.getNextSibling();
404418
BigInteger decision = evalToInt(decisionOperand);
405419
return decision.compareTo(BigInteger.ZERO) != 0 ? decision : evalToInt(falseCaseOperand);
406420
}
407421
}
408422

409423
BigInteger evalPrimaryExpression(AstNode exprAst) {
410424
// case "( expression )"
411-
return evalToInt(exprAst.getChild(1)); //@todo deprecated getChild
425+
AstNode caseNode = exprAst.getFirstChild();
426+
return evalToInt(caseNode.getNextSibling());
412427
}
413428

414429
BigInteger evalDefinedExpression(AstNode exprAst) {
415-
int posOfMacroName = exprAst.getNumberOfChildren() == 2 ? 1 : 2;
416-
String macroName = exprAst.getChild(posOfMacroName).getTokenValue(); //@todo deprecated getChild
417-
String value = preprocessor.valueOf(macroName);
430+
AstNode child = exprAst.getFirstChild();
418431

432+
if (exprAst.getNumberOfChildren() != 2) {
433+
child = child.getNextSibling();
434+
}
435+
436+
String macroName = child.getNextSibling().getTokenValue();
437+
String value = preprocessor.valueOf(macroName);
419438
LOG.trace("expanding '{}' to '{}'", macroName, value);
420439

421440
return value == null ? BigInteger.ZERO : BigInteger.ONE;
422441
}
423442

424443
BigInteger evalFunctionlikeMacro(AstNode exprAst) {
425-
String macroName = exprAst.getChild(0).getTokenValue(); //@todo deprecated getChild
444+
String macroName = exprAst.getFirstChild().getTokenValue();
426445
List<Token> tokens = exprAst.getTokens();
427446
List<Token> restTokens = tokens.subList(1, tokens.size());
428447
String value = preprocessor.expandFunctionLikeMacro(macroName, restTokens);

0 commit comments

Comments
 (0)