// // // // // $Revision$ // using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ICSharpCode.NRefactory.Parser.VB { public partial class ExpressionFinder { Stack stack = new Stack(); StringBuilder output = new StringBuilder(); void PopContext() { if (stack.Count > 0) { string indent = new string('\t', stack.Count - 1); var item = stack.Pop(); Print(indent + "exit " + item.context); } else { Print("empty stack"); } } void PushContext(Context context, Token token) { string indent = new string('\t', stack.Count); Location l = token == null ? Location.Empty : token.EndLocation; stack.Push(new Block() { context = context, lastExpressionStart = l }); Print(indent + "enter " + context); } void SetContext(Context context, Token token) { PopContext(); PushContext(context, token); } void ApplyToken(Token token) { //Console.WriteLine(token); if (stack.Count == 0 || token == null) return; Block current = stack.Peek(); // // switch (token.kind) { // case Tokens.EOL: // case Tokens.Colon: // current.lastExpressionStart = token.EndLocation; // break; // default: // if (Tokens.IdentifierTokens[token.Kind]) { // if (lastToken != Tokens.Dot) { // if (Tokens.IdentifierTokens[lastToken]) { // current.context = Context.Default; // } // current.lastExpressionStart = token.Location; // } // } else if (Tokens.SimpleTypeName[token.Kind] || Tokens.ExpressionStart[token.Kind] || token.Kind == Tokens.Literal) { // current.lastExpressionStart = token.Location; // } else { // current.lastExpressionStart = Location.Empty; // current.context = Context.Default; // } // } } void Print(string text) { //Console.WriteLine(text); output.AppendLine(text); } public void SetContext(SnippetType type) { switch (type) { case SnippetType.Expression: currentState = startOfExpression; break; } Advance(); } public string Output { get { return output.ToString(); } } public Block CurrentBlock { get { return stack.Any() ? stack.Peek() : Block.Default; } } public bool NextTokenIsPotentialStartOfXmlMode { get { return nextTokenIsPotentialStartOfXmlMode; } } public bool ReadXmlIdentifier { get { return readXmlIdentifier; } set { readXmlIdentifier = value; } } public bool NextTokenIsStartOfImportsOrAccessExpression { get { return nextTokenIsStartOfImportsOrAccessExpression; } } public bool WasQualifierTokenAtStart { get { return wasQualifierTokenAtStart; } } public List Errors { get { return errors; } } } public enum Context { Global, Type, Member, IdentifierExpected, Body, Xml, Attribute, Query, Expression, Debug, Default } public class Block { public static readonly Block Default = new Block() { context = Context.Global, lastExpressionStart = Location.Empty }; public Context context; public Location lastExpressionStart; } }