From: <bl...@us...> - 2003-03-16 19:55:11
|
Update of /cvsroot/cpptool/rfta/src/rfta In directory sc8-pr-cvs1:/tmp/cvs-serv20936/src/rfta Modified Files: CodeRewriter.cpp CodeRewriter.h CodeWriterTest.cpp Log Message: * refactored some more Index: CodeRewriter.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeRewriter.cpp,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** CodeRewriter.cpp 16 Mar 2003 16:25:23 -0000 1.25 --- CodeRewriter.cpp 16 Mar 2003 19:55:05 -0000 1.26 *************** *** 117,120 **** --- 117,144 ---- + void + CodeRewriter::deleteTrailingExpression( const SourceRange &range ) + { + int startIndex = range.getStartIndex(); + while ( startIndex > 0 && isSpace( originalSource_.at( startIndex-1 ) ) ) + --startIndex; + + deleteText( SourceRange( startIndex, range.getEndIndex() - startIndex ) ); + } + + + void + CodeRewriter::deleteRange( const SourceRange &range, + DeletionType deletionType ) + { + if ( deletionType == statementDelete ) + deleteStatement( range ); + else if ( deletionType == trailingExpressionDelete ) + deleteTrailingExpression( range ); + else + deleteText( range ); + } + + bool CodeRewriter::isSpace( char c ) const *************** *** 139,154 **** void ! CodeRewriter::makeRequiredChangeAndVisitElement( const CodeModel::Change &change, ! CodeModel::Element &element, ! DeletionType deletionType ) { - // Element may only be unmodified or replaced... (should use a different enum type ?) - if ( isUpdating() && change.wasReplaced() ) { ! if ( deletionType == statementDelete ) ! deleteStatement( change.oldRange_ ); ! else ! deleteText( change.oldRange_ ); setCurrentInsertionPos( change.oldRange_.getEndIndex() ); } --- 163,173 ---- void ! CodeRewriter::handleMandatoryChange( const CodeModel::Change &change, ! CodeModel::Element &element, ! DeletionType deletionType ) { if ( isUpdating() && change.wasReplaced() ) { ! deleteRange( change.oldRange_, deletionType ); setCurrentInsertionPos( change.oldRange_.getEndIndex() ); } *************** *** 165,168 **** --- 184,221 ---- void + CodeRewriter::handleOptionalChange( const CodeModel::Change &change, + const CodeModel::ElementPtr &element, + const std::string &valueSeparator, + int addingIndex, + DeletionType deletionType ) + { + if ( isUpdating() && ( change.wasRemoved() || change.wasReplaced() ) ) + { + deleteRange( change.oldRange_, deletionType ); + setCurrentInsertionPos( change.oldRange_.getEndIndex() ); + } + + if ( !element + || ( isUpdating() && change.wasRemoved() ) ) + return; + + if ( isUpdating() && change.wasAdded() ) + setCurrentInsertionPos( addingIndex ); + + if ( isInserting() + || ( isUpdating() && (change.wasAdded() || change.wasReplaced() ) ) ) + insertText( valueSeparator ); + + ModeRestorer restorer( mode_ ); + if ( isUpdating() && change.isUnmodified() ) + mode_ = updating; + else + mode_ = inserting; + + element->accept( *this ); + } + + + void CodeRewriter::visit( BreakStatement &statement ) { *************** *** 322,327 **** insertText( "if ( " ); } ! makeRequiredChangeAndVisitElement( statement.getConditionChange(), ! *statement.getCondition() ); IndentLevelManager::IndentRestorer restorer( indentManager_ ); --- 375,380 ---- insertText( "if ( " ); } ! handleMandatoryChange( statement.getConditionChange(), ! *statement.getCondition() ); IndentLevelManager::IndentRestorer restorer( indentManager_ ); *************** *** 335,341 **** Change thenChange = statement.getThenStatementChange(); ! makeRequiredChangeAndVisitElement( thenChange, ! *statement.getThenStatement(), ! statementDelete ); Change elseChange = statement.getElseStatementChange(); --- 388,394 ---- Change thenChange = statement.getThenStatementChange(); ! handleMandatoryChange( thenChange, ! *statement.getThenStatement(), ! statementDelete ); Change elseChange = statement.getElseStatementChange(); *************** *** 418,451 **** CodeRewriter::visit( ReturnStatement &statement ) { ! if ( isUpdating() ) { ! Change change = statement.getValueChange(); ! if ( change.type_ == Change::replaced || change.type_ == Change::removed ) ! deleteText( change.oldRange_ ); ! ! if ( change.type_ == Change::removed || !statement.hasValue() ) ! return; ! ! ModeModifier mode( mode_, change.type_ == Change::unmodified ? updating : inserting ); ! if ( mode_ == inserting ) ! currentInsertionPos_ = statement.getSourceRange().getEndIndex() -1; ! if ( change.type_ == Change::added ) ! insertText( " " ); ! statement.getValue()->accept( *this ); ! } ! else if ( isInserting() ) ! { ! beginInsertNewStatement(); ! insertText( "return" ); ! if ( statement.hasValue() ) ! { ! insertText( " " ); ! statement.getValue()->accept( *this ); ! } endInsertNewStatement(); - } } --- 471,491 ---- CodeRewriter::visit( ReturnStatement &statement ) { ! const std::string keyWord( "return" ); ! if ( isInserting() ) { ! beginInsertNewStatement(); ! insertText( keyWord ); ! } ! SourceRange range( ); ! handleOptionalChange( statement.getValueChange(), ! statement.getValue(), ! " ", ! statement.getSourceRange().getStartIndex() + keyWord.length(), ! trailingExpressionDelete ); ! if ( isInserting() ) endInsertNewStatement(); } Index: CodeRewriter.h =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeRewriter.h,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** CodeRewriter.h 16 Mar 2003 16:25:24 -0000 1.11 --- CodeRewriter.h 16 Mar 2003 19:55:06 -0000 1.12 *************** *** 75,79 **** { minimalDelete =0, ! statementDelete }; --- 75,80 ---- { minimalDelete =0, ! statementDelete, ! trailingExpressionDelete }; *************** *** 131,141 **** void deleteStatement( const SourceRange &range ); bool isSpace( char c ) const; bool isNewLine( char c ) const; ! void makeRequiredChangeAndVisitElement( const CodeModel::Change &change, ! CodeModel::Element &element, ! DeletionType deletionType = minimalDelete ); void setCurrentInsertionPos( int index ); --- 132,161 ---- void deleteStatement( const SourceRange &range ); + void deleteTrailingExpression( const SourceRange &range ); + + void deleteRange( const SourceRange &range, + DeletionType deletionType ); + bool isSpace( char c ) const; bool isNewLine( char c ) const; ! /*! Handles text change for a element that always exist. ! * Possible changes are restricted to replaced and unmodified. ! */ ! void handleMandatoryChange( const CodeModel::Change &change, ! CodeModel::Element &element, ! DeletionType deletionType = minimalDelete ); ! ! /*! Handles text change for a element that may not exist. ! * Possible changes are replaced, unmodified, added and removed. ! * \param valueSeparator Text inserted before the element if it exist ! * \param addingIndex Index the element text is inserted at if it is being added. ! */ ! void handleOptionalChange( const CodeModel::Change &change, ! const CodeModel::ElementPtr &element, ! const std::string &valueSeparator, ! int addingIndex, ! DeletionType deletionType = minimalDelete ); void setCurrentInsertionPos( int index ); Index: CodeWriterTest.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterTest.cpp,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** CodeWriterTest.cpp 16 Mar 2003 16:18:41 -0000 1.26 --- CodeWriterTest.cpp 16 Mar 2003 19:55:06 -0000 1.27 *************** *** 283,287 **** returnStatement.setValue( CodeModel::ExpressionPtr() ); generateAndCheckSource( "{\n" ! " return ;\n" "}" ); } --- 283,287 ---- returnStatement.setValue( CodeModel::ExpressionPtr() ); generateAndCheckSource( "{\n" ! " return;\n" "}" ); } |