示例#1
0
    public override async Task Load()
    {
        BaseClassStr     = Node.GetAttribute("baseClass");
        _abstract        = Node.GetAttribute <bool>("abstract", false);
        _nullableDefault = Node.GetAttribute <bool>("nullableDefault", ProtoGen.NullableDefault);

        if (NeedsReflectionGeneration)
        {
            Interfaces.Add(LoquiInterfaceDefinitionType.ISetter, nameof(ILoquiReflectionSetter));
        }

        if (ObjectNamedKey.TryFactory(BaseClassStr, ProtoGen.Protocol, out var baseClassObjKey))
        {
            if (!gen.ObjectGenerationsByObjectNameKey.TryGetValue(baseClassObjKey, out ObjectGeneration baseObj) ||
                !(baseObj is ClassGeneration))
            {
                throw new ArgumentException($"Could not resolve base class object: {BaseClassStr}");
            }
            else
            {
                ClassGeneration baseClass = baseObj as ClassGeneration;
                BaseClass = baseClass;
                baseClass._derivativeClasses.Add(this);
            }
        }
#if NETSTANDARD2_0
        WiredBaseClassTCS.TrySetResult(true);
#else
        WiredBaseClassTCS.TrySetResult();
#endif

        await base.Load();
    }
 public static async Task <Case> HasMajorRecords(LoquiType loqui, bool includeBaseClass, GenericSpecification specifications = null, bool includeSelf = true)
 {
     if (loqui.TargetObjectGeneration != null)
     {
         if (includeSelf && await loqui.TargetObjectGeneration.IsMajorRecord())
         {
             return(Case.Yes);
         }
         return(await MajorRecordModule.HasMajorRecordsInTree(loqui.TargetObjectGeneration, includeBaseClass, loqui.GenericSpecification));
     }
     else if (specifications != null)
     {
         foreach (var target in specifications.Specifications.Values)
         {
             if (!ObjectNamedKey.TryFactory(target, out var key))
             {
                 continue;
             }
             var specObj = loqui.ObjectGen.ProtoGen.Gen.ObjectGenerationsByObjectNameKey[key];
             if (await specObj.IsMajorRecord())
             {
                 return(Case.Yes);
             }
             return(await MajorRecordModule.HasMajorRecordsInTree(specObj, includeBaseClass));
         }
     }
     else if (loqui.RefType == LoquiType.LoquiRefType.Interface)
     {
         // ToDo
         // Quick hack.  Real solution should use reflection to investigate the interface
         return(includeSelf ? Case.Yes : Case.No);
     }
     return(Case.Maybe);
 }
示例#3
0
    public void BasicEquals()
    {
        var lhs = new ObjectNamedKey(
            new ProtocolKey("Test"),
            "Object");
        var rhs = new ObjectNamedKey(
            new ProtocolKey("Test"),
            "Object");

        Assert.Equal(lhs, rhs);
    }
 public static async IAsyncEnumerable <ObjectGeneration> IterateMajorRecords(LoquiType loqui, bool includeBaseClass, GenericSpecification specifications = null)
 {
     if (specifications?.Specifications.Count > 0)
     {
         foreach (var target in specifications.Specifications.Values)
         {
             if (!ObjectNamedKey.TryFactory(target, out var key))
             {
                 continue;
             }
             var specObj = loqui.ObjectGen.ProtoGen.Gen.ObjectGenerationsByObjectNameKey[key];
             if (await specObj.IsMajorRecord())
             {
                 yield return(specObj);
             }
             await foreach (var item in IterateMajorRecords(specObj, includeBaseClass, includeSelf: true, loqui.GenericSpecification))
             {
                 yield return(item);
             }
         }
     }
     else if (loqui.TargetObjectGeneration != null)
     {
         if (await loqui.TargetObjectGeneration.IsMajorRecord())
         {
             yield return(loqui.TargetObjectGeneration);
         }
         await foreach (var item in IterateMajorRecords(loqui.TargetObjectGeneration, includeBaseClass, includeSelf: true, loqui.GenericSpecification))
         {
             yield return(item);
         }
     }
     else if (loqui.RefType == LoquiType.LoquiRefType.Interface)
     {
         // Must be a link interface
         if (!LinkInterfaceModule.ObjectMappings[loqui.ObjectGen.ProtoGen.Protocol].TryGetValue(loqui.SetterInterface, out var mappings))
         {
             throw new ArgumentException();
         }
         foreach (var obj in mappings)
         {
             yield return(obj);
         }
     }
     else
     {
         throw new ArgumentException();
     }
 }
示例#5
0
        public override Task Load(XElement node, bool requireName = true)
        {
            XElement convert = new XElement(XName.Get("Ref", LoquiGenerator.Namespace));

            convert.Add(node.Attribute("name"));
            var dir = new XElement(XName.Get("Direct", LoquiGenerator.Namespace));

            dir.Add(new XAttribute("refName", "Group"));
            convert.Add(dir);
            var gen     = new XElement(XName.Get("GenericSpecification", LoquiGenerator.Namespace));
            var nameKey = ObjectNamedKey.Factory(node.GetAttribute("refName"), this.ObjectGen.ProtoGen.Protocol);

            gen.Add(new XAttribute("Definition", nameKey.ToString()));
            gen.Add(new XAttribute("TypeToSpecify", "T"));
            dir.Add(gen);
            this.ThisConstruction = true;
            this.CustomData[Plugins.Internals.Constants.EdidLinked] = node.GetAttribute <bool>(Plugins.Internals.Constants.EdidLinked, false);
            return(base.Load(convert, requireName));
        }
示例#6
0
 public static async Task <Case> HasLinks(LoquiType loqui, bool includeBaseClass, GenericSpecification specifications = null)
 {
     if (loqui.TargetObjectGeneration != null)
     {
         return(await HasLinks(loqui.TargetObjectGeneration, includeBaseClass, loqui.GenericSpecification));
     }
     else if (specifications != null)
     {
         foreach (var target in specifications.Specifications.Values)
         {
             if (!ObjectNamedKey.TryFactory(target, out var key))
             {
                 continue;
             }
             var specObj = loqui.ObjectGen.ProtoGen.Gen.ObjectGenerationsByObjectNameKey[key];
             return(await HasLinks(specObj, includeBaseClass));
         }
         return(Case.Maybe);
     }
     else
     {
         return(Case.Maybe);
     }
 }
示例#7
0
 public void Resolve(ObjectGeneration obj)
 {
     if (!Wheres.Any())
     {
         return;
     }
     if (!Loqui)
     {
         var loquiElem = Wheres.FirstOrDefault((i) =>
                                               i.Equals(nameof(ILoquiObjectGetter)) ||
                                               i.Equals(nameof(ILoquiObject)));
         Loqui = loquiElem != null;
     }
     if (!ObjectNamedKey.TryFactory(Wheres.First(), obj.ProtoGen.Protocol, out var objGenKey))
     {
         return;
     }
     if (!obj.ProtoGen.Gen.ObjectGenerationsByObjectNameKey.TryGetValue(objGenKey, out var baseObjGen))
     {
         return;
     }
     BaseObjectGeneration = baseObjGen;
     Loqui = true;
 }
示例#8
0
 public void TryFactory_ExtraFull()
 {
     Assert.True(ObjectNamedKey.TryFactory($"{LargeProtocol.Namespace}.{ObjectName}", FallbackProtocol, out var key));
     Assert.Equal(key.ProtocolKey, LargeProtocol);
     Assert.Equal(key.Name, ObjectName);
 }
示例#9
0
 public void TryFactory_OnlyName()
 {
     Assert.True(ObjectNamedKey.TryFactory(ObjectName, FallbackProtocol, out var key));
     Assert.Equal(key.ProtocolKey, FallbackProtocol);
     Assert.Equal(key.Name, ObjectName);
 }
示例#10
0
 public void TryFactory_Null()
 {
     Assert.False(ObjectNamedKey.TryFactory(null, FallbackProtocol, out var key));
 }
示例#11
0
 public void TryFactory_Empty()
 {
     Assert.False(ObjectNamedKey.TryFactory(string.Empty, FallbackProtocol, out var key));
 }