in src/powerquery-parser/parser/parsers/naive.ts [2703:2771]
function readCsvArray<T extends Ast.TCsvType>(
state: ParseState,
valueReader: () => T,
continueReadingValues: boolean,
testPostCommaError: (state: ParseState) => ParseError.TInnerParseError | undefined,
): Ast.TCsvArray & Ast.ICsvArray<T> {
const nodeKind: Ast.NodeKind.ArrayWrapper = Ast.NodeKind.ArrayWrapper;
const trace: Trace = state.traceManager.entry(NaiveTraceConstant.Parse, readCsvArray.name, {
[NaiveTraceConstant.TokenIndex]: state.tokenIndex,
});
ParseStateUtils.startContext(state, nodeKind);
const elements: Ast.ICsv<T>[] = [];
while (continueReadingValues) {
const csvNodeKind: Ast.NodeKind.Csv = Ast.NodeKind.Csv;
ParseStateUtils.startContext(state, csvNodeKind);
const maybeError: ParseError.TInnerParseError | undefined = testPostCommaError(state);
if (maybeError) {
trace.exit({
[NaiveTraceConstant.TokenIndex]: state.tokenIndex,
[TraceConstant.IsThrowing]: true,
});
throw maybeError;
}
const node: T = valueReader();
const maybeCommaConstant: Ast.IConstant<Constant.MiscConstant.Comma> | undefined = maybeReadTokenKindAsConstant(
state,
Token.TokenKind.Comma,
Constant.MiscConstant.Comma,
);
const element: Ast.TCsv & Ast.ICsv<T> = {
...ParseStateUtils.assertGetContextNodeMetadata(state),
kind: csvNodeKind,
isLeaf: false,
node,
maybeCommaConstant,
};
ParseStateUtils.endContext(state, element);
elements.push(element);
continueReadingValues = maybeCommaConstant !== undefined;
}
const csvArray: Ast.ICsvArray<T> = {
...ParseStateUtils.assertGetContextNodeMetadata(state),
kind: nodeKind,
isLeaf: false,
elements,
};
ParseStateUtils.endContext(state, csvArray);
trace.exit({
[NaiveTraceConstant.TokenIndex]: state.tokenIndex,
[TraceConstant.IsThrowing]: false,
});
return csvArray;
}