eclipse plugin: Implement the directory <-> file include order update

This commit is contained in:
Timotei Dolean 2011-09-02 18:21:35 +00:00
parent 1a16b55db9
commit c62275eb9f
2 changed files with 153 additions and 45 deletions

View File

@ -105,18 +105,23 @@ public class ProjectDependencyListTests extends PDETest
{
IProject project = createProject( "test" );
IFile files[] = new IFile[6];
IFile files[] = new IFile[9];
ResourceUtils.createFolder( project, "f1" );
ResourceUtils.createFolder( project, "f2" );
ResourceUtils.createFolder( project, "f3" );
files[0] = ResourceUtils.createFile( project, "_main.cfg",
"{~add-ons/test/f1}\r\n{~add-ons/test/f2}\r\n" );
files[0] = ResourceUtils
.createFile( project, "_main.cfg",
"{~add-ons/test/f1}\r\n{~add-ons/test/f2}\r\n{~add-ons/test/f3}\r\n" );
files[1] = ResourceUtils.createFile( project, "f1/f1_file1.cfg", "" );
files[2] = ResourceUtils.createFile( project, "f1/f1_file2.cfg", "" );
files[3] = ResourceUtils.createFile( project, "f2/f2_filea.cfg", "" );
files[4] = ResourceUtils.createFile( project, "f2/f2_fileb.cfg", "" );
files[5] = ResourceUtils.createFile( project, "f2/f2_filec.cfg", "" );
files[3] = ResourceUtils.createFile( project, "f1/f1_file3.cfg", "" );
files[4] = ResourceUtils.createFile( project, "f2/f2_file4.cfg", "" );
files[5] = ResourceUtils.createFile( project, "f2/f2_file5.cfg", "" );
files[6] = ResourceUtils.createFile( project, "f3/f3_filea.cfg", "" );
files[7] = ResourceUtils.createFile( project, "f3/f3_fileb.cfg", "" );
files[8] = ResourceUtils.createFile( project, "f3/f3_filec.cfg", "" );
project.build( IncrementalProjectBuilder.FULL_BUILD,
new NullProgressMonitor( ) );
@ -124,13 +129,14 @@ public class ProjectDependencyListTests extends PDETest
.getDependencyList( );
assertEquals( true, list.isCreated( ) );
assertEquals( 6, list.getNodesCount( ) );
assertEquals( 9, list.getNodesCount( ) );
// now reverse the include order
FileWriter writer = new FileWriter( files[0].getLocation( )
.toOSString( ) );
writer.write( "{~add-ons/test/f2}\r\n{~add-ons/test/f1}\r\n" );
writer.write( "{~add-ons/test/f3}\r\n{~add-ons/test/f2}\r\n" +
"{~add-ons/test/f1}\r\n" );
writer.close( );
project.refreshLocal( IResource.DEPTH_INFINITE,
new NullProgressMonitor( ) );
@ -145,7 +151,13 @@ public class ProjectDependencyListTests extends PDETest
assertEquals( files[0], node.getFile( ) );
node = node.getNext( );
assertEquals( files[3], node.getFile( ) );
assertEquals( files[6], node.getFile( ) );
node = node.getNext( );
assertEquals( files[7], node.getFile( ) );
node = node.getNext( );
assertEquals( files[8], node.getFile( ) );
node = node.getNext( );
assertEquals( files[4], node.getFile( ) );
@ -159,6 +171,9 @@ public class ProjectDependencyListTests extends PDETest
node = node.getNext( );
assertEquals( files[2], node.getFile( ) );
node = node.getNext( );
assertEquals( files[3], node.getFile( ) );
cleanup( project );
}

View File

@ -672,58 +672,151 @@ public class DependencyListBuilder implements Serializable
tmpSwapNode.setPrevious( newNode );
}
}
else if( prevDirIndex != - 1 && newDirIndex != - 1 ) {
// directory <-> directory
DirectoryIncludeEntry prevEntry = directoriesEntries_
.get( prevDirIndex );
DirectoryIncludeEntry newEntry = directoriesEntries_
.get( newDirIndex );
else {
// directory <-> directory and
// directory <-> file
// This is code is a bit ugly and weird, but for the
// moment I haven't found any better solution
// If you want to understand it, you'd better use
// a pen and paper. That's what I did when writing it!
DirectoryIncludeEntry prevEntry = null;
DirectoryIncludeEntry newEntry = null;
DependencyListNode prevNode = null;
DependencyListNode newNode = null;
DependencyListNode middleNode = null;
boolean prevIsDir = false, newIsDir = false;
// create a list for easier swap
List< DependencyListNode > nodes = new ArrayList< DependencyListNode >( );
nodes.add( prevEntry.FirstNode.getPrevious( ) );
nodes.add( prevEntry.FirstNode );
nodes.add( prevEntry.LastNode );
if( prevEntry.LastNode.getNext( ) != newEntry.FirstNode ) {
nodes.add( prevEntry.LastNode.getNext( ) );
nodes.add( newEntry.FirstNode.getPrevious( ) );
if( prevDirIndex != - 1 ) {
prevIsDir = true;
prevEntry = directoriesEntries_.get( prevDirIndex );
nodes.add( prevEntry.FirstNode.getPrevious( ) );
nodes.add( prevEntry.FirstNode );
nodes.add( prevEntry.LastNode );
middleNode = prevEntry.LastNode.getNext( );
}
else {
prevNode = fileIncludes_.get( prevInclude );
nodes.add( prevNode.getPrevious( ) );
nodes.add( prevNode );
middleNode = prevNode.getNext( );
}
if( newDirIndex != - 1 ) {
newIsDir = true;
newEntry = directoriesEntries_.get( newDirIndex );
if( middleNode != newEntry.FirstNode ) {
nodes.add( middleNode );
nodes.add( newEntry.FirstNode.getPrevious( ) );
}
nodes.add( newEntry.FirstNode );
nodes.add( newEntry.LastNode );
nodes.add( newEntry.LastNode.getNext( ) );
}
else {
newNode = fileIncludes_.get( newInclude );
if( middleNode != newNode ) {
nodes.add( middleNode );
nodes.add( newNode.getPrevious( ) );
}
nodes.add( newNode );
nodes.add( newNode.getNext( ) );
}
nodes.add( newEntry.FirstNode );
nodes.add( newEntry.LastNode );
nodes.add( newEntry.LastNode.getNext( ) );
int nodesSize = nodes.size( );
int swapIndex = ( nodesSize == 8 ? 5: 3 );
// now swap the nodes
DependencyListNode tmp = nodes.get( swapIndex );
nodes.set( swapIndex, nodes.get( 1 ) );
nodes.set( 1, tmp );
swapIndex = ( nodesSize == 8 ? 6: 4 );
if( prevIsDir && newIsDir ) {
// dir <-> dir
int swapIndex = ( nodesSize == 8 ? 5: 3 );
tmp = nodes.get( swapIndex );
nodes.set( swapIndex, nodes.get( 2 ) );
nodes.set( 2, tmp );
DependencyListNode tmp = nodes.get( swapIndex );
nodes.set( swapIndex, nodes.get( 1 ) );
nodes.set( 1, tmp );
// update the links
swapIndex = ( nodesSize == 8 ? 6: 4 );
for( int i = 0; i < nodesSize - 1; i += 2 ) {
DependencyListNode fst = nodes.get( i );
DependencyListNode lst = nodes.get( i + 1 );
tmp = nodes.get( swapIndex );
nodes.set( swapIndex, nodes.get( 2 ) );
nodes.set( 2, tmp );
if( fst != null ) {
fst.setNext( lst );
}
// update the links
for( int i = 0; i < nodesSize - 1; i += 2 ) {
DependencyListNode fst = nodes.get( i );
DependencyListNode lst = nodes.get( i + 1 );
if( lst != null ) {
lst.setPrevious( fst );
if( fst != null ) {
fst.setNext( lst );
}
if( lst != null ) {
lst.setPrevious( fst );
}
}
}
else {
// transform the list in the oposite case
if( prevIsDir ) {
Collections.reverse( nodes );
}
List< DependencyListNode > tmpNodes =
new ArrayList< DependencyListNode >( nodes );
if( nodesSize == 7 ) {
nodes.set( 1, tmpNodes.get( 4 ) );
nodes.set( 2, tmpNodes.get( 5 ) );
nodes.set( 3, tmpNodes.get( 2 ) );
nodes.set( 4, tmpNodes.get( 3 ) );
nodes.set( 5, tmpNodes.get( 1 ) );
}
else {
nodes.set( 1, tmpNodes.get( 2 ) );
nodes.set( 2, tmpNodes.get( 3 ) );
nodes.set( 3, tmpNodes.get( 1 ) );
}
// reverse to the original order
if( prevIsDir ) {
Collections.reverse( nodes );
}
// update the links
for( int i = 0; i < nodesSize - 1; ) {
DependencyListNode fst = nodes.get( i );
DependencyListNode lst = nodes.get( i + 1 );
if( fst != null ) {
fst.setNext( lst );
}
if( lst != null ) {
lst.setPrevious( fst );
}
if( i == 0 && prevIsDir ) {
++i;
}
else if( i == nodesSize - 3 && ! prevIsDir ) {
++i;
}
else {
i += 2;
}
}
}
}
else {
// TODO file <-> directory
}
}