Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] Parser_SymbolTable: added support for Rollback

core:
Added basic command structure to support rollback to a previous mark.
Note that only structural changes are undone in the rollback, that is, adds (addDeclaration, addFriend, addParent, etc) but not sets (setType etc)
 
ui:
added ParserSymbolTableTest::testMarkRollback
 
-Andrew
 
 
 
 
Index: parser/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/ChangeLog,v
retrieving revision 1.48.2.1
diff -u -r1.48.2.1 ChangeLog
--- parser/ChangeLog	6 May 2003 23:51:23 -0000	1.48.2.1
+++ parser/ChangeLog	8 May 2003 20:08:13 -0000
@@ -1,3 +1,6 @@
+2003-05-08 Andrew Niefer
+	Added a basic command structure to support rollbacks
+
 2003-05-06 John Camelon
 	Further integration of SymbolTable into Parser, some refactoring. 
 
Index: parser/org/eclipse/cdt/internal/core/parser/ParserSymbolTable.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ParserSymbolTable.java,v
retrieving revision 1.13.2.2
diff -u -r1.13.2.2 ParserSymbolTable.java
--- parser/org/eclipse/cdt/internal/core/parser/ParserSymbolTable.java	8 May 2003 14:46:28 -0000	1.13.2.2
+++ parser/org/eclipse/cdt/internal/core/parser/ParserSymbolTable.java	8 May 2003 20:08:15 -0000
@@ -1208,11 +1208,55 @@
 	//private Stack _contextStack = new Stack();
 	private Declaration _compilationUnit;
 	private LinkedList undoList = new LinkedList();
+	private HashSet markSet = new HashSet();
+	
+	private void pushCommand( Command command ){
+		undoList.addFirst( command );
+	}
+	
+	public Mark setMark(){
+		Mark mark = new Mark();
+		undoList.addFirst( mark );
+		markSet.add( mark );
+		return mark;
+	}
+	
+	public boolean rollBack( Mark toMark ){
+		if( markSet.contains( toMark ) ){
+			markSet.remove( toMark );
+			Command command = ( Command )undoList.removeFirst();
+			while( command != toMark ){
+				command.undoIt();
+				command = ( Command ) undoList.removeFirst();
+			}
+			
+			return true;
+		} 
+		
+		return false;
+	}
+	
+	public boolean commit( Mark toMark ){
+		if( markSet.contains( toMark ) ){
+			markSet.remove( toMark );
+			Command command = ( Command )undoList.removeLast();
+			while( command != toMark ){
+				command = (Command) undoList.removeLast();
+			}
+			return true;
+		}
+		
+		return false;
+	}
 	
 	static abstract private class Command{
 		abstract public void undoIt();
 	}
 	
+	static public class Mark extends Command{
+		public void undoIt(){ };
+	}
+	
 	static private class AddDeclarationCommand extends Command{
 		AddDeclarationCommand( Declaration newDecl, Declaration context, boolean removeThis ){
 			_decl = newDecl;
@@ -1251,6 +1295,53 @@
 		private boolean 	_removeThis;
 	}
 	
+	static private class AddParentCommand extends Command{
+		public AddParentCommand( Declaration container, Declaration.ParentWrapper wrapper ){
+			_decl = container;
+			_wrapper = wrapper;
+		}
+		
+		public void undoIt(){
+			LinkedList parents = _decl.getParentScopes();
+			parents.remove( _wrapper );
+		}
+		
+		private Declaration _decl;
+		private Declaration.ParentWrapper _wrapper;
+	}
+	
+	static private class AddParameterCommand extends Command{
+		public AddParameterCommand( Declaration container, Declaration parameter ){
+			_decl = container;
+			_param = parameter;
+		}
+		
+		public void undoIt(){
+			_decl.getParameterList().remove( _param );
+			
+			String name = _param.getName();
+			if( name != null && !name.equals("") )
+			{	
+				_decl.getParameterMap().remove( name );
+			}
+		}
+		
+		private Declaration _decl;
+		private Declaration _param;
+	}
+	
+	static private class AddUsingDirectiveCommand extends Command{
+		public AddUsingDirectiveCommand( Declaration container, Declaration namespace ){
+			_decl = container;
+			_namespace = namespace;
+		}
+		public void undoIt(){
+			_decl.getUsingDirectives().remove( _namespace );
+		}
+		private Declaration _decl;
+		private Declaration _namespace;
+	}
+	
 	static private class LookupData
 	{
 		
@@ -1437,7 +1528,11 @@
 				_parentScopes = new LinkedList();
 			}
 			
-			_parentScopes.add( new ParentWrapper( parent, virtual ) );
+			ParentWrapper wrapper = new ParentWrapper( parent, virtual );
+			_parentScopes.add( wrapper );
+			
+			Command command = new AddParentCommand( this, wrapper );
+			pushCommand( command );
 		}
 	
 		public Map getContainedDeclarations(){
@@ -1506,6 +1601,9 @@
 				if( !_parameterHash.containsKey( name ) )
 					_parameterHash.put( name, param );
 			}
+			
+			Command command = new AddParameterCommand( this, param );
+			pushCommand( command );
 		}
 		
 		public void addParameter( Declaration typeDecl, int cvQual, String ptrOperator, boolean hasDefault ){
@@ -1634,6 +1732,7 @@
 			}
 			
 			Command command = new AddDeclarationCommand( obj, containing, addedThis );
+			pushCommand( command );
 		}
 		
 		/**
@@ -1801,6 +1900,9 @@
 			}
 		
 			_usingDirectives.add( namespace );
+			
+			Command command = new AddUsingDirectiveCommand( this, namespace );
+			pushCommand( command );
 		}
 		
 		public LinkedList getUsingDirectives(){
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/ChangeLog,v
retrieving revision 1.51.2.1
diff -u -r1.51.2.1 ChangeLog
--- ChangeLog	6 May 2003 23:51:15 -0000	1.51.2.1
+++ ChangeLog	8 May 2003 20:08:40 -0000
@@ -1,3 +1,6 @@
+2003-05-08 Andrew Niefer
+	Added ParserSymbolTableTest::testMarkRollback
+
 2003-05-06 John Camelon
 	Further integration of SymbolTable into Parser, some refactoring. 
 
Index: parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java,v
retrieving revision 1.13.2.1
diff -u -r1.13.2.1 ParserSymbolTableTest.java
--- parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java	6 May 2003 23:51:14 -0000	1.13.2.1
+++ parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java	8 May 2003 20:08:41 -0000
@@ -18,6 +18,9 @@
 import junit.framework.TestCase;
 
 import org.eclipse.cdt.internal.core.parser.ParserSymbolTable;
+import org.eclipse.cdt.internal.core.parser.ParserSymbolTable.Declaration;
+import org.eclipse.cdt.internal.core.parser.ParserSymbolTable.TypeInfo;
+import org.eclipse.cdt.internal.core.parser.ParserSymbolTable.Mark;
 import org.eclipse.cdt.internal.core.parser.ParserSymbolTableException;
 
 /**
@@ -1893,6 +1896,55 @@
 		
 		look = compUnit.UnqualifiedFunctionLookup( "f", params );
 		assertEquals( look, f3 );
+	}
+	
+	public void testMarkRollback() throws Exception{
+		newTable();
+		
+		Declaration A = table.new Declaration("A");
+		A.setType( TypeInfo.t_class );
+		table.getCompilationUnit().addDeclaration( A );
+		
+		Mark mark = table.setMark();
+		
+		Declaration f = table.new Declaration("f");
+		A.addDeclaration( f );
+		
+		Declaration look = A.Lookup("f");
+		assertEquals( look, f );
+		
+		assertTrue( table.rollBack( mark ) );
+		
+		look = A.Lookup("f");
+		assertEquals( look, null );
+		
+		Declaration B = table.new Declaration("B");
+		B.setType( TypeInfo.t_class );
+		
+		mark = table.setMark();
+		table.getCompilationUnit().addDeclaration( B );
+		Mark mark2 = table.setMark();
+		A.addParent( B );
+		Mark mark3 = table.setMark();
+		B.addParameter( TypeInfo.t_class, 0, "", false );
+		
+		assertEquals( B.getParameterList().size(), 1 );
+		table.rollBack( mark3 );
+		assertEquals( B.getParameterList().size(), 0 );
+		assertEquals( A.getParentScopes().size(), 1 );
+		table.rollBack( mark2 );
+		assertEquals( A.getParentScopes().size(), 0 );
+		
+		assertFalse( table.commit( mark2 ) );
+		assertFalse( table.rollBack( mark2 ) );
+		
+		B.setType( TypeInfo.t_namespace );
+		
+		mark = table.setMark();
+		A.addUsingDirective( B );
+		assertEquals( A.getUsingDirectives().size(), 1 );
+		table.rollBack( mark );
+		assertEquals( A.getUsingDirectives().size(), 0 );
 	}
 }
 

Back to the top