mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Content assist support in for statement.
This commit is contained in:
parent
80830d7267
commit
9d949fe555
3 changed files with 58 additions and 13 deletions
|
@ -1703,19 +1703,46 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
consume(IToken.tLPAREN);
|
||||
IASTNode init = forInitStatement();
|
||||
IASTExpression for_condition = null;
|
||||
if (LT(1) != IToken.tSEMI)
|
||||
switch (LT(1)) {
|
||||
case IToken.tSEMI:
|
||||
case IToken.tEOC:
|
||||
break;
|
||||
default:
|
||||
for_condition = condition();
|
||||
consume(IToken.tSEMI);
|
||||
}
|
||||
switch (LT(1)) {
|
||||
case IToken.tSEMI:
|
||||
consume(IToken.tSEMI);
|
||||
break;
|
||||
case IToken.tEOC:
|
||||
break;
|
||||
default:
|
||||
throw backtrack;
|
||||
}
|
||||
IASTExpression iterationExpression = null;
|
||||
if (LT(1) != IToken.tRPAREN) {
|
||||
switch (LT(1)) {
|
||||
case IToken.tRPAREN:
|
||||
case IToken.tEOC:
|
||||
break;
|
||||
default:
|
||||
iterationExpression = expression();
|
||||
|
||||
}
|
||||
consume(IToken.tRPAREN);
|
||||
IASTStatement for_body = statement();
|
||||
}
|
||||
switch (LT(1)) {
|
||||
case IToken.tRPAREN:
|
||||
consume(IToken.tRPAREN);
|
||||
break;
|
||||
case IToken.tEOC:
|
||||
break;
|
||||
default:
|
||||
throw backtrack;
|
||||
}
|
||||
IASTForStatement for_statement = createForStatement();
|
||||
((ASTNode) for_statement).setOffsetAndLength(startOffset,
|
||||
IASTStatement for_body = null;
|
||||
if (LT(1) != IToken.tEOC) {
|
||||
for_body = statement();
|
||||
((ASTNode) for_statement).setOffsetAndLength(startOffset,
|
||||
calculateEndOffset(for_body) - startOffset);
|
||||
}
|
||||
|
||||
if (init instanceof IASTDeclaration) {
|
||||
for_statement.setInit((IASTDeclaration) init);
|
||||
|
@ -1738,9 +1765,11 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
iterationExpression.setParent(for_statement);
|
||||
iterationExpression.setPropertyInParent(IASTForStatement.ITERATION);
|
||||
}
|
||||
for_statement.setBody(for_body);
|
||||
for_body.setParent(for_statement);
|
||||
for_body.setPropertyInParent(IASTForStatement.BODY);
|
||||
if (for_body != null) {
|
||||
for_statement.setBody(for_body);
|
||||
for_body.setParent(for_statement);
|
||||
for_body.setPropertyInParent(IASTForStatement.BODY);
|
||||
}
|
||||
return for_statement;
|
||||
}
|
||||
|
||||
|
|
|
@ -2215,7 +2215,15 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
IASTExpression e = null;
|
||||
if( LT(1) != IToken.tSEMI )
|
||||
e = expression();
|
||||
consume(IToken.tSEMI);
|
||||
switch (LT(1)) {
|
||||
case IToken.tSEMI:
|
||||
consume(IToken.tSEMI);
|
||||
break;
|
||||
case IToken.tEOC:
|
||||
break;
|
||||
default:
|
||||
throw backtrack;
|
||||
}
|
||||
// TODO is this a problem? Should we wrap this in an expression
|
||||
// statement?
|
||||
return e;
|
||||
|
|
|
@ -4420,7 +4420,15 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
IASTExpression e = null;
|
||||
if (LT(1) != IToken.tSEMI)
|
||||
e = expression();
|
||||
consume(IToken.tSEMI);
|
||||
switch (LT(1)) {
|
||||
case IToken.tSEMI:
|
||||
consume(IToken.tSEMI);
|
||||
break;
|
||||
case IToken.tEOC:
|
||||
break;
|
||||
default:
|
||||
throw backtrack;
|
||||
}
|
||||
return e;
|
||||
} catch (BacktrackException bt) {
|
||||
backup(mark);
|
||||
|
|
Loading…
Add table
Reference in a new issue