public Entry(SymbolTable parent, EntryKinds kind, string name) { this.parent = parent; // Establish a two-way link in the tree if (parent != null) { parent.AddEntry(this); } this.kind = kind; this.name = name; }
// Add new catalog entry to proper scope // Risky: caller may not know where it went; maybe merge Global & Persistent? internal void AddEntry(string name, DataType datatype, EntryKinds kind, EntryFlags flags = EntryFlags.None, TypedValue value = null) { var scope = (flags.HasFlag(EntryFlags.Persistent)) ? _catalog.PersistentVars : this; var entry = new CatalogEntry { Name = name, DataType = datatype, Kind = kind, Flags = flags, Scope = scope, Value = value, }; scope.Add(entry); // update catalog if (flags.HasFlag(EntryFlags.Persistent) && _catalog.SaveFlag) { Logger.Assert(entry.Kind == EntryKinds.Type || entry.Value == null, entry); if (entry.Kind == EntryKinds.Type) { _catalog.StoreEntry(entry); } } }
// Add a new entry to the catalog. // Do kind, flags and other stuff here public void AddNewEntry(string name, DataType datatype, EntryKinds kind, EntryFlags flags) { if (_catalog.IsPersist(name)) { flags |= EntryFlags.Persistent; } if (kind == EntryKinds.Value && datatype is DataTypeRelation && _catalog.IsDatabase(name)) { flags |= EntryFlags.Database; } AddEntry(name, datatype, kind, flags, null); // preliminary entry, value can only be set by code //AddEntry(name, datatype, kind, flags, datatype.DefaultValue()); // make sure it has something, to avoid later errrors if (kind == EntryKinds.Value) { if (datatype is DataTypeRelation) { (datatype as DataTypeRelation).ProposeCleanName(name); } else if (datatype is DataTypeTuple) { (datatype as DataTypeTuple).ProposeCleanName(name); } } }
public VarParamEntry(SymbolTable parent, Variable variable, EntryKinds kind) : base(parent, kind, variable.GetName()) { this.variable = variable; }