protected override ICode VisitJsTypeVarName(ExprJsTypeVarName e) { var name = this.resolver.TypeNames[e.TypeRef]; this.js.Append(name); return(e); }
protected override ICode VisitJsResolvedProperty(ExprJsResolvedProperty e) { if (e.Call.CallMethod != null) { var ctx = e.Ctx; var mDef = e.Call.CallMethod.Resolve(); if (mDef.IsSetter) { var tRef = e.Call.CallMethod.Parameters.Last().ParameterType; var tDef = tRef.Resolve(); var attr = tDef.GetCustomAttribute<JsStringEnumAttribute>(); if (attr != null) { var prop = new ExprJsResolvedProperty(ctx, new FakeCall(e.Call), e.PropertyName).Named("prop"); var type = new ExprJsTypeVarName(ctx, tRef).Named("type"); var enumStringMap = new ExprJsTypeData(ctx, TypeData.EnumStringMap).Named("enumStringMap"); var value = e.Call.Args.Last().Named("value"); var js = "prop = type.enumStringMap[value]"; var expr = new ExprJsExplicit(ctx, js, e.Type, type, enumStringMap, value, prop); return expr; } } else { var tDef = e.Type.Resolve(); var attr = tDef.GetCustomAttribute<JsStringEnumAttribute>(); if (attr != null) { var prop = new ExprJsResolvedProperty(ctx, new FakeCall(e.Call), e.PropertyName).Named("prop"); var type = new ExprJsTypeVarName(ctx, e.Type).Named("type"); var enumStringMap = new ExprJsTypeData(ctx, TypeData.EnumStringMap).Named("enumStringMap"); var js = "type.enumStringMap[prop]"; var expr = new ExprJsExplicit(ctx, js, e.Type, prop, type, enumStringMap); return expr; } } } return base.VisitJsResolvedProperty(e); }
protected override ICode VisitBox(ExprBox e) { var ctx = e.Ctx; var expr = (Expr)this.Visit(e.Expr); if (e.Type.IsUnsignedInteger() && expr.Type.IsSignedInteger()) { expr = new ExprConv(ctx, expr, e.Type, false); } if (!e.Type.IsValueType) { // For ref-types 'box' does nothing return(this.Visit(e.Expr)); } var eType = new ExprJsTypeVarName(ctx, e.Type); if (e.Type.IsNullable()) { var exprIsVar = expr.IsVar(); var innerType = e.Type.GetNullableInnerType(); var temp = exprIsVar ? null : new ExprVarLocal(ctx, e.Type); var box = new ExprBox(ctx, temp ?? expr, innerType).Named("box"); var nullableJs = exprIsVar ? "(expr !== null ? box : null)" : "((temp = expr) !== null ? box : null)"; var nullableExpr = new ExprJsExplicit(ctx, nullableJs, innerType, temp.Named("temp"), expr.Named("expr"), box); return(nullableExpr); } else { var deepCopyExpr = InternalFunctions.ValueTypeDeepCopyIfRequired(e.Type, () => (Expr)this.Visit(expr)); var int2bool = e.Type.IsBoolean() && expr.Type.IsInteger() ? "!!" : ""; var js = "{v:" + int2bool + "expr,_:type}"; var ret = new ExprJsExplicit(ctx, js, e.Type, (deepCopyExpr ?? expr).Named("expr"), eType.Named("type")); return(ret); } }
protected override ICode VisitIsInst(ExprIsInst e) { var ctx = e.Ctx; var mIsInst = ctx.Module.Import(((Func <object, Type, object>)InternalFunctions.IsInst).Method); var eType = new ExprJsTypeVarName(ctx, e.Type); var expr = new ExprCall(ctx, e.Type, mIsInst, null, e.Expr, eType); return(expr); }
protected override ICode VisitJsResolvedProperty(ExprJsResolvedProperty e) { if (e.Call.CallMethod != null) { var ctx = e.Ctx; var mDef = e.Call.CallMethod.Resolve(); if (mDef.IsSetter) { var tRef = e.Call.CallMethod.Parameters.Last().ParameterType; var tDef = tRef.Resolve(); var attr = tDef.GetCustomAttribute <JsStringEnumAttribute>(); if (attr != null) { var prop = new ExprJsResolvedProperty(ctx, new FakeCall(e.Call), e.PropertyName).Named("prop"); var type = new ExprJsTypeVarName(ctx, tRef).Named("type"); var enumStringMap = new ExprJsTypeData(ctx, TypeData.EnumStringMap).Named("enumStringMap"); var value = e.Call.Args.Last().Named("value"); var js = "prop = type.enumStringMap[value]"; var expr = new ExprJsExplicit(ctx, js, e.Type, type, enumStringMap, value, prop); return(expr); } } else { var tDef = e.Type.Resolve(); var attr = tDef.GetCustomAttribute <JsStringEnumAttribute>(); if (attr != null) { var prop = new ExprJsResolvedProperty(ctx, new FakeCall(e.Call), e.PropertyName).Named("prop"); var type = new ExprJsTypeVarName(ctx, e.Type).Named("type"); var enumStringMap = new ExprJsTypeData(ctx, TypeData.EnumStringMap).Named("enumStringMap"); var js = "type.enumStringMap[prop]"; var expr = new ExprJsExplicit(ctx, js, e.Type, prop, type, enumStringMap); return(expr); } } } return(base.VisitJsResolvedProperty(e)); }
protected virtual ICode VisitJsTypeVarName(ExprJsTypeVarName e) { this.ThrowOnNoOverride(); return e; }
protected override ICode VisitIsInst(ExprIsInst e) { var ctx = e.Ctx; var mIsInst = ctx.Module.Import(((Func<object, Type, object>)InternalFunctions.IsInst).Method); var eType = new ExprJsTypeVarName(ctx, e.Type); var expr = new ExprCall(ctx, e.Type, mIsInst, null, e.Expr, eType); return expr; }
protected override ICode VisitBox(ExprBox e) { var ctx = e.Ctx; var expr = (Expr)this.Visit(e.Expr); if (e.Type.IsUnsignedInteger() && expr.Type.IsSignedInteger()) { expr = new ExprConv(ctx, expr, e.Type, false); } if (!e.Type.IsValueType) { // For ref-types 'box' does nothing return this.Visit(e.Expr); } var eType = new ExprJsTypeVarName(ctx, e.Type); if (e.Type.IsNullable()) { var exprIsVar = expr.IsVar(); var innerType = e.Type.GetNullableInnerType(); var temp = exprIsVar ? null : new ExprVarLocal(ctx, e.Type); var box = new ExprBox(ctx, temp ?? expr, innerType).Named("box"); var nullableJs = exprIsVar ? "(expr !== null ? box : null)" : "((temp = expr) !== null ? box : null)"; var nullableExpr = new ExprJsExplicit(ctx, nullableJs, innerType, temp.Named("temp"), expr.Named("expr"), box); return nullableExpr; } else { var deepCopyExpr = InternalFunctions.ValueTypeDeepCopyIfRequired(e.Type, () => (Expr)this.Visit(expr)); var int2bool = e.Type.IsBoolean() && expr.Type.IsInteger() ? "!!" : ""; var js = "{v:" + int2bool + "expr,_:type}"; var ret = new ExprJsExplicit(ctx, js, e.Type, (deepCopyExpr ?? expr).Named("expr"), eType.Named("type")); return ret; } }
public static Stmt Equals(Ctx ctx) { var other = ctx.MethodParameter(0).Named("other"); var type = new ExprJsTypeVarName(ctx, ctx.Single).Named("type"); return new StmtJsExplicit(ctx, "return other._ === type && this === other.v;", ctx.ThisNamed, other, type); }
protected override ICode VisitJsTypeVarName(ExprJsTypeVarName e) { var name = this.resolver.TypeNames[e.TypeRef]; this.js.Append(name); return e; }
public static Expr InitializeArray(ICall call) { var ctx = call.Ctx; var array = (ExprVar)call.Args.ElementAt(0); var initExpr = (ExprRuntimeHandle)call.Args.ElementAt(1); var initData = ((FieldDefinition)initExpr.Member).InitialValue; var arrayElType = ((ArrayType)array.Type).ElementType; int inc; Func<int, object> getValue; switch (arrayElType.MetadataType) { case MetadataType.Boolean: inc = 1; getValue = i => initData[i] != 0; break; case MetadataType.Byte: inc = 1; getValue = i => initData[i]; break; case MetadataType.SByte: inc = 1; getValue = i => (sbyte)initData[i]; break; case MetadataType.Int16: inc = 2; getValue = i => BitConverter.ToInt16(initData, i); break; case MetadataType.Int32: inc = 4; getValue = i => BitConverter.ToInt32(initData, i); break; case MetadataType.Int64: inc = 8; getValue = i => BitConverter.ToInt64(initData, i); break; case MetadataType.UInt16: inc = 2; getValue = i => BitConverter.ToUInt16(initData, i); break; case MetadataType.UInt32: inc = 4; getValue = i => BitConverter.ToUInt32(initData, i); break; case MetadataType.UInt64: inc = 8; getValue = i => BitConverter.ToUInt64(initData, i); break; case MetadataType.Single: inc = 4; getValue = i => BitConverter.ToSingle(initData, i); break; case MetadataType.Double: inc = 8; getValue = i => BitConverter.ToDouble(initData, i); break; case MetadataType.Char: inc = 2; getValue = i => (char)BitConverter.ToUInt16(initData, i); break; default: throw new NotImplementedException("Cannot handle: " + arrayElType.MetadataType); } var values = new List<NamedExpr>(); for (int i = 0; i < initData.Length; i += inc) { var value = new ExprLiteral(ctx, getValue(i), arrayElType); values.Add(value.Named("v" + i)); } var vStr = string.Join(",", values.Select(x => x.Name)); var arrayTypeName = new ExprJsTypeVarName(call.Ctx, array.Type).Named("typeName"); var js = "a = [" + vStr + "]; a._ = typeName"; return new ExprJsExplicit(call.Ctx, js, array.Type, values.Concat(array.Named("a")).Concat(arrayTypeName)); }
protected override ICode VisitJsTypeVarName(ExprJsTypeVarName e) { this.types.Add(e.TypeRef); return base.VisitJsTypeVarName(e); }
public static Stmt GetType(Ctx ctx) { var js = "return typeof(this) == \"string\" ? stringType : this._ || __[this.tagName] || __[this.constructor.name];"; var stringType = new ExprJsTypeVarName(ctx, ctx.String).Named("stringType"); var stmt = new StmtJsExplicit(ctx, js, ctx.ThisNamed, stringType); return stmt; }
protected override ICode VisitJsTypeVarName(ExprJsTypeVarName e) { this.types.Add(e.TypeRef); return(base.VisitJsTypeVarName(e)); }
protected override ICode VisitJsTypeVarName(ExprJsTypeVarName e) { this.code.AppendFormat("typeof({0})", e.TypeRef.Name); return e; }
protected virtual ICode VisitJsTypeVarName(ExprJsTypeVarName e) { this.ThrowOnNoOverride(); return(e); }