public Expression ConvertConstantValue(ResolveResult rr) { if (rr == null) { throw new ArgumentNullException("rr"); } if (rr is TypeOfResolveResult) { return(new TypeOfExpression(ConvertType(((TypeOfResolveResult)rr).Type))); } else if (rr is ArrayCreateResolveResult) { ArrayCreateResolveResult acrr = (ArrayCreateResolveResult)rr; AstType type = ConvertType(acrr.Type); throw new NotImplementedException(); } else if (rr.IsCompileTimeConstant) { return(ConvertConstantValue(rr.Type, rr.ConstantValue)); } else { return(new EmptyExpression()); } }
static ResolveResult MapToNewContext(ResolveResult rr, ITypeResolveContext newContext) { if (rr is TypeOfResolveResult) { return(new TypeOfResolveResult( rr.Type.ToTypeReference().Resolve(newContext), ((TypeOfResolveResult)rr).ReferencedType.ToTypeReference().Resolve(newContext))); } else if (rr is ArrayCreateResolveResult) { ArrayCreateResolveResult acrr = (ArrayCreateResolveResult)rr; return(new ArrayCreateResolveResult( acrr.Type.ToTypeReference().Resolve(newContext), MapToNewContext(acrr.SizeArguments, newContext), MapToNewContext(acrr.InitializerElements, newContext))); } else if (rr.IsCompileTimeConstant) { return(new ConstantResolveResult( rr.Type.ToTypeReference().Resolve(newContext), rr.ConstantValue )); } else { return(new ErrorResolveResult(rr.Type.ToTypeReference().Resolve(newContext))); } }
public ArrayCreateBlock(IEmitter emitter, ArrayCreateExpression arrayCreateExpression, ArrayCreateResolveResult arrayCreateResolveResult) : base(emitter, null) { Emitter = emitter; ArrayCreateExpression = arrayCreateExpression; ArrayCreateResolveResult = arrayCreateResolveResult; }
static ResolveResult MapToNewContext(ResolveResult rr, MapTypeIntoNewContext mapping) { if (rr is TypeOfResolveResult) { return(new TypeOfResolveResult( rr.Type.AcceptVisitor(mapping), ((TypeOfResolveResult)rr).ReferencedType.AcceptVisitor(mapping))); } else if (rr is ArrayCreateResolveResult) { ArrayCreateResolveResult acrr = (ArrayCreateResolveResult)rr; return(new ArrayCreateResolveResult( acrr.Type.AcceptVisitor(mapping), MapToNewContext(acrr.SizeArguments, mapping), MapToNewContext(acrr.InitializerElements, mapping))); } else if (rr.IsCompileTimeConstant) { return(new ConstantResolveResult( rr.Type.AcceptVisitor(mapping), rr.ConstantValue )); } else { return(new ErrorResolveResult(rr.Type.AcceptVisitor(mapping))); } }
public override string VisitArrayCreateResolveResult(ArrayCreateResolveResult rr, object data) { if (rr.InitializerElements != null) { return(CompileFactoryCall("NewArrayInit", new[] { typeof(Type), typeof(Expression[]) }, new[] { ExpressionTreeBuilder.GetTypeName(rr.Type, this._emitter), this._emitter.ToJavaScript(rr.InitializerElements.Select(e => new JRaw(this.VisitResolveResult(e, null))).ToArray()) })); } return(CompileFactoryCall("NewArrayBounds", new[] { typeof(Type), typeof(Expression[]) }, new[] { ExpressionTreeBuilder.GetTypeName(rr.Type, this._emitter), this._emitter.ToJavaScript(rr.SizeArguments.Select(a => new JRaw(VisitResolveResult(a, null))).ToArray()) })); }
public Expression ConvertConstantValue(ResolveResult rr) { if (rr == null) { throw new ArgumentNullException("rr"); } if (rr is ConversionResolveResult) { // unpack ConversionResolveResult if necessary // (e.g. a boxing conversion or string->object reference conversion) rr = ((ConversionResolveResult)rr).Input; } if (rr is TypeOfResolveResult) { return(new TypeOfExpression(ConvertType(rr.Type))); } else if (rr is ArrayCreateResolveResult) { ArrayCreateResolveResult acrr = (ArrayCreateResolveResult)rr; ArrayCreateExpression ace = new ArrayCreateExpression(); ace.Type = ConvertType(acrr.Type); ComposedType composedType = ace.Type as ComposedType; if (composedType != null) { composedType.ArraySpecifiers.MoveTo(ace.AdditionalArraySpecifiers); if (!composedType.HasNullableSpecifier && composedType.PointerRank == 0) { ace.Type = composedType.BaseType; } } if (acrr.SizeArguments != null && acrr.InitializerElements == null) { ace.AdditionalArraySpecifiers.FirstOrNullObject().Remove(); ace.Arguments.AddRange(acrr.SizeArguments.Select(ConvertConstantValue)); } if (acrr.InitializerElements != null) { ArrayInitializerExpression initializer = new ArrayInitializerExpression(); initializer.Elements.AddRange(acrr.InitializerElements.Select(ConvertConstantValue)); ace.Initializer = initializer; } return(ace); } else if (rr.IsCompileTimeConstant) { return(ConvertConstantValue(rr.Type, rr.ConstantValue)); } else { return(new ErrorExpression()); } }
public override JsExpression VisitArrayCreateResolveResult(ArrayCreateResolveResult rr, object data) { if (rr.InitializerElements != null) { return(CompileFactoryCall("NewArrayInit", new[] { typeof(Type), typeof(Expression[]) }, new[] { _instantiateType(rr.Type), JsExpression.ArrayLiteral(rr.InitializerElements.Select(e => VisitResolveResult(e, null))) })); } else { return(CompileFactoryCall("NewArrayBounds", new[] { typeof(Type), typeof(Expression[]) }, new[] { _instantiateType(rr.Type), JsExpression.ArrayLiteral(rr.SizeArguments.Select(a => VisitResolveResult(a, null))) })); } }
public override string VisitArrayCreateResolveResult(ArrayCreateResolveResult rr, object data) { var arrayType = rr.Type as ArrayType; if (rr.InitializerElements != null) { return(CompileFactoryCall("NewArrayInit", new[] { typeof(Type), typeof(Expression[]) }, new[] { GetTypeName(arrayType != null ? arrayType.ElementType : rr.Type, _emitter), _emitter.ToJavaScript(rr.InitializerElements.Select(e => new JRaw(VisitResolveResult(e, null))).ToArray()) })); } return(CompileFactoryCall("NewArrayBounds", new[] { typeof(Type), typeof(Expression[]) }, new[] { GetTypeName(arrayType != null ? arrayType.ElementType : rr.Type, _emitter), _emitter.ToJavaScript(rr.SizeArguments.Select(a => new JRaw(VisitResolveResult(a, null))).ToArray()) })); }
public JNode VisitArrayCreateResolveResult(ArrayCreateResolveResult res) { JExpression[] items = null; JExpression size = null; if (res.InitializerElements.IsNotNullOrEmpty()) { items = VisitExpressions(res.InitializerElements).ToArray(); } else if (res.SizeArguments.IsNotNullOrEmpty()) { size = VisitExpression(res.SizeArguments.Single()); } return(J.NewArray(res.Type, size, items)); }
public object VisitArrayCreateResolveResult(ArrayCreateResolveResult res) { if (res.InitializerElements.IsNotNullOrEmpty()) { var array = res.InitializerElements.Select(Visit).ToArray(); var arrayType = res.Type.GetMirroredClrType(); //HACK: bug in parser if (arrayType.GetElementType().IsArray) { arrayType = arrayType.GetElementType(); } var array2 = Array.CreateInstance(arrayType.GetElementType(), array.Length); array.CopyTo(array2, 0); return(array2); } return(null); }
public JsNode VisitArrayCreateResolveResult(ArrayCreateResolveResult res) { var jsArrayType = SkJs.GetJsArrayType((ArrayType)res.Type); JsExpression[] items = null; JsExpression size = null; if (res.InitializerElements.IsNotNullOrEmpty()) { items = VisitExpressions(res.InitializerElements).ToArray(); } else if (res.SizeArguments.IsNotNullOrEmpty()) { size = VisitExpression(res.SizeArguments.Single()); } return(Js.NewArray(jsArrayType, size, items)); }
Expression ConvertConstantValue(ResolveResult rr) { if (rr is TypeOfResolveResult) { return(new TypeOfExpression(ConvertType(((TypeOfResolveResult)rr).Type))); } else if (rr is ArrayCreateResolveResult) { ArrayCreateResolveResult acrr = (ArrayCreateResolveResult)rr; AstType type = ConvertType(acrr.Type); throw new NotImplementedException(); } else if (rr.IsCompileTimeConstant) { object val = rr.ConstantValue; if (val == null) { if (rr.Type.IsReferenceType(context) == true) { return(new NullReferenceExpression()); } else { return(new DefaultValueExpression(ConvertType(rr.Type))); } } else if (rr.Type.Kind == TypeKind.Enum) { throw new NotImplementedException(); } else { return(new PrimitiveExpression(val)); } } else { return(new EmptyExpression()); } }
public virtual TResult VisitArrayCreateResolveResult(ArrayCreateResolveResult rr, TData data) { VisitChildResolveResults(rr, data); return(default(TResult)); }
string Visit(ArrayCreateResolveResult result) { throw new NotImplementedException(); }
public virtual object VisitArrayCreateResolveResult(ArrayCreateResolveResult rr, object data) { VisitChildResolveResults(rr, data); return(null); }