diff options
author | Andrew Niefer | 2004-10-21 16:15:45 +0000 |
---|---|---|
committer | Andrew Niefer | 2004-10-21 16:15:45 +0000 |
commit | 8e22cf635e337c01e5837d847cd08839e5904de9 (patch) | |
tree | deed4cc522eb141e23da0950d2ff908ed89e3195 | |
parent | bd562b731b1dd03cee8c1f7d0b9faaecbce1f0e9 (diff) | |
download | org.eclipse.cdt-8e22cf635e337c01e5837d847cd08839e5904de9.tar.gz org.eclipse.cdt-8e22cf635e337c01e5837d847cd08839e5904de9.tar.xz org.eclipse.cdt-8e22cf635e337c01e5837d847cd08839e5904de9.zip |
fix bug 74069: [Parser][IProblem] if (
) if (
) else if (
) causes unnecessary warning marker
2 files changed, 68 insertions, 42 deletions
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java index a795de451f8..73f9fab6229 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java @@ -2300,5 +2300,29 @@ public class CompleteParseASTTest extends CompleteParseBaseTest assertEquals( IProblem.SYNTAX_ERROR, problem.getID() ); assertFalse( i.hasNext() ); } + + public void testBug74069() throws Exception{ + Writer writer = new StringWriter(); + writer.write( "int f() { \n"); //$NON-NLS-1$ + writer.write( " int a, b, c; \n"); //$NON-NLS-1$ + writer.write( " if( a < b ) \n"); //$NON-NLS-1$ + writer.write( " if( b < c ) \n"); //$NON-NLS-1$ + writer.write( " return b; \n"); //$NON-NLS-1$ + writer.write( " else if ( a < c ) \n"); //$NON-NLS-1$ + writer.write( " return c; \n"); //$NON-NLS-1$ + writer.write( " else \n"); //$NON-NLS-1$ + writer.write( " return a; \n"); //$NON-NLS-1$ + writer.write( " else if( a < c ) \n"); //$NON-NLS-1$ + writer.write( " return a; \n"); //$NON-NLS-1$ + writer.write( " else if( b < c ) \n"); //$NON-NLS-1$ + writer.write( " return c; \n"); //$NON-NLS-1$ + writer.write( " else \n"); //$NON-NLS-1$ + writer.write( " return b; \n"); //$NON-NLS-1$ + writer.write( "} \n"); //$NON-NLS-1$ + + parse( writer.toString() ); + Iterator i = callback.getProblems(); + assertFalse( i.hasNext() ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java index c16db55cd26..9706420a05d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java @@ -5883,48 +5883,50 @@ public class Parser implements IParserData, IParser cleanupLastToken(); return; case IToken.t_if : - consume(IToken.t_if); - consume(IToken.tLPAREN); - IToken start = LA(1); - boolean passedCondition = true; - try { - condition(scope); - consume(IToken.tRPAREN); - } catch (BacktrackException b) { - //if the problem has no offset info, make a new one that does - if( b.getProblem() != null && b.getProblem().getSourceLineNumber() == -1 ){ - IProblem p = b.getProblem(); - IProblem p2 = problemFactory.createProblem( p.getID(), start.getOffset(), - lastToken != null ? lastToken.getEndOffset() : start.getEndOffset(), - start.getLineNumber(), p.getOriginatingFileName(), - p.getArguments() != null ? p.getArguments().toCharArray() : null, - p.isWarning(), p.isError() ); - b.initialize( p2 ); - } - failParse(b); - failParseWithErrorHandling(); - passedCondition = false; - } - - if( passedCondition ){ - if (LT(1) != IToken.tLBRACE) - singleStatementScope(scope); - else - statement(scope); - } - - if (LT(1) == IToken.t_else) { - consume(IToken.t_else); - if (LT(1) == IToken.t_if) { - //an else if, return and get the rest of the else if as - // the next statement instead of recursing - cleanupLastToken(); - return; - } else if (LT(1) != IToken.tLBRACE) - singleStatementScope(scope); - else - statement(scope); - } + if_loop: while( true ){ + consume(IToken.t_if); + consume(IToken.tLPAREN); + IToken start = LA(1); + boolean passedCondition = true; + try { + condition(scope); + consume(IToken.tRPAREN); + } catch (BacktrackException b) { + //if the problem has no offset info, make a new one that does + if( b.getProblem() != null && b.getProblem().getSourceLineNumber() == -1 ){ + IProblem p = b.getProblem(); + IProblem p2 = problemFactory.createProblem( p.getID(), start.getOffset(), + lastToken != null ? lastToken.getEndOffset() : start.getEndOffset(), + start.getLineNumber(), p.getOriginatingFileName(), + p.getArguments() != null ? p.getArguments().toCharArray() : null, + p.isWarning(), p.isError() ); + b.initialize( p2 ); + } + failParse(b); + failParseWithErrorHandling(); + passedCondition = false; + } + + if( passedCondition ){ + if (LT(1) != IToken.tLBRACE) + singleStatementScope(scope); + else + statement(scope); + } + + if (LT(1) == IToken.t_else) { + consume(IToken.t_else); + if (LT(1) == IToken.t_if) { + //an else if, don't recurse, just loop and do another if + cleanupLastToken(); + continue if_loop; + } else if (LT(1) != IToken.tLBRACE) + singleStatementScope(scope); + else + statement(scope); + } + break if_loop; + } cleanupLastToken(); return; case IToken.t_switch : |