in src/Parsing/Impl/Parser.cs [3378:3464]
private Expression AddTrailers(Expression ret, bool allowGeneratorExpression) {
var prevAllow = _allowIncomplete;
try {
_allowIncomplete = true;
while (true) {
switch (PeekToken().Kind) {
case TokenKind.LeftParenthesis:
if (!allowGeneratorExpression) {
return ret;
}
NextToken();
var whitespace = _tokenWhiteSpace;
List<string> commaWhiteSpace;
bool ateTerminator;
var args = FinishArgListOrGenExpr(out commaWhiteSpace, out ateTerminator);
var closeParenWhiteSpace = _tokenWhiteSpace;
CallExpression call;
if (args != null) {
call = FinishCallExpr(ret, args);
} else {
call = new CallExpression(ret, ImmutableArray<Arg>.Empty);
}
if (_verbatim) {
AddPreceedingWhiteSpace(call, whitespace);
AddSecondPreceedingWhiteSpace(call, closeParenWhiteSpace);
if (commaWhiteSpace != null) {
AddListWhiteSpace(call, commaWhiteSpace.ToArray());
}
if (!ateTerminator) {
AddErrorMissingCloseGrouping(call);
}
}
call.SetLoc(ret.StartIndex, GetEnd());
ret = call;
break;
case TokenKind.LeftBracket:
NextToken();
whitespace = _tokenWhiteSpace;
var index = ParseSubscriptList(out ateTerminator);
var ie = new IndexExpression(ret, index);
var finishWhiteSpace = _tokenWhiteSpace;
ie.SetLoc(ret.StartIndex, GetEnd());
if (_verbatim) {
AddPreceedingWhiteSpace(ie, whitespace);
AddSecondPreceedingWhiteSpace(ie, finishWhiteSpace);
if (!ateTerminator) {
AddErrorMissingCloseGrouping(ie);
}
}
ret = ie;
break;
case TokenKind.Dot:
NextToken();
var dotStart = GetStart();
whitespace = _tokenWhiteSpace;
var name = ReadNameMaybeNone(dotStart, 1);
var nameWhitespace = _tokenWhiteSpace;
var fe = MakeMember(ret, name);
fe.SetLoc(ret.StartIndex, name.HasName ? GetStart() : GetEnd(), GetEnd());
fe.DotIndex = dotStart;
if (_verbatim) {
AddPreceedingWhiteSpace(fe, whitespace);
AddSecondPreceedingWhiteSpace(fe, nameWhitespace);
if (!name.HasName) {
AddErrorIsIncompleteNode(fe);
}
}
ret = fe;
break;
case TokenKind.Constant:
// abc.1, abc"", abc 1L, abc 0j
ReportSyntaxError(Resources.InvalidSyntaxErrorMsg);//invalid syntax
ret = Error(_verbatim ? _lookaheadWhiteSpace + _lookahead.Token.VerbatimImage : null, ret);
NextToken();
break;
default:
return ret;
}
}
} finally {
_allowIncomplete = prevAllow;
}
}