Update of /cvsroot/cpptool/rfta/src/rfta In directory sc8-pr-cvs1:/tmp/cvs-serv26062/src/rfta Modified Files: CodeModelElement.cpp CodeModelExpressions.cpp CodeModelStatements.cpp CodeRewriter.cpp CodeRewriter.h CodeWriterTest.cpp CodeWriterTest.h Log Message: * introduced ElementVisitor * added tests for IfStatement and fixed a bug * prepared some rewriter refactoring Index: CodeModelElement.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeModelElement.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** CodeModelElement.cpp 16 Mar 2003 13:51:08 -0000 1.8 --- CodeModelElement.cpp 16 Mar 2003 16:18:40 -0000 1.9 *************** *** 62,65 **** --- 62,71 ---- + void + Element::accept( ElementVisitor &visitor ) + { + } + + } // namespace CodeModel } // namespace Refactoring Index: CodeModelExpressions.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeModelExpressions.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** CodeModelExpressions.cpp 16 Mar 2003 13:51:09 -0000 1.8 --- CodeModelExpressions.cpp 16 Mar 2003 16:18:40 -0000 1.9 *************** *** 16,19 **** --- 16,27 ---- + void + Expression::accept( ElementVisitor &visitor ) + { + accept( static_cast<ExpressionVisitor &>( visitor ) ); + } + + + GenericExpression::GenericExpression( const std::string &value ) : value_( value ) Index: CodeModelStatements.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeModelStatements.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** CodeModelStatements.cpp 16 Mar 2003 15:33:10 -0000 1.11 --- CodeModelStatements.cpp 16 Mar 2003 16:18:40 -0000 1.12 *************** *** 19,22 **** --- 19,29 ---- + void + Statement::accept( ElementVisitor &visitor ) + { + accept( static_cast<StatementVisitor &>( visitor ) ); + } + + void *************** *** 140,143 **** --- 147,157 ---- { conditionTracker_.setElement( condition ); + } + + + Change + ConditionStatement::getConditionChange() const + { + return conditionTracker_.getChange(); } Index: CodeRewriter.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeRewriter.cpp,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** CodeRewriter.cpp 16 Mar 2003 15:43:09 -0000 1.23 --- CodeRewriter.cpp 16 Mar 2003 16:18:41 -0000 1.24 *************** *** 132,135 **** --- 132,164 ---- void + CodeRewriter::setCurrentInsertionPos( int index ) + { + currentInsertionPos_ = index; + } + + + void + CodeRewriter::makeRequiredChangeAndVisitElement( const CodeModel::Change &change, + CodeModel::Element &element ) + { + // Element may only be unmodified or replaced... (should use a different enum type ?) + + if ( isUpdating() && change.wasReplaced() ) + { + deleteText( change.oldRange_ ); + setCurrentInsertionPos( change.oldRange_.getEndIndex() ); + } + + ModeRestorer restorer( mode_ ); + if ( isUpdating() && change.isUnmodified() ) + mode_ = updating; + else + mode_ = inserting; + + element.accept( *this ); + } + + + void CodeRewriter::visit( BreakStatement &statement ) { *************** *** 289,293 **** insertText( "if ( " ); } ! statement.getCondition()->accept( *this ); IndentLevelManager::IndentRestorer restorer( indentManager_ ); --- 318,326 ---- insertText( "if ( " ); } ! { ! makeRequiredChangeAndVisitElement( statement.getConditionChange(), ! *statement.getCondition() ); ! // statement.getCondition()->accept( *this ); ! } IndentLevelManager::IndentRestorer restorer( indentManager_ ); Index: CodeRewriter.h =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeRewriter.h,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** CodeRewriter.h 16 Mar 2003 10:23:07 -0000 1.9 --- CodeRewriter.h 16 Mar 2003 16:18:41 -0000 1.10 *************** *** 21,26 **** /// Rewrite source to match change made to the model. ! class CodeRewriter : private StatementVisitor ! , private ExpressionVisitor { public: --- 21,25 ---- /// Rewrite source to match change made to the model. ! class CodeRewriter : private ElementVisitor { public: *************** *** 73,97 **** }; ! class ModeModifier { public: ! ModeModifier( Mode &mode, ! Mode newMode ) ! : oldMode_( mode ) ! , mode_( mode ) { - mode_ = newMode; } ! ~ModeModifier() { mode_ = oldMode_; } ! private: Mode &mode_; Mode oldMode_; }; SourceRange getCurrentInsertionRange() const; --- 72,107 ---- }; ! class ModeRestorer { public: ! ModeRestorer( Mode &mode ) ! : oldMode_( mode ) ! , mode_( mode ) { } ! ~ModeRestorer() { mode_ = oldMode_; } ! protected: Mode &mode_; + + private: Mode oldMode_; }; + class ModeModifier : public ModeRestorer + { + public: + ModeModifier( Mode &mode, + Mode newMode ) + : ModeRestorer( mode ) + { + mode_ = newMode; + } + }; + SourceRange getCurrentInsertionRange() const; *************** *** 118,121 **** --- 128,136 ---- bool isNewLine( char c ) const; + + void makeRequiredChangeAndVisitElement( const CodeModel::Change &change, + CodeModel::Element &element ); + + void setCurrentInsertionPos( int index ); private: Index: CodeWriterTest.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterTest.cpp,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** CodeWriterTest.cpp 16 Mar 2003 15:43:09 -0000 1.25 --- CodeWriterTest.cpp 16 Mar 2003 16:18:41 -0000 1.26 *************** *** 234,237 **** --- 234,258 ---- void + CodeWriterTest::testModifyIfCondition() + { + source_ = "{\n" + " if ( true )\n" + " return 5;\n" + " return 2;\n" + "}"; + generateCompound(); + + CodeModel::IfStatement &ifStatement = + dynamic_cast<CodeModel::IfStatement &>( *compound_->getStatementAt(0) ); + ifStatement.setCondition( makeExpression( "x < y" ) ); + generateAndCheckSource( "{\n" + " if ( x < y )\n" + " return 5;\n" + " return 2;\n" + "}" ); + } + + + void CodeWriterTest::testModifyReturnValue() { Index: CodeWriterTest.h =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterTest.h,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** CodeWriterTest.h 16 Mar 2003 15:43:09 -0000 1.21 --- CodeWriterTest.h 16 Mar 2003 16:18:41 -0000 1.22 *************** *** 25,28 **** --- 25,29 ---- CPPUNIT_TEST( testRemoveElseFromIfThenStatement ); CPPUNIT_TEST( testModifyElseFromIfThenStatement ); + CPPUNIT_TEST( testModifyIfCondition ); CPPUNIT_TEST( testModifyReturnValue ); CPPUNIT_TEST( testRemoveReturnValue ); *************** *** 50,53 **** --- 51,55 ---- void testRemoveElseFromIfThenStatement(); void testModifyElseFromIfThenStatement(); + void testModifyIfCondition(); void testModifyReturnValue(); |