From 3268c4fc9f4031d7e73c63576cf3f4c79e8c2605 Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Wed, 9 Apr 2003 14:52:28 +0000 Subject: [PATCH] Patch for John Camelon: CORE Added timing printout for CModelTests. Provided partial fix for bug36255 to get past infinite loop, will leave defect open. Fixed bug36045 (Again). Fixed bug36287. TESTS Updated ScannerTest::testBug36045(). Added ScannerTest::testBug36287(). Added DOMTests::testBug36288(). --- core/org.eclipse.cdt.core/parser/ChangeLog | 8 +++- .../internal/core/model/CModelBuilder.java | 4 +- .../cdt/internal/core/parser/Scanner.java | 24 ++++++++--- core/org.eclipse.cdt.ui.tests/ChangeLog | 5 +++ .../cdt/core/parser/tests/DOMTests.java | 16 +++++++ .../core/parser/tests/ScannerTestCase.java | 43 +++++++++++++++++++ 6 files changed, 92 insertions(+), 8 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog b/core/org.eclipse.cdt.core/parser/ChangeLog index 8c885ec450a..d646b9d6b44 100644 --- a/core/org.eclipse.cdt.core/parser/ChangeLog +++ b/core/org.eclipse.cdt.core/parser/ChangeLog @@ -1,7 +1,13 @@ +2003-04-09 John Camelon + Added timing printout for CModelTests. + Provided partial fix for bug36255 to get past infinite loop, will leave defect open. + Fixed bug36045 (Again). + Fixed bug36287. + 2003-04-06 Andrew Niefer Added ParserSymbolTable::Cost and used it to fix up the conversion sequence ranking -2003-04-04 John Camelon +2003-04-06 John Camelon Fixed defect 36073. Fixed error handling for unterminated strings in Scanner. Significantly updated callback structure to better suite the nature of the Code Model. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java index 4e8b86a90a4..e74a32642c5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java @@ -53,8 +53,10 @@ public class CModelBuilder { DOMBuilder domBuilder = new DOMBuilder(); String code = translationUnit.getBuffer().getContents(); Parser parser = new Parser(code, domBuilder, true); - if( ! parser.parse() ) throw new ParserException( "Parse failure" ); + if( ! parser.parse() ) throw new ParserException( "Parse failure" ); + long startTime = System.currentTimeMillis(); generateModelElements(domBuilder.getTranslationUnit()); + System.out.println("CModel build: "+ ( System.currentTimeMillis() - startTime ) + "ms" ); return domBuilder.getTranslationUnit(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Scanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Scanner.java index 922622504cf..039273de1dc 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Scanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Scanner.java @@ -348,6 +348,7 @@ public class Scanner implements IScanner { private boolean throwExceptionOnEOFWithinMultilineComment = true; private boolean throwExceptionOnEOFWithoutBalancedEndifs = true; private boolean throwExceptionOnBadCharacterRead = false; + private boolean atEOF = false; private boolean quickScan = false; public void setQuickScan(boolean qs) { @@ -505,13 +506,16 @@ public class Scanner implements IScanner { // string StringBuffer buff = new StringBuffer(); + int beforePrevious = NOCHAR; int previous = c; c = getChar(true); for( ; ; ) { - if( ( c == '"' && previous != '\\' )|| ( c == NOCHAR) )break; + if ( ( c =='"' ) && ( previous != '\\' || beforePrevious == '\\') ) break; + if( c == NOCHAR) break; buff.append((char) c); + beforePrevious = previous; previous = c; c = getChar(true); } @@ -527,8 +531,7 @@ public class Scanner implements IScanner { } else { if (throwExceptionOnUnboundedString) throw new ScannerException( - "Unbounded string found at offset " - + currentContext.getOffset()); + "Unbounded string" ); } } else if ( @@ -710,11 +713,17 @@ public class Scanner implements IScanner { } } - int tokenType = floatingPoint ? Token.tFLOATINGPT : Token.tINTEGER; + int tokenType; + String result = buff.toString(); + + if( floatingPoint && result.equals(".") ) + tokenType = Token.tDOT; + else + tokenType = floatingPoint ? Token.tFLOATINGPT : Token.tINTEGER; return newToken( tokenType, - buff.toString(), + result, currentContext); } else if (c == '#') { @@ -1244,8 +1253,11 @@ public class Scanner implements IScanner { } } - if (throwExceptionOnEOFWithoutBalancedEndifs && ( getDepth() != 0)) + if (throwExceptionOnEOFWithoutBalancedEndifs && ( getDepth() != 0) && !atEOF ) + { + atEOF = true; throw new ScannerException("End of file encountered without terminating #endif"); + } // we're done throw Parser.endOfFile; diff --git a/core/org.eclipse.cdt.ui.tests/ChangeLog b/core/org.eclipse.cdt.ui.tests/ChangeLog index 77e457d536a..56a4bcdb784 100644 --- a/core/org.eclipse.cdt.ui.tests/ChangeLog +++ b/core/org.eclipse.cdt.ui.tests/ChangeLog @@ -1,3 +1,8 @@ +2003-04-09 John Camelon + Updated ScannerTest::testBug36045(). + Added ScannerTest::testBug36287(). + Added DOMTests::testBug36288(). + 2003-04-06 Andrew Niefer Added ParserSymbolTableTest::testOverloadRanking() diff --git a/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java b/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java index 460154bf000..dfc12ecb182 100644 --- a/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java +++ b/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java @@ -1121,6 +1121,22 @@ public class DOMTests extends TestCase { writer.write( "A::A(const A&v) : x(v.x) { }\n" ); TranslationUnit tu = parse( writer.toString() ); } + + public void testBug36288() throws Exception + { + TranslationUnit tu = parse( "int foo() {}\nlong foo2(){}", true); + assertEquals( tu.getDeclarations().size(), 2 ); + for( int i = 0; i < 2; ++i ) + { + SimpleDeclaration declaration = (SimpleDeclaration)tu.getDeclarations().get(i); + assertEquals( declaration.getDeclarators().size(), 1 ); + Declarator d = (Declarator)declaration.getDeclarators().get(0); + assertEquals( d.getName().toString(), ( i == 0 ) ? "foo" : "foo2"); + assertEquals( declaration.getDeclSpecifier().getType(), (i == 0 ) ? DeclSpecifier.t_int : DeclSpecifier.t_type ); + assertEquals( declaration.getDeclSpecifier().isLong(), ( i == 0 ) ? false : 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 44633bb9263..f93f3655196 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 @@ -1141,6 +1141,42 @@ public class ScannerTestCase extends TestCase validateAsUndefined(row.symbolName(i)); } } + + public void testBug36287() throws Exception + { + initializeScanner( "X::X( const X & rtg_arg ) : U( rtg_arg ) , Z( rtg_arg.Z ) , br( rtg_arg.br ){}" ); + validateIdentifier("X"); + validateToken( Token.tCOLONCOLON); + validateIdentifier("X"); + validateToken( Token.tLPAREN ); + validateToken( Token.t_const ); + validateIdentifier("X"); + validateToken( Token.tAMPER ); + validateIdentifier( "rtg_arg"); + validateToken( Token.tRPAREN ); + validateToken( Token.tCOLON ); + validateIdentifier( "U"); + validateToken( Token.tLPAREN ); + validateIdentifier( "rtg_arg"); + validateToken( Token.tRPAREN ); + validateToken( Token.tCOMMA ); + validateIdentifier( "Z"); + validateToken( Token.tLPAREN ); + validateIdentifier( "rtg_arg"); + validateToken( Token.tDOT ); + validateIdentifier( "Z"); + validateToken( Token.tRPAREN ); + validateToken( Token.tCOMMA ); + validateIdentifier( "br"); + validateToken( Token.tLPAREN ); + validateIdentifier( "rtg_arg"); + validateToken( Token.tDOT ); + validateIdentifier( "br"); + validateToken( Token.tRPAREN ); + validateToken( Token.tLBRACE); + validateToken( Token.tRBRACE); + validateEOF(); + } public void testBug35892() { @@ -1180,8 +1216,15 @@ public class ScannerTestCase extends TestCase buffer.append( '\\'); buffer.append( '"'); buffer.append( '"'); + + buffer.append( '"'); + buffer.append( '\\'); + buffer.append( '\\'); + buffer.append( '"'); + buffer.append( "\n\n"); initializeScanner( buffer.toString()); validateString( "\\\""); + validateString( "\\\\"); } public void testConditionalWithBraces()