@microsoft/powerquery-parser
Advanced tools
Comparing version
@@ -6,3 +6,3 @@ export declare function all<T>(collection: ReadonlyArray<T>, predicateFn?: (value: T) => boolean): boolean; | ||
export declare function assertNonZeroLength<T>(collection: ReadonlyArray<T>, maybeMessage?: string, maybeDetails?: object): void; | ||
export declare function asyncMap<T, U>(collection: ReadonlyArray<T>, mapFn: (value: T) => Promise<U>): Promise<ReadonlyArray<U>>; | ||
export declare function mapAsync<T, U>(collection: ReadonlyArray<T>, mapFn: (value: T) => Promise<U>): Promise<ReadonlyArray<U>>; | ||
export declare function concatUnique<T>(left: ReadonlyArray<T>, right: ReadonlyArray<T>): ReadonlyArray<T>; | ||
@@ -9,0 +9,0 @@ export declare function enumerate<T>(collection: ReadonlyArray<T>): ReadonlyArray<[number, T]>; |
@@ -14,3 +14,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.split = exports.removeAtIndex = exports.replaceFirstInstance = exports.removeFirstInstance = exports.replaceAtIndex = exports.range = exports.isSubset = exports.indexOfPredicate = exports.includesUnique = exports.includesPredicate = exports.findReverse = exports.enumerate = exports.concatUnique = exports.asyncMap = exports.assertNonZeroLength = exports.assertIndexOfPredicate = exports.assertGet = exports.assertIn = exports.all = void 0; | ||
exports.split = exports.removeAtIndex = exports.replaceFirstInstance = exports.removeFirstInstance = exports.replaceAtIndex = exports.range = exports.isSubset = exports.indexOfPredicate = exports.includesUnique = exports.includesPredicate = exports.findReverse = exports.enumerate = exports.concatUnique = exports.mapAsync = exports.assertNonZeroLength = exports.assertIndexOfPredicate = exports.assertGet = exports.assertIn = exports.all = void 0; | ||
const _1 = require("."); | ||
@@ -48,3 +48,3 @@ function all(collection, predicateFn = (value) => Boolean(value)) { | ||
exports.assertNonZeroLength = assertNonZeroLength; | ||
function asyncMap(collection, mapFn) { | ||
function mapAsync(collection, mapFn) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
@@ -55,3 +55,3 @@ const tasks = collection.map(mapFn); | ||
} | ||
exports.asyncMap = asyncMap; | ||
exports.mapAsync = mapAsync; | ||
function concatUnique(left, right) { | ||
@@ -58,0 +58,0 @@ const partial = [...left]; |
@@ -8,2 +8,2 @@ import { CommonError } from ".."; | ||
export declare function ensureResult<T>(locale: string, callbackFn: () => T): Result<T, CommonError.CommonError>; | ||
export declare function ensureAsyncResult<T>(locale: string, callbackFn: () => Promise<T>): Promise<Result<T, CommonError.CommonError>>; | ||
export declare function ensureResultAsync<T>(locale: string, callbackFn: () => Promise<T>): Promise<Result<T, CommonError.CommonError>>; |
@@ -14,3 +14,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.ensureAsyncResult = exports.ensureResult = exports.isError = exports.isOk = exports.boxError = exports.boxOk = void 0; | ||
exports.ensureResultAsync = exports.ensureResult = exports.isError = exports.isOk = exports.boxError = exports.boxOk = void 0; | ||
const __1 = require(".."); | ||
@@ -49,3 +49,3 @@ function boxOk(value) { | ||
exports.ensureResult = ensureResult; | ||
function ensureAsyncResult(locale, callbackFn) { | ||
function ensureResultAsync(locale, callbackFn) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
@@ -61,3 +61,3 @@ try { | ||
} | ||
exports.ensureAsyncResult = ensureAsyncResult; | ||
exports.ensureResultAsync = ensureResultAsync; | ||
//# sourceMappingURL=resultUtils.js.map |
import { CommonError, Result } from "."; | ||
import { NodeIdMap, TXorNode } from "../parser"; | ||
import { Ast } from "../language"; | ||
import { Settings } from ".."; | ||
export declare type TriedTraverse<ResultType> = Result<ResultType, CommonError.CommonError>; | ||
export declare type TVisitNodeFn<State extends ITraversalState<ResultType>, ResultType, Node, Return> = (state: State, node: Node) => Return; | ||
export declare type TVisitChildNodeFn<State extends ITraversalState<ResultType>, ResultType, Node, Return> = (state: State, parent: Node, node: Node) => Return; | ||
export declare type TVisitNodeFn<State extends ITraversalState<ResultType>, ResultType, Node, Return> = (state: State, node: Node) => Promise<Return>; | ||
export declare type TEarlyExitFn<State extends ITraversalState<ResultType>, ResultType, Node> = TVisitNodeFn<State, ResultType, Node, boolean>; | ||
export declare type TExpandNodesFn<State extends ITraversalState<ResultType>, ResultType, Node, NodesById> = (state: State, node: Node, collection: NodesById) => ReadonlyArray<Node>; | ||
export declare type TExpandNodesFn<State extends ITraversalState<ResultType>, ResultType, Node, NodesById> = (state: State, node: Node, collection: NodesById) => Promise<ReadonlyArray<Node>>; | ||
export declare const enum VisitNodeStrategy { | ||
@@ -13,11 +13,10 @@ BreadthFirst = "BreadthFirst", | ||
} | ||
export interface ITraversalState<T> { | ||
readonly locale: string; | ||
export interface ITraversalState<T> extends Pick<Settings, "locale" | "maybeCancellationToken" | "traceManager"> { | ||
result: T; | ||
} | ||
export declare function tryTraverseAst<State extends ITraversalState<ResultType>, ResultType>(state: State, nodeIdMapCollection: NodeIdMap.Collection, root: Ast.TNode, strategy: VisitNodeStrategy, visitNodeFn: TVisitNodeFn<State, ResultType, Ast.TNode, void>, expandNodesFn: TExpandNodesFn<State, ResultType, Ast.TNode, NodeIdMap.Collection>, maybeEarlyExitFn: TEarlyExitFn<State, ResultType, Ast.TNode> | undefined): TriedTraverse<ResultType>; | ||
export declare function tryTraverseXor<State extends ITraversalState<ResultType>, ResultType>(state: State, nodeIdMapCollection: NodeIdMap.Collection, root: TXorNode, strategy: VisitNodeStrategy, visitNodeFn: TVisitNodeFn<State, ResultType, TXorNode, void>, expandNodesFn: TExpandNodesFn<State, ResultType, TXorNode, NodeIdMap.Collection>, maybeEarlyExitFn: TEarlyExitFn<State, ResultType, TXorNode> | undefined): TriedTraverse<ResultType>; | ||
export declare function tryTraverse<State extends ITraversalState<ResultType>, ResultType, Node, NodesById>(state: State, nodesById: NodesById, root: Node, strategy: VisitNodeStrategy, visitNodeFn: TVisitNodeFn<State, ResultType, Node, void>, expandNodesFn: TExpandNodesFn<State, ResultType, Node, NodesById>, maybeEarlyExitFn: TEarlyExitFn<State, ResultType, Node> | undefined): TriedTraverse<ResultType>; | ||
export declare function assertGetAllAstChildren<State extends ITraversalState<ResultType>, ResultType>(_state: State, astNode: Ast.TNode, nodeIdMapCollection: NodeIdMap.Collection): ReadonlyArray<Ast.TNode>; | ||
export declare function assertGetAllXorChildren<State extends ITraversalState<ResultType>, ResultType>(_state: State, xorNode: TXorNode, nodeIdMapCollection: NodeIdMap.Collection): ReadonlyArray<TXorNode>; | ||
export declare function maybeExpandXorParent<T>(_state: T, xorNode: TXorNode, nodeIdMapCollection: NodeIdMap.Collection): ReadonlyArray<TXorNode>; | ||
export declare function tryTraverseAst<State extends ITraversalState<ResultType>, ResultType>(state: State, nodeIdMapCollection: NodeIdMap.Collection, root: Ast.TNode, strategy: VisitNodeStrategy, visitNodeFn: TVisitNodeFn<State, ResultType, Ast.TNode, void>, expandNodesFn: TExpandNodesFn<State, ResultType, Ast.TNode, NodeIdMap.Collection>, maybeEarlyExitFn: TEarlyExitFn<State, ResultType, Ast.TNode> | undefined): Promise<TriedTraverse<ResultType>>; | ||
export declare function tryTraverseXor<State extends ITraversalState<ResultType>, ResultType>(state: State, nodeIdMapCollection: NodeIdMap.Collection, root: TXorNode, strategy: VisitNodeStrategy, visitNodeFn: TVisitNodeFn<State, ResultType, TXorNode, void>, expandNodesFn: TExpandNodesFn<State, ResultType, TXorNode, NodeIdMap.Collection>, maybeEarlyExitFn: TEarlyExitFn<State, ResultType, TXorNode> | undefined): Promise<TriedTraverse<ResultType>>; | ||
export declare function tryTraverse<State extends ITraversalState<ResultType>, ResultType, Node, NodesById>(state: State, nodesById: NodesById, root: Node, strategy: VisitNodeStrategy, visitNodeFn: TVisitNodeFn<State, ResultType, Node, void>, expandNodesFn: TExpandNodesFn<State, ResultType, Node, NodesById>, maybeEarlyExitFn: TEarlyExitFn<State, ResultType, Node> | undefined): Promise<TriedTraverse<ResultType>>; | ||
export declare function assertGetAllAstChildren<State extends ITraversalState<ResultType>, ResultType>(_state: State, astNode: Ast.TNode, nodeIdMapCollection: NodeIdMap.Collection): Promise<ReadonlyArray<Ast.TNode>>; | ||
export declare function assertGetAllXorChildren<State extends ITraversalState<ResultType>, ResultType>(_state: State, xorNode: TXorNode, nodeIdMapCollection: NodeIdMap.Collection): Promise<ReadonlyArray<TXorNode>>; | ||
export declare function maybeExpandXorParent<T>(_state: T, xorNode: TXorNode, nodeIdMapCollection: NodeIdMap.Collection): Promise<ReadonlyArray<TXorNode>>; |
"use strict"; | ||
// Copyright (c) Microsoft Corporation. | ||
// Licensed under the MIT license. | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -20,42 +29,49 @@ exports.maybeExpandXorParent = exports.assertGetAllXorChildren = exports.assertGetAllAstChildren = exports.tryTraverse = exports.tryTraverseXor = exports.tryTraverseAst = void 0; | ||
function tryTraverse(state, nodesById, root, strategy, visitNodeFn, expandNodesFn, maybeEarlyExitFn) { | ||
return result_1.ResultUtils.ensureResult(state.locale, () => { | ||
traverseRecursion(state, nodesById, root, strategy, visitNodeFn, expandNodesFn, maybeEarlyExitFn); | ||
return result_1.ResultUtils.ensureResultAsync(state.locale, () => __awaiter(this, void 0, void 0, function* () { | ||
yield traverseRecursion(state, nodesById, root, strategy, visitNodeFn, expandNodesFn, maybeEarlyExitFn); | ||
return state.result; | ||
}); | ||
})); | ||
} | ||
exports.tryTraverse = tryTraverse; | ||
// a TExpandNodesFn usable by tryTraverseAst which visits all nodes. | ||
// eslint-disable-next-line require-await | ||
function assertGetAllAstChildren(_state, astNode, nodeIdMapCollection) { | ||
const maybeChildIds = nodeIdMapCollection.childIdsById.get(astNode.id); | ||
if (maybeChildIds) { | ||
const childIds = maybeChildIds; | ||
return childIds.map((nodeId) => parser_1.NodeIdMapUtils.assertUnboxAst(nodeIdMapCollection.astNodeById, nodeId)); | ||
} | ||
else { | ||
return []; | ||
} | ||
return __awaiter(this, void 0, void 0, function* () { | ||
const maybeChildIds = nodeIdMapCollection.childIdsById.get(astNode.id); | ||
if (maybeChildIds) { | ||
const childIds = maybeChildIds; | ||
return childIds.map((nodeId) => parser_1.NodeIdMapUtils.assertUnboxAst(nodeIdMapCollection.astNodeById, nodeId)); | ||
} | ||
else { | ||
return []; | ||
} | ||
}); | ||
} | ||
exports.assertGetAllAstChildren = assertGetAllAstChildren; | ||
// a TExpandNodesFn usable by tryTraverseXor which visits all nodes. | ||
// eslint-disable-next-line require-await | ||
function assertGetAllXorChildren(_state, xorNode, nodeIdMapCollection) { | ||
switch (xorNode.kind) { | ||
case "Ast" /* Ast */: { | ||
const astNode = xorNode.node; | ||
return assertGetAllAstChildren(_state, astNode, nodeIdMapCollection).map(parser_1.XorNodeUtils.boxAst); | ||
} | ||
case "Context" /* Context */: { | ||
const result = []; | ||
const contextNode = xorNode.node; | ||
const maybeChildIds = nodeIdMapCollection.childIdsById.get(contextNode.id); | ||
if (maybeChildIds !== undefined) { | ||
const childIds = maybeChildIds; | ||
for (const childId of childIds) { | ||
result.push(parser_1.NodeIdMapUtils.assertGetXor(nodeIdMapCollection, childId)); | ||
return __awaiter(this, void 0, void 0, function* () { | ||
switch (xorNode.kind) { | ||
case "Ast" /* Ast */: { | ||
const astNode = xorNode.node; | ||
const children = yield assertGetAllAstChildren(_state, astNode, nodeIdMapCollection); | ||
return _1.ArrayUtils.mapAsync(children, (value) => Promise.resolve(parser_1.XorNodeUtils.boxAst(value))); | ||
} | ||
case "Context" /* Context */: { | ||
const result = []; | ||
const contextNode = xorNode.node; | ||
const maybeChildIds = nodeIdMapCollection.childIdsById.get(contextNode.id); | ||
if (maybeChildIds !== undefined) { | ||
const childIds = maybeChildIds; | ||
for (const childId of childIds) { | ||
result.push(parser_1.NodeIdMapUtils.assertGetXor(nodeIdMapCollection, childId)); | ||
} | ||
} | ||
return result; | ||
} | ||
return result; | ||
default: | ||
throw _1.Assert.isNever(xorNode); | ||
} | ||
default: | ||
throw _1.Assert.isNever(xorNode); | ||
} | ||
}); | ||
} | ||
@@ -66,19 +82,26 @@ exports.assertGetAllXorChildren = assertGetAllXorChildren; | ||
const maybeParent = parser_1.NodeIdMapUtils.maybeParentXor(nodeIdMapCollection, xorNode.node.id); | ||
return maybeParent !== undefined ? [maybeParent] : []; | ||
return Promise.resolve(maybeParent !== undefined ? [maybeParent] : []); | ||
} | ||
exports.maybeExpandXorParent = maybeExpandXorParent; | ||
function traverseRecursion(state, nodesById, node, strategy, visitNodeFn, expandNodesFn, maybeEarlyExitFn) { | ||
if (maybeEarlyExitFn && maybeEarlyExitFn(state, node)) { | ||
return; | ||
} | ||
else if (strategy === "BreadthFirst" /* BreadthFirst */) { | ||
visitNodeFn(state, node); | ||
} | ||
for (const child of expandNodesFn(state, node, nodesById)) { | ||
traverseRecursion(state, nodesById, child, strategy, visitNodeFn, expandNodesFn, maybeEarlyExitFn); | ||
} | ||
if (strategy === "DepthFirst" /* DepthFirst */) { | ||
visitNodeFn(state, node); | ||
} | ||
var _a; | ||
return __awaiter(this, void 0, void 0, function* () { | ||
const trace = state.traceManager.entry("Traversal", traverseRecursion.name); | ||
(_a = state.maybeCancellationToken) === null || _a === void 0 ? void 0 : _a.throwIfCancelled(); | ||
if (maybeEarlyExitFn && (yield maybeEarlyExitFn(state, node))) { | ||
return; | ||
} | ||
else if (strategy === "BreadthFirst" /* BreadthFirst */) { | ||
yield visitNodeFn(state, node); | ||
} | ||
for (const child of yield expandNodesFn(state, node, nodesById)) { | ||
// eslint-disable-next-line no-await-in-loop | ||
yield traverseRecursion(state, nodesById, child, strategy, visitNodeFn, expandNodesFn, maybeEarlyExitFn); | ||
} | ||
if (strategy === "DepthFirst" /* DepthFirst */) { | ||
yield visitNodeFn(state, node); | ||
} | ||
trace.exit(); | ||
}); | ||
} | ||
//# sourceMappingURL=traversal.js.map |
{ | ||
"name": "@microsoft/powerquery-parser", | ||
"version": "0.6.1", | ||
"version": "0.6.2", | ||
"description": "A parser for the Power Query/M formula language.", | ||
@@ -5,0 +5,0 @@ "author": "Microsoft", |
Sorry, the diff of this file is not supported yet
1685250
0.12%20872
0.11%