diff --git a/Convention/[Symbolization]/Internal/Functional.cs b/Convention/[Symbolization]/Internal/Functional.cs index 692bcda..c09917b 100644 --- a/Convention/[Symbolization]/Internal/Functional.cs +++ b/Convention/[Symbolization]/Internal/Functional.cs @@ -18,7 +18,7 @@ namespace Convention.Symbolization.Internal public readonly struct FunctionSymbol { - public readonly string SymbolName; + public readonly string FunctionName; public readonly Type ReturnType; public readonly Type[] ParameterTypes; public readonly Modification[] Modifiers; @@ -26,7 +26,7 @@ namespace Convention.Symbolization.Internal public FunctionSymbol(string symbolName, Type returnType, Type[] parameterTypes, Modification[] modifiers) { - this.SymbolName = symbolName; + this.FunctionName = symbolName; this.ReturnType = returnType; this.ParameterTypes = parameterTypes; this.Modifiers = modifiers; diff --git a/Convention/[Symbolization]/Internal/Namespace.cs b/Convention/[Symbolization]/Internal/Namespace.cs index d230a9c..8a6c68a 100644 --- a/Convention/[Symbolization]/Internal/Namespace.cs +++ b/Convention/[Symbolization]/Internal/Namespace.cs @@ -1,29 +1,85 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Convention.Symbolization.Internal { - internal sealed class NamespaceModel + public sealed class Namespace : Variable { + public Dictionary SubNamespaces = new(); + public Dictionary Functions = new(); + public Dictionary Structures = new(); - } + private readonly Dictionary SymbolCounter = new(); + private readonly Dictionary> Symbol2Variable = new(); - public sealed class Namespace : Variable - { - private NamespaceModel Data; - - public override object Clone() + public void Refresh() { - Namespace result = new() + // Refresh SymbolCounter + SymbolCounter.Clear(); + foreach (var ns in SubNamespaces) { - Data = Data - }; - return result; + ns.Value.Refresh(); + foreach (var symbol in ns.Value.SymbolCounter) + { + if (SymbolCounter.ContainsKey(symbol.Key)) + SymbolCounter[symbol.Key] += symbol.Value; + else + SymbolCounter[symbol.Key] = symbol.Value; + } + } + foreach (var func in Functions) + { + if (SymbolCounter.ContainsKey(func.Key.FunctionName)) + SymbolCounter[func.Key.FunctionName]++; + else + SymbolCounter[func.Key.FunctionName] = 1; + } + foreach (var @struct in Structures) + { + if (SymbolCounter.ContainsKey(@struct.Key)) + SymbolCounter[@struct.Key]++; + else + SymbolCounter[@struct.Key] = 1; + } } - + public static Namespace CreateOrGetSubNamespace(string namespaceName, Namespace parent) + { + if (parent.SubNamespaces.TryGetValue(namespaceName, out var sub)) + return sub; + parent.SubNamespaces[namespaceName] = new(namespaceName); + return parent.SubNamespaces[namespaceName]; + } + public static Namespace CreateRootNamespace() + { + return new("global"); + } + + private Namespace(string symbolName) : base(symbolName) { } + + public override bool Equals(Namespace other) + { + return this == other; + } + + public string GetNamespaceName() => this.SymbolInfo.SymbolName; + + public bool ContainsSymbol(string symbolName) + { + return SymbolCounter.ContainsKey(symbolName); + } + + public int CountSymbol(string symbolName) + { + return SymbolCounter.TryGetValue(symbolName, out var count) ? count : 0; + } + + public Variable[] Find(string symbolName) + { + if (!Symbol2Variable.TryGetValue(symbolName,out var result)) + return Array.Empty(); + return result.ToArray(); + } } } diff --git a/Convention/[Symbolization]/Internal/Variable.cs b/Convention/[Symbolization]/Internal/Variable.cs index 3f455ff..51b51fc 100644 --- a/Convention/[Symbolization]/Internal/Variable.cs +++ b/Convention/[Symbolization]/Internal/Variable.cs @@ -1,36 +1,49 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Convention.Symbolization.Internal { - public abstract class Variable : ICloneable, IEquatable + public abstract class Variable : IEquatable { public readonly VariableSymbol SymbolInfo; - /// - /// for construct - /// - protected Variable(string symbolName, Type variableType) + protected Variable(VariableSymbol symbolInfo) { - SymbolInfo = new VariableSymbol(symbolName, variableType); + this.SymbolInfo = symbolInfo; } - /// - /// for clone - /// - protected Variable(string symbolName, Variable variable) : this(symbolName, variable.SymbolInfo.VariableType) { } - public abstract object Clone(); public abstract bool Equals(Variable other); public override bool Equals(object obj) { - return obj is Variable variable && Equals(variable); + return Equals(obj as Variable); } - public abstract int GetVariableHashCode(); + public override int GetHashCode() + { + return base.GetHashCode(); + } + } + + + public abstract class Variable : Variable, IEquatable + { + protected Variable(string symbolName) : base(new VariableSymbol(symbolName, typeof(T))) { } + public abstract bool Equals(T other); + + public override bool Equals(Variable other) + { + return other is T variable && Equals(variable); + } + + public override bool Equals(object obj) + { + return obj is T variable && Equals(variable); + } + + public virtual int GetVariableHashCode() + { + return base.GetHashCode(); + } public override sealed int GetHashCode() { @@ -38,6 +51,22 @@ namespace Convention.Symbolization.Internal } } + public abstract class CloneableVariable : Variable, ICloneable + { + protected CloneableVariable(string symbolName, Type variableType) : base(symbolName) + { + } + + protected CloneableVariable(string symbolName, CloneableVariable variable) : base(symbolName) + { + } + + public object Clone() => CloneVariable(); + + public abstract T CloneVariable(); + } + + public readonly struct VariableSymbol { public readonly string SymbolName; @@ -59,9 +88,4 @@ namespace Convention.Symbolization.Internal return new Tuple(SymbolName, VariableType).GetHashCode(); } } - - public class VariableContext - { - public Dictionary Variables = new(); - } }