Example #1
0
 public virtual CompilationUnitList VisitCompilationUnitList(CompilationUnitList compUnits, CompilationUnitList changes, CompilationUnitList deletions, CompilationUnitList insertions){
   if (changes == null || deletions == null || insertions == null) return compUnits;
   int n = compUnits == null ? 0 : compUnits.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 (compUnits != null)
     for (int i = 0; i < n; i++)
       compUnits[i] = this.VisitCompilationUnit(compUnits[i], changes[i], deletions[i], insertions[i]);
   CompilationUnitList result = new CompilationUnitList(insertions.Count-n);
   for (int i = n, m = insertions.Count; i < m; i++)
     result.Add(insertions[i]);
   return result;
 }
Example #2
0
        //---------------------------------------------------------------------------------

        public override Compilation CreateCompilation(Module targetModule, CompilationUnitList compilationUnits, CompilerParameters compilerParameters, Scope globalScope)
        {
            return(new ZonnonCompilation(targetModule, compilationUnits, compilerParameters, globalScope));
            // return base.CreateCompilation (targetModule,compilationUnits,compilerParameters,globalScope);
        }
 public virtual Differences VisitCompilationUnitList(CompilationUnitList list1, CompilationUnitList list2,
   out CompilationUnitList changes, out CompilationUnitList deletions, out CompilationUnitList insertions){
   changes = list1 == null ? null : list1.Clone();
   deletions = list1 == null ? null : list1.Clone();
   insertions = list1 == null ? new CompilationUnitList() : list1.Clone();
   //^ assert insertions != null;
   Differences differences = new Differences();
   //Compare definitions that have matching key attributes
   TrivialHashtable matchingPosFor = new TrivialHashtable();
   TrivialHashtable matchedNodes = new TrivialHashtable();
   for (int j = 0, n = list2 == null ? 0 : list2.Count; j < n; j++){
     //^ assert list2 != null;
     CompilationUnit nd2 = list2[j];
     if (nd2 == null || nd2.Name == null) continue;
     matchingPosFor[nd2.Name.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;
     CompilationUnit nd1 = list1[i];
     if (nd1 == null || nd1.Name == null) continue;
     object pos = matchingPosFor[nd1.Name.UniqueIdKey];
     if (!(pos is int)) continue;
     //^ assert pos != null;
     //^ assume list2 != null; //since there was entry int matchingPosFor
     int j = (int)pos;
     CompilationUnit nd2 = list2[j];
     //^ assume nd2 != null;
     //nd1 and nd2 have the same key attributes 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.VisitCompilationUnit(nd1, nd2);
     if (diff == null){Debug.Assert(false); continue;}
     if (diff.NumberOfDifferences != 0){
       changes[i] = diff.Changes as CompilationUnit;
       deletions[i] = diff.Deletions as CompilationUnit;
       insertions[i] = diff.Insertions as CompilationUnit;
       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;
     CompilationUnit 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;
     CompilationUnit 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;
 }
Example #4
0
 public virtual void VisitCompilationUnitList(CompilationUnitList compilationUnits)
 {
   if (compilationUnits == null) return;
   for (int i = 0, n = compilationUnits.Count; i < n; i++)
     this.Visit(compilationUnits[i]);
 }
Example #5
0
 public virtual CompilationUnitList VisitCompilationUnitList(CompilationUnitList compilationUnits){
   if (compilationUnits == null) return null;
   for (int i = 0, n = compilationUnits.Count; i < n; i++)
     compilationUnits[i] = (CompilationUnit)this.Visit(compilationUnits[i]);
   return compilationUnits;
 }
Example #6
0
    public virtual void ConstructSymbolTable(Compilation compilation, ErrorNodeList errors, TrivialHashtable scopeFor){
      if (compilation == null || scopeFor == null){Debug.Assert(false); return;}
      this.CurrentCompilation = compilation;
      Module symbolTable = compilation.TargetModule = this.CreateModule(compilation.CompilerParameters, errors, compilation);
      Scoper scoper = new Scoper(scopeFor);
      scoper.currentModule = symbolTable;
      ErrorHandler errorHandler = new ErrorHandler(errors);
      Looker looker = new Looker(this.GetGlobalScope(symbolTable), errorHandler, scopeFor);
      // begin change by drunje
      SpecSharpCompilerOptions options = compilation.CompilerParameters as SpecSharpCompilerOptions;
      if (options != null)
        looker.AllowPointersToManagedStructures = options.AllowPointersToManagedStructures;
      // end change by drunje
      looker.currentAssembly = (looker.currentModule = symbolTable) as AssemblyNode;
      looker.ignoreMethodBodies = true;
      Scope globalScope = compilation.GlobalScope = this.GetGlobalScope(symbolTable);

      CompilationUnitList sources = compilation.CompilationUnits;
      if (sources == null) return;
      int n = sources.Count;
      for (int i = 0; i < n; i++){
        CompilationUnitSnippet compilationUnitSnippet = sources[i] as CompilationUnitSnippet;
        if (compilationUnitSnippet == null){Debug.Assert(false); continue;}
        compilationUnitSnippet.ChangedMethod = null;
        Document doc = compilationUnitSnippet.SourceContext.Document;
        if (doc == null || doc.Text == null){Debug.Assert(false); continue;}
        IParserFactory factory = compilationUnitSnippet.ParserFactory;
        if (factory == null){Debug.Assert(false); return;}
        IParser p = factory.CreateParser(doc.Name, doc.LineNumber, doc.Text, symbolTable, errors, compilation.CompilerParameters);
        if (p is ResgenCompilerStub) continue;
        if (p == null){Debug.Assert(false); continue;}
        Parser specSharpParser = p as Parser;
        if (specSharpParser == null)
          p.ParseCompilationUnit(compilationUnitSnippet);
        else
          specSharpParser.ParseCompilationUnit(compilationUnitSnippet, true, false);
        //TODO: this following is a good idea only if the files will not be frequently reparsed from source
        //StringSourceText stringSourceText = doc.Text.TextProvider as StringSourceText;
        //if (stringSourceText != null && stringSourceText.IsSameAsFileContents)
        //  doc.Text.TextProvider = new CollectibleSourceText(doc.Name, doc.Text.Length);
        //else if (doc.Text.TextProvider != null)
        //  doc.Text.TextProvider.MakeCollectible();
      }
      CompilationUnitList compilationUnits = new CompilationUnitList();
      for (int i = 0; i < n; i++){
        CompilationUnit cUnit = sources[i];
        compilationUnits.Add(scoper.VisitCompilationUnit(cUnit));
      }
      for (int i = 0; i < n; i++){
        CompilationUnit cUnit = compilationUnits[i];
        if (cUnit == null) continue;
        looker.VisitCompilationUnit(cUnit);
      }
      //Run resolver over symbol table so that custom attributes on member signatures are known and can be used
      //to error check the the given file.
      TypeSystem typeSystem = new TypeSystem(errorHandler);
      Resolver resolver = new Resolver(errorHandler, typeSystem);
      resolver.currentAssembly = (resolver.currentModule = symbolTable) as AssemblyNode;
      for (int i = 0; i < n; i++) {
        CompilationUnit cUnit = compilationUnits[i];
        if (cUnit == null) continue;
        resolver.VisitCompilationUnit(cUnit);
      }
      this.CurrentCompilation = null;
    }
Example #7
0
 public virtual CompilationUnitList VisitCompilationUnitList(CompilationUnitList cUnits1, CompilationUnitList cUnits2)
 {
     if (cUnits1 == null) return null;
     for (int i = 0, n = cUnits1.Count, m = cUnits2 == null ? 0 : cUnits2.Count; i < n; i++)
     {
         //^ assert cUnits2 != null;
         if (i >= m)
             cUnits1[i] = (CompilationUnit)this.VisitCompilationUnit(cUnits1[i], null);
         else
             cUnits1[i] = (CompilationUnit)this.VisitCompilationUnit(cUnits1[i], cUnits2[i]);
     }
     return cUnits1;
 }
 public virtual Compilation CreateCompilation(Module targetModule, CompilationUnitList compilationUnits, System.CodeDom.Compiler.CompilerParameters compilerParameters, Scope globalScope){
   return new Compilation(targetModule, compilationUnits, compilerParameters, globalScope);
 }
Example #9
0
        public virtual Compilation CloneCompilationUnits()
        {
            Compilation clone = (Compilation)base.Clone();
            CompilationUnitList cus = this.CompilationUnits;

            if(cus != null)
            {
                clone.CompilationUnits = cus = new CompilationUnitList(cus);

                for(int i = 0, n = cus.Count; i < n; i++)
                {
                    CompilationUnit cu = cus[i];

                    if(cu == null)
                        continue;

                    cus[i] = cu = (CompilationUnit)cu.Clone();
                    cu.Compilation = clone;
                    cu.Nodes = null;
                }
            }

            return clone;
        }
Example #10
0
 public Compilation(Module targetModule, CompilationUnitList compilationUnits, System.CodeDom.Compiler.CompilerParameters compilerParameters, Scope globalScope)
     : base(NodeType.Compilation)
 {
     this.CompilationUnits = compilationUnits;
     this.TargetModule = targetModule;
     this.CompilerParameters = compilerParameters;
     this.GlobalScope = globalScope;
 }
Example #11
0
        /// <summary>
        /// Parses all of the CompilationUnitSnippets in the given compilation, ignoring method bodies. Then resolves all type expressions.
        /// The resulting types can be retrieved from the module in compilation.TargetModule. The base types, interfaces and
        /// member signatures will all be resolved and on an equal footing with imported, already compiled modules and assemblies.
        /// </summary>
        public override void ConstructSymbolTable(Compilation compilation, ErrorNodeList errors)
        {
            if (compilation == null) { Debug.Assert(false); return; }
            Module symbolTable = compilation.TargetModule = this.CreateModule(compilation.CompilerParameters, errors, compilation);
            TrivialHashtable scopeFor = new TrivialHashtable();
            Scoper scoper = new Scoper(scopeFor);
            scoper.currentModule = symbolTable;
            ErrorHandler errorHandler = new ErrorHandler(errors);
            TypeSystem typeSystem = new TypeSystem(errorHandler); // LJW: added typeSystem
            Looker looker = new Looker(this.GetGlobalScope(symbolTable), errorHandler, scopeFor, typeSystem);
            looker.currentAssembly = (looker.currentModule = symbolTable) as AssemblyNode;
            looker.ignoreMethodBodies = true;
            compilation.GlobalScope = this.GetGlobalScope(symbolTable);

            CompilationUnitList sources = compilation.CompilationUnits;
            if (sources == null) { Debug.Assert(false); return; }
            int n = sources.Count;
            for (int i = 0; i < n; i++)
            {
                CompilationUnitSnippet compilationUnitSnippet = sources[i] as CompilationUnitSnippet;
                if (compilationUnitSnippet == null) { Debug.Assert(false); continue; }
                compilationUnitSnippet.ChangedMethod = null;
                Document doc = compilationUnitSnippet.SourceContext.Document;
                if (doc == null || doc.Text == null) { Debug.Assert(false); continue; }
                IParserFactory factory = compilationUnitSnippet.ParserFactory;
                if (factory == null) { Debug.Assert(false); return; }
                IParser p = factory.CreateParser(doc.Name, doc.LineNumber, doc.Text, symbolTable, errors, compilation.CompilerParameters);
                if (p is ResgenCompilerStub) continue;
                if (p == null) { Debug.Assert(false); continue; }
                Parser zingParser = p as Parser;
                if (zingParser == null)
                    p.ParseCompilationUnit(compilationUnitSnippet);
                else
                    zingParser.ParseCompilationUnit(compilationUnitSnippet, true, true, null);
                StringSourceText stringSourceText = doc.Text.TextProvider as StringSourceText;
                if (stringSourceText != null && stringSourceText.IsSameAsFileContents)
                    doc.Text.TextProvider = new CollectibleSourceText(doc.Name, doc.Text.Length);
                else if (doc.Text.TextProvider != null)
                    doc.Text.TextProvider.MakeCollectible();
            }
            CompilationUnitList compilationUnits = new CompilationUnitList();
            for (int i = 0; i < n; i++)
            {
                CompilationUnit cUnit = sources[i];
                compilationUnits.Add(scoper.VisitCompilationUnit(cUnit));
            }
            for (int i = 0; i < n; i++)
            {
                CompilationUnit cUnit = compilationUnits[i];
                if (cUnit == null) continue;
                looker.VisitCompilationUnit(cUnit);
            }
        }
 public EventingVisitor(Action<CompilationUnitList> visitCompilationUnitList) { VisitedCompilationUnitList += visitCompilationUnitList; } public event Action<CompilationUnitList> VisitedCompilationUnitList; public override CompilationUnitList VisitCompilationUnitList(CompilationUnitList compilationUnits) { if (VisitedCompilationUnitList != null) VisitedCompilationUnitList(compilationUnits); return base.VisitCompilationUnitList(compilationUnits); }