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); } }
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); }