Ejemplo n.º 1
0
        public EventDeserializer(ITypeNameMapper?typeNameMapper = null,
                                 ITypeConvertorGenerator?typeConvertorGenerator = null, ISymmetricCipher?symmetricCipher = null)
        {
            TypeNameMapper     = typeNameMapper ?? new FullNameTypeMapper();
            ConvertorGenerator = typeConvertorGenerator ?? DefaultTypeConvertorGenerator.Instance;
            _symmetricCipher   = symmetricCipher ?? new InvalidSymmetricCipher();
            _id2Info.Reserve(ReservedBuildinTypes + 10);
            _id2Info.Add(null); // 0 = null
            _id2Info.Add(null); // 1 = back reference
            foreach (var predefinedType in BasicSerializersFactory.TypeDescriptors)
            {
                var infoForType = new DeserializerTypeInfo
                {
                    Id         = (int)_id2Info.Count,
                    Descriptor = predefinedType
                };
                _typeOrDescriptor2Info[predefinedType] = infoForType;
                _id2Info.Add(infoForType);

                _typeOrDescriptor2Info.TryAdd(predefinedType.GetPreferredType(), infoForType);
                var descriptorMultipleNativeTypes = predefinedType as ITypeDescriptorMultipleNativeTypes;
                if (descriptorMultipleNativeTypes == null)
                {
                    continue;
                }
                foreach (var type in descriptorMultipleNativeTypes.GetNativeTypes())
                {
                    _typeOrDescriptor2Info[type] = infoForType;
                }
            }

            while (_id2Info.Count < ReservedBuildinTypes)
            {
                _id2Info.Add(null);
            }
        }
Ejemplo n.º 2
0
        AstNode ToAssignable([CanBeNull] AstNode node, bool isBinding = false)
        {
            if (Options.EcmaVersion >= 6 && node != null)
            {
                switch (node)
                {
                case AstSymbol identifierNode:
                    if (_inAsync && identifierNode.Name == "await")
                    {
                        Raise(node.Start, "Can not use 'await' as identifier inside an async function");
                    }
                    break;

                case AstPropAccess _:
                    if (!isBinding)
                    {
                        break;
                    }
                    goto default;

                case AstDestructuring _:
                    break;

                case AstObject objectExpression:
                    var newProperties = new StructList <AstNode>();
                    newProperties.Reserve(objectExpression.Properties.Count);
                    for (var i = 0; i < newProperties.Count; i++)
                    {
                        newProperties[(uint)i] = ToAssignable(objectExpression.Properties[(uint)i], isBinding);
                    }
                    node = new AstDestructuring(this, node.Start, node.End, ref newProperties, false);
                    break;

                case AstArray arrayExpression:
                    ToAssignableList(ref arrayExpression.Elements, isBinding);
                    node = new AstDestructuring(this, node.Start, node.End, ref arrayExpression.Elements, true);
                    break;

                case AstExpansion spreadElement:
                    spreadElement.Expression = ToAssignable(spreadElement.Expression, isBinding);
                    if (spreadElement.Expression is AstDefaultAssign)
                    {
                        Raise(spreadElement.Expression.Start, "Rest elements cannot have a default value");
                    }

                    break;

                case AstAssign assignmentExpression:
                    if (assignmentExpression.Operator != Operator.Assignment)
                    {
                        Raise(assignmentExpression.Left.End,
                              "Only '=' operator can be used for specifying default value.");
                    }

                    var left  = ToAssignable(assignmentExpression.Left, isBinding);
                    var right = assignmentExpression.Right;
                    node = new AstDefaultAssign(this, node.Start, node.End, left, right);
                    goto AssignmentPatternNode;

                case AstDefaultAssign _:
AssignmentPatternNode:
                    break;

                default:
                    Raise(node.Start, "Assigning to rvalue");
                    break;
                }
            }

            return(node);
        }