Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] Parser/CModel updates for outline view

- 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


Index: parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java,v
retrieving revision 1.2
diff -u -r1.2 NewModelBuilder.java
--- parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java	4 Mar 2003 18:25:40 -0000	1.2
+++ parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java	6 Mar 2003 19:18:20 -0000
@@ -72,8 +72,8 @@
 		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());
 	}
 
 	/**
Index: parser/org/eclipse/cdt/internal/core/model/SimpleDeclarationWrapper.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/SimpleDeclarationWrapper.java,v
retrieving revision 1.3
diff -u -r1.3 SimpleDeclarationWrapper.java
--- parser/org/eclipse/cdt/internal/core/model/SimpleDeclarationWrapper.java	5 Mar 2003 22:21:29 -0000	1.3
+++ parser/org/eclipse/cdt/internal/core/model/SimpleDeclarationWrapper.java	6 Mar 2003 19:18:20 -0000
@@ -115,9 +115,8 @@
 			}
 			
 			// 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 ); 	
Index: parser/org/eclipse/cdt/internal/core/parser/Parser.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java,v
retrieving revision 1.3
diff -u -r1.3 Parser.java
--- parser/org/eclipse/cdt/internal/core/parser/Parser.java	5 Mar 2003 22:21:29 -0000	1.3
+++ parser/org/eclipse/cdt/internal/core/parser/Parser.java	6 Mar 2003 19:18:20 -0000
@@ -78,9 +78,13 @@
 	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 @@
 				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 @@
 		}
 		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 @@
 	 * - 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 @@
 				}
 			}
 		}
+		
+		callback.declaratorEnd( declarator );
 	}
 	
 	/**
@@ -446,12 +467,10 @@
 	 * 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 @@
 				consume();
 				declarator(declarator);
 				consume(Token.tRPAREN);
-				return;
+				return declarator;
 			}
 			
 			name();
@@ -509,11 +528,10 @@
 			{
 				callback.declaratorAbort( container, declarator );
 				declarator = null;
-				aborted = true; 
 			}
 			else
-				callback.declaratorEnd(declarator);
-		} while( aborted );
+				return declarator; 
+		} while( true );
 	}
 	
 	/**
Index: parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java,v
retrieving revision 1.2
diff -u -r1.2 ScannerTestCase.java
--- parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java	4 Mar 2003 18:25:44 -0000	1.2
+++ parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java	6 Mar 2003 19:15:42 -0000
@@ -799,6 +799,10 @@
 			initializeScanner("#if defined( NOTHING ) \nint x = NOTHING;\n#endif");
 			validateEOF();
 			validateBalance();
+			
+			
+				
+			
 
 		}
 		catch (Exception e)
@@ -987,4 +991,71 @@
 		}
 	}
 
+	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());			
+		}
+	} 
 }

Back to the top