[
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());
+ }
+ }
}