[
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 );
}
}