1
0
Fork 0
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:
Doug Schaefer 2005-04-18 01:53:39 +00:00
parent 80830d7267
commit 9d949fe555
3 changed files with 58 additions and 13 deletions

View file

@ -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);
IASTExpression iterationExpression = null;
if (LT(1) != IToken.tRPAREN) {
iterationExpression = expression();
}
switch (LT(1)) {
case IToken.tSEMI:
consume(IToken.tSEMI);
break;
case IToken.tEOC:
break;
default:
throw backtrack;
}
IASTExpression iterationExpression = null;
switch (LT(1)) {
case IToken.tRPAREN:
case IToken.tEOC:
break;
default:
iterationExpression = expression();
}
switch (LT(1)) {
case IToken.tRPAREN:
consume(IToken.tRPAREN);
IASTStatement for_body = statement();
break;
case IToken.tEOC:
break;
default:
throw backtrack;
}
IASTForStatement for_statement = createForStatement();
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);
}
if (for_body != null) {
for_statement.setBody(for_body);
for_body.setParent(for_statement);
for_body.setPropertyInParent(IASTForStatement.BODY);
}
return for_statement;
}

View file

@ -2215,7 +2215,15 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
IASTExpression e = null;
if( LT(1) != IToken.tSEMI )
e = expression();
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;

View file

@ -4420,7 +4420,15 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
IASTExpression e = null;
if (LT(1) != IToken.tSEMI)
e = expression();
switch (LT(1)) {
case IToken.tSEMI:
consume(IToken.tSEMI);
break;
case IToken.tEOC:
break;
default:
throw backtrack;
}
return e;
} catch (BacktrackException bt) {
backup(mark);