Esempio n. 1
0
 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");
 }
Esempio n. 2
0
 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> > >());
 }
Esempio n. 3
0
            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));
            }