// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) // This code is distributed under MIT X11 license (for details please see \doc\license.txt) using System; using System.Collections.Generic; using ICSharpCode.NRefactory.VB.Ast; namespace ICSharpCode.NRefactory.VB.PrettyPrinter { // public class SpecialOutputVisitor : ISpecialVisitor // { // readonly IOutputFormatter formatter; // // public SpecialOutputVisitor(IOutputFormatter formatter) // { // this.formatter = formatter; // } // // public bool ForceWriteInPreviousLine; // // public object Visit(ISpecial special, object data) // { // Console.WriteLine("Warning: SpecialOutputVisitor.Visit(ISpecial) called with " + special); // return data; // } // // public object Visit(BlankLine special, object data) // { // formatter.PrintBlankLine(ForceWriteInPreviousLine); // return data; // } // // public object Visit(Comment special, object data) // { // formatter.PrintComment(special, ForceWriteInPreviousLine); // return data; // } // // public object Visit(PreprocessingDirective special, object data) // { // formatter.PrintPreprocessingDirective(special, ForceWriteInPreviousLine); // return data; // } // } // // /// // /// This class inserts specials between INodes. // /// // public sealed class SpecialNodesInserter : IDisposable // { // IEnumerator enumerator; // SpecialOutputVisitor visitor; // bool available; // true when more specials are available // // public SpecialNodesInserter(IEnumerable specials, SpecialOutputVisitor visitor) // { // if (specials == null) throw new ArgumentNullException("specials"); // if (visitor == null) throw new ArgumentNullException("visitor"); // enumerator = specials.GetEnumerator(); // this.visitor = visitor; // available = enumerator.MoveNext(); // } // // void WriteCurrent() // { // enumerator.Current.AcceptVisitor(visitor, null); // available = enumerator.MoveNext(); // } // // AttributedNode currentAttributedNode; // // /// // /// Writes all specials up to the start position of the node. // /// // public void AcceptNodeStart(INode node) // { // if (node is AttributedNode) { // currentAttributedNode = node as AttributedNode; // if (currentAttributedNode.Attributes.Count == 0) { // AcceptPoint(node.StartLocation); // currentAttributedNode = null; // } // } else { // AcceptPoint(node.StartLocation); // } // } // // /// // /// Writes all specials up to the end position of the node. // /// // public void AcceptNodeEnd(INode node) // { // visitor.ForceWriteInPreviousLine = true; // AcceptPoint(node.EndLocation); // visitor.ForceWriteInPreviousLine = false; // if (currentAttributedNode != null) { // if (node == currentAttributedNode.Attributes[currentAttributedNode.Attributes.Count - 1]) { // AcceptPoint(currentAttributedNode.StartLocation); // currentAttributedNode = null; // } // } // } // // /// // /// Writes all specials up to the specified location. // /// // public void AcceptPoint(Location loc) // { // while (available && enumerator.Current.StartPosition <= loc) { // WriteCurrent(); // } // } // // /// // /// Outputs all missing specials to the writer. // /// // public void Finish() // { // while (available) { // WriteCurrent(); // } // } // // void IDisposable.Dispose() // { // Finish(); // } // // /// // /// Registers a new SpecialNodesInserter with the output visitor. // /// Make sure to call Finish() (or Dispose()) on the returned SpecialNodesInserter // /// when the output is finished. // /// // public static SpecialNodesInserter Install(IEnumerable specials, IOutputDomVisitor outputVisitor) // { // SpecialNodesInserter sni = new SpecialNodesInserter(specials, new SpecialOutputVisitor(outputVisitor.OutputFormatter)); // outputVisitor.BeforeNodeVisit += sni.AcceptNodeStart; // outputVisitor.AfterNodeVisit += sni.AcceptNodeEnd; // return sni; // } // } }