|
From: <sve...@us...> - 2003-04-21 03:08:58
|
Update of /cvsroot/cpptool/rfta/src/rfta
In directory sc8-pr-cvs1:/tmp/cvs-serv8439/src/rfta
Modified Files:
CodeWriterTest.h CodeWriterTest.cpp CodeRewriter.h
CodeRewriter.cpp CodeModelGeneratorTest.h
CodeModelGeneratorTest.cpp CodeModelExpressions.cpp
CodeModelElement.cpp CodeModel.cpp
Log Message:
improved code rewriting for declaration lists
Index: CodeWriterTest.h
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterTest.h,v
retrieving revision 1.28
retrieving revision 1.29
diff -C2 -d -r1.28 -r1.29
*** CodeWriterTest.h 10 Apr 2003 08:37:51 -0000 1.28
--- CodeWriterTest.h 21 Apr 2003 03:08:53 -0000 1.29
***************
*** 17,20 ****
--- 17,21 ----
{
CPPUNIT_TEST_SUITE( CodeWriterTest );
+ CPPUNIT_TEST( testRewriteUnchanged );
CPPUNIT_TEST( testRewriteStatement );
CPPUNIT_TEST( testInsertReturnValueStatement );
***************
*** 41,44 ****
--- 42,49 ----
CPPUNIT_TEST( testModifyForIteratedStatement );
CPPUNIT_TEST( testModifyDeclarationExpresion );
+ CPPUNIT_TEST( testAddDeclaratorFront );
+ CPPUNIT_TEST( testRemoveDeclaratorBeginning );
+ CPPUNIT_TEST( testRemoveDeclaratorMiddle );
+ CPPUNIT_TEST_FAIL( testRemoveDeclaratorEnd );
CPPUNIT_TEST_SUITE_END();
***************
*** 53,57 ****
void setUp();
void tearDown();
!
void testRewriteStatement();
void testInsertReturnValueStatement();
--- 58,62 ----
void setUp();
void tearDown();
! void testRewriteUnchanged();
void testRewriteStatement();
void testInsertReturnValueStatement();
***************
*** 87,90 ****
--- 92,99 ----
void testModifyDeclarationExpresion();
+ void testAddDeclaratorFront();
+ void testRemoveDeclaratorBeginning();
+ void testRemoveDeclaratorMiddle();
+ void testRemoveDeclaratorEnd();
private:
Index: CodeWriterTest.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeWriterTest.cpp,v
retrieving revision 1.34
retrieving revision 1.35
diff -C2 -d -r1.34 -r1.35
*** CodeWriterTest.cpp 10 Apr 2003 08:37:51 -0000 1.34
--- CodeWriterTest.cpp 21 Apr 2003 03:08:53 -0000 1.35
***************
*** 37,40 ****
--- 37,57 ----
}
+ void
+ CodeWriterTest::testRewriteUnchanged()
+ {
+ source_ = "{ double x, y; }";
+ generateCompound();
+ RFTA_ASSERT_EQUAL( 1, compound_->getStatementCount() );
+
+ CodeModel::DeclarationStatement& declarationStatement
+ = dynamic_cast<CodeModel::DeclarationStatement&> (*compound_->getStatementAt(0) );
+ CodeModel::DeclaratorExpressionPtr declaratorExpression
+ = declarationStatement.getDeclaration();
+ RFTA_ASSERT_EQUAL( 2, declaratorExpression->getDeclaratorCount());
+ std::string expectedSource(source_);
+ rewriteSource();
+
+ RFTA_ASSERT_EQUAL( expectedSource, document_->getAllText() );
+ }
void
***************
*** 539,542 ****
--- 556,620 ----
+ void
+ CodeWriterTest::testAddDeclaratorFront()
+ {
+ source_ = "{\n"
+ " int x;\n"
+ "}";
+ generateCompound();
+ CodeModel::DeclarationStatement &declarationStatement =
+ dynamic_cast<CodeModel::DeclarationStatement &>( *compound_->getStatementAt(0) );
+ CodeModel::DeclaratorPtr declarator( new CodeModel::Declarator( makeTypePart(""),
+ makeIdentifier("y"),
+ makeTypePart("") ) );
+ declarationStatement.getDeclaration()->insertDeclaratorAt(0, declarator );
+ generateAndCheckSource( "{\n"
+ " int y, x;\n"
+ "}" );
+ }
+
+ void
+ CodeWriterTest::testRemoveDeclaratorBeginning()
+ {
+ source_ = "{\n"
+ " int x, y, z;\n"
+ "}";
+ generateCompound();
+ CodeModel::DeclarationStatement &declarationStatement =
+ dynamic_cast<CodeModel::DeclarationStatement &>( *compound_->getStatementAt(0) );
+ declarationStatement.getDeclaration()->removeDeclaratorAt(0);
+ generateAndCheckSource( "{\n"
+ " int y, z;\n"
+ "}");
+ }
+ void
+ CodeWriterTest::testRemoveDeclaratorMiddle()
+ {
+ source_ = "{\n"
+ " int x, y, z;\n"
+ "}";
+ generateCompound();
+ CodeModel::DeclarationStatement &declarationStatement =
+ dynamic_cast<CodeModel::DeclarationStatement &>( *compound_->getStatementAt(0) );
+ declarationStatement.getDeclaration()->removeDeclaratorAt(1);
+ generateAndCheckSource( "{\n"
+ " int x, z;\n"
+ "}");
+ }
+ void
+ CodeWriterTest::testRemoveDeclaratorEnd()
+ {
+ CPPUNIT_FAIL( "fails due to some problems with text transforms" );
+ source_ = "{\n"
+ " int x, y, z;\n"
+ "}";
+ generateCompound();
+ CodeModel::DeclarationStatement &declarationStatement =
+ dynamic_cast<CodeModel::DeclarationStatement &>( *compound_->getStatementAt(0) );
+ declarationStatement.getDeclaration()->removeDeclaratorAt(2);
+ generateAndCheckSource( "{\n"
+ " int x, y;\n"
+ "}");
+ }
} // namespace Refactoring
Index: CodeRewriter.h
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeRewriter.h,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -d -r1.17 -r1.18
*** CodeRewriter.h 10 Apr 2003 08:37:50 -0000 1.17
--- CodeRewriter.h 21 Apr 2003 03:08:54 -0000 1.18
***************
*** 13,16 ****
--- 13,20 ----
+ #ifndef _MSC_VER
+ # include <string>
+ #endif
+
namespace Refactoring {
***************
*** 55,59 ****
void visit( const AssignInitializerExpressionPtr &expression );
void visit( const ConstructorInitializerExpressionPtr &expression );
! void visit( const DeclaratorExpressionPtr &expression );
void visit( const DefaultConditionExpressionPtr &expression );
void visit( const ExpressionPtr &expression );
--- 59,63 ----
void visit( const AssignInitializerExpressionPtr &expression );
void visit( const ConstructorInitializerExpressionPtr &expression );
! void visit( const DeclaratorExpression &expression );
void visit( const DefaultConditionExpressionPtr &expression );
void visit( const ExpressionPtr &expression );
***************
*** 165,169 ****
void processDeclarator( const DeclaratorPtr &declarator );
!
private:
IndentLevelManager indentManager_;
--- 169,175 ----
void processDeclarator( const DeclaratorPtr &declarator );
! void deleteTextIfNecessary(const Change& change);
! bool needsToInsertComma( const Change& change, int index,
! bool firstWasAdded);
private:
IndentLevelManager indentManager_;
Index: CodeRewriter.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeRewriter.cpp,v
retrieving revision 1.39
retrieving revision 1.40
diff -C2 -d -r1.39 -r1.40
*** CodeRewriter.cpp 10 Apr 2003 08:37:50 -0000 1.39
--- CodeRewriter.cpp 21 Apr 2003 03:08:54 -0000 1.40
***************
*** 293,304 ****
{
Change change = statement->getChangeAt( index );
!
! if ( change.wasRemoved() || change.wasReplaced() )
! {
! deleteText( change.oldRange_ );
!
! if ( change.wasRemoved() )
! continue;
! }
currentInsertionPos_ = nextStatementInsertionPos;
--- 293,299 ----
{
Change change = statement->getChangeAt( index );
! deleteTextIfNecessary( change );
! if ( change.wasRemoved() )
! continue;
currentInsertionPos_ = nextStatementInsertionPos;
***************
*** 637,660 ****
void
! CodeRewriter::visit( const DeclaratorExpressionPtr &expression )
{
if ( isInserting() )
beginInsertNewStatement();
! handleMandatoryChange( expression->getPrimaryTypeChange(),
! *expression->getPrimaryType() );
!
! for ( int index =0; index < expression->getChangeCount(); ++index )
{
! Change change = expression->getChangeAt( index );
! DeclaratorPtr declarator = expression->getChangeDeclaratorAt( index );
!
! if ( index > 0 )
! insertText( ", " );
!
ModeModifier mode( mode_, change.isUnmodified() ? updating : inserting );
processDeclarator( declarator );
}
-
if ( isInserting() )
endInsertNewStatement();
--- 632,659 ----
void
! CodeRewriter::visit( const DeclaratorExpression &expression )
{
if ( isInserting() )
beginInsertNewStatement();
! handleMandatoryChange( expression.getPrimaryTypeChange(),
! *expression.getPrimaryType() );
! bool firstWasAdded = false;
! for ( int index = 0; index < expression.getChangeCount(); ++ index )
{
! Change change = expression.getChangeAt( index );
! deleteTextIfNecessary( change );
! if (change.wasRemoved())
! continue;
! if ( index == 0 )
! firstWasAdded = change.wasAdded();
! if ( needsToInsertComma( change, index, firstWasAdded ) )
! insertText( ", " );
!
! DeclaratorPtr declarator = expression.getChangeDeclaratorAt( index );
!
ModeModifier mode( mode_, change.isUnmodified() ? updating : inserting );
processDeclarator( declarator );
}
if ( isInserting() )
endInsertNewStatement();
***************
*** 724,727 ****
--- 723,741 ----
}
+ void
+ CodeRewriter::deleteTextIfNecessary( const Change& change )
+ {
+ if ( change.wasRemoved() || change.wasReplaced() )
+ {
+ replaceText( change.oldRange_, "");
+ }
+ }
+
+ bool
+ CodeRewriter::needsToInsertComma( const Change& change, int index,
+ bool firstWasAdded)
+ {
+ return (index > 0 && change.wasAdded()) || (index == 1 && firstWasAdded);
+ }
} // namespace CodeModel
Index: CodeModelGeneratorTest.h
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeModelGeneratorTest.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** CodeModelGeneratorTest.h 8 Mar 2003 13:10:44 -0000 1.1
--- CodeModelGeneratorTest.h 21 Apr 2003 03:08:54 -0000 1.2
***************
*** 19,22 ****
--- 19,25 ----
CPPUNIT_TEST_SUITE( CodeModelGeneratorTest );
CPPUNIT_TEST( testGenerateDeclaratorExpression );
+ CPPUNIT_TEST( testGenerateDeclaratorExpression2 );
+ CPPUNIT_TEST( testGenerateDeclaratorExpression3 );
+ //CPPUNIT_TEST( testFunctionPointer ); // does not parse
CPPUNIT_TEST_SUITE_END();
***************
*** 33,36 ****
--- 36,42 ----
void testGenerateDeclaratorExpression();
+ void testGenerateDeclaratorExpression2();
+ void testGenerateDeclaratorExpression3();
+ void testFunctionPointer();
private:
Index: CodeModelGeneratorTest.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeModelGeneratorTest.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** CodeModelGeneratorTest.cpp 10 Apr 2003 08:37:50 -0000 1.7
--- CodeModelGeneratorTest.cpp 21 Apr 2003 03:08:54 -0000 1.8
***************
*** 48,52 ****
CodeModel::Generator generator;
! CodeModel::DeclaratorExpressionPtr &declExpression =
generator.generateDeclarator( sourceNode_->getChildAt(0) );
--- 48,52 ----
CodeModel::Generator generator;
! CodeModel::DeclaratorExpressionPtr declExpression =
generator.generateDeclarator( sourceNode_->getChildAt(0) );
***************
*** 63,67 ****
dynamic_cast<CodeModel::AssignInitializerExpression &>( *(declarator->getInitializer()) );
RFTA_ASSERT_EQUAL( "3", initializer.getValue()->getSourceText() );
! }
--- 63,186 ----
dynamic_cast<CodeModel::AssignInitializerExpression &>( *(declarator->getInitializer()) );
RFTA_ASSERT_EQUAL( "3", initializer.getValue()->getSourceText() );
! };
!
! //////////////////////////////////////////////////
! // Note: These are characterization tests to help
! // me understand what the code does; they do not
! // necessarily represent desired behavior. SR
! //////////////////////////////////////////////////
! void
! CodeModelGeneratorTest::testGenerateDeclaratorExpression2()
! {
! source_ = "const int *x = NULL;";
!
! parse();
! RFTA_ASSERT_EQUAL( 1, sourceNode_->getChildCount() );
!
! CodeModel::Generator generator;
! CodeModel::DeclaratorExpressionPtr declExpression =
! generator.generateDeclarator( sourceNode_->getChildAt(0) );
!
! RFTA_ASSERT_EQUAL( "const int ",
! declExpression->getPrimaryType()->getTypeText() );
! RFTA_ASSERT_EQUAL( 1, declExpression->getDeclaratorCount() );
!
! CodeModel::DeclaratorPtr declarator = declExpression->getDeclaratorAt(0);
! CPPUNIT_ASSERT( declarator->hasType() );
! RFTA_ASSERT_EQUAL( "*", declarator->getType()->getTypeText() );
! CPPUNIT_ASSERT( !declarator->hasTypeSuffix() );
! RFTA_ASSERT_EQUAL( "x", declarator->getName()->getIdentifier() );
! CPPUNIT_ASSERT( declarator->hasInitializer() );
!
! CodeModel::AssignInitializerExpression &initializer =
! dynamic_cast<CodeModel::AssignInitializerExpression &>( *(declarator->getInitializer()) );
! RFTA_ASSERT_EQUAL( "NULL", initializer.getValue()->getSourceText() );
! };
!
! void
! CodeModelGeneratorTest::testGenerateDeclaratorExpression3()
! {
! source_ = "int *x = NULL, **y=&x, *const z;";
!
! parse();
! RFTA_ASSERT_EQUAL( 1, sourceNode_->getChildCount() );
!
! CodeModel::Generator generator;
! CodeModel::DeclaratorExpressionPtr declExpression =
! generator.generateDeclarator( sourceNode_->getChildAt(0) );
!
! RFTA_ASSERT_EQUAL( "int ",
! declExpression->getPrimaryType()->getTypeText() );
! RFTA_ASSERT_EQUAL( 3, declExpression->getDeclaratorCount() );
!
! CodeModel::DeclaratorPtr declarator = declExpression->getDeclaratorAt(0);
! CPPUNIT_ASSERT( declarator->hasType() );
! CPPUNIT_ASSERT( !declarator->hasTypeSuffix() );
! RFTA_ASSERT_EQUAL( "x", declarator->getName()->getIdentifier() );
! CPPUNIT_ASSERT( declarator->hasInitializer() );
!
! CodeModel::AssignInitializerExpression &initializer =
! dynamic_cast<CodeModel::AssignInitializerExpression &>( *(declarator->getInitializer()) );
! RFTA_ASSERT_EQUAL( "NULL", initializer.getValue()->getSourceText() );
! CodeModel::Change change( declarator->getTypeChange() );
! CPPUNIT_ASSERT( change.isUnmodified() );
! //////
!
! CodeModel::DeclaratorPtr declarator2 = declExpression->getDeclaratorAt(1);
! CPPUNIT_ASSERT( declarator2->hasType() );
! RFTA_ASSERT_EQUAL("**", declarator2->getType()->getTypeText() );
! CPPUNIT_ASSERT( !declarator2->hasTypeSuffix() );
! RFTA_ASSERT_EQUAL( "y", declarator2->getName()->getIdentifier() );
! CPPUNIT_ASSERT( declarator2->hasInitializer() );
!
! CodeModel::AssignInitializerExpression &initializer2 =
! dynamic_cast<CodeModel::AssignInitializerExpression &>
! ( *(declarator2->getInitializer()) );
! RFTA_ASSERT_EQUAL( "&x", initializer2.getValue()->getSourceText() );
! CodeModel::Change change2( declarator2->getTypeChange() );
! CPPUNIT_ASSERT( change2.isUnmodified() );
! //////
!
! CodeModel::DeclaratorPtr declarator3 = declExpression->getDeclaratorAt(2);
! CPPUNIT_ASSERT( declarator3->hasType() );
! // why do we get an extra space here?
! RFTA_ASSERT_EQUAL("*const ", declarator3->getType()->getTypeText() );
! CPPUNIT_ASSERT( !declarator3->hasTypeSuffix() );
! RFTA_ASSERT_EQUAL( "z", declarator3->getName()->getIdentifier() );
! CPPUNIT_ASSERT( !declarator3->hasInitializer() );
! CodeModel::Change change3( declarator3->getTypeChange() );
! CPPUNIT_ASSERT( change3.isUnmodified() );
!
! //////
!
! };
!
! // this crashes totally
! // More accurately, it tries to dereference a null ASTNodePtr
! void
! CodeModelGeneratorTest::testFunctionPointer()
! {
! source_ = "int (*f)(int);";
!
! parse();
! RFTA_ASSERT_EQUAL( 1, sourceNode_->getChildCount() );
!
! CodeModel::Generator generator;
! CodeModel::DeclaratorExpressionPtr declExpression =
! generator.generateDeclarator( sourceNode_->getChildAt(0) );
!
! RFTA_ASSERT_EQUAL( "int ", declExpression->getPrimaryType()->getTypeText() );
! RFTA_ASSERT_EQUAL( 1, declExpression->getDeclaratorCount() );
!
! CodeModel::DeclaratorPtr declarator = declExpression->getDeclaratorAt(0);
! CPPUNIT_ASSERT( !declarator->hasType() );
! CPPUNIT_ASSERT( !declarator->hasTypeSuffix() );
! RFTA_ASSERT_EQUAL( "x", declarator->getName()->getIdentifier() );
! CPPUNIT_ASSERT( declarator->hasInitializer() );
!
! CodeModel::AssignInitializerExpression &initializer =
! dynamic_cast<CodeModel::AssignInitializerExpression &>( *(declarator->getInitializer()) );
! RFTA_ASSERT_EQUAL( "3", initializer.getValue()->getSourceText() );
! };
Index: CodeModelExpressions.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeModelExpressions.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -C2 -d -r1.14 -r1.15
*** CodeModelExpressions.cpp 10 Apr 2003 08:37:50 -0000 1.14
--- CodeModelExpressions.cpp 21 Apr 2003 03:08:54 -0000 1.15
***************
*** 168,172 ****
DeclaratorExpression::accept( ExpressionVisitor &visitor )
{
! visitor.visit( makeSharedFromThis(this) );
}
--- 168,172 ----
DeclaratorExpression::accept( ExpressionVisitor &visitor )
{
! visitor.visit( *this );
}
Index: CodeModelElement.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeModelElement.cpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -d -r1.10 -r1.11
*** CodeModelElement.cpp 10 Apr 2003 08:37:50 -0000 1.10
--- CodeModelElement.cpp 21 Apr 2003 03:08:54 -0000 1.11
***************
*** 1,3 ****
! / //////////////////////////////////////////////////////////////////////////
// (c)Copyright 2002, Baptiste Lepilleur.
// Created: 2002/12/22
--- 1,3 ----
! ///////////////////////////////////////////////////////////////////////////
// (c)Copyright 2002, Baptiste Lepilleur.
// Created: 2002/12/22
Index: CodeModel.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rfta/CodeModel.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -d -r1.12 -r1.13
*** CodeModel.cpp 10 Apr 2003 08:37:50 -0000 1.12
--- CodeModel.cpp 21 Apr 2003 03:08:54 -0000 1.13
***************
*** 10,14 ****
#include <rfta/refactoring/CodeModelExpressions.h>
#include <rfta/refactoring/CodeModelStatements.h>
-
namespace Refactoring { namespace CodeModel {
--- 10,13 ----
|