From: <bl...@us...> - 2003-05-03 21:52:20
|
Update of /cvsroot/cpptool/rfta/src/rftaparser In directory sc8-pr-cvs1:/tmp/cvs-serv18791/src/rftaparser Modified Files: ASTNodes.cpp DeclarationDetailsParser.cpp DeclarationListParser.cpp DeclarationListParserTest.cpp DeclarationListParserTest.h rftaparser.dsp Added Files: MacroDeclarationParser.cpp MacroDeclarationParser.h MacroDeclarationParserTest.cpp MacroDeclarationParserTest.h Log Message: * added support for MFC & wxWindow macro style in declaration list. Any identifier in upper case, with at least one '_' starting a declaration will start a macro declaration. * a macro declaration eat the patter IDENTIFIER( parameters ) * notes that it does not the bug were macro is use to export a symbol. --- NEW FILE: MacroDeclarationParser.cpp --- // ////////////////////////////////////////////////////////////////////////// // (c)Copyright 2002, Baptiste Lepilleur. // Created: 2003/05/03 // ////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "MacroDeclarationParser.h" #include <rfta/parser/ASTNodes.h> #include <rfta/parser/ParseContext.h> #include <algorithm> namespace Refactoring { MacroDeclarationParser::MacroDeclarationParser( ParseContext &context, const char *start, const char *end ) : Parser( context, start, end ) { } MacroDeclarationParser::~MacroDeclarationParser() { } bool MacroDeclarationParser::tryParse() { Tracker tracker( "MacroDeclarationParser::tryParse", *this ); Xtl::CStringEnumerator current( current_, end_ ); ParserTools::skipSpaces( current ); Xtl::CStringView macroName; if ( !tryReadNextMacroIdentifier( current, macroName ) ) return false; if ( !isMacroName( macroName ) ) return false; ParserTools::skipSpaces( current ); Xtl::CStringView parameters( current ); if ( *current != '(' ) throw ParserTools::ParseError( "expected '(' after macro name not found.", current ); ParserTools::findNextBalanced( ++current, '(', ')' ); parameters.setEnd( ++current ); if ( *current == ';' ) ++current; Xtl::CStringView macroDeclaration( macroName.getStart(), current ); addMacroNodes( macroDeclaration, macroName, parameters ); current_ = current; return true; } bool MacroDeclarationParser::tryReadNextMacroIdentifier( Xtl::CStringEnumerator ¤t, Xtl::CStringView &identifier ) { if ( !current.hasNext() ) return false; Xtl::CStringEnumerator identifierStart = current; identifier = current; if ( isValidIdentifierFirstLetter( *current ) ) { ++current;; while ( current.hasNext() && isIdentifierLetter( *current ) ) current++; } identifier.setEnd( current ); return identifier.getLength() != 0; } bool MacroDeclarationParser::isValidMacroFirstLetter( char letter ) { return (letter >= 'A' && letter <= 'Z' ) || letter == '_'; } bool MacroDeclarationParser::isValidMacroLetter( char letter ) { return (letter >= 'A' && letter <= 'Z' ) || (letter >= '0' && letter <= '9' ) || letter == '_'; } bool MacroDeclarationParser::isMacroName( const Xtl::CStringView ¯oName ) { return std::find( macroName.getStart(), macroName.getEnd(), '_' ) != macroName.getEnd(); } void MacroDeclarationParser::addMacroNodes( const Xtl::CStringView ¯o, const Xtl::CStringView ¯oName, const Xtl::CStringView ¶meters ) { ASTNodePtr macroNode = createASTNode( ASTNodeTypes::macro, getParentNode(), macro ); ASTNodePtr nameNode = createASTNode( ASTNodeTypes::macroIdentifier, macroNode, macroName ); ASTNodePtr parametersNode = createASTNode( ASTNodeTypes::macroParameters, macroNode, parameters ); macroNode->setPropertyNode( ASTNodeProperties::macroIdentifier, nameNode ); macroNode->setPropertyNode( ASTNodeProperties::macroParameters, parametersNode ); context_.addNode( macroNode ); } } // namespace Refactoring --- NEW FILE: MacroDeclarationParser.h --- // ////////////////////////////////////////////////////////////////////////// // (c)Copyright 2002, Baptiste Lepilleur. // Created: 2003/05/03 // ////////////////////////////////////////////////////////////////////////// #ifndef RFTA_MACRODECLARATIONPARSER_H #define RFTA_MACRODECLARATIONPARSER_H #include <rfta/parser/Parser.h> #include <rfta/parser/ParserTools.h> namespace Refactoring { /// This class represents class RFTAPARSER_API MacroDeclarationParser : public Parser { public: /*! Constructs a MacroDeclarationParser object. */ MacroDeclarationParser( ParseContext &context, const char *start, const char *end ); /// Destructor. virtual ~MacroDeclarationParser(); bool tryParse(); private: bool tryReadNextMacroIdentifier( Xtl::CStringEnumerator ¤t, Xtl::CStringView &identifier ); bool isMacroName( const Xtl::CStringView ¯oName ); void addMacroNodes( const Xtl::CStringView ¯o, const Xtl::CStringView ¯oName, const Xtl::CStringView ¶meters ); static bool isValidMacroFirstLetter( char letter ); static bool isValidMacroLetter( char letter ); }; // Inlines methods for MacroDeclarationParser: // ------------------------------------------- } // namespace Refactoring #endif // RFTA_MACRODECLARATIONPARSER_H --- NEW FILE: MacroDeclarationParserTest.cpp --- // ////////////////////////////////////////////////////////////////////////// // (c)Copyright 2002, Baptiste Lepilleur. // Created: 2003/05/03 // ////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "MacroDeclarationParser.h" #include "MacroDeclarationParserTest.h" #include <rfta/parser/ASTNodes.h> namespace Refactoring { CPPUNIT_TEST_SUITE_REGISTRATION( MacroDeclarationParserTest ); MacroDeclarationParserTest::MacroDeclarationParserTest() { } MacroDeclarationParserTest::~MacroDeclarationParserTest() { } void MacroDeclarationParserTest::setUp() { SourceBuilderTestBase::setUp(); } void MacroDeclarationParserTest::tearDown() { SourceBuilderTestBase::tearDown(); } void MacroDeclarationParserTest::addMacroDeclaration( const std::string &name, const std::string &spacer1, const std::string ¶meters, const std::string &spacer2 ) { builder_->mark( "MACRO" ); builder_->addKeyed( name, "NAME" ); builder_->add( spacer1 ); builder_->addKeyed( parameters, "PARAMETERS" ); builder_->add( spacer2 ); builder_->extend( "MACRO" ); } void MacroDeclarationParserTest::checkParseMacroDeclaration() { SourceASTNodePtr sourceNode = RFTA_ASSERT_PARSER_PASS( MacroDeclarationParser, source_, source_.length() ); ASTNodePtr macroNode = sourceNode->getChildAt(0); RFTA_ASSERT_NODE_HAS( macroNode, ASTNodeTypes::macro, builder_->getRange("MACRO"), "macro node" ); RFTA_ASSERT_NODE_PROPERTY_HAS( macroNode, ASTNodeProperties::macroIdentifier, ASTNodeTypes::macroIdentifier, builder_->getRange("NAME"), "macro identifier node"); RFTA_ASSERT_NODE_PROPERTY_HAS( macroNode, ASTNodeProperties::macroParameters, ASTNodeTypes::macroParameters, builder_->getRange("PARAMETERS"), "macro parameters node"); } void MacroDeclarationParserTest::testEmptyMacroDeclaration() { addMacroDeclaration( "IMPLEMENT_DYNAMIC", "", "()", "" ); checkParseMacroDeclaration(); } void MacroDeclarationParserTest::testMacroDeclarationWithParameters() { addMacroDeclaration( "IMPLEMENT_DYNAMIC", "", "( SomeClass, someMethod )", "" ); checkParseMacroDeclaration(); } void MacroDeclarationParserTest::testMacroDeclarationWithTrailingSemiColon() { addMacroDeclaration( "IMPLEMENT_DYNAMIC", "", "()", ";" ); checkParseMacroDeclaration(); } } // namespace Refactoring --- NEW FILE: MacroDeclarationParserTest.h --- // ////////////////////////////////////////////////////////////////////////// // (c)Copyright 2002, Baptiste Lepilleur. // Created: 2003/05/03 // ////////////////////////////////////////////////////////////////////////// #ifndef RFTA_MACRODECLARATIONPARSERTEST_H #define RFTA_MACRODECLARATIONPARSERTEST_H #include "SourceBuilderTestBase.h" namespace Refactoring { /// Unit tests for MacroDeclarationParserTest class MacroDeclarationParserTest : public SourceBuilderTestBase { CPPUNIT_TEST_SUITE( MacroDeclarationParserTest ); CPPUNIT_TEST( testEmptyMacroDeclaration ); CPPUNIT_TEST( testMacroDeclarationWithParameters ); CPPUNIT_TEST( testMacroDeclarationWithTrailingSemiColon ); CPPUNIT_TEST_SUITE_END(); public: /*! Constructs a MacroDeclarationParserTest object. */ MacroDeclarationParserTest(); /// Destructor. virtual ~MacroDeclarationParserTest(); void setUp(); void tearDown(); void testEmptyMacroDeclaration(); void testMacroDeclarationWithParameters(); void testMacroDeclarationWithTrailingSemiColon(); private: void addMacroDeclaration( const std::string &name, const std::string &spacer1, const std::string ¶meters, const std::string &spacer2 ); void checkParseMacroDeclaration(); }; // Inlines methods for MacroDeclarationParserTest: // ----------------------------------------------- } // namespace Refactoring #endif // RFTA_MACRODECLARATIONPARSERTEST_H Index: ASTNodes.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rftaparser/ASTNodes.cpp,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** ASTNodes.cpp 3 May 2003 17:45:13 -0000 1.23 --- ASTNodes.cpp 3 May 2003 21:52:15 -0000 1.24 *************** *** 78,81 **** --- 78,84 ---- const ASTNodeType ASTNodeTypes::assignmentExpression( "assignment-expression-marker"); const ASTNodeType ASTNodeTypes::expressionList( "expression-list-marker" ); + const ASTNodeType ASTNodeTypes::macro( "macro" ); + const ASTNodeType ASTNodeTypes::macroIdentifier( "macro-identifier" ); + const ASTNodeType ASTNodeTypes::macroParameters( "macro-parameter" ); *************** *** 119,122 **** --- 122,127 ---- const ASTNodeProperty ASTNodeProperties::enumBodyProperty ( "enumeration-body-property" ); const ASTNodeProperty ASTNodeProperties::classBodyProperty( "class-body-property" ); + const ASTNodeProperty ASTNodeProperties::macroIdentifier( "macro-identifier-property" ); + const ASTNodeProperty ASTNodeProperties::macroParameters( "macro-parameters-property" ); } // namespace Refactoring Index: DeclarationDetailsParser.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rftaparser/DeclarationDetailsParser.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** DeclarationDetailsParser.cpp 3 May 2003 18:06:37 -0000 1.6 --- DeclarationDetailsParser.cpp 3 May 2003 21:52:15 -0000 1.7 *************** *** 446,459 **** EnumBodyParser bodyParser( context_, current_, end_ ); subParse( bodyParser ); - /* - expect('{'); - - ASTNodePtr body = createASTNode( ASTNodeTypes::unparsedDeclarationList, - specifier, - getCurrentIndex(), - 0 ); - specifier->setPropertyNode( ASTNodeProperties::enumBodyProperty , body ); - return body; - */ } --- 446,449 ---- Index: DeclarationListParser.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rftaparser/DeclarationListParser.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** DeclarationListParser.cpp 1 May 2003 21:08:58 -0000 1.6 --- DeclarationListParser.cpp 3 May 2003 21:52:15 -0000 1.7 *************** *** 6,16 **** #include "stdafx.h" #include <rfta/parser/ASTNodes.h> #include <rfta/parser/DeclarationParser.h> - #include <rfta/parser/DeclarationListParser.h> #include <rfta/parser/ParseContext.h> - #include <stdexcept> #include <rfta/parser/ParserTools.h> #include <set> --- 6,17 ---- #include "stdafx.h" + #include <rfta/parser/DeclarationListParser.h> #include <rfta/parser/ASTNodes.h> #include <rfta/parser/DeclarationParser.h> #include <rfta/parser/ParseContext.h> #include <rfta/parser/ParserTools.h> #include <set> + #include <stdexcept> + #include "MacroDeclarationParser.h" *************** *** 63,66 **** --- 64,71 ---- continue; } + + MacroDeclarationParser macroParser( context_, current_, end_ ); + if ( trySubParse( macroParser ) ) + continue; DeclarationParser parser(context_, current_ , end_ ); Index: DeclarationListParserTest.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rftaparser/DeclarationListParserTest.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** DeclarationListParserTest.cpp 3 May 2003 17:43:12 -0000 1.4 --- DeclarationListParserTest.cpp 3 May 2003 21:52:15 -0000 1.5 *************** *** 90,92 **** --- 90,109 ---- + void + DeclarationListParserTest::testMacros() + { + const std::string source( + "BEGIN_MSG_MAP(HubFrame) " + " MESSAGE_HANDLER(WM_CLOSE, onClose) " + "END_MSG_MAP()" ); + SourceASTNodePtr sourceNode = RFTA_ASSERT_PARSER_PASS( DeclarationListParser, + source, + source.length() ); + RFTA_ASSERT_EQUAL( 3, sourceNode->getChildCount() ); + RFTA_ASSERT_NODE_TYPE( sourceNode->getChildAt(0), ASTNodeTypes::macro ); + RFTA_ASSERT_NODE_TYPE( sourceNode->getChildAt(1), ASTNodeTypes::macro ); + RFTA_ASSERT_NODE_TYPE( sourceNode->getChildAt(2), ASTNodeTypes::macro ); + } + + } // namespace Refactoring Index: DeclarationListParserTest.h =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rftaparser/DeclarationListParserTest.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** DeclarationListParserTest.h 3 May 2003 17:43:12 -0000 1.2 --- DeclarationListParserTest.h 3 May 2003 21:52:15 -0000 1.3 *************** *** 20,23 **** --- 20,24 ---- CPPUNIT_TEST( testTemplateFuntionFollowedByDecl ); CPPUNIT_TEST( testUnamedEnumDeclaration ); + CPPUNIT_TEST( testMacros ); CPPUNIT_TEST_SUITE_END(); *************** *** 35,38 **** --- 36,40 ---- void testTemplateFuntionFollowedByDecl(); void testUnamedEnumDeclaration(); + void testMacros(); private: Index: rftaparser.dsp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rftaparser/rftaparser.dsp,v retrieving revision 1.49 retrieving revision 1.50 diff -C2 -d -r1.49 -r1.50 *** rftaparser.dsp 3 May 2003 17:38:45 -0000 1.49 --- rftaparser.dsp 3 May 2003 21:52:15 -0000 1.50 *************** *** 250,253 **** --- 250,261 ---- # Begin Source File + SOURCE=.\EnumBodyParser.cpp + # End Source File + # Begin Source File + + SOURCE=.\EnumBodyParser.h + # End Source File + # Begin Source File + SOURCE=.\FlowControlStatementParser.cpp # End Source File *************** *** 298,301 **** --- 306,317 ---- # Begin Source File + SOURCE=.\MacroDeclarationParser.cpp + # End Source File + # Begin Source File + + SOURCE=.\MacroDeclarationParser.h + # End Source File + # Begin Source File + SOURCE=.\NamespaceParser.cpp # End Source File *************** *** 879,882 **** --- 895,906 ---- # Begin Source File + SOURCE=.\MacroDeclarationParserTest.cpp + # End Source File + # Begin Source File + + SOURCE=.\MacroDeclarationParserTest.h + # End Source File + # Begin Source File + SOURCE=.\NonSemanticBlankerTest.cpp *************** *** 1226,1258 **** SOURCE=.\KeyedString.h - - !IF "$(CFG)" == "rftaparser - Win32 Release" - - !ELSEIF "$(CFG)" == "rftaparser - Win32 Debug" - - !ENDIF - # End Source File # Begin Source File SOURCE=..\rftatest\SourceBuilder.cpp - - !IF "$(CFG)" == "rftaparser - Win32 Release" - - !ELSEIF "$(CFG)" == "rftaparser - Win32 Debug" - - !ENDIF - # End Source File # Begin Source File SOURCE=..\..\include\rfta\test\SourceBuilder.h - - !IF "$(CFG)" == "rftaparser - Win32 Release" - - !ELSEIF "$(CFG)" == "rftaparser - Win32 Debug" - - !ENDIF - # End Source File # Begin Source File --- 1250,1261 ---- *************** *** 1511,1539 **** # Begin Source File ! SOURCE=.\EnumBodyParser.cpp # End Source File # Begin Source File ! SOURCE=.\EnumBodyParser.h # End Source File # Begin Source File ! SOURCE=.\Makefile.am # End Source File # Begin Source File ! SOURCE=.\NonSemanticBlanker.cpp # End Source File # Begin Source File ! SOURCE=..\..\include\rfta\parser\NonSemanticBlanker.h # End Source File # Begin Source File ! SOURCE=..\rfta\ParserTools.cpp # End Source File # Begin Source File ! SOURCE=..\..\include\rfta\parser\ParserTools.h # End Source File # End Target --- 1514,1542 ---- # Begin Source File ! SOURCE=.\Makefile.am # End Source File # Begin Source File ! SOURCE=.\NonSemanticBlanker.cpp # End Source File # Begin Source File ! SOURCE=..\..\include\rfta\parser\NonSemanticBlanker.h # End Source File # Begin Source File ! SOURCE=..\rfta\ParserTools.cpp # End Source File # Begin Source File ! SOURCE=..\..\include\rfta\parser\ParserTools.h # End Source File # Begin Source File ! SOURCE=.\SourceBuilderTestBase.cpp # End Source File # Begin Source File ! SOURCE=.\SourceBuilderTestBase.h # End Source File # End Target |