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