in src/powerquery-parser/parser/parsers/naive.ts [76:142]
export function readGeneralizedIdentifier(state: ParseState, _parser: Parser): Ast.GeneralizedIdentifier {
const nodeKind: Ast.NodeKind.GeneralizedIdentifier = Ast.NodeKind.GeneralizedIdentifier;
const trace: Trace = state.traceManager.entry(NaiveTraceConstant.Parse, readGeneralizedIdentifier.name, {
[NaiveTraceConstant.TokenIndex]: state.tokenIndex,
});
ParseStateUtils.startContext(state, nodeKind);
const tokenRangeStartIndex: number = state.tokenIndex;
let tokenRangeEndIndex: number = tokenRangeStartIndex;
while (
state.maybeCurrentTokenKind &&
GeneralizedIdentifierTerminatorTokenKinds.indexOf(state.maybeCurrentTokenKind) === -1
) {
readToken(state);
tokenRangeEndIndex = state.tokenIndex;
}
if (tokenRangeStartIndex === tokenRangeEndIndex) {
trace.exit({
[NaiveTraceConstant.TokenIndex]: state.tokenIndex,
[TraceConstant.IsThrowing]: true,
});
throw new ParseError.ExpectedGeneralizedIdentifierError(
state.locale,
ParseStateUtils.maybeTokenWithColumnNumber(state, state.tokenIndex + 1),
);
}
const lexerSnapshot: LexerSnapshot = state.lexerSnapshot;
const tokens: ReadonlyArray<Token.Token> = lexerSnapshot.tokens;
const contiguousIdentifierStartIndex: number = tokens[tokenRangeStartIndex].positionStart.codeUnit;
const contiguousIdentifierEndIndex: number = tokens[tokenRangeEndIndex - 1].positionEnd.codeUnit;
const literal: string = lexerSnapshot.text.slice(contiguousIdentifierStartIndex, contiguousIdentifierEndIndex);
const literalKind: TextUtils.IdentifierKind = TextUtils.identifierKind(literal, true);
if (literalKind === TextUtils.IdentifierKind.Invalid) {
trace.exit({
[NaiveTraceConstant.TokenIndex]: state.tokenIndex,
[TraceConstant.IsThrowing]: true,
});
throw new ParseError.ExpectedGeneralizedIdentifierError(
state.locale,
ParseStateUtils.maybeTokenWithColumnNumber(state, state.tokenIndex + 1),
);
}
const generalizedIdentifier: Ast.GeneralizedIdentifier = {
...ParseStateUtils.assertGetContextNodeMetadata(state),
kind: nodeKind,
isLeaf: true,
literal,
};
ParseStateUtils.endContext(state, generalizedIdentifier);
trace.exit({
[NaiveTraceConstant.TokenIndex]: state.tokenIndex,
[TraceConstant.IsThrowing]: false,
});
return generalizedIdentifier;
}