From 0f2803f1343e71b006d8a0323751c4588d89c11c Mon Sep 17 00:00:00 2001 From: John Camelon Date: Mon, 10 Jan 2005 21:11:53 +0000 Subject: [PATCH] Patch for Devin Steffler. This patch adds getProblems() to the CVisitor and CPPVisitor classes. This is required to get IASTProblems since the new parser doesn't use a callback anymore. Also, updated tests accordingly. --- .../core/parser/tests/ast2/AST2BaseTest.java | 15 ++- .../tests/parser2/CompleteParser2Tests.java | 13 ++- .../tests/parser2/QuickParser2Tests.java | 17 +++- .../internal/core/dom/parser/c/CVisitor.java | 95 ++++++++++++++++++ .../core/dom/parser/cpp/CPPVisitor.java | 98 +++++++++++++++++++ 5 files changed, 232 insertions(+), 6 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java index 53860d5e61a..c9b6608d365 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java @@ -28,6 +28,7 @@ import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTIdExpression; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTProblem; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression; import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; @@ -102,9 +103,17 @@ public class AST2BaseTest extends TestCase { if( parser2.encounteredError() ) throw new ParserException( "FAILURE"); //$NON-NLS-1$ - - //TODO add in assertion here to visit all problems - + + if( lang == ParserLanguage.C ) + { + IASTProblem [] problems = CVisitor.getProblems(tu); + assertEquals( problems.length, 0 ); + } + else if ( lang == ParserLanguage.CPP ) + { + IASTProblem [] problems = CPPVisitor.getProblems(tu); + assertEquals( problems.length, 0 ); + } return tu; } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/parser2/CompleteParser2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/parser2/CompleteParser2Tests.java index 4f39bb519fe..8c49b7970a6 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/parser2/CompleteParser2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/parser2/CompleteParser2Tests.java @@ -24,6 +24,7 @@ import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTIdExpression; import org.eclipse.cdt.core.dom.ast.IASTIfStatement; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTProblem; import org.eclipse.cdt.core.dom.ast.IASTReturnStatement; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; @@ -59,6 +60,7 @@ import org.eclipse.cdt.core.parser.ScannerInfo; import org.eclipse.cdt.internal.core.dom.SavedCodeReaderFactory; import org.eclipse.cdt.internal.core.dom.parser.ISourceCodeParser; import org.eclipse.cdt.internal.core.dom.parser.c.ANSICParserExtensionConfiguration; +import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor; import org.eclipse.cdt.internal.core.dom.parser.c.GCCParserExtensionConfiguration; import org.eclipse.cdt.internal.core.dom.parser.c.GNUCSourceParser; import org.eclipse.cdt.internal.core.dom.parser.c.ICParserExtensionConfiguration; @@ -165,7 +167,16 @@ public class CompleteParser2Tests extends TestCase { throw new ParserException("FAILURE"); //$NON-NLS-1$ if (expectedToPass) { - //TODO visit translation unit and ensure that there aren't any problems + if( lang == ParserLanguage.C ) + { + IASTProblem [] problems = CVisitor.getProblems(tu); + assertEquals( problems.length, 0 ); + } + else if ( lang == ParserLanguage.CPP ) + { + IASTProblem [] problems = CPPVisitor.getProblems(tu); + assertEquals( problems.length, 0 ); + } } return tu; } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/parser2/QuickParser2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/parser2/QuickParser2Tests.java index 7a36280b059..f3bc03648f4 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/parser2/QuickParser2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/parser2/QuickParser2Tests.java @@ -15,6 +15,8 @@ import java.io.Writer; import junit.framework.TestCase; +import org.eclipse.cdt.core.dom.ast.IASTProblem; +import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.parser.CodeReader; import org.eclipse.cdt.core.parser.IScanner; import org.eclipse.cdt.core.parser.IScannerInfo; @@ -25,10 +27,12 @@ import org.eclipse.cdt.core.parser.ScannerInfo; import org.eclipse.cdt.internal.core.dom.SavedCodeReaderFactory; import org.eclipse.cdt.internal.core.dom.parser.ISourceCodeParser; import org.eclipse.cdt.internal.core.dom.parser.c.ANSICParserExtensionConfiguration; +import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor; import org.eclipse.cdt.internal.core.dom.parser.c.GCCParserExtensionConfiguration; import org.eclipse.cdt.internal.core.dom.parser.c.GNUCSourceParser; import org.eclipse.cdt.internal.core.dom.parser.c.ICParserExtensionConfiguration; import org.eclipse.cdt.internal.core.dom.parser.cpp.ANSICPPParserExtensionConfiguration; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor; import org.eclipse.cdt.internal.core.dom.parser.cpp.GNUCPPParserExtensionConfiguration; import org.eclipse.cdt.internal.core.dom.parser.cpp.GNUCPPSourceParser; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPParserExtensionConfiguration; @@ -1383,12 +1387,21 @@ public class QuickParser2Tests extends TestCase { parser2 = new GNUCSourceParser(scanner, ParserMode.QUICK_PARSE, NULL_LOG, config); } - parser2.parse(); + IASTTranslationUnit tu = parser2.parse(); if (parser2.encounteredError() && expectedToPass) throw new ParserException("FAILURE"); //$NON-NLS-1$ if (expectedToPass) { - //TODO need visitor to ensure that there aren't any problems + if( lang == ParserLanguage.C ) + { + IASTProblem [] problems = CVisitor.getProblems(tu); + assertEquals( problems.length, 0 ); + } + else if ( lang == ParserLanguage.CPP ) + { + IASTProblem [] problems = CPPVisitor.getProblems(tu); + assertEquals( problems.length, 0 ); + } } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java index a3ad9c1c6c8..3a92d124921 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java @@ -48,6 +48,8 @@ import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.dom.ast.IASTPointerOperator; +import org.eclipse.cdt.core.dom.ast.IASTProblem; +import org.eclipse.cdt.core.dom.ast.IASTProblemHolder; import org.eclipse.cdt.core.dom.ast.IASTReturnStatement; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTStatement; @@ -125,6 +127,92 @@ public class CVisitor { } } + public static class CollectProblemsAction extends CBaseVisitorAction { + { + processDeclarations = true; + processExpressions = true; + processStatements = true; + processTypeIds = true; + } + + private static final int DEFAULT_CHILDREN_LIST_SIZE = 8; + private IASTProblem[] problems = null; + int numFound = 0; + + public CollectProblemsAction() { + problems = new IASTProblem[DEFAULT_CHILDREN_LIST_SIZE]; + } + + private void addProblem(IASTProblem problem) { + if( problems.length == numFound ) // if the found array is full, then double the array + { + IASTProblem [] old = problems; + problems = new IASTProblem[ old.length * 2 ]; + for( int j = 0; j < old.length; ++j ) + problems[j] = old[j]; + } + problems[numFound++] = problem; + } + + private IASTProblem[] removeNullFromProblems() { + if (problems[problems.length-1] != null) { // if the last element in the list is not null then return the list + return problems; + } else if (problems[0] == null) { // if the first element in the list is null, then return empty list + return new IASTProblem[0]; + } + + IASTProblem[] results = new IASTProblem[numFound]; + for (int i=0; i