/* * Copyright 2019 faddenSoft * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using System.Collections.Generic; using System.Diagnostics; namespace SourceGen { /// /// Subclass of Symbol used for symbols defined in the platform or project. /// /// Instances are immutable. /// public class DefSymbol : Symbol { /// /// Data format descriptor. /// public FormatDescriptor DataDescriptor { get; private set; } /// /// User-supplied comment. /// public string Comment { get; private set; } public string Tag { get; private set; } /// /// Cross-reference data, generated by the analyzer. /// public XrefSet Xrefs { get; private set; } // NOTE: might be nice to identify the symbol's origin, e.g. which platform // symbol file it was defined in. This could then be stored in a // DisplayList line, for benefit of the Info panel. /// /// Internal base-object constructor, called by other constructors. /// private DefSymbol(string label, int value, Source source, Type type) : base(label, value, source, type) { Debug.Assert(source == Source.Platform || source == Source.Project); Debug.Assert(type == Type.ExternalAddr || type == Type.Constant); Xrefs = new XrefSet(); } /// /// Constructor. /// /// Symbol's label. /// Symbol's value. /// Symbol source (general point of origin). /// Symbol type. /// Format descriptor sub-type, so we know how the /// user wants the value to be displayed. /// End-of-line comment. /// Symbol tag, used for grouping platform symbols. public DefSymbol(string label, int value, Source source, Type type, FormatDescriptor.SubType formatSubType, string comment, string tag) : this(label, value, source, type) { Debug.Assert(comment != null); Debug.Assert(tag != null); // Length doesn't matter; use 1 to get prefab object. DataDescriptor = FormatDescriptor.Create(1, FormatDescriptor.Type.NumericLE, formatSubType); Comment = comment; Tag = tag; } /// /// Constructs a DefSymbol from a Symbol and a format descriptor. This is used /// for project symbols. /// /// Base symbol. /// Format descriptor. /// End-of-line comment. public DefSymbol(Symbol sym, FormatDescriptor dfd, string comment) : this(sym.Label, sym.Value, sym.SymbolSource, sym.SymbolType) { Debug.Assert(comment != null); DataDescriptor = dfd; Comment = comment; Tag = string.Empty; } public override string ToString() { return base.ToString() + ":" + DataDescriptor + ";" + Comment + (string.IsNullOrEmpty(Tag) ? "" : " [" + Tag + "]"); } } }