public bool ApplyBehaviour(List <ASTNode> nodes, int opIndex, OrderMethod caller)
 {
     if (nodes[opIndex] is IndexerNode ix)
     {
         if (ix.Nodes.Count == 0 && nodes[opIndex - 1].Is <IdentifierNode>().Or <ITypeIdentifier>(out bool isType))
         {
             ITypeIdentifier         arrayedType = isType ? nodes[opIndex - 1] as ITypeIdentifier : new TypeIdentifierNode(nodes[opIndex - 1] as IdentifierNode);
             TypeArrayIdentifierNode lookup      = new TypeArrayIdentifierNode(arrayedType, nodes[opIndex - 1].Pos);
             nodes[opIndex - 1] = lookup;
             nodes.RemoveAt(opIndex);
         }
         else
         {
             LookupNode lookup = new LookupNode(nodes[opIndex - 1] as IExpr, nodes[opIndex] as IndexerNode, nodes[opIndex - 1].Pos);
             caller.Invoke(lookup.Index.Nodes); // Invoke on sub-elements
             nodes[opIndex - 1] = lookup;
             nodes.RemoveAt(opIndex);
         }
         return(true);
     }
     else
     {
         return(false);
     }
 }
Exemple #2
0
        public ProxyBuilder(Type proxiedType, ITypeIdentifier identifier, Guid creationContext)
        {
            this.identifier = identifier;
            Model           = ModelBuilder.New();
            Proxy           = RuntimeProxyBuilder.BuildDynamicProxy(proxiedType, creationContext);

            ProxiedType = proxiedType;
        }
Exemple #3
0
 private void AddName(string type_name)
 {
     if (name == null)
     {
         name = ParsedTypeIdentifier(type_name);
     }
     else
     {
         if (nested == null)
         {
             nested = new List <ITypeIdentifier>();
         }
         nested.Add(ParsedTypeIdentifier(type_name));
     }
 }
Exemple #4
0
        public EnumBuilder DefineEnum(string name, TypeAttributes visibility, Type underlyingType)
        {
            ITypeIdentifier ident = TypeIdentifiers.FromInternal(name);

            if (name_cache.ContainsKey(ident))
            {
                throw new ArgumentException("Duplicate type name within an assembly.");
            }

            EnumBuilder eb  = new EnumBuilder(this, name, visibility, underlyingType);
            TypeBuilder res = eb.GetTypeBuilder();

            AddType(res);
            name_cache.Add(ident, res);
            return(eb);
        }
Exemple #5
0
        private TypeBuilder DefineType(string name, TypeAttributes attr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type?parent, Type[]?interfaces, PackingSize packingSize, int typesize)
        {
            ArgumentNullException.ThrowIfNull(name, "fullname");
            ITypeIdentifier ident = TypeIdentifiers.FromInternal(name);

            if (name_cache.ContainsKey(ident))
            {
                throw new ArgumentException("Duplicate type name within an assembly.");
            }
            TypeBuilder res = new TypeBuilder(this, name, attr, parent, interfaces, packingSize, typesize, null);

            AddType(res);

            name_cache.Add(ident, res);

            return(res);
        }
Exemple #6
0
        public ProxyFactory(ITypeIdentifier identifier, Guid creationContext)
        {
            this.identifier      = identifier;
            this.creationContext = creationContext;
            foreach (var item in identifier.GetAvailableTypesAndTheirSerializableParents().ToList())
            {
                if (item.IsGenericTypeDefinition)
                {
                    continue;
                }
                builders.Add(item, new ProxyBuilder(item, identifier, creationContext));
            }

            foreach (var item in builders.ToList())
            {
                var proxy = item.Value.Build(builders.Select(x => x.Value).ToList());
                proxies.Add(item.Value.ProxiedType, proxy);
            }
        }
Exemple #7
0
        public static void IncludeParents(this RuntimeTypeModel model, ITypeIdentifier typeIdentifier, MetaType type)
        {
            if (type.Type.BaseType == typeof(object) || type.Type.BaseType == null)
            {
                return;
            }
            var metaBase = model.Add(type.Type.BaseType, true);

            model.IncludeParents(typeIdentifier, metaBase);

            if (IsRegisteredType(typeIdentifier, type) || IsRegisteredGenericType(typeIdentifier, type))
            {
                foreach (var field in metaBase.GetFields())
                {
                    if (!type.GetFields().Select(x => x.FieldNumber).Contains(field.FieldNumber))
                    {
                        type.AddField(field.FieldNumber, field.Member.Name);
                    }
                }
            }
        }
Exemple #8
0
        public Serializer(ITypeIdentifier identifier)
        {
            Id = Guid.NewGuid();
            proteusTypeModel = new ProteusRuntimeTypeModel(identifier);
            this.identifier = identifier;
            protobufTypeModel = ModelBuilder.New();
            List<Type> builtProxies = new List<Type>();
            var factory = new ProxyFactory(this.identifier, Id);

            foreach (var item in identifier.GetAvailableTypesAndTheirSerializableParents())
            {
                if (item.IsGenericTypeDefinition)
                    continue;
                var proxy = factory.GetProxy(item);
                var metaType = protobufTypeModel.Add(item, false);
                protobufTypeModel.IncludeParents(identifier, metaType);
                metaType.SetSurrogate(proxy);
                builtProxies.Add(proxy);

            }

            // builtProxies.Add(px);
        }
Exemple #9
0
 private static bool IsRegisteredGenericType(ITypeIdentifier typeIdentifier, MetaType type)
 {
     return(type.Type.BaseType.IsGenericType && typeIdentifier.AvailableTypes.Contains(type.Type.BaseType.GetGenericTypeDefinition()));
 }
Exemple #10
0
 public VarDeclNode(SourcePosition pos, ITypeIdentifier varTypeNode, string identifier) : base(pos, "=", LexTokenType.None)
 {
     this.TypeExpr     = varTypeNode;
     this.VarName      = identifier;
     this.AssignToExpr = null;
 }
Exemple #11
0
 public VarDeclNode(SourcePosition pos, ITypeIdentifier varTypeNode, AssignmentNode assignNode) : base(pos, "=", LexTokenType.None)
 {
     this.TypeExpr     = varTypeNode;
     this.VarName      = assignNode.Left.Content;
     this.AssignToExpr = assignNode.Right;
 }
        public static IEnumerable <Type> GetAvailableTypesAndTheirSerializableParents(this ITypeIdentifier identifier)
        {
            var search   = identifier.AvailableTypes.ToList();
            var returned = new List <Type>();

            foreach (var item in identifier.AvailableTypes.ToList())
            {
                if (!returned.Contains(item))
                {
                    returned.Add(item);
                    yield return(item);
                }
                var props = item.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
                foreach (var pr in props)
                {
                    if (search.Any(x => pr.PropertyType.IsAssignableFrom(x)))
                    {
                        if (!returned.Contains(pr.PropertyType))
                        {
                            returned.Add(pr.PropertyType);
                            yield return(pr.PropertyType);
                        }
                    }
                }
            }
        }
Exemple #13
0
 public NewObjectNode(ITypeIdentifier typeIdentifier, ExpressionNode ctorArgs, SourcePosition position) : base(position, "new", LexTokenType.None)
 {
     this.Type          = typeIdentifier;
     this.CtorArguments = new ArgumentsNode(ctorArgs);
 }
Exemple #14
0
 public ProteusRuntimeTypeModel(ITypeIdentifier identifier)
 {
     this.identifier = identifier;
 }
Exemple #15
0
 public override ITypeName NestedName(ITypeIdentifier innerName)
 {
     return(TypeNames.FromDisplay(DisplayName + "+" + innerName.DisplayName));
 }
Exemple #16
0
 internal static ITypeIdentifier FromInternal(string internalNameSpace, ITypeIdentifier typeName)
 {
     return(new Internal(internalNameSpace, typeName));
 }
Exemple #17
0
 private static bool IsRegisteredType(ITypeIdentifier typeIdentifier, MetaType type)
 {
     return(typeIdentifier.AvailableTypes.Contains(type.Type.BaseType));
 }
 public TypeArrayIdentifierNode(ITypeIdentifier encapsulatedType, SourcePosition position) : base(position, string.Empty, LexTokenType.None)
 {
     this.EncapsulatedType = encapsulatedType;
 }
Exemple #19
0
 internal Internal(string nameSpaceInternal, ITypeIdentifier typeName)
 {
     this.internalName = nameSpaceInternal + "." + typeName.InternalName;
 }
Exemple #20
0
 public NewArrayNode(ITypeIdentifier type, IndexerNode indexer, SourcePosition position) : base(position, string.Empty, LexTokenType.None)
 {
     this.Type    = type;
     this.Indexer = indexer;
 }
Exemple #21
0
 public abstract ITypeName NestedName(ITypeIdentifier innerName);
 public void AddType(ITypeIdentifier identifier) => this.InheritanceNodes.Add(identifier);