protected override Expression DoResolve (ResolveContext ec) { constructor_method = Delegate.GetConstructor (type); var invoke_method = Delegate.GetInvokeMethod (type); Arguments arguments = CreateDelegateMethodArguments (ec, invoke_method.Parameters, invoke_method.Parameters.Types, loc); method_group = method_group.OverloadResolve (ec, ref arguments, this, OverloadResolver.Restrictions.CovariantDelegate); if (method_group == null) return null; var delegate_method = method_group.BestCandidate; if (delegate_method.DeclaringType.IsNullableType) { ec.Report.Error (1728, loc, "Cannot create delegate from method `{0}' because it is a member of System.Nullable<T> type", delegate_method.GetSignatureForError ()); return null; } if (!AllowSpecialMethodsInvocation) Invocation.IsSpecialMethodInvocation (ec, delegate_method, loc); ExtensionMethodGroupExpr emg = method_group as ExtensionMethodGroupExpr; if (emg != null) { method_group.InstanceExpression = emg.ExtensionExpression; TypeSpec e_type = emg.ExtensionExpression.Type; if (TypeSpec.IsValueType (e_type)) { ec.Report.Error (1113, loc, "Extension method `{0}' of value type `{1}' cannot be used to create delegates", delegate_method.GetSignatureForError (), e_type.GetSignatureForError ()); } } TypeSpec rt = delegate_method.ReturnType; if (rt.BuiltinType == BuiltinTypeSpec.Type.Dynamic) rt = ec.BuiltinTypes.Object; if (!Delegate.IsTypeCovariant (ec, rt, invoke_method.ReturnType)) { Expression ret_expr = new TypeExpression (delegate_method.ReturnType, loc); Error_ConversionFailed (ec, delegate_method, ret_expr); } if (delegate_method.IsConditionallyExcluded (ec, loc)) { ec.Report.SymbolRelatedToPreviousError (delegate_method); MethodOrOperator m = delegate_method.MemberDefinition as MethodOrOperator; if (m != null && m.IsPartialDefinition) { ec.Report.Error (762, loc, "Cannot create delegate from partial method declaration `{0}'", delegate_method.GetSignatureForError ()); } else { ec.Report.Error (1618, loc, "Cannot create delegate with `{0}' because it has a Conditional attribute", TypeManager.CSharpSignature (delegate_method)); } } var expr = method_group.InstanceExpression; if (expr != null && (expr.Type.IsGenericParameter || !TypeSpec.IsReferenceType (expr.Type))) method_group.InstanceExpression = new BoxedCast (expr, ec.BuiltinTypes.Object); eclass = ExprClass.Value; return this; }
public static bool ImplicitStandardConversionExists (ResolveContext ec, MethodGroupExpr mg, TypeSpec target_type) { // if (target_type == TypeManager.delegate_type || target_type == TypeManager.multicast_delegate_type) // return false; var invoke = Delegate.GetInvokeMethod (target_type); Arguments arguments = CreateDelegateMethodArguments (ec, invoke.Parameters, invoke.Parameters.Types, mg.Location); return mg.OverloadResolve (ec, ref arguments, null, OverloadResolver.Restrictions.CovariantDelegate | OverloadResolver.Restrictions.ProbingOnly) != null; }
public static bool ImplicitStandardConversionExists(ResolveContext ec, MethodGroupExpr mg, Type target_type) { if (target_type == TypeManager.delegate_type || target_type == TypeManager.multicast_delegate_type) { return(false); } mg.DelegateType = target_type; MethodInfo invoke = Delegate.GetInvokeMethod(ec.Compiler, null, target_type); Arguments arguments = CreateDelegateMethodArguments(TypeManager.GetParameterData(invoke), mg.Location); return(mg.OverloadResolve(ec, ref arguments, true, mg.Location) != null); }
public static bool ImplicitStandardConversionExists (ResolveContext ec, MethodGroupExpr mg, TypeSpec target_type) { // if (target_type == TypeManager.delegate_type || target_type == TypeManager.multicast_delegate_type) // return false; var invoke = Delegate.GetInvokeMethod (target_type); Arguments arguments = CreateDelegateMethodArguments (ec, invoke.Parameters, invoke.Parameters.Types, mg.Location); mg = mg.OverloadResolve (ec, ref arguments, null, OverloadResolver.Restrictions.CovariantDelegate | OverloadResolver.Restrictions.ProbingOnly); return mg != null && Delegate.IsTypeCovariant (ec, mg.BestCandidateReturnType, invoke.ReturnType); }
protected override Expression DoResolve(ResolveContext ec) { eclass = ExprClass.Value; // FIXME: Hack var caller_builder = (Constructor) ec.MemberContext; if (argument_list != null) { bool dynamic; // // Spec mandates that constructor initializer will not have `this' access // using (ec.Set (ResolveContext.Options.BaseInitializer)) { argument_list.Resolve (ec, out dynamic); } if (dynamic) { ec.Report.Error (1975, loc, "The constructor call cannot be dynamically dispatched within constructor initializer"); return null; } } type = ec.CurrentType; if (this is ConstructorBaseInitializer) { if (ec.CurrentType.BaseType == null) return this; type = ec.CurrentType.BaseType; if (ec.CurrentType.IsStruct) { ec.Report.Error (522, loc, "`{0}': Struct constructors cannot call base constructors", caller_builder.GetSignatureForError ()); return this; } } else { // // It is legal to have "this" initializers that take no arguments // in structs, they are just no-ops. // // struct D { public D (int a) : this () {} // if (TypeManager.IsStruct (ec.CurrentType) && argument_list == null) return this; } base_constructor_group = MemberLookupFinal ( ec, null, type, ConstructorBuilder.ConstructorName, 0, MemberKind.Constructor, BindingRestriction.AccessibleOnly | BindingRestriction.DeclaredOnly, loc) as MethodGroupExpr; if (base_constructor_group == null) return this; base_constructor_group = base_constructor_group.OverloadResolve ( ec, ref argument_list, false, loc); if (base_constructor_group == null) return this; if (!ec.IsStatic) base_constructor_group.InstanceExpression = ec.GetThis (loc); var base_ctor = base_constructor_group.BestCandidate; // TODO MemberCache: Does it work for inflated types ? if (base_ctor == caller_builder.Spec){ ec.Report.Error (516, loc, "Constructor `{0}' cannot call itself", caller_builder.GetSignatureForError ()); } return this; }
public override Expression DoResolve(ResolveContext ec) { constructor_method = Delegate.GetConstructor(ec.Compiler, ec.CurrentType, type); MethodInfo invoke_method = Delegate.GetInvokeMethod(ec.Compiler, ec.CurrentType, type); method_group.DelegateType = type; method_group.CustomErrorHandler = this; Arguments arguments = CreateDelegateMethodArguments(TypeManager.GetParameterData(invoke_method), loc); method_group = method_group.OverloadResolve(ec, ref arguments, false, loc); if (method_group == null) { return(null); } delegate_method = (MethodInfo)method_group; if (TypeManager.IsNullableType(delegate_method.DeclaringType)) { ec.Report.Error(1728, loc, "Cannot create delegate from method `{0}' because it is a member of System.Nullable<T> type", TypeManager.GetFullNameSignature(delegate_method)); return(null); } Invocation.IsSpecialMethodInvocation(ec, delegate_method, loc); ExtensionMethodGroupExpr emg = method_group as ExtensionMethodGroupExpr; if (emg != null) { delegate_instance_expression = emg.ExtensionExpression; Type e_type = delegate_instance_expression.Type; if (TypeManager.IsValueType(e_type)) { ec.Report.Error(1113, loc, "Extension method `{0}' of value type `{1}' cannot be used to create delegates", TypeManager.CSharpSignature(delegate_method), TypeManager.CSharpName(e_type)); } } Type rt = TypeManager.TypeToCoreType(delegate_method.ReturnType); Expression ret_expr = new TypeExpression(rt, loc); if (!Delegate.IsTypeCovariant(ret_expr, (TypeManager.TypeToCoreType(invoke_method.ReturnType)))) { Error_ConversionFailed(ec, delegate_method, ret_expr); } if (Invocation.IsMethodExcluded(delegate_method, loc)) { ec.Report.SymbolRelatedToPreviousError(delegate_method); MethodOrOperator m = TypeManager.GetMethod(delegate_method) as MethodOrOperator; if (m != null && m.IsPartialDefinition) { ec.Report.Error(762, loc, "Cannot create delegate from partial method declaration `{0}'", TypeManager.CSharpSignature(delegate_method)); } else { ec.Report.Error(1618, loc, "Cannot create delegate with `{0}' because it has a Conditional attribute", TypeManager.CSharpSignature(delegate_method)); } } DoResolveInstanceExpression(ec); eclass = ExprClass.Value; return(this); }
public override Expression DoResolve (ResolveContext ec) { // // The New DoResolve might be called twice when initializing field // expressions (see EmitFieldInitializers, the call to // GetInitializerExpression will perform a resolve on the expression, // and later the assign will trigger another resolution // // This leads to bugs (#37014) // if (type != null){ if (RequestedType is NewDelegate) return RequestedType; return this; } TypeExpr texpr = RequestedType.ResolveAsTypeTerminal (ec, false); if (texpr == null) return null; type = texpr.Type; if (type.IsPointer) { ec.Report.Error (1919, loc, "Unsafe type `{0}' cannot be used in an object creation expression", TypeManager.CSharpName (type)); return null; } if (Arguments == null) { Constant c = Constantify (type); if (c != null) return ReducedExpression.Create (c, this); } if (TypeManager.IsDelegateType (type)) { return (new NewDelegate (type, Arguments, loc)).Resolve (ec); } if (TypeManager.IsGenericParameter (type)) { GenericConstraints gc = TypeManager.GetTypeParameterConstraints (type); if ((gc == null) || (!gc.HasConstructorConstraint && !gc.IsValueType)) { ec.Report.Error (304, loc, "Cannot create an instance of the variable type '{0}' because it doesn't have the new() constraint", TypeManager.CSharpName (type)); return null; } if ((Arguments != null) && (Arguments.Count != 0)) { ec.Report.Error (417, loc, "`{0}': cannot provide arguments when creating an instance of a variable type", TypeManager.CSharpName (type)); return null; } if (TypeManager.activator_create_instance == null) { Type activator_type = TypeManager.CoreLookupType (ec.Compiler, "System", "Activator", Kind.Class, true); if (activator_type != null) { TypeManager.activator_create_instance = TypeManager.GetPredefinedMethod ( activator_type, "CreateInstance", loc, Type.EmptyTypes); } } is_type_parameter = true; eclass = ExprClass.Value; return this; } if (type.IsAbstract && type.IsSealed) { ec.Report.SymbolRelatedToPreviousError (type); ec.Report.Error (712, loc, "Cannot create an instance of the static class `{0}'", TypeManager.CSharpName (type)); return null; } if (type.IsInterface || type.IsAbstract){ if (!TypeManager.IsGenericType (type)) { RequestedType = CheckComImport (ec); if (RequestedType != null) return RequestedType; } ec.Report.SymbolRelatedToPreviousError (type); ec.Report.Error (144, loc, "Cannot create an instance of the abstract class or interface `{0}'", TypeManager.CSharpName (type)); return null; } bool is_struct = TypeManager.IsStruct (type); eclass = ExprClass.Value; // // SRE returns a match for .ctor () on structs (the object constructor), // so we have to manually ignore it. // if (is_struct && Arguments == null) return this; // For member-lookup, treat 'new Foo (bar)' as call to 'foo.ctor (bar)', where 'foo' is of type 'Foo'. Expression ml = MemberLookupFinal (ec, type, type, ConstructorInfo.ConstructorName, MemberTypes.Constructor, AllBindingFlags | BindingFlags.DeclaredOnly, loc); if (Arguments != null) { bool dynamic; Arguments.Resolve (ec, out dynamic); if (dynamic) { Arguments.Insert (0, new Argument (new TypeOf (texpr, loc).Resolve (ec))); return new DynamicInvocation (new SimpleName (ConstructorInfo.ConstructorName, loc), Arguments, type, loc).Resolve (ec); } } if (ml == null) return null; method = ml as MethodGroupExpr; if (method == null) { ml.Error_UnexpectedKind (ec, ResolveFlags.MethodGroup, loc); return null; } method = method.OverloadResolve (ec, ref Arguments, false, loc); if (method == null) return null; return this; }
// // D operator + (D x, D y) // D operator - (D x, D y) // bool operator == (D x, D y) // bool operator != (D x, D y) // Expression ResolveOperatorDelegate (ResolveContext ec, Type l, Type r) { bool is_equality = (oper & Operator.EqualityMask) != 0; if (!TypeManager.IsEqual (l, r) && !TypeManager.IsVariantOf (r, l)) { Expression tmp; if (right.eclass == ExprClass.MethodGroup || (r == InternalType.AnonymousMethod && !is_equality)) { tmp = Convert.ImplicitConversionRequired (ec, right, l, loc); if (tmp == null) return null; right = tmp; r = right.Type; } else if (left.eclass == ExprClass.MethodGroup || (l == InternalType.AnonymousMethod && !is_equality)) { tmp = Convert.ImplicitConversionRequired (ec, left, r, loc); if (tmp == null) return null; left = tmp; l = left.Type; } else { return null; } } // // Resolve delegate equality as a user operator // if (is_equality) return ResolveUserOperator (ec, l, r); MethodInfo method; Arguments args = new Arguments (2); args.Add (new Argument (left)); args.Add (new Argument (right)); if (oper == Operator.Addition) { if (TypeManager.delegate_combine_delegate_delegate == null) { TypeManager.delegate_combine_delegate_delegate = TypeManager.GetPredefinedMethod ( TypeManager.delegate_type, "Combine", loc, TypeManager.delegate_type, TypeManager.delegate_type); } method = TypeManager.delegate_combine_delegate_delegate; } else { if (TypeManager.delegate_remove_delegate_delegate == null) { TypeManager.delegate_remove_delegate_delegate = TypeManager.GetPredefinedMethod ( TypeManager.delegate_type, "Remove", loc, TypeManager.delegate_type, TypeManager.delegate_type); } method = TypeManager.delegate_remove_delegate_delegate; } MethodGroupExpr mg = new MethodGroupExpr (new MemberInfo [] { method }, TypeManager.delegate_type, loc); mg = mg.OverloadResolve (ec, ref args, false, loc); return new ClassCast (new UserOperatorCall (mg, args, CreateExpressionTree, loc), l); }
public static bool ImplicitStandardConversionExists (ResolveContext ec, MethodGroupExpr mg, TypeSpec target_type) { if (target_type == TypeManager.delegate_type || target_type == TypeManager.multicast_delegate_type) return false; var invoke = Delegate.GetInvokeMethod (ec.Compiler, target_type); Arguments arguments = CreateDelegateMethodArguments (invoke.Parameters, invoke.Parameters.Types, mg.Location); return mg.OverloadResolve (ec, ref arguments, null, OverloadResolver.Restrictions.Covariant | OverloadResolver.Restrictions.ProbingOnly) != null; }
public static bool ImplicitStandardConversionExists (ResolveContext ec, MethodGroupExpr mg, Type target_type) { if (target_type == TypeManager.delegate_type || target_type == TypeManager.multicast_delegate_type) return false; mg.DelegateType = target_type; MethodInfo invoke = Delegate.GetInvokeMethod (ec.Compiler, null, target_type); Arguments arguments = CreateDelegateMethodArguments (TypeManager.GetParameterData (invoke), mg.Location); return mg.OverloadResolve (ec, ref arguments, true, mg.Location) != null; }
public override Expression DoResolve (ResolveContext ec) { eclass = ExprClass.Value; // TODO: ec.GetSignatureForError () ConstructorBuilder caller_builder = ((Constructor) ec.MemberContext).ConstructorBuilder; if (argument_list != null) { bool dynamic; // // Spec mandates that constructor initializer will not have `this' access // using (ec.Set (ResolveContext.Options.BaseInitializer)) { argument_list.Resolve (ec, out dynamic); } if (dynamic) { SimpleName ctor = new SimpleName (ConstructorBuilder.ConstructorName, loc); return new DynamicInvocation (ctor, argument_list, loc).Resolve (ec) as ExpressionStatement; } } type = ec.CurrentType; if (this is ConstructorBaseInitializer) { if (ec.CurrentType.BaseType == null) return this; type = ec.CurrentType.BaseType; if (TypeManager.IsStruct (ec.CurrentType)) { ec.Report.Error (522, loc, "`{0}': Struct constructors cannot call base constructors", TypeManager.CSharpSignature (caller_builder)); return this; } } else { // // It is legal to have "this" initializers that take no arguments // in structs, they are just no-ops. // // struct D { public D (int a) : this () {} // if (TypeManager.IsStruct (ec.CurrentType) && argument_list == null) return this; } base_constructor_group = MemberLookupFinal ( ec, null, type, ConstructorBuilder.ConstructorName, MemberTypes.Constructor, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly, loc) as MethodGroupExpr; if (base_constructor_group == null) return this; base_constructor_group = base_constructor_group.OverloadResolve ( ec, ref argument_list, false, loc); if (base_constructor_group == null) return this; if (!ec.IsStatic) base_constructor_group.InstanceExpression = ec.GetThis (loc); ConstructorInfo base_ctor = (ConstructorInfo)base_constructor_group; if (base_ctor == caller_builder){ ec.Report.Error (516, loc, "Constructor `{0}' cannot call itself", TypeManager.CSharpSignature (caller_builder)); } return this; }