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