internal static IBox <IIsPossibly <IWeakMemberDefinition> > GetMemberOrThrow(this IResolvableScope scope, IKey name, bool staticOnly) { if (scope.TryGetMember(name, staticOnly, out var thing)) { return(thing); } throw new Exception($"{name} should exist in scope"); }
internal static IIsPossibly <IBox <IIsPossibly <IWeakMemberDefinition> > > PossiblyGetMember(this IResolvableScope scope, bool staticOnly, IKey name) { if (scope.TryGetMember(name, staticOnly, out var thing)) { return(Possibly.Is(thing)); } return(Possibly.IsNot <IBox <IIsPossibly <IWeakMemberDefinition> > >()); }
public IResolvableScope FinalizeScope(IResolvableScope parent) { if (!owner.Parent.IsDefinately(out var _, out var _)) { throw new ApplicationException("bug: this scope does not have a parent, you can't use FinalizeScope(IResolvableScope parent) for it"); } if (IsFinal) { throw new ApplicationException("bug: don't finalize twice"); } IsFinal = true; var resolvaleMembers = new ConcurrentDictionary <IKey, ConcurrentSet <Visiblity <IBox <IIsPossibly <WeakMemberDefinition> > > > >(); foreach (var memberCollection in owner.members) { if (!resolvaleMembers.TryGetValue(memberCollection.Key, out var _)) { var list = resolvaleMembers.GetOrAdd(memberCollection.Key, new ConcurrentSet <Visiblity <IBox <IIsPossibly <WeakMemberDefinition> > > >()); // TODO // we can't just take the first // most of these are probably the same varialbe // check if the types are compatible var member = memberCollection.Value.First(); list.TryAdd(new Visiblity <IBox <IIsPossibly <WeakMemberDefinition> > >(member.Item1, member.Item2)); } else { // TODO validate the definitions are compatible } } foreach (var member in owner.inferedMembers) { if (!resolvaleMembers.TryGetValue(member.Key, out var _) && !parent.TryGetMember(member.Key, false, out var _)) { var list = resolvaleMembers.GetOrAdd(member.Key, new ConcurrentSet <Visiblity <IBox <IIsPossibly <WeakMemberDefinition> > > >()); list.TryAdd(new Visiblity <IBox <IIsPossibly <WeakMemberDefinition> > >(DefintionLifetime.Instance, member.Value.Build())); } } var resolvableTypes = new ConcurrentDictionary <IKey, ConcurrentSet <Visiblity <IBox <IIsPossibly <IFrontendType> > > > >(); foreach (var pair in owner.types) { var list = resolvableTypes.GetOrAdd(pair.Key, new ConcurrentSet <Visiblity <IBox <IIsPossibly <IFrontendType> > > >()); foreach (var item in pair.Value) { list.TryAdd(new Visiblity <IBox <IIsPossibly <IFrontendType> > >(DefintionLifetime.Static, item)); } } var resolvableGenericTypes = new ConcurrentDictionary <NameKey, ConcurrentSet <Visiblity <IBox <IIsPossibly <IFrontendGenericType> > > > >(); foreach (var pair in owner.genericTypes) { var list = resolvableGenericTypes.GetOrAdd(pair.Key, new ConcurrentSet <Visiblity <IBox <IIsPossibly <IFrontendGenericType> > > >()); foreach (var item in pair.Value) { list.TryAdd(new Visiblity <IBox <IIsPossibly <IFrontendGenericType> > >(DefintionLifetime.Static, item)); } } return(new ResolvableScope(parent, resolvaleMembers, resolvableTypes, resolvableGenericTypes)); }