export function iterSection()

in src/powerquery-parser/parser/nodeIdMap/nodeIdMapIterator.ts [355:434]


export function iterSection(
    nodeIdMapCollection: NodeIdMap.Collection,
    section: TXorNode,
): ReadonlyArray<SectionKeyValuePair> {
    XorNodeUtils.assertIsNodeKind(section, Ast.NodeKind.Section);

    if (XorNodeUtils.isAstXorChecked<Ast.Section>(section, Ast.NodeKind.Section)) {
        return section.node.sectionMembers.elements.map((sectionMember: Ast.SectionMember) => {
            const namePairedExpression: Ast.IdentifierPairedExpression = sectionMember.namePairedExpression;
            const keyLiteral: string = namePairedExpression.key.literal;

            return {
                source: XorNodeUtils.boxAst(namePairedExpression),
                key: namePairedExpression.key,
                keyLiteral,
                normalizedKeyLiteral: TextUtils.normalizeIdentifier(keyLiteral),
                maybeValue: XorNodeUtils.boxAst(namePairedExpression.value),
                pairKind: PairKind.SectionMember,
            };
        });
    }

    const maybeSectionMemberArrayWrapper: XorNode<Ast.TArrayWrapper> | undefined =
        NodeIdMapUtils.maybeNthChildChecked<Ast.TArrayWrapper>(
            nodeIdMapCollection,
            section.node.id,
            4,
            Ast.NodeKind.ArrayWrapper,
        );

    if (maybeSectionMemberArrayWrapper === undefined) {
        return [];
    }

    const sectionMemberArrayWrapper: TXorNode = maybeSectionMemberArrayWrapper;

    const partial: SectionKeyValuePair[] = [];

    for (const sectionMember of assertIterChildrenXor(nodeIdMapCollection, sectionMemberArrayWrapper.node.id)) {
        const maybeKeyValuePair: XorNode<Ast.IdentifierPairedExpression> | undefined =
            NodeIdMapUtils.maybeNthChildChecked<Ast.IdentifierPairedExpression>(
                nodeIdMapCollection,
                sectionMember.node.id,
                2,
                Ast.NodeKind.IdentifierPairedExpression,
            );

        if (maybeKeyValuePair === undefined) {
            continue;
        }

        const keyValuePair: TXorNode = maybeKeyValuePair;
        const keyValuePairNodeId: number = keyValuePair.node.id;

        const maybeKey: Ast.Identifier | undefined = NodeIdMapUtils.maybeUnboxNthChildIfAstChecked(
            nodeIdMapCollection,
            keyValuePairNodeId,
            0,
            Ast.NodeKind.Identifier,
        );

        if (maybeKey === undefined) {
            continue;
        }

        const key: Ast.Identifier = maybeKey;
        const keyLiteral: string = key.literal;

        partial.push({
            source: keyValuePair,
            key,
            keyLiteral,
            normalizedKeyLiteral: TextUtils.normalizeIdentifier(keyLiteral),
            maybeValue: NodeIdMapUtils.maybeNthChild(nodeIdMapCollection, keyValuePairNodeId, 2),
            pairKind: PairKind.SectionMember,
        });
    }

    return partial;
}