/*
* 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 + "]");
}
}
}