in src/powerquery-parser/parser/parsers/naive.ts [792:862]
export function readPrimaryExpression(state: ParseState, parser: Parser): Ast.TPrimaryExpression {
const trace: Trace = state.traceManager.entry(NaiveTraceConstant.Parse, readPrimaryExpression.name, {
[NaiveTraceConstant.TokenIndex]: state.tokenIndex,
});
state.maybeCancellationToken?.throwIfCancelled();
let primaryExpression: Ast.TPrimaryExpression | undefined;
const maybeCurrentTokenKind: Token.TokenKind | undefined = state.maybeCurrentTokenKind;
const isIdentifierExpressionNext: boolean =
maybeCurrentTokenKind === Token.TokenKind.AtSign || maybeCurrentTokenKind === Token.TokenKind.Identifier;
if (isIdentifierExpressionNext) {
primaryExpression = parser.readIdentifierExpression(state, parser);
} else {
switch (maybeCurrentTokenKind) {
case Token.TokenKind.LeftParenthesis:
primaryExpression = parser.readParenthesizedExpression(state, parser);
break;
case Token.TokenKind.LeftBracket:
primaryExpression = DisambiguationUtils.readAmbiguousBracket(state, parser, [
Disambiguation.BracketDisambiguation.FieldProjection,
Disambiguation.BracketDisambiguation.FieldSelection,
Disambiguation.BracketDisambiguation.RecordExpression,
]);
break;
case Token.TokenKind.LeftBrace:
primaryExpression = parser.readListExpression(state, parser);
break;
case Token.TokenKind.Ellipsis:
primaryExpression = parser.readNotImplementedExpression(state, parser);
break;
case Token.TokenKind.KeywordHashSections:
case Token.TokenKind.KeywordHashShared:
case Token.TokenKind.KeywordHashBinary:
case Token.TokenKind.KeywordHashDate:
case Token.TokenKind.KeywordHashDateTime:
case Token.TokenKind.KeywordHashDateTimeZone:
case Token.TokenKind.KeywordHashDuration:
case Token.TokenKind.KeywordHashTable:
case Token.TokenKind.KeywordHashTime:
primaryExpression = parser.readKeyword(state, parser);
break;
default:
primaryExpression = parser.readLiteralExpression(state, parser);
}
}
if (ParseStateUtils.isRecursivePrimaryExpressionNext(state)) {
trace.exit({
[NaiveTraceConstant.TokenIndex]: state.tokenIndex,
[NaiveTraceConstant.IsRecursive]: true,
});
return parser.readRecursivePrimaryExpression(state, parser, primaryExpression);
} else {
trace.exit({
[NaiveTraceConstant.TokenIndex]: state.tokenIndex,
[NaiveTraceConstant.IsRecursive]: false,
});
return primaryExpression;
}
}