// // location.cs: Keeps track of the location of source code entity // // Author: // Miguel de Icaza // // (C) 2001 Ximian, Inc. // using System; using System.Collections; namespace Mono.CSharp { /// /// Keeps track of the location in the program /// /// /// /// This uses a compact representation and a couple of auxiliary /// structures to keep track of tokens to (file,line) mappings. /// /// We could probably also keep track of columns by storing those /// in 8 bits (and say, map anything after char 255 to be `255+'). /// public struct Location { public int token; static Hashtable map; static ArrayList list; static int global_count; static int module_base; static Location () { map = new Hashtable (); list = new ArrayList (); global_count = 0; module_base = 0; } static public void Push (string name) { map.Remove (global_count); map.Add (global_count, name); list.Add (global_count); module_base = global_count; } public Location (int row) { if (row < 0) token = -1; else { token = module_base + row; if (global_count < token) global_count = token; } } public override string ToString () { return Name + ": (" + Row + ")"; } /// /// Whether the Location is Null /// static public bool IsNull (Location l) { return l.token == -1; } static public Location Null { get { return new Location (-1); } } public string Name { get { int best = 0; if (token < 0) return "Internal"; foreach (int b in list){ if (token > b) best = b; } return (string) map [best]; } } public int Row { get { int best = 0; if (token < 0) return 1; foreach (int b in list){ if (token > b) best = b; } return token - best; } } } }