// // Creates mcs expression from dynamic object // public Compiler.Expression CreateCompilerExpression (CSharpArgumentInfo info, DynamicMetaObject value) { // // No type details provider, go with runtime type // if (info == null) { if (value.LimitType == typeof (object)) return new Compiler.NullLiteral (Compiler.Location.Null); return new Compiler.RuntimeValueExpression (value, ImportType (value.RuntimeType)); } // // Value is known to be a type // if ((info.Flags & CSharpArgumentInfoFlags.IsStaticType) != 0) return new Compiler.TypeExpression (ImportType ((Type) value.Value), Compiler.Location.Null); if (value.Value == null && (info.Flags & (CSharpArgumentInfoFlags.IsOut | CSharpArgumentInfoFlags.IsRef | CSharpArgumentInfoFlags.UseCompileTimeType)) == 0 && value.LimitType == typeof (object)) { return new Compiler.NullLiteral (Compiler.Location.Null); } // // Use compilation time type when type was known not to be dynamic during compilation // Type value_type = (info.Flags & CSharpArgumentInfoFlags.UseCompileTimeType) != 0 ? value.Expression.Type : value.LimitType; var type = ImportType (value_type); if ((info.Flags & CSharpArgumentInfoFlags.Constant) != 0) { var c = Compiler.Constant.CreateConstantFromValue (type, value.Value, Compiler.Location.Null); // // It can be null for misused Constant flag // if (c != null) return c; } return new Compiler.RuntimeValueExpression (value, type); }