if (original != null && original.IdenticalNameAndTypeName (ec, left, loc))
return this;
- error176 (loc, GetSignatureForError ());
- return null;
+ return ResolveExtensionMemberAccess (left);
}
InstanceExpression = left;
+ return this;
+ }
+ protected virtual Expression ResolveExtensionMemberAccess (Expression left)
+ {
+ error176 (loc, GetSignatureForError ());
return this;
}
public override bool IsInstance {
get {
+ if (best_candidate != null)
+ return !best_candidate.IsStatic;
+
foreach (MethodBase mb in Methods)
if (!mb.IsStatic)
return true;
public override bool IsStatic {
get {
+ if (best_candidate != null)
+ return best_candidate.IsStatic;
+
foreach (MethodBase mb in Methods)
if (mb.IsStatic)
return true;
return false;
}
+ protected override Expression ResolveExtensionMemberAccess (Expression left)
+ {
+ if (!IsStatic)
+ return base.ResolveExtensionMemberAccess (left);
+
+ //
+ // When left side is an expression and at least one candidate method is
+ // static, it can be extension method
+ //
+ InstanceExpression = left;
+ return this;
+ }
+
public override Expression ResolveMemberAccess (EmitContext ec, Expression left, Location loc,
SimpleName original)
{
bool left_is_type = left is TypeExpr;
if (!left_is_type && (original == null || !original.IdenticalNameAndTypeName (ec, left, loc))) {
- Report.SymbolRelatedToPreviousError (FieldInfo);
- error176 (loc, TypeManager.GetFullNameSignature (FieldInfo));
- return null;
+// Report.SymbolRelatedToPreviousError (FieldInfo);
+ return ResolveExtensionMemberAccess (left);
}
if (ic.ResolveValue ()) {
MethodInfo method = (MethodInfo)mg;
if (method != null) {
type = TypeManager.TypeToCoreType (method.ReturnType);
+
+ // TODO: this is a copy of mg.ResolveMemberAccess method
Expression iexpr = mg.InstanceExpression;
if (method.IsStatic) {
- if (iexpr == null ||
- iexpr is This || iexpr is EmptyExpression ||
- mg.IdenticalTypeName) {
+ if (iexpr == null ||
+ iexpr is This || iexpr is EmptyExpression ||
+ mg.IdenticalTypeName) {
mg.InstanceExpression = null;
} else {
MemberExpr.error176 (loc, mg.GetSignatureForError ());