Expression ILiteralEncodingStrategy.Array(EncoderVisitor visitor, IList <LiteralNode> elements) { NativeLiteralArrayVisitor arrayVisitor = new NativeLiteralArrayVisitor(visitor); Expression[] items = new Expression[elements.Count]; for (int i = 0; i < items.Length; i++) { items[i] = elements[i].Accept(arrayVisitor); } Expression initializer = Expression.NewArrayInit(typeof(object), items); NativeLiteralArrayVisitor outerArrrayVisitor = visitor.GetNativeLiteralArrayVisitor(); if (outerArrrayVisitor != null) { outerArrrayVisitor.HadSymbols = outerArrrayVisitor.HadSymbols | arrayVisitor.HadSymbols; return(initializer); // Embed in outer array } // Root (outer-most) array visitor if (!arrayVisitor.HadSymbols) { return(this.DefineLiteral(visitor, "Array", initializer)); } // Special handling if the array contains symbols. FieldInfo field = this.LiteralGenerator.DefineLiteralField("Array", initializer); ArrayBinderDefinition binder = new ArrayBinderDefinition(field); return(this.GenerateLiteralCallSite(visitor, binder, "Array")); }
Expression ILiteralEncodingStrategy.Symbol(EncoderVisitor visitor, string value) { NativeLiteralArrayVisitor arrayVisitor = visitor.GetNativeLiteralArrayVisitor(); if (arrayVisitor != null) { // If inside a literal array, special handling ... return a SymbolPlaceholder instead. arrayVisitor.HadSymbols = true; return(Expression.Convert(Expression.New(NativeLiteralEncodingStrategy.SymbolPlaceholderCtor, Expression.Constant(value, typeof(string))), typeof(object))); } SymbolBinderDefinition binder = new SymbolBinderDefinition(value); return(this.GenerateLiteralCallSite(visitor, binder, value)); }