namespace Semmle.Extraction { /// /// An abstract symbol, which encapsulates a data type (such as a C# symbol). /// /// The type of the symbol. public abstract class CachedEntity : ICachedEntity { public CachedEntity(Context context, Initializer init) { Context = context; symbol = init; } public Label Label { get; set; } public abstract Microsoft.CodeAnalysis.Location ReportingLocation { get; } public override string ToString() => Label.ToString(); public abstract void Populate(); public Context Context { get; private set; } public Initializer symbol { get; private set; } object ICachedEntity.UnderlyingObject => symbol; public Initializer UnderlyingObject => symbol; public abstract IId Id { get; } public abstract bool NeedsPopulation { get; } /// /// Runs the given action , guarding for trap duplication /// based on the ID an location of this entity. /// protected void WithDuplicationGuard(System.Action a, IEntity location) { var key = new Key(this, location); Context.WithDuplicationGuard(key, a); } public override int GetHashCode() => symbol.GetHashCode(); public override bool Equals(object obj) { var other = obj as CachedEntity; return other?.GetType() == GetType() && Equals(other.symbol, symbol); } public abstract TrapStackBehaviour TrapStackBehaviour { get; } } }