From: <bl...@us...> - 2003-03-06 22:44:49
|
Update of /cvsroot/cpptool/rfta/src/rfta In directory sc8-pr-cvs1:/tmp/cvs-serv6181/src/rfta Modified Files: CodeModel.cpp CodeModelElement.cpp CodeModelExpressions.cpp CodeModelStatements.cpp CodeRewriter.cpp CodeRewriter.h CodeWriterTest.cpp CodeWriterTest.h rfta.dsp Added Files: IndentLevelManager.cpp IndentLevelManager.h Log Message: * new statement insertion in compound generate correct text change --- NEW FILE: IndentLevelManager.cpp --- // ////////////////////////////////////////////////////////////////////////// // (c)Copyright 2002, Baptiste Lepilleur. // Created: 2003/03/06 // ////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "IndentLevelManager.h" namespace Refactoring { IndentLevelManager::IndentLevelManager( const std::string &originalSource, int indentWidth ) : originalSource_( originalSource ) , indentWidth_( indentWidth ) { } IndentLevelManager::~IndentLevelManager() { } void IndentLevelManager::enterExistingStatement( int startingPos ) { pushIndent( findIndentLevelOf( startingPos ) ); } int IndentLevelManager::findIndentLevelOf( int pos ) const { int indent = 0; while ( --pos >= 0 && originalSource_[pos] != '\n' ) ++indent; return indent; } void IndentLevelManager::pushIndent( int indent ) { indents_.push_back( indent ); } } // namespace Refactoring --- NEW FILE: IndentLevelManager.h --- // ////////////////////////////////////////////////////////////////////////// // (c)Copyright 2002, Baptiste Lepilleur. // Created: 2003/03/06 // ////////////////////////////////////////////////////////////////////////// #ifndef RFTA_INDENTLEVELMANAGER_H #define RFTA_INDENTLEVELMANAGER_H namespace Refactoring { /// Manage indent level as the code model is visited. class IndentLevelManager { public: class IndentRestorer { public: IndentRestorer( IndentLevelManager &manager ) : manager_( manager ) , count_( manager.indents_.size() ) { } ~IndentRestorer() { manager_.indents_.resize( count_ ); } IndentLevelManager &manager_; int count_; }; friend class IndentRestorer; /*! Constructs a IndentLevelManager object. */ IndentLevelManager( const std::string &originalSource, int indentWidth = 2 ); /// Destructor. virtual ~IndentLevelManager(); void enterExistingStatement( int startingPos ); private: int findIndentLevelOf( int pos ) const; void pushIndent( int indent ); private: typedef std::deque<int> Indents; Indents indents_; const std::string originalSource_; int indentWidth_; }; // Inlines methods for IndentLevelManager: // --------------------------------------- } // namespace Refactoring #endif // RFTA_INDENTLEVELMANAGER_H Index: CodeModel.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeModel.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** CodeModel.cpp 25 Dec 2002 12:13:56 -0000 1.3 --- CodeModel.cpp 6 Mar 2003 22:17:56 -0000 1.4 *************** *** 70,74 **** { CompoundStatementPtr compound( new CompoundStatement() ); ! compound->setSourceRange( compoundNode->getRange() ); for ( int index = 0; index < compoundNode->getChildCount(); ++index ) --- 70,75 ---- { CompoundStatementPtr compound( new CompoundStatement() ); ! // compound->setSourceRange( compoundNode->getRange() ); ! compound->setOriginalText( ElementText( compoundNode ) ); for ( int index = 0; index < compoundNode->getChildCount(); ++index ) *************** *** 97,101 **** GeneratorFunction function = it->second; StatementPtr statement = (this->*function)( statementNode ); ! statement->setSourceRange( statementNode->getRange() ); return statement; } --- 98,103 ---- GeneratorFunction function = it->second; StatementPtr statement = (this->*function)( statementNode ); ! // statement->setSourceRange( statementNode->getRange() ); ! statement->setOriginalText( ElementText( statementNode ) ); return statement; } *************** *** 306,311 **** { std::string value = expressionNode->getOriginalText(); ! ExpressionPtr expression( new GenericExpression( value ) ); ! expression->setSourceRange( expressionNode->getRange() ); return expression; } --- 308,314 ---- { std::string value = expressionNode->getOriginalText(); ! ExpressionPtr expression( new GenericExpression( ElementText( value ) ) ); ! // expression->setSourceRange( expressionNode->getRange() ); ! expression->setOriginalText( ElementText( expressionNode ) ); return expression; } *************** *** 316,320 **** { ExpressionPtr expression( new NullExpression() ); ! expression->setSourceRange( expressionNode->getRange() ); return expression; } --- 319,324 ---- { ExpressionPtr expression( new NullExpression() ); ! // expression->setSourceRange( expressionNode->getRange() ); ! expression->setOriginalText( ElementText( expressionNode ) ); return expression; } *************** *** 326,330 **** const std::string primaryType( getDeclaratorPrimaryType( expression ) ); DeclaratorExpressionPtr declaratorExpression( new DeclaratorExpression( primaryType ) ); ! declaratorExpression->setSourceRange( expression->getRange() ); for ( int index = 0; index < expression->getChildCount(); ++index ) --- 330,335 ---- const std::string primaryType( getDeclaratorPrimaryType( expression ) ); DeclaratorExpressionPtr declaratorExpression( new DeclaratorExpression( primaryType ) ); ! declaratorExpression->setOriginalText( ElementText( expression ) ); ! // declaratorExpression->setSourceRange( expression->getRange() ); for ( int index = 0; index < expression->getChildCount(); ++index ) *************** *** 382,386 **** initializerNode->getProperty( ASTNodeProperties::valueProperty ); ExpressionPtr value = generateExpression( valueNode ); ! value->setSourceRange( valueNode->getRange() ); ExpressionPtr initializer; --- 387,392 ---- initializerNode->getProperty( ASTNodeProperties::valueProperty ); ExpressionPtr value = generateExpression( valueNode ); ! value->setOriginalText( ElementText( valueNode ) ); ! // value->setSourceRange( valueNode->getRange() ); ExpressionPtr initializer; *************** *** 390,394 **** initializer.reset( new ConstructorInitializerExpression( value ) ); ! initializer->setSourceRange( initializerNode->getRange() ); return initializer; --- 396,401 ---- initializer.reset( new ConstructorInitializerExpression( value ) ); ! // initializer->setSourceRange( initializerNode->getRange() ); ! initializer->setOriginalText( ElementText( initializerNode ) ); return initializer; Index: CodeModelElement.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeModelElement.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** CodeModelElement.cpp 25 Dec 2002 12:13:56 -0000 1.3 --- CodeModelElement.cpp 6 Mar 2003 22:17:57 -0000 1.4 *************** *** 6,9 **** --- 6,10 ---- #include "stdafx.h" #include <rfta/refactoring/CodeModelElement.h> + #include <rfta/parser/ASTNode.h> *************** *** 12,19 **** Element::Element() ! : wasReplaced_( false ) { ! unsetSourceRange(); } --- 13,96 ---- + ElementText::ElementText() + : hasNewText_( true ) + { + } + + + ElementText::ElementText( const ASTNodePtr &node ) + : node_( node ) + , hasNewText_( false ) + { + } + + + ElementText::ElementText( const std::string &text ) + : newText_( text ) + , hasNewText_( true ) + { + } + + + void + ElementText::setText( const std::string &newText ) + { + hasNewText_ = true; + newText_ = newText; + } + + + const std::string + ElementText::getOriginalText() const + { + if ( hasNewText_ ) + return newText_; + return node_->getOriginalText(); + } + + + const SourceRange + ElementText::getOriginalSourceRange() const + { + if ( node_ ) + return node_->getRange(); + return SourceRange(); + } + + + bool + ElementText::hasOriginalSourceRange() const + { + return node_; + } + + + bool + ElementText::isOriginalText() const + { + return node_ && !hasNewText_; + } + + + bool + ElementText::isModifiedText() const + { + return node_ && hasNewText_; + } + + + bool + ElementText::isNewText() const + { + return !node_ && hasNewText_ ; + } + + + + Element::Element() ! // : wasReplaced_( false ) { ! // unsetSourceRange(); } *************** *** 25,28 **** --- 102,134 ---- void + Element::setOriginalText( const ElementText &text ) + { + text_ = text; + originalTextSet(); + } + + + void + Element::setText( const std::string &text ) + { + text_.setText( text ); + } + + + const ElementText & + Element::getText() const + { + return text_; + } + + + void + Element::originalTextSet() + { + } + + + #if 0 + void Element::setSourceRange( const SourceRange &sourceRange ) { *************** *** 65,68 **** --- 171,175 ---- wasReplaced_ = true; } + #endif Index: CodeModelExpressions.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeModelExpressions.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** CodeModelExpressions.cpp 25 Dec 2002 12:13:56 -0000 1.3 --- CodeModelExpressions.cpp 6 Mar 2003 22:17:57 -0000 1.4 *************** *** 16,19 **** --- 16,25 ---- + GenericExpression::GenericExpression( const ElementText &value ) + { + setOriginalText( value ); + } + + /* GenericExpression::GenericExpression( const std::string &value ) : value_( value ) *************** *** 35,39 **** value_ = value; } ! void --- 41,45 ---- value_ = value; } ! */ void Index: CodeModelStatements.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeModelStatements.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** CodeModelStatements.cpp 22 Dec 2002 15:47:34 -0000 1.2 --- CodeModelStatements.cpp 6 Mar 2003 22:17:57 -0000 1.3 *************** *** 7,10 **** --- 7,11 ---- #include <rfta/refactoring/CodeModelStatements.h> #include <rfta/refactoring/CodeModelVisitor.h> + #include <stdexcept> *************** *** 21,25 **** CompoundStatement::removeStatementAt( int index ) { ! statements_.erase( statements_.begin() + index ); } --- 22,29 ---- CompoundStatement::removeStatementAt( int index ) { ! StatementChange &change = statements_.at( getActualIndex( index ) ); ! change.type_ = Change::removed; ! change.oldRange_ = change.statement_->getText().getOriginalSourceRange(); ! change.statement_.reset(); } *************** *** 28,32 **** CompoundStatement::appendStatement( const StatementPtr &statement ) { ! statements_.push_back( statement ); } --- 32,36 ---- CompoundStatement::appendStatement( const StatementPtr &statement ) { ! statements_.push_back( StatementChange( Change::added, statement ) ); } *************** *** 36,40 **** const StatementPtr &statement ) { ! statements_.insert( statements_.begin() + index, statement ); } --- 40,45 ---- const StatementPtr &statement ) { ! statements_.insert( statements_.begin() + getActualIndex(index), ! StatementChange( Change::added, statement ) ); } *************** *** 44,48 **** const StatementPtr &statement ) { ! statements_.at( index ) = statement; } --- 49,56 ---- const StatementPtr &statement ) { ! StatementChange &change = statements_.at( getActualIndex( index ) ); ! change.type_ = Change::replaced; ! change.oldRange_ = change.statement_->getText().getOriginalSourceRange(); ! change.statement_ = statement; } *************** *** 51,55 **** CompoundStatement::getStatementCount() const { ! return statements_.size(); } --- 59,70 ---- CompoundStatement::getStatementCount() const { ! int count = 0; ! for ( Statements::const_iterator it = statements_.begin(); it != statements_.end(); ++it ) ! { ! if ( it->type_ != Change::removed ) ! ++count; ! } ! ! return count; } *************** *** 58,62 **** CompoundStatement::getStatementAt( int index ) const { ! return statements_.at( index ); } --- 73,91 ---- CompoundStatement::getStatementAt( int index ) const { ! return statements_.at( getActualIndex(index ) ).statement_; ! } ! ! ! int ! CompoundStatement::getActualIndex( int index ) const ! { ! int count = 0; ! for ( Statements::const_iterator it = statements_.begin(); it != statements_.end(); ++it ) ! { ! if ( it->type_ != Change::removed && count++ == index ) ! return it - statements_.begin(); ! } ! ! throw std::out_of_range( "index out of range for CompoundStatement::getActualIndex()" ); } *************** *** 67,70 **** --- 96,122 ---- visitor.visit( *this ); } + + + void + CompoundStatement::originalTextSet() + { + for ( Statements::iterator it = statements_.begin(); it != statements_.end(); ++it ) + it->type_ = Change::unmodified; + } + + + int + CompoundStatement::getChangeCount() const + { + return statements_.size(); + } + + + CompoundStatement::StatementChange + CompoundStatement::getChangeAt( int changeIndex ) const + { + return statements_.at( changeIndex ); + } + Index: CodeRewriter.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeRewriter.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** CodeRewriter.cpp 25 Dec 2002 12:13:56 -0000 1.2 --- CodeRewriter.cpp 6 Mar 2003 22:17:58 -0000 1.3 *************** *** 17,20 **** --- 17,24 ---- CodeRewriter::CodeRewriter( const std::string &originalSource ) : originalSource_( originalSource ) + , indentWidth_( 2 ) + , nextStatementInsertionPos_( 0 ) + , currentInsertionPos_( 0 ) + , indentManager_( originalSource ) { } *************** *** 36,39 **** --- 40,75 ---- + SourceRange + CodeRewriter::getCurrentInsertionRange() const + { + return SourceRange( currentInsertionPos_, 0 ); + } + + + void + CodeRewriter::replaceText( const SourceRange &range, + const std::string &content ) + { + transforms_.add( *new ReplaceTextTransform( range, content ) ); + } + + + void + CodeRewriter::deleteText( const SourceRange &range ) + { + replaceText( range, "" ); + } + + + void + CodeRewriter::setPreviousStatementEnd( CompoundStatement &statement, + int subStatementIndex ) + { + if ( subStatementIndex == 0 ) + { + } + } + + void CodeRewriter::visit( BreakStatement &statement ) *************** *** 51,56 **** CodeRewriter::visit( CompoundStatement &statement ) { ! for ( int index =0; index < statement.getStatementCount(); ++index ) ! statement.getStatementAt( index )->accept( *this ); } --- 87,116 ---- CodeRewriter::visit( CompoundStatement &statement ) { ! IndentLevelManager::IndentRestorer restorer( indentManager_ ); ! ! if ( statement.getText().hasOriginalSourceRange() ) ! { ! nextStatementInsertionPos_ = statement.getText().getOriginalSourceRange().getStartIndex() + 1; ! indentManager_.enterExistingStatement( nextStatementInsertionPos_ + 1 ); ! } ! ! for ( int index =0; index < statement.getChangeCount(); ++index ) ! { ! CompoundStatement::StatementChange change = statement.getChangeAt( index ); ! if ( change.type_ == Change::removed ) ! { ! deleteText( change.statement_->getText().getOriginalSourceRange() ); ! continue; ! } ! ! currentInsertionPos_ = nextStatementInsertionPos_; ! ! if ( change.type_ == Change::unmodified ) ! nextStatementInsertionPos_ = change.statement_->getText().getOriginalSourceRange().getEndIndex(); ! else if ( change.type_ == Change::replaced ) ! deleteText( change.statement_->getText().getOriginalSourceRange() ); ! ! change.statement_->accept( *this ); ! } } *************** *** 141,144 **** --- 201,212 ---- CodeRewriter::visit( ReturnStatement &statement ) { + const ElementText &text = statement.getText(); + if ( text.isOriginalText() ) + return; + + if ( text.isModifiedText() ) + replaceText( text.getOriginalSourceRange(), text.getOriginalText() ); + else if ( text.isNewText() ) + replaceText( getCurrentInsertionRange(), "\nreturn;" ); } *************** *** 195,202 **** CodeRewriter::visit( GenericExpression &expression ) { ! if ( expression.wasReplaced() ) { ! transforms_.add( *new ReplaceTextTransform( expression.getSourceRange(), ! expression.getValue() ) ); } } --- 263,270 ---- CodeRewriter::visit( GenericExpression &expression ) { ! if ( expression.getText().isModifiedText() ) { ! replaceText( expression.getText().getOriginalSourceRange(), ! expression.getText().getOriginalText() ); } } Index: CodeRewriter.h =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeRewriter.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** CodeRewriter.h 25 Dec 2002 12:13:56 -0000 1.2 --- CodeRewriter.h 6 Mar 2003 22:17:58 -0000 1.3 *************** *** 6,11 **** --- 6,15 ---- #define RFTA_CODEREWRITER_H + #include <rfta/parser/SourceRange.h> #include <rfta/refactoring/CodeModelVisitor.h> + #include "IndentLevelManager.h" #include "TransformList.h" + #include <string> + namespace Refactoring { *************** *** 61,67 **** --- 65,86 ---- void visit( NullExpression &expression ); + void setPreviousStatementEnd( CompoundStatement &statement, + int subStatementIndex ); + private: + SourceRange getCurrentInsertionRange() const; + + void replaceText( const SourceRange &range, + const std::string &content ); + + void deleteText( const SourceRange &range ); + + private: + IndentLevelManager indentManager_; TransformList transforms_; const std::string originalSource_; + int nextStatementInsertionPos_; + int currentInsertionPos_; + int indentWidth_; }; Index: CodeWriterTest.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterTest.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** CodeWriterTest.cpp 25 Dec 2002 22:40:51 -0000 1.3 --- CodeWriterTest.cpp 6 Mar 2003 22:17:58 -0000 1.4 *************** *** 47,51 **** CodeWriterTest::generateCompound() { ! parse(); ASTNodePtr compoundNode = sourceNode_->getChildAt(0); --- 47,51 ---- CodeWriterTest::generateCompound() { ! blankAndParse(); ASTNodePtr compoundNode = sourceNode_->getChildAt(0); *************** *** 60,66 **** CodeWriterTest::testRewriteStatement() { ! source_ = "{" ! " if ( true )" ! " return;" "}"; --- 60,66 ---- CodeWriterTest::testRewriteStatement() { ! source_ = "{\n" ! " if ( true )\n" ! " return;\n" "}"; *************** *** 74,85 **** static_cast<CodeModel::GenericExpression &>( *ifStatement.getCondition() ); ! condition.setValue( "false" ); CodeModel::CodeRewriter writer( source_ ); writer.rewrite( *compound_, *document_ ); ! std::string expectedSource = "{" ! " if ( false )" ! " return;" "}"; RFTA_ASSERT_EQUAL( expectedSource, document_->getAllText() ); --- 74,106 ---- static_cast<CodeModel::GenericExpression &>( *ifStatement.getCondition() ); ! condition.setText( "false" ); CodeModel::CodeRewriter writer( source_ ); writer.rewrite( *compound_, *document_ ); ! std::string expectedSource = "{\n" ! " if ( false )\n" ! " return;\n" ! "}"; ! RFTA_ASSERT_EQUAL( expectedSource, document_->getAllText() ); ! } ! ! ! void ! CodeWriterTest::testInsertStatement() ! { ! source_ = "{\n" ! "}"; ! ! generateCompound(); ! ! RFTA_ASSERT_EQUAL( 0, compound_->getStatementCount() ); ! compound_->appendStatement( CodeModel::StatementPtr( new CodeModel::ReturnStatement() ) ); ! ! CodeModel::CodeRewriter writer( source_ ); ! writer.rewrite( *compound_, *document_ ); ! ! std::string expectedSource = "{\n" ! "return;\n" "}"; RFTA_ASSERT_EQUAL( expectedSource, document_->getAllText() ); Index: CodeWriterTest.h =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterTest.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** CodeWriterTest.h 22 Dec 2002 15:47:01 -0000 1.1 --- CodeWriterTest.h 6 Mar 2003 22:17:58 -0000 1.2 *************** *** 21,24 **** --- 21,25 ---- CPPUNIT_TEST_SUITE( CodeWriterTest ); CPPUNIT_TEST( testRewriteStatement ); + CPPUNIT_TEST( testInsertStatement ); CPPUNIT_TEST_SUITE_END(); *************** *** 35,38 **** --- 36,40 ---- void testRewriteStatement(); + void testInsertStatement(); private: Index: rfta.dsp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/rfta.dsp,v retrieving revision 1.35 retrieving revision 1.36 diff -C2 -d -r1.35 -r1.36 *** rfta.dsp 31 Jan 2003 21:37:03 -0000 1.35 --- rfta.dsp 6 Mar 2003 22:17:59 -0000 1.36 *************** *** 942,945 **** --- 942,953 ---- # Begin Source File + SOURCE=.\IndentLevelManager.cpp + # End Source File + # Begin Source File + + SOURCE=.\IndentLevelManager.h + # End Source File + # Begin Source File + SOURCE=.\Makefile.am # End Source File |