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); consume(IToken.tLPAREN);
IASTNode init = forInitStatement(); IASTNode init = forInitStatement();
IASTExpression for_condition = null; IASTExpression for_condition = null;
if (LT(1) != IToken.tSEMI) switch (LT(1)) {
case IToken.tSEMI:
case IToken.tEOC:
break;
default:
for_condition = condition(); 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); consume(IToken.tRPAREN);
IASTStatement for_body = statement(); break;
case IToken.tEOC:
break;
default:
throw backtrack;
}
IASTForStatement for_statement = createForStatement(); IASTForStatement for_statement = createForStatement();
IASTStatement for_body = null;
if (LT(1) != IToken.tEOC) {
for_body = statement();
((ASTNode) for_statement).setOffsetAndLength(startOffset, ((ASTNode) for_statement).setOffsetAndLength(startOffset,
calculateEndOffset(for_body) - startOffset); calculateEndOffset(for_body) - startOffset);
}
if (init instanceof IASTDeclaration) { if (init instanceof IASTDeclaration) {
for_statement.setInit((IASTDeclaration) init); for_statement.setInit((IASTDeclaration) init);
@ -1738,9 +1765,11 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
iterationExpression.setParent(for_statement); iterationExpression.setParent(for_statement);
iterationExpression.setPropertyInParent(IASTForStatement.ITERATION); iterationExpression.setPropertyInParent(IASTForStatement.ITERATION);
} }
if (for_body != null) {
for_statement.setBody(for_body); for_statement.setBody(for_body);
for_body.setParent(for_statement); for_body.setParent(for_statement);
for_body.setPropertyInParent(IASTForStatement.BODY); for_body.setPropertyInParent(IASTForStatement.BODY);
}
return for_statement; return for_statement;
} }

View file

@ -2215,7 +2215,15 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
IASTExpression e = null; IASTExpression e = null;
if( LT(1) != IToken.tSEMI ) if( LT(1) != IToken.tSEMI )
e = expression(); e = expression();
switch (LT(1)) {
case IToken.tSEMI:
consume(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 // TODO is this a problem? Should we wrap this in an expression
// statement? // statement?
return e; return e;

View file

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