|
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
|