|
From: <bl...@us...> - 2003-03-18 22:38:15
|
Update of /cvsroot/cpptool/rfta/src/rfta
In directory sc8-pr-cvs1:/tmp/cvs-serv2540/src/rfta
Modified Files:
CodeModel.cpp CodeModelStatements.cpp CodeRewriter.cpp
CodeWriterInsertTest.cpp CodeWriterInsertTest.h
CodeWriterTest.cpp CodeWriterTest.h CodeWriterTestBase.cpp
CodeWriterTestBase.h IndentLevelManager.cpp
IndentLevelManager.h
Log Message:
* modified ForStatement generation (use null expression instead of missing property)
* added support for inserting and replacing ForStatement.
Index: CodeModel.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeModel.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** CodeModel.cpp 16 Mar 2003 13:44:25 -0000 1.7
--- CodeModel.cpp 18 Mar 2003 22:37:46 -0000 1.8
***************
*** 70,74 ****
{
CompoundStatementPtr compound( new CompoundStatement() );
- // compound->setSourceRange( compoundNode->getRange() );
for ( int index = 0; index < compoundNode->getChildCount(); ++index )
--- 70,73 ----
***************
*** 184,210 ****
statement->getProperty( ASTNodeProperties::iterationProperty );
- StatementPtr declaration;
ASTNodePtr declarationNode =
forIterationNode->getProperty( ASTNodeProperties::declarationProperty );
! if ( !declarationNode )
! declaration.reset( new NullStatement() );
! else
! declaration = generateStatement( declarationNode );
- ExpressionPtr condition;
ASTNodePtr conditionNode =
forIterationNode->getProperty( ASTNodeProperties::conditionProperty );
! if ( !conditionNode )
! condition.reset( new DefaultConditionExpression() );
! else
! condition = generateExpression( conditionNode );
- ExpressionPtr iteration;
ASTNodePtr iterationNode =
! forIterationNode->getProperty( ASTNodeProperties::iterationProperty );
! if ( !iterationNode )
! iteration.reset( new NullExpression() );
! else
! iteration = generateExpression( iterationNode );
return StatementPtr( new ForStatement( declaration,
--- 183,197 ----
statement->getProperty( ASTNodeProperties::iterationProperty );
ASTNodePtr declarationNode =
forIterationNode->getProperty( ASTNodeProperties::declarationProperty );
! ExpressionPtr declaration = generateExpression( declarationNode );
ASTNodePtr conditionNode =
forIterationNode->getProperty( ASTNodeProperties::conditionProperty );
! ExpressionPtr condition = generateExpression( conditionNode );
ASTNodePtr iterationNode =
! forIterationNode->getProperty( ASTNodeProperties::nextStepProperty );
! ExpressionPtr iteration = generateExpression( iterationNode );
return StatementPtr( new ForStatement( declaration,
Index: CodeModelStatements.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeModelStatements.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -C2 -d -r1.15 -r1.16
*** CodeModelStatements.cpp 16 Mar 2003 21:38:41 -0000 1.15
--- CodeModelStatements.cpp 18 Mar 2003 22:37:47 -0000 1.16
***************
*** 333,372 ****
! ForStatement::ForStatement( const StatementPtr &declaration,
const ExpressionPtr &condition,
const ExpressionPtr &iteration,
const StatementPtr &iteratedStatement )
: IterationStatement( condition, iteratedStatement )
! , declarationStatement_( declaration )
! , iterationExpression_( iteration )
{
}
! StatementPtr
! ForStatement::getDeclarationStatement() const
{
! return declarationStatement_;
}
void
! ForStatement::setDeclarationStatement( const StatementPtr &statement )
{
! declarationStatement_ = statement;
}
ExpressionPtr
! ForStatement::getIterationExpression() const
{
! return iterationExpression_;
}
void
! ForStatement::getIterationExpression( const ExpressionPtr &iteration )
{
! iterationExpression_ = iteration;
}
--- 333,387 ----
!
! ForStatement::ForStatement( const ExpressionPtr &declaration,
const ExpressionPtr &condition,
const ExpressionPtr &iteration,
const StatementPtr &iteratedStatement )
: IterationStatement( condition, iteratedStatement )
! , declarationTracker_( declaration )
! , iterationTracker_( iteration )
{
}
! ExpressionPtr
! ForStatement::getDeclaration() const
{
! return declarationTracker_.getElement();
}
void
! ForStatement::setDeclaration( const ExpressionPtr &declaration )
{
! declarationTracker_.setElement( declaration );
! }
!
!
! Change
! ForStatement::getDeclarationChange() const
! {
! return declarationTracker_.getChange();
}
ExpressionPtr
! ForStatement::getIteration() const
{
! return iterationTracker_.getElement();
}
void
! ForStatement::setIteration( const ExpressionPtr &iteration )
{
! iterationTracker_.setElement( iteration );
! }
!
!
! Change
! ForStatement::getIterationChange() const
! {
! return iterationTracker_.getChange();
}
***************
*** 384,387 ****
--- 399,404 ----
{
IterationStatement::setElementIsFromSource();
+ declarationTracker_.setElementIsFromSource();
+ iterationTracker_.setElementIsFromSource();
}
Index: CodeRewriter.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeRewriter.cpp,v
retrieving revision 1.30
retrieving revision 1.31
diff -C2 -d -r1.30 -r1.31
*** CodeRewriter.cpp 16 Mar 2003 21:38:41 -0000 1.30
--- CodeRewriter.cpp 18 Mar 2003 22:37:48 -0000 1.31
***************
*** 196,200 ****
mode_ = inserting;
! if ( isInserting() && deletionType == bracedExpressionDelete )
insertText( " " );
--- 196,201 ----
mode_ = inserting;
! if ( isInserting() && ( deletionType == bracedExpressionDelete
! || deletionType == trailingExpressionDelete ) )
insertText( " " );
***************
*** 412,415 ****
--- 413,454 ----
CodeRewriter::visit( ForStatement &statement )
{
+ if ( isInserting() )
+ {
+ beginInsertNewStatement();
+ insertText( "for (" );
+ }
+
+ handleMandatoryChange( statement.getDeclarationChange(),
+ *statement.getDeclaration(),
+ trailingExpressionDelete );
+
+ if ( isInserting() )
+ insertText( ";" );
+
+ handleMandatoryChange( statement.getConditionChange(),
+ *statement.getCondition(),
+ trailingExpressionDelete );
+
+ if ( isInserting() )
+ insertText( ";" );
+
+ handleMandatoryChange( statement.getIterationChange(),
+ *statement.getIteration(),
+ bracedExpressionDelete );
+
+ IndentLevelManager::IndentRestorer restorer( indentManager_ );
+ StatementPtr iteratedStatement = statement.getIteratedStatement();
+ if ( isInserting() )
+ {
+ insertText( ")" );
+ indentManager_.enterNewWhileStatement( iteratedStatement );
+ }
+ else
+ indentManager_.enterExistingForStatement( iteratedStatement,
+ statement.getSourceRange().getStartIndex() );
+
+ handleMandatoryChange( statement.getIteratedStatementChange(),
+ *iteratedStatement,
+ statementDelete );
}
***************
*** 418,424 ****
CodeRewriter::visit( GotoStatement &statement )
{
! beginInsertNewStatement();
! insertText( "goto " + statement.getLabel()->getLabelName() );
! endInsertNewStatement();
}
--- 457,473 ----
CodeRewriter::visit( GotoStatement &statement )
{
! if ( isInserting() )
! {
! beginInsertNewStatement();
! insertText( "goto " + statement.getLabel()->getLabelName() );
! }
! /* // Need to add visitor for Label...
! // insertText( "goto " + statement.getLabel()->getLabelName() );
! handleMandatoryChange( statement.getLabelChange(),
! *statement.getLabel(),
! trailingExpressionDelete );
! */
! if ( isInserting() )
! endInsertNewStatement();
}
Index: CodeWriterInsertTest.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterInsertTest.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** CodeWriterInsertTest.cpp 16 Mar 2003 15:33:10 -0000 1.4
--- CodeWriterInsertTest.cpp 18 Mar 2003 22:37:48 -0000 1.5
***************
*** 191,196 ****
CodeWriterInsertTest::testInsertLabelStatement()
{
! CodeModel::LabelPtr label( new CodeModel::Label( "error" ) );
! CodeModel::StatementPtr labelStatement( new CodeModel::LabelStatement( label ) );
checkGeneratedSource( labelStatement,
"{\n"
--- 191,195 ----
CodeWriterInsertTest::testInsertLabelStatement()
{
! CodeModel::StatementPtr labelStatement( new CodeModel::LabelStatement( makeLabel( "error" ) ) );
checkGeneratedSource( labelStatement,
"{\n"
***************
*** 203,208 ****
CodeWriterInsertTest::testInsertGotoStatement()
{
! CodeModel::LabelPtr label( new CodeModel::Label( "error" ) );
! CodeModel::StatementPtr gotoStatement( new CodeModel::GotoStatement( label ) );
checkGeneratedSource( gotoStatement,
"{\n"
--- 202,206 ----
CodeWriterInsertTest::testInsertGotoStatement()
{
! CodeModel::StatementPtr gotoStatement( new CodeModel::GotoStatement( makeLabel( "error" ) ) );
checkGeneratedSource( gotoStatement,
"{\n"
***************
*** 254,257 ****
--- 252,276 ----
"{\n"
" call( 1234 );\n"
+ "}" );
+ }
+
+
+ void
+ CodeWriterInsertTest::testInsertForStatement()
+ {
+ CodeModel::ExpressionPtr declaration( makeExpression( "x = 0" ) );
+ CodeModel::ExpressionPtr condition( makeExpression( "x < 10" ) );
+ CodeModel::ExpressionPtr iteration( makeExpression( "++x" ) );
+ CodeModel::StatementPtr iteratedStatement( new CodeModel::NullStatement() );
+
+ CodeModel::ForStatementPtr forStatement(
+ new CodeModel::ForStatement( declaration,
+ condition,
+ iteration,
+ iteratedStatement ) );
+ checkGeneratedSource( forStatement,
+ "{\n"
+ " for ( x = 0; x < 10; ++x )\n"
+ " ;\n"
"}" );
}
Index: CodeWriterInsertTest.h
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterInsertTest.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** CodeWriterInsertTest.h 16 Mar 2003 10:23:07 -0000 1.3
--- CodeWriterInsertTest.h 18 Mar 2003 22:37:48 -0000 1.4
***************
*** 32,35 ****
--- 32,36 ----
CPPUNIT_TEST( testInsertIfThenElseStatement );
CPPUNIT_TEST( testInsertExpressionStatement );
+ CPPUNIT_TEST( testInsertForStatement );
CPPUNIT_TEST_SUITE_END();
***************
*** 56,59 ****
--- 57,61 ----
void testInsertIfThenElseStatement();
void testInsertExpressionStatement();
+ void testInsertForStatement();
private:
Index: CodeWriterTest.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterTest.cpp,v
retrieving revision 1.31
retrieving revision 1.32
diff -C2 -d -r1.31 -r1.32
*** CodeWriterTest.cpp 16 Mar 2003 21:38:41 -0000 1.31
--- CodeWriterTest.cpp 18 Mar 2003 22:37:48 -0000 1.32
***************
*** 419,422 ****
--- 419,522 ----
+ void
+ CodeWriterTest::testModifyGotoStatement()
+ {
+ source_ = "{\n"
+ " goto label2;\n"
+ "}";
+ generateCompound();
+
+ CodeModel::GotoStatement &gotoStatement =
+ dynamic_cast<CodeModel::GotoStatement &>( *compound_->getStatementAt(0) );
+ gotoStatement.setLabel( makeLabel( "error" ) );
+ generateAndCheckSource( "{\n"
+ " goto error;\n"
+ "}" );
+ }
+
+
+ void
+ CodeWriterTest::testModifyForDeclarationExpression()
+ {
+ source_ = "{\n"
+ " for( ; x <10; ++x )\n"
+ " {\n"
+ " }\n"
+ "}";
+ generateCompound();
+
+ CodeModel::ForStatement &forStatement =
+ dynamic_cast<CodeModel::ForStatement &>( *compound_->getStatementAt(0) );
+ forStatement.setDeclaration( makeExpression( "x = 0" ) );
+ generateAndCheckSource( "{\n"
+ " for( x = 0; x <10; ++x )\n"
+ " {\n"
+ " }\n"
+ "}" );
+ }
+
+
+ void
+ CodeWriterTest::testModifyForConditionExpression()
+ {
+ source_ = "{\n"
+ " for( ; x < 10; ++x )\n"
+ " {\n"
+ " }\n"
+ "}";
+ generateCompound();
+
+ CodeModel::ForStatement &forStatement =
+ dynamic_cast<CodeModel::ForStatement &>( *compound_->getStatementAt(0) );
+ forStatement.setCondition( makeExpression( "x+y < 100" ) );
+ generateAndCheckSource( "{\n"
+ " for( ; x+y < 100; ++x )\n"
+ " {\n"
+ " }\n"
+ "}" );
+ }
+
+
+ void
+ CodeWriterTest::testModifyForIterationExpression()
+ {
+ source_ = "{\n"
+ " for( ; x < 10; ++x )\n"
+ " {\n"
+ " }\n"
+ "}";
+ generateCompound();
+
+ CodeModel::ForStatement &forStatement =
+ dynamic_cast<CodeModel::ForStatement &>( *compound_->getStatementAt(0) );
+ forStatement.setIteration( makeExpression( "y++, x++" ) );
+ generateAndCheckSource( "{\n"
+ " for( ; x < 10; y++, x++ )\n"
+ " {\n"
+ " }\n"
+ "}" );
+ }
+
+
+ void
+ CodeWriterTest::testModifyForIteratedStatement()
+ {
+ source_ = "{\n"
+ " for( ; x < 10; ++x )\n"
+ " {\n"
+ " }\n"
+ "}";
+ generateCompound();
+
+ CodeModel::ForStatement &forStatement =
+ dynamic_cast<CodeModel::ForStatement &>( *compound_->getStatementAt(0) );
+ forStatement.setIteratedStatement( makeBreakStatement() );
+ generateAndCheckSource( "{\n"
+ " for( ; x < 10; ++x )\n"
+ " break;\n"
+ "}" );
+ }
+
+
} // namespace Refactoring
Index: CodeWriterTest.h
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterTest.h,v
retrieving revision 1.26
retrieving revision 1.27
diff -C2 -d -r1.26 -r1.27
*** CodeWriterTest.h 16 Mar 2003 21:38:41 -0000 1.26
--- CodeWriterTest.h 18 Mar 2003 22:37:49 -0000 1.27
***************
*** 35,38 ****
--- 35,43 ----
CPPUNIT_TEST( testModifyCaseStatement );
CPPUNIT_TEST( testModifyExpressionStatement );
+ // CPPUNIT_TEST( testModifyGotoStatement ); // goto is not parsed, yet...
+ CPPUNIT_TEST( testModifyForDeclarationExpression );
+ CPPUNIT_TEST( testModifyForConditionExpression );
+ CPPUNIT_TEST( testModifyForIterationExpression );
+ CPPUNIT_TEST( testModifyForIteratedStatement );
CPPUNIT_TEST_SUITE_END();
***************
*** 72,75 ****
--- 77,87 ----
void testModifyExpressionStatement();
+
+ void testModifyGotoStatement();
+
+ void testModifyForDeclarationExpression();
+ void testModifyForConditionExpression();
+ void testModifyForIterationExpression();
+ void testModifyForIteratedStatement();
private:
Index: CodeWriterTestBase.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterTestBase.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** CodeWriterTestBase.cpp 16 Mar 2003 10:23:07 -0000 1.2
--- CodeWriterTestBase.cpp 18 Mar 2003 22:37:50 -0000 1.3
***************
*** 74,77 ****
--- 74,84 ----
+ CodeModel::LabelPtr
+ CodeWriterTestBase::makeLabel( const std::string &labelName )
+ {
+ return CodeModel::LabelPtr( new CodeModel::Label( labelName ) );
+ }
+
+
void
CodeWriterTestBase::generateAndCheckSource( const std::string &expectedSource )
Index: CodeWriterTestBase.h
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterTestBase.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** CodeWriterTestBase.h 16 Mar 2003 10:23:07 -0000 1.2
--- CodeWriterTestBase.h 18 Mar 2003 22:37:51 -0000 1.3
***************
*** 34,37 ****
--- 34,39 ----
CodeModel::StatementPtr makeBreakStatement();
+ CodeModel::LabelPtr makeLabel( const std::string &labelName );
+
void generateAndCheckSource( const std::string &expectedSource );
Index: IndentLevelManager.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/IndentLevelManager.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** IndentLevelManager.cpp 16 Mar 2003 20:57:23 -0000 1.8
--- IndentLevelManager.cpp 18 Mar 2003 22:37:51 -0000 1.9
***************
*** 95,98 ****
--- 95,115 ----
+ void
+ IndentLevelManager::enterExistingForStatement( const CodeModel::StatementPtr &subStatement,
+ int startingPos )
+ {
+ if ( !isCompoundStatement( subStatement ) )
+ pushIndent( findIndentLevelOf( startingPos ) + indentWidth_ );
+ }
+
+
+ void
+ IndentLevelManager::enterNewForStatement( const CodeModel::StatementPtr &subStatement )
+ {
+ if ( !isCompoundStatement( subStatement ) )
+ pushIndent( getIndentLevel() + indentWidth_ );
+ }
+
+
bool
IndentLevelManager::isCompoundStatement( const CodeModel::StatementPtr &subStatement ) const
Index: IndentLevelManager.h
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/IndentLevelManager.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** IndentLevelManager.h 16 Mar 2003 20:57:24 -0000 1.9
--- IndentLevelManager.h 18 Mar 2003 22:37:51 -0000 1.10
***************
*** 76,79 ****
--- 76,84 ----
void enterNewDoStatement( const CodeModel::StatementPtr &subStatement );
+ void enterExistingForStatement( const CodeModel::StatementPtr &subStatement,
+ int startingPos );
+
+ void enterNewForStatement( const CodeModel::StatementPtr &subStatement );
+
int getIndentLevel() const;
|