Exemplo n.º 1
0
 public virtual AliasDefinitionList VisitAliasDefinitionList(AliasDefinitionList aliasDefinitions, AliasDefinitionList changes, AliasDefinitionList deletions, AliasDefinitionList insertions){
   if (changes == null || deletions == null || insertions == null) return aliasDefinitions;
   int n = aliasDefinitions == null ? 0 : aliasDefinitions.Count;
   if (n > changes.Count){Debug.Assert(false); n = changes.Count;}
   if (n > deletions.Count){Debug.Assert(false); n = deletions.Count;}
   if (n > insertions.Count){Debug.Assert(false); n = insertions.Count;}
   if (aliasDefinitions != null)
     for (int i = 0; i < n; i++)
       aliasDefinitions[i] = this.VisitAliasDefinition(aliasDefinitions[i], changes[i], deletions[i], insertions[i]);
   AliasDefinitionList result = new AliasDefinitionList(insertions.Count-n);
   for (int i = n, m = insertions.Count; i < m; i++)
     result.Add(insertions[i]);
   return result;
 }
Exemplo n.º 2
0
 public virtual AliasDefinitionList VisitAliasDefinitionList(AliasDefinitionList aliasDefinitions){
   if (aliasDefinitions == null) return null;
   for (int i = 0, n = aliasDefinitions.Count; i < n; i++)
     aliasDefinitions[i] = this.VisitAliasDefinition(aliasDefinitions[i]);
   return aliasDefinitions;
 }
Exemplo n.º 3
0
 public virtual Differences VisitAliasDefinitionList(AliasDefinitionList list1, AliasDefinitionList list2, 
   out AliasDefinitionList changes, out AliasDefinitionList deletions, out AliasDefinitionList insertions){
   changes = list1 == null ? null : list1.Clone();
   deletions = list1 == null ? null : list1.Clone();
   insertions = list1 == null ? new AliasDefinitionList() : list1.Clone();
   //^ assert insertions != null;
   Differences differences = new Differences();
   //Compare alias definitions that have matching aliases
   TrivialHashtable matchingPosFor = new TrivialHashtable();
   TrivialHashtable matchedNodes = new TrivialHashtable();
   for (int j = 0, n = list2 == null ? 0 : list2.Count; j < n; j++){
     //^ assert list2 != null;
     AliasDefinition nd2 = list2[j];
     if (nd2 == null || nd2.Alias == null) continue;
     matchingPosFor[nd2.Alias.UniqueIdKey] = j;
     insertions.Add(null);
   }
   for (int i = 0, n = list1 == null ? 0 : list1.Count; i < n; i++){
     //^ assert list1 != null && changes != null && deletions != null;
     AliasDefinition nd1 = list1[i];
     if (nd1 == null || nd1.Alias == null) continue;
     object pos = matchingPosFor[nd1.Alias.UniqueIdKey];
     if (!(pos is int)) continue;
     //^ assert pos != null;
     //^ assume list2 != null; //since there was entry int matchingPosFor
     int j = (int)pos;
     AliasDefinition nd2 = list2[j];
     //^ assume nd2 != null; //since there was entry int matchingPosFor
     //nd1 and nd2 define the same alias name and are therefore treated as the same entity
     matchedNodes[nd1.UniqueKey] = nd1;
     matchedNodes[nd2.UniqueKey] = nd2;
     //nd1 and nd2 may still be different, though, so find out how different
     Differences diff = this.VisitAliasDefinition(nd1, nd2);
     if (diff == null){Debug.Assert(false); continue;}
     if (diff.NumberOfDifferences != 0){
       changes[i] = diff.Changes as AliasDefinition;
       deletions[i] = diff.Deletions as AliasDefinition;
       insertions[i] = diff.Insertions as AliasDefinition;
       insertions[n+j] = nd1; //Records the position of nd2 in list2 in case the change involved a permutation
       Debug.Assert(diff.Changes == changes[i] && diff.Deletions == deletions[i] && diff.Insertions == insertions[i]);
       differences.NumberOfDifferences += diff.NumberOfDifferences;
       differences.NumberOfSimilarities += diff.NumberOfSimilarities;
       continue;
     }
     changes[i] = null;
     deletions[i] = null;
     insertions[i] = null;
     insertions[n+j] = nd1; //Records the position of nd2 in list2 in case the change involved a permutation
   }
   //Find deletions
   for (int i = 0, n = list1 == null ? 0 : list1.Count; i < n; i++){
     //^ assert list1 != null && changes != null && deletions != null;
     AliasDefinition nd1 = list1[i]; 
     if (nd1 == null) continue;
     if (matchedNodes[nd1.UniqueKey] != null) continue;
     changes[i] = null;
     deletions[i] = nd1;
     insertions[i] = null;
     differences.NumberOfDifferences += 1;
   }
   //Find insertions
   for (int j = 0, n = list1 == null ? 0 : list1.Count, m = list2 == null ? 0 : list2.Count; j < m; j++){
     //^ assert list2 != null;
     AliasDefinition nd2 = list2[j]; 
     if (nd2 == null) continue;
     if (matchedNodes[nd2.UniqueKey] != null) continue;
     insertions[n+j] = nd2;  //Records nd2 as an insertion into list1, along with its position in list2
     differences.NumberOfDifferences += 1; //REVIEW: put the size of the tree here?
   }
   if (differences.NumberOfDifferences == 0){
     changes = null;
     deletions = null;
     insertions = null;
   }
   return differences;
 }
Exemplo n.º 4
0
 public virtual void VisitAliasDefinitionList(AliasDefinitionList aliasDefinitions)
 {
   if (aliasDefinitions == null) return;
   for (int i = 0, n = aliasDefinitions.Count; i < n; i++)
     this.VisitAliasDefinition(aliasDefinitions[i]);
 }
Exemplo n.º 5
0
 public override AliasDefinitionList VisitAliasDefinitionList(AliasDefinitionList aliasDefinitions)
 {
     if (aliasDefinitions == null) return null;
     return base.VisitAliasDefinitionList(aliasDefinitions.Clone());
 }
Exemplo n.º 6
0
 public virtual AliasDefinitionList VisitAliasDefinitionList(AliasDefinitionList aliasDefinitions1, AliasDefinitionList aliasDefinitions2)
 {
     if (aliasDefinitions1 == null) return null;
     for (int i = 0, n = aliasDefinitions1.Count, m = aliasDefinitions2 == null ? 0 : aliasDefinitions2.Count; i < n; i++)
     {
         //^ assert aliasDefinitions2 != null;
         if (i >= m)
             aliasDefinitions1[i] = this.VisitAliasDefinition(aliasDefinitions1[i], null);
         else
             aliasDefinitions1[i] = this.VisitAliasDefinition(aliasDefinitions1[i], aliasDefinitions2[i]);
     }
     return aliasDefinitions1;
 }
Exemplo n.º 7
0
 public Namespace(Identifier name, Identifier fullName, AliasDefinitionList aliasDefinitions, UsedNamespaceList usedNamespaces,
   NamespaceList nestedNamespaces, TypeNodeList types)
     : base(NodeType.Namespace)
 {
     this.Name = name;
     this.FullNameId = fullName;
     if(fullName != null)
         this.fullName = fullName.ToString();
     this.AliasDefinitions = aliasDefinitions;
     this.NestedNamespaces = nestedNamespaces;
     this.Types = types;
     this.UsedNamespaces = usedNamespaces;
 }
Exemplo n.º 8
0
 public EventingVisitor(Action<AliasDefinitionList> visitAliasDefinitionList) { VisitedAliasDefinitionList += visitAliasDefinitionList; } public event Action<AliasDefinitionList> VisitedAliasDefinitionList; public override AliasDefinitionList VisitAliasDefinitionList(AliasDefinitionList aliasDefinitions) { if (VisitedAliasDefinitionList != null) VisitedAliasDefinitionList(aliasDefinitions); return base.VisitAliasDefinitionList(aliasDefinitions); }