public IdentityElement(QualifiedElement parent, string name) : base(parent) { var piv = parent.Parent; (ScopeCategories scope, IdentityCategories category)? attr = default; while (!(piv is ImaginaryRoot)) { attr = piv switch { NameSpaceElement _ => (ScopeCategories.Public, IdentityCategories.Namespace), ClassElement cls => (cls.Scope, IdentityCategories.Class), StructElement str => (str.Scope, IdentityCategories.Struct), InterfaceElement iface => (iface.Scope, IdentityCategories.Interface), EnumElement e => (e.Scope, IdentityCategories.Enum), DelegateElement d => (d.Scope, IdentityCategories.Delegate), _ => null }; piv = piv.Parent; if (attr is null) { continue; } break; } Name = name; Category = attr?.category ?? throw new CategoryNotFoundException(name); Scope = attr.Value.scope; }
public NameSpaceElement Build(CompilationUnitSyntax syntax, IPhysicalStorage storage) { try { var global = new NameSpaceElement(storage); _ = new QualifiedElement(global); _parentStack.Push(global); Visit(syntax); Debug.Assert(_parentStack.Count == 1); return((NameSpaceElement)_parentStack.Pop()); } finally { _parentStack.Clear(); } }
public override QualifiedElement GetQualifiedName() { var accum = StackPool.Get(); try { AggregateIdentities(accum); var piv = Parent switch { NameSpaceElement ns => ns.Parent, _ => Parent }; if (!(piv is ImaginaryRoot)) { foreach (var element in piv.AncestorsAndSelf()) { element.AggregateIdentities(accum); } } var ret = new QualifiedElement(); while (accum.Count != 0) { var(scope, cat, nme) = accum.Pop(); _ = new IdentityElement(ret, scope, cat, nme); } return(ret); } finally { Debug.Assert(accum.Count == 0); StackPool.Return(accum); } }