From 40b44d0371e5ada29a097bd019172c844986dd94 Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Thu, 6 Mar 2003 19:29:36 +0000 Subject: [PATCH] Patch for John Camelon: - fixed qualified name offsets in outline view - added loop-detection code to Parser - added Scanner testcase to validate Sebastien's comments - first pass at basic declarator initializers --- .../internal/core/model/NewModelBuilder.java | 4 +- .../core/model/SimpleDeclarationWrapper.java | 5 +- .../cdt/internal/core/parser/Parser.java | 48 +++++++++---- .../core/parser/tests/ScannerTestCase.java | 71 +++++++++++++++++++ 4 files changed, 108 insertions(+), 20 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java index e5ea3d488ff..c039b463dd4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java @@ -72,8 +72,8 @@ public class NewModelBuilder implements IParserCallback { String name = currName.toString(); Structure elem = ((Structure)container.getElement()); elem.setElementName( name ); - elem.setIdPos(currName.getEndOffset(), name.length()); - elem.setPos(currName.getEndOffset(), name.length()); + elem.setIdPos(currName.getStartOffset(), name.length()); + elem.setPos(currName.getStartOffset(), name.length()); } /** diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/SimpleDeclarationWrapper.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/SimpleDeclarationWrapper.java index ba0d97ffc02..d6f2e5bdb04 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/SimpleDeclarationWrapper.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/SimpleDeclarationWrapper.java @@ -115,9 +115,8 @@ public class SimpleDeclarationWrapper extends DeclSpecifier implements Declarati } // hook up the offsets - declaration.setIdPos( -currentDeclarator.getName().getEndOffset(),currentDeclarator.getName().toString().length()); - declaration.setPos( currentDeclarator.getName().getEndOffset(), currentDeclarator.getName().toString().length() ); + declaration.setIdPos( currentDeclarator.getName().getStartOffset(), currentDeclarator.getName().toString().length()); + declaration.setPos( currentDeclarator.getName().getStartOffset(), currentDeclarator.getName().toString().length() ); // add to parent parentElement.addChild( declaration ); 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 ccc81f0e5c8..e5681fcd351 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 @@ -78,9 +78,13 @@ c, quick); public void translationUnit() throws Exception { Object translationUnit = callback.translationUnitBegin(); Token lastBacktrack = null; + Token lastToken = null; while (LT(1) != Token.tEOF) { try { + lastToken = currToken; declaration( translationUnit ); + if( currToken == lastToken ) + skipToNextSemi(); } catch (Backtrack b) { // Mark as failure and try to reach a recovery point parsePassed = false; @@ -88,12 +92,7 @@ c, quick); if (lastBacktrack != null && lastBacktrack == LA(1)) { // we haven't progressed from the last backtrack // try and find tne next definition - for (int t = LT(1); t != Token.tEOF; t = LT(1)) { - consume(); - // TO DO: we should really check for matching braces too - if (t == Token.tSEMI) - break; - } + skipToNextSemi(); } else { // start again from here lastBacktrack = LA(1); @@ -102,6 +101,15 @@ c, quick); } callback.translationUnitEnd(translationUnit); } + + public void skipToNextSemi() { + for (int t = LT(1); t != Token.tEOF; t = LT(1)) { + consume(); + // TO DO: we should really check for matching braces too + if (t == Token.tSEMI) + break; + } + } /** * declaration @@ -406,10 +414,21 @@ c, quick); * - handle initializers */ public void initDeclarator( Object owner ) throws Exception { - declarator( owner ); + Object declarator = declarator( owner ); + // handle = initializerClause if (LT(1) == Token.tASSIGN) { - consume(); + consume(); + + // assignmentExpression || { initializerList , } || { } + try + { + assignmentExpression(); + } + catch( Backtrack b ) + { + // doNothing + } if (LT(1) == Token.tLBRACE) { // for now, just consume to matching brace @@ -430,6 +449,8 @@ c, quick); } } } + + callback.declaratorEnd( declarator ); } /** @@ -446,12 +467,10 @@ c, quick); * declaratorId * : name */ - public void declarator( Object container ) throws Exception { + public Object declarator( Object container ) throws Exception { - boolean aborted; do { - aborted = false; Object declarator = callback.declaratorBegin( container ); for (;;) { @@ -466,7 +485,7 @@ c, quick); consume(); declarator(declarator); consume(Token.tRPAREN); - return; + return declarator; } name(); @@ -509,11 +528,10 @@ c, quick); { callback.declaratorAbort( container, declarator ); declarator = null; - aborted = true; } else - callback.declaratorEnd(declarator); - } while( aborted ); + return declarator; + } while( true ); } /** diff --git a/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java b/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java index af88698b8ae..7f38fa1adf9 100644 --- a/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java +++ b/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java @@ -799,6 +799,10 @@ public class ScannerTestCase extends TestCase initializeScanner("#if defined( NOTHING ) \nint x = NOTHING;\n#endif"); validateEOF(); validateBalance(); + + + + } catch (Exception e) @@ -987,4 +991,71 @@ public class ScannerTestCase extends TestCase } } + public void testConditionalWithBraces() + { + try + { + for( int i = 0; i < 4; ++i ) + { + initializeScanner( "int foobar(int a) { if(a == 0) {\n#ifdef THIS\n} else {}\n#elif THAT\n} else {}\n#endif\nreturn 0;}" ); + switch( i ) + { + case 0: + scanner.addDefinition( "THIS", "1"); + scanner.addDefinition( "THAT", "1" ); + break; + case 1: + scanner.addDefinition( "THIS", "1"); + scanner.addDefinition( "THAT", "0" ); + break; + case 2: + scanner.addDefinition( "THAT", "1" ); + break; + case 3: + scanner.addDefinition( "THAT", "0" ); + break; + } + + validateToken( Token.t_int ); + validateIdentifier( "foobar"); + validateToken( Token.tLPAREN ); + validateToken( Token.t_int ); + validateIdentifier( "a" ); + validateToken( Token.tRPAREN ); + validateToken( Token.tLBRACE ); + validateToken( Token.t_if ); + validateToken( Token.tLPAREN ); + validateIdentifier( "a" ); + validateToken( Token.tEQUAL ); + validateInteger( "0" ); + validateToken( Token.tRPAREN ); + validateToken( Token.tLBRACE ); + + if( i <= 1 ) + { + validateToken( Token.tRBRACE ); + validateToken( Token.t_else ); + validateToken( Token.tLBRACE ); + validateToken( Token.tRBRACE ); + } + + if( i == 2 ) + { + validateToken( Token.tRBRACE ); + validateToken( Token.t_else ); + validateToken( Token.tLBRACE ); + validateToken( Token.tRBRACE ); + } + + validateToken( Token.t_return ); + validateInteger( "0"); + validateToken( Token.tSEMI ); + validateToken( Token.tRBRACE ); + validateToken( Token.tEOF ); + } + } catch( ScannerException se ) + { + fail(EXCEPTION_THROWN + se.toString()); + } + } }