|
From: <bl...@us...> - 2003-03-16 10:23:13
|
Update of /cvsroot/cpptool/rfta/src/rfta
In directory sc8-pr-cvs1:/tmp/cvs-serv373/src/rfta
Modified Files:
CodeModelStatements.cpp CodeRewriter.cpp CodeRewriter.h
CodeWriterInsertTest.cpp CodeWriterInsertTest.h
CodeWriterTest.cpp CodeWriterTest.h CodeWriterTestBase.cpp
CodeWriterTestBase.h IndentLevelManager.cpp
IndentLevelManager.h
Log Message:
* added support for modification of the if/then substatement.
Index: CodeModelStatements.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeModelStatements.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** CodeModelStatements.cpp 15 Mar 2003 21:51:43 -0000 1.5
--- CodeModelStatements.cpp 16 Mar 2003 10:23:07 -0000 1.6
***************
*** 179,183 ****
--- 179,192 ----
IfStatement::setThenStatement( const StatementPtr &statement )
{
+ thenStatementChange_.type_ = Change::replaced;
+ thenStatementChange_.oldRange_ = thenStatement_->getText().getOriginalSourceRange();
thenStatement_ = statement;
+ }
+
+
+ Change
+ IfStatement::getThenStatementChange() const
+ {
+ return thenStatementChange_;
}
Index: CodeRewriter.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeRewriter.cpp,v
retrieving revision 1.16
retrieving revision 1.17
diff -C2 -d -r1.16 -r1.17
*** CodeRewriter.cpp 16 Mar 2003 07:14:31 -0000 1.16
--- CodeRewriter.cpp 16 Mar 2003 10:23:07 -0000 1.17
***************
*** 18,22 ****
: originalSource_( originalSource )
, indentWidth_( indentWidth )
- , nextStatementInsertionPos_( 0 )
, currentInsertionPos_( 0 )
, indentManager_( originalSource )
--- 18,21 ----
***************
*** 106,109 ****
--- 105,135 ----
void
+ CodeRewriter::deleteStatement( const SourceRange &range )
+ {
+ int startIndex = range.getStartIndex();
+ while ( startIndex > 0 && isSpace( originalSource_.at( startIndex-1 ) ) )
+ --startIndex;
+ while ( startIndex > 0 && isNewLine( originalSource_.at( startIndex-1 ) ) )
+ --startIndex;
+
+ deleteText( SourceRange( startIndex, range.getEndIndex() - startIndex ) );
+ }
+
+
+ bool
+ CodeRewriter::isSpace( char c ) const
+ {
+ return c == ' ' || c == '\t';
+ }
+
+
+ bool
+ CodeRewriter::isNewLine( char c ) const
+ {
+ return c == '\n' || c == '\r';
+ }
+
+
+ void
CodeRewriter::visit( BreakStatement &statement )
{
***************
*** 134,137 ****
--- 160,164 ----
{
IndentLevelManager::IndentRestorer restorer( indentManager_ );
+ int nextStatementInsertionPos = currentInsertionPos_;
if ( isInserting() )
***************
*** 142,147 ****
else if ( statement.getText().hasOriginalSourceRange() )
{
! nextStatementInsertionPos_ = statement.getText().getOriginalSourceRange().getStartIndex() + 1;
! indentManager_.enterExistingCompoundStatement( nextStatementInsertionPos_ - 1 );
}
--- 169,174 ----
else if ( statement.getText().hasOriginalSourceRange() )
{
! nextStatementInsertionPos = statement.getText().getOriginalSourceRange().getStartIndex() + 1;
! indentManager_.enterExistingCompoundStatement( nextStatementInsertionPos - 1 );
}
***************
*** 155,162 ****
}
! currentInsertionPos_ = nextStatementInsertionPos_;
if ( change.type_ == Change::unmodified )
! nextStatementInsertionPos_ = change.statement_->getText().getOriginalSourceRange().getEndIndex();
else if ( change.type_ == Change::replaced )
deleteText( change.statement_->getText().getOriginalSourceRange() );
--- 182,189 ----
}
! currentInsertionPos_ = nextStatementInsertionPos;
if ( change.type_ == Change::unmodified )
! nextStatementInsertionPos = change.statement_->getText().getOriginalSourceRange().getEndIndex();
else if ( change.type_ == Change::replaced )
deleteText( change.statement_->getText().getOriginalSourceRange() );
***************
*** 270,274 ****
indentManager_.enterNewIfStatement();
}
! statement.getThenStatement()->accept( *this );
if ( statement.hasElseStatement() )
{
--- 297,321 ----
indentManager_.enterNewIfStatement();
}
! else if ( statement.getText().hasOriginalSourceRange() )
! indentManager_.enterExistingIfStatement( statement.getText().getOriginalSourceRange().getStartIndex() );
!
! Change thenChange = statement.getThenStatementChange();
! if ( !isInserting() && !thenChange.isUnmodified() )
! {
! deleteStatement( thenChange.oldRange_ );
! if ( thenChange.wasReplaced() )
! currentInsertionPos_ = thenChange.oldRange_.getEndIndex();
! }
!
! Mode thenMode;
! if ( isInserting() || !thenChange.isUnmodified() )
! thenMode = inserting;
! else
! thenMode = updating;
!
! {
! ModeModifier mode( mode_, thenMode );
! statement.getThenStatement()->accept( *this );
! }
if ( statement.hasElseStatement() )
{
Index: CodeRewriter.h
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeRewriter.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** CodeRewriter.h 15 Mar 2003 22:05:23 -0000 1.8
--- CodeRewriter.h 16 Mar 2003 10:23:07 -0000 1.9
***************
*** 108,113 ****
--- 108,121 ----
void beginInsertNewStatement();
+
void endInsertNewStatement();
+
void endInsertNewLabelStatement();
+
+ void deleteStatement( const SourceRange &range );
+
+ bool isSpace( char c ) const;
+
+ bool isNewLine( char c ) const;
private:
***************
*** 115,119 ****
TransformList transforms_;
const std::string originalSource_;
- int nextStatementInsertionPos_;
int currentInsertionPos_;
int indentWidth_;
--- 123,126 ----
Index: CodeWriterInsertTest.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterInsertTest.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** CodeWriterInsertTest.cpp 16 Mar 2003 08:27:33 -0000 1.2
--- CodeWriterInsertTest.cpp 16 Mar 2003 10:23:07 -0000 1.3
***************
*** 45,57 ****
{
compound_->appendStatement( insertedStatement );
! checkGeneratedSource( expectedSource );
! }
!
!
! void
! CodeWriterInsertTest::checkGeneratedSource( const std::string &expectedSource )
! {
! rewriteSource();
! RFTA_ASSERT_EQUAL( expectedSource, document_->getAllText() );
}
--- 45,49 ----
{
compound_->appendStatement( insertedStatement );
! generateAndCheckSource( expectedSource );
}
***************
*** 62,68 ****
compound_->appendStatement( CodeModel::StatementPtr( new CodeModel::ReturnStatement() ) );
! checkGeneratedSource( "{\n"
! " return;\n"
! "}" );
}
--- 54,60 ----
compound_->appendStatement( CodeModel::StatementPtr( new CodeModel::ReturnStatement() ) );
! generateAndCheckSource( "{\n"
! " return;\n"
! "}" );
}
Index: CodeWriterInsertTest.h
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterInsertTest.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** CodeWriterInsertTest.h 16 Mar 2003 08:27:33 -0000 1.2
--- CodeWriterInsertTest.h 16 Mar 2003 10:23:07 -0000 1.3
***************
*** 60,65 ****
void checkGeneratedSource( const CodeModel::StatementPtr &insertedStatement,
const std::string &expectedSource );
-
- void checkGeneratedSource( const std::string &expectedSource );
};
--- 60,63 ----
Index: CodeWriterTest.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterTest.cpp,v
retrieving revision 1.19
retrieving revision 1.20
diff -C2 -d -r1.19 -r1.20
*** CodeWriterTest.cpp 16 Mar 2003 08:27:33 -0000 1.19
--- CodeWriterTest.cpp 16 Mar 2003 10:23:07 -0000 1.20
***************
*** 149,151 ****
--- 149,170 ----
+ void
+ CodeWriterTest::testModifyIfThenStatement()
+ {
+ source_ = "{\n"
+ " if ( true )\n"
+ " return;\n"
+ "}";
+ generateCompound();
+
+ CodeModel::IfStatement &ifStatement =
+ dynamic_cast<CodeModel::IfStatement &>( *compound_->getStatementAt(0) );
+ ifStatement.setThenStatement( makeBreakStatement() );
+ generateAndCheckSource( "{\n"
+ " if ( true )\n"
+ " break;\n"
+ "}" );
+ }
+
+
} // namespace Refactoring
Index: CodeWriterTest.h
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterTest.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -C2 -d -r1.16 -r1.17
*** CodeWriterTest.h 16 Mar 2003 08:27:33 -0000 1.16
--- CodeWriterTest.h 16 Mar 2003 10:23:07 -0000 1.17
***************
*** 21,24 ****
--- 21,25 ----
CPPUNIT_TEST( testRemoveStatement );
CPPUNIT_TEST( testMoveSubExpression );
+ CPPUNIT_TEST( testModifyIfThenStatement );
CPPUNIT_TEST_SUITE_END();
***************
*** 38,41 ****
--- 39,43 ----
void testRemoveStatement();
void testMoveSubExpression();
+ void testModifyIfThenStatement();
private:
Index: CodeWriterTestBase.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterTestBase.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** CodeWriterTestBase.cpp 16 Mar 2003 07:37:05 -0000 1.1
--- CodeWriterTestBase.cpp 16 Mar 2003 10:23:07 -0000 1.2
***************
*** 67,69 ****
--- 67,84 ----
+ CodeModel::StatementPtr
+ CodeWriterTestBase::makeBreakStatement()
+ {
+ return CodeModel::StatementPtr( new CodeModel::BreakStatement() );
+ }
+
+
+ void
+ CodeWriterTestBase::generateAndCheckSource( const std::string &expectedSource )
+ {
+ rewriteSource();
+ RFTA_ASSERT_EQUAL( expectedSource, document_->getAllText() );
+ }
+
+
} // namespace Refactoring
Index: CodeWriterTestBase.h
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterTestBase.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** CodeWriterTestBase.h 16 Mar 2003 07:37:05 -0000 1.1
--- CodeWriterTestBase.h 16 Mar 2003 10:23:07 -0000 1.2
***************
*** 25,31 ****
--- 25,38 ----
protected:
void generateCompound();
+
void rewriteSource();
+
CodeModel::ExpressionPtr makeTrueExpression();
+
CodeModel::ExpressionPtr makeExpression( const std::string &expression );
+
+ CodeModel::StatementPtr makeBreakStatement();
+
+ void generateAndCheckSource( const std::string &expectedSource );
CodeModel::CompoundStatementPtr compound_;
Index: IndentLevelManager.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/IndentLevelManager.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** IndentLevelManager.cpp 16 Mar 2003 06:59:07 -0000 1.5
--- IndentLevelManager.cpp 16 Mar 2003 10:23:07 -0000 1.6
***************
*** 47,50 ****
--- 47,57 ----
void
+ IndentLevelManager::enterExistingIfStatement( int startingPos )
+ {
+ pushIndent( findIndentLevelOf( startingPos ) + indentWidth_ );
+ }
+
+
+ void
IndentLevelManager::enterNewElseStatement()
{
Index: IndentLevelManager.h
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/IndentLevelManager.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** IndentLevelManager.h 16 Mar 2003 06:59:07 -0000 1.6
--- IndentLevelManager.h 16 Mar 2003 10:23:07 -0000 1.7
***************
*** 62,65 ****
--- 62,67 ----
void enterNewIfStatement();
+ void enterExistingIfStatement( int startingPos );
+
void enterNewElseStatement();
|