本文整理汇总了C#中Mono.CSharp.Expression.Resolve方法的典型用法代码示例。如果您正苦于以下问题:C# Expression.Resolve方法的具体用法?C# Expression.Resolve怎么用?C# Expression.Resolve使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Mono.CSharp.Expression
的用法示例。
在下文中一共展示了Expression.Resolve方法的14个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ResolveInitializer
protected override Expression ResolveInitializer (BlockContext bc, LocalVariable li, Expression initializer)
{
initializer = initializer.Resolve (bc);
if (initializer == null)
return null;
var c = initializer as Constant;
if (c == null) {
initializer.Error_ExpressionMustBeConstant (bc, initializer.Location, li.Name);
return null;
}
c = c.ConvertImplicitly (bc, li.Type);
if (c == null) {
if (TypeManager.IsReferenceType (li.Type))
initializer.Error_ConstantCanBeInitializedWithNullOnly (bc, li.Type, initializer.Location, li.Name);
else
initializer.Error_ValueCannotBeConverted (bc, initializer.Location, li.Type, false);
return null;
}
li.ConstantValue = c;
return initializer;
}
示例2: ResolveInitializer
protected override Expression ResolveInitializer (BlockContext bc, LocalVariable li, Expression initializer)
{
if (li.Type == InternalType.Dynamic) {
initializer = initializer.Resolve (bc);
if (initializer == null)
return null;
// Once there is dynamic used defer conversion to runtime even if we know it will never succeed
Arguments args = new Arguments (1);
args.Add (new Argument (initializer));
initializer = new DynamicConversion (TypeManager.idisposable_type, 0, args, initializer.Location).Resolve (bc);
if (initializer == null)
return null;
var var = LocalVariable.CreateCompilerGenerated (TypeManager.idisposable_type, bc.CurrentBlock, loc);
dispose_call = CreateDisposeCall (bc, var);
dispose_call.Resolve (bc);
return base.ResolveInitializer (bc, li, new SimpleAssign (var.CreateReferenceExpression (bc, loc), initializer, loc));
}
if (li == Variable) {
CheckIDiposableConversion (bc, li, initializer);
dispose_call = CreateDisposeCall (bc, li);
dispose_call.Resolve (bc);
}
return base.ResolveInitializer (bc, li, initializer);
}
示例3: CreateExpressionTreeVariable
public ExpressionStatement CreateExpressionTreeVariable (BlockContext ec)
{
if ((modFlags & Modifier.ISBYREF) != 0)
ec.Report.Error (1951, Location, "An expression tree parameter cannot use `ref' or `out' modifier");
expr_tree_variable = new TemporaryVariable (ResolveParameterExpressionType (ec, Location).Type, Location);
expr_tree_variable = expr_tree_variable.Resolve (ec);
Arguments arguments = new Arguments (2);
arguments.Add (new Argument (new TypeOf (
new TypeExpression (parameter_type, Location), Location)));
arguments.Add (new Argument (new StringConstant (Name, Location)));
return new SimpleAssign (ExpressionTreeVariableReference (),
Expression.CreateExpressionFactoryCall (ec, "Parameter", null, arguments, Location));
}
示例4: DoResolveLValue
public override Expression DoResolveLValue (ResolveContext rc, Expression right_side)
{
if (right_side == EmptyExpression.OutAccess) {
right_side.DoResolveLValue (rc, this);
return null;
}
var res_right_side = right_side.Resolve (rc);
if (DoResolveCore (rc) && res_right_side != null) {
setter_args = CreateSetterArguments (rc, res_right_side);
setter = CreateCallSiteBinder (rc, setter_args, true);
}
eclass = ExprClass.Variable;
return this;
}
示例5: ResolveMemberAccess
public static Expression ResolveMemberAccess (EmitContext ec, Expression member_lookup,
Expression left, Location loc,
Expression left_original)
{
bool left_is_type, left_is_explicit;
// If `left' is null, then we're called from SimpleNameResolve and this is
// a member in the currently defining class.
if (left == null) {
left_is_type = ec.IsStatic || ec.IsFieldInitializer;
left_is_explicit = false;
// Implicitly default to `this' unless we're static.
if (!ec.IsStatic && !ec.IsFieldInitializer && !ec.InEnumContext)
left = ec.This;
} else {
left_is_type = left is TypeExpr;
left_is_explicit = true;
}
if (member_lookup is FieldExpr){
FieldExpr fe = (FieldExpr) member_lookup;
FieldInfo fi = fe.FieldInfo;
Type decl_type = fi.DeclaringType;
if (fi is FieldBuilder) {
Const c = TypeManager.LookupConstant ((FieldBuilder) fi);
if (c != null) {
object o = c.LookupConstantValue (ec);
if (o == null)
return null;
object real_value = ((Constant) c.Expr).GetValue ();
return Constantify (real_value, fi.FieldType);
}
}
if (fi.IsLiteral) {
Type t = fi.FieldType;
object o;
if (fi is FieldBuilder)
o = TypeManager.GetValue ((FieldBuilder) fi);
else
o = fi.GetValue (fi);
if (decl_type.IsSubclassOf (TypeManager.enum_type)) {
if (left_is_explicit && !left_is_type &&
!IdenticalNameAndTypeName (ec, left_original, loc)) {
error176 (loc, fe.FieldInfo.Name);
return null;
}
Expression enum_member = MemberLookup (
ec, decl_type, "value__", MemberTypes.Field,
AllBindingFlags, loc);
Enum en = TypeManager.LookupEnum (decl_type);
Constant c;
if (en != null)
c = Constantify (o, en.UnderlyingType);
else
c = Constantify (o, enum_member.Type);
return new EnumConstant (c, decl_type);
}
Expression exp = Constantify (o, t);
if (left_is_explicit && !left_is_type) {
error176 (loc, fe.FieldInfo.Name);
return null;
}
return exp;
}
if (fi.FieldType.IsPointer && !ec.InUnsafe){
UnsafeError (loc);
return null;
}
}
if (member_lookup is EventExpr) {
EventExpr ee = (EventExpr) member_lookup;
//
// If the event is local to this class, we transform ourselves into
// a FieldExpr
//
if (ee.EventInfo.DeclaringType == ec.ContainerType) {
MemberInfo mi = GetFieldFromEvent (ee);
if (mi == null) {
//.........这里部分代码省略.........
示例6: DoResolveLValue
public override Expression DoResolveLValue (ResolveContext rc, Expression right_side)
{
if (right_side == EmptyExpression.OutAccess) {
right_side.DoResolveLValue (rc, this);
return null;
}
var res_right_side = right_side.Resolve (rc);
if (DoResolveCore (rc) && res_right_side != null) {
setter_args = CreateSetterArguments (rc, res_right_side);
// create setter callsite
var dc = (binder as IDynamicCallSite);
if (rc.Module.PredefinedTypes.IsPlayScriptAotMode && (dc != null) && dc.UseCallSite(rc, setter_args)) {
this.useDelegateInvoke = false;
setter_args.CreateDynamicBinderArguments(rc);
setter = CreateCallSite(rc, setter_args, true);
} else {
this.useDelegateInvoke = true;
setter = CreateCallSiteBinder (rc, setter_args, true);
}
}
eclass = ExprClass.Variable;
return this;
}
示例7: ResolveArrayElement
protected override Expression ResolveArrayElement (ResolveContext ec, Expression element)
{
element = element.Resolve (ec);
if (element == null)
return null;
if (array_element_type == null) {
if (element.Type != TypeManager.null_type)
array_element_type = element.Type;
return element;
}
if (Convert.ImplicitConversionExists (ec, element, array_element_type)) {
return element;
}
if (Convert.ImplicitConversionExists (ec, new TypeExpression (array_element_type, loc), element.Type)) {
array_element_type = element.Type;
return element;
}
Error_NoBestType (ec);
return null;
}
示例8: ResolveBoolean
/// <summary>
/// Resolves the expression `e' into a boolean expression: either through
/// an implicit conversion, or through an `operator true' invocation
/// </summary>
public static Expression ResolveBoolean (EmitContext ec, Expression e, Location loc)
{
e = e.Resolve (ec);
if (e == null)
return null;
if (e.Type == TypeManager.bool_type)
return e;
Expression converted = Convert.ImplicitConversion (ec, e, TypeManager.bool_type, Location.Null);
if (converted != null)
return converted;
//
// If no implicit conversion to bool exists, try using `operator true'
//
converted = Expression.GetOperatorTrue (ec, e, loc);
if (converted == null){
e.Error_ValueCannotBeConverted (ec, loc, TypeManager.bool_type, false);
return null;
}
return converted;
}
示例9: DoResolve
public override Expression DoResolve (ResolveContext ec)
{
if (left == null)
return null;
if ((oper == Operator.Subtraction) && (left is ParenthesizedExpression)) {
left = ((ParenthesizedExpression) left).Expr;
left = left.Resolve (ec, ResolveFlags.VariableOrValue | ResolveFlags.Type);
if (left == null)
return null;
if (left.eclass == ExprClass.Type) {
ec.Report.Error (75, loc, "To cast a negative value, you must enclose the value in parentheses");
return null;
}
} else
left = left.Resolve (ec);
if (left == null)
return null;
Constant lc = left as Constant;
if (lc != null && lc.Type == TypeManager.bool_type &&
((oper == Operator.LogicalAnd && lc.IsDefaultValue) ||
(oper == Operator.LogicalOr && !lc.IsDefaultValue))) {
// FIXME: resolve right expression as unreachable
// right.Resolve (ec);
ec.Report.Warning (429, 4, loc, "Unreachable expression code detected");
return left;
}
right = right.Resolve (ec);
if (right == null)
return null;
eclass = ExprClass.Value;
Constant rc = right as Constant;
// The conversion rules are ignored in enum context but why
if (!ec.HasSet (ResolveContext.Options.EnumScope) && lc != null && rc != null && (TypeManager.IsEnumType (left.Type) || TypeManager.IsEnumType (right.Type))) {
lc = EnumLiftUp (ec, lc, rc, loc);
if (lc != null)
rc = EnumLiftUp (ec, rc, lc, loc);
}
if (rc != null && lc != null) {
int prev_e = ec.Report.Errors;
Expression e = ConstantFold.BinaryFold (
ec, oper, lc, rc, loc);
if (e != null || ec.Report.Errors != prev_e)
return e;
} else if ((oper == Operator.BitwiseAnd || oper == Operator.LogicalAnd) && !TypeManager.IsDynamicType (left.Type) &&
((lc != null && lc.IsDefaultValue && !(lc is NullLiteral)) || (rc != null && rc.IsDefaultValue && !(rc is NullLiteral)))) {
if ((ResolveOperator (ec)) == null) {
Error_OperatorCannotBeApplied (ec, left, right);
return null;
}
//
// The result is a constant with side-effect
//
Constant side_effect = rc == null ?
new SideEffectConstant (lc, right, loc) :
new SideEffectConstant (rc, left, loc);
return ReducedExpression.Create (side_effect, this);
}
// Comparison warnings
if ((oper & Operator.ComparisonMask) != 0) {
if (left.Equals (right)) {
ec.Report.Warning (1718, 3, loc, "A comparison made to same variable. Did you mean to compare something else?");
}
CheckUselessComparison (ec, lc, right.Type);
CheckUselessComparison (ec, rc, left.Type);
}
if (TypeManager.IsDynamicType (left.Type) || TypeManager.IsDynamicType (right.Type)) {
Arguments args = new Arguments (2);
args.Add (new Argument (left));
args.Add (new Argument (right));
return new DynamicExpressionStatement (this, args, loc).Resolve (ec);
}
if (RootContext.Version >= LanguageVersion.ISO_2 &&
((TypeManager.IsNullableType (left.Type) && (right is NullLiteral || TypeManager.IsNullableType (right.Type) || TypeManager.IsValueType (right.Type))) ||
(TypeManager.IsValueType (left.Type) && right is NullLiteral) ||
(TypeManager.IsNullableType (right.Type) && (left is NullLiteral || TypeManager.IsNullableType (left.Type) || TypeManager.IsValueType (left.Type))) ||
(TypeManager.IsValueType (right.Type) && left is NullLiteral)))
return new Nullable.LiftedBinaryOperator (oper, left, right, loc).Resolve (ec);
return DoResolveCore (ec, left, right);
}
示例10: Resolve
public override bool Resolve (EmitContext ec)
{
enumerator_type = TypeManager.ienumerator_type;
if (!ProbeCollectionType (ec, expr.Type)) {
Error_Enumerator ();
return false;
}
bool is_disposable = !enumerator_type.IsSealed ||
TypeManager.ImplementsInterface (enumerator_type, TypeManager.idisposable_type);
VarExpr ve = var_type as VarExpr;
if (ve != null) {
// Infer implicitly typed local variable from foreach enumerable type
var_type = new TypeExpression (get_current.PropertyInfo.PropertyType, var_type.Location);
}
var_type = var_type.ResolveAsTypeTerminal (ec, false);
if (var_type == null)
return false;
enumerator = new TemporaryVariable (enumerator_type, loc);
enumerator.Resolve (ec);
init = new Invocation (get_enumerator, null);
init = init.Resolve (ec);
if (init == null)
return false;
Expression move_next_expr;
{
MemberInfo[] mi = new MemberInfo[] { move_next };
MethodGroupExpr mg = new MethodGroupExpr (mi, var_type.Type, loc);
mg.InstanceExpression = enumerator;
move_next_expr = new Invocation (mg, null);
}
get_current.InstanceExpression = enumerator;
Statement block = new CollectionForeachStatement (
var_type.Type, variable, get_current, statement, loc);
loop = new While (move_next_expr, block, loc);
wrapper = is_disposable ?
(Statement) new DisposableWrapper (this) :
(Statement) new NonDisposableWrapper (this);
return wrapper.Resolve (ec);
}
示例11: ResolveBoolean
/// <summary>
/// Resolves the expression `e' into a boolean expression: either through
/// an implicit conversion, or through an `operator true' invocation
/// </summary>
public static Expression ResolveBoolean (ResolveContext ec, Expression e, Location loc)
{
e = e.Resolve (ec);
if (e == null)
return null;
if (e.Type == TypeManager.bool_type)
return e;
if (TypeManager.IsDynamicType (e.Type)) {
Arguments args = new Arguments (1);
args.Add (new Argument (e));
return new DynamicUnaryConversion ("IsTrue", args, loc).Resolve (ec);
}
Expression converted = Convert.ImplicitConversion (ec, e, TypeManager.bool_type, Location.Null);
if (converted != null)
return converted;
//
// If no implicit conversion to bool exists, try using `operator true'
//
converted = Expression.GetOperatorTrue (ec, e, loc);
if (converted == null){
e.Error_ValueCannotBeConverted (ec, loc, TypeManager.bool_type, false);
return null;
}
return converted;
}
示例12: DoResolve
public Expression DoResolve (EmitContext ec, Expression right_side, ResolveFlags flags)
{
if (type != null)
throw new Exception ();
//
// Resolve the expression with flow analysis turned off, we'll do the definite
// assignment checks later. This is because we don't know yet what the expression
// will resolve to - it may resolve to a FieldExpr and in this case we must do the
// definite assignment check on the actual field and not on the whole struct.
//
Expression original = expr;
expr = expr.Resolve (ec, flags | ResolveFlags.DisableFlowAnalysis);
if (expr == null)
return null;
if (expr is SimpleName){
SimpleName child_expr = (SimpleName) expr;
Expression new_expr = new SimpleName (child_expr.Name, Identifier, loc);
return new_expr.Resolve (ec, flags);
}
//
// TODO: I mailed Ravi about this, and apparently we can get rid
// of this and put it in the right place.
//
// Handle enums here when they are in transit.
// Note that we cannot afford to hit MemberLookup in this case because
// it will fail to find any members at all
//
int errors = Report.Errors;
Type expr_type = expr.Type;
if ((expr is TypeExpr) &&
(expr_type == TypeManager.enum_type ||
expr_type.IsSubclassOf (TypeManager.enum_type))){
Enum en = TypeManager.LookupEnum (expr_type);
if (en != null) {
object value = en.LookupEnumValue (ec, Identifier, loc);
if (value != null){
Constant c = Constantify (value, en.UnderlyingType);
return new EnumConstant (c, expr_type);
}
}
}
if (expr_type.IsPointer){
Error (23, "The `.' operator can not be applied to pointer operands (" +
TypeManager.CSharpName (expr_type) + ")");
return null;
}
member_lookup = MemberLookupFinal (ec, expr_type, expr_type, Identifier, loc);
if (member_lookup == null)
return null;
if (member_lookup is TypeExpr){
member_lookup.Resolve (ec, ResolveFlags.Type);
return member_lookup;
} else if ((flags & ResolveFlags.MaskExprClass) == ResolveFlags.Type)
return null;
member_lookup = ResolveMemberAccess (ec, member_lookup, expr, loc, original);
if (member_lookup == null)
return null;
// The following DoResolve/DoResolveLValue will do the definite assignment
// check.
if (right_side != null)
member_lookup = member_lookup.DoResolveLValue (ec, right_side);
else
member_lookup = member_lookup.DoResolve (ec);
return member_lookup;
}
示例13: DoResolve
protected override Expression DoResolve (ResolveContext rc)
{
var sn = expr as SimpleName;
const ResolveFlags flags = ResolveFlags.VariableOrValue | ResolveFlags.Type;
if (sn != null) {
expr = sn.LookupNameExpression (rc, MemberLookupRestrictions.ReadAccess | MemberLookupRestrictions.ExactArity);
//
// Resolve expression which does have type set as we need expression type
// with disable flow analysis as we don't know whether left side expression
// is used as variable or type
//
if (expr is VariableReference || expr is ConstantExpr || expr is Linq.TransparentMemberAccess) {
expr = expr.Resolve (rc);
} else if (expr is TypeParameterExpr) {
expr.Error_UnexpectedKind (rc, flags, sn.Location);
expr = null;
}
} else {
expr = expr.Resolve (rc, flags);
}
if (expr == null)
return null;
TypeSpec expr_type = expr.Type;
if (expr_type.IsPointer || expr_type.Kind == MemberKind.Void || expr_type == InternalType.NullLiteral || expr_type == InternalType.AnonymousMethod) {
expr.Error_OperatorCannotBeApplied (rc, loc, ".", expr_type);
return null;
}
if (targs != null) {
if (!targs.Resolve (rc))
return null;
}
var results = new List<string> ();
var nexpr = expr as NamespaceExpression;
if (nexpr != null) {
string namespaced_partial;
if (partial_name == null)
namespaced_partial = nexpr.Namespace.Name;
else
namespaced_partial = nexpr.Namespace.Name + "." + partial_name;
rc.CurrentMemberDefinition.GetCompletionStartingWith (namespaced_partial, results);
if (partial_name != null)
results = results.Select (l => l.Substring (partial_name.Length)).ToList ();
} else {
var r = MemberCache.GetCompletitionMembers (rc, expr_type, partial_name).Select (l => l.Name);
AppendResults (results, partial_name, r);
}
throw new CompletionResult (partial_name == null ? "" : partial_name, results.Distinct ().ToArray ());
}
示例14: Resolve
public override bool Resolve(BlockContext ec)
{
enumerator_type = TypeManager.ienumerator_type;
bool is_dynamic = expr.Type == InternalType.Dynamic;
if (is_dynamic)
expr = Convert.ImplicitConversionRequired (ec, expr, TypeManager.ienumerable_type, loc);
if (!ProbeCollectionType (ec, expr.Type)) {
Error_Enumerator (ec);
return false;
}
VarExpr ve = var_type as VarExpr;
if (ve != null) {
// Infer implicitly typed local variable from foreach enumerable type
var_type = new TypeExpression (
is_dynamic ? InternalType.Dynamic : get_current.Type,
var_type.Location);
}
var_type = var_type.ResolveAsTypeTerminal (ec, false);
if (var_type == null)
return false;
enumerator = new TemporaryVariable (enumerator_type, loc);
enumerator.Resolve (ec);
init = new Invocation (get_enumerator, null);
init = init.Resolve (ec);
if (init == null)
return false;
Expression move_next_expr;
{
var mi = new List<MemberSpec> (1) { move_next };
MethodGroupExpr mg = new MethodGroupExpr (mi, var_type.Type, loc);
mg.InstanceExpression = enumerator;
move_next_expr = new Invocation (mg, null);
}
get_current.InstanceExpression = enumerator;
Statement block = new CollectionForeachStatement (
var_type.Type, variable, get_current, statement, loc);
loop = new While (new BooleanExpression (move_next_expr), block, loc);
bool implements_idisposable = enumerator_type.ImplementsInterface (TypeManager.idisposable_type);
if (implements_idisposable || !enumerator_type.IsSealed) {
wrapper = new DisposableWrapper (this, implements_idisposable);
} else {
wrapper = new NonDisposableWrapper (this);
}
return wrapper.Resolve (ec);
}