var ma = expr as MemberAccess;
if (ma != null) {
var lexpr = ma.LeftExpression;
+ Expression res;
- var res = ma.LookupNameExpression (rc, MemberLookupRestrictions.IgnoreAmbiguity);
+ using (rc.Set (ResolveContext.Options.NameOfScope)) {
+ res = ma.LookupNameExpression (rc, MemberLookupRestrictions.IgnoreAmbiguity);
+ }
if (res == null) {
return false;
return false;
}
- if (!IsLeftExpressionValid (lexpr)) {
- rc.Report.Error (8082, lexpr.Location, "An argument to nameof operator cannot include sub-expression");
- return false;
- }
-
var mg = res as MethodGroupExpr;
if (mg != null) {
var emg = res as ExtensionMethodGroupExpr;
}
}
+ //
+ // LAMESPEC: Why is conditional access not allowed?
+ //
+ if (!IsLeftResolvedExpressionValid (ma.LeftExpression) || ma.HasConditionalAccess ()) {
+ rc.Report.Error (8082, lexpr.Location, "An argument to nameof operator cannot include sub-expression");
+ return false;
+ }
+
Value = ma.Name;
return true;
}
return false;
}
- static bool IsLeftExpressionValid (Expression expr)
+ static bool IsLeftResolvedExpressionValid (Expression expr)
{
- if (expr is SimpleName)
- return true;
+ var fe = expr as FieldExpr;
+ if (fe != null) {
+ return fe.InstanceExpression == null || IsLeftResolvedExpressionValid (fe.InstanceExpression);
+ }
- if (expr is This)
- return true;
+ var pe = expr as PropertyExpr;
+ if (pe != null)
+ return pe.InstanceExpression == null || IsLeftResolvedExpressionValid (pe.InstanceExpression);
- if (expr is NamespaceExpression)
- return true;
+ var dmb = expr as DynamicMemberBinder;
+ if (dmb != null) {
+ return IsLeftResolvedExpressionValid (dmb.Arguments [0].Expr);
+ }
- if (expr is TypeExpr)
+ if (expr is ConstantExpr || expr is TypeExpr || expr is NamespaceExpression || expr is VariableReference)
return true;
- var ma = expr as MemberAccess;
- if (ma != null) {
- // TODO: Will conditional access be allowed?
- return IsLeftExpressionValid (ma.LeftExpression);
- }
-
return false;
}