Files
infocom-systems-design/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.esm/chunk-WVIFXK7E.mjs.map
2025-10-03 22:27:28 +03:00

8 lines
1.7 MiB

{
"version": 3,
"sources": ["../../../../../node_modules/.pnpm/vscode-jsonrpc@8.2.0/node_modules/vscode-jsonrpc/lib/common/ral.js", "../../../../../node_modules/.pnpm/vscode-jsonrpc@8.2.0/node_modules/vscode-jsonrpc/lib/common/is.js", "../../../../../node_modules/.pnpm/vscode-jsonrpc@8.2.0/node_modules/vscode-jsonrpc/lib/common/events.js", "../../../../../node_modules/.pnpm/vscode-jsonrpc@8.2.0/node_modules/vscode-jsonrpc/lib/common/cancellation.js", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/index.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/cst-utils.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/syntax-tree.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/stream.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/grammar-utils.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/errors.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/languages/generated/ast.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/ast-utils.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/regexp-utils.ts", "../../../../../node_modules/.pnpm/@chevrotain+regexp-to-ast@11.0.3/node_modules/@chevrotain/regexp-to-ast/src/utils.ts", "../../../../../node_modules/.pnpm/@chevrotain+regexp-to-ast@11.0.3/node_modules/@chevrotain/regexp-to-ast/src/character-classes.ts", "../../../../../node_modules/.pnpm/@chevrotain+regexp-to-ast@11.0.3/node_modules/@chevrotain/regexp-to-ast/src/regexp-parser.ts", "../../../../../node_modules/.pnpm/@chevrotain+regexp-to-ast@11.0.3/node_modules/@chevrotain/regexp-to-ast/src/base-regexp-visitor.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/languages/grammar-config.ts", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_freeGlobal.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_root.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Symbol.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getRawTag.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_objectToString.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseGetTag.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isObjectLike.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isSymbol.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayMap.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isArray.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseToString.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_trimmedEndIndex.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseTrim.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isObject.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/toNumber.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/toFinite.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/toInteger.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/identity.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isFunction.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_coreJsData.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isMasked.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_toSource.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsNative.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getValue.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getNative.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_WeakMap.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseCreate.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_apply.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/noop.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_copyArray.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_shortOut.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/constant.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_defineProperty.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseSetToString.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setToString.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayEach.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseFindIndex.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsNaN.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_strictIndexOf.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIndexOf.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayIncludes.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isIndex.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseAssignValue.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/eq.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_assignValue.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_copyObject.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_overRest.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseRest.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isLength.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isArrayLike.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isIterateeCall.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_createAssigner.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isPrototype.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseTimes.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsArguments.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isArguments.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/stubFalse.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isBuffer.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsTypedArray.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseUnary.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_nodeUtil.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isTypedArray.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayLikeKeys.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_overArg.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_nativeKeys.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseKeys.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/keys.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/assign.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_nativeKeysIn.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseKeysIn.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/keysIn.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isKey.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_nativeCreate.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashClear.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashDelete.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashGet.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashHas.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashSet.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Hash.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheClear.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_assocIndexOf.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheDelete.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheGet.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheHas.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheSet.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_ListCache.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Map.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheClear.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isKeyable.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getMapData.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheDelete.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheGet.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheHas.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheSet.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_MapCache.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/memoize.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_memoizeCapped.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stringToPath.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/toString.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_castPath.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_toKey.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseGet.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/get.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayPush.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isFlattenable.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseFlatten.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/flatten.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getPrototype.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseSlice.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayReduce.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackClear.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackDelete.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackGet.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackHas.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackSet.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Stack.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseAssign.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseAssignIn.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_cloneBuffer.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayFilter.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/stubArray.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getSymbols.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_copySymbols.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getSymbolsIn.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_copySymbolsIn.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseGetAllKeys.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getAllKeys.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getAllKeysIn.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_DataView.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Promise.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Set.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getTag.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_initCloneArray.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Uint8Array.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_cloneArrayBuffer.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_cloneDataView.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_cloneRegExp.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_cloneSymbol.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_cloneTypedArray.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_initCloneByTag.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_initCloneObject.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsMap.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isMap.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsSet.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isSet.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseClone.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/clone.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/compact.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setCacheAdd.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setCacheHas.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_SetCache.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arraySome.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_cacheHas.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_equalArrays.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapToArray.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setToArray.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_equalByTag.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_equalObjects.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsEqualDeep.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsEqual.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsMatch.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isStrictComparable.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getMatchData.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_matchesStrictComparable.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseMatches.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseHasIn.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hasPath.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/hasIn.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseMatchesProperty.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseProperty.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_basePropertyDeep.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/property.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIteratee.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayAggregator.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_createBaseFor.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseFor.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseForOwn.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_createBaseEach.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseEach.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseAggregator.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_createAggregator.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/defaults.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isArrayLikeObject.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayIncludesWith.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseDifference.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/difference.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/last.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/drop.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/dropRight.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_castFunction.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/forEach.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayEvery.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseEvery.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/every.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseFilter.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/filter.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_createFind.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/findIndex.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/find.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/head.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseMap.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/map.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/flatMap.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/groupBy.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseHas.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/has.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isString.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseValues.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/values.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/includes.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/indexOf.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isEmpty.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsRegExp.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isRegExp.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isUndefined.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseLt.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseExtremum.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/min.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/negate.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseSet.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_basePickBy.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/pickBy.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseReduce.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/reduce.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/reject.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseSome.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/some.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_createSet.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseUniq.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/uniq.js", "../../../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/uniqBy.js", "../../../../../node_modules/.pnpm/@chevrotain+utils@11.0.3/node_modules/@chevrotain/utils/src/print.ts", "../../../../../node_modules/.pnpm/@chevrotain+utils@11.0.3/node_modules/@chevrotain/utils/src/timer.ts", "../../../../../node_modules/.pnpm/@chevrotain+utils@11.0.3/node_modules/@chevrotain/utils/src/to-fast-properties.ts", "../../../../../node_modules/.pnpm/@chevrotain+gast@11.0.3/node_modules/@chevrotain/gast/src/model.ts", "../../../../../node_modules/.pnpm/@chevrotain+gast@11.0.3/node_modules/@chevrotain/gast/src/visitor.ts", "../../../../../node_modules/.pnpm/@chevrotain+gast@11.0.3/node_modules/@chevrotain/gast/src/helpers.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/rest.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/first.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/constants.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/follow.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/scan/reg_exp_parser.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/scan/reg_exp.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/scan/lexer.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/scan/tokens.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/scan/lexer_errors_public.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/scan/lexer_public.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/scan/tokens_public.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/errors_public.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/resolver.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/interpreter.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/lookahead.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/checks.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/gast/gast_resolver_public.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/exceptions_public.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/recoverable.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/keys.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/grammar/llk_lookahead.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/looksahead.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/cst/cst.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/lang/lang_extensions.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/cst/cst_visitor.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/tree_builder.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/lexer_adapter.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/recognizer_api.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/recognizer_engine.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/error_handler.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/context_assist.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/gast_recorder.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/traits/perf_tracer.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/utils/apply_mixins.ts", "../../../../../node_modules/.pnpm/chevrotain@11.0.3/node_modules/chevrotain/src/parse/parser/parser.ts", "../../../../../node_modules/.pnpm/chevrotain-allstar@0.3.1_chevrotain@11.0.3/node_modules/chevrotain-allstar/src/atn.ts", "../../../../../node_modules/.pnpm/chevrotain-allstar@0.3.1_chevrotain@11.0.3/node_modules/chevrotain-allstar/src/dfa.ts", "../../../../../node_modules/.pnpm/chevrotain-allstar@0.3.1_chevrotain@11.0.3/node_modules/chevrotain-allstar/src/all-star-lookahead.ts", "../../../../../node_modules/.pnpm/vscode-languageserver-types@3.17.5/node_modules/vscode-languageserver-types/lib/esm/main.js", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/cst-node-builder.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/langium-parser.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/parser-builder-base.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/completion-parser-builder.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/langium-parser-builder.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/token-builder.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/value-converter.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/cancellation.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/promise-utils.ts", "../../../../../node_modules/.pnpm/vscode-languageserver-textdocument@1.0.12/node_modules/vscode-languageserver-textdocument/lib/esm/main.js", "webpack://LIB/node_modules/path-browserify/index.js", "webpack://LIB/webpack/bootstrap", "webpack://LIB/webpack/runtime/define%20property%20getters", "webpack://LIB/webpack/runtime/hasOwnProperty%20shorthand", "webpack://LIB/webpack/runtime/make%20namespace%20object", "webpack://LIB/src/platform.ts", "webpack://LIB/src/uri.ts", "webpack://LIB/src/utils.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/uri-utils.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/documents.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/references/linker.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/references/name-provider.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/references/references.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/collections.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/references/scope-computation.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/references/scope.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/caching.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/references/scope-provider.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/serializer/json-serializer.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/service-registry.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/validation/validation-registry.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/validation/document-validator.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/ast-descriptions.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/ast-node-locator.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/event.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/configuration.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/disposable.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/document-builder.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/index-manager.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/workspace-manager.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/lexer.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/documentation/jsdoc.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/documentation/documentation-provider.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/documentation/comment-provider.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/async-parser.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/workspace-lock.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/serializer/hydrator.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/default-module.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/dependency-injection.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/parser/indentation-aware.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/index.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/workspace/file-system-provider.ts", "../../../../../node_modules/.pnpm/langium@3.3.1/node_modules/langium/src/utils/grammar-loader.ts", "../../../src/language/generated/ast.ts", "../../../src/language/generated/grammar.ts", "../../../src/language/generated/module.ts", "../../../src/language/common/matcher.ts", "../../../src/language/common/valueConverter.ts", "../../../src/language/common/tokenBuilder.ts"],
"sourcesContent": ["\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nlet _ral;\nfunction RAL() {\n if (_ral === undefined) {\n throw new Error(`No runtime abstraction layer installed`);\n }\n return _ral;\n}\n(function (RAL) {\n function install(ral) {\n if (ral === undefined) {\n throw new Error(`No runtime abstraction layer provided`);\n }\n _ral = ral;\n }\n RAL.install = install;\n})(RAL || (RAL = {}));\nexports.default = RAL;\n", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.stringArray = exports.array = exports.func = exports.error = exports.number = exports.string = exports.boolean = void 0;\nfunction boolean(value) {\n return value === true || value === false;\n}\nexports.boolean = boolean;\nfunction string(value) {\n return typeof value === 'string' || value instanceof String;\n}\nexports.string = string;\nfunction number(value) {\n return typeof value === 'number' || value instanceof Number;\n}\nexports.number = number;\nfunction error(value) {\n return value instanceof Error;\n}\nexports.error = error;\nfunction func(value) {\n return typeof value === 'function';\n}\nexports.func = func;\nfunction array(value) {\n return Array.isArray(value);\n}\nexports.array = array;\nfunction stringArray(value) {\n return array(value) && value.every(elem => string(elem));\n}\nexports.stringArray = stringArray;\n", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Emitter = exports.Event = void 0;\nconst ral_1 = require(\"./ral\");\nvar Event;\n(function (Event) {\n const _disposable = { dispose() { } };\n Event.None = function () { return _disposable; };\n})(Event || (exports.Event = Event = {}));\nclass CallbackList {\n add(callback, context = null, bucket) {\n if (!this._callbacks) {\n this._callbacks = [];\n this._contexts = [];\n }\n this._callbacks.push(callback);\n this._contexts.push(context);\n if (Array.isArray(bucket)) {\n bucket.push({ dispose: () => this.remove(callback, context) });\n }\n }\n remove(callback, context = null) {\n if (!this._callbacks) {\n return;\n }\n let foundCallbackWithDifferentContext = false;\n for (let i = 0, len = this._callbacks.length; i < len; i++) {\n if (this._callbacks[i] === callback) {\n if (this._contexts[i] === context) {\n // callback & context match => remove it\n this._callbacks.splice(i, 1);\n this._contexts.splice(i, 1);\n return;\n }\n else {\n foundCallbackWithDifferentContext = true;\n }\n }\n }\n if (foundCallbackWithDifferentContext) {\n throw new Error('When adding a listener with a context, you should remove it with the same context');\n }\n }\n invoke(...args) {\n if (!this._callbacks) {\n return [];\n }\n const ret = [], callbacks = this._callbacks.slice(0), contexts = this._contexts.slice(0);\n for (let i = 0, len = callbacks.length; i < len; i++) {\n try {\n ret.push(callbacks[i].apply(contexts[i], args));\n }\n catch (e) {\n // eslint-disable-next-line no-console\n (0, ral_1.default)().console.error(e);\n }\n }\n return ret;\n }\n isEmpty() {\n return !this._callbacks || this._callbacks.length === 0;\n }\n dispose() {\n this._callbacks = undefined;\n this._contexts = undefined;\n }\n}\nclass Emitter {\n constructor(_options) {\n this._options = _options;\n }\n /**\n * For the public to allow to subscribe\n * to events from this Emitter\n */\n get event() {\n if (!this._event) {\n this._event = (listener, thisArgs, disposables) => {\n if (!this._callbacks) {\n this._callbacks = new CallbackList();\n }\n if (this._options && this._options.onFirstListenerAdd && this._callbacks.isEmpty()) {\n this._options.onFirstListenerAdd(this);\n }\n this._callbacks.add(listener, thisArgs);\n const result = {\n dispose: () => {\n if (!this._callbacks) {\n // disposable is disposed after emitter is disposed.\n return;\n }\n this._callbacks.remove(listener, thisArgs);\n result.dispose = Emitter._noop;\n if (this._options && this._options.onLastListenerRemove && this._callbacks.isEmpty()) {\n this._options.onLastListenerRemove(this);\n }\n }\n };\n if (Array.isArray(disposables)) {\n disposables.push(result);\n }\n return result;\n };\n }\n return this._event;\n }\n /**\n * To be kept private to fire an event to\n * subscribers\n */\n fire(event) {\n if (this._callbacks) {\n this._callbacks.invoke.call(this._callbacks, event);\n }\n }\n dispose() {\n if (this._callbacks) {\n this._callbacks.dispose();\n this._callbacks = undefined;\n }\n }\n}\nexports.Emitter = Emitter;\nEmitter._noop = function () { };\n", "\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CancellationTokenSource = exports.CancellationToken = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst events_1 = require(\"./events\");\nvar CancellationToken;\n(function (CancellationToken) {\n CancellationToken.None = Object.freeze({\n isCancellationRequested: false,\n onCancellationRequested: events_1.Event.None\n });\n CancellationToken.Cancelled = Object.freeze({\n isCancellationRequested: true,\n onCancellationRequested: events_1.Event.None\n });\n function is(value) {\n const candidate = value;\n return candidate && (candidate === CancellationToken.None\n || candidate === CancellationToken.Cancelled\n || (Is.boolean(candidate.isCancellationRequested) && !!candidate.onCancellationRequested));\n }\n CancellationToken.is = is;\n})(CancellationToken || (exports.CancellationToken = CancellationToken = {}));\nconst shortcutEvent = Object.freeze(function (callback, context) {\n const handle = (0, ral_1.default)().timer.setTimeout(callback.bind(context), 0);\n return { dispose() { handle.dispose(); } };\n});\nclass MutableToken {\n constructor() {\n this._isCancelled = false;\n }\n cancel() {\n if (!this._isCancelled) {\n this._isCancelled = true;\n if (this._emitter) {\n this._emitter.fire(undefined);\n this.dispose();\n }\n }\n }\n get isCancellationRequested() {\n return this._isCancelled;\n }\n get onCancellationRequested() {\n if (this._isCancelled) {\n return shortcutEvent;\n }\n if (!this._emitter) {\n this._emitter = new events_1.Emitter();\n }\n return this._emitter.event;\n }\n dispose() {\n if (this._emitter) {\n this._emitter.dispose();\n this._emitter = undefined;\n }\n }\n}\nclass CancellationTokenSource {\n get token() {\n if (!this._token) {\n // be lazy and create the token only when\n // actually needed\n this._token = new MutableToken();\n }\n return this._token;\n }\n cancel() {\n if (!this._token) {\n // save an object by returning the default\n // cancelled token when cancellation happens\n // before someone asks for the token\n this._token = CancellationToken.Cancelled;\n }\n else {\n this._token.cancel();\n }\n }\n dispose() {\n if (!this._token) {\n // ensure to initialize with an empty token if we had none\n this._token = CancellationToken.None;\n }\n else if (this._token instanceof MutableToken) {\n // actually dispose\n this._token.dispose();\n }\n }\n}\nexports.CancellationTokenSource = CancellationTokenSource;\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n *\r\n * @module langium\r\n */\r\n\r\nexport * from './default-module.js';\r\nexport * from './dependency-injection.js';\r\nexport * from './service-registry.js';\r\nexport * from './services.js';\r\nexport * from './syntax-tree.js';\r\nexport * from './documentation/index.js';\r\nexport * from './languages/index.js';\r\nexport * from './parser/index.js';\r\nexport * from './references/index.js';\r\nexport * from './serializer/index.js';\r\nexport * from './utils/index.js';\r\nexport * from './validation/index.js';\r\nexport * from './workspace/index.js';\r\n\r\n// Export the Langium Grammar AST definitions in the `GrammarAST` namespace\r\nimport * as GrammarAST from './languages/generated/ast.js';\r\nimport type { Grammar } from './languages/generated/ast.js';\r\nexport { Grammar, GrammarAST };\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { IToken } from '@chevrotain/types';\r\nimport type { Range } from 'vscode-languageserver-types';\r\nimport type { CstNode, CompositeCstNode, LeafCstNode } from '../syntax-tree.js';\r\nimport type { DocumentSegment } from '../workspace/documents.js';\r\nimport type { Stream, TreeStream } from './stream.js';\r\nimport { isCompositeCstNode, isLeafCstNode, isRootCstNode } from '../syntax-tree.js';\r\nimport { TreeStreamImpl } from './stream.js';\r\n\r\n/**\r\n * Create a stream of all CST nodes that are directly and indirectly contained in the given root node,\r\n * including the root node itself.\r\n */\r\nexport function streamCst(node: CstNode): TreeStream<CstNode> {\r\n return new TreeStreamImpl(node, element => {\r\n if (isCompositeCstNode(element)) {\r\n return element.content;\r\n } else {\r\n return [];\r\n }\r\n }, { includeRoot: true });\r\n}\r\n\r\n/**\r\n * Create a stream of all leaf nodes that are directly and indirectly contained in the given root node.\r\n */\r\nexport function flattenCst(node: CstNode): Stream<LeafCstNode> {\r\n return streamCst(node).filter(isLeafCstNode);\r\n}\r\n\r\n/**\r\n * Determines whether the specified cst node is a child of the specified parent node.\r\n */\r\nexport function isChildNode(child: CstNode, parent: CstNode): boolean {\r\n while (child.container) {\r\n child = child.container;\r\n if (child === parent) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nexport function tokenToRange(token: IToken): Range {\r\n // Chevrotain uses 1-based indices everywhere\r\n // So we subtract 1 from every value to align with the LSP\r\n return {\r\n start: {\r\n character: token.startColumn! - 1,\r\n line: token.startLine! - 1\r\n },\r\n end: {\r\n character: token.endColumn!, // endColumn uses the correct index\r\n line: token.endLine! - 1\r\n }\r\n };\r\n}\r\n\r\nexport function toDocumentSegment(node: CstNode): DocumentSegment;\r\nexport function toDocumentSegment(node?: CstNode): DocumentSegment | undefined;\r\nexport function toDocumentSegment(node?: CstNode): DocumentSegment | undefined {\r\n if (!node) {\r\n return undefined;\r\n }\r\n const { offset, end, range } = node;\r\n return {\r\n range,\r\n offset,\r\n end,\r\n length: end - offset\r\n };\r\n}\r\n\r\nexport enum RangeComparison {\r\n Before = 0,\r\n After = 1,\r\n OverlapFront = 2,\r\n OverlapBack = 3,\r\n Inside = 4,\r\n Outside = 5,\r\n}\r\n\r\nexport function compareRange(range: Range, to: Range): RangeComparison {\r\n if (range.end.line < to.start.line || (range.end.line === to.start.line && range.end.character <= to.start.character)) {\r\n return RangeComparison.Before;\r\n } else if (range.start.line > to.end.line || (range.start.line === to.end.line && range.start.character >= to.end.character)) {\r\n return RangeComparison.After;\r\n }\r\n const startInside = range.start.line > to.start.line || (range.start.line === to.start.line && range.start.character >= to.start.character);\r\n const endInside = range.end.line < to.end.line || (range.end.line === to.end.line && range.end.character <= to.end.character);\r\n if (startInside && endInside) {\r\n return RangeComparison.Inside;\r\n } else if (startInside) {\r\n return RangeComparison.OverlapBack;\r\n } else if (endInside) {\r\n return RangeComparison.OverlapFront;\r\n } else {\r\n return RangeComparison.Outside;\r\n }\r\n}\r\n\r\nexport function inRange(range: Range, to: Range): boolean {\r\n const comparison = compareRange(range, to);\r\n return comparison > RangeComparison.After;\r\n}\r\n\r\n// The \\p{L} regex matches any unicode letter character, i.e. characters from non-english alphabets\r\n// Together with \\w it matches any kind of character which can commonly appear in IDs\r\nexport const DefaultNameRegexp = /^[\\w\\p{L}]$/u;\r\n\r\n/**\r\n * Performs `findLeafNodeAtOffset` with a minor difference: When encountering a character that matches the `nameRegexp` argument,\r\n * it will instead return the leaf node at the `offset - 1` position.\r\n *\r\n * For LSP services, users expect that the declaration of an element is available if the cursor is directly after the element.\r\n */\r\nexport function findDeclarationNodeAtOffset(cstNode: CstNode | undefined, offset: number, nameRegexp = DefaultNameRegexp): LeafCstNode | undefined {\r\n if (cstNode) {\r\n if (offset > 0) {\r\n const localOffset = offset - cstNode.offset;\r\n const textAtOffset = cstNode.text.charAt(localOffset);\r\n if (!nameRegexp.test(textAtOffset)) {\r\n offset--;\r\n }\r\n }\r\n return findLeafNodeAtOffset(cstNode, offset);\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function findCommentNode(cstNode: CstNode | undefined, commentNames: string[]): CstNode | undefined {\r\n if (cstNode) {\r\n const previous = getPreviousNode(cstNode, true);\r\n if (previous && isCommentNode(previous, commentNames)) {\r\n return previous;\r\n }\r\n if (isRootCstNode(cstNode)) {\r\n // Go from the first non-hidden node through all nodes in reverse order\r\n // We do this to find the comment node which directly precedes the root node\r\n const endIndex = cstNode.content.findIndex(e => !e.hidden);\r\n for (let i = endIndex - 1; i >= 0; i--) {\r\n const child = cstNode.content[i];\r\n if (isCommentNode(child, commentNames)) {\r\n return child;\r\n }\r\n }\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function isCommentNode(cstNode: CstNode, commentNames: string[]): boolean {\r\n return isLeafCstNode(cstNode) && commentNames.includes(cstNode.tokenType.name);\r\n}\r\n\r\n/**\r\n * Finds the leaf CST node at the specified 0-based string offset.\r\n * Note that the given offset will be within the range of the returned leaf node.\r\n *\r\n * If the offset does not point to a CST node (but just white space), this method will return `undefined`.\r\n *\r\n * @param node The CST node to search through.\r\n * @param offset The specified offset.\r\n * @returns The CST node at the specified offset.\r\n */\r\nexport function findLeafNodeAtOffset(node: CstNode, offset: number): LeafCstNode | undefined {\r\n if (isLeafCstNode(node)) {\r\n return node;\r\n } else if (isCompositeCstNode(node)) {\r\n const searchResult = binarySearch(node, offset, false);\r\n if (searchResult) {\r\n return findLeafNodeAtOffset(searchResult, offset);\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Finds the leaf CST node at the specified 0-based string offset.\r\n * If no CST node exists at the specified position, it will return the leaf node before it.\r\n *\r\n * If there is no leaf node before the specified offset, this method will return `undefined`.\r\n *\r\n * @param node The CST node to search through.\r\n * @param offset The specified offset.\r\n * @returns The CST node closest to the specified offset.\r\n */\r\nexport function findLeafNodeBeforeOffset(node: CstNode, offset: number): LeafCstNode | undefined {\r\n if (isLeafCstNode(node)) {\r\n return node;\r\n } else if (isCompositeCstNode(node)) {\r\n const searchResult = binarySearch(node, offset, true);\r\n if (searchResult) {\r\n return findLeafNodeBeforeOffset(searchResult, offset);\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction binarySearch(node: CompositeCstNode, offset: number, closest: boolean): CstNode | undefined {\r\n let left = 0;\r\n let right = node.content.length - 1;\r\n let closestNode: CstNode | undefined = undefined;\r\n\r\n while (left <= right) {\r\n const middle = Math.floor((left + right) / 2);\r\n const middleNode = node.content[middle];\r\n\r\n if (middleNode.offset <= offset && middleNode.end > offset) {\r\n // Found an exact match\r\n return middleNode;\r\n }\r\n\r\n if (middleNode.end <= offset) {\r\n // Update the closest node (less than offset) and move to the right half\r\n closestNode = closest ? middleNode : undefined;\r\n left = middle + 1;\r\n } else {\r\n // Move to the left half\r\n right = middle - 1;\r\n }\r\n }\r\n\r\n return closestNode;\r\n}\r\n\r\nexport function getPreviousNode(node: CstNode, hidden = true): CstNode | undefined {\r\n while (node.container) {\r\n const parent = node.container;\r\n let index = parent.content.indexOf(node);\r\n while (index > 0) {\r\n index--;\r\n const previous = parent.content[index];\r\n if (hidden || !previous.hidden) {\r\n return previous;\r\n }\r\n }\r\n node = parent;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getNextNode(node: CstNode, hidden = true): CstNode | undefined {\r\n while (node.container) {\r\n const parent = node.container;\r\n let index = parent.content.indexOf(node);\r\n const last = parent.content.length - 1;\r\n while (index < last) {\r\n index++;\r\n const next = parent.content[index];\r\n if (hidden || !next.hidden) {\r\n return next;\r\n }\r\n }\r\n node = parent;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getStartlineNode(node: CstNode): CstNode {\r\n if (node.range.start.character === 0) {\r\n return node;\r\n }\r\n const line = node.range.start.line;\r\n let last = node;\r\n let index: number | undefined;\r\n while (node.container) {\r\n const parent = node.container;\r\n const selfIndex = index ?? parent.content.indexOf(node);\r\n if (selfIndex === 0) {\r\n node = parent;\r\n index = undefined;\r\n } else {\r\n index = selfIndex - 1;\r\n node = parent.content[index];\r\n }\r\n if (node.range.start.line !== line) {\r\n break;\r\n }\r\n last = node;\r\n }\r\n return last;\r\n}\r\n\r\nexport function getInteriorNodes(start: CstNode, end: CstNode): CstNode[] {\r\n const commonParent = getCommonParent(start, end);\r\n if (!commonParent) {\r\n return [];\r\n }\r\n return commonParent.parent.content.slice(commonParent.a + 1, commonParent.b);\r\n}\r\n\r\nfunction getCommonParent(a: CstNode, b: CstNode): CommonParent | undefined {\r\n const aParents = getParentChain(a);\r\n const bParents = getParentChain(b);\r\n let current: CommonParent | undefined;\r\n for (let i = 0; i < aParents.length && i < bParents.length; i++) {\r\n const aParent = aParents[i];\r\n const bParent = bParents[i];\r\n if (aParent.parent === bParent.parent) {\r\n current = {\r\n parent: aParent.parent,\r\n a: aParent.index,\r\n b: bParent.index\r\n };\r\n } else {\r\n break;\r\n }\r\n }\r\n return current;\r\n}\r\n\r\ninterface CommonParent {\r\n parent: CompositeCstNode\r\n a: number\r\n b: number\r\n}\r\n\r\nfunction getParentChain(node: CstNode): ParentLink[] {\r\n const chain: ParentLink[] = [];\r\n while (node.container) {\r\n const parent = node.container;\r\n const index = parent.content.indexOf(node);\r\n chain.push({\r\n parent,\r\n index\r\n });\r\n node = parent;\r\n }\r\n return chain.reverse();\r\n}\r\n\r\ninterface ParentLink {\r\n parent: CompositeCstNode\r\n index: number\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { TokenType } from 'chevrotain';\r\nimport type { URI } from './utils/uri-utils.js';\r\nimport type { AbstractElement } from './languages/generated/ast.js';\r\nimport type { DocumentSegment, LangiumDocument } from './workspace/documents.js';\r\n\r\n/**\r\n * A node in the Abstract Syntax Tree (AST).\r\n */\r\nexport interface AstNode {\r\n /** Every AST node has a type corresponding to what was specified in the grammar declaration. */\r\n readonly $type: string;\r\n /** The container node in the AST; every node except the root node has a container. */\r\n readonly $container?: AstNode;\r\n /** The property of the `$container` node that contains this node. This is either a direct reference or an array. */\r\n readonly $containerProperty?: string;\r\n /** In case `$containerProperty` is an array, the array index is stored here. */\r\n readonly $containerIndex?: number;\r\n /** The Concrete Syntax Tree (CST) node of the text range from which this node was parsed. */\r\n readonly $cstNode?: CstNode;\r\n /** The document containing the AST; only the root node has a direct reference to the document. */\r\n readonly $document?: LangiumDocument;\r\n}\r\n\r\nexport function isAstNode(obj: unknown): obj is AstNode {\r\n return typeof obj === 'object' && obj !== null && typeof (obj as AstNode).$type === 'string';\r\n}\r\n\r\nexport interface GenericAstNode extends AstNode {\r\n [key: string]: unknown\r\n}\r\n\r\ntype SpecificNodeProperties<N extends AstNode> = keyof Omit<N, keyof AstNode | number | symbol>;\r\n\r\n/**\r\n * The property names of a given AST node type.\r\n */\r\nexport type Properties<N extends AstNode> = SpecificNodeProperties<N> extends never ? string : SpecificNodeProperties<N>\r\n\r\n/**\r\n * A cross-reference in the AST. Cross-references may or may not be successfully resolved.\r\n */\r\nexport interface Reference<T extends AstNode = AstNode> {\r\n /**\r\n * The target AST node of this reference. Accessing this property may trigger cross-reference\r\n * resolution by the `Linker` in case it has not been done yet. If the reference cannot be resolved,\r\n * the value is `undefined`.\r\n */\r\n readonly ref?: T;\r\n\r\n /** If any problem occurred while resolving the reference, it is described by this property. */\r\n readonly error?: LinkingError;\r\n /** The CST node from which the reference was parsed */\r\n readonly $refNode?: CstNode;\r\n /** The actual text used to look up in the surrounding scope */\r\n readonly $refText: string;\r\n /** The node description for the AstNode returned by `ref` */\r\n readonly $nodeDescription?: AstNodeDescription;\r\n}\r\n\r\nexport function isReference(obj: unknown): obj is Reference {\r\n return typeof obj === 'object' && obj !== null && typeof (obj as Reference).$refText === 'string';\r\n}\r\n\r\nexport type ResolvedReference<T extends AstNode = AstNode> = Reference<T> & {\r\n readonly ref: T;\r\n}\r\n\r\n/**\r\n * A description of an AST node is used when constructing scopes and looking up cross-reference targets.\r\n */\r\nexport interface AstNodeDescription {\r\n /** The target node; should be present only for local references (linking to the same document). */\r\n node?: AstNode;\r\n /**\r\n * The document segment that represents the range of the name of the AST node.\r\n */\r\n nameSegment?: DocumentSegment;\r\n /**\r\n * The document segment that represents the full range of the AST node.\r\n */\r\n selectionSegment?: DocumentSegment;\r\n /** `$type` property value of the AST node */\r\n type: string;\r\n /** Name of the AST node; this is usually determined by the `NameProvider` service. */\r\n name: string;\r\n /** URI to the document containing the AST node */\r\n documentUri: URI;\r\n /** Navigation path inside the document */\r\n path: string;\r\n}\r\n\r\nexport function isAstNodeDescription(obj: unknown): obj is AstNodeDescription {\r\n return typeof obj === 'object' && obj !== null\r\n && typeof (obj as AstNodeDescription).name === 'string'\r\n && typeof (obj as AstNodeDescription).type === 'string'\r\n && typeof (obj as AstNodeDescription).path === 'string';\r\n}\r\n\r\n/**\r\n * Information about a cross-reference. This is used when traversing references in an AST or to describe\r\n * unresolved references.\r\n */\r\nexport interface ReferenceInfo {\r\n reference: Reference\r\n container: AstNode\r\n property: string\r\n index?: number\r\n}\r\n\r\n/**\r\n * Used to collect information when the `Linker` service fails to resolve a cross-reference.\r\n */\r\nexport interface LinkingError extends ReferenceInfo {\r\n message: string;\r\n targetDescription?: AstNodeDescription;\r\n}\r\n\r\nexport function isLinkingError(obj: unknown): obj is LinkingError {\r\n return typeof obj === 'object' && obj !== null\r\n && isAstNode((obj as LinkingError).container)\r\n && isReference((obj as LinkingError).reference)\r\n && typeof (obj as LinkingError).message === 'string';\r\n}\r\n\r\n/**\r\n * Service used for generic access to the structure of the AST. This service is shared between\r\n * all involved languages, so it operates on the superset of types of these languages.\r\n */\r\nexport interface AstReflection {\r\n getAllTypes(): string[]\r\n getAllSubTypes(type: string): string[]\r\n getReferenceType(refInfo: ReferenceInfo): string\r\n getTypeMetaData(type: string): TypeMetaData\r\n isInstance(node: unknown, type: string): boolean\r\n isSubtype(subtype: string, supertype: string): boolean\r\n}\r\n\r\n/**\r\n * An abstract implementation of the {@link AstReflection} interface.\r\n * Serves to cache subtype computation results to improve performance throughout different parts of Langium.\r\n */\r\nexport abstract class AbstractAstReflection implements AstReflection {\r\n\r\n protected subtypes: Record<string, Record<string, boolean | undefined>> = {};\r\n protected allSubtypes: Record<string, string[] | undefined> = {};\r\n\r\n abstract getAllTypes(): string[];\r\n abstract getReferenceType(refInfo: ReferenceInfo): string;\r\n abstract getTypeMetaData(type: string): TypeMetaData;\r\n protected abstract computeIsSubtype(subtype: string, supertype: string): boolean;\r\n\r\n isInstance(node: unknown, type: string): boolean {\r\n return isAstNode(node) && this.isSubtype(node.$type, type);\r\n }\r\n\r\n isSubtype(subtype: string, supertype: string): boolean {\r\n if (subtype === supertype) {\r\n return true;\r\n }\r\n let nested = this.subtypes[subtype];\r\n if (!nested) {\r\n nested = this.subtypes[subtype] = {};\r\n }\r\n const existing = nested[supertype];\r\n if (existing !== undefined) {\r\n return existing;\r\n } else {\r\n const result = this.computeIsSubtype(subtype, supertype);\r\n nested[supertype] = result;\r\n return result;\r\n }\r\n }\r\n\r\n getAllSubTypes(type: string): string[] {\r\n const existing = this.allSubtypes[type];\r\n if (existing) {\r\n return existing;\r\n } else {\r\n const allTypes = this.getAllTypes();\r\n const types: string[] = [];\r\n for (const possibleSubType of allTypes) {\r\n if (this.isSubtype(possibleSubType, type)) {\r\n types.push(possibleSubType);\r\n }\r\n }\r\n this.allSubtypes[type] = types;\r\n return types;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Represents runtime meta data about a meta model type.\r\n */\r\nexport interface TypeMetaData {\r\n /** The name of this meta model type. Corresponds to the `AstNode.$type` value. */\r\n name: string\r\n /** A list of properties. They can contain default values for their respective property in the AST. */\r\n properties: TypeProperty[]\r\n}\r\n\r\n/**\r\n * Describes the meta data of a property of an AST node.\r\n *\r\n * The optional `defaultValue` indicates that the property is mandatory in the AST node.\r\n * For example, if an AST node contains an array, but no elements of this array have been parsed, we still expect an empty array instead of `undefined`.\r\n */\r\nexport interface TypeProperty {\r\n name: string\r\n defaultValue?: PropertyType\r\n}\r\n\r\n/**\r\n * Represents a default value for an AST property.\r\n */\r\nexport type PropertyType = number | string | boolean | PropertyType[];\r\n\r\n/**\r\n * A node in the Concrete Syntax Tree (CST).\r\n */\r\nexport interface CstNode extends DocumentSegment {\r\n /** The container node in the CST */\r\n readonly container?: CompositeCstNode;\r\n /** @deprecated use `container` instead. */\r\n readonly parent?: CompositeCstNode;\r\n /** The actual text */\r\n readonly text: string;\r\n /** The root CST node */\r\n readonly root: RootCstNode;\r\n /** The grammar element from which this node was parsed */\r\n readonly grammarSource?: AbstractElement;\r\n /** @deprecated use `grammarSource` instead. */\r\n readonly feature?: AbstractElement;\r\n /** The AST node created from this CST node */\r\n readonly astNode: AstNode;\r\n /** @deprecated use `astNode` instead. */\r\n readonly element: AstNode;\r\n /** Whether the token is hidden, i.e. not explicitly part of the containing grammar rule */\r\n readonly hidden: boolean;\r\n}\r\n\r\n/**\r\n * A composite CST node contains other nodes, but no directly associated token.\r\n */\r\nexport interface CompositeCstNode extends CstNode {\r\n readonly content: CstNode[];\r\n /** @deprecated use `content` instead. */\r\n readonly children: CstNode[];\r\n}\r\n\r\nexport function isCompositeCstNode(node: unknown): node is CompositeCstNode {\r\n return typeof node === 'object' && node !== null && Array.isArray((node as CompositeCstNode).content);\r\n}\r\n\r\n/**\r\n * A leaf CST node corresponds to a token in the input token stream.\r\n */\r\nexport interface LeafCstNode extends CstNode {\r\n readonly tokenType: TokenType;\r\n}\r\n\r\nexport function isLeafCstNode(node: unknown): node is LeafCstNode {\r\n return typeof node === 'object' && node !== null && typeof (node as LeafCstNode).tokenType === 'object';\r\n}\r\n\r\nexport interface RootCstNode extends CompositeCstNode {\r\n readonly fullText: string\r\n}\r\n\r\nexport function isRootCstNode(node: unknown): node is RootCstNode {\r\n return isCompositeCstNode(node) && typeof (node as RootCstNode).fullText === 'string';\r\n}\r\n\r\n/**\r\n * Returns a type to have only properties names (!) of a type T whose property value is of a certain type K.\r\n */\r\ntype ExtractKeysOfValueType<T, K> = { [I in keyof T]: T[I] extends K ? I : never }[keyof T];\r\n\r\n/**\r\n * Returns the property names (!) of an AstNode that are cross-references.\r\n * Meant to be used during cross-reference resolution in combination with `assertUnreachable(context.property)`.\r\n */\r\nexport type CrossReferencesOfAstNodeType<N extends AstNode> = (\r\n ExtractKeysOfValueType<N, Reference|undefined>\r\n | ExtractKeysOfValueType<N, Array<Reference|undefined>|undefined>\r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\n) & {};\r\n\r\n/**\r\n * Represents the enumeration-like type, that lists all AstNode types of your grammar.\r\n */\r\nexport type AstTypeList<T> = Record<keyof T, AstNode>;\r\n\r\n/**\r\n * Returns all types that contain cross-references, A is meant to be the interface `XXXAstType` fromm your generated `ast.ts` file.\r\n * Meant to be used during cross-reference resolution in combination with `assertUnreachable(context.container)`.\r\n */\r\nexport type AstNodeTypesWithCrossReferences<A extends AstTypeList<A>> = {\r\n [T in keyof A]: CrossReferencesOfAstNodeType<A[T]> extends never ? never : A[T]\r\n}[keyof A];\r\n\r\nexport type Mutable<T> = {\r\n -readonly [P in keyof T]: T[P]\r\n};\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\n/**\r\n * A stream is a read-only sequence of values. While the contents of an array can be accessed\r\n * both sequentially and randomly (via index), a stream allows only sequential access.\r\n *\r\n * The advantage of this is that a stream can be evaluated lazily, so it does not require\r\n * to store intermediate values. This can boost performance when a large sequence is\r\n * processed via filtering, mapping etc. and accessed at most once. However, lazy\r\n * evaluation means that all processing is repeated when you access the sequence multiple\r\n * times; in such a case, it may be better to store the resulting sequence into an array.\r\n */\r\nexport interface Stream<T> extends Iterable<T> {\r\n\r\n /**\r\n * Returns an iterator for this stream. This is the same as calling the `Symbol.iterator` function property.\r\n */\r\n iterator(): IterableIterator<T>;\r\n\r\n /**\r\n * Determines whether this stream contains no elements.\r\n */\r\n isEmpty(): boolean;\r\n\r\n /**\r\n * Determines the number of elements in this stream.\r\n */\r\n count(): number;\r\n\r\n /**\r\n * Collects all elements of this stream into an array.\r\n */\r\n toArray(): T[];\r\n\r\n /**\r\n * Collects all elements of this stream into a Set.\r\n */\r\n toSet(): Set<T>;\r\n\r\n /**\r\n * Collects all elements of this stream into a Map, applying the provided functions to determine keys and values.\r\n *\r\n * @param keyFn The function to derive map keys. If omitted, the stream elements are used as keys.\r\n * @param valueFn The function to derive map values. If omitted, the stream elements are used as values.\r\n */\r\n toMap<K = T, V = T>(keyFn?: (e: T) => K, valueFn?: (e: T) => V): Map<K, V>;\r\n\r\n /**\r\n * Returns a string representation of a stream.\r\n */\r\n toString(): string;\r\n\r\n /**\r\n * Combines two streams by returning a new stream that yields all elements of this stream and the other stream.\r\n *\r\n * @param other Stream to be concatenated with this one.\r\n */\r\n concat<T2>(other: Iterable<T2>): Stream<T | T2>;\r\n\r\n /**\r\n * Adds all elements of the stream into a string, separated by the specified separator string.\r\n *\r\n * @param separator A string used to separate one element of the stream from the next in the resulting string.\r\n * If omitted, the steam elements are separated with a comma.\r\n */\r\n join(separator?: string): string\r\n\r\n /**\r\n * Returns the index of the first occurrence of a value in the stream, or -1 if it is not present.\r\n *\r\n * @param searchElement The value to locate in the array.\r\n * @param fromIndex The stream index at which to begin the search. If fromIndex is omitted, the search\r\n * starts at index 0.\r\n */\r\n indexOf(searchElement: T, fromIndex?: number): number;\r\n\r\n /**\r\n * Determines whether all members of the stream satisfy the specified test.\r\n *\r\n * @param predicate This method calls the predicate function for each element in the stream until the\r\n * predicate returns a value which is coercible to the Boolean value `false`, or until the end\r\n * of the stream.\r\n */\r\n every<S extends T>(predicate: (value: T) => value is S): this is Stream<S>;\r\n every(predicate: (value: T) => unknown): boolean;\r\n\r\n /**\r\n * Determines whether any member of the stream satisfies the specified test.\r\n *\r\n * @param predicate This method calls the predicate function for each element in the stream until the\r\n * predicate returns a value which is coercible to the Boolean value `true`, or until the end\r\n * of the stream.\r\n */\r\n some(predicate: (value: T) => unknown): boolean;\r\n\r\n /**\r\n * Performs the specified action for each element in the stream.\r\n *\r\n * @param callbackfn Function called once for each element in the stream.\r\n */\r\n forEach(callbackfn: (value: T, index: number) => void): void;\r\n\r\n /**\r\n * Returns a stream that yields the results of calling the specified callback function on each element\r\n * of the stream. The function is called when the resulting stream elements are actually accessed, so\r\n * accessing the resulting stream multiple times means the function is also called multiple times for\r\n * each element of the stream.\r\n *\r\n * @param callbackfn Lazily evaluated function mapping stream elements.\r\n */\r\n map<U>(callbackfn: (value: T) => U): Stream<U>;\r\n\r\n /**\r\n * Returns the elements of the stream that meet the condition specified in a callback function.\r\n * The function is called when the resulting stream elements are actually accessed, so accessing the\r\n * resulting stream multiple times means the function is also called multiple times for each element\r\n * of the stream.\r\n *\r\n * @param predicate Lazily evaluated function checking a condition on stream elements.\r\n */\r\n filter<S extends T>(predicate: (value: T) => value is S): Stream<S>;\r\n filter(predicate: (value: T) => unknown): Stream<T>;\r\n\r\n /**\r\n * Returns the elements of the stream that are _non-nullable_, which means they are neither `undefined`\r\n * nor `null`.\r\n */\r\n nonNullable(): Stream<NonNullable<T>>;\r\n\r\n /**\r\n * Calls the specified callback function for all elements in the stream. The return value of the\r\n * callback function is the accumulated result, and is provided as an argument in the next call to\r\n * the callback function.\r\n *\r\n * @param callbackfn This method calls the function once for each element in the stream, providing\r\n * the previous and current values of the reduction.\r\n * @param initialValue If specified, `initialValue` is used as the initial value to start the\r\n * accumulation. The first call to the function provides this value as an argument instead\r\n * of a stream value.\r\n */\r\n reduce(callbackfn: (previousValue: T, currentValue: T) => T): T | undefined;\r\n reduce<U = T>(callbackfn: (previousValue: U, currentValue: T) => U, initialValue: U): U;\r\n\r\n /**\r\n * Calls the specified callback function for all elements in the stream, in descending order.\r\n * The return value of the callback function is the accumulated result, and is provided as an\r\n * argument in the next call to the callback function.\r\n *\r\n * @param callbackfn This method calls the function once for each element in the stream, providing\r\n * the previous and current values of the reduction.\r\n * @param initialValue If specified, `initialValue` is used as the initial value to start the\r\n * accumulation. The first call to the function provides this value as an argument instead\r\n * of an array value.\r\n */\r\n reduceRight(callbackfn: (previousValue: T, currentValue: T) => T): T | undefined;\r\n reduceRight<U = T>(callbackfn: (previousValue: U, currentValue: T) => U, initialValue: U): U;\r\n\r\n /**\r\n * Returns the value of the first element in the stream that meets the condition, or `undefined`\r\n * if there is no such element.\r\n *\r\n * @param predicate This method calls `predicate` once for each element of the stream, in ascending\r\n * order, until it finds one where `predicate` returns a value which is coercible to the\r\n * Boolean value `true`.\r\n */\r\n find<S extends T>(predicate: (value: T) => value is S): S | undefined;\r\n find(predicate: (value: T) => unknown): T | undefined;\r\n\r\n /**\r\n * Returns the index of the first element in the stream that meets the condition, or `-1`\r\n * if there is no such element.\r\n *\r\n * @param predicate This method calls `predicate` once for each element of the stream, in ascending\r\n * order, until it finds one where `predicate` returns a value which is coercible to the\r\n * Boolean value `true`.\r\n */\r\n findIndex(predicate: (value: T) => unknown): number;\r\n\r\n /**\r\n * Determines whether the stream includes a certain element, returning `true` or `false` as appropriate.\r\n *\r\n * @param searchElement The element to search for.\r\n */\r\n includes(searchElement: T): boolean;\r\n\r\n /**\r\n * Calls a defined callback function on each element of the stream and then flattens the result into\r\n * a new stream. This is identical to a `map` followed by `flat` with depth 1.\r\n *\r\n * @param callbackfn Lazily evaluated function mapping stream elements.\r\n */\r\n flatMap<U>(callbackfn: (value: T) => U | Iterable<U>): Stream<U>;\r\n\r\n /**\r\n * Returns a new stream with all sub-stream or sub-array elements concatenated into it recursively up\r\n * to the specified depth.\r\n *\r\n * @param depth The maximum recursion depth. Defaults to 1.\r\n */\r\n flat<D extends number = 1>(depth?: D): FlatStream<T, D>;\r\n\r\n /**\r\n * Returns the first element in the stream, or `undefined` if the stream is empty.\r\n */\r\n head(): T | undefined;\r\n\r\n /**\r\n * Returns a stream that skips the first `skipCount` elements from this stream.\r\n *\r\n * @param skipCount The number of elements to skip. If this is larger than the number of elements in\r\n * the stream, an empty stream is returned. Defaults to 1.\r\n */\r\n tail(skipCount?: number): Stream<T>;\r\n\r\n /**\r\n * Returns a stream consisting of the elements of this stream, truncated to be no longer than `maxSize`\r\n * in length.\r\n *\r\n * @param maxSize The number of elements the stream should be limited to\r\n */\r\n limit(maxSize: number): Stream<T>;\r\n\r\n /**\r\n * Returns a stream containing only the distinct elements from this stream.\r\n * Equality is determined with the same rules as a standard `Set`.\r\n *\r\n * @param by A function returning the key used to check equality with a previous stream element.\r\n * If omitted, the stream elements themselves are used for comparison.\r\n */\r\n distinct<Key = T>(by?: (element: T) => Key): Stream<T>;\r\n\r\n /**\r\n * Returns a stream that contains all elements that don't exist in the {@link other} iterable.\r\n * Equality is determined with the same rules as a standard `Set`.\r\n * @param other The elements that should be exluded from this stream.\r\n * @param key A function returning the key used to check quality.\r\n * If omitted, the stream elements themselves are used for comparison.\r\n */\r\n exclude<Key = T>(other: Iterable<T>, key?: (element: T) => Key): Stream<T>;\r\n\r\n}\r\n\r\nexport type FlatStream<T, Depth extends number> = {\r\n 'done': Stream<T>,\r\n 'recur': T extends Iterable<infer Content>\r\n ? FlatStream<Content, MinusOne<Depth>>\r\n : Stream<T>\r\n}[Depth extends 0 ? 'done' : 'recur'];\r\n\r\nexport type MinusOne<N extends number> = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20][N];\r\n\r\n/**\r\n * The default implementation of `Stream` works with two input functions:\r\n * - The first function creates the initial state of an iteration.\r\n * - The second function gets the current state as argument and returns an `IteratorResult`.\r\n */\r\nexport class StreamImpl<S, T> implements Stream<T> {\r\n protected readonly startFn: () => S;\r\n protected readonly nextFn: (state: S) => IteratorResult<T>;\r\n\r\n constructor(startFn: () => S, nextFn: (state: S) => IteratorResult<T, undefined>) {\r\n this.startFn = startFn;\r\n this.nextFn = nextFn;\r\n }\r\n\r\n iterator(): IterableIterator<T> {\r\n const iterator = {\r\n state: this.startFn(),\r\n next: () => this.nextFn(iterator.state),\r\n [Symbol.iterator]: () => iterator\r\n };\r\n return iterator;\r\n }\r\n\r\n [Symbol.iterator](): Iterator<T> {\r\n return this.iterator();\r\n }\r\n\r\n isEmpty(): boolean {\r\n const iterator = this.iterator();\r\n return Boolean(iterator.next().done);\r\n }\r\n\r\n count(): number {\r\n const iterator = this.iterator();\r\n let count = 0;\r\n let next = iterator.next();\r\n while (!next.done) {\r\n count++;\r\n next = iterator.next();\r\n }\r\n return count;\r\n }\r\n\r\n toArray(): T[] {\r\n const result: T[] = [];\r\n const iterator = this.iterator();\r\n let next: IteratorResult<T>;\r\n do {\r\n next = iterator.next();\r\n if (next.value !== undefined) {\r\n result.push(next.value);\r\n }\r\n } while (!next.done);\r\n return result;\r\n }\r\n\r\n toSet(): Set<T> {\r\n return new Set(this);\r\n }\r\n\r\n toMap<K = T, V = T>(keyFn?: (e: T) => K, valueFn?: (e: T) => V): Map<K, V> {\r\n const entryStream = this.map(element => <[K, V]>[\r\n keyFn ? keyFn(element) : element,\r\n valueFn ? valueFn(element) : element\r\n ]);\r\n return new Map(entryStream);\r\n }\r\n\r\n toString(): string {\r\n return this.join();\r\n }\r\n\r\n concat<T2>(other: Iterable<T2>): Stream<T | T2> {\r\n return new StreamImpl<{ first: S, firstDone: boolean, iterator: Iterator<T2, unknown, undefined> }, T | T2>(\r\n () => ({ first: this.startFn(), firstDone: false, iterator: other[Symbol.iterator]() }),\r\n state => {\r\n let result: IteratorResult<T | T2>;\r\n if (!state.firstDone) {\r\n do {\r\n result = this.nextFn(state.first);\r\n if (!result.done) {\r\n return result;\r\n }\r\n } while (!result.done);\r\n state.firstDone = true;\r\n }\r\n do {\r\n result = state.iterator.next();\r\n if (!result.done) {\r\n return result;\r\n }\r\n } while (!result.done);\r\n return DONE_RESULT;\r\n }\r\n );\r\n }\r\n\r\n join(separator = ','): string {\r\n const iterator = this.iterator();\r\n let value = '';\r\n let result: IteratorResult<T>;\r\n let addSeparator = false;\r\n do {\r\n result = iterator.next();\r\n if (!result.done) {\r\n if (addSeparator) {\r\n value += separator;\r\n }\r\n value += toString(result.value);\r\n }\r\n addSeparator = true;\r\n } while (!result.done);\r\n return value;\r\n }\r\n\r\n indexOf(searchElement: T, fromIndex = 0): number {\r\n const iterator = this.iterator();\r\n let index = 0;\r\n let next = iterator.next();\r\n while (!next.done) {\r\n if (index >= fromIndex && next.value === searchElement) {\r\n return index;\r\n }\r\n next = iterator.next();\r\n index++;\r\n }\r\n return -1;\r\n }\r\n\r\n // In the following definition the '& this' part in the return type is important\r\n // _and_ the order within 'Stream<U> & this' is crucial!\r\n // Otherwise Typescript would infer the type of 'this' as 'StreamImpl<S, T> & Stream<U>'\r\n // (or '<subClass of StreamImpl<S, T> & Stream<U>') and usages like\r\n // ```\r\n // const stream = new StreamImpl(...);\r\n // ... stream.every(<typeGuard>) & stream....\r\n // ```\r\n // cannot benefit from '<typeGuard>', as Typescript would priorize the signatures\r\n // of 'StreamImpl<S, T>' (i.e. those of 'Stream<T>') over those of 'Stream<U>'.\r\n // With the order of 'Stream<U> & this' the signatures of 'Stream<U>' get precedence.\r\n every<U extends T>(predicate: (value: T) => value is U): this is Stream<U> & this;\r\n every(predicate: (value: T) => unknown): boolean;\r\n every(predicate: (value: T) => unknown): boolean {\r\n const iterator = this.iterator();\r\n let next = iterator.next();\r\n while (!next.done) {\r\n if (!predicate(next.value)) {\r\n return false;\r\n }\r\n next = iterator.next();\r\n }\r\n return true;\r\n }\r\n\r\n some(predicate: (value: T) => unknown): boolean {\r\n const iterator = this.iterator();\r\n let next = iterator.next();\r\n while (!next.done) {\r\n if (predicate(next.value)) {\r\n return true;\r\n }\r\n next = iterator.next();\r\n }\r\n return false;\r\n }\r\n\r\n forEach(callbackfn: (value: T, index: number) => void): void {\r\n const iterator = this.iterator();\r\n let index = 0;\r\n let next = iterator.next();\r\n while (!next.done) {\r\n callbackfn(next.value, index);\r\n next = iterator.next();\r\n index++;\r\n }\r\n }\r\n\r\n map<U>(callbackfn: (value: T) => U): Stream<U> {\r\n return new StreamImpl<S, U>(\r\n this.startFn,\r\n (state) => {\r\n const { done, value } = this.nextFn(state);\r\n if (done) {\r\n return DONE_RESULT;\r\n } else {\r\n return { done: false, value: callbackfn(value) };\r\n }\r\n }\r\n );\r\n }\r\n\r\n // for remarks on the return type definition refer to 'every<U extends T>(...)'\r\n filter<U extends T>(predicate: (value: T) => value is U): Stream<U> & this;\r\n filter(predicate: (value: T) => unknown): Stream<T> & this;\r\n filter(predicate: (value: T) => unknown): Stream<T> {\r\n return new StreamImpl<S, T>(\r\n this.startFn,\r\n state => {\r\n let result: IteratorResult<T>;\r\n do {\r\n result = this.nextFn(state);\r\n if (!result.done && predicate(result.value)) {\r\n return result;\r\n }\r\n } while (!result.done);\r\n return DONE_RESULT;\r\n }\r\n );\r\n }\r\n\r\n nonNullable(): Stream<NonNullable<T>> {\r\n return this.filter(e => e !== undefined && e !== null) as Stream<NonNullable<T>>;\r\n }\r\n\r\n reduce(callbackfn: (previousValue: T, currentValue: T) => T): T | undefined;\r\n reduce<U = T>(callbackfn: (previousValue: U, currentValue: T) => U, initialValue: U): U;\r\n reduce<U>(callbackfn: (previousValue: U | T, currentValue: T) => U, initialValue?: U): U | T | undefined {\r\n const iterator = this.iterator();\r\n let previousValue: U | T | undefined = initialValue;\r\n let next = iterator.next();\r\n while (!next.done) {\r\n if (previousValue === undefined) {\r\n previousValue = next.value;\r\n } else {\r\n previousValue = callbackfn(previousValue, next.value);\r\n }\r\n next = iterator.next();\r\n }\r\n return previousValue;\r\n }\r\n\r\n reduceRight(callbackfn: (previousValue: T, currentValue: T) => T): T | undefined;\r\n reduceRight<U = T>(callbackfn: (previousValue: U, currentValue: T) => U, initialValue: U): U;\r\n reduceRight<U>(callbackfn: (previousValue: U | T, currentValue: T) => U, initialValue?: U): U | T | undefined {\r\n return this.recursiveReduce(this.iterator(), callbackfn, initialValue);\r\n }\r\n\r\n protected recursiveReduce<U>(iterator: Iterator<T>, callbackfn: (previousValue: U | T, currentValue: T) => U, initialValue?: U): U | T | undefined {\r\n const next = iterator.next();\r\n if (next.done) {\r\n return initialValue;\r\n }\r\n const previousValue = this.recursiveReduce(iterator, callbackfn, initialValue);\r\n if (previousValue === undefined) {\r\n return next.value;\r\n }\r\n return callbackfn(previousValue, next.value);\r\n }\r\n\r\n find<S extends T>(predicate: (value: T) => value is S): S | undefined;\r\n find(predicate: (value: T) => unknown): T | undefined;\r\n find(predicate: (value: T) => unknown): T | undefined {\r\n const iterator = this.iterator();\r\n let next = iterator.next();\r\n while (!next.done) {\r\n if (predicate(next.value)) {\r\n return next.value;\r\n }\r\n next = iterator.next();\r\n }\r\n return undefined;\r\n }\r\n\r\n findIndex(predicate: (value: T) => unknown): number {\r\n const iterator = this.iterator();\r\n let index = 0;\r\n let next = iterator.next();\r\n while (!next.done) {\r\n if (predicate(next.value)) {\r\n return index;\r\n }\r\n next = iterator.next();\r\n index++;\r\n }\r\n return -1;\r\n }\r\n\r\n includes(searchElement: T): boolean {\r\n const iterator = this.iterator();\r\n let next = iterator.next();\r\n while (!next.done) {\r\n if (next.value === searchElement) {\r\n return true;\r\n }\r\n next = iterator.next();\r\n }\r\n return false;\r\n }\r\n\r\n flatMap<U>(callbackfn: (value: T) => U | Iterable<U>): Stream<U> {\r\n type FlatMapState = { this: S, iterator?: Iterator<U, undefined> }\r\n return new StreamImpl<FlatMapState, U>(\r\n () => ({ this: this.startFn() }),\r\n (state) => {\r\n do {\r\n if (state.iterator) {\r\n const next = state.iterator.next();\r\n if (next.done) {\r\n state.iterator = undefined;\r\n } else {\r\n return next;\r\n }\r\n }\r\n const { done, value } = this.nextFn(state.this);\r\n if (!done) {\r\n const mapped = callbackfn(value);\r\n if (isIterable(mapped)) {\r\n state.iterator = mapped[Symbol.iterator]();\r\n } else {\r\n return { done: false, value: mapped };\r\n }\r\n }\r\n } while (state.iterator);\r\n return DONE_RESULT;\r\n }\r\n );\r\n }\r\n\r\n flat<D extends number = 1>(depth?: D): FlatStream<T, D> {\r\n if (depth === undefined) {\r\n depth = 1 as D;\r\n }\r\n if (depth <= 0) {\r\n return this as unknown as FlatStream<T, D>;\r\n }\r\n const stream = depth > 1 ? this.flat(depth - 1) as unknown as StreamImpl<S, T> : this;\r\n type FlatMapState = { this: S, iterator?: Iterator<T, undefined> }\r\n return new StreamImpl<FlatMapState, T>(\r\n () => ({ this: stream.startFn() }),\r\n (state) => {\r\n do {\r\n if (state.iterator) {\r\n const next = state.iterator.next();\r\n if (next.done) {\r\n state.iterator = undefined;\r\n } else {\r\n return next;\r\n }\r\n }\r\n const { done, value } = stream.nextFn(state.this);\r\n if (!done) {\r\n if (isIterable(value)) {\r\n state.iterator = value[Symbol.iterator]() as Iterator<T>;\r\n } else {\r\n return { done: false, value: value };\r\n }\r\n }\r\n } while (state.iterator);\r\n return DONE_RESULT;\r\n }\r\n ) as unknown as FlatStream<T, D>;\r\n }\r\n\r\n head(): T | undefined {\r\n const iterator = this.iterator();\r\n const result = iterator.next();\r\n if (result.done) {\r\n return undefined;\r\n }\r\n return result.value;\r\n }\r\n\r\n tail(skipCount = 1): Stream<T> {\r\n return new StreamImpl<S, T>(\r\n () => {\r\n const state = this.startFn();\r\n for (let i = 0; i < skipCount; i++) {\r\n const next = this.nextFn(state);\r\n if (next.done) {\r\n return state;\r\n }\r\n }\r\n return state;\r\n },\r\n this.nextFn\r\n );\r\n }\r\n\r\n limit(maxSize: number): Stream<T> {\r\n return new StreamImpl<{ size: number, state: S }, T>(\r\n () => ({ size: 0, state: this.startFn() }),\r\n state => {\r\n state.size++;\r\n if (state.size > maxSize) {\r\n return DONE_RESULT;\r\n }\r\n return this.nextFn(state.state);\r\n }\r\n );\r\n }\r\n\r\n distinct<Key = T>(by?: (element: T) => Key): Stream<T> {\r\n return new StreamImpl<{ set: Set<Key | T>, internalState: S }, T>(\r\n () => ({ set: new Set<Key | T>(), internalState: this.startFn() }),\r\n state => {\r\n let result: IteratorResult<T>;\r\n do {\r\n result = this.nextFn(state.internalState);\r\n if (!result.done) {\r\n const value = by ? by(result.value) : result.value;\r\n if (!state.set.has(value)) {\r\n state.set.add(value);\r\n return result;\r\n }\r\n }\r\n } while (!result.done);\r\n return DONE_RESULT;\r\n }\r\n );\r\n }\r\n\r\n exclude<Key = T>(other: Iterable<T>, key?: (element: T) => Key): Stream<T> {\r\n const otherKeySet = new Set<Key | T>();\r\n for (const item of other) {\r\n const value = key ? key(item) : item;\r\n otherKeySet.add(value);\r\n }\r\n return this.filter(e => {\r\n const ownKey = key ? key(e) : e;\r\n return !otherKeySet.has(ownKey);\r\n });\r\n }\r\n}\r\n\r\nfunction toString(item: unknown): string {\r\n if (typeof item === 'string') {\r\n return item as string;\r\n }\r\n if (typeof item === 'undefined') {\r\n return 'undefined';\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n if (typeof (item as any).toString === 'function') {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return (item as any).toString();\r\n }\r\n return Object.prototype.toString.call(item);\r\n}\r\n\r\nfunction isIterable<T>(obj: unknown): obj is Iterable<T> {\r\n return !!obj && typeof (obj as Iterable<T>)[Symbol.iterator] === 'function';\r\n}\r\n\r\n/**\r\n * An empty stream of any type.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport const EMPTY_STREAM: Stream<any> = new StreamImpl<undefined, any>(() => undefined, () => DONE_RESULT);\r\n\r\n/**\r\n * Use this `IteratorResult` when implementing a `StreamImpl` to indicate that there are no more elements in the stream.\r\n */\r\nexport const DONE_RESULT: IteratorReturnResult<undefined> = Object.freeze({ done: true, value: undefined });\r\n\r\n/**\r\n * Create a stream from one or more iterables or array-likes.\r\n */\r\nexport function stream<T>(...collections: Array<Iterable<T> | ArrayLike<T>>): Stream<T> {\r\n if (collections.length === 1) {\r\n const collection = collections[0];\r\n if (collection instanceof StreamImpl) {\r\n return collection as Stream<T>;\r\n }\r\n if (isIterable(collection)) {\r\n return new StreamImpl<Iterator<T, undefined>, T>(\r\n () => collection[Symbol.iterator](),\r\n (iterator) => iterator.next()\r\n );\r\n }\r\n if (typeof collection.length === 'number') {\r\n return new StreamImpl<{ index: number }, T>(\r\n () => ({ index: 0 }),\r\n (state) => {\r\n if (state.index < collection.length) {\r\n return { done: false, value: collection[state.index++] };\r\n } else {\r\n return DONE_RESULT;\r\n }\r\n }\r\n );\r\n }\r\n }\r\n if (collections.length > 1) {\r\n type State = { collIndex: number, iterator?: Iterator<T, undefined>, array?: ArrayLike<T>, arrIndex: number };\r\n return new StreamImpl<State, T>(\r\n () => ({ collIndex: 0, arrIndex: 0 }),\r\n (state) => {\r\n do {\r\n if (state.iterator) {\r\n const next = state.iterator.next();\r\n if (!next.done) {\r\n return next;\r\n }\r\n state.iterator = undefined;\r\n }\r\n if (state.array) {\r\n if (state.arrIndex < state.array.length) {\r\n return { done: false, value: state.array[state.arrIndex++] };\r\n }\r\n state.array = undefined;\r\n state.arrIndex = 0;\r\n }\r\n if (state.collIndex < collections.length) {\r\n const collection = collections[state.collIndex++];\r\n if (isIterable(collection)) {\r\n state.iterator = collection[Symbol.iterator]();\r\n } else if (collection && typeof collection.length === 'number') {\r\n state.array = collection;\r\n }\r\n }\r\n } while (state.iterator || state.array || state.collIndex < collections.length);\r\n return DONE_RESULT;\r\n }\r\n );\r\n }\r\n return EMPTY_STREAM;\r\n}\r\n\r\n/**\r\n * A tree iterator adds the ability to prune the current iteration.\r\n */\r\nexport interface TreeIterator<T> extends IterableIterator<T> {\r\n /**\r\n * Skip the whole subtree below the last returned element. The iteration continues as if that\r\n * element had no children.\r\n */\r\n prune(): void\r\n}\r\n\r\n/**\r\n * A tree stream is used to stream the elements of a tree, for example an AST or CST.\r\n */\r\nexport interface TreeStream<T> extends Stream<T> {\r\n iterator(): TreeIterator<T>\r\n}\r\n\r\n/**\r\n * The default implementation of `TreeStream` takes a root element and a function that computes the\r\n * children of its argument. Whether the root node included in the stream is controlled with the\r\n * `includeRoot` option, which defaults to `false`.\r\n */\r\nexport class TreeStreamImpl<T>\r\n extends StreamImpl<{ iterators: Array<Iterator<T>>, pruned: boolean }, T>\r\n implements TreeStream<T> {\r\n\r\n constructor(root: T, children: (node: T) => Iterable<T>, options?: { includeRoot?: boolean }) {\r\n super(\r\n () => ({\r\n iterators: options?.includeRoot ? [[root][Symbol.iterator]()] : [children(root)[Symbol.iterator]()],\r\n pruned: false\r\n }),\r\n state => {\r\n if (state.pruned) {\r\n state.iterators.pop();\r\n state.pruned = false;\r\n }\r\n while (state.iterators.length > 0) {\r\n const iterator = state.iterators[state.iterators.length - 1];\r\n const next = iterator.next();\r\n if (next.done) {\r\n state.iterators.pop();\r\n } else {\r\n state.iterators.push(children(next.value)[Symbol.iterator]());\r\n return next;\r\n }\r\n }\r\n return DONE_RESULT;\r\n }\r\n );\r\n }\r\n\r\n override iterator(): TreeIterator<T> {\r\n const iterator = {\r\n state: this.startFn(),\r\n next: () => this.nextFn(iterator.state),\r\n prune: () => {\r\n iterator.state.pruned = true;\r\n },\r\n [Symbol.iterator]: () => iterator\r\n };\r\n return iterator;\r\n }\r\n}\r\n\r\n/**\r\n * A set of utility functions that reduce a stream to a single value.\r\n */\r\nexport namespace Reduction {\r\n\r\n /**\r\n * Compute the sum of a number stream.\r\n */\r\n export function sum(stream: Stream<number>): number {\r\n return stream.reduce((a, b) => a + b, 0);\r\n }\r\n\r\n /**\r\n * Compute the product of a number stream.\r\n */\r\n export function product(stream: Stream<number>): number {\r\n return stream.reduce((a, b) => a * b, 0);\r\n }\r\n\r\n /**\r\n * Compute the minimum of a number stream. Returns `undefined` if the stream is empty.\r\n */\r\n export function min(stream: Stream<number>): number | undefined {\r\n return stream.reduce((a, b) => Math.min(a, b));\r\n }\r\n\r\n /**\r\n * Compute the maximum of a number stream. Returns `undefined` if the stream is empty.\r\n */\r\n export function max(stream: Stream<number>): number | undefined {\r\n return stream.reduce((a, b) => Math.max(a, b));\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021-2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { assertUnreachable } from '../utils/errors.js';\r\nimport * as ast from '../languages/generated/ast.js';\r\nimport type { AstNode, CstNode } from '../syntax-tree.js';\r\nimport { isCompositeCstNode } from '../syntax-tree.js';\r\nimport { getContainerOfType, streamAllContents } from './ast-utils.js';\r\nimport { streamCst } from './cst-utils.js';\r\nimport { escapeRegExp, isWhitespace } from './regexp-utils.js';\r\n\r\n/**\r\n * Returns the entry rule of the given grammar, if any. If the grammar file does not contain an entry rule,\r\n * the result is `undefined`.\r\n */\r\nexport function getEntryRule(grammar: ast.Grammar): ast.ParserRule | undefined {\r\n return grammar.rules.find(e => ast.isParserRule(e) && e.entry) as ast.ParserRule;\r\n}\r\n\r\n/**\r\n * Returns all hidden terminal rules of the given grammar, if any.\r\n */\r\nexport function getHiddenRules(grammar: ast.Grammar) {\r\n return grammar.rules.filter((e): e is ast.TerminalRule => ast.isTerminalRule(e) && e.hidden);\r\n}\r\n\r\n/**\r\n * Returns all rules that can be reached from the topmost rules of the specified grammar (entry and hidden terminal rules).\r\n *\r\n * @param grammar The grammar that contains all rules\r\n * @param allTerminals Whether or not to include terminals that are referenced only by other terminals\r\n * @returns A list of referenced parser and terminal rules. If the grammar contains no entry rule,\r\n * this function returns all rules of the specified grammar.\r\n */\r\nexport function getAllReachableRules(grammar: ast.Grammar, allTerminals: boolean): Set<ast.AbstractRule> {\r\n const ruleNames = new Set<string>();\r\n const entryRule = getEntryRule(grammar);\r\n if (!entryRule) {\r\n return new Set(grammar.rules);\r\n }\r\n\r\n const topMostRules = [entryRule as ast.AbstractRule].concat(getHiddenRules(grammar));\r\n for (const rule of topMostRules) {\r\n ruleDfs(rule, ruleNames, allTerminals);\r\n }\r\n\r\n const rules = new Set<ast.AbstractRule>();\r\n for (const rule of grammar.rules) {\r\n if (ruleNames.has(rule.name) || (ast.isTerminalRule(rule) && rule.hidden)) {\r\n rules.add(rule);\r\n }\r\n }\r\n return rules;\r\n}\r\n\r\nfunction ruleDfs(rule: ast.AbstractRule, visitedSet: Set<string>, allTerminals: boolean): void {\r\n visitedSet.add(rule.name);\r\n streamAllContents(rule).forEach(node => {\r\n if (ast.isRuleCall(node) || (allTerminals && ast.isTerminalRuleCall(node))) {\r\n const refRule = node.rule.ref;\r\n if (refRule && !visitedSet.has(refRule.name)) {\r\n ruleDfs(refRule, visitedSet, allTerminals);\r\n }\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Determines the grammar expression used to parse a cross-reference (usually a reference to a terminal rule).\r\n * A cross-reference can declare this expression explicitly in the form `[Type : Terminal]`, but if `Terminal`\r\n * is omitted, this function attempts to infer it from the name of the referenced `Type` (using `findNameAssignment`).\r\n *\r\n * Returns the grammar expression used to parse the given cross-reference, or `undefined` if it is not declared\r\n * and cannot be inferred.\r\n */\r\nexport function getCrossReferenceTerminal(crossRef: ast.CrossReference): ast.AbstractElement | undefined {\r\n if (crossRef.terminal) {\r\n return crossRef.terminal;\r\n } else if (crossRef.type.ref) {\r\n const nameAssigment = findNameAssignment(crossRef.type.ref);\r\n return nameAssigment?.terminal;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Determines whether the given terminal rule represents a comment. This is true if the rule is marked\r\n * as `hidden` and it does not match white space. This means every hidden token (i.e. excluded from the AST)\r\n * that contains visible characters is considered a comment.\r\n */\r\nexport function isCommentTerminal(terminalRule: ast.TerminalRule): boolean {\r\n return terminalRule.hidden && !isWhitespace(terminalRegex(terminalRule));\r\n}\r\n\r\n/**\r\n * Find all CST nodes within the given node that contribute to the specified property.\r\n *\r\n * @param node A CST node in which to look for property assignments. If this is undefined, the result is an empty array.\r\n * @param property A property name of the constructed AST node. If this is undefined, the result is an empty array.\r\n */\r\nexport function findNodesForProperty(node: CstNode | undefined, property: string | undefined): CstNode[] {\r\n if (!node || !property) {\r\n return [];\r\n }\r\n return findNodesForPropertyInternal(node, property, node.astNode, true);\r\n}\r\n\r\n/**\r\n * Find a single CST node within the given node that contributes to the specified property.\r\n *\r\n * @param node A CST node in which to look for property assignments. If this is undefined, the result is `undefined`.\r\n * @param property A property name of the constructed AST node. If this is undefined, the result is `undefined`.\r\n * @param index If no index is specified or the index is less than zero, the first found node is returned. If the\r\n * specified index exceeds the number of assignments to the property, the last found node is returned. Otherwise,\r\n * the node with the specified index is returned.\r\n */\r\nexport function findNodeForProperty(node: CstNode | undefined, property: string | undefined, index?: number): CstNode | undefined {\r\n if (!node || !property) {\r\n return undefined;\r\n }\r\n const nodes = findNodesForPropertyInternal(node, property, node.astNode, true);\r\n if (nodes.length === 0) {\r\n return undefined;\r\n }\r\n if (index !== undefined) {\r\n index = Math.max(0, Math.min(index, nodes.length - 1));\r\n } else {\r\n index = 0;\r\n }\r\n return nodes[index];\r\n}\r\n\r\nfunction findNodesForPropertyInternal(node: CstNode, property: string, element: AstNode | undefined, first: boolean): CstNode[] {\r\n if (!first) {\r\n const nodeFeature = getContainerOfType(node.grammarSource, ast.isAssignment);\r\n if (nodeFeature && nodeFeature.feature === property) {\r\n return [node];\r\n }\r\n }\r\n if (isCompositeCstNode(node) && node.astNode === element) {\r\n return node.content.flatMap(e => findNodesForPropertyInternal(e, property, element, false));\r\n }\r\n return [];\r\n}\r\n\r\n/**\r\n * Find all CST nodes within the given node that correspond to the specified keyword.\r\n *\r\n * @param node A CST node in which to look for keywords. If this is undefined, the result is an empty array.\r\n * @param keyword A keyword as specified in the grammar.\r\n */\r\nexport function findNodesForKeyword(node: CstNode | undefined, keyword: string): CstNode[] {\r\n if (!node) {\r\n return [];\r\n }\r\n return findNodesForKeywordInternal(node, keyword, node?.astNode);\r\n}\r\n\r\n/**\r\n * Find a single CST node within the given node that corresponds to the specified keyword.\r\n *\r\n * @param node A CST node in which to look for keywords. If this is undefined, the result is `undefined`.\r\n * @param keyword A keyword as specified in the grammar.\r\n * @param index If no index is specified or the index is less than zero, the first found node is returned. If the\r\n * specified index exceeds the number of keyword occurrences, the last found node is returned. Otherwise,\r\n * the node with the specified index is returned.\r\n */\r\nexport function findNodeForKeyword(node: CstNode | undefined, keyword: string, index?: number): CstNode | undefined {\r\n if (!node) {\r\n return undefined;\r\n }\r\n const nodes = findNodesForKeywordInternal(node, keyword, node?.astNode);\r\n if (nodes.length === 0) {\r\n return undefined;\r\n }\r\n if (index !== undefined) {\r\n index = Math.max(0, Math.min(index, nodes.length - 1));\r\n } else {\r\n index = 0;\r\n }\r\n return nodes[index];\r\n}\r\n\r\nexport function findNodesForKeywordInternal(node: CstNode, keyword: string, element: AstNode | undefined): CstNode[] {\r\n if (node.astNode !== element) {\r\n return [];\r\n }\r\n if (ast.isKeyword(node.grammarSource) && node.grammarSource.value === keyword) {\r\n return [node];\r\n }\r\n const treeIterator = streamCst(node).iterator();\r\n let result: IteratorResult<CstNode>;\r\n const keywordNodes: CstNode[] = [];\r\n do {\r\n result = treeIterator.next();\r\n if (!result.done) {\r\n const childNode = result.value;\r\n if (childNode.astNode === element) {\r\n if (ast.isKeyword(childNode.grammarSource) && childNode.grammarSource.value === keyword) {\r\n keywordNodes.push(childNode);\r\n }\r\n } else {\r\n treeIterator.prune();\r\n }\r\n }\r\n } while (!result.done);\r\n return keywordNodes;\r\n}\r\n\r\n/**\r\n * If the given CST node was parsed in the context of a property assignment, the respective `Assignment` grammar\r\n * node is returned. If no assignment is found, the result is `undefined`.\r\n *\r\n * @param cstNode A CST node for which to find a property assignment.\r\n */\r\nexport function findAssignment(cstNode: CstNode): ast.Assignment | undefined {\r\n const astNode = cstNode.astNode;\r\n // Only search until the ast node of the parent cst node is no longer the original ast node\r\n // This would make us jump to a preceding rule call, which contains only unrelated assignments\r\n while (astNode === cstNode.container?.astNode) {\r\n const assignment = getContainerOfType(cstNode.grammarSource, ast.isAssignment);\r\n if (assignment) {\r\n return assignment;\r\n }\r\n cstNode = cstNode.container;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Find an assignment to the `name` property for the given grammar type. This requires the `type` to be inferred\r\n * from a parser rule, and that rule must contain an assignment to the `name` property. In all other cases,\r\n * this function returns `undefined`.\r\n */\r\nexport function findNameAssignment(type: ast.AbstractType): ast.Assignment | undefined {\r\n let startNode: AstNode = type;\r\n if (ast.isInferredType(startNode)) {\r\n // for inferred types, the location to start searching for the name-assignment is different\r\n if (ast.isAction(startNode.$container)) {\r\n // a type which is explicitly inferred by an action: investigate the sibbling of the Action node, i.e. start searching at the Action's parent\r\n startNode = startNode.$container.$container!;\r\n } else if (ast.isParserRule(startNode.$container)) {\r\n // investigate the parser rule with the explicitly inferred type\r\n startNode = startNode.$container;\r\n } else {\r\n assertUnreachable(startNode.$container);\r\n }\r\n }\r\n return findNameAssignmentInternal(type, startNode, new Map());\r\n}\r\n\r\nfunction findNameAssignmentInternal(type: ast.AbstractType, startNode: AstNode, cache: Map<ast.AbstractType, ast.Assignment | undefined>): ast.Assignment | undefined {\r\n // the cache is only required to prevent infinite loops\r\n function go(node: AstNode, refType: ast.AbstractType): ast.Assignment | undefined {\r\n let childAssignment: ast.Assignment | undefined = undefined;\r\n const parentAssignment = getContainerOfType(node, ast.isAssignment);\r\n // No parent assignment implies unassigned rule call\r\n if (!parentAssignment) {\r\n childAssignment = findNameAssignmentInternal(refType, refType, cache);\r\n }\r\n cache.set(type, childAssignment);\r\n return childAssignment;\r\n }\r\n\r\n if (cache.has(type)) {\r\n return cache.get(type);\r\n }\r\n cache.set(type, undefined);\r\n for (const node of streamAllContents(startNode)) {\r\n if (ast.isAssignment(node) && node.feature.toLowerCase() === 'name') {\r\n cache.set(type, node);\r\n return node;\r\n } else if (ast.isRuleCall(node) && ast.isParserRule(node.rule.ref)) {\r\n return go(node, node.rule.ref);\r\n } else if (ast.isSimpleType(node) && node.typeRef?.ref) {\r\n return go(node, node.typeRef.ref);\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getActionAtElement(element: ast.AbstractElement): ast.Action | undefined {\r\n const parent = element.$container;\r\n if (ast.isGroup(parent)) {\r\n const elements = parent.elements;\r\n const index = elements.indexOf(element);\r\n for (let i = index - 1; i >= 0; i--) {\r\n const item = elements[i];\r\n if (ast.isAction(item)) {\r\n return item;\r\n } else {\r\n const action = streamAllContents(elements[i]).find(ast.isAction);\r\n if (action) {\r\n return action;\r\n }\r\n }\r\n }\r\n }\r\n if (ast.isAbstractElement(parent)) {\r\n return getActionAtElement(parent);\r\n } else {\r\n return undefined;\r\n }\r\n}\r\n\r\nexport type Cardinality = '?' | '*' | '+' | undefined;\r\nexport type Operator = '=' | '+=' | '?=' | undefined;\r\n\r\nexport function isOptionalCardinality(cardinality?: Cardinality, element?: ast.AbstractElement): boolean {\r\n return cardinality === '?' || cardinality === '*' || (ast.isGroup(element) && Boolean(element.guardCondition));\r\n}\r\n\r\nexport function isArrayCardinality(cardinality?: Cardinality): boolean {\r\n return cardinality === '*' || cardinality === '+';\r\n}\r\n\r\nexport function isArrayOperator(operator?: Operator): boolean {\r\n return operator === '+=';\r\n}\r\n\r\n/**\r\n * Determines whether the given parser rule is a _data type rule_, meaning that it has a\r\n * primitive return type like `number`, `boolean`, etc.\r\n */\r\nexport function isDataTypeRule(rule: ast.ParserRule): boolean {\r\n return isDataTypeRuleInternal(rule, new Set());\r\n}\r\n\r\nfunction isDataTypeRuleInternal(rule: ast.ParserRule, visited: Set<ast.ParserRule>): boolean {\r\n if (visited.has(rule)) {\r\n return true;\r\n } else {\r\n visited.add(rule);\r\n }\r\n for (const node of streamAllContents(rule)) {\r\n if (ast.isRuleCall(node)) {\r\n if (!node.rule.ref) {\r\n // RuleCall to unresolved rule. Don't assume `rule` is a DataType rule.\r\n return false;\r\n }\r\n if (ast.isParserRule(node.rule.ref) && !isDataTypeRuleInternal(node.rule.ref, visited)) {\r\n return false;\r\n }\r\n } else if (ast.isAssignment(node)) {\r\n return false;\r\n } else if (ast.isAction(node)) {\r\n return false;\r\n }\r\n }\r\n return Boolean(rule.definition);\r\n}\r\n\r\nexport function isDataType(type: ast.Type): boolean {\r\n return isDataTypeInternal(type.type, new Set());\r\n}\r\n\r\nfunction isDataTypeInternal(type: ast.TypeDefinition, visited: Set<ast.TypeDefinition>): boolean {\r\n if (visited.has(type)) {\r\n return true;\r\n } else {\r\n visited.add(type);\r\n }\r\n if (ast.isArrayType(type)) {\r\n return false;\r\n } else if (ast.isReferenceType(type)) {\r\n return false;\r\n } else if (ast.isUnionType(type)) {\r\n return type.types.every(e => isDataTypeInternal(e, visited));\r\n } else if (ast.isSimpleType(type)) {\r\n if (type.primitiveType !== undefined) {\r\n return true;\r\n } else if (type.stringType !== undefined) {\r\n return true;\r\n } else if (type.typeRef !== undefined) {\r\n const ref = type.typeRef.ref;\r\n if (ast.isType(ref)) {\r\n return isDataTypeInternal(ref.type, visited);\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\nexport function getExplicitRuleType(rule: ast.ParserRule): string | undefined {\r\n if (rule.inferredType) {\r\n return rule.inferredType.name;\r\n } else if (rule.dataType) {\r\n return rule.dataType;\r\n } else if (rule.returnType) {\r\n const refType = rule.returnType.ref;\r\n if (refType) {\r\n // check if we need to check Action as return type\r\n if (ast.isParserRule(refType)) {\r\n return refType.name;\r\n } else if (ast.isInterface(refType) || ast.isType(refType)) {\r\n return refType.name;\r\n }\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getTypeName(type: ast.AbstractType | ast.Action): string {\r\n if (ast.isParserRule(type)) {\r\n return isDataTypeRule(type) ? type.name : getExplicitRuleType(type) ?? type.name;\r\n } else if (ast.isInterface(type) || ast.isType(type) || ast.isReturnType(type)) {\r\n return type.name;\r\n } else if (ast.isAction(type)) {\r\n const actionType = getActionType(type);\r\n if (actionType) {\r\n return actionType;\r\n }\r\n } else if (ast.isInferredType(type)) {\r\n return type.name;\r\n }\r\n throw new Error('Cannot get name of Unknown Type');\r\n}\r\n\r\nexport function getActionType(action: ast.Action): string | undefined {\r\n if (action.inferredType) {\r\n return action.inferredType.name;\r\n } else if (action.type?.ref) {\r\n return getTypeName(action.type.ref);\r\n }\r\n return undefined; // not inferring and not referencing a valid type\r\n}\r\n\r\n/**\r\n * This function is used at development time (for code generation and the internal type system) to get the type of the AST node produced by the given rule.\r\n * For data type rules, the name of the rule is returned,\r\n * e.g. \"INT_value returns number: MY_INT;\" returns \"INT_value\".\r\n * @param rule the given rule\r\n * @returns the name of the AST node type of the rule\r\n */\r\nexport function getRuleTypeName(rule: ast.AbstractRule): string {\r\n if (ast.isTerminalRule(rule)) {\r\n return rule.type?.name ?? 'string';\r\n } else {\r\n return isDataTypeRule(rule) ? rule.name : getExplicitRuleType(rule) ?? rule.name;\r\n }\r\n}\r\n\r\n/**\r\n * This function is used at runtime to get the actual type of the values produced by the given rule at runtime.\r\n * For data type rules, the name of the declared return type of the rule is returned (if any),\r\n * e.g. \"INT_value returns number: MY_INT;\" returns \"number\".\r\n * @param rule the given rule\r\n * @returns the name of the type of the produced values of the rule at runtime\r\n */\r\nexport function getRuleType(rule: ast.AbstractRule): string {\r\n if (ast.isTerminalRule(rule)) {\r\n return rule.type?.name ?? 'string';\r\n } else {\r\n return getExplicitRuleType(rule) ?? rule.name;\r\n }\r\n}\r\n\r\nexport function terminalRegex(terminalRule: ast.TerminalRule): RegExp {\r\n const flags: Flags = {\r\n s: false,\r\n i: false,\r\n u: false\r\n };\r\n const source = abstractElementToRegex(terminalRule.definition, flags);\r\n const flagText = Object.entries(flags).filter(([, value]) => value).map(([name]) => name).join('');\r\n return new RegExp(source, flagText);\r\n}\r\n\r\n// Using [\\s\\S]* allows to match everything, compared to . which doesn't match line terminators\r\nconst WILDCARD = /[\\s\\S]/.source;\r\n\r\ntype Flags = {\r\n s: boolean;\r\n i: boolean;\r\n u: boolean;\r\n}\r\n\r\nfunction abstractElementToRegex(element: ast.AbstractElement, flags?: Flags): string {\r\n if (ast.isTerminalAlternatives(element)) {\r\n return terminalAlternativesToRegex(element);\r\n } else if (ast.isTerminalGroup(element)) {\r\n return terminalGroupToRegex(element);\r\n } else if (ast.isCharacterRange(element)) {\r\n return characterRangeToRegex(element);\r\n } else if (ast.isTerminalRuleCall(element)) {\r\n const rule = element.rule.ref;\r\n if (!rule) {\r\n throw new Error('Missing rule reference.');\r\n }\r\n return withCardinality(abstractElementToRegex(rule.definition), {\r\n cardinality: element.cardinality,\r\n lookahead: element.lookahead\r\n });\r\n } else if (ast.isNegatedToken(element)) {\r\n return negateTokenToRegex(element);\r\n } else if (ast.isUntilToken(element)) {\r\n return untilTokenToRegex(element);\r\n } else if (ast.isRegexToken(element)) {\r\n const lastSlash = element.regex.lastIndexOf('/');\r\n const source = element.regex.substring(1, lastSlash);\r\n const regexFlags = element.regex.substring(lastSlash + 1);\r\n if (flags) {\r\n flags.i = regexFlags.includes('i');\r\n flags.s = regexFlags.includes('s');\r\n flags.u = regexFlags.includes('u');\r\n }\r\n return withCardinality(source, {\r\n cardinality: element.cardinality,\r\n lookahead: element.lookahead,\r\n wrap: false\r\n });\r\n } else if (ast.isWildcard(element)) {\r\n return withCardinality(WILDCARD, {\r\n cardinality: element.cardinality,\r\n lookahead: element.lookahead\r\n });\r\n } else {\r\n throw new Error(`Invalid terminal element: ${element?.$type}`);\r\n }\r\n}\r\n\r\nfunction terminalAlternativesToRegex(alternatives: ast.TerminalAlternatives): string {\r\n return withCardinality(alternatives.elements.map(e => abstractElementToRegex(e)).join('|'), {\r\n cardinality: alternatives.cardinality,\r\n lookahead: alternatives.lookahead\r\n });\r\n}\r\n\r\nfunction terminalGroupToRegex(group: ast.TerminalGroup): string {\r\n return withCardinality(group.elements.map(e => abstractElementToRegex(e)).join(''), {\r\n cardinality: group.cardinality,\r\n lookahead: group.lookahead\r\n });\r\n}\r\n\r\nfunction untilTokenToRegex(until: ast.UntilToken): string {\r\n return withCardinality(`${WILDCARD}*?${abstractElementToRegex(until.terminal)}`, {\r\n cardinality: until.cardinality,\r\n lookahead: until.lookahead\r\n });\r\n}\r\n\r\nfunction negateTokenToRegex(negate: ast.NegatedToken): string {\r\n return withCardinality(`(?!${abstractElementToRegex(negate.terminal)})${WILDCARD}*?`, {\r\n cardinality: negate.cardinality,\r\n lookahead: negate.lookahead\r\n });\r\n}\r\n\r\nfunction characterRangeToRegex(range: ast.CharacterRange): string {\r\n if (range.right) {\r\n return withCardinality(`[${keywordToRegex(range.left)}-${keywordToRegex(range.right)}]`, {\r\n cardinality: range.cardinality,\r\n lookahead: range.lookahead,\r\n wrap: false\r\n });\r\n }\r\n return withCardinality(keywordToRegex(range.left), {\r\n cardinality: range.cardinality,\r\n lookahead: range.lookahead,\r\n wrap: false\r\n });\r\n}\r\n\r\nfunction keywordToRegex(keyword: ast.Keyword): string {\r\n return escapeRegExp(keyword.value);\r\n}\r\n\r\nfunction withCardinality(regex: string, options: {\r\n cardinality?: string\r\n wrap?: boolean\r\n lookahead?: string\r\n}): string {\r\n if (options.wrap !== false || options.lookahead) {\r\n regex = `(${options.lookahead ?? ''}${regex})`;\r\n }\r\n if (options.cardinality) {\r\n return `${regex}${options.cardinality}`;\r\n }\r\n return regex;\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { CstNode } from '../syntax-tree.js';\r\n\r\nexport class ErrorWithLocation extends Error {\r\n constructor(node: CstNode | undefined, message: string) {\r\n super(node ? `${message} at ${node.range.start.line}:${node.range.start.character}` : message);\r\n }\r\n}\r\n\r\nexport function assertUnreachable(_: never): never {\r\n throw new Error('Error! The input value was not handled.');\r\n}\r\n", "/******************************************************************************\r\n * This file was generated by langium-cli 3.3.0.\r\n * DO NOT EDIT MANUALLY!\r\n ******************************************************************************/\r\n\r\n/* eslint-disable */\r\nimport type { AstNode, Reference, ReferenceInfo, TypeMetaData } from '../../syntax-tree.js';\r\nimport { AbstractAstReflection } from '../../syntax-tree.js';\r\n\r\nexport const LangiumGrammarTerminals = {\r\n ID: /\\^?[_a-zA-Z][\\w_]*/,\r\n STRING: /\"(\\\\.|[^\"\\\\])*\"|'(\\\\.|[^'\\\\])*'/,\r\n NUMBER: /NaN|-?((\\d*\\.\\d+|\\d+)([Ee][+-]?\\d+)?|Infinity)/,\r\n RegexLiteral: /\\/(?![*+?])(?:[^\\r\\n\\[/\\\\]|\\\\.|\\[(?:[^\\r\\n\\]\\\\]|\\\\.)*\\])+\\/[a-z]*/,\r\n WS: /\\s+/,\r\n ML_COMMENT: /\\/\\*[\\s\\S]*?\\*\\//,\r\n SL_COMMENT: /\\/\\/[^\\n\\r]*/,\r\n};\r\n\r\nexport type LangiumGrammarTerminalNames = keyof typeof LangiumGrammarTerminals;\r\n\r\nexport type LangiumGrammarKeywordNames = \r\n | \"!\"\r\n | \"&\"\r\n | \"(\"\r\n | \")\"\r\n | \"*\"\r\n | \"+\"\r\n | \"+=\"\r\n | \",\"\r\n | \"->\"\r\n | \".\"\r\n | \"..\"\r\n | \":\"\r\n | \";\"\r\n | \"<\"\r\n | \"=\"\r\n | \"=>\"\r\n | \">\"\r\n | \"?\"\r\n | \"?!\"\r\n | \"?<!\"\r\n | \"?<=\"\r\n | \"?=\"\r\n | \"@\"\r\n | \"Date\"\r\n | \"EOF\"\r\n | \"[\"\r\n | \"]\"\r\n | \"bigint\"\r\n | \"boolean\"\r\n | \"current\"\r\n | \"entry\"\r\n | \"extends\"\r\n | \"false\"\r\n | \"fragment\"\r\n | \"grammar\"\r\n | \"hidden\"\r\n | \"import\"\r\n | \"infer\"\r\n | \"infers\"\r\n | \"interface\"\r\n | \"number\"\r\n | \"returns\"\r\n | \"string\"\r\n | \"terminal\"\r\n | \"true\"\r\n | \"type\"\r\n | \"with\"\r\n | \"{\"\r\n | \"|\"\r\n | \"}\";\r\n\r\nexport type LangiumGrammarTokenNames = LangiumGrammarTerminalNames | LangiumGrammarKeywordNames;\r\n\r\nexport type AbstractRule = ParserRule | TerminalRule;\r\n\r\nexport const AbstractRule = 'AbstractRule';\r\n\r\nexport function isAbstractRule(item: unknown): item is AbstractRule {\r\n return reflection.isInstance(item, AbstractRule);\r\n}\r\n\r\nexport type AbstractType = InferredType | Interface | ParserRule | Type;\r\n\r\nexport const AbstractType = 'AbstractType';\r\n\r\nexport function isAbstractType(item: unknown): item is AbstractType {\r\n return reflection.isInstance(item, AbstractType);\r\n}\r\n\r\nexport type Condition = BooleanLiteral | Conjunction | Disjunction | Negation | ParameterReference;\r\n\r\nexport const Condition = 'Condition';\r\n\r\nexport function isCondition(item: unknown): item is Condition {\r\n return reflection.isInstance(item, Condition);\r\n}\r\n\r\nexport type FeatureName = 'current' | 'entry' | 'extends' | 'false' | 'fragment' | 'grammar' | 'hidden' | 'import' | 'infer' | 'infers' | 'interface' | 'returns' | 'terminal' | 'true' | 'type' | 'with' | PrimitiveType | string;\r\n\r\nexport function isFeatureName(item: unknown): item is FeatureName {\r\n return isPrimitiveType(item) || item === 'current' || item === 'entry' || item === 'extends' || item === 'false' || item === 'fragment' || item === 'grammar' || item === 'hidden' || item === 'import' || item === 'interface' || item === 'returns' || item === 'terminal' || item === 'true' || item === 'type' || item === 'infer' || item === 'infers' || item === 'with' || (typeof item === 'string' && (/\\^?[_a-zA-Z][\\w_]*/.test(item)));\r\n}\r\n\r\nexport type PrimitiveType = 'Date' | 'bigint' | 'boolean' | 'number' | 'string';\r\n\r\nexport function isPrimitiveType(item: unknown): item is PrimitiveType {\r\n return item === 'string' || item === 'number' || item === 'boolean' || item === 'Date' || item === 'bigint';\r\n}\r\n\r\nexport type TypeDefinition = ArrayType | ReferenceType | SimpleType | UnionType;\r\n\r\nexport const TypeDefinition = 'TypeDefinition';\r\n\r\nexport function isTypeDefinition(item: unknown): item is TypeDefinition {\r\n return reflection.isInstance(item, TypeDefinition);\r\n}\r\n\r\nexport type ValueLiteral = ArrayLiteral | BooleanLiteral | NumberLiteral | StringLiteral;\r\n\r\nexport const ValueLiteral = 'ValueLiteral';\r\n\r\nexport function isValueLiteral(item: unknown): item is ValueLiteral {\r\n return reflection.isInstance(item, ValueLiteral);\r\n}\r\n\r\nexport interface AbstractElement extends AstNode {\r\n readonly $type: 'AbstractElement' | 'Action' | 'Alternatives' | 'Assignment' | 'CharacterRange' | 'CrossReference' | 'EndOfFile' | 'Group' | 'Keyword' | 'NegatedToken' | 'RegexToken' | 'RuleCall' | 'TerminalAlternatives' | 'TerminalGroup' | 'TerminalRuleCall' | 'UnorderedGroup' | 'UntilToken' | 'Wildcard';\r\n cardinality?: '*' | '+' | '?';\r\n lookahead?: '?!' | '?<!' | '?<=' | '?=';\r\n}\r\n\r\nexport const AbstractElement = 'AbstractElement';\r\n\r\nexport function isAbstractElement(item: unknown): item is AbstractElement {\r\n return reflection.isInstance(item, AbstractElement);\r\n}\r\n\r\nexport interface ArrayLiteral extends AstNode {\r\n readonly $container: ArrayLiteral | TypeAttribute;\r\n readonly $type: 'ArrayLiteral';\r\n elements: Array<ValueLiteral>;\r\n}\r\n\r\nexport const ArrayLiteral = 'ArrayLiteral';\r\n\r\nexport function isArrayLiteral(item: unknown): item is ArrayLiteral {\r\n return reflection.isInstance(item, ArrayLiteral);\r\n}\r\n\r\nexport interface ArrayType extends AstNode {\r\n readonly $container: ArrayType | ReferenceType | Type | TypeAttribute | UnionType;\r\n readonly $type: 'ArrayType';\r\n elementType: TypeDefinition;\r\n}\r\n\r\nexport const ArrayType = 'ArrayType';\r\n\r\nexport function isArrayType(item: unknown): item is ArrayType {\r\n return reflection.isInstance(item, ArrayType);\r\n}\r\n\r\nexport interface BooleanLiteral extends AstNode {\r\n readonly $container: ArrayLiteral | Conjunction | Disjunction | Group | NamedArgument | Negation | TypeAttribute;\r\n readonly $type: 'BooleanLiteral';\r\n true: boolean;\r\n}\r\n\r\nexport const BooleanLiteral = 'BooleanLiteral';\r\n\r\nexport function isBooleanLiteral(item: unknown): item is BooleanLiteral {\r\n return reflection.isInstance(item, BooleanLiteral);\r\n}\r\n\r\nexport interface Conjunction extends AstNode {\r\n readonly $container: Conjunction | Disjunction | Group | NamedArgument | Negation;\r\n readonly $type: 'Conjunction';\r\n left: Condition;\r\n right: Condition;\r\n}\r\n\r\nexport const Conjunction = 'Conjunction';\r\n\r\nexport function isConjunction(item: unknown): item is Conjunction {\r\n return reflection.isInstance(item, Conjunction);\r\n}\r\n\r\nexport interface Disjunction extends AstNode {\r\n readonly $container: Conjunction | Disjunction | Group | NamedArgument | Negation;\r\n readonly $type: 'Disjunction';\r\n left: Condition;\r\n right: Condition;\r\n}\r\n\r\nexport const Disjunction = 'Disjunction';\r\n\r\nexport function isDisjunction(item: unknown): item is Disjunction {\r\n return reflection.isInstance(item, Disjunction);\r\n}\r\n\r\nexport interface Grammar extends AstNode {\r\n readonly $type: 'Grammar';\r\n definesHiddenTokens: boolean;\r\n hiddenTokens: Array<Reference<AbstractRule>>;\r\n imports: Array<GrammarImport>;\r\n interfaces: Array<Interface>;\r\n isDeclared: boolean;\r\n name?: string;\r\n rules: Array<AbstractRule>;\r\n types: Array<Type>;\r\n usedGrammars: Array<Reference<Grammar>>;\r\n}\r\n\r\nexport const Grammar = 'Grammar';\r\n\r\nexport function isGrammar(item: unknown): item is Grammar {\r\n return reflection.isInstance(item, Grammar);\r\n}\r\n\r\nexport interface GrammarImport extends AstNode {\r\n readonly $container: Grammar;\r\n readonly $type: 'GrammarImport';\r\n path: string;\r\n}\r\n\r\nexport const GrammarImport = 'GrammarImport';\r\n\r\nexport function isGrammarImport(item: unknown): item is GrammarImport {\r\n return reflection.isInstance(item, GrammarImport);\r\n}\r\n\r\nexport interface InferredType extends AstNode {\r\n readonly $container: Action | ParserRule;\r\n readonly $type: 'InferredType';\r\n name: string;\r\n}\r\n\r\nexport const InferredType = 'InferredType';\r\n\r\nexport function isInferredType(item: unknown): item is InferredType {\r\n return reflection.isInstance(item, InferredType);\r\n}\r\n\r\nexport interface Interface extends AstNode {\r\n readonly $container: Grammar;\r\n readonly $type: 'Interface';\r\n attributes: Array<TypeAttribute>;\r\n name: string;\r\n superTypes: Array<Reference<AbstractType>>;\r\n}\r\n\r\nexport const Interface = 'Interface';\r\n\r\nexport function isInterface(item: unknown): item is Interface {\r\n return reflection.isInstance(item, Interface);\r\n}\r\n\r\nexport interface NamedArgument extends AstNode {\r\n readonly $container: RuleCall;\r\n readonly $type: 'NamedArgument';\r\n calledByName: boolean;\r\n parameter?: Reference<Parameter>;\r\n value: Condition;\r\n}\r\n\r\nexport const NamedArgument = 'NamedArgument';\r\n\r\nexport function isNamedArgument(item: unknown): item is NamedArgument {\r\n return reflection.isInstance(item, NamedArgument);\r\n}\r\n\r\nexport interface Negation extends AstNode {\r\n readonly $container: Conjunction | Disjunction | Group | NamedArgument | Negation;\r\n readonly $type: 'Negation';\r\n value: Condition;\r\n}\r\n\r\nexport const Negation = 'Negation';\r\n\r\nexport function isNegation(item: unknown): item is Negation {\r\n return reflection.isInstance(item, Negation);\r\n}\r\n\r\nexport interface NumberLiteral extends AstNode {\r\n readonly $container: ArrayLiteral | TypeAttribute;\r\n readonly $type: 'NumberLiteral';\r\n value: number;\r\n}\r\n\r\nexport const NumberLiteral = 'NumberLiteral';\r\n\r\nexport function isNumberLiteral(item: unknown): item is NumberLiteral {\r\n return reflection.isInstance(item, NumberLiteral);\r\n}\r\n\r\nexport interface Parameter extends AstNode {\r\n readonly $container: ParserRule;\r\n readonly $type: 'Parameter';\r\n name: string;\r\n}\r\n\r\nexport const Parameter = 'Parameter';\r\n\r\nexport function isParameter(item: unknown): item is Parameter {\r\n return reflection.isInstance(item, Parameter);\r\n}\r\n\r\nexport interface ParameterReference extends AstNode {\r\n readonly $container: Conjunction | Disjunction | Group | NamedArgument | Negation;\r\n readonly $type: 'ParameterReference';\r\n parameter: Reference<Parameter>;\r\n}\r\n\r\nexport const ParameterReference = 'ParameterReference';\r\n\r\nexport function isParameterReference(item: unknown): item is ParameterReference {\r\n return reflection.isInstance(item, ParameterReference);\r\n}\r\n\r\nexport interface ParserRule extends AstNode {\r\n readonly $container: Grammar;\r\n readonly $type: 'ParserRule';\r\n dataType?: PrimitiveType;\r\n definesHiddenTokens: boolean;\r\n definition: AbstractElement;\r\n entry: boolean;\r\n fragment: boolean;\r\n hiddenTokens: Array<Reference<AbstractRule>>;\r\n inferredType?: InferredType;\r\n name: string;\r\n parameters: Array<Parameter>;\r\n returnType?: Reference<AbstractType>;\r\n wildcard: boolean;\r\n}\r\n\r\nexport const ParserRule = 'ParserRule';\r\n\r\nexport function isParserRule(item: unknown): item is ParserRule {\r\n return reflection.isInstance(item, ParserRule);\r\n}\r\n\r\nexport interface ReferenceType extends AstNode {\r\n readonly $container: ArrayType | ReferenceType | Type | TypeAttribute | UnionType;\r\n readonly $type: 'ReferenceType';\r\n referenceType: TypeDefinition;\r\n}\r\n\r\nexport const ReferenceType = 'ReferenceType';\r\n\r\nexport function isReferenceType(item: unknown): item is ReferenceType {\r\n return reflection.isInstance(item, ReferenceType);\r\n}\r\n\r\nexport interface ReturnType extends AstNode {\r\n readonly $container: TerminalRule;\r\n readonly $type: 'ReturnType';\r\n name: PrimitiveType | string;\r\n}\r\n\r\nexport const ReturnType = 'ReturnType';\r\n\r\nexport function isReturnType(item: unknown): item is ReturnType {\r\n return reflection.isInstance(item, ReturnType);\r\n}\r\n\r\nexport interface SimpleType extends AstNode {\r\n readonly $container: ArrayType | ReferenceType | Type | TypeAttribute | UnionType;\r\n readonly $type: 'SimpleType';\r\n primitiveType?: PrimitiveType;\r\n stringType?: string;\r\n typeRef?: Reference<AbstractType>;\r\n}\r\n\r\nexport const SimpleType = 'SimpleType';\r\n\r\nexport function isSimpleType(item: unknown): item is SimpleType {\r\n return reflection.isInstance(item, SimpleType);\r\n}\r\n\r\nexport interface StringLiteral extends AstNode {\r\n readonly $container: ArrayLiteral | TypeAttribute;\r\n readonly $type: 'StringLiteral';\r\n value: string;\r\n}\r\n\r\nexport const StringLiteral = 'StringLiteral';\r\n\r\nexport function isStringLiteral(item: unknown): item is StringLiteral {\r\n return reflection.isInstance(item, StringLiteral);\r\n}\r\n\r\nexport interface TerminalRule extends AstNode {\r\n readonly $container: Grammar;\r\n readonly $type: 'TerminalRule';\r\n definition: AbstractElement;\r\n fragment: boolean;\r\n hidden: boolean;\r\n name: string;\r\n type?: ReturnType;\r\n}\r\n\r\nexport const TerminalRule = 'TerminalRule';\r\n\r\nexport function isTerminalRule(item: unknown): item is TerminalRule {\r\n return reflection.isInstance(item, TerminalRule);\r\n}\r\n\r\nexport interface Type extends AstNode {\r\n readonly $container: Grammar;\r\n readonly $type: 'Type';\r\n name: string;\r\n type: TypeDefinition;\r\n}\r\n\r\nexport const Type = 'Type';\r\n\r\nexport function isType(item: unknown): item is Type {\r\n return reflection.isInstance(item, Type);\r\n}\r\n\r\nexport interface TypeAttribute extends AstNode {\r\n readonly $container: Interface;\r\n readonly $type: 'TypeAttribute';\r\n defaultValue?: ValueLiteral;\r\n isOptional: boolean;\r\n name: FeatureName;\r\n type: TypeDefinition;\r\n}\r\n\r\nexport const TypeAttribute = 'TypeAttribute';\r\n\r\nexport function isTypeAttribute(item: unknown): item is TypeAttribute {\r\n return reflection.isInstance(item, TypeAttribute);\r\n}\r\n\r\nexport interface UnionType extends AstNode {\r\n readonly $container: ArrayType | ReferenceType | Type | TypeAttribute | UnionType;\r\n readonly $type: 'UnionType';\r\n types: Array<TypeDefinition>;\r\n}\r\n\r\nexport const UnionType = 'UnionType';\r\n\r\nexport function isUnionType(item: unknown): item is UnionType {\r\n return reflection.isInstance(item, UnionType);\r\n}\r\n\r\nexport interface Action extends AbstractElement {\r\n readonly $type: 'Action';\r\n feature?: FeatureName;\r\n inferredType?: InferredType;\r\n operator?: '+=' | '=';\r\n type?: Reference<AbstractType>;\r\n}\r\n\r\nexport const Action = 'Action';\r\n\r\nexport function isAction(item: unknown): item is Action {\r\n return reflection.isInstance(item, Action);\r\n}\r\n\r\nexport interface Alternatives extends AbstractElement {\r\n readonly $type: 'Alternatives';\r\n elements: Array<AbstractElement>;\r\n}\r\n\r\nexport const Alternatives = 'Alternatives';\r\n\r\nexport function isAlternatives(item: unknown): item is Alternatives {\r\n return reflection.isInstance(item, Alternatives);\r\n}\r\n\r\nexport interface Assignment extends AbstractElement {\r\n readonly $type: 'Assignment';\r\n feature: FeatureName;\r\n operator: '+=' | '=' | '?=';\r\n terminal: AbstractElement;\r\n}\r\n\r\nexport const Assignment = 'Assignment';\r\n\r\nexport function isAssignment(item: unknown): item is Assignment {\r\n return reflection.isInstance(item, Assignment);\r\n}\r\n\r\nexport interface CharacterRange extends AbstractElement {\r\n readonly $type: 'CharacterRange';\r\n left: Keyword;\r\n right?: Keyword;\r\n}\r\n\r\nexport const CharacterRange = 'CharacterRange';\r\n\r\nexport function isCharacterRange(item: unknown): item is CharacterRange {\r\n return reflection.isInstance(item, CharacterRange);\r\n}\r\n\r\nexport interface CrossReference extends AbstractElement {\r\n readonly $type: 'CrossReference';\r\n deprecatedSyntax: boolean;\r\n terminal?: AbstractElement;\r\n type: Reference<AbstractType>;\r\n}\r\n\r\nexport const CrossReference = 'CrossReference';\r\n\r\nexport function isCrossReference(item: unknown): item is CrossReference {\r\n return reflection.isInstance(item, CrossReference);\r\n}\r\n\r\nexport interface EndOfFile extends AbstractElement {\r\n readonly $type: 'EndOfFile';\r\n}\r\n\r\nexport const EndOfFile = 'EndOfFile';\r\n\r\nexport function isEndOfFile(item: unknown): item is EndOfFile {\r\n return reflection.isInstance(item, EndOfFile);\r\n}\r\n\r\nexport interface Group extends AbstractElement {\r\n readonly $type: 'Group';\r\n elements: Array<AbstractElement>;\r\n guardCondition?: Condition;\r\n}\r\n\r\nexport const Group = 'Group';\r\n\r\nexport function isGroup(item: unknown): item is Group {\r\n return reflection.isInstance(item, Group);\r\n}\r\n\r\nexport interface Keyword extends AbstractElement {\r\n readonly $container: CharacterRange;\r\n readonly $type: 'Keyword';\r\n value: string;\r\n}\r\n\r\nexport const Keyword = 'Keyword';\r\n\r\nexport function isKeyword(item: unknown): item is Keyword {\r\n return reflection.isInstance(item, Keyword);\r\n}\r\n\r\nexport interface NegatedToken extends AbstractElement {\r\n readonly $type: 'NegatedToken';\r\n terminal: AbstractElement;\r\n}\r\n\r\nexport const NegatedToken = 'NegatedToken';\r\n\r\nexport function isNegatedToken(item: unknown): item is NegatedToken {\r\n return reflection.isInstance(item, NegatedToken);\r\n}\r\n\r\nexport interface RegexToken extends AbstractElement {\r\n readonly $type: 'RegexToken';\r\n regex: string;\r\n}\r\n\r\nexport const RegexToken = 'RegexToken';\r\n\r\nexport function isRegexToken(item: unknown): item is RegexToken {\r\n return reflection.isInstance(item, RegexToken);\r\n}\r\n\r\nexport interface RuleCall extends AbstractElement {\r\n readonly $type: 'RuleCall';\r\n arguments: Array<NamedArgument>;\r\n rule: Reference<AbstractRule>;\r\n}\r\n\r\nexport const RuleCall = 'RuleCall';\r\n\r\nexport function isRuleCall(item: unknown): item is RuleCall {\r\n return reflection.isInstance(item, RuleCall);\r\n}\r\n\r\nexport interface TerminalAlternatives extends AbstractElement {\r\n readonly $type: 'TerminalAlternatives';\r\n elements: Array<AbstractElement>;\r\n}\r\n\r\nexport const TerminalAlternatives = 'TerminalAlternatives';\r\n\r\nexport function isTerminalAlternatives(item: unknown): item is TerminalAlternatives {\r\n return reflection.isInstance(item, TerminalAlternatives);\r\n}\r\n\r\nexport interface TerminalGroup extends AbstractElement {\r\n readonly $type: 'TerminalGroup';\r\n elements: Array<AbstractElement>;\r\n}\r\n\r\nexport const TerminalGroup = 'TerminalGroup';\r\n\r\nexport function isTerminalGroup(item: unknown): item is TerminalGroup {\r\n return reflection.isInstance(item, TerminalGroup);\r\n}\r\n\r\nexport interface TerminalRuleCall extends AbstractElement {\r\n readonly $type: 'TerminalRuleCall';\r\n rule: Reference<TerminalRule>;\r\n}\r\n\r\nexport const TerminalRuleCall = 'TerminalRuleCall';\r\n\r\nexport function isTerminalRuleCall(item: unknown): item is TerminalRuleCall {\r\n return reflection.isInstance(item, TerminalRuleCall);\r\n}\r\n\r\nexport interface UnorderedGroup extends AbstractElement {\r\n readonly $type: 'UnorderedGroup';\r\n elements: Array<AbstractElement>;\r\n}\r\n\r\nexport const UnorderedGroup = 'UnorderedGroup';\r\n\r\nexport function isUnorderedGroup(item: unknown): item is UnorderedGroup {\r\n return reflection.isInstance(item, UnorderedGroup);\r\n}\r\n\r\nexport interface UntilToken extends AbstractElement {\r\n readonly $type: 'UntilToken';\r\n terminal: AbstractElement;\r\n}\r\n\r\nexport const UntilToken = 'UntilToken';\r\n\r\nexport function isUntilToken(item: unknown): item is UntilToken {\r\n return reflection.isInstance(item, UntilToken);\r\n}\r\n\r\nexport interface Wildcard extends AbstractElement {\r\n readonly $type: 'Wildcard';\r\n}\r\n\r\nexport const Wildcard = 'Wildcard';\r\n\r\nexport function isWildcard(item: unknown): item is Wildcard {\r\n return reflection.isInstance(item, Wildcard);\r\n}\r\n\r\nexport type LangiumGrammarAstType = {\r\n AbstractElement: AbstractElement\r\n AbstractRule: AbstractRule\r\n AbstractType: AbstractType\r\n Action: Action\r\n Alternatives: Alternatives\r\n ArrayLiteral: ArrayLiteral\r\n ArrayType: ArrayType\r\n Assignment: Assignment\r\n BooleanLiteral: BooleanLiteral\r\n CharacterRange: CharacterRange\r\n Condition: Condition\r\n Conjunction: Conjunction\r\n CrossReference: CrossReference\r\n Disjunction: Disjunction\r\n EndOfFile: EndOfFile\r\n Grammar: Grammar\r\n GrammarImport: GrammarImport\r\n Group: Group\r\n InferredType: InferredType\r\n Interface: Interface\r\n Keyword: Keyword\r\n NamedArgument: NamedArgument\r\n NegatedToken: NegatedToken\r\n Negation: Negation\r\n NumberLiteral: NumberLiteral\r\n Parameter: Parameter\r\n ParameterReference: ParameterReference\r\n ParserRule: ParserRule\r\n ReferenceType: ReferenceType\r\n RegexToken: RegexToken\r\n ReturnType: ReturnType\r\n RuleCall: RuleCall\r\n SimpleType: SimpleType\r\n StringLiteral: StringLiteral\r\n TerminalAlternatives: TerminalAlternatives\r\n TerminalGroup: TerminalGroup\r\n TerminalRule: TerminalRule\r\n TerminalRuleCall: TerminalRuleCall\r\n Type: Type\r\n TypeAttribute: TypeAttribute\r\n TypeDefinition: TypeDefinition\r\n UnionType: UnionType\r\n UnorderedGroup: UnorderedGroup\r\n UntilToken: UntilToken\r\n ValueLiteral: ValueLiteral\r\n Wildcard: Wildcard\r\n}\r\n\r\nexport class LangiumGrammarAstReflection extends AbstractAstReflection {\r\n\r\n getAllTypes(): string[] {\r\n return [AbstractElement, AbstractRule, AbstractType, Action, Alternatives, ArrayLiteral, ArrayType, Assignment, BooleanLiteral, CharacterRange, Condition, Conjunction, CrossReference, Disjunction, EndOfFile, Grammar, GrammarImport, Group, InferredType, Interface, Keyword, NamedArgument, NegatedToken, Negation, NumberLiteral, Parameter, ParameterReference, ParserRule, ReferenceType, RegexToken, ReturnType, RuleCall, SimpleType, StringLiteral, TerminalAlternatives, TerminalGroup, TerminalRule, TerminalRuleCall, Type, TypeAttribute, TypeDefinition, UnionType, UnorderedGroup, UntilToken, ValueLiteral, Wildcard];\r\n }\r\n\r\n protected override computeIsSubtype(subtype: string, supertype: string): boolean {\r\n switch (subtype) {\r\n case Action:\r\n case Alternatives:\r\n case Assignment:\r\n case CharacterRange:\r\n case CrossReference:\r\n case EndOfFile:\r\n case Group:\r\n case Keyword:\r\n case NegatedToken:\r\n case RegexToken:\r\n case RuleCall:\r\n case TerminalAlternatives:\r\n case TerminalGroup:\r\n case TerminalRuleCall:\r\n case UnorderedGroup:\r\n case UntilToken:\r\n case Wildcard: {\r\n return this.isSubtype(AbstractElement, supertype);\r\n }\r\n case ArrayLiteral:\r\n case NumberLiteral:\r\n case StringLiteral: {\r\n return this.isSubtype(ValueLiteral, supertype);\r\n }\r\n case ArrayType:\r\n case ReferenceType:\r\n case SimpleType:\r\n case UnionType: {\r\n return this.isSubtype(TypeDefinition, supertype);\r\n }\r\n case BooleanLiteral: {\r\n return this.isSubtype(Condition, supertype) || this.isSubtype(ValueLiteral, supertype);\r\n }\r\n case Conjunction:\r\n case Disjunction:\r\n case Negation:\r\n case ParameterReference: {\r\n return this.isSubtype(Condition, supertype);\r\n }\r\n case InferredType:\r\n case Interface:\r\n case Type: {\r\n return this.isSubtype(AbstractType, supertype);\r\n }\r\n case ParserRule: {\r\n return this.isSubtype(AbstractRule, supertype) || this.isSubtype(AbstractType, supertype);\r\n }\r\n case TerminalRule: {\r\n return this.isSubtype(AbstractRule, supertype);\r\n }\r\n default: {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n getReferenceType(refInfo: ReferenceInfo): string {\r\n const referenceId = `${refInfo.container.$type}:${refInfo.property}`;\r\n switch (referenceId) {\r\n case 'Action:type':\r\n case 'CrossReference:type':\r\n case 'Interface:superTypes':\r\n case 'ParserRule:returnType':\r\n case 'SimpleType:typeRef': {\r\n return AbstractType;\r\n }\r\n case 'Grammar:hiddenTokens':\r\n case 'ParserRule:hiddenTokens':\r\n case 'RuleCall:rule': {\r\n return AbstractRule;\r\n }\r\n case 'Grammar:usedGrammars': {\r\n return Grammar;\r\n }\r\n case 'NamedArgument:parameter':\r\n case 'ParameterReference:parameter': {\r\n return Parameter;\r\n }\r\n case 'TerminalRuleCall:rule': {\r\n return TerminalRule;\r\n }\r\n default: {\r\n throw new Error(`${referenceId} is not a valid reference id.`);\r\n }\r\n }\r\n }\r\n\r\n getTypeMetaData(type: string): TypeMetaData {\r\n switch (type) {\r\n case AbstractElement: {\r\n return {\r\n name: AbstractElement,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'lookahead' }\r\n ]\r\n };\r\n }\r\n case ArrayLiteral: {\r\n return {\r\n name: ArrayLiteral,\r\n properties: [\r\n { name: 'elements', defaultValue: [] }\r\n ]\r\n };\r\n }\r\n case ArrayType: {\r\n return {\r\n name: ArrayType,\r\n properties: [\r\n { name: 'elementType' }\r\n ]\r\n };\r\n }\r\n case BooleanLiteral: {\r\n return {\r\n name: BooleanLiteral,\r\n properties: [\r\n { name: 'true', defaultValue: false }\r\n ]\r\n };\r\n }\r\n case Conjunction: {\r\n return {\r\n name: Conjunction,\r\n properties: [\r\n { name: 'left' },\r\n { name: 'right' }\r\n ]\r\n };\r\n }\r\n case Disjunction: {\r\n return {\r\n name: Disjunction,\r\n properties: [\r\n { name: 'left' },\r\n { name: 'right' }\r\n ]\r\n };\r\n }\r\n case Grammar: {\r\n return {\r\n name: Grammar,\r\n properties: [\r\n { name: 'definesHiddenTokens', defaultValue: false },\r\n { name: 'hiddenTokens', defaultValue: [] },\r\n { name: 'imports', defaultValue: [] },\r\n { name: 'interfaces', defaultValue: [] },\r\n { name: 'isDeclared', defaultValue: false },\r\n { name: 'name' },\r\n { name: 'rules', defaultValue: [] },\r\n { name: 'types', defaultValue: [] },\r\n { name: 'usedGrammars', defaultValue: [] }\r\n ]\r\n };\r\n }\r\n case GrammarImport: {\r\n return {\r\n name: GrammarImport,\r\n properties: [\r\n { name: 'path' }\r\n ]\r\n };\r\n }\r\n case InferredType: {\r\n return {\r\n name: InferredType,\r\n properties: [\r\n { name: 'name' }\r\n ]\r\n };\r\n }\r\n case Interface: {\r\n return {\r\n name: Interface,\r\n properties: [\r\n { name: 'attributes', defaultValue: [] },\r\n { name: 'name' },\r\n { name: 'superTypes', defaultValue: [] }\r\n ]\r\n };\r\n }\r\n case NamedArgument: {\r\n return {\r\n name: NamedArgument,\r\n properties: [\r\n { name: 'calledByName', defaultValue: false },\r\n { name: 'parameter' },\r\n { name: 'value' }\r\n ]\r\n };\r\n }\r\n case Negation: {\r\n return {\r\n name: Negation,\r\n properties: [\r\n { name: 'value' }\r\n ]\r\n };\r\n }\r\n case NumberLiteral: {\r\n return {\r\n name: NumberLiteral,\r\n properties: [\r\n { name: 'value' }\r\n ]\r\n };\r\n }\r\n case Parameter: {\r\n return {\r\n name: Parameter,\r\n properties: [\r\n { name: 'name' }\r\n ]\r\n };\r\n }\r\n case ParameterReference: {\r\n return {\r\n name: ParameterReference,\r\n properties: [\r\n { name: 'parameter' }\r\n ]\r\n };\r\n }\r\n case ParserRule: {\r\n return {\r\n name: ParserRule,\r\n properties: [\r\n { name: 'dataType' },\r\n { name: 'definesHiddenTokens', defaultValue: false },\r\n { name: 'definition' },\r\n { name: 'entry', defaultValue: false },\r\n { name: 'fragment', defaultValue: false },\r\n { name: 'hiddenTokens', defaultValue: [] },\r\n { name: 'inferredType' },\r\n { name: 'name' },\r\n { name: 'parameters', defaultValue: [] },\r\n { name: 'returnType' },\r\n { name: 'wildcard', defaultValue: false }\r\n ]\r\n };\r\n }\r\n case ReferenceType: {\r\n return {\r\n name: ReferenceType,\r\n properties: [\r\n { name: 'referenceType' }\r\n ]\r\n };\r\n }\r\n case ReturnType: {\r\n return {\r\n name: ReturnType,\r\n properties: [\r\n { name: 'name' }\r\n ]\r\n };\r\n }\r\n case SimpleType: {\r\n return {\r\n name: SimpleType,\r\n properties: [\r\n { name: 'primitiveType' },\r\n { name: 'stringType' },\r\n { name: 'typeRef' }\r\n ]\r\n };\r\n }\r\n case StringLiteral: {\r\n return {\r\n name: StringLiteral,\r\n properties: [\r\n { name: 'value' }\r\n ]\r\n };\r\n }\r\n case TerminalRule: {\r\n return {\r\n name: TerminalRule,\r\n properties: [\r\n { name: 'definition' },\r\n { name: 'fragment', defaultValue: false },\r\n { name: 'hidden', defaultValue: false },\r\n { name: 'name' },\r\n { name: 'type' }\r\n ]\r\n };\r\n }\r\n case Type: {\r\n return {\r\n name: Type,\r\n properties: [\r\n { name: 'name' },\r\n { name: 'type' }\r\n ]\r\n };\r\n }\r\n case TypeAttribute: {\r\n return {\r\n name: TypeAttribute,\r\n properties: [\r\n { name: 'defaultValue' },\r\n { name: 'isOptional', defaultValue: false },\r\n { name: 'name' },\r\n { name: 'type' }\r\n ]\r\n };\r\n }\r\n case UnionType: {\r\n return {\r\n name: UnionType,\r\n properties: [\r\n { name: 'types', defaultValue: [] }\r\n ]\r\n };\r\n }\r\n case Action: {\r\n return {\r\n name: Action,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'feature' },\r\n { name: 'inferredType' },\r\n { name: 'lookahead' },\r\n { name: 'operator' },\r\n { name: 'type' }\r\n ]\r\n };\r\n }\r\n case Alternatives: {\r\n return {\r\n name: Alternatives,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'elements', defaultValue: [] },\r\n { name: 'lookahead' }\r\n ]\r\n };\r\n }\r\n case Assignment: {\r\n return {\r\n name: Assignment,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'feature' },\r\n { name: 'lookahead' },\r\n { name: 'operator' },\r\n { name: 'terminal' }\r\n ]\r\n };\r\n }\r\n case CharacterRange: {\r\n return {\r\n name: CharacterRange,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'left' },\r\n { name: 'lookahead' },\r\n { name: 'right' }\r\n ]\r\n };\r\n }\r\n case CrossReference: {\r\n return {\r\n name: CrossReference,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'deprecatedSyntax', defaultValue: false },\r\n { name: 'lookahead' },\r\n { name: 'terminal' },\r\n { name: 'type' }\r\n ]\r\n };\r\n }\r\n case EndOfFile: {\r\n return {\r\n name: EndOfFile,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'lookahead' }\r\n ]\r\n };\r\n }\r\n case Group: {\r\n return {\r\n name: Group,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'elements', defaultValue: [] },\r\n { name: 'guardCondition' },\r\n { name: 'lookahead' }\r\n ]\r\n };\r\n }\r\n case Keyword: {\r\n return {\r\n name: Keyword,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'lookahead' },\r\n { name: 'value' }\r\n ]\r\n };\r\n }\r\n case NegatedToken: {\r\n return {\r\n name: NegatedToken,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'lookahead' },\r\n { name: 'terminal' }\r\n ]\r\n };\r\n }\r\n case RegexToken: {\r\n return {\r\n name: RegexToken,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'lookahead' },\r\n { name: 'regex' }\r\n ]\r\n };\r\n }\r\n case RuleCall: {\r\n return {\r\n name: RuleCall,\r\n properties: [\r\n { name: 'arguments', defaultValue: [] },\r\n { name: 'cardinality' },\r\n { name: 'lookahead' },\r\n { name: 'rule' }\r\n ]\r\n };\r\n }\r\n case TerminalAlternatives: {\r\n return {\r\n name: TerminalAlternatives,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'elements', defaultValue: [] },\r\n { name: 'lookahead' }\r\n ]\r\n };\r\n }\r\n case TerminalGroup: {\r\n return {\r\n name: TerminalGroup,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'elements', defaultValue: [] },\r\n { name: 'lookahead' }\r\n ]\r\n };\r\n }\r\n case TerminalRuleCall: {\r\n return {\r\n name: TerminalRuleCall,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'lookahead' },\r\n { name: 'rule' }\r\n ]\r\n };\r\n }\r\n case UnorderedGroup: {\r\n return {\r\n name: UnorderedGroup,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'elements', defaultValue: [] },\r\n { name: 'lookahead' }\r\n ]\r\n };\r\n }\r\n case UntilToken: {\r\n return {\r\n name: UntilToken,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'lookahead' },\r\n { name: 'terminal' }\r\n ]\r\n };\r\n }\r\n case Wildcard: {\r\n return {\r\n name: Wildcard,\r\n properties: [\r\n { name: 'cardinality' },\r\n { name: 'lookahead' }\r\n ]\r\n };\r\n }\r\n default: {\r\n return {\r\n name: type,\r\n properties: []\r\n };\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport const reflection = new LangiumGrammarAstReflection();\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { Range } from 'vscode-languageserver-types';\r\nimport type { AstNode, AstReflection, CstNode, GenericAstNode, Mutable, PropertyType, Reference, ReferenceInfo } from '../syntax-tree.js';\r\nimport type { Stream, TreeStream } from './stream.js';\r\nimport type { LangiumDocument } from '../workspace/documents.js';\r\nimport { isAstNode, isReference } from '../syntax-tree.js';\r\nimport { DONE_RESULT, stream, StreamImpl, TreeStreamImpl } from './stream.js';\r\nimport { inRange } from './cst-utils.js';\r\n\r\n/**\r\n * Link the `$container` and other related properties of every AST node that is directly contained\r\n * in the given `node`.\r\n */\r\nexport function linkContentToContainer(node: AstNode): void {\r\n for (const [name, value] of Object.entries(node)) {\r\n if (!name.startsWith('$')) {\r\n if (Array.isArray(value)) {\r\n value.forEach((item, index) => {\r\n if (isAstNode(item)) {\r\n (item as Mutable<AstNode>).$container = node;\r\n (item as Mutable<AstNode>).$containerProperty = name;\r\n (item as Mutable<AstNode>).$containerIndex = index;\r\n }\r\n });\r\n } else if (isAstNode(value)) {\r\n (value as Mutable<AstNode>).$container = node;\r\n (value as Mutable<AstNode>).$containerProperty = name;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Walk along the hierarchy of containers from the given AST node to the root and return the first\r\n * node that matches the type predicate. If the start node itself matches, it is returned.\r\n * If no container matches, `undefined` is returned.\r\n */\r\nexport function getContainerOfType<T extends AstNode>(node: AstNode | undefined, typePredicate: (n: AstNode) => n is T): T | undefined {\r\n let item = node;\r\n while (item) {\r\n if (typePredicate(item)) {\r\n return item;\r\n }\r\n item = item.$container;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Walk along the hierarchy of containers from the given AST node to the root and check for existence\r\n * of a container that matches the given predicate. The start node is included in the checks.\r\n */\r\nexport function hasContainerOfType(node: AstNode | undefined, predicate: (n: AstNode) => boolean): boolean {\r\n let item = node;\r\n while (item) {\r\n if (predicate(item)) {\r\n return true;\r\n }\r\n item = item.$container;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Retrieve the document in which the given AST node is contained. A reference to the document is\r\n * usually held by the root node of the AST.\r\n *\r\n * @throws an error if the node is not contained in a document.\r\n */\r\nexport function getDocument<T extends AstNode = AstNode>(node: AstNode): LangiumDocument<T> {\r\n const rootNode = findRootNode(node);\r\n const result = rootNode.$document;\r\n if (!result) {\r\n throw new Error('AST node has no document.');\r\n }\r\n return result as LangiumDocument<T>;\r\n}\r\n\r\n/**\r\n * Returns the root node of the given AST node by following the `$container` references.\r\n */\r\nexport function findRootNode(node: AstNode): AstNode {\r\n while (node.$container) {\r\n node = node.$container;\r\n }\r\n return node;\r\n}\r\n\r\nexport interface AstStreamOptions {\r\n /**\r\n * Optional target range that the nodes in the stream need to intersect\r\n */\r\n range?: Range\r\n}\r\n\r\n/**\r\n * Create a stream of all AST nodes that are directly contained in the given node. This includes\r\n * single-valued as well as multi-valued (array) properties.\r\n */\r\nexport function streamContents(node: AstNode, options?: AstStreamOptions): Stream<AstNode> {\r\n if (!node) {\r\n throw new Error('Node must be an AstNode.');\r\n }\r\n const range = options?.range;\r\n type State = { keys: string[], keyIndex: number, arrayIndex: number };\r\n return new StreamImpl<State, AstNode>(() => ({\r\n keys: Object.keys(node),\r\n keyIndex: 0,\r\n arrayIndex: 0\r\n }), state => {\r\n while (state.keyIndex < state.keys.length) {\r\n const property = state.keys[state.keyIndex];\r\n if (!property.startsWith('$')) {\r\n const value = (node as GenericAstNode)[property];\r\n if (isAstNode(value)) {\r\n state.keyIndex++;\r\n if (isAstNodeInRange(value, range)) {\r\n return { done: false, value };\r\n }\r\n } else if (Array.isArray(value)) {\r\n while (state.arrayIndex < value.length) {\r\n const index = state.arrayIndex++;\r\n const element = value[index];\r\n if (isAstNode(element) && isAstNodeInRange(element, range)) {\r\n return { done: false, value: element };\r\n }\r\n }\r\n state.arrayIndex = 0;\r\n }\r\n }\r\n state.keyIndex++;\r\n }\r\n return DONE_RESULT;\r\n });\r\n}\r\n\r\n/**\r\n * Create a stream of all AST nodes that are directly and indirectly contained in the given root node.\r\n * This does not include the root node itself.\r\n */\r\nexport function streamAllContents(root: AstNode, options?: AstStreamOptions): TreeStream<AstNode> {\r\n if (!root) {\r\n throw new Error('Root node must be an AstNode.');\r\n }\r\n return new TreeStreamImpl(root, node => streamContents(node, options));\r\n}\r\n\r\n/**\r\n * Create a stream of all AST nodes that are directly and indirectly contained in the given root node,\r\n * including the root node itself.\r\n */\r\nexport function streamAst(root: AstNode, options?: AstStreamOptions): TreeStream<AstNode> {\r\n if (!root) {\r\n throw new Error('Root node must be an AstNode.');\r\n } else if (options?.range && !isAstNodeInRange(root, options.range)) {\r\n // Return an empty stream if the root node isn't in range\r\n return new TreeStreamImpl(root, () => []);\r\n }\r\n return new TreeStreamImpl(root, node => streamContents(node, options), { includeRoot: true });\r\n}\r\n\r\nfunction isAstNodeInRange(astNode: AstNode, range?: Range): boolean {\r\n if (!range) {\r\n return true;\r\n }\r\n const nodeRange = astNode.$cstNode?.range;\r\n if (!nodeRange) {\r\n return false;\r\n }\r\n return inRange(nodeRange, range);\r\n}\r\n\r\n/**\r\n * Create a stream of all cross-references that are held by the given AST node. This includes\r\n * single-valued as well as multi-valued (array) properties.\r\n */\r\nexport function streamReferences(node: AstNode): Stream<ReferenceInfo> {\r\n type State = { keys: string[], keyIndex: number, arrayIndex: number };\r\n return new StreamImpl<State, ReferenceInfo>(() => ({\r\n keys: Object.keys(node),\r\n keyIndex: 0,\r\n arrayIndex: 0\r\n }), state => {\r\n while (state.keyIndex < state.keys.length) {\r\n const property = state.keys[state.keyIndex];\r\n if (!property.startsWith('$')) {\r\n const value = (node as GenericAstNode)[property];\r\n if (isReference(value)) {\r\n state.keyIndex++;\r\n return { done: false, value: { reference: value, container: node, property } };\r\n } else if (Array.isArray(value)) {\r\n while (state.arrayIndex < value.length) {\r\n const index = state.arrayIndex++;\r\n const element = value[index];\r\n if (isReference(element)) {\r\n return { done: false, value: { reference: element, container: node, property, index } };\r\n }\r\n }\r\n state.arrayIndex = 0;\r\n }\r\n }\r\n state.keyIndex++;\r\n }\r\n return DONE_RESULT;\r\n });\r\n}\r\n\r\n/**\r\n * Returns a Stream of references to the target node from the AstNode tree\r\n *\r\n * @param targetNode AstNode we are looking for\r\n * @param lookup AstNode where we search for references. If not provided, the root node of the document is used as the default value\r\n */\r\nexport function findLocalReferences(targetNode: AstNode, lookup = getDocument(targetNode).parseResult.value): Stream<Reference> {\r\n const refs: Reference[] = [];\r\n streamAst(lookup).forEach(node => {\r\n streamReferences(node).forEach(refInfo => {\r\n if (refInfo.reference.ref === targetNode) {\r\n refs.push(refInfo.reference);\r\n }\r\n });\r\n });\r\n return stream(refs);\r\n}\r\n\r\n/**\r\n * Assigns all mandatory AST properties to the specified node.\r\n *\r\n * @param reflection Reflection object used to gather mandatory properties for the node.\r\n * @param node Specified node is modified in place and properties are directly assigned.\r\n */\r\nexport function assignMandatoryProperties(reflection: AstReflection, node: AstNode): void {\r\n const typeMetaData = reflection.getTypeMetaData(node.$type);\r\n const genericNode = node as GenericAstNode;\r\n for (const property of typeMetaData.properties) {\r\n // Only set the value if the property is not already set and if it has a default value\r\n if (property.defaultValue !== undefined && genericNode[property.name] === undefined) {\r\n genericNode[property.name] = copyDefaultValue(property.defaultValue);\r\n }\r\n }\r\n}\r\n\r\nfunction copyDefaultValue(propertyType: PropertyType): PropertyType {\r\n if (Array.isArray(propertyType)) {\r\n return [...propertyType.map(copyDefaultValue)];\r\n } else {\r\n return propertyType;\r\n }\r\n}\r\n\r\n/**\r\n * Creates a deep copy of the specified AST node.\r\n * The resulting copy will only contain semantically relevant information, such as the `$type` property and AST properties.\r\n *\r\n * References are copied without resolved cross reference. The specified function is used to rebuild them.\r\n */\r\nexport function copyAstNode<T extends AstNode = AstNode>(node: T, buildReference: (node: AstNode, property: string, refNode: CstNode | undefined, refText: string) => Reference<AstNode>): T {\r\n const copy: GenericAstNode = { $type: node.$type };\r\n\r\n for (const [name, value] of Object.entries(node)) {\r\n if (!name.startsWith('$')) {\r\n if (isAstNode(value)) {\r\n copy[name] = copyAstNode(value, buildReference);\r\n } else if (isReference(value)) {\r\n copy[name] = buildReference(\r\n copy,\r\n name,\r\n value.$refNode,\r\n value.$refText\r\n );\r\n } else if (Array.isArray(value)) {\r\n const copiedArray: unknown[] = [];\r\n for (const element of value) {\r\n if (isAstNode(element)) {\r\n copiedArray.push(copyAstNode(element, buildReference));\r\n } else if (isReference(element)) {\r\n copiedArray.push(\r\n buildReference(\r\n copy,\r\n name,\r\n element.$refNode,\r\n element.$refText\r\n )\r\n );\r\n } else {\r\n copiedArray.push(element);\r\n }\r\n }\r\n copy[name] = copiedArray;\r\n } else {\r\n copy[name] = value;\r\n }\r\n }\r\n }\r\n\r\n linkContentToContainer(copy);\r\n return copy as unknown as T;\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { Set, Group, Character, IRegExpAST } from '@chevrotain/regexp-to-ast';\r\nimport { RegExpParser, BaseRegExpVisitor } from '@chevrotain/regexp-to-ast';\r\n\r\nexport const NEWLINE_REGEXP = /\\r?\\n/gm;\r\n\r\nconst regexpParser = new RegExpParser();\r\n\r\n/**\r\n * This class is in charge of heuristically identifying start/end tokens of terminals.\r\n *\r\n * The way this works is by doing the following:\r\n * 1. Traverse the regular expression in the \"start state\"\r\n * 2. Add any encountered sets/single characters to the \"start regexp\"\r\n * 3. Once we encounter any variable-length content (i.e. with quantifiers such as +/?/*), we enter the \"end state\"\r\n * 4. In the end state, any sets/single characters are added to an \"end stack\".\r\n * 5. If we re-encounter any variable-length content we reset the end stack\r\n * 6. We continue visiting the regex until the end, reseting the end stack and rebuilding it as necessary\r\n *\r\n * After traversing a regular expression the `startRegexp/endRegexp` properties allow access to the stored start/end of the terminal\r\n */\r\nclass TerminalRegExpVisitor extends BaseRegExpVisitor {\r\n\r\n private isStarting = true;\r\n startRegexp: string;\r\n private endRegexpStack: string[] = [];\r\n multiline = false;\r\n regex: string;\r\n\r\n get endRegex(): string {\r\n return this.endRegexpStack.join('');\r\n }\r\n\r\n reset(regex: string): void {\r\n this.multiline = false;\r\n this.regex = regex;\r\n this.startRegexp = '';\r\n this.isStarting = true;\r\n this.endRegexpStack = [];\r\n }\r\n\r\n override visitGroup(node: Group) {\r\n if (node.quantifier) {\r\n this.isStarting = false;\r\n this.endRegexpStack = [];\r\n }\r\n }\r\n\r\n override visitCharacter(node: Character): void {\r\n const char = String.fromCharCode(node.value);\r\n if (!this.multiline && char === '\\n') {\r\n this.multiline = true;\r\n }\r\n if (node.quantifier) {\r\n this.isStarting = false;\r\n this.endRegexpStack = [];\r\n } else {\r\n const escapedChar = escapeRegExp(char);\r\n this.endRegexpStack.push(escapedChar);\r\n if (this.isStarting) {\r\n this.startRegexp += escapedChar;\r\n }\r\n }\r\n }\r\n\r\n override visitSet(node: Set): void {\r\n if (!this.multiline) {\r\n const set = this.regex.substring(node.loc.begin, node.loc.end);\r\n const regex = new RegExp(set);\r\n this.multiline = Boolean('\\n'.match(regex));\r\n }\r\n if (node.quantifier) {\r\n this.isStarting = false;\r\n this.endRegexpStack = [];\r\n } else {\r\n const set = this.regex.substring(node.loc.begin, node.loc.end);\r\n this.endRegexpStack.push(set);\r\n if (this.isStarting) {\r\n this.startRegexp += set;\r\n }\r\n }\r\n }\r\n\r\n override visitChildren(node: IRegExpAST): void {\r\n if (node.type === 'Group') {\r\n // Ignore children of groups with quantifier (+/*/?)\r\n // These groups are unrelated to start/end tokens of terminals\r\n const group = node as Group;\r\n if (group.quantifier) {\r\n return;\r\n }\r\n }\r\n super.visitChildren(node);\r\n }\r\n}\r\n\r\nconst visitor = new TerminalRegExpVisitor();\r\n\r\nexport function getTerminalParts(regexp: RegExp | string): Array<{ start: string, end: string }> {\r\n try {\r\n if (typeof regexp !== 'string') {\r\n regexp = regexp.source;\r\n }\r\n regexp = `/${regexp}/`;\r\n const pattern = regexpParser.pattern(regexp);\r\n const parts: Array<{ start: string, end: string }> = [];\r\n for (const alternative of pattern.value.value) {\r\n visitor.reset(regexp);\r\n visitor.visit(alternative);\r\n parts.push({\r\n start: visitor.startRegexp,\r\n end: visitor.endRegex\r\n });\r\n }\r\n return parts;\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nexport function isMultilineComment(regexp: RegExp | string): boolean {\r\n try {\r\n if (typeof regexp === 'string') {\r\n regexp = new RegExp(regexp);\r\n }\r\n regexp = regexp.toString();\r\n visitor.reset(regexp);\r\n // Parsing the pattern might fail (since it's user code)\r\n visitor.visit(regexpParser.pattern(regexp));\r\n return visitor.multiline;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * A set of all characters that are considered whitespace by the '\\s' RegExp character class.\r\n * Taken from [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions/Character_classes).\r\n */\r\nexport const whitespaceCharacters = (\r\n '\\f\\n\\r\\t\\v\\u0020\\u00a0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007' +\r\n '\\u2008\\u2009\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff').split('');\r\n\r\nexport function isWhitespace(value: RegExp | string): boolean {\r\n const regexp = typeof value === 'string' ? new RegExp(value) : value;\r\n return whitespaceCharacters.some((ws) => regexp.test(ws));\r\n}\r\n\r\nexport function escapeRegExp(value: string): string {\r\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\nexport function getCaseInsensitivePattern(keyword: string): string {\r\n return Array.prototype.map.call(keyword, letter =>\r\n /\\w/.test(letter) ? `[${letter.toLowerCase()}${letter.toUpperCase()}]` : escapeRegExp(letter)\r\n ).join('');\r\n}\r\n\r\n/**\r\n * Determines whether the given input has a partial match with the specified regex.\r\n * @param regex The regex to partially match against\r\n * @param input The input string\r\n * @returns Whether any match exists.\r\n */\r\nexport function partialMatches(regex: RegExp | string, input: string): boolean {\r\n const partial = partialRegExp(regex);\r\n const match = input.match(partial);\r\n return !!match && match[0].length > 0;\r\n}\r\n\r\n/**\r\n * Builds a partial regex from the input regex. A partial regex is able to match incomplete input strings. E.g.\r\n * a partial regex constructed from `/ab/` is able to match the string `a` without needing a following `b` character. However it won't match `b` alone.\r\n * @param regex The input regex to be converted.\r\n * @returns A partial regex constructed from the input regex.\r\n */\r\nexport function partialRegExp(regex: RegExp | string): RegExp {\r\n if (typeof regex === 'string') {\r\n regex = new RegExp(regex);\r\n }\r\n const re = regex, source = regex.source;\r\n let i = 0;\r\n\r\n function process() {\r\n let result = '',\r\n tmp;\r\n\r\n function appendRaw(nbChars: number) {\r\n result += source.substr(i, nbChars);\r\n i += nbChars;\r\n }\r\n\r\n function appendOptional(nbChars: number) {\r\n result += '(?:' + source.substr(i, nbChars) + '|$)';\r\n i += nbChars;\r\n }\r\n\r\n while (i < source.length) {\r\n switch (source[i]) {\r\n case '\\\\':\r\n switch (source[i + 1]) {\r\n case 'c':\r\n appendOptional(3);\r\n break;\r\n case 'x':\r\n appendOptional(4);\r\n break;\r\n case 'u':\r\n if (re.unicode) {\r\n if (source[i + 2] === '{') {\r\n appendOptional(source.indexOf('}', i) - i + 1);\r\n } else {\r\n appendOptional(6);\r\n }\r\n } else {\r\n appendOptional(2);\r\n }\r\n break;\r\n case 'p':\r\n case 'P':\r\n if (re.unicode) {\r\n appendOptional(source.indexOf('}', i) - i + 1);\r\n } else {\r\n appendOptional(2);\r\n }\r\n break;\r\n case 'k':\r\n appendOptional(source.indexOf('>', i) - i + 1);\r\n break;\r\n default:\r\n appendOptional(2);\r\n break;\r\n }\r\n break;\r\n\r\n case '[':\r\n tmp = /\\[(?:\\\\.|.)*?\\]/g;\r\n tmp.lastIndex = i;\r\n tmp = tmp.exec(source) || [];\r\n appendOptional(tmp[0].length);\r\n break;\r\n\r\n case '|':\r\n case '^':\r\n case '$':\r\n case '*':\r\n case '+':\r\n case '?':\r\n appendRaw(1);\r\n break;\r\n case '{':\r\n tmp = /\\{\\d+,?\\d*\\}/g;\r\n tmp.lastIndex = i;\r\n tmp = tmp.exec(source);\r\n if (tmp) {\r\n appendRaw(tmp[0].length);\r\n } else {\r\n appendOptional(1);\r\n }\r\n break;\r\n case '(':\r\n if (source[i + 1] === '?') {\r\n switch (source[i + 2]) {\r\n case ':':\r\n result += '(?:';\r\n i += 3;\r\n result += process() + '|$)';\r\n break;\r\n case '=':\r\n result += '(?=';\r\n i += 3;\r\n result += process() + ')';\r\n break;\r\n case '!':\r\n tmp = i;\r\n i += 3;\r\n process();\r\n result += source.substr(tmp, i - tmp);\r\n break;\r\n case '<':\r\n switch (source[i + 3]) {\r\n case '=':\r\n case '!':\r\n tmp = i;\r\n i += 4;\r\n process();\r\n result += source.substr(tmp, i - tmp);\r\n break;\r\n default:\r\n appendRaw(source.indexOf('>', i) - i + 1);\r\n result += process() + '|$)';\r\n break;\r\n }\r\n break;\r\n }\r\n } else {\r\n appendRaw(1);\r\n result += process() + '|$)';\r\n }\r\n break;\r\n case ')':\r\n ++i;\r\n return result;\r\n default:\r\n appendOptional(1);\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n return new RegExp(process(), regex.flags);\r\n}\r\n", "import type { Character, IRegExpAST, RegExpFlags } from \"../types\";\n\nexport function cc(char: string): number {\n return char.charCodeAt(0);\n}\n\nexport function insertToSet<T>(item: T | T[], set: T[]) {\n if (Array.isArray(item)) {\n item.forEach(function (subItem) {\n set.push(subItem);\n });\n } else {\n set.push(item);\n }\n}\n\nexport function addFlag(\n flagObj: RegExpFlags,\n flagKey: keyof Omit<RegExpFlags, keyof IRegExpAST>,\n) {\n if (flagObj[flagKey] === true) {\n throw \"duplicate flag \" + flagKey;\n }\n\n const x: boolean = flagObj[flagKey];\n flagObj[flagKey] = true;\n}\n\nexport function ASSERT_EXISTS<T = Object>(obj: any): obj is T {\n // istanbul ignore next\n if (obj === undefined) {\n throw Error(\"Internal Error - Should never get here!\");\n }\n return true;\n}\n\n// istanbul ignore next\nexport function ASSERT_NEVER_REACH_HERE(): any {\n throw Error(\"Internal Error - Should never get here!\");\n}\n\nexport function isCharacter(obj: { type: string }): obj is Character {\n return obj[\"type\"] === \"Character\";\n}\n", "import { cc } from \"./utils.js\";\n\nexport const digitsCharCodes: number[] = [];\nfor (let i = cc(\"0\"); i <= cc(\"9\"); i++) {\n digitsCharCodes.push(i);\n}\n\nexport const wordCharCodes: number[] = [cc(\"_\")].concat(digitsCharCodes);\nfor (let i = cc(\"a\"); i <= cc(\"z\"); i++) {\n wordCharCodes.push(i);\n}\n\nfor (let i = cc(\"A\"); i <= cc(\"Z\"); i++) {\n wordCharCodes.push(i);\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#character-classes\nexport const whitespaceCodes: number[] = [\n cc(\" \"),\n cc(\"\\f\"),\n cc(\"\\n\"),\n cc(\"\\r\"),\n cc(\"\\t\"),\n cc(\"\\v\"),\n cc(\"\\t\"),\n cc(\"\\u00a0\"),\n cc(\"\\u1680\"),\n cc(\"\\u2000\"),\n cc(\"\\u2001\"),\n cc(\"\\u2002\"),\n cc(\"\\u2003\"),\n cc(\"\\u2004\"),\n cc(\"\\u2005\"),\n cc(\"\\u2006\"),\n cc(\"\\u2007\"),\n cc(\"\\u2008\"),\n cc(\"\\u2009\"),\n cc(\"\\u200a\"),\n cc(\"\\u2028\"),\n cc(\"\\u2029\"),\n cc(\"\\u202f\"),\n cc(\"\\u205f\"),\n cc(\"\\u3000\"),\n cc(\"\\ufeff\"),\n];\n", "import type {\n Alternative,\n Assertion,\n Atom,\n Character,\n Disjunction,\n Group,\n GroupBackReference,\n Location,\n Quantifier,\n Range,\n RegExpFlags,\n RegExpPattern,\n Set,\n Term,\n} from \"../types\";\nimport {\n addFlag,\n ASSERT_EXISTS,\n ASSERT_NEVER_REACH_HERE,\n cc,\n insertToSet,\n isCharacter,\n} from \"./utils.js\";\nimport {\n digitsCharCodes,\n whitespaceCodes,\n wordCharCodes,\n} from \"./character-classes.js\";\n\n// consts and utilities\nconst hexDigitPattern = /[0-9a-fA-F]/;\nconst decimalPattern = /[0-9]/;\nconst decimalPatternNoZero = /[1-9]/;\n\n// https://hackernoon.com/the-madness-of-parsing-real-world-javascript-regexps-d9ee336df983\n// https://www.ecma-international.org/ecma-262/8.0/index.html#prod-Pattern\nexport class RegExpParser {\n protected idx: number = 0;\n protected input: string = \"\";\n protected groupIdx: number = 0;\n\n protected saveState() {\n return {\n idx: this.idx,\n input: this.input,\n groupIdx: this.groupIdx,\n };\n }\n\n protected restoreState(newState: {\n idx: number;\n input: string;\n groupIdx: number;\n }) {\n this.idx = newState.idx;\n this.input = newState.input;\n this.groupIdx = newState.groupIdx;\n }\n\n public pattern(input: string): RegExpPattern {\n // parser state\n this.idx = 0;\n this.input = input;\n this.groupIdx = 0;\n\n this.consumeChar(\"/\");\n const value = this.disjunction();\n this.consumeChar(\"/\");\n\n const flags: RegExpFlags = {\n type: \"Flags\",\n loc: { begin: this.idx, end: input.length },\n global: false,\n ignoreCase: false,\n multiLine: false,\n unicode: false,\n sticky: false,\n };\n\n while (this.isRegExpFlag()) {\n switch (this.popChar()) {\n case \"g\":\n addFlag(flags, \"global\");\n break;\n case \"i\":\n addFlag(flags, \"ignoreCase\");\n break;\n case \"m\":\n addFlag(flags, \"multiLine\");\n break;\n case \"u\":\n addFlag(flags, \"unicode\");\n break;\n case \"y\":\n addFlag(flags, \"sticky\");\n break;\n }\n }\n\n if (this.idx !== this.input.length) {\n throw Error(\"Redundant input: \" + this.input.substring(this.idx));\n }\n return {\n type: \"Pattern\",\n flags: flags,\n value: value,\n loc: this.loc(0),\n };\n }\n\n protected disjunction(): Disjunction {\n const alts = [];\n const begin = this.idx;\n\n alts.push(this.alternative());\n\n while (this.peekChar() === \"|\") {\n this.consumeChar(\"|\");\n alts.push(this.alternative());\n }\n\n return { type: \"Disjunction\", value: alts, loc: this.loc(begin) };\n }\n\n protected alternative(): Alternative {\n const terms = [];\n const begin = this.idx;\n\n while (this.isTerm()) {\n terms.push(this.term());\n }\n\n return { type: \"Alternative\", value: terms, loc: this.loc(begin) };\n }\n\n protected term(): Term {\n if (this.isAssertion()) {\n return this.assertion();\n } else {\n return this.atom();\n }\n }\n\n protected assertion(): Assertion {\n const begin = this.idx;\n switch (this.popChar()) {\n case \"^\":\n return {\n type: \"StartAnchor\",\n loc: this.loc(begin),\n };\n case \"$\":\n return { type: \"EndAnchor\", loc: this.loc(begin) };\n // '\\b' or '\\B'\n case \"\\\\\":\n switch (this.popChar()) {\n case \"b\":\n return {\n type: \"WordBoundary\",\n loc: this.loc(begin),\n };\n case \"B\":\n return {\n type: \"NonWordBoundary\",\n loc: this.loc(begin),\n };\n }\n // istanbul ignore next\n throw Error(\"Invalid Assertion Escape\");\n // '(?=' or '(?!'\n case \"(\":\n this.consumeChar(\"?\");\n\n let type: \"Lookahead\" | \"NegativeLookahead\" | undefined;\n switch (this.popChar()) {\n case \"=\":\n type = \"Lookahead\";\n break;\n case \"!\":\n type = \"NegativeLookahead\";\n break;\n }\n ASSERT_EXISTS(type);\n\n const disjunction = this.disjunction();\n\n this.consumeChar(\")\");\n\n return {\n type: type!,\n value: disjunction,\n loc: this.loc(begin),\n };\n }\n // istanbul ignore next\n return ASSERT_NEVER_REACH_HERE();\n }\n\n protected quantifier(\n isBacktracking: boolean = false,\n ): Quantifier | undefined {\n let range: Partial<Quantifier> | undefined = undefined;\n const begin = this.idx;\n switch (this.popChar()) {\n case \"*\":\n range = {\n atLeast: 0,\n atMost: Infinity,\n };\n break;\n case \"+\":\n range = {\n atLeast: 1,\n atMost: Infinity,\n };\n break;\n case \"?\":\n range = {\n atLeast: 0,\n atMost: 1,\n };\n break;\n case \"{\":\n const atLeast = this.integerIncludingZero();\n switch (this.popChar()) {\n case \"}\":\n range = {\n atLeast: atLeast,\n atMost: atLeast,\n };\n break;\n case \",\":\n let atMost;\n if (this.isDigit()) {\n atMost = this.integerIncludingZero();\n range = {\n atLeast: atLeast,\n atMost: atMost,\n };\n } else {\n range = {\n atLeast: atLeast,\n atMost: Infinity,\n };\n }\n this.consumeChar(\"}\");\n break;\n }\n // throwing exceptions from \"ASSERT_EXISTS\" during backtracking\n // causes severe performance degradations\n if (isBacktracking === true && range === undefined) {\n return undefined;\n }\n ASSERT_EXISTS(range);\n break;\n }\n\n // throwing exceptions from \"ASSERT_EXISTS\" during backtracking\n // causes severe performance degradations\n if (isBacktracking === true && range === undefined) {\n return undefined;\n }\n\n // istanbul ignore else\n if (ASSERT_EXISTS(range)) {\n if (this.peekChar(0) === \"?\") {\n this.consumeChar(\"?\");\n range.greedy = false;\n } else {\n range.greedy = true;\n }\n\n range.type = \"Quantifier\";\n range.loc = this.loc(begin);\n return range as Quantifier;\n }\n }\n\n protected atom(): Atom {\n let atom: Omit<Atom, \"loc\" | \"type\"> | undefined;\n const begin = this.idx;\n switch (this.peekChar()) {\n case \".\":\n atom = this.dotAll();\n break;\n case \"\\\\\":\n atom = this.atomEscape();\n break;\n case \"[\":\n atom = this.characterClass();\n break;\n case \"(\":\n atom = this.group();\n break;\n }\n\n if (atom === undefined && this.isPatternCharacter()) {\n atom = this.patternCharacter();\n }\n\n // istanbul ignore else\n if (ASSERT_EXISTS<Atom>(atom)) {\n atom.loc = this.loc(begin);\n\n if (this.isQuantifier()) {\n atom.quantifier = this.quantifier();\n }\n\n return atom;\n }\n\n // istanbul ignore next\n return ASSERT_NEVER_REACH_HERE();\n }\n\n protected dotAll(): Omit<Set, \"loc\"> {\n this.consumeChar(\".\");\n return {\n type: \"Set\",\n complement: true,\n value: [cc(\"\\n\"), cc(\"\\r\"), cc(\"\\u2028\"), cc(\"\\u2029\")],\n };\n }\n\n protected atomEscape(): Omit<GroupBackReference | Set | Character, \"loc\"> {\n this.consumeChar(\"\\\\\");\n\n switch (this.peekChar()) {\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\":\n return this.decimalEscapeAtom();\n case \"d\":\n case \"D\":\n case \"s\":\n case \"S\":\n case \"w\":\n case \"W\":\n return this.characterClassEscape();\n case \"f\":\n case \"n\":\n case \"r\":\n case \"t\":\n case \"v\":\n return this.controlEscapeAtom();\n case \"c\":\n return this.controlLetterEscapeAtom();\n case \"0\":\n return this.nulCharacterAtom();\n case \"x\":\n return this.hexEscapeSequenceAtom();\n case \"u\":\n return this.regExpUnicodeEscapeSequenceAtom();\n default:\n return this.identityEscapeAtom();\n }\n }\n\n protected decimalEscapeAtom(): Omit<GroupBackReference, \"loc\"> {\n const value = this.positiveInteger();\n\n return { type: \"GroupBackReference\", value: value };\n }\n\n protected characterClassEscape(): Omit<Set, \"loc\"> {\n let set: (number | Range)[] | undefined;\n let complement = false;\n switch (this.popChar()) {\n case \"d\":\n set = digitsCharCodes;\n break;\n case \"D\":\n set = digitsCharCodes;\n complement = true;\n break;\n case \"s\":\n set = whitespaceCodes;\n break;\n case \"S\":\n set = whitespaceCodes;\n complement = true;\n break;\n case \"w\":\n set = wordCharCodes;\n break;\n case \"W\":\n set = wordCharCodes;\n complement = true;\n break;\n }\n\n // istanbul ignore else\n if (ASSERT_EXISTS(set)) {\n return { type: \"Set\", value: set, complement: complement };\n }\n // istanbul ignore next\n return ASSERT_NEVER_REACH_HERE();\n }\n\n protected controlEscapeAtom(): Omit<Character, \"loc\"> {\n let escapeCode;\n switch (this.popChar()) {\n case \"f\":\n escapeCode = cc(\"\\f\");\n break;\n case \"n\":\n escapeCode = cc(\"\\n\");\n break;\n case \"r\":\n escapeCode = cc(\"\\r\");\n break;\n case \"t\":\n escapeCode = cc(\"\\t\");\n break;\n case \"v\":\n escapeCode = cc(\"\\v\");\n break;\n }\n\n // istanbul ignore else\n if (ASSERT_EXISTS(escapeCode)) {\n return { type: \"Character\", value: escapeCode };\n }\n // istanbul ignore next\n return ASSERT_NEVER_REACH_HERE();\n }\n\n protected controlLetterEscapeAtom(): Omit<Character, \"loc\"> {\n this.consumeChar(\"c\");\n const letter = this.popChar();\n if (/[a-zA-Z]/.test(letter) === false) {\n throw Error(\"Invalid \");\n }\n\n const letterCode = letter.toUpperCase().charCodeAt(0) - 64;\n return { type: \"Character\", value: letterCode };\n }\n\n protected nulCharacterAtom(): Omit<Character, \"loc\"> {\n // TODO implement '[lookahead \u2209 DecimalDigit]'\n // TODO: for the deprecated octal escape sequence\n this.consumeChar(\"0\");\n return { type: \"Character\", value: cc(\"\\0\") };\n }\n\n protected hexEscapeSequenceAtom(): Omit<Character, \"loc\"> {\n this.consumeChar(\"x\");\n return this.parseHexDigits(2);\n }\n\n protected regExpUnicodeEscapeSequenceAtom(): Omit<Character, \"loc\"> {\n this.consumeChar(\"u\");\n return this.parseHexDigits(4);\n }\n\n protected identityEscapeAtom(): Omit<Character, \"loc\"> {\n // TODO: implement \"SourceCharacter but not UnicodeIDContinue\"\n // // http://unicode.org/reports/tr31/#Specific_Character_Adjustments\n const escapedChar = this.popChar();\n return { type: \"Character\", value: cc(escapedChar) };\n }\n\n protected classPatternCharacterAtom(): Omit<Character, \"loc\"> {\n switch (this.peekChar()) {\n // istanbul ignore next\n case \"\\n\":\n // istanbul ignore next\n case \"\\r\":\n // istanbul ignore next\n case \"\\u2028\":\n // istanbul ignore next\n case \"\\u2029\":\n // istanbul ignore next\n case \"\\\\\":\n // istanbul ignore next\n case \"]\":\n throw Error(\"TBD\");\n default:\n const nextChar = this.popChar();\n return { type: \"Character\", value: cc(nextChar) };\n }\n }\n\n protected characterClass(): Omit<Set, \"loc\"> {\n const set: (number | Range)[] = [];\n let complement = false;\n this.consumeChar(\"[\");\n if (this.peekChar(0) === \"^\") {\n this.consumeChar(\"^\");\n complement = true;\n }\n\n while (this.isClassAtom()) {\n const from = this.classAtom();\n const isFromSingleChar = from.type === \"Character\";\n if (isCharacter(from) && this.isRangeDash()) {\n this.consumeChar(\"-\");\n const to = this.classAtom();\n const isToSingleChar = to.type === \"Character\";\n\n // a range can only be used when both sides are single characters\n if (isCharacter(to)) {\n if (to.value < from.value) {\n throw Error(\"Range out of order in character class\");\n }\n set.push({ from: from.value, to: to.value });\n } else {\n // literal dash\n insertToSet(from.value, set);\n set.push(cc(\"-\"));\n insertToSet(to.value, set);\n }\n } else {\n insertToSet(from.value, set);\n }\n }\n\n this.consumeChar(\"]\");\n\n return { type: \"Set\", complement: complement, value: set };\n }\n\n protected classAtom(): Omit<Character | Set, \"loc\"> {\n switch (this.peekChar()) {\n // istanbul ignore next\n case \"]\":\n // istanbul ignore next\n case \"\\n\":\n // istanbul ignore next\n case \"\\r\":\n // istanbul ignore next\n case \"\\u2028\":\n // istanbul ignore next\n case \"\\u2029\":\n throw Error(\"TBD\");\n case \"\\\\\":\n return this.classEscape();\n default:\n return this.classPatternCharacterAtom();\n }\n }\n\n protected classEscape(): Omit<Character | Set, \"loc\"> {\n this.consumeChar(\"\\\\\");\n switch (this.peekChar()) {\n // Matches a backspace.\n // (Not to be confused with \\b word boundary outside characterClass)\n case \"b\":\n this.consumeChar(\"b\");\n return { type: \"Character\", value: cc(\"\\u0008\") };\n case \"d\":\n case \"D\":\n case \"s\":\n case \"S\":\n case \"w\":\n case \"W\":\n return this.characterClassEscape();\n case \"f\":\n case \"n\":\n case \"r\":\n case \"t\":\n case \"v\":\n return this.controlEscapeAtom();\n case \"c\":\n return this.controlLetterEscapeAtom();\n case \"0\":\n return this.nulCharacterAtom();\n case \"x\":\n return this.hexEscapeSequenceAtom();\n case \"u\":\n return this.regExpUnicodeEscapeSequenceAtom();\n default:\n return this.identityEscapeAtom();\n }\n }\n\n protected group(): Omit<Group, \"loc\"> {\n let capturing = true;\n this.consumeChar(\"(\");\n switch (this.peekChar(0)) {\n case \"?\":\n this.consumeChar(\"?\");\n this.consumeChar(\":\");\n capturing = false;\n break;\n default:\n this.groupIdx++;\n break;\n }\n const value = this.disjunction();\n this.consumeChar(\")\");\n\n const groupAst: Omit<Group, \"loc\"> = {\n type: \"Group\",\n capturing: capturing,\n value: value,\n };\n\n if (capturing) {\n groupAst[\"idx\"] = this.groupIdx;\n }\n\n return groupAst;\n }\n\n protected positiveInteger(): number {\n let number = this.popChar();\n\n // istanbul ignore next - can't ever get here due to previous lookahead checks\n // still implementing this error checking in case this ever changes.\n if (decimalPatternNoZero.test(number) === false) {\n throw Error(\"Expecting a positive integer\");\n }\n\n while (decimalPattern.test(this.peekChar(0))) {\n number += this.popChar();\n }\n\n return parseInt(number, 10);\n }\n\n protected integerIncludingZero(): number {\n let number = this.popChar();\n if (decimalPattern.test(number) === false) {\n throw Error(\"Expecting an integer\");\n }\n\n while (decimalPattern.test(this.peekChar(0))) {\n number += this.popChar();\n }\n\n return parseInt(number, 10);\n }\n\n protected patternCharacter(): Omit<Character, \"loc\"> {\n const nextChar = this.popChar();\n switch (nextChar) {\n // istanbul ignore next\n case \"\\n\":\n // istanbul ignore next\n case \"\\r\":\n // istanbul ignore next\n case \"\\u2028\":\n // istanbul ignore next\n case \"\\u2029\":\n // istanbul ignore next\n case \"^\":\n // istanbul ignore next\n case \"$\":\n // istanbul ignore next\n case \"\\\\\":\n // istanbul ignore next\n case \".\":\n // istanbul ignore next\n case \"*\":\n // istanbul ignore next\n case \"+\":\n // istanbul ignore next\n case \"?\":\n // istanbul ignore next\n case \"(\":\n // istanbul ignore next\n case \")\":\n // istanbul ignore next\n case \"[\":\n // istanbul ignore next\n case \"|\":\n // istanbul ignore next\n throw Error(\"TBD\");\n default:\n return { type: \"Character\", value: cc(nextChar) };\n }\n }\n protected isRegExpFlag(): boolean {\n switch (this.peekChar(0)) {\n case \"g\":\n case \"i\":\n case \"m\":\n case \"u\":\n case \"y\":\n return true;\n default:\n return false;\n }\n }\n\n protected isRangeDash(): boolean {\n return this.peekChar() === \"-\" && this.isClassAtom(1);\n }\n\n protected isDigit(): boolean {\n return decimalPattern.test(this.peekChar(0));\n }\n\n protected isClassAtom(howMuch = 0): boolean {\n switch (this.peekChar(howMuch)) {\n case \"]\":\n case \"\\n\":\n case \"\\r\":\n case \"\\u2028\":\n case \"\\u2029\":\n return false;\n default:\n return true;\n }\n }\n\n protected isTerm() {\n return this.isAtom() || this.isAssertion();\n }\n\n protected isAtom(): boolean {\n if (this.isPatternCharacter()) {\n return true;\n }\n\n switch (this.peekChar(0)) {\n case \".\":\n case \"\\\\\": // atomEscape\n case \"[\": // characterClass\n // TODO: isAtom must be called before isAssertion - disambiguate\n case \"(\": // group\n return true;\n default:\n return false;\n }\n }\n\n protected isAssertion(): boolean {\n switch (this.peekChar(0)) {\n case \"^\":\n case \"$\":\n return true;\n // '\\b' or '\\B'\n case \"\\\\\":\n switch (this.peekChar(1)) {\n case \"b\":\n case \"B\":\n return true;\n default:\n return false;\n }\n // '(?=' or '(?!'\n case \"(\":\n return (\n this.peekChar(1) === \"?\" &&\n (this.peekChar(2) === \"=\" || this.peekChar(2) === \"!\")\n );\n default:\n return false;\n }\n }\n\n protected isQuantifier(): boolean {\n const prevState = this.saveState();\n try {\n return this.quantifier(true) !== undefined;\n } catch (e) {\n return false;\n } finally {\n this.restoreState(prevState);\n }\n }\n\n protected isPatternCharacter(): boolean {\n switch (this.peekChar()) {\n case \"^\":\n case \"$\":\n case \"\\\\\":\n case \".\":\n case \"*\":\n case \"+\":\n case \"?\":\n case \"(\":\n case \")\":\n case \"[\":\n case \"|\":\n case \"/\":\n case \"\\n\":\n case \"\\r\":\n case \"\\u2028\":\n case \"\\u2029\":\n return false;\n default:\n return true;\n }\n }\n\n protected parseHexDigits(howMany: number): Omit<Character, \"loc\"> {\n let hexString = \"\";\n for (let i = 0; i < howMany; i++) {\n const hexChar = this.popChar();\n if (hexDigitPattern.test(hexChar) === false) {\n throw Error(\"Expecting a HexDecimal digits\");\n }\n hexString += hexChar;\n }\n const charCode = parseInt(hexString, 16);\n return { type: \"Character\", value: charCode };\n }\n\n protected peekChar(howMuch = 0): string {\n return this.input[this.idx + howMuch];\n }\n\n protected popChar(): string {\n const nextChar = this.peekChar(0);\n this.consumeChar(undefined);\n return nextChar;\n }\n\n protected consumeChar(char: string | undefined): void {\n if (char !== undefined && this.input[this.idx] !== char) {\n throw Error(\n \"Expected: '\" +\n char +\n \"' but found: '\" +\n this.input[this.idx] +\n \"' at offset: \" +\n this.idx,\n );\n }\n\n if (this.idx >= this.input.length) {\n throw Error(\"Unexpected end of input\");\n }\n this.idx++;\n }\n\n protected loc(begin: number): Location {\n return { begin: begin, end: this.idx };\n }\n}\n", "import type {\n Alternative,\n Assertion,\n Character,\n Disjunction,\n Group,\n GroupBackReference,\n IRegExpAST,\n Quantifier,\n RegExpAstPart,\n RegExpFlags,\n RegExpPattern,\n Set,\n} from \"../types\";\n\nexport class BaseRegExpVisitor {\n public visitChildren(node: IRegExpAST) {\n for (const key in node) {\n const child = (node as any)[key];\n /* istanbul ignore else */\n if (node.hasOwnProperty(key)) {\n if (child.type !== undefined) {\n this.visit(child);\n } else if (Array.isArray(child)) {\n child.forEach((subChild) => {\n this.visit(subChild);\n }, this);\n }\n }\n }\n }\n\n public visit(node: RegExpAstPart): void {\n switch (node.type) {\n case \"Pattern\":\n this.visitPattern(node);\n break;\n case \"Flags\":\n this.visitFlags(node);\n break;\n case \"Disjunction\":\n this.visitDisjunction(node);\n break;\n case \"Alternative\":\n this.visitAlternative(node);\n break;\n case \"StartAnchor\":\n this.visitStartAnchor(node);\n break;\n case \"EndAnchor\":\n this.visitEndAnchor(node);\n break;\n case \"WordBoundary\":\n this.visitWordBoundary(node);\n break;\n case \"NonWordBoundary\":\n this.visitNonWordBoundary(node);\n break;\n case \"Lookahead\":\n this.visitLookahead(node);\n break;\n case \"NegativeLookahead\":\n this.visitNegativeLookahead(node);\n break;\n case \"Character\":\n this.visitCharacter(node);\n break;\n case \"Set\":\n this.visitSet(node);\n break;\n case \"Group\":\n this.visitGroup(node);\n break;\n case \"GroupBackReference\":\n this.visitGroupBackReference(node);\n break;\n case \"Quantifier\":\n this.visitQuantifier(node);\n break;\n }\n\n this.visitChildren(node);\n }\n\n public visitPattern(node: RegExpPattern): void {}\n\n public visitFlags(node: RegExpFlags): void {}\n\n public visitDisjunction(node: Disjunction): void {}\n\n public visitAlternative(node: Alternative): void {}\n\n // Assertion\n public visitStartAnchor(node: Assertion): void {}\n\n public visitEndAnchor(node: Assertion): void {}\n\n public visitWordBoundary(node: Assertion): void {}\n\n public visitNonWordBoundary(node: Assertion): void {}\n\n public visitLookahead(node: Assertion): void {}\n\n public visitNegativeLookahead(node: Assertion): void {}\n\n // atoms\n public visitCharacter(node: Character): void {}\n\n public visitSet(node: Set): void {}\n\n public visitGroup(node: Group): void {}\n\n public visitGroupBackReference(node: GroupBackReference): void {}\n\n public visitQuantifier(node: Quantifier): void {}\n}\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport { DefaultNameRegexp } from '../utils/cst-utils.js';\r\nimport { isCommentTerminal, terminalRegex } from '../utils/grammar-utils.js';\r\nimport { isMultilineComment } from '../utils/regexp-utils.js';\r\nimport { isTerminalRule } from './generated/ast.js';\r\n\r\nexport interface GrammarConfig {\r\n /**\r\n * Lists all rule names which are classified as multiline comment rules\r\n */\r\n multilineCommentRules: string[]\r\n /**\r\n * A regular expression which matches characters of names\r\n */\r\n nameRegexp: RegExp\r\n}\r\n\r\n/**\r\n * Create the default grammar configuration (used by `createDefaultModule`). This can be overridden in a\r\n * language-specific module.\r\n */\r\nexport function createGrammarConfig(services: LangiumCoreServices): GrammarConfig {\r\n const rules: string[] = [];\r\n const grammar = services.Grammar;\r\n for (const rule of grammar.rules) {\r\n if (isTerminalRule(rule) && isCommentTerminal(rule) && isMultilineComment(terminalRegex(rule))) {\r\n rules.push(rule.name);\r\n }\r\n }\r\n return {\r\n multilineCommentRules: rules,\r\n nameRegexp: DefaultNameRegexp\r\n };\r\n}\r\n", "/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n", "import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n", "import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n", "import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n", "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n", "import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n", "/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n", "import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n", "/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nexport default arrayMap;\n", "/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n", "import Symbol from './_Symbol.js';\nimport arrayMap from './_arrayMap.js';\nimport isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default baseToString;\n", "/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nexport default trimmedEndIndex;\n", "import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nexport default baseTrim;\n", "/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n", "import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n", "import toNumber from './toNumber.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nexport default toFinite;\n", "import toFinite from './toFinite.js';\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nexport default toInteger;\n", "/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nexport default identity;\n", "import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n", "import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n", "import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n", "/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nexport default toSource;\n", "import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n", "/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n", "import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n", "import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nexport default WeakMap;\n", "import isObject from './isObject.js';\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nexport default baseCreate;\n", "/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nexport default apply;\n", "/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nexport default noop;\n", "/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nexport default copyArray;\n", "/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nexport default shortOut;\n", "/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nexport default constant;\n", "import getNative from './_getNative.js';\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nexport default defineProperty;\n", "import constant from './constant.js';\nimport defineProperty from './_defineProperty.js';\nimport identity from './identity.js';\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nexport default baseSetToString;\n", "import baseSetToString from './_baseSetToString.js';\nimport shortOut from './_shortOut.js';\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nexport default setToString;\n", "/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nexport default arrayEach;\n", "/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nexport default baseFindIndex;\n", "/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nexport default baseIsNaN;\n", "/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\nexport default strictIndexOf;\n", "import baseFindIndex from './_baseFindIndex.js';\nimport baseIsNaN from './_baseIsNaN.js';\nimport strictIndexOf from './_strictIndexOf.js';\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nexport default baseIndexOf;\n", "import baseIndexOf from './_baseIndexOf.js';\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nexport default arrayIncludes;\n", "/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n", "import defineProperty from './_defineProperty.js';\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nexport default baseAssignValue;\n", "/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n", "import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignValue;\n", "import assignValue from './_assignValue.js';\nimport baseAssignValue from './_baseAssignValue.js';\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nexport default copyObject;\n", "import apply from './_apply.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nexport default overRest;\n", "import identity from './identity.js';\nimport overRest from './_overRest.js';\nimport setToString from './_setToString.js';\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nexport default baseRest;\n", "/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n", "import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n", "import eq from './eq.js';\nimport isArrayLike from './isArrayLike.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nexport default isIterateeCall;\n", "import baseRest from './_baseRest.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\nexport default createAssigner;\n", "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nexport default isPrototype;\n", "/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nexport default baseTimes;\n", "import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n", "import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n", "/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nexport default stubFalse;\n", "import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n", "import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n", "/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nexport default baseUnary;\n", "import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nexport default nodeUtil;\n", "import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n", "import baseTimes from './_baseTimes.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isIndex from './_isIndex.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default arrayLikeKeys;\n", "/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nexport default overArg;\n", "import overArg from './_overArg.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nexport default nativeKeys;\n", "import isPrototype from './_isPrototype.js';\nimport nativeKeys from './_nativeKeys.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeys;\n", "import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeys from './_baseKeys.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nexport default keys;\n", "import assignValue from './_assignValue.js';\nimport copyObject from './_copyObject.js';\nimport createAssigner from './_createAssigner.js';\nimport isArrayLike from './isArrayLike.js';\nimport isPrototype from './_isPrototype.js';\nimport keys from './keys.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */\nvar assign = createAssigner(function(object, source) {\n if (isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\n }\n }\n});\n\nexport default assign;\n", "/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default nativeKeysIn;\n", "import isObject from './isObject.js';\nimport isPrototype from './_isPrototype.js';\nimport nativeKeysIn from './_nativeKeysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeysIn;\n", "import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeysIn from './_baseKeysIn.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nexport default keysIn;\n", "import isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nexport default isKey;\n", "import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n", "import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nexport default hashClear;\n", "/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default hashDelete;\n", "import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n", "import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n", "import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nexport default hashSet;\n", "import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n", "/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nexport default listCacheClear;\n", "import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nexport default assocIndexOf;\n", "import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nexport default listCacheDelete;\n", "import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n", "import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n", "import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nexport default listCacheSet;\n", "import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n", "import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n", "import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nexport default mapCacheClear;\n", "/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nexport default isKeyable;\n", "import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nexport default getMapData;\n", "import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default mapCacheDelete;\n", "import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n", "import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n", "import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nexport default mapCacheSet;\n", "import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n", "import MapCache from './_MapCache.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nexport default memoize;\n", "import memoize from './memoize.js';\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nexport default memoizeCapped;\n", "import memoizeCapped from './_memoizeCapped.js';\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nexport default stringToPath;\n", "import baseToString from './_baseToString.js';\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nexport default toString;\n", "import isArray from './isArray.js';\nimport isKey from './_isKey.js';\nimport stringToPath from './_stringToPath.js';\nimport toString from './toString.js';\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nexport default castPath;\n", "import isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default toKey;\n", "import castPath from './_castPath.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nexport default baseGet;\n", "import baseGet from './_baseGet.js';\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nexport default get;\n", "/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nexport default arrayPush;\n", "import Symbol from './_Symbol.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nexport default isFlattenable;\n", "import arrayPush from './_arrayPush.js';\nimport isFlattenable from './_isFlattenable.js';\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nexport default baseFlatten;\n", "import baseFlatten from './_baseFlatten.js';\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n}\n\nexport default flatten;\n", "import overArg from './_overArg.js';\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nexport default getPrototype;\n", "/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\nexport default baseSlice;\n", "/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\nexport default arrayReduce;\n", "import ListCache from './_ListCache.js';\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nexport default stackClear;\n", "/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nexport default stackDelete;\n", "/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nexport default stackGet;\n", "/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nexport default stackHas;\n", "import ListCache from './_ListCache.js';\nimport Map from './_Map.js';\nimport MapCache from './_MapCache.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nexport default stackSet;\n", "import ListCache from './_ListCache.js';\nimport stackClear from './_stackClear.js';\nimport stackDelete from './_stackDelete.js';\nimport stackGet from './_stackGet.js';\nimport stackHas from './_stackHas.js';\nimport stackSet from './_stackSet.js';\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nexport default Stack;\n", "import copyObject from './_copyObject.js';\nimport keys from './keys.js';\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\nexport default baseAssign;\n", "import copyObject from './_copyObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n}\n\nexport default baseAssignIn;\n", "import root from './_root.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nexport default cloneBuffer;\n", "/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nexport default arrayFilter;\n", "/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nexport default stubArray;\n", "import arrayFilter from './_arrayFilter.js';\nimport stubArray from './stubArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nexport default getSymbols;\n", "import copyObject from './_copyObject.js';\nimport getSymbols from './_getSymbols.js';\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\nexport default copySymbols;\n", "import arrayPush from './_arrayPush.js';\nimport getPrototype from './_getPrototype.js';\nimport getSymbols from './_getSymbols.js';\nimport stubArray from './stubArray.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nexport default getSymbolsIn;\n", "import copyObject from './_copyObject.js';\nimport getSymbolsIn from './_getSymbolsIn.js';\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nexport default copySymbolsIn;\n", "import arrayPush from './_arrayPush.js';\nimport isArray from './isArray.js';\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nexport default baseGetAllKeys;\n", "import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbols from './_getSymbols.js';\nimport keys from './keys.js';\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nexport default getAllKeys;\n", "import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbolsIn from './_getSymbolsIn.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nexport default getAllKeysIn;\n", "import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nexport default DataView;\n", "import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nexport default Promise;\n", "import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nexport default Set;\n", "import DataView from './_DataView.js';\nimport Map from './_Map.js';\nimport Promise from './_Promise.js';\nimport Set from './_Set.js';\nimport WeakMap from './_WeakMap.js';\nimport baseGetTag from './_baseGetTag.js';\nimport toSource from './_toSource.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nexport default getTag;\n", "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nexport default initCloneArray;\n", "import root from './_root.js';\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nexport default Uint8Array;\n", "import Uint8Array from './_Uint8Array.js';\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nexport default cloneArrayBuffer;\n", "import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nexport default cloneDataView;\n", "/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nexport default cloneRegExp;\n", "import Symbol from './_Symbol.js';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nexport default cloneSymbol;\n", "import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nexport default cloneTypedArray;\n", "import cloneArrayBuffer from './_cloneArrayBuffer.js';\nimport cloneDataView from './_cloneDataView.js';\nimport cloneRegExp from './_cloneRegExp.js';\nimport cloneSymbol from './_cloneSymbol.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nexport default initCloneByTag;\n", "import baseCreate from './_baseCreate.js';\nimport getPrototype from './_getPrototype.js';\nimport isPrototype from './_isPrototype.js';\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nexport default initCloneObject;\n", "import getTag from './_getTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nexport default baseIsMap;\n", "import baseIsMap from './_baseIsMap.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nexport default isMap;\n", "import getTag from './_getTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nexport default baseIsSet;\n", "import baseIsSet from './_baseIsSet.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nexport default isSet;\n", "import Stack from './_Stack.js';\nimport arrayEach from './_arrayEach.js';\nimport assignValue from './_assignValue.js';\nimport baseAssign from './_baseAssign.js';\nimport baseAssignIn from './_baseAssignIn.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport copyArray from './_copyArray.js';\nimport copySymbols from './_copySymbols.js';\nimport copySymbolsIn from './_copySymbolsIn.js';\nimport getAllKeys from './_getAllKeys.js';\nimport getAllKeysIn from './_getAllKeysIn.js';\nimport getTag from './_getTag.js';\nimport initCloneArray from './_initCloneArray.js';\nimport initCloneByTag from './_initCloneByTag.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isMap from './isMap.js';\nimport isObject from './isObject.js';\nimport isSet from './isSet.js';\nimport keys from './keys.js';\nimport keysIn from './keysIn.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nexport default baseClone;\n", "import baseClone from './_baseClone.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\nfunction clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\n}\n\nexport default clone;\n", "/**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\nfunction compact(array) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nexport default compact;\n", "/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nexport default setCacheAdd;\n", "/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nexport default setCacheHas;\n", "import MapCache from './_MapCache.js';\nimport setCacheAdd from './_setCacheAdd.js';\nimport setCacheHas from './_setCacheHas.js';\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nexport default SetCache;\n", "/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nexport default arraySome;\n", "/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nexport default cacheHas;\n", "import SetCache from './_SetCache.js';\nimport arraySome from './_arraySome.js';\nimport cacheHas from './_cacheHas.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nexport default equalArrays;\n", "/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nexport default mapToArray;\n", "/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nexport default setToArray;\n", "import Symbol from './_Symbol.js';\nimport Uint8Array from './_Uint8Array.js';\nimport eq from './eq.js';\nimport equalArrays from './_equalArrays.js';\nimport mapToArray from './_mapToArray.js';\nimport setToArray from './_setToArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nexport default equalByTag;\n", "import getAllKeys from './_getAllKeys.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nexport default equalObjects;\n", "import Stack from './_Stack.js';\nimport equalArrays from './_equalArrays.js';\nimport equalByTag from './_equalByTag.js';\nimport equalObjects from './_equalObjects.js';\nimport getTag from './_getTag.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nexport default baseIsEqualDeep;\n", "import baseIsEqualDeep from './_baseIsEqualDeep.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nexport default baseIsEqual;\n", "import Stack from './_Stack.js';\nimport baseIsEqual from './_baseIsEqual.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nexport default baseIsMatch;\n", "import isObject from './isObject.js';\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nexport default isStrictComparable;\n", "import isStrictComparable from './_isStrictComparable.js';\nimport keys from './keys.js';\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nexport default getMatchData;\n", "/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nexport default matchesStrictComparable;\n", "import baseIsMatch from './_baseIsMatch.js';\nimport getMatchData from './_getMatchData.js';\nimport matchesStrictComparable from './_matchesStrictComparable.js';\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nexport default baseMatches;\n", "/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nexport default baseHasIn;\n", "import castPath from './_castPath.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isIndex from './_isIndex.js';\nimport isLength from './isLength.js';\nimport toKey from './_toKey.js';\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nexport default hasPath;\n", "import baseHasIn from './_baseHasIn.js';\nimport hasPath from './_hasPath.js';\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nexport default hasIn;\n", "import baseIsEqual from './_baseIsEqual.js';\nimport get from './get.js';\nimport hasIn from './hasIn.js';\nimport isKey from './_isKey.js';\nimport isStrictComparable from './_isStrictComparable.js';\nimport matchesStrictComparable from './_matchesStrictComparable.js';\nimport toKey from './_toKey.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nexport default baseMatchesProperty;\n", "/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nexport default baseProperty;\n", "import baseGet from './_baseGet.js';\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nexport default basePropertyDeep;\n", "import baseProperty from './_baseProperty.js';\nimport basePropertyDeep from './_basePropertyDeep.js';\nimport isKey from './_isKey.js';\nimport toKey from './_toKey.js';\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nexport default property;\n", "import baseMatches from './_baseMatches.js';\nimport baseMatchesProperty from './_baseMatchesProperty.js';\nimport identity from './identity.js';\nimport isArray from './isArray.js';\nimport property from './property.js';\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nexport default baseIteratee;\n", "/**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction arrayAggregator(array, setter, iteratee, accumulator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n var value = array[index];\n setter(accumulator, value, iteratee(value), array);\n }\n return accumulator;\n}\n\nexport default arrayAggregator;\n", "/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nexport default createBaseFor;\n", "import createBaseFor from './_createBaseFor.js';\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nexport default baseFor;\n", "import baseFor from './_baseFor.js';\nimport keys from './keys.js';\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nexport default baseForOwn;\n", "import isArrayLike from './isArrayLike.js';\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nexport default createBaseEach;\n", "import baseForOwn from './_baseForOwn.js';\nimport createBaseEach from './_createBaseEach.js';\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nexport default baseEach;\n", "import baseEach from './_baseEach.js';\n\n/**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction baseAggregator(collection, setter, iteratee, accumulator) {\n baseEach(collection, function(value, key, collection) {\n setter(accumulator, value, iteratee(value), collection);\n });\n return accumulator;\n}\n\nexport default baseAggregator;\n", "import arrayAggregator from './_arrayAggregator.js';\nimport baseAggregator from './_baseAggregator.js';\nimport baseIteratee from './_baseIteratee.js';\nimport isArray from './isArray.js';\n\n/**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\nfunction createAggregator(setter, initializer) {\n return function(collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n\n return func(collection, setter, baseIteratee(iteratee, 2), accumulator);\n };\n}\n\nexport default createAggregator;\n", "import baseRest from './_baseRest.js';\nimport eq from './eq.js';\nimport isIterateeCall from './_isIterateeCall.js';\nimport keysIn from './keysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n});\n\nexport default defaults;\n", "import isArrayLike from './isArrayLike.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nexport default isArrayLikeObject;\n", "/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nexport default arrayIncludesWith;\n", "import SetCache from './_SetCache.js';\nimport arrayIncludes from './_arrayIncludes.js';\nimport arrayIncludesWith from './_arrayIncludesWith.js';\nimport arrayMap from './_arrayMap.js';\nimport baseUnary from './_baseUnary.js';\nimport cacheHas from './_cacheHas.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n}\n\nexport default baseDifference;\n", "import baseDifference from './_baseDifference.js';\nimport baseFlatten from './_baseFlatten.js';\nimport baseRest from './_baseRest.js';\nimport isArrayLikeObject from './isArrayLikeObject.js';\n\n/**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\nvar difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n});\n\nexport default difference;\n", "/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nexport default last;\n", "import baseSlice from './_baseSlice.js';\nimport toInteger from './toInteger.js';\n\n/**\n * Creates a slice of `array` with `n` elements dropped from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.drop([1, 2, 3]);\n * // => [2, 3]\n *\n * _.drop([1, 2, 3], 2);\n * // => [3]\n *\n * _.drop([1, 2, 3], 5);\n * // => []\n *\n * _.drop([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\nfunction drop(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, n < 0 ? 0 : n, length);\n}\n\nexport default drop;\n", "import baseSlice from './_baseSlice.js';\nimport toInteger from './toInteger.js';\n\n/**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\nfunction dropRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, 0, n < 0 ? 0 : n);\n}\n\nexport default dropRight;\n", "import identity from './identity.js';\n\n/**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\nfunction castFunction(value) {\n return typeof value == 'function' ? value : identity;\n}\n\nexport default castFunction;\n", "import arrayEach from './_arrayEach.js';\nimport baseEach from './_baseEach.js';\nimport castFunction from './_castFunction.js';\nimport isArray from './isArray.js';\n\n/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, castFunction(iteratee));\n}\n\nexport default forEach;\n", "/**\n * A specialized version of `_.every` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */\nfunction arrayEvery(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n}\n\nexport default arrayEvery;\n", "import baseEach from './_baseEach.js';\n\n/**\n * The base implementation of `_.every` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`\n */\nfunction baseEvery(collection, predicate) {\n var result = true;\n baseEach(collection, function(value, index, collection) {\n result = !!predicate(value, index, collection);\n return result;\n });\n return result;\n}\n\nexport default baseEvery;\n", "import arrayEvery from './_arrayEvery.js';\nimport baseEvery from './_baseEvery.js';\nimport baseIteratee from './_baseIteratee.js';\nimport isArray from './isArray.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * Iteration is stopped once `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `true` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */\nfunction every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, baseIteratee(predicate, 3));\n}\n\nexport default every;\n", "import baseEach from './_baseEach.js';\n\n/**\n * The base implementation of `_.filter` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction baseFilter(collection, predicate) {\n var result = [];\n baseEach(collection, function(value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n}\n\nexport default baseFilter;\n", "import arrayFilter from './_arrayFilter.js';\nimport baseFilter from './_baseFilter.js';\nimport baseIteratee from './_baseIteratee.js';\nimport isArray from './isArray.js';\n\n/**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n *\n * // Combining several predicates using `_.overEvery` or `_.overSome`.\n * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n * // => objects for ['fred', 'barney']\n */\nfunction filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, baseIteratee(predicate, 3));\n}\n\nexport default filter;\n", "import baseIteratee from './_baseIteratee.js';\nimport isArrayLike from './isArrayLike.js';\nimport keys from './keys.js';\n\n/**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = baseIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n}\n\nexport default createFind;\n", "import baseFindIndex from './_baseFindIndex.js';\nimport baseIteratee from './_baseIteratee.js';\nimport toInteger from './toInteger.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\nfunction findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, baseIteratee(predicate, 3), index);\n}\n\nexport default findIndex;\n", "import createFind from './_createFind.js';\nimport findIndex from './findIndex.js';\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nexport default find;\n", "/**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias first\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.head([1, 2, 3]);\n * // => 1\n *\n * _.head([]);\n * // => undefined\n */\nfunction head(array) {\n return (array && array.length) ? array[0] : undefined;\n}\n\nexport default head;\n", "import baseEach from './_baseEach.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nexport default baseMap;\n", "import arrayMap from './_arrayMap.js';\nimport baseIteratee from './_baseIteratee.js';\nimport baseMap from './_baseMap.js';\nimport isArray from './isArray.js';\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, baseIteratee(iteratee, 3));\n}\n\nexport default map;\n", "import baseFlatten from './_baseFlatten.js';\nimport map from './map.js';\n\n/**\n * Creates a flattened array of values by running each element in `collection`\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\nfunction flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\n}\n\nexport default flatMap;\n", "import baseAssignValue from './_baseAssignValue.js';\nimport createAggregator from './_createAggregator.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\nvar groupBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n result[key].push(value);\n } else {\n baseAssignValue(result, key, [value]);\n }\n});\n\nexport default groupBy;\n", "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n}\n\nexport default baseHas;\n", "import baseHas from './_baseHas.js';\nimport hasPath from './_hasPath.js';\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n}\n\nexport default has;\n", "import baseGetTag from './_baseGetTag.js';\nimport isArray from './isArray.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nexport default isString;\n", "import arrayMap from './_arrayMap.js';\n\n/**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\nfunction baseValues(object, props) {\n return arrayMap(props, function(key) {\n return object[key];\n });\n}\n\nexport default baseValues;\n", "import baseValues from './_baseValues.js';\nimport keys from './keys.js';\n\n/**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\nfunction values(object) {\n return object == null ? [] : baseValues(object, keys(object));\n}\n\nexport default values;\n", "import baseIndexOf from './_baseIndexOf.js';\nimport isArrayLike from './isArrayLike.js';\nimport isString from './isString.js';\nimport toInteger from './toInteger.js';\nimport values from './values.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */\nfunction includes(collection, value, fromIndex, guard) {\n collection = isArrayLike(collection) ? collection : values(collection);\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n var length = collection.length;\n if (fromIndex < 0) {\n fromIndex = nativeMax(length + fromIndex, 0);\n }\n return isString(collection)\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n}\n\nexport default includes;\n", "import baseIndexOf from './_baseIndexOf.js';\nimport toInteger from './toInteger.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the\n * offset from the end of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // Search from the `fromIndex`.\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n */\nfunction indexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseIndexOf(array, value, index);\n}\n\nexport default indexOf;\n", "import baseKeys from './_baseKeys.js';\nimport getTag from './_getTag.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isArrayLike from './isArrayLike.js';\nimport isBuffer from './isBuffer.js';\nimport isPrototype from './_isPrototype.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n setTag = '[object Set]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\nfunction isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n}\n\nexport default isEmpty;\n", "import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar regexpTag = '[object RegExp]';\n\n/**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\nfunction baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\n}\n\nexport default baseIsRegExp;\n", "import baseIsRegExp from './_baseIsRegExp.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;\n\n/**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\nvar isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\nexport default isRegExp;\n", "/**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\nfunction isUndefined(value) {\n return value === undefined;\n}\n\nexport default isUndefined;\n", "/**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\nfunction baseLt(value, other) {\n return value < other;\n}\n\nexport default baseLt;\n", "import isSymbol from './isSymbol.js';\n\n/**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\nfunction baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n}\n\nexport default baseExtremum;\n", "import baseExtremum from './_baseExtremum.js';\nimport baseLt from './_baseLt.js';\nimport identity from './identity.js';\n\n/**\n * Computes the minimum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\nfunction min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n}\n\nexport default min;\n", "/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\nfunction negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function() {\n var args = arguments;\n switch (args.length) {\n case 0: return !predicate.call(this);\n case 1: return !predicate.call(this, args[0]);\n case 2: return !predicate.call(this, args[0], args[1]);\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\n }\n return !predicate.apply(this, args);\n };\n}\n\nexport default negate;\n", "import assignValue from './_assignValue.js';\nimport castPath from './_castPath.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nexport default baseSet;\n", "import baseGet from './_baseGet.js';\nimport baseSet from './_baseSet.js';\nimport castPath from './_castPath.js';\n\n/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n}\n\nexport default basePickBy;\n", "import arrayMap from './_arrayMap.js';\nimport baseIteratee from './_baseIteratee.js';\nimport basePickBy from './_basePickBy.js';\nimport getAllKeysIn from './_getAllKeysIn.js';\n\n/**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pickBy(object, _.isNumber);\n * // => { 'a': 1, 'c': 3 }\n */\nfunction pickBy(object, predicate) {\n if (object == null) {\n return {};\n }\n var props = arrayMap(getAllKeysIn(object), function(prop) {\n return [prop];\n });\n predicate = baseIteratee(predicate);\n return basePickBy(object, props, function(value, path) {\n return predicate(value, path[0]);\n });\n}\n\nexport default pickBy;\n", "/**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\nfunction baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n}\n\nexport default baseReduce;\n", "import arrayReduce from './_arrayReduce.js';\nimport baseEach from './_baseEach.js';\nimport baseIteratee from './_baseIteratee.js';\nimport baseReduce from './_baseReduce.js';\nimport isArray from './isArray.js';\n\n/**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\nfunction reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n}\n\nexport default reduce;\n", "import arrayFilter from './_arrayFilter.js';\nimport baseFilter from './_baseFilter.js';\nimport baseIteratee from './_baseIteratee.js';\nimport isArray from './isArray.js';\nimport negate from './negate.js';\n\n/**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */\nfunction reject(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(baseIteratee(predicate, 3)));\n}\n\nexport default reject;\n", "import baseEach from './_baseEach.js';\n\n/**\n * The base implementation of `_.some` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction baseSome(collection, predicate) {\n var result;\n\n baseEach(collection, function(value, index, collection) {\n result = predicate(value, index, collection);\n return !result;\n });\n return !!result;\n}\n\nexport default baseSome;\n", "import arraySome from './_arraySome.js';\nimport baseIteratee from './_baseIteratee.js';\nimport baseSome from './_baseSome.js';\nimport isArray from './isArray.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Checks if `predicate` returns truthy for **any** element of `collection`.\n * Iteration is stopped once `predicate` returns truthy. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.some(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.some(users, 'active');\n * // => true\n */\nfunction some(collection, predicate, guard) {\n var func = isArray(collection) ? arraySome : baseSome;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, baseIteratee(predicate, 3));\n}\n\nexport default some;\n", "import Set from './_Set.js';\nimport noop from './noop.js';\nimport setToArray from './_setToArray.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nexport default createSet;\n", "import SetCache from './_SetCache.js';\nimport arrayIncludes from './_arrayIncludes.js';\nimport arrayIncludesWith from './_arrayIncludesWith.js';\nimport cacheHas from './_cacheHas.js';\nimport createSet from './_createSet.js';\nimport setToArray from './_setToArray.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nexport default baseUniq;\n", "import baseUniq from './_baseUniq.js';\n\n/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\nfunction uniq(array) {\n return (array && array.length) ? baseUniq(array) : [];\n}\n\nexport default uniq;\n", "import baseIteratee from './_baseIteratee.js';\nimport baseUniq from './_baseUniq.js';\n\n/**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\nfunction uniqBy(array, iteratee) {\n return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];\n}\n\nexport default uniqBy;\n", "export function PRINT_ERROR(msg: string) {\n /* istanbul ignore else - can't override global.console in node.js */\n if (console && console.error) {\n console.error(`Error: ${msg}`);\n }\n}\n\nexport function PRINT_WARNING(msg: string) {\n /* istanbul ignore else - can't override global.console in node.js*/\n if (console && console.warn) {\n // TODO: modify docs accordingly\n console.warn(`Warning: ${msg}`);\n }\n}\n", "export function timer<T>(func: () => T): { time: number; value: T } {\n const start = new Date().getTime();\n const val = func();\n const end = new Date().getTime();\n const total = end - start;\n return { time: total, value: val };\n}\n", "// based on: https://github.com/petkaantonov/bluebird/blob/b97c0d2d487e8c5076e8bd897e0dcd4622d31846/src/util.js#L201-L216\nexport function toFastProperties(toBecomeFast: any) {\n function FakeConstructor() {}\n\n // If our object is used as a constructor, it would receive\n FakeConstructor.prototype = toBecomeFast;\n const fakeInstance = new (FakeConstructor as any)();\n\n function fakeAccess() {\n return typeof fakeInstance.bar;\n }\n\n // help V8 understand this is a \"real\" prototype by actually using\n // the fake instance.\n fakeAccess();\n fakeAccess();\n\n // Always true condition to suppress the Firefox warning of unreachable\n // code after a return statement.\n if (1) return toBecomeFast;\n\n // Eval prevents optimization of this method (even though this is dead code)\n // - https://esbuild.github.io/content-types/#direct-eval\n /* istanbul ignore next */\n // tslint:disable-next-line\n (0, eval)(toBecomeFast);\n}\n", "import { assign, forEach, isRegExp, isString, map, pickBy } from \"lodash-es\";\nimport type {\n IGASTVisitor,\n IProduction,\n IProductionWithOccurrence,\n ISerializedGast,\n TokenType,\n} from \"@chevrotain/types\";\n\n// TODO: duplicated code to avoid extracting another sub-package -- how to avoid?\nfunction tokenLabel(tokType: TokenType): string {\n if (hasTokenLabel(tokType)) {\n return tokType.LABEL;\n } else {\n return tokType.name;\n }\n}\n\n// TODO: duplicated code to avoid extracting another sub-package -- how to avoid?\nfunction hasTokenLabel(\n obj: TokenType,\n): obj is TokenType & Pick<Required<TokenType>, \"LABEL\"> {\n return isString(obj.LABEL) && obj.LABEL !== \"\";\n}\n\nexport abstract class AbstractProduction<T extends IProduction = IProduction>\n implements IProduction\n{\n public get definition(): T[] {\n return this._definition;\n }\n public set definition(value: T[]) {\n this._definition = value;\n }\n\n constructor(protected _definition: T[]) {}\n\n accept(visitor: IGASTVisitor): void {\n visitor.visit(this);\n forEach(this.definition, (prod) => {\n prod.accept(visitor);\n });\n }\n}\n\nexport class NonTerminal\n extends AbstractProduction\n implements IProductionWithOccurrence\n{\n public nonTerminalName!: string;\n public label?: string;\n public referencedRule!: Rule;\n public idx: number = 1;\n\n constructor(options: {\n nonTerminalName: string;\n label?: string;\n referencedRule?: Rule;\n idx?: number;\n }) {\n super([]);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n\n set definition(definition: IProduction[]) {\n // immutable\n }\n\n get definition(): IProduction[] {\n if (this.referencedRule !== undefined) {\n return this.referencedRule.definition;\n }\n return [];\n }\n\n accept(visitor: IGASTVisitor): void {\n visitor.visit(this);\n // don't visit children of a reference, we will get cyclic infinite loops if we do so\n }\n}\n\nexport class Rule extends AbstractProduction {\n public name!: string;\n public orgText: string = \"\";\n\n constructor(options: {\n name: string;\n definition: IProduction[];\n orgText?: string;\n }) {\n super(options.definition);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n}\n\nexport class Alternative extends AbstractProduction {\n public ignoreAmbiguities: boolean = false;\n\n constructor(options: {\n definition: IProduction[];\n ignoreAmbiguities?: boolean;\n }) {\n super(options.definition);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n}\n\nexport class Option\n extends AbstractProduction\n implements IProductionWithOccurrence\n{\n public idx: number = 1;\n public maxLookahead?: number;\n\n constructor(options: {\n definition: IProduction[];\n idx?: number;\n maxLookahead?: number;\n }) {\n super(options.definition);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n}\n\nexport class RepetitionMandatory\n extends AbstractProduction\n implements IProductionWithOccurrence\n{\n public idx: number = 1;\n public maxLookahead?: number;\n\n constructor(options: {\n definition: IProduction[];\n idx?: number;\n maxLookahead?: number;\n }) {\n super(options.definition);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n}\n\nexport class RepetitionMandatoryWithSeparator\n extends AbstractProduction\n implements IProductionWithOccurrence\n{\n public separator!: TokenType;\n public idx: number = 1;\n public maxLookahead?: number;\n\n constructor(options: {\n definition: IProduction[];\n separator: TokenType;\n idx?: number;\n }) {\n super(options.definition);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n}\n\nexport class Repetition\n extends AbstractProduction\n implements IProductionWithOccurrence\n{\n public separator!: TokenType;\n public idx: number = 1;\n public maxLookahead?: number;\n\n constructor(options: {\n definition: IProduction[];\n idx?: number;\n maxLookahead?: number;\n }) {\n super(options.definition);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n}\n\nexport class RepetitionWithSeparator\n extends AbstractProduction\n implements IProductionWithOccurrence\n{\n public separator!: TokenType;\n public idx: number = 1;\n public maxLookahead?: number;\n\n constructor(options: {\n definition: IProduction[];\n separator: TokenType;\n idx?: number;\n }) {\n super(options.definition);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n}\n\nexport class Alternation\n extends AbstractProduction<Alternative>\n implements IProductionWithOccurrence\n{\n public idx: number = 1;\n public ignoreAmbiguities: boolean = false;\n public hasPredicates: boolean = false;\n public maxLookahead?: number;\n\n public get definition(): Alternative[] {\n return this._definition;\n }\n public set definition(value: Alternative[]) {\n this._definition = value;\n }\n\n constructor(options: {\n definition: Alternative[];\n idx?: number;\n ignoreAmbiguities?: boolean;\n hasPredicates?: boolean;\n maxLookahead?: number;\n }) {\n super(options.definition);\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n}\n\nexport class Terminal implements IProductionWithOccurrence {\n public terminalType!: TokenType;\n public label?: string;\n public idx: number = 1;\n\n constructor(options: {\n terminalType: TokenType;\n label?: string;\n idx?: number;\n }) {\n assign(\n this,\n pickBy(options, (v) => v !== undefined),\n );\n }\n\n accept(visitor: IGASTVisitor): void {\n visitor.visit(this);\n }\n}\n\nexport interface ISerializedBasic extends ISerializedGast {\n type:\n | \"Alternative\"\n | \"Option\"\n | \"RepetitionMandatory\"\n | \"Repetition\"\n | \"Alternation\";\n idx?: number;\n}\n\nexport interface ISerializedGastRule extends ISerializedGast {\n type: \"Rule\";\n name: string;\n orgText: string;\n}\n\nexport interface ISerializedNonTerminal extends ISerializedGast {\n type: \"NonTerminal\";\n name: string;\n label?: string;\n idx: number;\n}\n\nexport interface ISerializedTerminal extends ISerializedGast {\n type: \"Terminal\";\n name: string;\n terminalLabel?: string;\n label?: string;\n pattern?: string;\n idx: number;\n}\n\nexport interface ISerializedTerminalWithSeparator extends ISerializedGast {\n type: \"RepetitionMandatoryWithSeparator\" | \"RepetitionWithSeparator\";\n idx: number;\n separator: ISerializedTerminal;\n}\n\nexport type ISerializedGastAny =\n | ISerializedBasic\n | ISerializedGastRule\n | ISerializedNonTerminal\n | ISerializedTerminal\n | ISerializedTerminalWithSeparator;\n\nexport function serializeGrammar(topRules: Rule[]): ISerializedGast[] {\n return map(topRules, serializeProduction);\n}\n\nexport function serializeProduction(node: IProduction): ISerializedGast {\n function convertDefinition(definition: IProduction[]): ISerializedGast[] {\n return map(definition, serializeProduction);\n }\n /* istanbul ignore else */\n if (node instanceof NonTerminal) {\n const serializedNonTerminal: ISerializedNonTerminal = {\n type: \"NonTerminal\",\n name: node.nonTerminalName,\n idx: node.idx,\n };\n\n if (isString(node.label)) {\n serializedNonTerminal.label = node.label;\n }\n\n return serializedNonTerminal;\n } else if (node instanceof Alternative) {\n return <ISerializedBasic>{\n type: \"Alternative\",\n definition: convertDefinition(node.definition),\n };\n } else if (node instanceof Option) {\n return <ISerializedBasic>{\n type: \"Option\",\n idx: node.idx,\n definition: convertDefinition(node.definition),\n };\n } else if (node instanceof RepetitionMandatory) {\n return <ISerializedBasic>{\n type: \"RepetitionMandatory\",\n idx: node.idx,\n definition: convertDefinition(node.definition),\n };\n } else if (node instanceof RepetitionMandatoryWithSeparator) {\n return <ISerializedTerminalWithSeparator>{\n type: \"RepetitionMandatoryWithSeparator\",\n idx: node.idx,\n separator: <ISerializedTerminal>(\n serializeProduction(new Terminal({ terminalType: node.separator }))\n ),\n definition: convertDefinition(node.definition),\n };\n } else if (node instanceof RepetitionWithSeparator) {\n return <ISerializedTerminalWithSeparator>{\n type: \"RepetitionWithSeparator\",\n idx: node.idx,\n separator: <ISerializedTerminal>(\n serializeProduction(new Terminal({ terminalType: node.separator }))\n ),\n definition: convertDefinition(node.definition),\n };\n } else if (node instanceof Repetition) {\n return <ISerializedBasic>{\n type: \"Repetition\",\n idx: node.idx,\n definition: convertDefinition(node.definition),\n };\n } else if (node instanceof Alternation) {\n return <ISerializedBasic>{\n type: \"Alternation\",\n idx: node.idx,\n definition: convertDefinition(node.definition),\n };\n } else if (node instanceof Terminal) {\n const serializedTerminal = <ISerializedTerminal>{\n type: \"Terminal\",\n name: node.terminalType.name,\n label: tokenLabel(node.terminalType),\n idx: node.idx,\n };\n\n if (isString(node.label)) {\n serializedTerminal.terminalLabel = node.label;\n }\n\n const pattern = node.terminalType.PATTERN;\n if (node.terminalType.PATTERN) {\n serializedTerminal.pattern = isRegExp(pattern)\n ? (<any>pattern).source\n : pattern;\n }\n\n return serializedTerminal;\n } else if (node instanceof Rule) {\n return <ISerializedGastRule>{\n type: \"Rule\",\n name: node.name,\n orgText: node.orgText,\n definition: convertDefinition(node.definition),\n };\n /* c8 ignore next 3 */\n } else {\n throw Error(\"non exhaustive match\");\n }\n}\n", "import {\n Alternation,\n Alternative,\n NonTerminal,\n Option,\n Repetition,\n RepetitionMandatory,\n RepetitionMandatoryWithSeparator,\n RepetitionWithSeparator,\n Rule,\n Terminal,\n} from \"./model.js\";\nimport type { IProduction } from \"@chevrotain/types\";\n\nexport abstract class GAstVisitor {\n public visit(node: IProduction): any {\n const nodeAny: any = node;\n switch (nodeAny.constructor) {\n case NonTerminal:\n return this.visitNonTerminal(nodeAny);\n case Alternative:\n return this.visitAlternative(nodeAny);\n case Option:\n return this.visitOption(nodeAny);\n case RepetitionMandatory:\n return this.visitRepetitionMandatory(nodeAny);\n case RepetitionMandatoryWithSeparator:\n return this.visitRepetitionMandatoryWithSeparator(nodeAny);\n case RepetitionWithSeparator:\n return this.visitRepetitionWithSeparator(nodeAny);\n case Repetition:\n return this.visitRepetition(nodeAny);\n case Alternation:\n return this.visitAlternation(nodeAny);\n case Terminal:\n return this.visitTerminal(nodeAny);\n case Rule:\n return this.visitRule(nodeAny);\n /* c8 ignore next 2 */\n default:\n throw Error(\"non exhaustive match\");\n }\n }\n\n /* c8 ignore next */\n public visitNonTerminal(node: NonTerminal): any {}\n\n /* c8 ignore next */\n public visitAlternative(node: Alternative): any {}\n\n /* c8 ignore next */\n public visitOption(node: Option): any {}\n\n /* c8 ignore next */\n public visitRepetition(node: Repetition): any {}\n\n /* c8 ignore next */\n public visitRepetitionMandatory(node: RepetitionMandatory): any {}\n\n /* c8 ignore next 3 */\n public visitRepetitionMandatoryWithSeparator(\n node: RepetitionMandatoryWithSeparator,\n ): any {}\n\n /* c8 ignore next */\n public visitRepetitionWithSeparator(node: RepetitionWithSeparator): any {}\n\n /* c8 ignore next */\n public visitAlternation(node: Alternation): any {}\n\n /* c8 ignore next */\n public visitTerminal(node: Terminal): any {}\n\n /* c8 ignore next */\n public visitRule(node: Rule): any {}\n}\n", "import { every, includes, some } from \"lodash-es\";\nimport {\n AbstractProduction,\n Alternation,\n Alternative,\n NonTerminal,\n Option,\n Repetition,\n RepetitionMandatory,\n RepetitionMandatoryWithSeparator,\n RepetitionWithSeparator,\n Rule,\n Terminal,\n} from \"./model.js\";\nimport type { IProduction, IProductionWithOccurrence } from \"@chevrotain/types\";\n\nexport function isSequenceProd(\n prod: IProduction,\n): prod is { definition: IProduction[] } & IProduction {\n return (\n prod instanceof Alternative ||\n prod instanceof Option ||\n prod instanceof Repetition ||\n prod instanceof RepetitionMandatory ||\n prod instanceof RepetitionMandatoryWithSeparator ||\n prod instanceof RepetitionWithSeparator ||\n prod instanceof Terminal ||\n prod instanceof Rule\n );\n}\n\nexport function isOptionalProd(\n prod: IProduction,\n alreadyVisited: NonTerminal[] = [],\n): boolean {\n const isDirectlyOptional =\n prod instanceof Option ||\n prod instanceof Repetition ||\n prod instanceof RepetitionWithSeparator;\n if (isDirectlyOptional) {\n return true;\n }\n\n // note that this can cause infinite loop if one optional empty TOP production has a cyclic dependency with another\n // empty optional top rule\n // may be indirectly optional ((A?B?C?) | (D?E?F?))\n if (prod instanceof Alternation) {\n // for OR its enough for just one of the alternatives to be optional\n return some((<Alternation>prod).definition, (subProd: IProduction) => {\n return isOptionalProd(subProd, alreadyVisited);\n });\n } else if (prod instanceof NonTerminal && includes(alreadyVisited, prod)) {\n // avoiding stack overflow due to infinite recursion\n return false;\n } else if (prod instanceof AbstractProduction) {\n if (prod instanceof NonTerminal) {\n alreadyVisited.push(prod);\n }\n return every(\n (<AbstractProduction>prod).definition,\n (subProd: IProduction) => {\n return isOptionalProd(subProd, alreadyVisited);\n },\n );\n } else {\n return false;\n }\n}\n\nexport function isBranchingProd(\n prod: IProduction,\n): prod is { definition: IProduction[] } & IProduction {\n return prod instanceof Alternation;\n}\n\nexport function getProductionDslName(prod: IProductionWithOccurrence): string {\n /* istanbul ignore else */\n if (prod instanceof NonTerminal) {\n return \"SUBRULE\";\n } else if (prod instanceof Option) {\n return \"OPTION\";\n } else if (prod instanceof Alternation) {\n return \"OR\";\n } else if (prod instanceof RepetitionMandatory) {\n return \"AT_LEAST_ONE\";\n } else if (prod instanceof RepetitionMandatoryWithSeparator) {\n return \"AT_LEAST_ONE_SEP\";\n } else if (prod instanceof RepetitionWithSeparator) {\n return \"MANY_SEP\";\n } else if (prod instanceof Repetition) {\n return \"MANY\";\n } else if (prod instanceof Terminal) {\n return \"CONSUME\";\n /* c8 ignore next 3 */\n } else {\n throw Error(\"non exhaustive match\");\n }\n}\n", "import { drop, forEach } from \"lodash-es\";\nimport {\n Alternation,\n Alternative,\n NonTerminal,\n Option,\n Repetition,\n RepetitionMandatory,\n RepetitionMandatoryWithSeparator,\n RepetitionWithSeparator,\n Terminal,\n} from \"@chevrotain/gast\";\nimport { IProduction } from \"@chevrotain/types\";\n\n/**\n * A Grammar Walker that computes the \"remaining\" grammar \"after\" a productions in the grammar.\n */\nexport abstract class RestWalker {\n walk(prod: { definition: IProduction[] }, prevRest: any[] = []): void {\n forEach(prod.definition, (subProd: IProduction, index) => {\n const currRest = drop(prod.definition, index + 1);\n /* istanbul ignore else */\n if (subProd instanceof NonTerminal) {\n this.walkProdRef(subProd, currRest, prevRest);\n } else if (subProd instanceof Terminal) {\n this.walkTerminal(subProd, currRest, prevRest);\n } else if (subProd instanceof Alternative) {\n this.walkFlat(subProd, currRest, prevRest);\n } else if (subProd instanceof Option) {\n this.walkOption(subProd, currRest, prevRest);\n } else if (subProd instanceof RepetitionMandatory) {\n this.walkAtLeastOne(subProd, currRest, prevRest);\n } else if (subProd instanceof RepetitionMandatoryWithSeparator) {\n this.walkAtLeastOneSep(subProd, currRest, prevRest);\n } else if (subProd instanceof RepetitionWithSeparator) {\n this.walkManySep(subProd, currRest, prevRest);\n } else if (subProd instanceof Repetition) {\n this.walkMany(subProd, currRest, prevRest);\n } else if (subProd instanceof Alternation) {\n this.walkOr(subProd, currRest, prevRest);\n } else {\n throw Error(\"non exhaustive match\");\n }\n });\n }\n\n walkTerminal(\n terminal: Terminal,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {}\n\n walkProdRef(\n refProd: NonTerminal,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {}\n\n walkFlat(\n flatProd: Alternative,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // ABCDEF => after the D the rest is EF\n const fullOrRest = currRest.concat(prevRest);\n this.walk(flatProd, <any>fullOrRest);\n }\n\n walkOption(\n optionProd: Option,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // ABC(DE)?F => after the (DE)? the rest is F\n const fullOrRest = currRest.concat(prevRest);\n this.walk(optionProd, <any>fullOrRest);\n }\n\n walkAtLeastOne(\n atLeastOneProd: RepetitionMandatory,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // ABC(DE)+F => after the (DE)+ the rest is (DE)?F\n const fullAtLeastOneRest: IProduction[] = [\n new Option({ definition: atLeastOneProd.definition }),\n ].concat(<any>currRest, <any>prevRest);\n this.walk(atLeastOneProd, fullAtLeastOneRest);\n }\n\n walkAtLeastOneSep(\n atLeastOneSepProd: RepetitionMandatoryWithSeparator,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // ABC DE(,DE)* F => after the (,DE)+ the rest is (,DE)?F\n const fullAtLeastOneSepRest = restForRepetitionWithSeparator(\n atLeastOneSepProd,\n currRest,\n prevRest,\n );\n this.walk(atLeastOneSepProd, fullAtLeastOneSepRest);\n }\n\n walkMany(\n manyProd: Repetition,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // ABC(DE)*F => after the (DE)* the rest is (DE)?F\n const fullManyRest: IProduction[] = [\n new Option({ definition: manyProd.definition }),\n ].concat(<any>currRest, <any>prevRest);\n this.walk(manyProd, fullManyRest);\n }\n\n walkManySep(\n manySepProd: RepetitionWithSeparator,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // ABC (DE(,DE)*)? F => after the (,DE)* the rest is (,DE)?F\n const fullManySepRest = restForRepetitionWithSeparator(\n manySepProd,\n currRest,\n prevRest,\n );\n this.walk(manySepProd, fullManySepRest);\n }\n\n walkOr(\n orProd: Alternation,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // ABC(D|E|F)G => when finding the (D|E|F) the rest is G\n const fullOrRest = currRest.concat(prevRest);\n // walk all different alternatives\n forEach(orProd.definition, (alt) => {\n // wrapping each alternative in a single definition wrapper\n // to avoid errors in computing the rest of that alternative in the invocation to computeInProdFollows\n // (otherwise for OR([alt1,alt2]) alt2 will be considered in 'rest' of alt1\n const prodWrapper = new Alternative({ definition: [alt] });\n this.walk(prodWrapper, <any>fullOrRest);\n });\n }\n}\n\nfunction restForRepetitionWithSeparator(\n repSepProd: RepetitionWithSeparator,\n currRest: IProduction[],\n prevRest: IProduction[],\n) {\n const repSepRest = [\n new Option({\n definition: [\n new Terminal({ terminalType: repSepProd.separator }) as IProduction,\n ].concat(repSepProd.definition),\n }) as IProduction,\n ];\n const fullRepSepRest: IProduction[] = repSepRest.concat(currRest, prevRest);\n return fullRepSepRest;\n}\n", "import { flatten, map, uniq } from \"lodash-es\";\nimport {\n isBranchingProd,\n isOptionalProd,\n isSequenceProd,\n NonTerminal,\n Terminal,\n} from \"@chevrotain/gast\";\nimport { IProduction, TokenType } from \"@chevrotain/types\";\n\nexport function first(prod: IProduction): TokenType[] {\n /* istanbul ignore else */\n if (prod instanceof NonTerminal) {\n // this could in theory cause infinite loops if\n // (1) prod A refs prod B.\n // (2) prod B refs prod A\n // (3) AB can match the empty set\n // in other words a cycle where everything is optional so the first will keep\n // looking ahead for the next optional part and will never exit\n // currently there is no safeguard for this unique edge case because\n // (1) not sure a grammar in which this can happen is useful for anything (productive)\n return first((<NonTerminal>prod).referencedRule);\n } else if (prod instanceof Terminal) {\n return firstForTerminal(<Terminal>prod);\n } else if (isSequenceProd(prod)) {\n return firstForSequence(prod);\n } else if (isBranchingProd(prod)) {\n return firstForBranching(prod);\n } else {\n throw Error(\"non exhaustive match\");\n }\n}\n\nexport function firstForSequence(prod: {\n definition: IProduction[];\n}): TokenType[] {\n let firstSet: TokenType[] = [];\n const seq = prod.definition;\n let nextSubProdIdx = 0;\n let hasInnerProdsRemaining = seq.length > nextSubProdIdx;\n let currSubProd;\n // so we enter the loop at least once (if the definition is not empty\n let isLastInnerProdOptional = true;\n // scan a sequence until it's end or until we have found a NONE optional production in it\n while (hasInnerProdsRemaining && isLastInnerProdOptional) {\n currSubProd = seq[nextSubProdIdx];\n isLastInnerProdOptional = isOptionalProd(currSubProd);\n firstSet = firstSet.concat(first(currSubProd));\n nextSubProdIdx = nextSubProdIdx + 1;\n hasInnerProdsRemaining = seq.length > nextSubProdIdx;\n }\n\n return uniq(firstSet);\n}\n\nexport function firstForBranching(prod: {\n definition: IProduction[];\n}): TokenType[] {\n const allAlternativesFirsts: TokenType[][] = map(\n prod.definition,\n (innerProd) => {\n return first(innerProd);\n },\n );\n return uniq(flatten<TokenType>(allAlternativesFirsts));\n}\n\nexport function firstForTerminal(terminal: Terminal): TokenType[] {\n return [terminal.terminalType];\n}\n", "// TODO: can this be removed? where is it used?\nexport const IN = \"_~IN~_\";\n", "import { RestWalker } from \"./rest.js\";\nimport { first } from \"./first.js\";\nimport { assign, forEach } from \"lodash-es\";\nimport { IN } from \"../constants.js\";\nimport { Alternative, NonTerminal, Rule, Terminal } from \"@chevrotain/gast\";\nimport { IProduction, TokenType } from \"@chevrotain/types\";\n\n// This ResyncFollowsWalker computes all of the follows required for RESYNC\n// (skipping reference production).\nexport class ResyncFollowsWalker extends RestWalker {\n public follows: Record<string, TokenType[]> = {};\n\n constructor(private topProd: Rule) {\n super();\n }\n\n startWalking(): Record<string, TokenType[]> {\n this.walk(this.topProd);\n return this.follows;\n }\n\n walkTerminal(\n terminal: Terminal,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // do nothing! just like in the public sector after 13:00\n }\n\n walkProdRef(\n refProd: NonTerminal,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n const followName =\n buildBetweenProdsFollowPrefix(refProd.referencedRule, refProd.idx) +\n this.topProd.name;\n const fullRest: IProduction[] = currRest.concat(prevRest);\n const restProd = new Alternative({ definition: fullRest });\n const t_in_topProd_follows = first(restProd);\n this.follows[followName] = t_in_topProd_follows;\n }\n}\n\nexport function computeAllProdsFollows(\n topProductions: Rule[],\n): Record<string, TokenType[]> {\n const reSyncFollows = {};\n\n forEach(topProductions, (topProd) => {\n const currRefsFollow = new ResyncFollowsWalker(topProd).startWalking();\n assign(reSyncFollows, currRefsFollow);\n });\n return reSyncFollows;\n}\n\nexport function buildBetweenProdsFollowPrefix(\n inner: Rule,\n occurenceInParent: number,\n): string {\n return inner.name + occurenceInParent + IN;\n}\n\nexport function buildInProdFollowPrefix(terminal: Terminal): string {\n const terminalName = terminal.terminalType.name;\n return terminalName + terminal.idx + IN;\n}\n", "import {\n Alternative,\n Assertion,\n Atom,\n Disjunction,\n RegExpParser,\n RegExpPattern,\n} from \"@chevrotain/regexp-to-ast\";\n\nlet regExpAstCache: { [regex: string]: RegExpPattern } = {};\nconst regExpParser = new RegExpParser();\n\n// this should be moved to regexp-to-ast\nexport type ASTNode =\n | RegExpPattern\n | Disjunction\n | Alternative\n | Assertion\n | Atom;\n\nexport function getRegExpAst(regExp: RegExp): RegExpPattern {\n const regExpStr = regExp.toString();\n if (regExpAstCache.hasOwnProperty(regExpStr)) {\n return regExpAstCache[regExpStr];\n } else {\n const regExpAst = regExpParser.pattern(regExpStr);\n regExpAstCache[regExpStr] = regExpAst;\n return regExpAst;\n }\n}\n\nexport function clearRegExpParserCache() {\n regExpAstCache = {};\n}\n", "import {\n Alternative,\n Atom,\n BaseRegExpVisitor,\n Character,\n Disjunction,\n Group,\n Set,\n} from \"@chevrotain/regexp-to-ast\";\nimport { every, find, forEach, includes, isArray, values } from \"lodash-es\";\nimport { PRINT_ERROR, PRINT_WARNING } from \"@chevrotain/utils\";\nimport { ASTNode, getRegExpAst } from \"./reg_exp_parser.js\";\nimport { charCodeToOptimizedIndex, minOptimizationVal } from \"./lexer.js\";\n\nconst complementErrorMessage =\n \"Complement Sets are not supported for first char optimization\";\nexport const failedOptimizationPrefixMsg =\n 'Unable to use \"first char\" lexer optimizations:\\n';\n\nexport function getOptimizedStartCodesIndices(\n regExp: RegExp,\n ensureOptimizations = false,\n): number[] {\n try {\n const ast = getRegExpAst(regExp);\n const firstChars = firstCharOptimizedIndices(\n ast.value,\n {},\n ast.flags.ignoreCase,\n );\n return firstChars;\n } catch (e) {\n /* istanbul ignore next */\n // Testing this relies on the regexp-to-ast library having a bug... */\n // TODO: only the else branch needs to be ignored, try to fix with newer prettier / tsc\n if (e.message === complementErrorMessage) {\n if (ensureOptimizations) {\n PRINT_WARNING(\n `${failedOptimizationPrefixMsg}` +\n `\\tUnable to optimize: < ${regExp.toString()} >\\n` +\n \"\\tComplement Sets cannot be automatically optimized.\\n\" +\n \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.\",\n );\n }\n } else {\n let msgSuffix = \"\";\n if (ensureOptimizations) {\n msgSuffix =\n \"\\n\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.\";\n }\n PRINT_ERROR(\n `${failedOptimizationPrefixMsg}\\n` +\n `\\tFailed parsing: < ${regExp.toString()} >\\n` +\n `\\tUsing the @chevrotain/regexp-to-ast library\\n` +\n \"\\tPlease open an issue at: https://github.com/chevrotain/chevrotain/issues\" +\n msgSuffix,\n );\n }\n }\n\n return [];\n}\n\nexport function firstCharOptimizedIndices(\n ast: ASTNode,\n result: { [charCode: number]: number },\n ignoreCase: boolean,\n): number[] {\n switch (ast.type) {\n case \"Disjunction\":\n for (let i = 0; i < ast.value.length; i++) {\n firstCharOptimizedIndices(ast.value[i], result, ignoreCase);\n }\n break;\n case \"Alternative\":\n const terms = ast.value;\n for (let i = 0; i < terms.length; i++) {\n const term = terms[i];\n\n // skip terms that cannot effect the first char results\n switch (term.type) {\n case \"EndAnchor\":\n // A group back reference cannot affect potential starting char.\n // because if a back reference is the first production than automatically\n // the group being referenced has had to come BEFORE so its codes have already been added\n case \"GroupBackReference\":\n // assertions do not affect potential starting codes\n case \"Lookahead\":\n case \"NegativeLookahead\":\n case \"StartAnchor\":\n case \"WordBoundary\":\n case \"NonWordBoundary\":\n continue;\n }\n\n const atom = term;\n switch (atom.type) {\n case \"Character\":\n addOptimizedIdxToResult(atom.value, result, ignoreCase);\n break;\n case \"Set\":\n if (atom.complement === true) {\n throw Error(complementErrorMessage);\n }\n forEach(atom.value, (code) => {\n if (typeof code === \"number\") {\n addOptimizedIdxToResult(code, result, ignoreCase);\n } else {\n // range\n const range = code as any;\n // cannot optimize when ignoreCase is\n if (ignoreCase === true) {\n for (\n let rangeCode = range.from;\n rangeCode <= range.to;\n rangeCode++\n ) {\n addOptimizedIdxToResult(rangeCode, result, ignoreCase);\n }\n }\n // Optimization (2 orders of magnitude less work for very large ranges)\n else {\n // handle unoptimized values\n for (\n let rangeCode = range.from;\n rangeCode <= range.to && rangeCode < minOptimizationVal;\n rangeCode++\n ) {\n addOptimizedIdxToResult(rangeCode, result, ignoreCase);\n }\n\n // Less common charCode where we optimize for faster init time, by using larger \"buckets\"\n if (range.to >= minOptimizationVal) {\n const minUnOptVal =\n range.from >= minOptimizationVal\n ? range.from\n : minOptimizationVal;\n const maxUnOptVal = range.to;\n const minOptIdx = charCodeToOptimizedIndex(minUnOptVal);\n const maxOptIdx = charCodeToOptimizedIndex(maxUnOptVal);\n\n for (\n let currOptIdx = minOptIdx;\n currOptIdx <= maxOptIdx;\n currOptIdx++\n ) {\n result[currOptIdx] = currOptIdx;\n }\n }\n }\n }\n });\n break;\n case \"Group\":\n firstCharOptimizedIndices(atom.value, result, ignoreCase);\n break;\n /* istanbul ignore next */\n default:\n throw Error(\"Non Exhaustive Match\");\n }\n\n // reached a mandatory production, no more **start** codes can be found on this alternative\n const isOptionalQuantifier =\n atom.quantifier !== undefined && atom.quantifier.atLeast === 0;\n if (\n // A group may be optional due to empty contents /(?:)/\n // or if everything inside it is optional /((a)?)/\n (atom.type === \"Group\" && isWholeOptional(atom) === false) ||\n // If this term is not a group it may only be optional if it has an optional quantifier\n (atom.type !== \"Group\" && isOptionalQuantifier === false)\n ) {\n break;\n }\n }\n break;\n /* istanbul ignore next */\n default:\n throw Error(\"non exhaustive match!\");\n }\n\n // console.log(Object.keys(result).length)\n return values(result);\n}\n\nfunction addOptimizedIdxToResult(\n code: number,\n result: { [charCode: number]: number },\n ignoreCase: boolean,\n) {\n const optimizedCharIdx = charCodeToOptimizedIndex(code);\n result[optimizedCharIdx] = optimizedCharIdx;\n\n if (ignoreCase === true) {\n handleIgnoreCase(code, result);\n }\n}\n\nfunction handleIgnoreCase(\n code: number,\n result: { [charCode: number]: number },\n) {\n const char = String.fromCharCode(code);\n const upperChar = char.toUpperCase();\n /* istanbul ignore else */\n if (upperChar !== char) {\n const optimizedCharIdx = charCodeToOptimizedIndex(upperChar.charCodeAt(0));\n result[optimizedCharIdx] = optimizedCharIdx;\n } else {\n const lowerChar = char.toLowerCase();\n if (lowerChar !== char) {\n const optimizedCharIdx = charCodeToOptimizedIndex(\n lowerChar.charCodeAt(0),\n );\n result[optimizedCharIdx] = optimizedCharIdx;\n }\n }\n}\n\nfunction findCode(setNode: Set, targetCharCodes: number[]) {\n return find(setNode.value, (codeOrRange) => {\n if (typeof codeOrRange === \"number\") {\n return includes(targetCharCodes, codeOrRange);\n } else {\n // range\n const range = <any>codeOrRange;\n return (\n find(\n targetCharCodes,\n (targetCode) => range.from <= targetCode && targetCode <= range.to,\n ) !== undefined\n );\n }\n });\n}\n\nfunction isWholeOptional(ast: any): boolean {\n const quantifier = (ast as Atom).quantifier;\n if (quantifier && quantifier.atLeast === 0) {\n return true;\n }\n\n if (!ast.value) {\n return false;\n }\n\n return isArray(ast.value)\n ? every(ast.value, isWholeOptional)\n : isWholeOptional(ast.value);\n}\n\nclass CharCodeFinder extends BaseRegExpVisitor {\n found: boolean = false;\n\n constructor(private targetCharCodes: number[]) {\n super();\n }\n\n visitChildren(node: ASTNode) {\n // No need to keep looking...\n if (this.found === true) {\n return;\n }\n\n // switch lookaheads as they do not actually consume any characters thus\n // finding a charCode at lookahead context does not mean that regexp can actually contain it in a match.\n switch (node.type) {\n case \"Lookahead\":\n this.visitLookahead(node);\n return;\n case \"NegativeLookahead\":\n this.visitNegativeLookahead(node);\n return;\n }\n\n super.visitChildren(node);\n }\n\n visitCharacter(node: Character) {\n if (includes(this.targetCharCodes, node.value)) {\n this.found = true;\n }\n }\n\n visitSet(node: Set) {\n if (node.complement) {\n if (findCode(node, this.targetCharCodes) === undefined) {\n this.found = true;\n }\n } else {\n if (findCode(node, this.targetCharCodes) !== undefined) {\n this.found = true;\n }\n }\n }\n}\n\nexport function canMatchCharCode(\n charCodes: number[],\n pattern: RegExp | string,\n) {\n if (pattern instanceof RegExp) {\n const ast = getRegExpAst(pattern);\n const charCodeFinder = new CharCodeFinder(charCodes);\n charCodeFinder.visit(ast);\n return charCodeFinder.found;\n } else {\n return (\n find(<any>pattern, (char) => {\n return includes(charCodes, (<string>char).charCodeAt(0));\n }) !== undefined\n );\n }\n}\n", "import { BaseRegExpVisitor } from \"@chevrotain/regexp-to-ast\";\nimport {\n IRegExpExec,\n Lexer,\n LexerDefinitionErrorType,\n} from \"./lexer_public.js\";\nimport {\n compact,\n defaults,\n difference,\n filter,\n find,\n first,\n flatten,\n forEach,\n has,\n includes,\n indexOf,\n isArray,\n isEmpty,\n isFunction,\n isRegExp,\n isString,\n isUndefined,\n keys,\n map,\n reduce,\n reject,\n values,\n} from \"lodash-es\";\nimport { PRINT_ERROR } from \"@chevrotain/utils\";\nimport {\n canMatchCharCode,\n failedOptimizationPrefixMsg,\n getOptimizedStartCodesIndices,\n} from \"./reg_exp.js\";\nimport {\n ILexerDefinitionError,\n ILineTerminatorsTester,\n IMultiModeLexerDefinition,\n IToken,\n TokenType,\n} from \"@chevrotain/types\";\nimport { getRegExpAst } from \"./reg_exp_parser.js\";\n\nconst PATTERN = \"PATTERN\";\nexport const DEFAULT_MODE = \"defaultMode\";\nexport const MODES = \"modes\";\n\nexport interface IPatternConfig {\n pattern: IRegExpExec | string;\n longerAlt: number[] | undefined;\n canLineTerminator: boolean;\n isCustom: boolean;\n short: number | false;\n group: string | undefined | false;\n push: string | undefined;\n pop: boolean;\n tokenType: TokenType;\n tokenTypeIdx: number;\n}\n\nexport interface IAnalyzeResult {\n patternIdxToConfig: IPatternConfig[];\n charCodeToPatternIdxToConfig: { [charCode: number]: IPatternConfig[] };\n emptyGroups: { [groupName: string]: IToken[] };\n hasCustom: boolean;\n canBeOptimized: boolean;\n}\n\nexport let SUPPORT_STICKY =\n typeof (<any>new RegExp(\"(?:)\")).sticky === \"boolean\";\n\nexport function disableSticky() {\n SUPPORT_STICKY = false;\n}\n\nexport function enableSticky() {\n SUPPORT_STICKY = true;\n}\n\nexport function analyzeTokenTypes(\n tokenTypes: TokenType[],\n options: {\n positionTracking?: \"full\" | \"onlyStart\" | \"onlyOffset\";\n ensureOptimizations?: boolean;\n lineTerminatorCharacters?: (number | string)[];\n // TODO: should `useSticky` be an argument here?\n useSticky?: boolean;\n safeMode?: boolean;\n tracer?: (msg: string, action: () => void) => void;\n },\n): IAnalyzeResult {\n options = defaults(options, {\n useSticky: SUPPORT_STICKY,\n debug: false as boolean,\n safeMode: false as boolean,\n positionTracking: \"full\",\n lineTerminatorCharacters: [\"\\r\", \"\\n\"],\n tracer: (msg: string, action: Function) => action(),\n });\n\n const tracer = options.tracer!;\n\n tracer(\"initCharCodeToOptimizedIndexMap\", () => {\n initCharCodeToOptimizedIndexMap();\n });\n\n let onlyRelevantTypes: TokenType[];\n tracer(\"Reject Lexer.NA\", () => {\n onlyRelevantTypes = reject(tokenTypes, (currType) => {\n return currType[PATTERN] === Lexer.NA;\n });\n });\n\n let hasCustom = false;\n let allTransformedPatterns: (IRegExpExec | string)[];\n tracer(\"Transform Patterns\", () => {\n hasCustom = false;\n allTransformedPatterns = map(\n onlyRelevantTypes,\n (currType): IRegExpExec | string => {\n const currPattern = currType[PATTERN];\n\n /* istanbul ignore else */\n if (isRegExp(currPattern)) {\n const regExpSource = currPattern.source;\n if (\n regExpSource.length === 1 &&\n // only these regExp meta characters which can appear in a length one regExp\n regExpSource !== \"^\" &&\n regExpSource !== \"$\" &&\n regExpSource !== \".\" &&\n !currPattern.ignoreCase\n ) {\n return regExpSource;\n } else if (\n regExpSource.length === 2 &&\n regExpSource[0] === \"\\\\\" &&\n // not a meta character\n !includes(\n [\n \"d\",\n \"D\",\n \"s\",\n \"S\",\n \"t\",\n \"r\",\n \"n\",\n \"t\",\n \"0\",\n \"c\",\n \"b\",\n \"B\",\n \"f\",\n \"v\",\n \"w\",\n \"W\",\n ],\n regExpSource[1],\n )\n ) {\n // escaped meta Characters: /\\+/ /\\[/\n // or redundant escaping: /\\a/\n // without the escaping \"\\\"\n return regExpSource[1];\n } else {\n return options.useSticky\n ? addStickyFlag(currPattern)\n : addStartOfInput(currPattern);\n }\n } else if (isFunction(currPattern)) {\n hasCustom = true;\n // CustomPatternMatcherFunc - custom patterns do not require any transformations, only wrapping in a RegExp Like object\n return { exec: currPattern };\n } else if (typeof currPattern === \"object\") {\n hasCustom = true;\n // ICustomPattern\n return currPattern;\n } else if (typeof currPattern === \"string\") {\n if (currPattern.length === 1) {\n return currPattern;\n } else {\n const escapedRegExpString = currPattern.replace(\n /[\\\\^$.*+?()[\\]{}|]/g,\n \"\\\\$&\",\n );\n const wrappedRegExp = new RegExp(escapedRegExpString);\n return options.useSticky\n ? addStickyFlag(wrappedRegExp)\n : addStartOfInput(wrappedRegExp);\n }\n } else {\n throw Error(\"non exhaustive match\");\n }\n },\n );\n });\n\n let patternIdxToType: number[];\n let patternIdxToGroup: (string | undefined | false)[];\n let patternIdxToLongerAltIdxArr: (number[] | undefined)[];\n let patternIdxToPushMode: (string | undefined)[];\n let patternIdxToPopMode: boolean[];\n tracer(\"misc mapping\", () => {\n patternIdxToType = map(\n onlyRelevantTypes,\n (currType) => currType.tokenTypeIdx!,\n );\n\n patternIdxToGroup = map(onlyRelevantTypes, (clazz: any) => {\n const groupName = clazz.GROUP;\n /* istanbul ignore next */\n if (groupName === Lexer.SKIPPED) {\n return undefined;\n } else if (isString(groupName)) {\n return groupName;\n } else if (isUndefined(groupName)) {\n return false;\n } else {\n throw Error(\"non exhaustive match\");\n }\n });\n\n patternIdxToLongerAltIdxArr = map(onlyRelevantTypes, (clazz: any) => {\n const longerAltType = clazz.LONGER_ALT;\n\n if (longerAltType) {\n const longerAltIdxArr = isArray(longerAltType)\n ? map(longerAltType, (type: any) => indexOf(onlyRelevantTypes, type))\n : [indexOf(onlyRelevantTypes, longerAltType)];\n return longerAltIdxArr;\n }\n });\n\n patternIdxToPushMode = map(\n onlyRelevantTypes,\n (clazz: any) => clazz.PUSH_MODE,\n );\n\n patternIdxToPopMode = map(onlyRelevantTypes, (clazz: any) =>\n has(clazz, \"POP_MODE\"),\n );\n });\n\n let patternIdxToCanLineTerminator: boolean[];\n tracer(\"Line Terminator Handling\", () => {\n const lineTerminatorCharCodes = getCharCodes(\n options.lineTerminatorCharacters!,\n );\n patternIdxToCanLineTerminator = map(onlyRelevantTypes, (tokType) => false);\n if (options.positionTracking !== \"onlyOffset\") {\n patternIdxToCanLineTerminator = map(onlyRelevantTypes, (tokType) => {\n if (has(tokType, \"LINE_BREAKS\")) {\n return !!tokType.LINE_BREAKS;\n } else {\n return (\n checkLineBreaksIssues(tokType, lineTerminatorCharCodes) === false &&\n canMatchCharCode(\n lineTerminatorCharCodes,\n tokType.PATTERN as RegExp | string,\n )\n );\n }\n });\n }\n });\n\n let patternIdxToIsCustom: boolean[];\n let patternIdxToShort: (number | false)[];\n let emptyGroups!: { [groupName: string]: IToken[] };\n let patternIdxToConfig!: IPatternConfig[];\n tracer(\"Misc Mapping #2\", () => {\n patternIdxToIsCustom = map(onlyRelevantTypes, isCustomPattern);\n patternIdxToShort = map(allTransformedPatterns, isShortPattern);\n\n emptyGroups = reduce(\n onlyRelevantTypes,\n (acc, clazz: any) => {\n const groupName = clazz.GROUP;\n if (isString(groupName) && !(groupName === Lexer.SKIPPED)) {\n acc[groupName] = [];\n }\n return acc;\n },\n {} as { [groupName: string]: IToken[] },\n );\n\n patternIdxToConfig = map(\n allTransformedPatterns,\n (x, idx): IPatternConfig => {\n return {\n pattern: allTransformedPatterns[idx],\n longerAlt: patternIdxToLongerAltIdxArr[idx],\n canLineTerminator: patternIdxToCanLineTerminator[idx],\n isCustom: patternIdxToIsCustom[idx],\n short: patternIdxToShort[idx],\n group: patternIdxToGroup[idx],\n push: patternIdxToPushMode[idx],\n pop: patternIdxToPopMode[idx],\n tokenTypeIdx: patternIdxToType[idx],\n tokenType: onlyRelevantTypes[idx],\n };\n },\n );\n });\n\n let canBeOptimized = true;\n let charCodeToPatternIdxToConfig: { [charCode: number]: IPatternConfig[] } =\n [];\n\n if (!options.safeMode) {\n tracer(\"First Char Optimization\", () => {\n charCodeToPatternIdxToConfig = reduce(\n onlyRelevantTypes,\n (result, currTokType, idx) => {\n if (typeof currTokType.PATTERN === \"string\") {\n const charCode = currTokType.PATTERN.charCodeAt(0);\n const optimizedIdx = charCodeToOptimizedIndex(charCode);\n addToMapOfArrays(result, optimizedIdx, patternIdxToConfig[idx]);\n } else if (isArray(currTokType.START_CHARS_HINT)) {\n let lastOptimizedIdx: number;\n forEach(currTokType.START_CHARS_HINT, (charOrInt) => {\n const charCode =\n typeof charOrInt === \"string\"\n ? charOrInt.charCodeAt(0)\n : charOrInt;\n const currOptimizedIdx = charCodeToOptimizedIndex(charCode);\n // Avoid adding the config multiple times\n /* istanbul ignore else */\n // - Difficult to check this scenario effects as it is only a performance\n // optimization that does not change correctness\n if (lastOptimizedIdx !== currOptimizedIdx) {\n lastOptimizedIdx = currOptimizedIdx;\n addToMapOfArrays(\n result,\n currOptimizedIdx,\n patternIdxToConfig[idx],\n );\n }\n });\n } else if (isRegExp(currTokType.PATTERN)) {\n if (currTokType.PATTERN.unicode) {\n canBeOptimized = false;\n if (options.ensureOptimizations) {\n PRINT_ERROR(\n `${failedOptimizationPrefixMsg}` +\n `\\tUnable to analyze < ${currTokType.PATTERN.toString()} > pattern.\\n` +\n \"\\tThe regexp unicode flag is not currently supported by the regexp-to-ast library.\\n\" +\n \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE\",\n );\n }\n } else {\n const optimizedCodes = getOptimizedStartCodesIndices(\n currTokType.PATTERN,\n options.ensureOptimizations,\n );\n /* istanbul ignore if */\n // start code will only be empty given an empty regExp or failure of regexp-to-ast library\n // the first should be a different validation and the second cannot be tested.\n if (isEmpty(optimizedCodes)) {\n // we cannot understand what codes may start possible matches\n // The optimization correctness requires knowing start codes for ALL patterns.\n // Not actually sure this is an error, no debug message\n canBeOptimized = false;\n }\n forEach(optimizedCodes, (code) => {\n addToMapOfArrays(result, code, patternIdxToConfig[idx]);\n });\n }\n } else {\n if (options.ensureOptimizations) {\n PRINT_ERROR(\n `${failedOptimizationPrefixMsg}` +\n `\\tTokenType: <${currTokType.name}> is using a custom token pattern without providing <start_chars_hint> parameter.\\n` +\n \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE\",\n );\n }\n canBeOptimized = false;\n }\n\n return result;\n },\n [] as { [charCode: number]: IPatternConfig[] },\n );\n });\n }\n\n return {\n emptyGroups: emptyGroups,\n patternIdxToConfig: patternIdxToConfig,\n charCodeToPatternIdxToConfig: charCodeToPatternIdxToConfig,\n hasCustom: hasCustom,\n canBeOptimized: canBeOptimized,\n };\n}\n\nexport function validatePatterns(\n tokenTypes: TokenType[],\n validModesNames: string[],\n): ILexerDefinitionError[] {\n let errors: ILexerDefinitionError[] = [];\n\n const missingResult = findMissingPatterns(tokenTypes);\n errors = errors.concat(missingResult.errors);\n\n const invalidResult = findInvalidPatterns(missingResult.valid);\n const validTokenTypes = invalidResult.valid;\n errors = errors.concat(invalidResult.errors);\n\n errors = errors.concat(validateRegExpPattern(validTokenTypes));\n\n errors = errors.concat(findInvalidGroupType(validTokenTypes));\n\n errors = errors.concat(\n findModesThatDoNotExist(validTokenTypes, validModesNames),\n );\n\n errors = errors.concat(findUnreachablePatterns(validTokenTypes));\n\n return errors;\n}\n\nfunction validateRegExpPattern(\n tokenTypes: TokenType[],\n): ILexerDefinitionError[] {\n let errors: ILexerDefinitionError[] = [];\n const withRegExpPatterns = filter(tokenTypes, (currTokType) =>\n isRegExp(currTokType[PATTERN]),\n );\n\n errors = errors.concat(findEndOfInputAnchor(withRegExpPatterns));\n\n errors = errors.concat(findStartOfInputAnchor(withRegExpPatterns));\n\n errors = errors.concat(findUnsupportedFlags(withRegExpPatterns));\n\n errors = errors.concat(findDuplicatePatterns(withRegExpPatterns));\n\n errors = errors.concat(findEmptyMatchRegExps(withRegExpPatterns));\n\n return errors;\n}\n\nexport interface ILexerFilterResult {\n errors: ILexerDefinitionError[];\n valid: TokenType[];\n}\n\nexport function findMissingPatterns(\n tokenTypes: TokenType[],\n): ILexerFilterResult {\n const tokenTypesWithMissingPattern = filter(tokenTypes, (currType) => {\n return !has(currType, PATTERN);\n });\n\n const errors = map(tokenTypesWithMissingPattern, (currType) => {\n return {\n message:\n \"Token Type: ->\" +\n currType.name +\n \"<- missing static 'PATTERN' property\",\n type: LexerDefinitionErrorType.MISSING_PATTERN,\n tokenTypes: [currType],\n };\n });\n\n const valid = difference(tokenTypes, tokenTypesWithMissingPattern);\n return { errors, valid };\n}\n\nexport function findInvalidPatterns(\n tokenTypes: TokenType[],\n): ILexerFilterResult {\n const tokenTypesWithInvalidPattern = filter(tokenTypes, (currType) => {\n const pattern = currType[PATTERN];\n return (\n !isRegExp(pattern) &&\n !isFunction(pattern) &&\n !has(pattern, \"exec\") &&\n !isString(pattern)\n );\n });\n\n const errors = map(tokenTypesWithInvalidPattern, (currType) => {\n return {\n message:\n \"Token Type: ->\" +\n currType.name +\n \"<- static 'PATTERN' can only be a RegExp, a\" +\n \" Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.\",\n type: LexerDefinitionErrorType.INVALID_PATTERN,\n tokenTypes: [currType],\n };\n });\n\n const valid = difference(tokenTypes, tokenTypesWithInvalidPattern);\n return { errors, valid };\n}\n\nconst end_of_input = /[^\\\\][$]/;\n\nexport function findEndOfInputAnchor(\n tokenTypes: TokenType[],\n): ILexerDefinitionError[] {\n class EndAnchorFinder extends BaseRegExpVisitor {\n found = false;\n\n visitEndAnchor(node: unknown) {\n this.found = true;\n }\n }\n\n const invalidRegex = filter(tokenTypes, (currType) => {\n const pattern = currType.PATTERN;\n\n try {\n const regexpAst = getRegExpAst(pattern as RegExp);\n const endAnchorVisitor = new EndAnchorFinder();\n endAnchorVisitor.visit(regexpAst);\n\n return endAnchorVisitor.found;\n } catch (e) {\n // old behavior in case of runtime exceptions with regexp-to-ast.\n /* istanbul ignore next - cannot ensure an error in regexp-to-ast*/\n return end_of_input.test((pattern as RegExp).source);\n }\n });\n\n const errors = map(invalidRegex, (currType) => {\n return {\n message:\n \"Unexpected RegExp Anchor Error:\\n\" +\n \"\\tToken Type: ->\" +\n currType.name +\n \"<- static 'PATTERN' cannot contain end of input anchor '$'\\n\" +\n \"\\tSee chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\" +\n \"\\tfor details.\",\n type: LexerDefinitionErrorType.EOI_ANCHOR_FOUND,\n tokenTypes: [currType],\n };\n });\n\n return errors;\n}\n\nexport function findEmptyMatchRegExps(\n tokenTypes: TokenType[],\n): ILexerDefinitionError[] {\n const matchesEmptyString = filter(tokenTypes, (currType) => {\n const pattern = currType.PATTERN as RegExp;\n return pattern.test(\"\");\n });\n\n const errors = map(matchesEmptyString, (currType) => {\n return {\n message:\n \"Token Type: ->\" +\n currType.name +\n \"<- static 'PATTERN' must not match an empty string\",\n type: LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,\n tokenTypes: [currType],\n };\n });\n\n return errors;\n}\n\nconst start_of_input = /[^\\\\[][\\^]|^\\^/;\n\nexport function findStartOfInputAnchor(\n tokenTypes: TokenType[],\n): ILexerDefinitionError[] {\n class StartAnchorFinder extends BaseRegExpVisitor {\n found = false;\n\n visitStartAnchor(node: unknown) {\n this.found = true;\n }\n }\n\n const invalidRegex = filter(tokenTypes, (currType) => {\n const pattern = currType.PATTERN as RegExp;\n try {\n const regexpAst = getRegExpAst(pattern);\n const startAnchorVisitor = new StartAnchorFinder();\n startAnchorVisitor.visit(regexpAst);\n\n return startAnchorVisitor.found;\n } catch (e) {\n // old behavior in case of runtime exceptions with regexp-to-ast.\n /* istanbul ignore next - cannot ensure an error in regexp-to-ast*/\n return start_of_input.test(pattern.source);\n }\n });\n\n const errors = map(invalidRegex, (currType) => {\n return {\n message:\n \"Unexpected RegExp Anchor Error:\\n\" +\n \"\\tToken Type: ->\" +\n currType.name +\n \"<- static 'PATTERN' cannot contain start of input anchor '^'\\n\" +\n \"\\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\" +\n \"\\tfor details.\",\n type: LexerDefinitionErrorType.SOI_ANCHOR_FOUND,\n tokenTypes: [currType],\n };\n });\n\n return errors;\n}\n\nexport function findUnsupportedFlags(\n tokenTypes: TokenType[],\n): ILexerDefinitionError[] {\n const invalidFlags = filter(tokenTypes, (currType) => {\n const pattern = currType[PATTERN];\n return pattern instanceof RegExp && (pattern.multiline || pattern.global);\n });\n\n const errors = map(invalidFlags, (currType) => {\n return {\n message:\n \"Token Type: ->\" +\n currType.name +\n \"<- static 'PATTERN' may NOT contain global('g') or multiline('m')\",\n type: LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,\n tokenTypes: [currType],\n };\n });\n\n return errors;\n}\n\n// This can only test for identical duplicate RegExps, not semantically equivalent ones.\nexport function findDuplicatePatterns(\n tokenTypes: TokenType[],\n): ILexerDefinitionError[] {\n const found: TokenType[] = [];\n let identicalPatterns = map(tokenTypes, (outerType: any) => {\n return reduce(\n tokenTypes,\n (result, innerType) => {\n if (\n outerType.PATTERN.source === (innerType.PATTERN as RegExp).source &&\n !includes(found, innerType) &&\n innerType.PATTERN !== Lexer.NA\n ) {\n // this avoids duplicates in the result, each Token Type may only appear in one \"set\"\n // in essence we are creating Equivalence classes on equality relation.\n found.push(innerType);\n result.push(innerType);\n return result;\n }\n return result;\n },\n [] as TokenType[],\n );\n });\n\n identicalPatterns = compact(identicalPatterns);\n\n const duplicatePatterns = filter(identicalPatterns, (currIdenticalSet) => {\n return currIdenticalSet.length > 1;\n });\n\n const errors = map(duplicatePatterns, (setOfIdentical: any) => {\n const tokenTypeNames = map(setOfIdentical, (currType: any) => {\n return currType.name;\n });\n\n const dupPatternSrc = (<any>first(setOfIdentical)).PATTERN;\n return {\n message:\n `The same RegExp pattern ->${dupPatternSrc}<-` +\n `has been used in all of the following Token Types: ${tokenTypeNames.join(\n \", \",\n )} <-`,\n type: LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,\n tokenTypes: setOfIdentical,\n };\n });\n\n return errors;\n}\n\nexport function findInvalidGroupType(\n tokenTypes: TokenType[],\n): ILexerDefinitionError[] {\n const invalidTypes = filter(tokenTypes, (clazz: any) => {\n if (!has(clazz, \"GROUP\")) {\n return false;\n }\n const group = clazz.GROUP;\n\n return group !== Lexer.SKIPPED && group !== Lexer.NA && !isString(group);\n });\n\n const errors = map(invalidTypes, (currType) => {\n return {\n message:\n \"Token Type: ->\" +\n currType.name +\n \"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String\",\n type: LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,\n tokenTypes: [currType],\n };\n });\n\n return errors;\n}\n\nexport function findModesThatDoNotExist(\n tokenTypes: TokenType[],\n validModes: string[],\n): ILexerDefinitionError[] {\n const invalidModes = filter(tokenTypes, (clazz: any) => {\n return (\n clazz.PUSH_MODE !== undefined && !includes(validModes, clazz.PUSH_MODE)\n );\n });\n\n const errors = map(invalidModes, (tokType) => {\n const msg =\n `Token Type: ->${tokType.name}<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->${tokType.PUSH_MODE}<-` +\n `which does not exist`;\n return {\n message: msg,\n type: LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,\n tokenTypes: [tokType],\n };\n });\n\n return errors;\n}\n\nexport function findUnreachablePatterns(\n tokenTypes: TokenType[],\n): ILexerDefinitionError[] {\n const errors: ILexerDefinitionError[] = [];\n\n const canBeTested = reduce(\n tokenTypes,\n (result, tokType, idx) => {\n const pattern = tokType.PATTERN;\n\n if (pattern === Lexer.NA) {\n return result;\n }\n\n // a more comprehensive validation for all forms of regExps would require\n // deeper regExp analysis capabilities\n if (isString(pattern)) {\n result.push({ str: pattern, idx, tokenType: tokType });\n } else if (isRegExp(pattern) && noMetaChar(pattern)) {\n result.push({ str: pattern.source, idx, tokenType: tokType });\n }\n return result;\n },\n [] as { str: string; idx: number; tokenType: TokenType }[],\n );\n\n forEach(tokenTypes, (tokType, testIdx) => {\n forEach(canBeTested, ({ str, idx, tokenType }) => {\n if (testIdx < idx && testTokenType(str, tokType.PATTERN)) {\n const msg =\n `Token: ->${tokenType.name}<- can never be matched.\\n` +\n `Because it appears AFTER the Token Type ->${tokType.name}<-` +\n `in the lexer's definition.\\n` +\n `See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;\n errors.push({\n message: msg,\n type: LexerDefinitionErrorType.UNREACHABLE_PATTERN,\n tokenTypes: [tokType, tokenType],\n });\n }\n });\n });\n\n return errors;\n}\n\nfunction testTokenType(str: string, pattern: any): boolean {\n /* istanbul ignore else */\n if (isRegExp(pattern)) {\n const regExpArray = pattern.exec(str);\n return regExpArray !== null && regExpArray.index === 0;\n } else if (isFunction(pattern)) {\n // maintain the API of custom patterns\n return pattern(str, 0, [], {});\n } else if (has(pattern, \"exec\")) {\n // maintain the API of custom patterns\n return pattern.exec(str, 0, [], {});\n } else if (typeof pattern === \"string\") {\n return pattern === str;\n } else {\n throw Error(\"non exhaustive match\");\n }\n}\n\nfunction noMetaChar(regExp: RegExp): boolean {\n //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n const metaChars = [\n \".\",\n \"\\\\\",\n \"[\",\n \"]\",\n \"|\",\n \"^\",\n \"$\",\n \"(\",\n \")\",\n \"?\",\n \"*\",\n \"+\",\n \"{\",\n ];\n return (\n find(metaChars, (char) => regExp.source.indexOf(char) !== -1) === undefined\n );\n}\n\nexport function addStartOfInput(pattern: RegExp): RegExp {\n const flags = pattern.ignoreCase ? \"i\" : \"\";\n // always wrapping in a none capturing group preceded by '^' to make sure matching can only work on start of input.\n // duplicate/redundant start of input markers have no meaning (/^^^^A/ === /^A/)\n return new RegExp(`^(?:${pattern.source})`, flags);\n}\n\nexport function addStickyFlag(pattern: RegExp): RegExp {\n const flags = pattern.ignoreCase ? \"iy\" : \"y\";\n // always wrapping in a none capturing group preceded by '^' to make sure matching can only work on start of input.\n // duplicate/redundant start of input markers have no meaning (/^^^^A/ === /^A/)\n return new RegExp(`${pattern.source}`, flags);\n}\n\nexport function performRuntimeChecks(\n lexerDefinition: IMultiModeLexerDefinition,\n trackLines: boolean,\n lineTerminatorCharacters: (number | string)[],\n): ILexerDefinitionError[] {\n const errors: ILexerDefinitionError[] = [];\n\n // some run time checks to help the end users.\n if (!has(lexerDefinition, DEFAULT_MODE)) {\n errors.push({\n message:\n \"A MultiMode Lexer cannot be initialized without a <\" +\n DEFAULT_MODE +\n \"> property in its definition\\n\",\n type: LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE,\n });\n }\n if (!has(lexerDefinition, MODES)) {\n errors.push({\n message:\n \"A MultiMode Lexer cannot be initialized without a <\" +\n MODES +\n \"> property in its definition\\n\",\n type: LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY,\n });\n }\n\n if (\n has(lexerDefinition, MODES) &&\n has(lexerDefinition, DEFAULT_MODE) &&\n !has(lexerDefinition.modes, lexerDefinition.defaultMode)\n ) {\n errors.push({\n message:\n `A MultiMode Lexer cannot be initialized with a ${DEFAULT_MODE}: <${lexerDefinition.defaultMode}>` +\n `which does not exist\\n`,\n type: LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST,\n });\n }\n\n if (has(lexerDefinition, MODES)) {\n forEach(lexerDefinition.modes, (currModeValue, currModeName) => {\n forEach(currModeValue, (currTokType, currIdx) => {\n if (isUndefined(currTokType)) {\n errors.push({\n message:\n `A Lexer cannot be initialized using an undefined Token Type. Mode:` +\n `<${currModeName}> at index: <${currIdx}>\\n`,\n type: LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED,\n });\n } else if (has(currTokType, \"LONGER_ALT\")) {\n const longerAlt = isArray(currTokType.LONGER_ALT)\n ? currTokType.LONGER_ALT\n : [currTokType.LONGER_ALT];\n forEach(longerAlt, (currLongerAlt) => {\n if (\n !isUndefined(currLongerAlt) &&\n !includes(currModeValue, currLongerAlt)\n ) {\n errors.push({\n message: `A MultiMode Lexer cannot be initialized with a longer_alt <${currLongerAlt.name}> on token <${currTokType.name}> outside of mode <${currModeName}>\\n`,\n type: LexerDefinitionErrorType.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE,\n });\n }\n });\n }\n });\n });\n }\n\n return errors;\n}\n\nexport function performWarningRuntimeChecks(\n lexerDefinition: IMultiModeLexerDefinition,\n trackLines: boolean,\n lineTerminatorCharacters: (number | string)[],\n): ILexerDefinitionError[] {\n const warnings = [];\n let hasAnyLineBreak = false;\n const allTokenTypes = compact(flatten(values(lexerDefinition.modes)));\n\n const concreteTokenTypes = reject(\n allTokenTypes,\n (currType) => currType[PATTERN] === Lexer.NA,\n );\n const terminatorCharCodes = getCharCodes(lineTerminatorCharacters);\n if (trackLines) {\n forEach(concreteTokenTypes, (tokType) => {\n const currIssue = checkLineBreaksIssues(tokType, terminatorCharCodes);\n if (currIssue !== false) {\n const message = buildLineBreakIssueMessage(tokType, currIssue);\n const warningDescriptor = {\n message,\n type: currIssue.issue,\n tokenType: tokType,\n };\n warnings.push(warningDescriptor);\n } else {\n // we don't want to attempt to scan if the user explicitly specified the line_breaks option.\n if (has(tokType, \"LINE_BREAKS\")) {\n if (tokType.LINE_BREAKS === true) {\n hasAnyLineBreak = true;\n }\n } else {\n if (\n canMatchCharCode(terminatorCharCodes, tokType.PATTERN as RegExp)\n ) {\n hasAnyLineBreak = true;\n }\n }\n }\n });\n }\n\n if (trackLines && !hasAnyLineBreak) {\n warnings.push({\n message:\n \"Warning: No LINE_BREAKS Found.\\n\" +\n \"\\tThis Lexer has been defined to track line and column information,\\n\" +\n \"\\tBut none of the Token Types can be identified as matching a line terminator.\\n\" +\n \"\\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS \\n\" +\n \"\\tfor details.\",\n type: LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS,\n });\n }\n return warnings;\n}\n\nexport function cloneEmptyGroups(emptyGroups: {\n [groupName: string]: IToken;\n}): { [groupName: string]: IToken } {\n const clonedResult: any = {};\n const groupKeys = keys(emptyGroups);\n\n forEach(groupKeys, (currKey) => {\n const currGroupValue = emptyGroups[currKey];\n\n /* istanbul ignore else */\n if (isArray(currGroupValue)) {\n clonedResult[currKey] = [];\n } else {\n throw Error(\"non exhaustive match\");\n }\n });\n\n return clonedResult;\n}\n\n// TODO: refactor to avoid duplication\nexport function isCustomPattern(tokenType: TokenType): boolean {\n const pattern = tokenType.PATTERN;\n /* istanbul ignore else */\n if (isRegExp(pattern)) {\n return false;\n } else if (isFunction(pattern)) {\n // CustomPatternMatcherFunc - custom patterns do not require any transformations, only wrapping in a RegExp Like object\n return true;\n } else if (has(pattern, \"exec\")) {\n // ICustomPattern\n return true;\n } else if (isString(pattern)) {\n return false;\n } else {\n throw Error(\"non exhaustive match\");\n }\n}\n\nexport function isShortPattern(pattern: any): number | false {\n if (isString(pattern) && pattern.length === 1) {\n return pattern.charCodeAt(0);\n } else {\n return false;\n }\n}\n\n/**\n * Faster than using a RegExp for default newline detection during lexing.\n */\nexport const LineTerminatorOptimizedTester: ILineTerminatorsTester = {\n // implements /\\n|\\r\\n?/g.test\n test: function (text) {\n const len = text.length;\n for (let i = this.lastIndex; i < len; i++) {\n const c = text.charCodeAt(i);\n if (c === 10) {\n this.lastIndex = i + 1;\n return true;\n } else if (c === 13) {\n if (text.charCodeAt(i + 1) === 10) {\n this.lastIndex = i + 2;\n } else {\n this.lastIndex = i + 1;\n }\n return true;\n }\n }\n return false;\n },\n\n lastIndex: 0,\n};\n\nfunction checkLineBreaksIssues(\n tokType: TokenType,\n lineTerminatorCharCodes: number[],\n):\n | {\n issue:\n | LexerDefinitionErrorType.IDENTIFY_TERMINATOR\n | LexerDefinitionErrorType.CUSTOM_LINE_BREAK;\n errMsg?: string;\n }\n | false {\n if (has(tokType, \"LINE_BREAKS\")) {\n // if the user explicitly declared the line_breaks option we will respect their choice\n // and assume it is correct.\n return false;\n } else {\n /* istanbul ignore else */\n if (isRegExp(tokType.PATTERN)) {\n try {\n // TODO: why is the casting suddenly needed?\n canMatchCharCode(lineTerminatorCharCodes, tokType.PATTERN as RegExp);\n } catch (e) {\n /* istanbul ignore next - to test this we would have to mock <canMatchCharCode> to throw an error */\n return {\n issue: LexerDefinitionErrorType.IDENTIFY_TERMINATOR,\n errMsg: (e as Error).message,\n };\n }\n return false;\n } else if (isString(tokType.PATTERN)) {\n // string literal patterns can always be analyzed to detect line terminator usage\n return false;\n } else if (isCustomPattern(tokType)) {\n // custom token types\n return { issue: LexerDefinitionErrorType.CUSTOM_LINE_BREAK };\n } else {\n throw Error(\"non exhaustive match\");\n }\n }\n}\n\nexport function buildLineBreakIssueMessage(\n tokType: TokenType,\n details: {\n issue:\n | LexerDefinitionErrorType.IDENTIFY_TERMINATOR\n | LexerDefinitionErrorType.CUSTOM_LINE_BREAK;\n errMsg?: string;\n },\n): string {\n /* istanbul ignore else */\n if (details.issue === LexerDefinitionErrorType.IDENTIFY_TERMINATOR) {\n return (\n \"Warning: unable to identify line terminator usage in pattern.\\n\" +\n `\\tThe problem is in the <${tokType.name}> Token Type\\n` +\n `\\t Root cause: ${details.errMsg}.\\n` +\n \"\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR\"\n );\n } else if (details.issue === LexerDefinitionErrorType.CUSTOM_LINE_BREAK) {\n return (\n \"Warning: A Custom Token Pattern should specify the <line_breaks> option.\\n\" +\n `\\tThe problem is in the <${tokType.name}> Token Type\\n` +\n \"\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK\"\n );\n } else {\n throw Error(\"non exhaustive match\");\n }\n}\n\nfunction getCharCodes(charsOrCodes: (number | string)[]): number[] {\n const charCodes = map(charsOrCodes, (numOrString) => {\n if (isString(numOrString)) {\n return numOrString.charCodeAt(0);\n } else {\n return numOrString;\n }\n });\n\n return charCodes;\n}\n\nfunction addToMapOfArrays<T>(\n map: Record<number, T[]>,\n key: number,\n value: T,\n): void {\n if (map[key] === undefined) {\n map[key] = [value];\n } else {\n map[key].push(value);\n }\n}\n\nexport const minOptimizationVal = 256;\n\n/**\n * We are mapping charCode above ASCI (256) into buckets each in the size of 256.\n * This is because ASCI are the most common start chars so each one of those will get its own\n * possible token configs vector.\n *\n * Tokens starting with charCodes \"above\" ASCI are uncommon, so we can \"afford\"\n * to place these into buckets of possible token configs, What we gain from\n * this is avoiding the case of creating an optimization 'charCodeToPatternIdxToConfig'\n * which would contain 10,000+ arrays of small size (e.g unicode Identifiers scenario).\n * Our 'charCodeToPatternIdxToConfig' max size will now be:\n * 256 + (2^16 / 2^8) - 1 === 511\n *\n * note the hack for fast division integer part extraction\n * See: https://stackoverflow.com/a/4228528\n */\nlet charCodeToOptimizedIdxMap: number[] = [];\nexport function charCodeToOptimizedIndex(charCode: number): number {\n return charCode < minOptimizationVal\n ? charCode\n : charCodeToOptimizedIdxMap[charCode];\n}\n\n/**\n * This is a compromise between cold start / hot running performance\n * Creating this array takes ~3ms on a modern machine,\n * But if we perform the computation at runtime as needed the CSS Lexer benchmark\n * performance degrades by ~10%\n *\n * TODO: Perhaps it should be lazy initialized only if a charCode > 255 is used.\n */\nfunction initCharCodeToOptimizedIndexMap() {\n if (isEmpty(charCodeToOptimizedIdxMap)) {\n charCodeToOptimizedIdxMap = new Array(65536);\n for (let i = 0; i < 65536; i++) {\n charCodeToOptimizedIdxMap[i] = i > 255 ? 255 + ~~(i / 255) : i;\n }\n }\n}\n", "import {\n clone,\n compact,\n difference,\n flatten,\n forEach,\n has,\n includes,\n isArray,\n isEmpty,\n map,\n} from \"lodash-es\";\nimport { IToken, TokenType } from \"@chevrotain/types\";\n\nexport function tokenStructuredMatcher(\n tokInstance: IToken,\n tokConstructor: TokenType,\n) {\n const instanceType = tokInstance.tokenTypeIdx;\n if (instanceType === tokConstructor.tokenTypeIdx) {\n return true;\n } else {\n return (\n tokConstructor.isParent === true &&\n tokConstructor.categoryMatchesMap![instanceType] === true\n );\n }\n}\n\n// Optimized tokenMatcher in case our grammar does not use token categories\n// Being so tiny it is much more likely to be in-lined and this avoid the function call overhead\nexport function tokenStructuredMatcherNoCategories(\n token: IToken,\n tokType: TokenType,\n) {\n return token.tokenTypeIdx === tokType.tokenTypeIdx;\n}\n\nexport let tokenShortNameIdx = 1;\nexport const tokenIdxToClass: { [tokenIdx: number]: TokenType } = {};\n\nexport function augmentTokenTypes(tokenTypes: TokenType[]): void {\n // collect the parent Token Types as well.\n const tokenTypesAndParents = expandCategories(tokenTypes);\n\n // add required tokenType and categoryMatches properties\n assignTokenDefaultProps(tokenTypesAndParents);\n\n // fill up the categoryMatches\n assignCategoriesMapProp(tokenTypesAndParents);\n assignCategoriesTokensProp(tokenTypesAndParents);\n\n forEach(tokenTypesAndParents, (tokType) => {\n tokType.isParent = tokType.categoryMatches!.length > 0;\n });\n}\n\nexport function expandCategories(tokenTypes: TokenType[]): TokenType[] {\n let result = clone(tokenTypes);\n\n let categories = tokenTypes;\n let searching = true;\n while (searching) {\n categories = compact(\n flatten(map(categories, (currTokType) => currTokType.CATEGORIES)),\n );\n\n const newCategories = difference(categories, result);\n\n result = result.concat(newCategories);\n\n if (isEmpty(newCategories)) {\n searching = false;\n } else {\n categories = newCategories;\n }\n }\n return result;\n}\n\nexport function assignTokenDefaultProps(tokenTypes: TokenType[]): void {\n forEach(tokenTypes, (currTokType) => {\n if (!hasShortKeyProperty(currTokType)) {\n tokenIdxToClass[tokenShortNameIdx] = currTokType;\n (<any>currTokType).tokenTypeIdx = tokenShortNameIdx++;\n }\n\n // CATEGORIES? : TokenType | TokenType[]\n if (\n hasCategoriesProperty(currTokType) &&\n !isArray(currTokType.CATEGORIES)\n // &&\n // !isUndefined(currTokType.CATEGORIES.PATTERN)\n ) {\n currTokType.CATEGORIES = [currTokType.CATEGORIES as unknown as TokenType];\n }\n\n if (!hasCategoriesProperty(currTokType)) {\n currTokType.CATEGORIES = [];\n }\n\n if (!hasExtendingTokensTypesProperty(currTokType)) {\n currTokType.categoryMatches = [];\n }\n\n if (!hasExtendingTokensTypesMapProperty(currTokType)) {\n currTokType.categoryMatchesMap = {};\n }\n });\n}\n\nexport function assignCategoriesTokensProp(tokenTypes: TokenType[]): void {\n forEach(tokenTypes, (currTokType) => {\n // avoid duplications\n currTokType.categoryMatches = [];\n forEach(currTokType.categoryMatchesMap!, (val, key) => {\n currTokType.categoryMatches!.push(\n tokenIdxToClass[key as unknown as number].tokenTypeIdx!,\n );\n });\n });\n}\n\nexport function assignCategoriesMapProp(tokenTypes: TokenType[]): void {\n forEach(tokenTypes, (currTokType) => {\n singleAssignCategoriesToksMap([], currTokType);\n });\n}\n\nexport function singleAssignCategoriesToksMap(\n path: TokenType[],\n nextNode: TokenType,\n): void {\n forEach(path, (pathNode) => {\n nextNode.categoryMatchesMap![pathNode.tokenTypeIdx!] = true;\n });\n\n forEach(nextNode.CATEGORIES, (nextCategory) => {\n const newPath = path.concat(nextNode);\n // avoids infinite loops due to cyclic categories.\n if (!includes(newPath, nextCategory)) {\n singleAssignCategoriesToksMap(newPath, nextCategory);\n }\n });\n}\n\nexport function hasShortKeyProperty(tokType: TokenType): boolean {\n return has(tokType, \"tokenTypeIdx\");\n}\n\nexport function hasCategoriesProperty(tokType: TokenType): boolean {\n return has(tokType, \"CATEGORIES\");\n}\n\nexport function hasExtendingTokensTypesProperty(tokType: TokenType): boolean {\n return has(tokType, \"categoryMatches\");\n}\n\nexport function hasExtendingTokensTypesMapProperty(\n tokType: TokenType,\n): boolean {\n return has(tokType, \"categoryMatchesMap\");\n}\n\nexport function isTokenType(tokType: TokenType): boolean {\n return has(tokType, \"tokenTypeIdx\");\n}\n", "import { ILexerErrorMessageProvider, IToken } from \"@chevrotain/types\";\n\nexport const defaultLexerErrorProvider: ILexerErrorMessageProvider = {\n buildUnableToPopLexerModeMessage(token: IToken): string {\n return `Unable to pop Lexer Mode after encountering Token ->${token.image}<- The Mode Stack is empty`;\n },\n\n buildUnexpectedCharactersMessage(\n fullText: string,\n startOffset: number,\n length: number,\n line?: number,\n column?: number,\n ): string {\n return (\n `unexpected character: ->${fullText.charAt(\n startOffset,\n )}<- at offset: ${startOffset},` + ` skipped ${length} characters.`\n );\n },\n};\n", "import {\n analyzeTokenTypes,\n charCodeToOptimizedIndex,\n cloneEmptyGroups,\n DEFAULT_MODE,\n IAnalyzeResult,\n IPatternConfig,\n LineTerminatorOptimizedTester,\n performRuntimeChecks,\n performWarningRuntimeChecks,\n SUPPORT_STICKY,\n validatePatterns,\n} from \"./lexer.js\";\nimport {\n assign,\n clone,\n forEach,\n identity,\n isArray,\n isEmpty,\n isUndefined,\n keys,\n last,\n map,\n noop,\n reduce,\n reject,\n} from \"lodash-es\";\nimport { PRINT_WARNING, timer, toFastProperties } from \"@chevrotain/utils\";\nimport { augmentTokenTypes } from \"./tokens.js\";\nimport {\n CustomPatternMatcherFunc,\n CustomPatternMatcherReturn,\n ILexerConfig,\n ILexerDefinitionError,\n ILexingError,\n IMultiModeLexerDefinition,\n IToken,\n TokenType,\n} from \"@chevrotain/types\";\nimport { defaultLexerErrorProvider } from \"./lexer_errors_public.js\";\nimport { clearRegExpParserCache } from \"./reg_exp_parser.js\";\n\nexport interface ILexingResult {\n tokens: IToken[];\n groups: { [groupName: string]: IToken[] };\n errors: ILexingError[];\n}\n\nexport enum LexerDefinitionErrorType {\n MISSING_PATTERN,\n INVALID_PATTERN,\n EOI_ANCHOR_FOUND,\n UNSUPPORTED_FLAGS_FOUND,\n DUPLICATE_PATTERNS_FOUND,\n INVALID_GROUP_TYPE_FOUND,\n PUSH_MODE_DOES_NOT_EXIST,\n MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE,\n MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY,\n MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST,\n LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED,\n SOI_ANCHOR_FOUND,\n EMPTY_MATCH_PATTERN,\n NO_LINE_BREAKS_FLAGS,\n UNREACHABLE_PATTERN,\n IDENTIFY_TERMINATOR,\n CUSTOM_LINE_BREAK,\n MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE,\n}\n\nexport interface IRegExpExec {\n exec: CustomPatternMatcherFunc;\n}\n\nconst DEFAULT_LEXER_CONFIG: Required<ILexerConfig> = {\n deferDefinitionErrorsHandling: false,\n positionTracking: \"full\",\n lineTerminatorsPattern: /\\n|\\r\\n?/g,\n lineTerminatorCharacters: [\"\\n\", \"\\r\"],\n ensureOptimizations: false,\n safeMode: false,\n errorMessageProvider: defaultLexerErrorProvider,\n traceInitPerf: false,\n skipValidations: false,\n recoveryEnabled: true,\n};\n\nObject.freeze(DEFAULT_LEXER_CONFIG);\n\nexport class Lexer {\n public static SKIPPED =\n \"This marks a skipped Token pattern, this means each token identified by it will\" +\n \"be consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.\";\n\n public static NA = /NOT_APPLICABLE/;\n public lexerDefinitionErrors: ILexerDefinitionError[] = [];\n public lexerDefinitionWarning: ILexerDefinitionError[] = [];\n\n protected patternIdxToConfig: Record<string, IPatternConfig[]> = {};\n protected charCodeToPatternIdxToConfig: {\n [modeName: string]: { [charCode: number]: IPatternConfig[] };\n } = {};\n\n protected modes: string[] = [];\n protected defaultMode!: string;\n protected emptyGroups: { [groupName: string]: IToken } = {};\n\n private config: Required<ILexerConfig>;\n private trackStartLines: boolean = true;\n private trackEndLines: boolean = true;\n private hasCustom: boolean = false;\n private canModeBeOptimized: Record<string, boolean> = {};\n\n private traceInitPerf!: boolean | number;\n private traceInitMaxIdent!: number;\n private traceInitIndent: number;\n\n constructor(\n protected lexerDefinition: TokenType[] | IMultiModeLexerDefinition,\n config: ILexerConfig = DEFAULT_LEXER_CONFIG,\n ) {\n if (typeof config === \"boolean\") {\n throw Error(\n \"The second argument to the Lexer constructor is now an ILexerConfig Object.\\n\" +\n \"a boolean 2nd argument is no longer supported\",\n );\n }\n\n // todo: defaults func?\n this.config = assign({}, DEFAULT_LEXER_CONFIG, config) as any;\n\n const traceInitVal = this.config.traceInitPerf;\n if (traceInitVal === true) {\n this.traceInitMaxIdent = Infinity;\n this.traceInitPerf = true;\n } else if (typeof traceInitVal === \"number\") {\n this.traceInitMaxIdent = traceInitVal;\n this.traceInitPerf = true;\n }\n this.traceInitIndent = -1;\n\n this.TRACE_INIT(\"Lexer Constructor\", () => {\n let actualDefinition!: IMultiModeLexerDefinition;\n let hasOnlySingleMode = true;\n this.TRACE_INIT(\"Lexer Config handling\", () => {\n if (\n this.config.lineTerminatorsPattern ===\n DEFAULT_LEXER_CONFIG.lineTerminatorsPattern\n ) {\n // optimized built-in implementation for the defaults definition of lineTerminators\n this.config.lineTerminatorsPattern = LineTerminatorOptimizedTester;\n } else {\n if (\n this.config.lineTerminatorCharacters ===\n DEFAULT_LEXER_CONFIG.lineTerminatorCharacters\n ) {\n throw Error(\n \"Error: Missing <lineTerminatorCharacters> property on the Lexer config.\\n\" +\n \"\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS\",\n );\n }\n }\n\n if (config.safeMode && config.ensureOptimizations) {\n throw Error(\n '\"safeMode\" and \"ensureOptimizations\" flags are mutually exclusive.',\n );\n }\n\n this.trackStartLines = /full|onlyStart/i.test(\n this.config.positionTracking,\n );\n this.trackEndLines = /full/i.test(this.config.positionTracking);\n\n // Convert SingleModeLexerDefinition into a IMultiModeLexerDefinition.\n if (isArray(lexerDefinition)) {\n actualDefinition = {\n modes: { defaultMode: clone(lexerDefinition) },\n defaultMode: DEFAULT_MODE,\n };\n } else {\n // no conversion needed, input should already be a IMultiModeLexerDefinition\n hasOnlySingleMode = false;\n actualDefinition = clone(<IMultiModeLexerDefinition>lexerDefinition);\n }\n });\n\n if (this.config.skipValidations === false) {\n this.TRACE_INIT(\"performRuntimeChecks\", () => {\n this.lexerDefinitionErrors = this.lexerDefinitionErrors.concat(\n performRuntimeChecks(\n actualDefinition,\n this.trackStartLines,\n this.config.lineTerminatorCharacters,\n ),\n );\n });\n\n this.TRACE_INIT(\"performWarningRuntimeChecks\", () => {\n this.lexerDefinitionWarning = this.lexerDefinitionWarning.concat(\n performWarningRuntimeChecks(\n actualDefinition,\n this.trackStartLines,\n this.config.lineTerminatorCharacters,\n ),\n );\n });\n }\n\n // for extra robustness to avoid throwing an none informative error message\n actualDefinition.modes = actualDefinition.modes\n ? actualDefinition.modes\n : {};\n\n // an error of undefined TokenTypes will be detected in \"performRuntimeChecks\" above.\n // this transformation is to increase robustness in the case of partially invalid lexer definition.\n forEach(actualDefinition.modes, (currModeValue, currModeName) => {\n actualDefinition.modes[currModeName] = reject<TokenType>(\n currModeValue,\n (currTokType) => isUndefined(currTokType),\n );\n });\n\n const allModeNames = keys(actualDefinition.modes);\n\n forEach(\n actualDefinition.modes,\n (currModDef: TokenType[], currModName) => {\n this.TRACE_INIT(`Mode: <${currModName}> processing`, () => {\n this.modes.push(currModName);\n\n if (this.config.skipValidations === false) {\n this.TRACE_INIT(`validatePatterns`, () => {\n this.lexerDefinitionErrors = this.lexerDefinitionErrors.concat(\n validatePatterns(currModDef, allModeNames),\n );\n });\n }\n\n // If definition errors were encountered, the analysis phase may fail unexpectedly/\n // Considering a lexer with definition errors may never be used, there is no point\n // to performing the analysis anyhow...\n if (isEmpty(this.lexerDefinitionErrors)) {\n augmentTokenTypes(currModDef);\n\n let currAnalyzeResult!: IAnalyzeResult;\n this.TRACE_INIT(`analyzeTokenTypes`, () => {\n currAnalyzeResult = analyzeTokenTypes(currModDef, {\n lineTerminatorCharacters:\n this.config.lineTerminatorCharacters,\n positionTracking: config.positionTracking,\n ensureOptimizations: config.ensureOptimizations,\n safeMode: config.safeMode,\n tracer: this.TRACE_INIT,\n });\n });\n\n this.patternIdxToConfig[currModName] =\n currAnalyzeResult.patternIdxToConfig;\n\n this.charCodeToPatternIdxToConfig[currModName] =\n currAnalyzeResult.charCodeToPatternIdxToConfig;\n\n this.emptyGroups = assign(\n {},\n this.emptyGroups,\n currAnalyzeResult.emptyGroups,\n ) as any;\n\n this.hasCustom = currAnalyzeResult.hasCustom || this.hasCustom;\n\n this.canModeBeOptimized[currModName] =\n currAnalyzeResult.canBeOptimized;\n }\n });\n },\n );\n\n this.defaultMode = actualDefinition.defaultMode;\n\n if (\n !isEmpty(this.lexerDefinitionErrors) &&\n !this.config.deferDefinitionErrorsHandling\n ) {\n const allErrMessages = map(this.lexerDefinitionErrors, (error) => {\n return error.message;\n });\n const allErrMessagesString = allErrMessages.join(\n \"-----------------------\\n\",\n );\n throw new Error(\n \"Errors detected in definition of Lexer:\\n\" + allErrMessagesString,\n );\n }\n\n // Only print warning if there are no errors, This will avoid pl\n forEach(this.lexerDefinitionWarning, (warningDescriptor) => {\n PRINT_WARNING(warningDescriptor.message);\n });\n\n this.TRACE_INIT(\"Choosing sub-methods implementations\", () => {\n // Choose the relevant internal implementations for this specific parser.\n // These implementations should be in-lined by the JavaScript engine\n // to provide optimal performance in each scenario.\n if (SUPPORT_STICKY) {\n this.chopInput = <any>identity;\n this.match = this.matchWithTest;\n } else {\n this.updateLastIndex = noop;\n this.match = this.matchWithExec;\n }\n\n if (hasOnlySingleMode) {\n this.handleModes = noop;\n }\n\n if (this.trackStartLines === false) {\n this.computeNewColumn = identity;\n }\n\n if (this.trackEndLines === false) {\n this.updateTokenEndLineColumnLocation = noop;\n }\n\n if (/full/i.test(this.config.positionTracking)) {\n this.createTokenInstance = this.createFullToken;\n } else if (/onlyStart/i.test(this.config.positionTracking)) {\n this.createTokenInstance = this.createStartOnlyToken;\n } else if (/onlyOffset/i.test(this.config.positionTracking)) {\n this.createTokenInstance = this.createOffsetOnlyToken;\n } else {\n throw Error(\n `Invalid <positionTracking> config option: \"${this.config.positionTracking}\"`,\n );\n }\n\n if (this.hasCustom) {\n this.addToken = this.addTokenUsingPush;\n this.handlePayload = this.handlePayloadWithCustom;\n } else {\n this.addToken = this.addTokenUsingMemberAccess;\n this.handlePayload = this.handlePayloadNoCustom;\n }\n });\n\n this.TRACE_INIT(\"Failed Optimization Warnings\", () => {\n const unOptimizedModes = reduce(\n this.canModeBeOptimized,\n (cannotBeOptimized, canBeOptimized, modeName) => {\n if (canBeOptimized === false) {\n cannotBeOptimized.push(modeName);\n }\n return cannotBeOptimized;\n },\n [] as string[],\n );\n\n if (config.ensureOptimizations && !isEmpty(unOptimizedModes)) {\n throw Error(\n `Lexer Modes: < ${unOptimizedModes.join(\n \", \",\n )} > cannot be optimized.\\n` +\n '\\t Disable the \"ensureOptimizations\" lexer config flag to silently ignore this and run the lexer in an un-optimized mode.\\n' +\n \"\\t Or inspect the console log for details on how to resolve these issues.\",\n );\n }\n });\n\n this.TRACE_INIT(\"clearRegExpParserCache\", () => {\n clearRegExpParserCache();\n });\n\n this.TRACE_INIT(\"toFastProperties\", () => {\n toFastProperties(this);\n });\n });\n }\n\n public tokenize(\n text: string,\n initialMode: string = this.defaultMode,\n ): ILexingResult {\n if (!isEmpty(this.lexerDefinitionErrors)) {\n const allErrMessages = map(this.lexerDefinitionErrors, (error) => {\n return error.message;\n });\n const allErrMessagesString = allErrMessages.join(\n \"-----------------------\\n\",\n );\n throw new Error(\n \"Unable to Tokenize because Errors detected in definition of Lexer:\\n\" +\n allErrMessagesString,\n );\n }\n\n return this.tokenizeInternal(text, initialMode);\n }\n\n // There is quite a bit of duplication between this and \"tokenizeInternalLazy\"\n // This is intentional due to performance considerations.\n // this method also used quite a bit of `!` none null assertions because it is too optimized\n // for `tsc` to always understand it is \"safe\"\n private tokenizeInternal(text: string, initialMode: string): ILexingResult {\n let i,\n j,\n k,\n matchAltImage,\n longerAlt,\n matchedImage: string | null,\n payload,\n altPayload,\n imageLength,\n group,\n tokType,\n newToken: IToken,\n errLength,\n droppedChar,\n msg,\n match;\n const orgText = text;\n const orgLength = orgText.length;\n let offset = 0;\n let matchedTokensIndex = 0;\n // initializing the tokensArray to the \"guessed\" size.\n // guessing too little will still reduce the number of array re-sizes on pushes.\n // guessing too large (Tested by guessing x4 too large) may cost a bit more of memory\n // but would still have a faster runtime by avoiding (All but one) array resizing.\n const guessedNumberOfTokens = this.hasCustom\n ? 0 // will break custom token pattern APIs the matchedTokens array will contain undefined elements.\n : Math.floor(text.length / 10);\n const matchedTokens = new Array(guessedNumberOfTokens);\n const errors: ILexingError[] = [];\n let line = this.trackStartLines ? 1 : undefined;\n let column = this.trackStartLines ? 1 : undefined;\n const groups: any = cloneEmptyGroups(this.emptyGroups);\n const trackLines = this.trackStartLines;\n const lineTerminatorPattern = this.config.lineTerminatorsPattern;\n\n let currModePatternsLength = 0;\n let patternIdxToConfig: IPatternConfig[] = [];\n let currCharCodeToPatternIdxToConfig: {\n [charCode: number]: IPatternConfig[];\n } = [];\n\n const modeStack: string[] = [];\n\n const emptyArray: IPatternConfig[] = [];\n Object.freeze(emptyArray);\n let getPossiblePatterns!: (charCode: number) => IPatternConfig[];\n\n function getPossiblePatternsSlow() {\n return patternIdxToConfig;\n }\n\n function getPossiblePatternsOptimized(charCode: number): IPatternConfig[] {\n const optimizedCharIdx = charCodeToOptimizedIndex(charCode);\n const possiblePatterns =\n currCharCodeToPatternIdxToConfig[optimizedCharIdx];\n if (possiblePatterns === undefined) {\n return emptyArray;\n } else {\n return possiblePatterns;\n }\n }\n\n const pop_mode = (popToken: IToken) => {\n // TODO: perhaps avoid this error in the edge case there is no more input?\n if (\n modeStack.length === 1 &&\n // if we have both a POP_MODE and a PUSH_MODE this is in-fact a \"transition\"\n // So no error should occur.\n popToken.tokenType.PUSH_MODE === undefined\n ) {\n // if we try to pop the last mode there lexer will no longer have ANY mode.\n // thus the pop is ignored, an error will be created and the lexer will continue parsing in the previous mode.\n const msg =\n this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(\n popToken,\n );\n\n errors.push({\n offset: popToken.startOffset,\n line: popToken.startLine,\n column: popToken.startColumn,\n length: popToken.image.length,\n message: msg,\n });\n } else {\n modeStack.pop();\n const newMode = last(modeStack)!;\n patternIdxToConfig = this.patternIdxToConfig[newMode];\n currCharCodeToPatternIdxToConfig =\n this.charCodeToPatternIdxToConfig[newMode];\n currModePatternsLength = patternIdxToConfig.length;\n const modeCanBeOptimized =\n this.canModeBeOptimized[newMode] && this.config.safeMode === false;\n\n if (currCharCodeToPatternIdxToConfig && modeCanBeOptimized) {\n getPossiblePatterns = getPossiblePatternsOptimized;\n } else {\n getPossiblePatterns = getPossiblePatternsSlow;\n }\n }\n };\n\n function push_mode(this: Lexer, newMode: string) {\n modeStack.push(newMode);\n currCharCodeToPatternIdxToConfig =\n this.charCodeToPatternIdxToConfig[newMode];\n\n patternIdxToConfig = this.patternIdxToConfig[newMode];\n currModePatternsLength = patternIdxToConfig.length;\n\n currModePatternsLength = patternIdxToConfig.length;\n const modeCanBeOptimized =\n this.canModeBeOptimized[newMode] && this.config.safeMode === false;\n\n if (currCharCodeToPatternIdxToConfig && modeCanBeOptimized) {\n getPossiblePatterns = getPossiblePatternsOptimized;\n } else {\n getPossiblePatterns = getPossiblePatternsSlow;\n }\n }\n\n // this pattern seems to avoid a V8 de-optimization, although that de-optimization does not\n // seem to matter performance wise.\n push_mode.call(this, initialMode);\n\n let currConfig!: IPatternConfig;\n\n const recoveryEnabled = this.config.recoveryEnabled;\n\n while (offset < orgLength) {\n matchedImage = null;\n\n const nextCharCode = orgText.charCodeAt(offset);\n const chosenPatternIdxToConfig = getPossiblePatterns(nextCharCode);\n const chosenPatternsLength = chosenPatternIdxToConfig.length;\n\n for (i = 0; i < chosenPatternsLength; i++) {\n currConfig = chosenPatternIdxToConfig[i];\n const currPattern = currConfig.pattern;\n payload = null;\n\n // manually in-lined because > 600 chars won't be in-lined in V8\n const singleCharCode = currConfig.short;\n if (singleCharCode !== false) {\n if (nextCharCode === singleCharCode) {\n // single character string\n matchedImage = currPattern as string;\n }\n } else if (currConfig.isCustom === true) {\n match = (currPattern as IRegExpExec).exec(\n orgText,\n offset,\n matchedTokens,\n groups,\n );\n if (match !== null) {\n matchedImage = match[0];\n if ((match as CustomPatternMatcherReturn).payload !== undefined) {\n payload = (match as CustomPatternMatcherReturn).payload;\n }\n } else {\n matchedImage = null;\n }\n } else {\n this.updateLastIndex(currPattern as RegExp, offset);\n matchedImage = this.match(currPattern as RegExp, text, offset);\n }\n\n if (matchedImage !== null) {\n // even though this pattern matched we must try a another longer alternative.\n // this can be used to prioritize keywords over identifiers\n longerAlt = currConfig.longerAlt;\n if (longerAlt !== undefined) {\n // TODO: micro optimize, avoid extra prop access\n // by saving/linking longerAlt on the original config?\n const longerAltLength = longerAlt.length;\n for (k = 0; k < longerAltLength; k++) {\n const longerAltConfig = patternIdxToConfig[longerAlt[k]];\n const longerAltPattern = longerAltConfig.pattern;\n altPayload = null;\n\n // single Char can never be a longer alt so no need to test it.\n // manually in-lined because > 600 chars won't be in-lined in V8\n if (longerAltConfig.isCustom === true) {\n match = (longerAltPattern as IRegExpExec).exec(\n orgText,\n offset,\n matchedTokens,\n groups,\n );\n if (match !== null) {\n matchAltImage = match[0];\n if (\n (match as CustomPatternMatcherReturn).payload !== undefined\n ) {\n altPayload = (match as CustomPatternMatcherReturn).payload;\n }\n } else {\n matchAltImage = null;\n }\n } else {\n this.updateLastIndex(longerAltPattern as RegExp, offset);\n matchAltImage = this.match(\n longerAltPattern as RegExp,\n text,\n offset,\n );\n }\n\n if (matchAltImage && matchAltImage.length > matchedImage.length) {\n matchedImage = matchAltImage;\n payload = altPayload;\n currConfig = longerAltConfig;\n // Exit the loop early after matching one of the longer alternatives\n // The first matched alternative takes precedence\n break;\n }\n }\n }\n break;\n }\n }\n\n // successful match\n if (matchedImage !== null) {\n imageLength = matchedImage.length;\n group = currConfig.group;\n if (group !== undefined) {\n tokType = currConfig.tokenTypeIdx;\n // TODO: \"offset + imageLength\" and the new column may be computed twice in case of \"full\" location information inside\n // createFullToken method\n newToken = this.createTokenInstance(\n matchedImage,\n offset,\n tokType,\n currConfig.tokenType,\n line,\n column,\n imageLength,\n );\n\n this.handlePayload(newToken, payload);\n\n // TODO: optimize NOOP in case there are no special groups?\n if (group === false) {\n matchedTokensIndex = this.addToken(\n matchedTokens,\n matchedTokensIndex,\n newToken,\n );\n } else {\n groups[group].push(newToken);\n }\n }\n text = this.chopInput(text, imageLength);\n offset = offset + imageLength;\n\n // TODO: with newlines the column may be assigned twice\n column = this.computeNewColumn(column!, imageLength);\n\n if (trackLines === true && currConfig.canLineTerminator === true) {\n let numOfLTsInMatch = 0;\n let foundTerminator;\n let lastLTEndOffset: number;\n lineTerminatorPattern.lastIndex = 0;\n do {\n foundTerminator = lineTerminatorPattern.test(matchedImage);\n if (foundTerminator === true) {\n lastLTEndOffset = lineTerminatorPattern.lastIndex - 1;\n numOfLTsInMatch++;\n }\n } while (foundTerminator === true);\n\n if (numOfLTsInMatch !== 0) {\n line = line! + numOfLTsInMatch;\n column = imageLength - lastLTEndOffset!;\n this.updateTokenEndLineColumnLocation(\n newToken!,\n group!,\n lastLTEndOffset!,\n numOfLTsInMatch,\n line,\n column,\n imageLength,\n );\n }\n }\n // will be NOOP if no modes present\n this.handleModes(currConfig, pop_mode, push_mode, newToken!);\n } else {\n // error recovery, drop characters until we identify a valid token's start point\n const errorStartOffset = offset;\n const errorLine = line;\n const errorColumn = column;\n let foundResyncPoint = recoveryEnabled === false;\n\n while (foundResyncPoint === false && offset < orgLength) {\n // Identity Func (when sticky flag is enabled)\n text = this.chopInput(text, 1);\n offset++;\n for (j = 0; j < currModePatternsLength; j++) {\n const currConfig = patternIdxToConfig[j];\n const currPattern = currConfig.pattern;\n\n // manually in-lined because > 600 chars won't be in-lined in V8\n const singleCharCode = currConfig.short;\n if (singleCharCode !== false) {\n if (orgText.charCodeAt(offset) === singleCharCode) {\n // single character string\n foundResyncPoint = true;\n }\n } else if (currConfig.isCustom === true) {\n foundResyncPoint =\n (currPattern as IRegExpExec).exec(\n orgText,\n offset,\n matchedTokens,\n groups,\n ) !== null;\n } else {\n this.updateLastIndex(currPattern as RegExp, offset);\n foundResyncPoint = (currPattern as RegExp).exec(text) !== null;\n }\n\n if (foundResyncPoint === true) {\n break;\n }\n }\n }\n\n errLength = offset - errorStartOffset;\n column = this.computeNewColumn(column!, errLength);\n // at this point we either re-synced or reached the end of the input text\n msg = this.config.errorMessageProvider.buildUnexpectedCharactersMessage(\n orgText,\n errorStartOffset,\n errLength,\n errorLine,\n errorColumn,\n );\n errors.push({\n offset: errorStartOffset,\n line: errorLine,\n column: errorColumn,\n length: errLength,\n message: msg,\n });\n\n if (recoveryEnabled === false) {\n break;\n }\n }\n }\n\n // if we do have custom patterns which push directly into the\n // TODO: custom tokens should not push directly??\n if (!this.hasCustom) {\n // if we guessed a too large size for the tokens array this will shrink it to the right size.\n matchedTokens.length = matchedTokensIndex;\n }\n\n return {\n tokens: matchedTokens,\n groups: groups,\n errors: errors,\n };\n }\n\n private handleModes(\n config: IPatternConfig,\n pop_mode: (tok: IToken) => void,\n push_mode: (this: Lexer, pushMode: string) => void,\n newToken: IToken,\n ) {\n if (config.pop === true) {\n // need to save the PUSH_MODE property as if the mode is popped\n // patternIdxToPopMode is updated to reflect the new mode after popping the stack\n const pushMode = config.push;\n pop_mode(newToken);\n if (pushMode !== undefined) {\n push_mode.call(this, pushMode);\n }\n } else if (config.push !== undefined) {\n push_mode.call(this, config.push);\n }\n }\n\n private chopInput(text: string, length: number): string {\n return text.substring(length);\n }\n\n private updateLastIndex(regExp: RegExp, newLastIndex: number): void {\n regExp.lastIndex = newLastIndex;\n }\n\n // TODO: decrease this under 600 characters? inspect stripping comments option in TSC compiler\n private updateTokenEndLineColumnLocation(\n newToken: IToken,\n group: string | false,\n lastLTIdx: number,\n numOfLTsInMatch: number,\n line: number,\n column: number,\n imageLength: number,\n ): void {\n let lastCharIsLT, fixForEndingInLT;\n if (group !== undefined) {\n // a none skipped multi line Token, need to update endLine/endColumn\n lastCharIsLT = lastLTIdx === imageLength - 1;\n fixForEndingInLT = lastCharIsLT ? -1 : 0;\n if (!(numOfLTsInMatch === 1 && lastCharIsLT === true)) {\n // if a token ends in a LT that last LT only affects the line numbering of following Tokens\n newToken.endLine = line + fixForEndingInLT;\n // the last LT in a token does not affect the endColumn either as the [columnStart ... columnEnd)\n // inclusive to exclusive range.\n newToken.endColumn = column - 1 + -fixForEndingInLT;\n }\n // else single LT in the last character of a token, no need to modify the endLine/EndColumn\n }\n }\n\n private computeNewColumn(oldColumn: number, imageLength: number) {\n return oldColumn + imageLength;\n }\n\n // Place holder, will be replaced by the correct variant according to the locationTracking option at runtime.\n /* istanbul ignore next - place holder */\n private createTokenInstance!: (...args: any[]) => IToken;\n\n private createOffsetOnlyToken(\n image: string,\n startOffset: number,\n tokenTypeIdx: number,\n tokenType: TokenType,\n ) {\n return {\n image,\n startOffset,\n tokenTypeIdx,\n tokenType,\n };\n }\n\n private createStartOnlyToken(\n image: string,\n startOffset: number,\n tokenTypeIdx: number,\n tokenType: TokenType,\n startLine: number,\n startColumn: number,\n ) {\n return {\n image,\n startOffset,\n startLine,\n startColumn,\n tokenTypeIdx,\n tokenType,\n };\n }\n\n private createFullToken(\n image: string,\n startOffset: number,\n tokenTypeIdx: number,\n tokenType: TokenType,\n startLine: number,\n startColumn: number,\n imageLength: number,\n ): IToken {\n return {\n image,\n startOffset,\n endOffset: startOffset + imageLength - 1,\n startLine,\n endLine: startLine,\n startColumn,\n endColumn: startColumn + imageLength - 1,\n tokenTypeIdx,\n tokenType,\n };\n }\n\n // Place holder, will be replaced by the correct variant according to the locationTracking option at runtime.\n /* istanbul ignore next - place holder */\n private addToken!: (\n tokenVector: IToken[],\n index: number,\n tokenToAdd: IToken,\n ) => number;\n\n private addTokenUsingPush(\n tokenVector: IToken[],\n index: number,\n tokenToAdd: IToken,\n ): number {\n tokenVector.push(tokenToAdd);\n return index;\n }\n\n private addTokenUsingMemberAccess(\n tokenVector: IToken[],\n index: number,\n tokenToAdd: IToken,\n ): number {\n tokenVector[index] = tokenToAdd;\n index++;\n return index;\n }\n\n // Place holder, will be replaced by the correct variant according to the hasCustom flag option at runtime.\n private handlePayload: (token: IToken, payload: any) => void;\n\n private handlePayloadNoCustom(token: IToken, payload: any): void {}\n\n private handlePayloadWithCustom(token: IToken, payload: any): void {\n if (payload !== null) {\n token.payload = payload;\n }\n }\n\n // place holder to be replaced with chosen alternative at runtime\n private match!: (\n pattern: RegExp,\n text: string,\n offset: number,\n ) => string | null;\n\n private matchWithTest(\n pattern: RegExp,\n text: string,\n offset: number,\n ): string | null {\n const found = pattern.test(text);\n if (found === true) {\n return text.substring(offset, pattern.lastIndex);\n }\n return null;\n }\n\n private matchWithExec(pattern: RegExp, text: string): string | null {\n const regExpArray = pattern.exec(text);\n return regExpArray !== null ? regExpArray[0] : null;\n }\n\n // Duplicated from the parser's perf trace trait to allow future extraction\n // of the lexer to a separate package.\n TRACE_INIT = <T>(phaseDesc: string, phaseImpl: () => T): T => {\n // No need to optimize this using NOOP pattern because\n // It is not called in a hot spot...\n if (this.traceInitPerf === true) {\n this.traceInitIndent++;\n const indent = new Array(this.traceInitIndent + 1).join(\"\\t\");\n if (this.traceInitIndent < this.traceInitMaxIdent) {\n console.log(`${indent}--> <${phaseDesc}>`);\n }\n const { time, value } = timer(phaseImpl);\n /* istanbul ignore next - Difficult to reproduce specific performance behavior (>10ms) in tests */\n const traceMethod = time > 10 ? console.warn : console.log;\n if (this.traceInitIndent < this.traceInitMaxIdent) {\n traceMethod(`${indent}<-- <${phaseDesc}> time: ${time}ms`);\n }\n this.traceInitIndent--;\n return value;\n } else {\n return phaseImpl();\n }\n };\n}\n", "import { has, isString, isUndefined } from \"lodash-es\";\nimport { Lexer } from \"./lexer_public.js\";\nimport { augmentTokenTypes, tokenStructuredMatcher } from \"./tokens.js\";\nimport { IToken, ITokenConfig, TokenType } from \"@chevrotain/types\";\n\nexport function tokenLabel(tokType: TokenType): string {\n if (hasTokenLabel(tokType)) {\n return tokType.LABEL;\n } else {\n return tokType.name;\n }\n}\n\nexport function tokenName(tokType: TokenType): string {\n return tokType.name;\n}\n\nexport function hasTokenLabel(\n obj: TokenType,\n): obj is TokenType & Pick<Required<TokenType>, \"LABEL\"> {\n return isString(obj.LABEL) && obj.LABEL !== \"\";\n}\n\nconst PARENT = \"parent\";\nconst CATEGORIES = \"categories\";\nconst LABEL = \"label\";\nconst GROUP = \"group\";\nconst PUSH_MODE = \"push_mode\";\nconst POP_MODE = \"pop_mode\";\nconst LONGER_ALT = \"longer_alt\";\nconst LINE_BREAKS = \"line_breaks\";\nconst START_CHARS_HINT = \"start_chars_hint\";\n\nexport function createToken(config: ITokenConfig): TokenType {\n return createTokenInternal(config);\n}\n\nfunction createTokenInternal(config: ITokenConfig): TokenType {\n const pattern = config.pattern;\n\n const tokenType: TokenType = <any>{};\n tokenType.name = config.name;\n\n if (!isUndefined(pattern)) {\n tokenType.PATTERN = pattern;\n }\n\n if (has(config, PARENT)) {\n throw (\n \"The parent property is no longer supported.\\n\" +\n \"See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.\"\n );\n }\n\n if (has(config, CATEGORIES)) {\n // casting to ANY as this will be fixed inside `augmentTokenTypes``\n tokenType.CATEGORIES = <any>config[CATEGORIES];\n }\n\n augmentTokenTypes([tokenType]);\n\n if (has(config, LABEL)) {\n tokenType.LABEL = config[LABEL];\n }\n\n if (has(config, GROUP)) {\n tokenType.GROUP = config[GROUP];\n }\n\n if (has(config, POP_MODE)) {\n tokenType.POP_MODE = config[POP_MODE];\n }\n\n if (has(config, PUSH_MODE)) {\n tokenType.PUSH_MODE = config[PUSH_MODE];\n }\n\n if (has(config, LONGER_ALT)) {\n tokenType.LONGER_ALT = config[LONGER_ALT];\n }\n\n if (has(config, LINE_BREAKS)) {\n tokenType.LINE_BREAKS = config[LINE_BREAKS];\n }\n\n if (has(config, START_CHARS_HINT)) {\n tokenType.START_CHARS_HINT = config[START_CHARS_HINT];\n }\n\n return tokenType;\n}\n\nexport const EOF = createToken({ name: \"EOF\", pattern: Lexer.NA });\naugmentTokenTypes([EOF]);\n\nexport function createTokenInstance(\n tokType: TokenType,\n image: string,\n startOffset: number,\n endOffset: number,\n startLine: number,\n endLine: number,\n startColumn: number,\n endColumn: number,\n): IToken {\n return {\n image,\n startOffset,\n endOffset,\n startLine,\n endLine,\n startColumn,\n endColumn,\n tokenTypeIdx: (<any>tokType).tokenTypeIdx,\n tokenType: tokType,\n };\n}\n\nexport function tokenMatcher(token: IToken, tokType: TokenType): boolean {\n return tokenStructuredMatcher(token, tokType);\n}\n", "import { hasTokenLabel, tokenLabel } from \"../scan/tokens_public.js\";\nimport { first, map, reduce } from \"lodash-es\";\nimport {\n Alternation,\n getProductionDslName,\n NonTerminal,\n Rule,\n Terminal,\n} from \"@chevrotain/gast\";\nimport {\n IParserErrorMessageProvider,\n IProductionWithOccurrence,\n TokenType,\n} from \"@chevrotain/types\";\nimport {\n IGrammarResolverErrorMessageProvider,\n IGrammarValidatorErrorMessageProvider,\n} from \"./grammar/types.js\";\n\nexport const defaultParserErrorProvider: IParserErrorMessageProvider = {\n buildMismatchTokenMessage({ expected, actual, previous, ruleName }): string {\n const hasLabel = hasTokenLabel(expected);\n const expectedMsg = hasLabel\n ? `--> ${tokenLabel(expected)} <--`\n : `token of type --> ${expected.name} <--`;\n\n const msg = `Expecting ${expectedMsg} but found --> '${actual.image}' <--`;\n\n return msg;\n },\n\n buildNotAllInputParsedMessage({ firstRedundant, ruleName }): string {\n return \"Redundant input, expecting EOF but found: \" + firstRedundant.image;\n },\n\n buildNoViableAltMessage({\n expectedPathsPerAlt,\n actual,\n previous,\n customUserDescription,\n ruleName,\n }): string {\n const errPrefix = \"Expecting: \";\n // TODO: issue: No Viable Alternative Error may have incomplete details. #502\n const actualText = first(actual)!.image;\n const errSuffix = \"\\nbut found: '\" + actualText + \"'\";\n\n if (customUserDescription) {\n return errPrefix + customUserDescription + errSuffix;\n } else {\n const allLookAheadPaths = reduce(\n expectedPathsPerAlt,\n (result, currAltPaths) => result.concat(currAltPaths),\n [] as TokenType[][],\n );\n const nextValidTokenSequences = map(\n allLookAheadPaths,\n (currPath) =>\n `[${map(currPath, (currTokenType) => tokenLabel(currTokenType)).join(\n \", \",\n )}]`,\n );\n const nextValidSequenceItems = map(\n nextValidTokenSequences,\n (itemMsg, idx) => ` ${idx + 1}. ${itemMsg}`,\n );\n const calculatedDescription = `one of these possible Token sequences:\\n${nextValidSequenceItems.join(\n \"\\n\",\n )}`;\n\n return errPrefix + calculatedDescription + errSuffix;\n }\n },\n\n buildEarlyExitMessage({\n expectedIterationPaths,\n actual,\n customUserDescription,\n ruleName,\n }): string {\n const errPrefix = \"Expecting: \";\n // TODO: issue: No Viable Alternative Error may have incomplete details. #502\n const actualText = first(actual)!.image;\n const errSuffix = \"\\nbut found: '\" + actualText + \"'\";\n\n if (customUserDescription) {\n return errPrefix + customUserDescription + errSuffix;\n } else {\n const nextValidTokenSequences = map(\n expectedIterationPaths,\n (currPath) =>\n `[${map(currPath, (currTokenType) => tokenLabel(currTokenType)).join(\n \",\",\n )}]`,\n );\n const calculatedDescription =\n `expecting at least one iteration which starts with one of these possible Token sequences::\\n ` +\n `<${nextValidTokenSequences.join(\" ,\")}>`;\n\n return errPrefix + calculatedDescription + errSuffix;\n }\n },\n};\n\nObject.freeze(defaultParserErrorProvider);\n\nexport const defaultGrammarResolverErrorProvider: IGrammarResolverErrorMessageProvider =\n {\n buildRuleNotFoundError(\n topLevelRule: Rule,\n undefinedRule: NonTerminal,\n ): string {\n const msg =\n \"Invalid grammar, reference to a rule which is not defined: ->\" +\n undefinedRule.nonTerminalName +\n \"<-\\n\" +\n \"inside top level rule: ->\" +\n topLevelRule.name +\n \"<-\";\n return msg;\n },\n };\n\nexport const defaultGrammarValidatorErrorProvider: IGrammarValidatorErrorMessageProvider =\n {\n buildDuplicateFoundError(\n topLevelRule: Rule,\n duplicateProds: IProductionWithOccurrence[],\n ): string {\n function getExtraProductionArgument(\n prod: IProductionWithOccurrence,\n ): string {\n if (prod instanceof Terminal) {\n return prod.terminalType.name;\n } else if (prod instanceof NonTerminal) {\n return prod.nonTerminalName;\n } else {\n return \"\";\n }\n }\n\n const topLevelName = topLevelRule.name;\n const duplicateProd = first(duplicateProds)!;\n const index = duplicateProd.idx;\n const dslName = getProductionDslName(duplicateProd);\n const extraArgument = getExtraProductionArgument(duplicateProd);\n\n const hasExplicitIndex = index > 0;\n let msg = `->${dslName}${hasExplicitIndex ? index : \"\"}<- ${\n extraArgument ? `with argument: ->${extraArgument}<-` : \"\"\n }\n appears more than once (${\n duplicateProds.length\n } times) in the top level rule: ->${topLevelName}<-. \n For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES \n `;\n\n // white space trimming time! better to trim afterwards as it allows to use WELL formatted multi line template strings...\n msg = msg.replace(/[ \\t]+/g, \" \");\n msg = msg.replace(/\\s\\s+/g, \"\\n\");\n\n return msg;\n },\n\n buildNamespaceConflictError(rule: Rule): string {\n const errMsg =\n `Namespace conflict found in grammar.\\n` +\n `The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <${rule.name}>.\\n` +\n `To resolve this make sure each Terminal and Non-Terminal names are unique\\n` +\n `This is easy to accomplish by using the convention that Terminal names start with an uppercase letter\\n` +\n `and Non-Terminal names start with a lower case letter.`;\n\n return errMsg;\n },\n\n buildAlternationPrefixAmbiguityError(options: {\n topLevelRule: Rule;\n prefixPath: TokenType[];\n ambiguityIndices: number[];\n alternation: Alternation;\n }): string {\n const pathMsg = map(options.prefixPath, (currTok) =>\n tokenLabel(currTok),\n ).join(\", \");\n const occurrence =\n options.alternation.idx === 0 ? \"\" : options.alternation.idx;\n const errMsg =\n `Ambiguous alternatives: <${options.ambiguityIndices.join(\n \" ,\",\n )}> due to common lookahead prefix\\n` +\n `in <OR${occurrence}> inside <${options.topLevelRule.name}> Rule,\\n` +\n `<${pathMsg}> may appears as a prefix path in all these alternatives.\\n` +\n `See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX\\n` +\n `For Further details.`;\n\n return errMsg;\n },\n\n buildAlternationAmbiguityError(options: {\n topLevelRule: Rule;\n prefixPath: TokenType[];\n ambiguityIndices: number[];\n alternation: Alternation;\n }): string {\n const pathMsg = map(options.prefixPath, (currtok) =>\n tokenLabel(currtok),\n ).join(\", \");\n const occurrence =\n options.alternation.idx === 0 ? \"\" : options.alternation.idx;\n let currMessage =\n `Ambiguous Alternatives Detected: <${options.ambiguityIndices.join(\n \" ,\",\n )}> in <OR${occurrence}>` +\n ` inside <${options.topLevelRule.name}> Rule,\\n` +\n `<${pathMsg}> may appears as a prefix path in all these alternatives.\\n`;\n\n currMessage =\n currMessage +\n `See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\\n` +\n `For Further details.`;\n return currMessage;\n },\n\n buildEmptyRepetitionError(options: {\n topLevelRule: Rule;\n repetition: IProductionWithOccurrence;\n }): string {\n let dslName = getProductionDslName(options.repetition);\n if (options.repetition.idx !== 0) {\n dslName += options.repetition.idx;\n }\n\n const errMsg =\n `The repetition <${dslName}> within Rule <${options.topLevelRule.name}> can never consume any tokens.\\n` +\n `This could lead to an infinite loop.`;\n\n return errMsg;\n },\n\n // TODO: remove - `errors_public` from nyc.config.js exclude\n // once this method is fully removed from this file\n buildTokenNameError(options: {\n tokenType: TokenType;\n expectedPattern: RegExp;\n }): string {\n /* istanbul ignore next */\n return \"deprecated\";\n },\n\n buildEmptyAlternationError(options: {\n topLevelRule: Rule;\n alternation: Alternation;\n emptyChoiceIdx: number;\n }): string {\n const errMsg =\n `Ambiguous empty alternative: <${options.emptyChoiceIdx + 1}>` +\n ` in <OR${options.alternation.idx}> inside <${options.topLevelRule.name}> Rule.\\n` +\n `Only the last alternative may be an empty alternative.`;\n\n return errMsg;\n },\n\n buildTooManyAlternativesError(options: {\n topLevelRule: Rule;\n alternation: Alternation;\n }): string {\n const errMsg =\n `An Alternation cannot have more than 256 alternatives:\\n` +\n `<OR${options.alternation.idx}> inside <${\n options.topLevelRule.name\n }> Rule.\\n has ${\n options.alternation.definition.length + 1\n } alternatives.`;\n\n return errMsg;\n },\n\n buildLeftRecursionError(options: {\n topLevelRule: Rule;\n leftRecursionPath: Rule[];\n }): string {\n const ruleName = options.topLevelRule.name;\n const pathNames = map(\n options.leftRecursionPath,\n (currRule) => currRule.name,\n );\n const leftRecursivePath = `${ruleName} --> ${pathNames\n .concat([ruleName])\n .join(\" --> \")}`;\n const errMsg =\n `Left Recursion found in grammar.\\n` +\n `rule: <${ruleName}> can be invoked from itself (directly or indirectly)\\n` +\n `without consuming any Tokens. The grammar path that causes this is: \\n ${leftRecursivePath}\\n` +\n ` To fix this refactor your grammar to remove the left recursion.\\n` +\n `see: https://en.wikipedia.org/wiki/LL_parser#Left_factoring.`;\n\n return errMsg;\n },\n\n // TODO: remove - `errors_public` from nyc.config.js exclude\n // once this method is fully removed from this file\n buildInvalidRuleNameError(options: {\n topLevelRule: Rule;\n expectedPattern: RegExp;\n }): string {\n /* istanbul ignore next */\n return \"deprecated\";\n },\n\n buildDuplicateRuleNameError(options: {\n topLevelRule: Rule | string;\n grammarName: string;\n }): string {\n let ruleName;\n if (options.topLevelRule instanceof Rule) {\n ruleName = options.topLevelRule.name;\n } else {\n ruleName = options.topLevelRule;\n }\n\n const errMsg = `Duplicate definition, rule: ->${ruleName}<- is already defined in the grammar: ->${options.grammarName}<-`;\n\n return errMsg;\n },\n };\n", "import {\n IParserUnresolvedRefDefinitionError,\n ParserDefinitionErrorType,\n} from \"../parser/parser.js\";\nimport { forEach, values } from \"lodash-es\";\nimport { GAstVisitor, NonTerminal, Rule } from \"@chevrotain/gast\";\nimport {\n IGrammarResolverErrorMessageProvider,\n IParserDefinitionError,\n} from \"./types.js\";\n\nexport function resolveGrammar(\n topLevels: Record<string, Rule>,\n errMsgProvider: IGrammarResolverErrorMessageProvider,\n): IParserDefinitionError[] {\n const refResolver = new GastRefResolverVisitor(topLevels, errMsgProvider);\n refResolver.resolveRefs();\n return refResolver.errors;\n}\n\nexport class GastRefResolverVisitor extends GAstVisitor {\n public errors: IParserUnresolvedRefDefinitionError[] = [];\n private currTopLevel: Rule;\n\n constructor(\n private nameToTopRule: Record<string, Rule>,\n private errMsgProvider: IGrammarResolverErrorMessageProvider,\n ) {\n super();\n }\n\n public resolveRefs(): void {\n forEach(values(this.nameToTopRule), (prod) => {\n this.currTopLevel = prod;\n prod.accept(this);\n });\n }\n\n public visitNonTerminal(node: NonTerminal): void {\n const ref = this.nameToTopRule[node.nonTerminalName];\n\n if (!ref) {\n const msg = this.errMsgProvider.buildRuleNotFoundError(\n this.currTopLevel,\n node,\n );\n this.errors.push({\n message: msg,\n type: ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,\n ruleName: this.currTopLevel.name,\n unresolvedRefName: node.nonTerminalName,\n });\n } else {\n node.referencedRule = ref;\n }\n }\n}\n", "import {\n clone,\n drop,\n dropRight,\n first as _first,\n forEach,\n isEmpty,\n last,\n} from \"lodash-es\";\nimport { first } from \"./first.js\";\nimport { RestWalker } from \"./rest.js\";\nimport { TokenMatcher } from \"../parser/parser.js\";\nimport {\n Alternation,\n Alternative,\n NonTerminal,\n Option,\n Repetition,\n RepetitionMandatory,\n RepetitionMandatoryWithSeparator,\n RepetitionWithSeparator,\n Rule,\n Terminal,\n} from \"@chevrotain/gast\";\nimport {\n IGrammarPath,\n IProduction,\n ISyntacticContentAssistPath,\n IToken,\n ITokenGrammarPath,\n TokenType,\n} from \"@chevrotain/types\";\n\nexport abstract class AbstractNextPossibleTokensWalker extends RestWalker {\n protected possibleTokTypes: TokenType[] = [];\n protected ruleStack: string[];\n protected occurrenceStack: number[];\n\n protected nextProductionName = \"\";\n protected nextProductionOccurrence = 0;\n protected found = false;\n protected isAtEndOfPath = false;\n\n constructor(\n protected topProd: Rule,\n protected path: IGrammarPath,\n ) {\n super();\n }\n\n startWalking(): TokenType[] {\n this.found = false;\n\n if (this.path.ruleStack[0] !== this.topProd.name) {\n throw Error(\"The path does not start with the walker's top Rule!\");\n }\n\n // immutable for the win\n this.ruleStack = clone(this.path.ruleStack).reverse(); // intelij bug requires assertion\n this.occurrenceStack = clone(this.path.occurrenceStack).reverse(); // intelij bug requires assertion\n\n // already verified that the first production is valid, we now seek the 2nd production\n this.ruleStack.pop();\n this.occurrenceStack.pop();\n\n this.updateExpectedNext();\n this.walk(this.topProd);\n\n return this.possibleTokTypes;\n }\n\n walk(\n prod: { definition: IProduction[] },\n prevRest: IProduction[] = [],\n ): void {\n // stop scanning once we found the path\n if (!this.found) {\n super.walk(prod, prevRest);\n }\n }\n\n walkProdRef(\n refProd: NonTerminal,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n // found the next production, need to keep walking in it\n if (\n refProd.referencedRule.name === this.nextProductionName &&\n refProd.idx === this.nextProductionOccurrence\n ) {\n const fullRest = currRest.concat(prevRest);\n this.updateExpectedNext();\n this.walk(refProd.referencedRule, <any>fullRest);\n }\n }\n\n updateExpectedNext(): void {\n // need to consume the Terminal\n if (isEmpty(this.ruleStack)) {\n // must reset nextProductionXXX to avoid walking down another Top Level production while what we are\n // really seeking is the last Terminal...\n this.nextProductionName = \"\";\n this.nextProductionOccurrence = 0;\n this.isAtEndOfPath = true;\n } else {\n this.nextProductionName = this.ruleStack.pop()!;\n this.nextProductionOccurrence = this.occurrenceStack.pop()!;\n }\n }\n}\n\nexport class NextAfterTokenWalker extends AbstractNextPossibleTokensWalker {\n private nextTerminalName = \"\";\n private nextTerminalOccurrence = 0;\n\n constructor(\n topProd: Rule,\n protected path: ITokenGrammarPath,\n ) {\n super(topProd, path);\n this.nextTerminalName = this.path.lastTok.name;\n this.nextTerminalOccurrence = this.path.lastTokOccurrence;\n }\n\n walkTerminal(\n terminal: Terminal,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (\n this.isAtEndOfPath &&\n terminal.terminalType.name === this.nextTerminalName &&\n terminal.idx === this.nextTerminalOccurrence &&\n !this.found\n ) {\n const fullRest = currRest.concat(prevRest);\n const restProd = new Alternative({ definition: fullRest });\n this.possibleTokTypes = first(restProd);\n this.found = true;\n }\n }\n}\n\nexport type AlternativesFirstTokens = TokenType[][];\n\nexport interface IFirstAfterRepetition {\n token: TokenType | undefined;\n occurrence: number | undefined;\n isEndOfRule: boolean | undefined;\n}\n\n/**\n * This walker only \"walks\" a single \"TOP\" level in the Grammar Ast, this means\n * it never \"follows\" production refs\n */\nexport class AbstractNextTerminalAfterProductionWalker extends RestWalker {\n protected result: IFirstAfterRepetition = {\n token: undefined,\n occurrence: undefined,\n isEndOfRule: undefined,\n };\n\n constructor(\n protected topRule: Rule,\n protected occurrence: number,\n ) {\n super();\n }\n\n startWalking(): IFirstAfterRepetition {\n this.walk(this.topRule);\n return this.result;\n }\n}\n\nexport class NextTerminalAfterManyWalker extends AbstractNextTerminalAfterProductionWalker {\n walkMany(\n manyProd: Repetition,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (manyProd.idx === this.occurrence) {\n const firstAfterMany = _first(currRest.concat(prevRest));\n this.result.isEndOfRule = firstAfterMany === undefined;\n if (firstAfterMany instanceof Terminal) {\n this.result.token = firstAfterMany.terminalType;\n this.result.occurrence = firstAfterMany.idx;\n }\n } else {\n super.walkMany(manyProd, currRest, prevRest);\n }\n }\n}\n\nexport class NextTerminalAfterManySepWalker extends AbstractNextTerminalAfterProductionWalker {\n walkManySep(\n manySepProd: RepetitionWithSeparator,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (manySepProd.idx === this.occurrence) {\n const firstAfterManySep = _first(currRest.concat(prevRest));\n this.result.isEndOfRule = firstAfterManySep === undefined;\n if (firstAfterManySep instanceof Terminal) {\n this.result.token = firstAfterManySep.terminalType;\n this.result.occurrence = firstAfterManySep.idx;\n }\n } else {\n super.walkManySep(manySepProd, currRest, prevRest);\n }\n }\n}\n\nexport class NextTerminalAfterAtLeastOneWalker extends AbstractNextTerminalAfterProductionWalker {\n walkAtLeastOne(\n atLeastOneProd: RepetitionMandatory,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (atLeastOneProd.idx === this.occurrence) {\n const firstAfterAtLeastOne = _first(currRest.concat(prevRest));\n this.result.isEndOfRule = firstAfterAtLeastOne === undefined;\n if (firstAfterAtLeastOne instanceof Terminal) {\n this.result.token = firstAfterAtLeastOne.terminalType;\n this.result.occurrence = firstAfterAtLeastOne.idx;\n }\n } else {\n super.walkAtLeastOne(atLeastOneProd, currRest, prevRest);\n }\n }\n}\n\n// TODO: reduce code duplication in the AfterWalkers\nexport class NextTerminalAfterAtLeastOneSepWalker extends AbstractNextTerminalAfterProductionWalker {\n walkAtLeastOneSep(\n atleastOneSepProd: RepetitionMandatoryWithSeparator,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (atleastOneSepProd.idx === this.occurrence) {\n const firstAfterfirstAfterAtLeastOneSep = _first(\n currRest.concat(prevRest),\n );\n this.result.isEndOfRule = firstAfterfirstAfterAtLeastOneSep === undefined;\n if (firstAfterfirstAfterAtLeastOneSep instanceof Terminal) {\n this.result.token = firstAfterfirstAfterAtLeastOneSep.terminalType;\n this.result.occurrence = firstAfterfirstAfterAtLeastOneSep.idx;\n }\n } else {\n super.walkAtLeastOneSep(atleastOneSepProd, currRest, prevRest);\n }\n }\n}\n\nexport interface PartialPathAndSuffixes {\n partialPath: TokenType[];\n suffixDef: IProduction[];\n}\n\nexport function possiblePathsFrom(\n targetDef: IProduction[],\n maxLength: number,\n currPath: TokenType[] = [],\n): PartialPathAndSuffixes[] {\n // avoid side effects\n currPath = clone(currPath);\n let result: PartialPathAndSuffixes[] = [];\n let i = 0;\n\n // TODO: avoid inner funcs\n function remainingPathWith(nextDef: IProduction[]) {\n return nextDef.concat(drop(targetDef, i + 1));\n }\n\n // TODO: avoid inner funcs\n function getAlternativesForProd(definition: IProduction[]) {\n const alternatives = possiblePathsFrom(\n remainingPathWith(definition),\n maxLength,\n currPath,\n );\n return result.concat(alternatives);\n }\n\n /**\n * Mandatory productions will halt the loop as the paths computed from their recursive calls will already contain the\n * following (rest) of the targetDef.\n *\n * For optional productions (Option/Repetition/...) the loop will continue to represent the paths that do not include the\n * the optional production.\n */\n while (currPath.length < maxLength && i < targetDef.length) {\n const prod = targetDef[i];\n\n /* istanbul ignore else */\n if (prod instanceof Alternative) {\n return getAlternativesForProd(prod.definition);\n } else if (prod instanceof NonTerminal) {\n return getAlternativesForProd(prod.definition);\n } else if (prod instanceof Option) {\n result = getAlternativesForProd(prod.definition);\n } else if (prod instanceof RepetitionMandatory) {\n const newDef = prod.definition.concat([\n new Repetition({\n definition: prod.definition,\n }),\n ]);\n return getAlternativesForProd(newDef);\n } else if (prod instanceof RepetitionMandatoryWithSeparator) {\n const newDef = [\n new Alternative({ definition: prod.definition }),\n new Repetition({\n definition: [new Terminal({ terminalType: prod.separator })].concat(\n <any>prod.definition,\n ),\n }),\n ];\n return getAlternativesForProd(newDef);\n } else if (prod instanceof RepetitionWithSeparator) {\n const newDef = prod.definition.concat([\n new Repetition({\n definition: [new Terminal({ terminalType: prod.separator })].concat(\n <any>prod.definition,\n ),\n }),\n ]);\n result = getAlternativesForProd(newDef);\n } else if (prod instanceof Repetition) {\n const newDef = prod.definition.concat([\n new Repetition({\n definition: prod.definition,\n }),\n ]);\n result = getAlternativesForProd(newDef);\n } else if (prod instanceof Alternation) {\n forEach(prod.definition, (currAlt) => {\n // TODO: this is a limited check for empty alternatives\n // It would prevent a common case of infinite loops during parser initialization.\n // However **in-directly** empty alternatives may still cause issues.\n if (isEmpty(currAlt.definition) === false) {\n result = getAlternativesForProd(currAlt.definition);\n }\n });\n return result;\n } else if (prod instanceof Terminal) {\n currPath.push(prod.terminalType);\n } else {\n throw Error(\"non exhaustive match\");\n }\n\n i++;\n }\n result.push({\n partialPath: currPath,\n suffixDef: drop(targetDef, i),\n });\n\n return result;\n}\n\ninterface IPathToExamine {\n idx: number;\n def: IProduction[];\n ruleStack: string[];\n occurrenceStack: number[];\n}\n\nexport function nextPossibleTokensAfter(\n initialDef: IProduction[],\n tokenVector: IToken[],\n tokMatcher: TokenMatcher,\n maxLookAhead: number,\n): ISyntacticContentAssistPath[] {\n const EXIT_NON_TERMINAL: any = \"EXIT_NONE_TERMINAL\";\n // to avoid creating a new Array each time.\n const EXIT_NON_TERMINAL_ARR = [EXIT_NON_TERMINAL];\n const EXIT_ALTERNATIVE: any = \"EXIT_ALTERNATIVE\";\n let foundCompletePath = false;\n\n const tokenVectorLength = tokenVector.length;\n const minimalAlternativesIndex = tokenVectorLength - maxLookAhead - 1;\n\n const result: ISyntacticContentAssistPath[] = [];\n\n const possiblePaths: IPathToExamine[] = [];\n possiblePaths.push({\n idx: -1,\n def: initialDef,\n ruleStack: [],\n occurrenceStack: [],\n });\n\n while (!isEmpty(possiblePaths)) {\n const currPath = possiblePaths.pop()!;\n\n // skip alternatives if no more results can be found (assuming deterministic grammar with fixed lookahead)\n if (currPath === EXIT_ALTERNATIVE) {\n if (\n foundCompletePath &&\n last(possiblePaths)!.idx <= minimalAlternativesIndex\n ) {\n // remove irrelevant alternative\n possiblePaths.pop();\n }\n continue;\n }\n\n const currDef = currPath.def;\n const currIdx = currPath.idx;\n const currRuleStack = currPath.ruleStack;\n const currOccurrenceStack = currPath.occurrenceStack;\n\n // For Example: an empty path could exist in a valid grammar in the case of an EMPTY_ALT\n if (isEmpty(currDef)) {\n continue;\n }\n\n const prod = currDef[0];\n /* istanbul ignore else */\n if (prod === EXIT_NON_TERMINAL) {\n const nextPath = {\n idx: currIdx,\n def: drop(currDef),\n ruleStack: dropRight(currRuleStack),\n occurrenceStack: dropRight(currOccurrenceStack),\n };\n possiblePaths.push(nextPath);\n } else if (prod instanceof Terminal) {\n /* istanbul ignore else */\n if (currIdx < tokenVectorLength - 1) {\n const nextIdx = currIdx + 1;\n const actualToken = tokenVector[nextIdx];\n if (tokMatcher!(actualToken, prod.terminalType)) {\n const nextPath = {\n idx: nextIdx,\n def: drop(currDef),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPath);\n }\n // end of the line\n } else if (currIdx === tokenVectorLength - 1) {\n // IGNORE ABOVE ELSE\n result.push({\n nextTokenType: prod.terminalType,\n nextTokenOccurrence: prod.idx,\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n });\n foundCompletePath = true;\n } else {\n throw Error(\"non exhaustive match\");\n }\n } else if (prod instanceof NonTerminal) {\n const newRuleStack = clone(currRuleStack);\n newRuleStack.push(prod.nonTerminalName);\n\n const newOccurrenceStack = clone(currOccurrenceStack);\n newOccurrenceStack.push(prod.idx);\n\n const nextPath = {\n idx: currIdx,\n def: prod.definition.concat(EXIT_NON_TERMINAL_ARR, drop(currDef)),\n ruleStack: newRuleStack,\n occurrenceStack: newOccurrenceStack,\n };\n possiblePaths.push(nextPath);\n } else if (prod instanceof Option) {\n // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n const nextPathWithout = {\n idx: currIdx,\n def: drop(currDef),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPathWithout);\n // required marker to avoid backtracking paths whose higher priority alternatives already matched\n possiblePaths.push(EXIT_ALTERNATIVE);\n\n const nextPathWith = {\n idx: currIdx,\n def: prod.definition.concat(drop(currDef)),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPathWith);\n } else if (prod instanceof RepetitionMandatory) {\n // TODO:(THE NEW operators here take a while...) (convert once?)\n const secondIteration = new Repetition({\n definition: prod.definition,\n idx: prod.idx,\n });\n const nextDef = prod.definition.concat([secondIteration], drop(currDef));\n const nextPath = {\n idx: currIdx,\n def: nextDef,\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPath);\n } else if (prod instanceof RepetitionMandatoryWithSeparator) {\n // TODO:(THE NEW operators here take a while...) (convert once?)\n const separatorGast = new Terminal({\n terminalType: prod.separator,\n });\n const secondIteration = new Repetition({\n definition: [<any>separatorGast].concat(prod.definition),\n idx: prod.idx,\n });\n const nextDef = prod.definition.concat([secondIteration], drop(currDef));\n const nextPath = {\n idx: currIdx,\n def: nextDef,\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPath);\n } else if (prod instanceof RepetitionWithSeparator) {\n // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n const nextPathWithout = {\n idx: currIdx,\n def: drop(currDef),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPathWithout);\n // required marker to avoid backtracking paths whose higher priority alternatives already matched\n possiblePaths.push(EXIT_ALTERNATIVE);\n\n const separatorGast = new Terminal({\n terminalType: prod.separator,\n });\n const nthRepetition = new Repetition({\n definition: [<any>separatorGast].concat(prod.definition),\n idx: prod.idx,\n });\n const nextDef = prod.definition.concat([nthRepetition], drop(currDef));\n const nextPathWith = {\n idx: currIdx,\n def: nextDef,\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPathWith);\n } else if (prod instanceof Repetition) {\n // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n const nextPathWithout = {\n idx: currIdx,\n def: drop(currDef),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPathWithout);\n // required marker to avoid backtracking paths whose higher priority alternatives already matched\n possiblePaths.push(EXIT_ALTERNATIVE);\n\n // TODO: an empty repetition will cause infinite loops here, will the parser detect this in selfAnalysis?\n const nthRepetition = new Repetition({\n definition: prod.definition,\n idx: prod.idx,\n });\n const nextDef = prod.definition.concat([nthRepetition], drop(currDef));\n const nextPathWith = {\n idx: currIdx,\n def: nextDef,\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(nextPathWith);\n } else if (prod instanceof Alternation) {\n // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n for (let i = prod.definition.length - 1; i >= 0; i--) {\n const currAlt: any = prod.definition[i];\n const currAltPath = {\n idx: currIdx,\n def: currAlt.definition.concat(drop(currDef)),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n };\n possiblePaths.push(currAltPath);\n possiblePaths.push(EXIT_ALTERNATIVE);\n }\n } else if (prod instanceof Alternative) {\n possiblePaths.push({\n idx: currIdx,\n def: prod.definition.concat(drop(currDef)),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack,\n });\n } else if (prod instanceof Rule) {\n // last because we should only encounter at most a single one of these per invocation.\n possiblePaths.push(\n expandTopLevelRule(prod, currIdx, currRuleStack, currOccurrenceStack),\n );\n } else {\n throw Error(\"non exhaustive match\");\n }\n }\n return result;\n}\n\nfunction expandTopLevelRule(\n topRule: Rule,\n currIdx: number,\n currRuleStack: string[],\n currOccurrenceStack: number[],\n): IPathToExamine {\n const newRuleStack = clone(currRuleStack);\n newRuleStack.push(topRule.name);\n\n const newCurrOccurrenceStack = clone(currOccurrenceStack);\n // top rule is always assumed to have been called with occurrence index 1\n newCurrOccurrenceStack.push(1);\n\n return {\n idx: currIdx,\n def: topRule.definition,\n ruleStack: newRuleStack,\n occurrenceStack: newCurrOccurrenceStack,\n };\n}\n", "import { every, flatten, forEach, has, isEmpty, map, reduce } from \"lodash-es\";\nimport { possiblePathsFrom } from \"./interpreter.js\";\nimport { RestWalker } from \"./rest.js\";\nimport { Predicate, TokenMatcher } from \"../parser/parser.js\";\nimport {\n tokenStructuredMatcher,\n tokenStructuredMatcherNoCategories,\n} from \"../../scan/tokens.js\";\nimport {\n Alternation,\n Alternative as AlternativeGAST,\n GAstVisitor,\n Option,\n Repetition,\n RepetitionMandatory,\n RepetitionMandatoryWithSeparator,\n RepetitionWithSeparator,\n} from \"@chevrotain/gast\";\nimport {\n BaseParser,\n IOrAlt,\n IProduction,\n IProductionWithOccurrence,\n LookaheadProductionType,\n LookaheadSequence,\n Rule,\n TokenType,\n} from \"@chevrotain/types\";\n\nexport enum PROD_TYPE {\n OPTION,\n REPETITION,\n REPETITION_MANDATORY,\n REPETITION_MANDATORY_WITH_SEPARATOR,\n REPETITION_WITH_SEPARATOR,\n ALTERNATION,\n}\n\nexport function getProdType(\n prod: IProduction | LookaheadProductionType,\n): PROD_TYPE {\n /* istanbul ignore else */\n if (prod instanceof Option || prod === \"Option\") {\n return PROD_TYPE.OPTION;\n } else if (prod instanceof Repetition || prod === \"Repetition\") {\n return PROD_TYPE.REPETITION;\n } else if (\n prod instanceof RepetitionMandatory ||\n prod === \"RepetitionMandatory\"\n ) {\n return PROD_TYPE.REPETITION_MANDATORY;\n } else if (\n prod instanceof RepetitionMandatoryWithSeparator ||\n prod === \"RepetitionMandatoryWithSeparator\"\n ) {\n return PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR;\n } else if (\n prod instanceof RepetitionWithSeparator ||\n prod === \"RepetitionWithSeparator\"\n ) {\n return PROD_TYPE.REPETITION_WITH_SEPARATOR;\n } else if (prod instanceof Alternation || prod === \"Alternation\") {\n return PROD_TYPE.ALTERNATION;\n } else {\n throw Error(\"non exhaustive match\");\n }\n}\n\nexport function getLookaheadPaths(options: {\n occurrence: number;\n rule: Rule;\n prodType: LookaheadProductionType;\n maxLookahead: number;\n}): LookaheadSequence[] {\n const { occurrence, rule, prodType, maxLookahead } = options;\n const type = getProdType(prodType);\n if (type === PROD_TYPE.ALTERNATION) {\n return getLookaheadPathsForOr(occurrence, rule, maxLookahead);\n } else {\n return getLookaheadPathsForOptionalProd(\n occurrence,\n rule,\n type,\n maxLookahead,\n );\n }\n}\n\nexport function buildLookaheadFuncForOr(\n occurrence: number,\n ruleGrammar: Rule,\n maxLookahead: number,\n hasPredicates: boolean,\n dynamicTokensEnabled: boolean,\n laFuncBuilder: Function,\n): (orAlts?: IOrAlt<any>[]) => number | undefined {\n const lookAheadPaths = getLookaheadPathsForOr(\n occurrence,\n ruleGrammar,\n maxLookahead,\n );\n\n const tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n ? tokenStructuredMatcherNoCategories\n : tokenStructuredMatcher;\n\n return laFuncBuilder(\n lookAheadPaths,\n hasPredicates,\n tokenMatcher,\n dynamicTokensEnabled,\n );\n}\n\n/**\n * When dealing with an Optional production (OPTION/MANY/2nd iteration of AT_LEAST_ONE/...) we need to compare\n * the lookahead \"inside\" the production and the lookahead immediately \"after\" it in the same top level rule (context free).\n *\n * Example: given a production:\n * ABC(DE)?DF\n *\n * The optional '(DE)?' should only be entered if we see 'DE'. a single Token 'D' is not sufficient to distinguish between the two\n * alternatives.\n *\n * @returns A Lookahead function which will return true IFF the parser should parse the Optional production.\n */\nexport function buildLookaheadFuncForOptionalProd(\n occurrence: number,\n ruleGrammar: Rule,\n k: number,\n dynamicTokensEnabled: boolean,\n prodType: PROD_TYPE,\n lookaheadBuilder: (\n lookAheadSequence: LookaheadSequence,\n tokenMatcher: TokenMatcher,\n dynamicTokensEnabled: boolean,\n ) => () => boolean,\n): () => boolean {\n const lookAheadPaths = getLookaheadPathsForOptionalProd(\n occurrence,\n ruleGrammar,\n prodType,\n k,\n );\n\n const tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n ? tokenStructuredMatcherNoCategories\n : tokenStructuredMatcher;\n\n return lookaheadBuilder(\n lookAheadPaths[0],\n tokenMatcher,\n dynamicTokensEnabled,\n );\n}\n\nexport type Alternative = TokenType[][];\n\nexport function buildAlternativesLookAheadFunc(\n alts: LookaheadSequence[],\n hasPredicates: boolean,\n tokenMatcher: TokenMatcher,\n dynamicTokensEnabled: boolean,\n): (orAlts: IOrAlt<any>[]) => number | undefined {\n const numOfAlts = alts.length;\n const areAllOneTokenLookahead = every(alts, (currAlt) => {\n return every(currAlt, (currPath) => {\n return currPath.length === 1;\n });\n });\n\n // This version takes into account the predicates as well.\n if (hasPredicates) {\n /**\n * @returns {number} - The chosen alternative index\n */\n return function (\n this: BaseParser,\n orAlts: IOrAlt<any>[],\n ): number | undefined {\n // unfortunately the predicates must be extracted every single time\n // as they cannot be cached due to references to parameters(vars) which are no longer valid.\n // note that in the common case of no predicates, no cpu time will be wasted on this (see else block)\n const predicates: (Predicate | undefined)[] = map(\n orAlts,\n (currAlt) => currAlt.GATE,\n );\n\n for (let t = 0; t < numOfAlts; t++) {\n const currAlt = alts[t];\n const currNumOfPaths = currAlt.length;\n\n const currPredicate = predicates[t];\n if (currPredicate !== undefined && currPredicate.call(this) === false) {\n // if the predicate does not match there is no point in checking the paths\n continue;\n }\n nextPath: for (let j = 0; j < currNumOfPaths; j++) {\n const currPath = currAlt[j];\n const currPathLength = currPath.length;\n for (let i = 0; i < currPathLength; i++) {\n const nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n // this will also work for an empty ALT as the loop will be skipped\n return t;\n }\n // none of the paths for the current alternative matched\n // try the next alternative\n }\n // none of the alternatives could be matched\n return undefined;\n };\n } else if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n // optimized (common) case of all the lookaheads paths requiring only\n // a single token lookahead. These Optimizations cannot work if dynamically defined Tokens are used.\n const singleTokenAlts = map(alts, (currAlt) => {\n return flatten(currAlt);\n });\n\n const choiceToAlt = reduce(\n singleTokenAlts,\n (result, currAlt, idx) => {\n forEach(currAlt, (currTokType) => {\n if (!has(result, currTokType.tokenTypeIdx!)) {\n result[currTokType.tokenTypeIdx!] = idx;\n }\n forEach(currTokType.categoryMatches!, (currExtendingType) => {\n if (!has(result, currExtendingType)) {\n result[currExtendingType] = idx;\n }\n });\n });\n return result;\n },\n {} as Record<number, number>,\n );\n\n /**\n * @returns {number} - The chosen alternative index\n */\n return function (this: BaseParser): number {\n const nextToken = this.LA(1);\n return choiceToAlt[nextToken.tokenTypeIdx];\n };\n } else {\n // optimized lookahead without needing to check the predicates at all.\n // this causes code duplication which is intentional to improve performance.\n /**\n * @returns {number} - The chosen alternative index\n */\n return function (this: BaseParser): number | undefined {\n for (let t = 0; t < numOfAlts; t++) {\n const currAlt = alts[t];\n const currNumOfPaths = currAlt.length;\n nextPath: for (let j = 0; j < currNumOfPaths; j++) {\n const currPath = currAlt[j];\n const currPathLength = currPath.length;\n for (let i = 0; i < currPathLength; i++) {\n const nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n // this will also work for an empty ALT as the loop will be skipped\n return t;\n }\n // none of the paths for the current alternative matched\n // try the next alternative\n }\n // none of the alternatives could be matched\n return undefined;\n };\n }\n}\n\nexport function buildSingleAlternativeLookaheadFunction(\n alt: LookaheadSequence,\n tokenMatcher: TokenMatcher,\n dynamicTokensEnabled: boolean,\n): () => boolean {\n const areAllOneTokenLookahead = every(alt, (currPath) => {\n return currPath.length === 1;\n });\n\n const numOfPaths = alt.length;\n\n // optimized (common) case of all the lookaheads paths requiring only\n // a single token lookahead.\n if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n const singleTokensTypes = flatten(alt);\n\n if (\n singleTokensTypes.length === 1 &&\n isEmpty((<any>singleTokensTypes[0]).categoryMatches)\n ) {\n const expectedTokenType = singleTokensTypes[0];\n const expectedTokenUniqueKey = (<any>expectedTokenType).tokenTypeIdx;\n\n return function (this: BaseParser): boolean {\n return this.LA(1).tokenTypeIdx === expectedTokenUniqueKey;\n };\n } else {\n const choiceToAlt = reduce(\n singleTokensTypes,\n (result, currTokType, idx) => {\n result[currTokType.tokenTypeIdx!] = true;\n forEach(currTokType.categoryMatches!, (currExtendingType) => {\n result[currExtendingType] = true;\n });\n return result;\n },\n [] as boolean[],\n );\n\n return function (this: BaseParser): boolean {\n const nextToken = this.LA(1);\n return choiceToAlt[nextToken.tokenTypeIdx] === true;\n };\n }\n } else {\n return function (this: BaseParser): boolean {\n nextPath: for (let j = 0; j < numOfPaths; j++) {\n const currPath = alt[j];\n const currPathLength = currPath.length;\n for (let i = 0; i < currPathLength; i++) {\n const nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n return true;\n }\n\n // none of the paths matched\n return false;\n };\n }\n}\n\nclass RestDefinitionFinderWalker extends RestWalker {\n private restDef: IProduction[];\n\n constructor(\n private topProd: Rule,\n private targetOccurrence: number,\n private targetProdType: PROD_TYPE,\n ) {\n super();\n }\n\n startWalking(): IProduction[] {\n this.walk(this.topProd);\n return this.restDef;\n }\n\n private checkIsTarget(\n node: IProductionWithOccurrence,\n expectedProdType: PROD_TYPE,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): boolean {\n if (\n node.idx === this.targetOccurrence &&\n this.targetProdType === expectedProdType\n ) {\n this.restDef = currRest.concat(prevRest);\n return true;\n }\n // performance optimization, do not iterate over the entire Grammar ast after we have found the target\n return false;\n }\n\n walkOption(\n optionProd: Option,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (!this.checkIsTarget(optionProd, PROD_TYPE.OPTION, currRest, prevRest)) {\n super.walkOption(optionProd, currRest, prevRest);\n }\n }\n\n walkAtLeastOne(\n atLeastOneProd: RepetitionMandatory,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (\n !this.checkIsTarget(\n atLeastOneProd,\n PROD_TYPE.REPETITION_MANDATORY,\n currRest,\n prevRest,\n )\n ) {\n super.walkOption(atLeastOneProd, currRest, prevRest);\n }\n }\n\n walkAtLeastOneSep(\n atLeastOneSepProd: RepetitionMandatoryWithSeparator,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (\n !this.checkIsTarget(\n atLeastOneSepProd,\n PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,\n currRest,\n prevRest,\n )\n ) {\n super.walkOption(atLeastOneSepProd, currRest, prevRest);\n }\n }\n\n walkMany(\n manyProd: Repetition,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (\n !this.checkIsTarget(manyProd, PROD_TYPE.REPETITION, currRest, prevRest)\n ) {\n super.walkOption(manyProd, currRest, prevRest);\n }\n }\n\n walkManySep(\n manySepProd: RepetitionWithSeparator,\n currRest: IProduction[],\n prevRest: IProduction[],\n ): void {\n if (\n !this.checkIsTarget(\n manySepProd,\n PROD_TYPE.REPETITION_WITH_SEPARATOR,\n currRest,\n prevRest,\n )\n ) {\n super.walkOption(manySepProd, currRest, prevRest);\n }\n }\n}\n\n/**\n * Returns the definition of a target production in a top level level rule.\n */\nclass InsideDefinitionFinderVisitor extends GAstVisitor {\n public result: IProduction[] = [];\n\n constructor(\n private targetOccurrence: number,\n private targetProdType: PROD_TYPE,\n private targetRef?: any,\n ) {\n super();\n }\n\n private checkIsTarget(\n node: { definition: IProduction[] } & IProductionWithOccurrence,\n expectedProdName: PROD_TYPE,\n ): void {\n if (\n node.idx === this.targetOccurrence &&\n this.targetProdType === expectedProdName &&\n (this.targetRef === undefined || node === this.targetRef)\n ) {\n this.result = node.definition;\n }\n }\n\n public visitOption(node: Option): void {\n this.checkIsTarget(node, PROD_TYPE.OPTION);\n }\n\n public visitRepetition(node: Repetition): void {\n this.checkIsTarget(node, PROD_TYPE.REPETITION);\n }\n\n public visitRepetitionMandatory(node: RepetitionMandatory): void {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY);\n }\n\n public visitRepetitionMandatoryWithSeparator(\n node: RepetitionMandatoryWithSeparator,\n ): void {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR);\n }\n\n public visitRepetitionWithSeparator(node: RepetitionWithSeparator): void {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_WITH_SEPARATOR);\n }\n\n public visitAlternation(node: Alternation): void {\n this.checkIsTarget(node, PROD_TYPE.ALTERNATION);\n }\n}\n\nfunction initializeArrayOfArrays(size: number): any[][] {\n const result = new Array(size);\n for (let i = 0; i < size; i++) {\n result[i] = [];\n }\n return result;\n}\n\n/**\n * A sort of hash function between a Path in the grammar and a string.\n * Note that this returns multiple \"hashes\" to support the scenario of token categories.\n * - A single path with categories may match multiple **actual** paths.\n */\nfunction pathToHashKeys(path: TokenType[]): string[] {\n let keys = [\"\"];\n for (let i = 0; i < path.length; i++) {\n const tokType = path[i];\n const longerKeys = [];\n for (let j = 0; j < keys.length; j++) {\n const currShorterKey = keys[j];\n longerKeys.push(currShorterKey + \"_\" + tokType.tokenTypeIdx);\n for (let t = 0; t < tokType.categoryMatches!.length; t++) {\n const categoriesKeySuffix = \"_\" + tokType.categoryMatches![t];\n longerKeys.push(currShorterKey + categoriesKeySuffix);\n }\n }\n keys = longerKeys;\n }\n return keys;\n}\n\n/**\n * Imperative style due to being called from a hot spot\n */\nfunction isUniquePrefixHash(\n altKnownPathsKeys: Record<string, boolean>[],\n searchPathKeys: string[],\n idx: number,\n): boolean {\n for (\n let currAltIdx = 0;\n currAltIdx < altKnownPathsKeys.length;\n currAltIdx++\n ) {\n // We only want to test vs the other alternatives\n if (currAltIdx === idx) {\n continue;\n }\n const otherAltKnownPathsKeys = altKnownPathsKeys[currAltIdx];\n for (let searchIdx = 0; searchIdx < searchPathKeys.length; searchIdx++) {\n const searchKey = searchPathKeys[searchIdx];\n if (otherAltKnownPathsKeys[searchKey] === true) {\n return false;\n }\n }\n }\n // None of the SearchPathKeys were found in any of the other alternatives\n return true;\n}\n\nexport function lookAheadSequenceFromAlternatives(\n altsDefs: IProduction[],\n k: number,\n): LookaheadSequence[] {\n const partialAlts = map(altsDefs, (currAlt) =>\n possiblePathsFrom([currAlt], 1),\n );\n const finalResult = initializeArrayOfArrays(partialAlts.length);\n const altsHashes = map(partialAlts, (currAltPaths) => {\n const dict: { [key: string]: boolean } = {};\n forEach(currAltPaths, (item) => {\n const keys = pathToHashKeys(item.partialPath);\n forEach(keys, (currKey) => {\n dict[currKey] = true;\n });\n });\n return dict;\n });\n let newData = partialAlts;\n\n // maxLookahead loop\n for (let pathLength = 1; pathLength <= k; pathLength++) {\n const currDataset = newData;\n newData = initializeArrayOfArrays(currDataset.length);\n\n // alternatives loop\n for (let altIdx = 0; altIdx < currDataset.length; altIdx++) {\n const currAltPathsAndSuffixes = currDataset[altIdx];\n // paths in current alternative loop\n for (\n let currPathIdx = 0;\n currPathIdx < currAltPathsAndSuffixes.length;\n currPathIdx++\n ) {\n const currPathPrefix = currAltPathsAndSuffixes[currPathIdx].partialPath;\n const suffixDef = currAltPathsAndSuffixes[currPathIdx].suffixDef;\n const prefixKeys = pathToHashKeys(currPathPrefix);\n const isUnique = isUniquePrefixHash(altsHashes, prefixKeys, altIdx);\n // End of the line for this path.\n if (isUnique || isEmpty(suffixDef) || currPathPrefix.length === k) {\n const currAltResult = finalResult[altIdx];\n // TODO: Can we implement a containsPath using Maps/Dictionaries?\n if (containsPath(currAltResult, currPathPrefix) === false) {\n currAltResult.push(currPathPrefix);\n // Update all new keys for the current path.\n for (let j = 0; j < prefixKeys.length; j++) {\n const currKey = prefixKeys[j];\n altsHashes[altIdx][currKey] = true;\n }\n }\n }\n // Expand longer paths\n else {\n const newPartialPathsAndSuffixes = possiblePathsFrom(\n suffixDef,\n pathLength + 1,\n currPathPrefix,\n );\n newData[altIdx] = newData[altIdx].concat(newPartialPathsAndSuffixes);\n\n // Update keys for new known paths\n forEach(newPartialPathsAndSuffixes, (item) => {\n const prefixKeys = pathToHashKeys(item.partialPath);\n forEach(prefixKeys, (key) => {\n altsHashes[altIdx][key] = true;\n });\n });\n }\n }\n }\n }\n\n return finalResult;\n}\n\nexport function getLookaheadPathsForOr(\n occurrence: number,\n ruleGrammar: Rule,\n k: number,\n orProd?: Alternation,\n): LookaheadSequence[] {\n const visitor = new InsideDefinitionFinderVisitor(\n occurrence,\n PROD_TYPE.ALTERNATION,\n orProd,\n );\n ruleGrammar.accept(visitor);\n return lookAheadSequenceFromAlternatives(visitor.result, k);\n}\n\nexport function getLookaheadPathsForOptionalProd(\n occurrence: number,\n ruleGrammar: Rule,\n prodType: PROD_TYPE,\n k: number,\n): LookaheadSequence[] {\n const insideDefVisitor = new InsideDefinitionFinderVisitor(\n occurrence,\n prodType,\n );\n ruleGrammar.accept(insideDefVisitor);\n const insideDef = insideDefVisitor.result;\n\n const afterDefWalker = new RestDefinitionFinderWalker(\n ruleGrammar,\n occurrence,\n prodType,\n );\n const afterDef = afterDefWalker.startWalking();\n\n const insideFlat = new AlternativeGAST({ definition: insideDef });\n const afterFlat = new AlternativeGAST({ definition: afterDef });\n\n return lookAheadSequenceFromAlternatives([insideFlat, afterFlat], k);\n}\n\nexport function containsPath(\n alternative: Alternative,\n searchPath: TokenType[],\n): boolean {\n compareOtherPath: for (let i = 0; i < alternative.length; i++) {\n const otherPath = alternative[i];\n if (otherPath.length !== searchPath.length) {\n continue;\n }\n for (let j = 0; j < otherPath.length; j++) {\n const searchTok = searchPath[j];\n const otherTok = otherPath[j];\n\n const matchingTokens =\n searchTok === otherTok ||\n otherTok.categoryMatchesMap![searchTok.tokenTypeIdx!] !== undefined;\n if (matchingTokens === false) {\n continue compareOtherPath;\n }\n }\n return true;\n }\n\n return false;\n}\n\nexport function isStrictPrefixOfPath(\n prefix: TokenType[],\n other: TokenType[],\n): boolean {\n return (\n prefix.length < other.length &&\n every(prefix, (tokType, idx) => {\n const otherTokType = other[idx];\n return (\n tokType === otherTokType ||\n otherTokType.categoryMatchesMap![tokType.tokenTypeIdx!]\n );\n })\n );\n}\n\nexport function areTokenCategoriesNotUsed(\n lookAheadPaths: LookaheadSequence[],\n): boolean {\n return every(lookAheadPaths, (singleAltPaths) =>\n every(singleAltPaths, (singlePath) =>\n every(singlePath, (token) => isEmpty(token.categoryMatches!)),\n ),\n );\n}\n", "import {\n clone,\n compact,\n difference,\n drop,\n dropRight,\n filter,\n first,\n flatMap,\n flatten,\n forEach,\n groupBy,\n includes,\n isEmpty,\n map,\n pickBy,\n reduce,\n reject,\n values,\n} from \"lodash-es\";\nimport {\n IParserAmbiguousAlternativesDefinitionError,\n IParserDuplicatesDefinitionError,\n IParserEmptyAlternativeDefinitionError,\n ParserDefinitionErrorType,\n} from \"../parser/parser.js\";\nimport {\n Alternation,\n Alternative as AlternativeGAST,\n GAstVisitor,\n getProductionDslName,\n isOptionalProd,\n NonTerminal,\n Option,\n Repetition,\n RepetitionMandatory,\n RepetitionMandatoryWithSeparator,\n RepetitionWithSeparator,\n Terminal,\n} from \"@chevrotain/gast\";\nimport {\n Alternative,\n containsPath,\n getLookaheadPathsForOptionalProd,\n getLookaheadPathsForOr,\n getProdType,\n isStrictPrefixOfPath,\n} from \"./lookahead.js\";\nimport { nextPossibleTokensAfter } from \"./interpreter.js\";\nimport {\n ILookaheadStrategy,\n IProduction,\n IProductionWithOccurrence,\n Rule,\n TokenType,\n} from \"@chevrotain/types\";\nimport {\n IGrammarValidatorErrorMessageProvider,\n IParserDefinitionError,\n} from \"./types.js\";\nimport { tokenStructuredMatcher } from \"../../scan/tokens.js\";\n\nexport function validateLookahead(options: {\n lookaheadStrategy: ILookaheadStrategy;\n rules: Rule[];\n tokenTypes: TokenType[];\n grammarName: string;\n}): IParserDefinitionError[] {\n const lookaheadValidationErrorMessages = options.lookaheadStrategy.validate({\n rules: options.rules,\n tokenTypes: options.tokenTypes,\n grammarName: options.grammarName,\n });\n return map(lookaheadValidationErrorMessages, (errorMessage) => ({\n type: ParserDefinitionErrorType.CUSTOM_LOOKAHEAD_VALIDATION,\n ...errorMessage,\n }));\n}\n\nexport function validateGrammar(\n topLevels: Rule[],\n tokenTypes: TokenType[],\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n grammarName: string,\n): IParserDefinitionError[] {\n const duplicateErrors: IParserDefinitionError[] = flatMap(\n topLevels,\n (currTopLevel) =>\n validateDuplicateProductions(currTopLevel, errMsgProvider),\n );\n\n const termsNamespaceConflictErrors = checkTerminalAndNoneTerminalsNameSpace(\n topLevels,\n tokenTypes,\n errMsgProvider,\n );\n\n const tooManyAltsErrors = flatMap(topLevels, (curRule) =>\n validateTooManyAlts(curRule, errMsgProvider),\n );\n\n const duplicateRulesError = flatMap(topLevels, (curRule) =>\n validateRuleDoesNotAlreadyExist(\n curRule,\n topLevels,\n grammarName,\n errMsgProvider,\n ),\n );\n\n return duplicateErrors.concat(\n termsNamespaceConflictErrors,\n tooManyAltsErrors,\n duplicateRulesError,\n );\n}\n\nfunction validateDuplicateProductions(\n topLevelRule: Rule,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserDuplicatesDefinitionError[] {\n const collectorVisitor = new OccurrenceValidationCollector();\n topLevelRule.accept(collectorVisitor);\n const allRuleProductions = collectorVisitor.allProductions;\n\n const productionGroups = groupBy(\n allRuleProductions,\n identifyProductionForDuplicates,\n );\n\n const duplicates: any = pickBy(productionGroups, (currGroup) => {\n return currGroup.length > 1;\n });\n\n const errors = map(values(duplicates), (currDuplicates: any) => {\n const firstProd: any = first(currDuplicates);\n const msg = errMsgProvider.buildDuplicateFoundError(\n topLevelRule,\n currDuplicates,\n );\n const dslName = getProductionDslName(firstProd);\n const defError: IParserDuplicatesDefinitionError = {\n message: msg,\n type: ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,\n ruleName: topLevelRule.name,\n dslName: dslName,\n occurrence: firstProd.idx,\n };\n\n const param = getExtraProductionArgument(firstProd);\n if (param) {\n defError.parameter = param;\n }\n\n return defError;\n });\n return errors;\n}\n\nexport function identifyProductionForDuplicates(\n prod: IProductionWithOccurrence,\n): string {\n return `${getProductionDslName(prod)}_#_${\n prod.idx\n }_#_${getExtraProductionArgument(prod)}`;\n}\n\nfunction getExtraProductionArgument(prod: IProductionWithOccurrence): string {\n if (prod instanceof Terminal) {\n return prod.terminalType.name;\n } else if (prod instanceof NonTerminal) {\n return prod.nonTerminalName;\n } else {\n return \"\";\n }\n}\n\nexport class OccurrenceValidationCollector extends GAstVisitor {\n public allProductions: IProductionWithOccurrence[] = [];\n\n public visitNonTerminal(subrule: NonTerminal): void {\n this.allProductions.push(subrule);\n }\n\n public visitOption(option: Option): void {\n this.allProductions.push(option);\n }\n\n public visitRepetitionWithSeparator(manySep: RepetitionWithSeparator): void {\n this.allProductions.push(manySep);\n }\n\n public visitRepetitionMandatory(atLeastOne: RepetitionMandatory): void {\n this.allProductions.push(atLeastOne);\n }\n\n public visitRepetitionMandatoryWithSeparator(\n atLeastOneSep: RepetitionMandatoryWithSeparator,\n ): void {\n this.allProductions.push(atLeastOneSep);\n }\n\n public visitRepetition(many: Repetition): void {\n this.allProductions.push(many);\n }\n\n public visitAlternation(or: Alternation): void {\n this.allProductions.push(or);\n }\n\n public visitTerminal(terminal: Terminal): void {\n this.allProductions.push(terminal);\n }\n}\n\nexport function validateRuleDoesNotAlreadyExist(\n rule: Rule,\n allRules: Rule[],\n className: string,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserDefinitionError[] {\n const errors = [];\n const occurrences = reduce(\n allRules,\n (result, curRule) => {\n if (curRule.name === rule.name) {\n return result + 1;\n }\n return result;\n },\n 0,\n );\n if (occurrences > 1) {\n const errMsg = errMsgProvider.buildDuplicateRuleNameError({\n topLevelRule: rule,\n grammarName: className,\n });\n errors.push({\n message: errMsg,\n type: ParserDefinitionErrorType.DUPLICATE_RULE_NAME,\n ruleName: rule.name,\n });\n }\n\n return errors;\n}\n\n// TODO: is there anyway to get only the rule names of rules inherited from the super grammars?\n// This is not part of the IGrammarErrorProvider because the validation cannot be performed on\n// The grammar structure, only at runtime.\nexport function validateRuleIsOverridden(\n ruleName: string,\n definedRulesNames: string[],\n className: string,\n): IParserDefinitionError[] {\n const errors = [];\n let errMsg;\n\n if (!includes(definedRulesNames, ruleName)) {\n errMsg =\n `Invalid rule override, rule: ->${ruleName}<- cannot be overridden in the grammar: ->${className}<-` +\n `as it is not defined in any of the super grammars `;\n errors.push({\n message: errMsg,\n type: ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,\n ruleName: ruleName,\n });\n }\n\n return errors;\n}\n\nexport function validateNoLeftRecursion(\n topRule: Rule,\n currRule: Rule,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n path: Rule[] = [],\n): IParserDefinitionError[] {\n const errors: IParserDefinitionError[] = [];\n const nextNonTerminals = getFirstNoneTerminal(currRule.definition);\n if (isEmpty(nextNonTerminals)) {\n return [];\n } else {\n const ruleName = topRule.name;\n const foundLeftRecursion = includes(nextNonTerminals, topRule);\n if (foundLeftRecursion) {\n errors.push({\n message: errMsgProvider.buildLeftRecursionError({\n topLevelRule: topRule,\n leftRecursionPath: path,\n }),\n type: ParserDefinitionErrorType.LEFT_RECURSION,\n ruleName: ruleName,\n });\n }\n\n // we are only looking for cyclic paths leading back to the specific topRule\n // other cyclic paths are ignored, we still need this difference to avoid infinite loops...\n const validNextSteps = difference(nextNonTerminals, path.concat([topRule]));\n const errorsFromNextSteps = flatMap(validNextSteps, (currRefRule) => {\n const newPath = clone(path);\n newPath.push(currRefRule);\n return validateNoLeftRecursion(\n topRule,\n currRefRule,\n errMsgProvider,\n newPath,\n );\n });\n\n return errors.concat(errorsFromNextSteps);\n }\n}\n\nexport function getFirstNoneTerminal(definition: IProduction[]): Rule[] {\n let result: Rule[] = [];\n if (isEmpty(definition)) {\n return result;\n }\n const firstProd = first(definition);\n\n /* istanbul ignore else */\n if (firstProd instanceof NonTerminal) {\n result.push(firstProd.referencedRule);\n } else if (\n firstProd instanceof AlternativeGAST ||\n firstProd instanceof Option ||\n firstProd instanceof RepetitionMandatory ||\n firstProd instanceof RepetitionMandatoryWithSeparator ||\n firstProd instanceof RepetitionWithSeparator ||\n firstProd instanceof Repetition\n ) {\n result = result.concat(\n getFirstNoneTerminal(<IProduction[]>firstProd.definition),\n );\n } else if (firstProd instanceof Alternation) {\n // each sub definition in alternation is a FLAT\n result = flatten(\n map(firstProd.definition, (currSubDef) =>\n getFirstNoneTerminal((<AlternativeGAST>currSubDef).definition),\n ),\n );\n } else if (firstProd instanceof Terminal) {\n // nothing to see, move along\n } else {\n throw Error(\"non exhaustive match\");\n }\n\n const isFirstOptional = isOptionalProd(firstProd);\n const hasMore = definition.length > 1;\n if (isFirstOptional && hasMore) {\n const rest = drop(definition);\n return result.concat(getFirstNoneTerminal(rest));\n } else {\n return result;\n }\n}\n\nclass OrCollector extends GAstVisitor {\n public alternations: Alternation[] = [];\n\n public visitAlternation(node: Alternation): void {\n this.alternations.push(node);\n }\n}\n\nexport function validateEmptyOrAlternative(\n topLevelRule: Rule,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserEmptyAlternativeDefinitionError[] {\n const orCollector = new OrCollector();\n topLevelRule.accept(orCollector);\n const ors = orCollector.alternations;\n\n const errors = flatMap<Alternation, IParserEmptyAlternativeDefinitionError>(\n ors,\n (currOr) => {\n const exceptLast = dropRight(currOr.definition);\n return flatMap(exceptLast, (currAlternative, currAltIdx) => {\n const possibleFirstInAlt = nextPossibleTokensAfter(\n [currAlternative],\n [],\n tokenStructuredMatcher,\n 1,\n );\n if (isEmpty(possibleFirstInAlt)) {\n return [\n {\n message: errMsgProvider.buildEmptyAlternationError({\n topLevelRule: topLevelRule,\n alternation: currOr,\n emptyChoiceIdx: currAltIdx,\n }),\n type: ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,\n ruleName: topLevelRule.name,\n occurrence: currOr.idx,\n alternative: currAltIdx + 1,\n },\n ];\n } else {\n return [];\n }\n });\n },\n );\n\n return errors;\n}\n\nexport function validateAmbiguousAlternationAlternatives(\n topLevelRule: Rule,\n globalMaxLookahead: number,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserAmbiguousAlternativesDefinitionError[] {\n const orCollector = new OrCollector();\n topLevelRule.accept(orCollector);\n let ors = orCollector.alternations;\n\n // New Handling of ignoring ambiguities\n // - https://github.com/chevrotain/chevrotain/issues/869\n ors = reject(ors, (currOr) => currOr.ignoreAmbiguities === true);\n\n const errors = flatMap(ors, (currOr: Alternation) => {\n const currOccurrence = currOr.idx;\n const actualMaxLookahead = currOr.maxLookahead || globalMaxLookahead;\n const alternatives = getLookaheadPathsForOr(\n currOccurrence,\n topLevelRule,\n actualMaxLookahead,\n currOr,\n );\n const altsAmbiguityErrors = checkAlternativesAmbiguities(\n alternatives,\n currOr,\n topLevelRule,\n errMsgProvider,\n );\n const altsPrefixAmbiguityErrors = checkPrefixAlternativesAmbiguities(\n alternatives,\n currOr,\n topLevelRule,\n errMsgProvider,\n );\n\n return altsAmbiguityErrors.concat(altsPrefixAmbiguityErrors);\n });\n\n return errors;\n}\n\nexport class RepetitionCollector extends GAstVisitor {\n public allProductions: (IProductionWithOccurrence & {\n maxLookahead?: number;\n })[] = [];\n\n public visitRepetitionWithSeparator(manySep: RepetitionWithSeparator): void {\n this.allProductions.push(manySep);\n }\n\n public visitRepetitionMandatory(atLeastOne: RepetitionMandatory): void {\n this.allProductions.push(atLeastOne);\n }\n\n public visitRepetitionMandatoryWithSeparator(\n atLeastOneSep: RepetitionMandatoryWithSeparator,\n ): void {\n this.allProductions.push(atLeastOneSep);\n }\n\n public visitRepetition(many: Repetition): void {\n this.allProductions.push(many);\n }\n}\n\nexport function validateTooManyAlts(\n topLevelRule: Rule,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserDefinitionError[] {\n const orCollector = new OrCollector();\n topLevelRule.accept(orCollector);\n const ors = orCollector.alternations;\n\n const errors = flatMap(ors, (currOr) => {\n if (currOr.definition.length > 255) {\n return [\n {\n message: errMsgProvider.buildTooManyAlternativesError({\n topLevelRule: topLevelRule,\n alternation: currOr,\n }),\n type: ParserDefinitionErrorType.TOO_MANY_ALTS,\n ruleName: topLevelRule.name,\n occurrence: currOr.idx,\n },\n ];\n } else {\n return [];\n }\n });\n\n return errors;\n}\n\nexport function validateSomeNonEmptyLookaheadPath(\n topLevelRules: Rule[],\n maxLookahead: number,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserDefinitionError[] {\n const errors: IParserDefinitionError[] = [];\n forEach(topLevelRules, (currTopRule) => {\n const collectorVisitor = new RepetitionCollector();\n currTopRule.accept(collectorVisitor);\n const allRuleProductions = collectorVisitor.allProductions;\n forEach(allRuleProductions, (currProd) => {\n const prodType = getProdType(currProd);\n const actualMaxLookahead = currProd.maxLookahead || maxLookahead;\n const currOccurrence = currProd.idx;\n const paths = getLookaheadPathsForOptionalProd(\n currOccurrence,\n currTopRule,\n prodType,\n actualMaxLookahead,\n );\n const pathsInsideProduction = paths[0];\n if (isEmpty(flatten(pathsInsideProduction))) {\n const errMsg = errMsgProvider.buildEmptyRepetitionError({\n topLevelRule: currTopRule,\n repetition: currProd,\n });\n errors.push({\n message: errMsg,\n type: ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,\n ruleName: currTopRule.name,\n });\n }\n });\n });\n\n return errors;\n}\n\nexport interface IAmbiguityDescriptor {\n alts: number[];\n path: TokenType[];\n}\n\nfunction checkAlternativesAmbiguities(\n alternatives: Alternative[],\n alternation: Alternation,\n rule: Rule,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserAmbiguousAlternativesDefinitionError[] {\n const foundAmbiguousPaths: Alternative = [];\n const identicalAmbiguities = reduce(\n alternatives,\n (result, currAlt, currAltIdx) => {\n // ignore (skip) ambiguities with this alternative\n if (alternation.definition[currAltIdx].ignoreAmbiguities === true) {\n return result;\n }\n\n forEach(currAlt, (currPath) => {\n const altsCurrPathAppearsIn = [currAltIdx];\n forEach(alternatives, (currOtherAlt, currOtherAltIdx) => {\n if (\n currAltIdx !== currOtherAltIdx &&\n containsPath(currOtherAlt, currPath) &&\n // ignore (skip) ambiguities with this \"other\" alternative\n alternation.definition[currOtherAltIdx].ignoreAmbiguities !== true\n ) {\n altsCurrPathAppearsIn.push(currOtherAltIdx);\n }\n });\n\n if (\n altsCurrPathAppearsIn.length > 1 &&\n !containsPath(foundAmbiguousPaths, currPath)\n ) {\n foundAmbiguousPaths.push(currPath);\n result.push({\n alts: altsCurrPathAppearsIn,\n path: currPath,\n });\n }\n });\n return result;\n },\n [] as { alts: number[]; path: TokenType[] }[],\n );\n\n const currErrors = map(identicalAmbiguities, (currAmbDescriptor) => {\n const ambgIndices = map(\n currAmbDescriptor.alts,\n (currAltIdx) => currAltIdx + 1,\n );\n\n const currMessage = errMsgProvider.buildAlternationAmbiguityError({\n topLevelRule: rule,\n alternation: alternation,\n ambiguityIndices: ambgIndices,\n prefixPath: currAmbDescriptor.path,\n });\n\n return {\n message: currMessage,\n type: ParserDefinitionErrorType.AMBIGUOUS_ALTS,\n ruleName: rule.name,\n occurrence: alternation.idx,\n alternatives: currAmbDescriptor.alts,\n };\n });\n\n return currErrors;\n}\n\nexport function checkPrefixAlternativesAmbiguities(\n alternatives: Alternative[],\n alternation: Alternation,\n rule: Rule,\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserAmbiguousAlternativesDefinitionError[] {\n // flatten\n const pathsAndIndices = reduce(\n alternatives,\n (result, currAlt, idx) => {\n const currPathsAndIdx = map(currAlt, (currPath) => {\n return { idx: idx, path: currPath };\n });\n return result.concat(currPathsAndIdx);\n },\n [] as { idx: number; path: TokenType[] }[],\n );\n\n const errors = compact(\n flatMap(pathsAndIndices, (currPathAndIdx) => {\n const alternativeGast = alternation.definition[currPathAndIdx.idx];\n // ignore (skip) ambiguities with this alternative\n if (alternativeGast.ignoreAmbiguities === true) {\n return [];\n }\n const targetIdx = currPathAndIdx.idx;\n const targetPath = currPathAndIdx.path;\n\n const prefixAmbiguitiesPathsAndIndices = filter(\n pathsAndIndices,\n (searchPathAndIdx) => {\n // prefix ambiguity can only be created from lower idx (higher priority) path\n return (\n // ignore (skip) ambiguities with this \"other\" alternative\n alternation.definition[searchPathAndIdx.idx].ignoreAmbiguities !==\n true &&\n searchPathAndIdx.idx < targetIdx &&\n // checking for strict prefix because identical lookaheads\n // will be be detected using a different validation.\n isStrictPrefixOfPath(searchPathAndIdx.path, targetPath)\n );\n },\n );\n\n const currPathPrefixErrors = map(\n prefixAmbiguitiesPathsAndIndices,\n (currAmbPathAndIdx): IParserAmbiguousAlternativesDefinitionError => {\n const ambgIndices = [currAmbPathAndIdx.idx + 1, targetIdx + 1];\n const occurrence = alternation.idx === 0 ? \"\" : alternation.idx;\n\n const message = errMsgProvider.buildAlternationPrefixAmbiguityError({\n topLevelRule: rule,\n alternation: alternation,\n ambiguityIndices: ambgIndices,\n prefixPath: currAmbPathAndIdx.path,\n });\n return {\n message: message,\n type: ParserDefinitionErrorType.AMBIGUOUS_PREFIX_ALTS,\n ruleName: rule.name,\n occurrence: occurrence,\n alternatives: ambgIndices,\n };\n },\n );\n\n return currPathPrefixErrors;\n }),\n );\n\n return errors;\n}\n\nfunction checkTerminalAndNoneTerminalsNameSpace(\n topLevels: Rule[],\n tokenTypes: TokenType[],\n errMsgProvider: IGrammarValidatorErrorMessageProvider,\n): IParserDefinitionError[] {\n const errors: IParserDefinitionError[] = [];\n\n const tokenNames = map(tokenTypes, (currToken) => currToken.name);\n\n forEach(topLevels, (currRule) => {\n const currRuleName = currRule.name;\n if (includes(tokenNames, currRuleName)) {\n const errMsg = errMsgProvider.buildNamespaceConflictError(currRule);\n\n errors.push({\n message: errMsg,\n type: ParserDefinitionErrorType.CONFLICT_TOKENS_RULES_NAMESPACE,\n ruleName: currRuleName,\n });\n }\n });\n\n return errors;\n}\n", "import { Rule } from \"@chevrotain/gast\";\nimport { defaults, forEach } from \"lodash-es\";\nimport { resolveGrammar as orgResolveGrammar } from \"../resolver.js\";\nimport { validateGrammar as orgValidateGrammar } from \"../checks.js\";\nimport {\n defaultGrammarResolverErrorProvider,\n defaultGrammarValidatorErrorProvider,\n} from \"../../errors_public.js\";\nimport { TokenType } from \"@chevrotain/types\";\nimport {\n IGrammarResolverErrorMessageProvider,\n IGrammarValidatorErrorMessageProvider,\n IParserDefinitionError,\n} from \"../types.js\";\n\ntype ResolveGrammarOpts = {\n rules: Rule[];\n errMsgProvider?: IGrammarResolverErrorMessageProvider;\n};\nexport function resolveGrammar(\n options: ResolveGrammarOpts,\n): IParserDefinitionError[] {\n const actualOptions: Required<ResolveGrammarOpts> = defaults(options, {\n errMsgProvider: defaultGrammarResolverErrorProvider,\n });\n\n const topRulesTable: { [ruleName: string]: Rule } = {};\n forEach(options.rules, (rule) => {\n topRulesTable[rule.name] = rule;\n });\n return orgResolveGrammar(topRulesTable, actualOptions.errMsgProvider);\n}\n\nexport function validateGrammar(options: {\n rules: Rule[];\n tokenTypes: TokenType[];\n grammarName: string;\n errMsgProvider: IGrammarValidatorErrorMessageProvider;\n}): IParserDefinitionError[] {\n options = defaults(options, {\n errMsgProvider: defaultGrammarValidatorErrorProvider,\n });\n\n return orgValidateGrammar(\n options.rules,\n options.tokenTypes,\n options.errMsgProvider,\n options.grammarName,\n );\n}\n", "import { includes } from \"lodash-es\";\nimport {\n IRecognitionException,\n IRecognizerContext,\n IToken,\n} from \"@chevrotain/types\";\n\nconst MISMATCHED_TOKEN_EXCEPTION = \"MismatchedTokenException\";\nconst NO_VIABLE_ALT_EXCEPTION = \"NoViableAltException\";\nconst EARLY_EXIT_EXCEPTION = \"EarlyExitException\";\nconst NOT_ALL_INPUT_PARSED_EXCEPTION = \"NotAllInputParsedException\";\n\nconst RECOGNITION_EXCEPTION_NAMES = [\n MISMATCHED_TOKEN_EXCEPTION,\n NO_VIABLE_ALT_EXCEPTION,\n EARLY_EXIT_EXCEPTION,\n NOT_ALL_INPUT_PARSED_EXCEPTION,\n];\n\nObject.freeze(RECOGNITION_EXCEPTION_NAMES);\n\n// hacks to bypass no support for custom Errors in javascript/typescript\nexport function isRecognitionException(error: Error) {\n // can't do instanceof on hacked custom js exceptions\n return includes(RECOGNITION_EXCEPTION_NAMES, error.name);\n}\n\nabstract class RecognitionException\n extends Error\n implements IRecognitionException\n{\n context: IRecognizerContext;\n resyncedTokens: IToken[] = [];\n\n protected constructor(\n message: string,\n public token: IToken,\n ) {\n super(message);\n\n // fix prototype chain when typescript target is ES5\n Object.setPrototypeOf(this, new.target.prototype);\n\n /* istanbul ignore next - V8 workaround to remove constructor from stacktrace when typescript target is ES5 */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nexport class MismatchedTokenException extends RecognitionException {\n constructor(\n message: string,\n token: IToken,\n public previousToken: IToken,\n ) {\n super(message, token);\n this.name = MISMATCHED_TOKEN_EXCEPTION;\n }\n}\n\nexport class NoViableAltException extends RecognitionException {\n constructor(\n message: string,\n token: IToken,\n public previousToken: IToken,\n ) {\n super(message, token);\n this.name = NO_VIABLE_ALT_EXCEPTION;\n }\n}\n\nexport class NotAllInputParsedException extends RecognitionException {\n constructor(message: string, token: IToken) {\n super(message, token);\n this.name = NOT_ALL_INPUT_PARSED_EXCEPTION;\n }\n}\n\nexport class EarlyExitException extends RecognitionException {\n constructor(\n message: string,\n token: IToken,\n public previousToken: IToken,\n ) {\n super(message, token);\n this.name = EARLY_EXIT_EXCEPTION;\n }\n}\n", "import {\n createTokenInstance,\n EOF,\n tokenMatcher,\n} from \"../../../scan/tokens_public.js\";\nimport {\n AbstractNextTerminalAfterProductionWalker,\n IFirstAfterRepetition,\n} from \"../../grammar/interpreter.js\";\nimport {\n clone,\n dropRight,\n find,\n flatten,\n has,\n includes,\n isEmpty,\n map,\n} from \"lodash-es\";\nimport {\n IParserConfig,\n IToken,\n ITokenGrammarPath,\n TokenType,\n} from \"@chevrotain/types\";\nimport { MismatchedTokenException } from \"../../exceptions_public.js\";\nimport { IN } from \"../../constants.js\";\nimport { MixedInParser } from \"./parser_traits.js\";\nimport { DEFAULT_PARSER_CONFIG } from \"../parser.js\";\n\nexport const EOF_FOLLOW_KEY: any = {};\n\nexport interface IFollowKey {\n ruleName: string;\n idxInCallingRule: number;\n inRule: string;\n}\n\nexport const IN_RULE_RECOVERY_EXCEPTION = \"InRuleRecoveryException\";\n\nexport class InRuleRecoveryException extends Error {\n constructor(message: string) {\n super(message);\n this.name = IN_RULE_RECOVERY_EXCEPTION;\n }\n}\n\n/**\n * This trait is responsible for the error recovery and fault tolerant logic\n */\nexport class Recoverable {\n recoveryEnabled: boolean;\n firstAfterRepMap: Record<string, IFirstAfterRepetition>;\n resyncFollows: Record<string, TokenType[]>;\n\n initRecoverable(config: IParserConfig) {\n this.firstAfterRepMap = {};\n this.resyncFollows = {};\n\n this.recoveryEnabled = has(config, \"recoveryEnabled\")\n ? (config.recoveryEnabled as boolean) // assumes end user provides the correct config value/type\n : DEFAULT_PARSER_CONFIG.recoveryEnabled;\n\n // performance optimization, NOOP will be inlined which\n // effectively means that this optional feature does not exist\n // when not used.\n if (this.recoveryEnabled) {\n this.attemptInRepetitionRecovery = attemptInRepetitionRecovery;\n }\n }\n\n public getTokenToInsert(tokType: TokenType): IToken {\n const tokToInsert = createTokenInstance(\n tokType,\n \"\",\n NaN,\n NaN,\n NaN,\n NaN,\n NaN,\n NaN,\n );\n tokToInsert.isInsertedInRecovery = true;\n return tokToInsert;\n }\n\n public canTokenTypeBeInsertedInRecovery(tokType: TokenType): boolean {\n return true;\n }\n\n public canTokenTypeBeDeletedInRecovery(tokType: TokenType): boolean {\n return true;\n }\n\n tryInRepetitionRecovery(\n this: MixedInParser,\n grammarRule: Function,\n grammarRuleArgs: any[],\n lookAheadFunc: () => boolean,\n expectedTokType: TokenType,\n ): void {\n // TODO: can the resyncTokenType be cached?\n const reSyncTokType = this.findReSyncTokenType();\n const savedLexerState = this.exportLexerState();\n const resyncedTokens: IToken[] = [];\n let passedResyncPoint = false;\n\n const nextTokenWithoutResync = this.LA(1);\n let currToken = this.LA(1);\n\n const generateErrorMessage = () => {\n const previousToken = this.LA(0);\n // we are preemptively re-syncing before an error has been detected, therefor we must reproduce\n // the error that would have been thrown\n const msg = this.errorMessageProvider.buildMismatchTokenMessage({\n expected: expectedTokType,\n actual: nextTokenWithoutResync,\n previous: previousToken,\n ruleName: this.getCurrRuleFullName(),\n });\n const error = new MismatchedTokenException(\n msg,\n nextTokenWithoutResync,\n this.LA(0),\n );\n // the first token here will be the original cause of the error, this is not part of the resyncedTokens property.\n error.resyncedTokens = dropRight(resyncedTokens);\n this.SAVE_ERROR(error);\n };\n\n while (!passedResyncPoint) {\n // re-synced to a point where we can safely exit the repetition/\n if (this.tokenMatcher(currToken, expectedTokType)) {\n generateErrorMessage();\n return; // must return here to avoid reverting the inputIdx\n } else if (lookAheadFunc.call(this)) {\n // we skipped enough tokens so we can resync right back into another iteration of the repetition grammar rule\n generateErrorMessage();\n // recursive invocation in other to support multiple re-syncs in the same top level repetition grammar rule\n grammarRule.apply(this, grammarRuleArgs);\n return; // must return here to avoid reverting the inputIdx\n } else if (this.tokenMatcher(currToken, reSyncTokType)) {\n passedResyncPoint = true;\n } else {\n currToken = this.SKIP_TOKEN();\n this.addToResyncTokens(currToken, resyncedTokens);\n }\n }\n\n // we were unable to find a CLOSER point to resync inside the Repetition, reset the state.\n // The parsing exception we were trying to prevent will happen in the NEXT parsing step. it may be handled by\n // \"between rules\" resync recovery later in the flow.\n this.importLexerState(savedLexerState);\n }\n\n shouldInRepetitionRecoveryBeTried(\n this: MixedInParser,\n expectTokAfterLastMatch: TokenType,\n nextTokIdx: number,\n notStuck: boolean | undefined,\n ): boolean {\n // Edge case of arriving from a MANY repetition which is stuck\n // Attempting recovery in this case could cause an infinite loop\n if (notStuck === false) {\n return false;\n }\n\n // no need to recover, next token is what we expect...\n if (this.tokenMatcher(this.LA(1), expectTokAfterLastMatch)) {\n return false;\n }\n\n // error recovery is disabled during backtracking as it can make the parser ignore a valid grammar path\n // and prefer some backtracking path that includes recovered errors.\n if (this.isBackTracking()) {\n return false;\n }\n\n // if we can perform inRule recovery (single token insertion or deletion) we always prefer that recovery algorithm\n // because if it works, it makes the least amount of changes to the input stream (greedy algorithm)\n //noinspection RedundantIfStatementJS\n if (\n this.canPerformInRuleRecovery(\n expectTokAfterLastMatch,\n this.getFollowsForInRuleRecovery(expectTokAfterLastMatch, nextTokIdx),\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n // Error Recovery functionality\n getFollowsForInRuleRecovery(\n this: MixedInParser,\n tokType: TokenType,\n tokIdxInRule: number,\n ): TokenType[] {\n const grammarPath = this.getCurrentGrammarPath(tokType, tokIdxInRule);\n const follows = this.getNextPossibleTokenTypes(grammarPath);\n return follows;\n }\n\n tryInRuleRecovery(\n this: MixedInParser,\n expectedTokType: TokenType,\n follows: TokenType[],\n ): IToken {\n if (this.canRecoverWithSingleTokenInsertion(expectedTokType, follows)) {\n const tokToInsert = this.getTokenToInsert(expectedTokType);\n return tokToInsert;\n }\n\n if (this.canRecoverWithSingleTokenDeletion(expectedTokType)) {\n const nextTok = this.SKIP_TOKEN();\n this.consumeToken();\n return nextTok;\n }\n\n throw new InRuleRecoveryException(\"sad sad panda\");\n }\n\n canPerformInRuleRecovery(\n this: MixedInParser,\n expectedToken: TokenType,\n follows: TokenType[],\n ): boolean {\n return (\n this.canRecoverWithSingleTokenInsertion(expectedToken, follows) ||\n this.canRecoverWithSingleTokenDeletion(expectedToken)\n );\n }\n\n canRecoverWithSingleTokenInsertion(\n this: MixedInParser,\n expectedTokType: TokenType,\n follows: TokenType[],\n ): boolean {\n if (!this.canTokenTypeBeInsertedInRecovery(expectedTokType)) {\n return false;\n }\n\n // must know the possible following tokens to perform single token insertion\n if (isEmpty(follows)) {\n return false;\n }\n\n const mismatchedTok = this.LA(1);\n const isMisMatchedTokInFollows =\n find(follows, (possibleFollowsTokType: TokenType) => {\n return this.tokenMatcher(mismatchedTok, possibleFollowsTokType);\n }) !== undefined;\n\n return isMisMatchedTokInFollows;\n }\n\n canRecoverWithSingleTokenDeletion(\n this: MixedInParser,\n expectedTokType: TokenType,\n ): boolean {\n if (!this.canTokenTypeBeDeletedInRecovery(expectedTokType)) {\n return false;\n }\n\n const isNextTokenWhatIsExpected = this.tokenMatcher(\n this.LA(2),\n expectedTokType,\n );\n return isNextTokenWhatIsExpected;\n }\n\n isInCurrentRuleReSyncSet(\n this: MixedInParser,\n tokenTypeIdx: TokenType,\n ): boolean {\n const followKey = this.getCurrFollowKey();\n const currentRuleReSyncSet = this.getFollowSetFromFollowKey(followKey);\n return includes(currentRuleReSyncSet, tokenTypeIdx);\n }\n\n findReSyncTokenType(this: MixedInParser): TokenType {\n const allPossibleReSyncTokTypes = this.flattenFollowSet();\n // this loop will always terminate as EOF is always in the follow stack and also always (virtually) in the input\n let nextToken = this.LA(1);\n let k = 2;\n while (true) {\n const foundMatch = find(allPossibleReSyncTokTypes, (resyncTokType) => {\n const canMatch = tokenMatcher(nextToken, resyncTokType);\n return canMatch;\n });\n if (foundMatch !== undefined) {\n return foundMatch;\n }\n nextToken = this.LA(k);\n k++;\n }\n }\n\n getCurrFollowKey(this: MixedInParser): IFollowKey {\n // the length is at least one as we always add the ruleName to the stack before invoking the rule.\n if (this.RULE_STACK.length === 1) {\n return EOF_FOLLOW_KEY;\n }\n const currRuleShortName = this.getLastExplicitRuleShortName();\n const currRuleIdx = this.getLastExplicitRuleOccurrenceIndex();\n const prevRuleShortName = this.getPreviousExplicitRuleShortName();\n\n return {\n ruleName: this.shortRuleNameToFullName(currRuleShortName),\n idxInCallingRule: currRuleIdx,\n inRule: this.shortRuleNameToFullName(prevRuleShortName),\n };\n }\n\n buildFullFollowKeyStack(this: MixedInParser): IFollowKey[] {\n const explicitRuleStack = this.RULE_STACK;\n const explicitOccurrenceStack = this.RULE_OCCURRENCE_STACK;\n\n return map(explicitRuleStack, (ruleName, idx) => {\n if (idx === 0) {\n return EOF_FOLLOW_KEY;\n }\n return {\n ruleName: this.shortRuleNameToFullName(ruleName),\n idxInCallingRule: explicitOccurrenceStack[idx],\n inRule: this.shortRuleNameToFullName(explicitRuleStack[idx - 1]),\n };\n });\n }\n\n flattenFollowSet(this: MixedInParser): TokenType[] {\n const followStack = map(this.buildFullFollowKeyStack(), (currKey) => {\n return this.getFollowSetFromFollowKey(currKey);\n });\n return <any>flatten(followStack);\n }\n\n getFollowSetFromFollowKey(\n this: MixedInParser,\n followKey: IFollowKey,\n ): TokenType[] {\n if (followKey === EOF_FOLLOW_KEY) {\n return [EOF];\n }\n\n const followName =\n followKey.ruleName + followKey.idxInCallingRule + IN + followKey.inRule;\n\n return this.resyncFollows[followName];\n }\n\n // It does not make any sense to include a virtual EOF token in the list of resynced tokens\n // as EOF does not really exist and thus does not contain any useful information (line/column numbers)\n addToResyncTokens(\n this: MixedInParser,\n token: IToken,\n resyncTokens: IToken[],\n ): IToken[] {\n if (!this.tokenMatcher(token, EOF)) {\n resyncTokens.push(token);\n }\n return resyncTokens;\n }\n\n reSyncTo(this: MixedInParser, tokType: TokenType): IToken[] {\n const resyncedTokens: IToken[] = [];\n let nextTok = this.LA(1);\n while (this.tokenMatcher(nextTok, tokType) === false) {\n nextTok = this.SKIP_TOKEN();\n this.addToResyncTokens(nextTok, resyncedTokens);\n }\n // the last token is not part of the error.\n return dropRight(resyncedTokens);\n }\n\n attemptInRepetitionRecovery(\n this: MixedInParser,\n prodFunc: Function,\n args: any[],\n lookaheadFunc: () => boolean,\n dslMethodIdx: number,\n prodOccurrence: number,\n nextToksWalker: typeof AbstractNextTerminalAfterProductionWalker,\n notStuck?: boolean,\n ): void {\n // by default this is a NO-OP\n // The actual implementation is with the function(not method) below\n }\n\n getCurrentGrammarPath(\n this: MixedInParser,\n tokType: TokenType,\n tokIdxInRule: number,\n ): ITokenGrammarPath {\n const pathRuleStack: string[] = this.getHumanReadableRuleStack();\n const pathOccurrenceStack: number[] = clone(this.RULE_OCCURRENCE_STACK);\n const grammarPath: any = {\n ruleStack: pathRuleStack,\n occurrenceStack: pathOccurrenceStack,\n lastTok: tokType,\n lastTokOccurrence: tokIdxInRule,\n };\n\n return grammarPath;\n }\n getHumanReadableRuleStack(this: MixedInParser): string[] {\n return map(this.RULE_STACK, (currShortName) =>\n this.shortRuleNameToFullName(currShortName),\n );\n }\n}\n\nexport function attemptInRepetitionRecovery(\n this: MixedInParser,\n prodFunc: Function,\n args: any[],\n lookaheadFunc: () => boolean,\n dslMethodIdx: number,\n prodOccurrence: number,\n nextToksWalker: typeof AbstractNextTerminalAfterProductionWalker,\n notStuck?: boolean,\n): void {\n const key = this.getKeyForAutomaticLookahead(dslMethodIdx, prodOccurrence);\n let firstAfterRepInfo = this.firstAfterRepMap[key];\n if (firstAfterRepInfo === undefined) {\n const currRuleName = this.getCurrRuleFullName();\n const ruleGrammar = this.getGAstProductions()[currRuleName];\n const walker: AbstractNextTerminalAfterProductionWalker =\n new nextToksWalker(ruleGrammar, prodOccurrence);\n firstAfterRepInfo = walker.startWalking();\n this.firstAfterRepMap[key] = firstAfterRepInfo;\n }\n\n let expectTokAfterLastMatch = firstAfterRepInfo.token;\n let nextTokIdx = firstAfterRepInfo.occurrence;\n const isEndOfRule = firstAfterRepInfo.isEndOfRule;\n\n // special edge case of a TOP most repetition after which the input should END.\n // this will force an attempt for inRule recovery in that scenario.\n if (\n this.RULE_STACK.length === 1 &&\n isEndOfRule &&\n expectTokAfterLastMatch === undefined\n ) {\n expectTokAfterLastMatch = EOF;\n nextTokIdx = 1;\n }\n\n // We don't have anything to re-sync to...\n // this condition was extracted from `shouldInRepetitionRecoveryBeTried` to act as a type-guard\n if (expectTokAfterLastMatch === undefined || nextTokIdx === undefined) {\n return;\n }\n\n if (\n this.shouldInRepetitionRecoveryBeTried(\n expectTokAfterLastMatch,\n nextTokIdx,\n notStuck,\n )\n ) {\n // TODO: performance optimization: instead of passing the original args here, we modify\n // the args param (or create a new one) and make sure the lookahead func is explicitly provided\n // to avoid searching the cache for it once more.\n this.tryInRepetitionRecovery(\n prodFunc,\n args,\n lookaheadFunc,\n expectTokAfterLastMatch,\n );\n }\n}\n", "// Lookahead keys are 32Bit integers in the form\n// TTTTTTTT-ZZZZZZZZZZZZ-YYYY-XXXXXXXX\n// XXXX -> Occurrence Index bitmap.\n// YYYY -> DSL Method Type bitmap.\n// ZZZZZZZZZZZZZZZ -> Rule short Index bitmap.\n// TTTTTTTTT -> alternation alternative index bitmap\n\nexport const BITS_FOR_METHOD_TYPE = 4;\nexport const BITS_FOR_OCCURRENCE_IDX = 8;\nexport const BITS_FOR_RULE_IDX = 12;\n// TODO: validation, this means that there may at most 2^8 --> 256 alternatives for an alternation.\nexport const BITS_FOR_ALT_IDX = 8;\n\n// short string used as part of mapping keys.\n// being short improves the performance when composing KEYS for maps out of these\n// The 5 - 8 bits (16 possible values, are reserved for the DSL method indices)\nexport const OR_IDX = 1 << BITS_FOR_OCCURRENCE_IDX;\nexport const OPTION_IDX = 2 << BITS_FOR_OCCURRENCE_IDX;\nexport const MANY_IDX = 3 << BITS_FOR_OCCURRENCE_IDX;\nexport const AT_LEAST_ONE_IDX = 4 << BITS_FOR_OCCURRENCE_IDX;\nexport const MANY_SEP_IDX = 5 << BITS_FOR_OCCURRENCE_IDX;\nexport const AT_LEAST_ONE_SEP_IDX = 6 << BITS_FOR_OCCURRENCE_IDX;\n\n// this actually returns a number, but it is always used as a string (object prop key)\nexport function getKeyForAutomaticLookahead(\n ruleIdx: number,\n dslMethodIdx: number,\n occurrence: number,\n): number {\n return occurrence | dslMethodIdx | ruleIdx;\n}\n\nconst BITS_START_FOR_ALT_IDX = 32 - BITS_FOR_ALT_IDX;\n", "import {\n ILookaheadStrategy,\n ILookaheadValidationError,\n IOrAlt,\n OptionalProductionType,\n Rule,\n TokenType,\n} from \"@chevrotain/types\";\nimport { flatMap, isEmpty } from \"lodash-es\";\nimport { defaultGrammarValidatorErrorProvider } from \"../errors_public.js\";\nimport { DEFAULT_PARSER_CONFIG } from \"../parser/parser.js\";\nimport {\n validateAmbiguousAlternationAlternatives,\n validateEmptyOrAlternative,\n validateNoLeftRecursion,\n validateSomeNonEmptyLookaheadPath,\n} from \"./checks.js\";\nimport {\n buildAlternativesLookAheadFunc,\n buildLookaheadFuncForOptionalProd,\n buildLookaheadFuncForOr,\n buildSingleAlternativeLookaheadFunction,\n getProdType,\n} from \"./lookahead.js\";\nimport { IParserDefinitionError } from \"./types.js\";\n\nexport class LLkLookaheadStrategy implements ILookaheadStrategy {\n readonly maxLookahead: number;\n\n constructor(options?: { maxLookahead?: number }) {\n this.maxLookahead =\n options?.maxLookahead ?? DEFAULT_PARSER_CONFIG.maxLookahead;\n }\n\n validate(options: {\n rules: Rule[];\n tokenTypes: TokenType[];\n grammarName: string;\n }): ILookaheadValidationError[] {\n const leftRecursionErrors = this.validateNoLeftRecursion(options.rules);\n\n if (isEmpty(leftRecursionErrors)) {\n const emptyAltErrors = this.validateEmptyOrAlternatives(options.rules);\n const ambiguousAltsErrors = this.validateAmbiguousAlternationAlternatives(\n options.rules,\n this.maxLookahead,\n );\n const emptyRepetitionErrors = this.validateSomeNonEmptyLookaheadPath(\n options.rules,\n this.maxLookahead,\n );\n const allErrors = [\n ...leftRecursionErrors,\n ...emptyAltErrors,\n ...ambiguousAltsErrors,\n ...emptyRepetitionErrors,\n ];\n return allErrors;\n }\n return leftRecursionErrors;\n }\n\n validateNoLeftRecursion(rules: Rule[]): IParserDefinitionError[] {\n return flatMap(rules, (currTopRule) =>\n validateNoLeftRecursion(\n currTopRule,\n currTopRule,\n defaultGrammarValidatorErrorProvider,\n ),\n );\n }\n\n validateEmptyOrAlternatives(rules: Rule[]): IParserDefinitionError[] {\n return flatMap(rules, (currTopRule) =>\n validateEmptyOrAlternative(\n currTopRule,\n defaultGrammarValidatorErrorProvider,\n ),\n );\n }\n\n validateAmbiguousAlternationAlternatives(\n rules: Rule[],\n maxLookahead: number,\n ): IParserDefinitionError[] {\n return flatMap(rules, (currTopRule) =>\n validateAmbiguousAlternationAlternatives(\n currTopRule,\n maxLookahead,\n defaultGrammarValidatorErrorProvider,\n ),\n );\n }\n\n validateSomeNonEmptyLookaheadPath(\n rules: Rule[],\n maxLookahead: number,\n ): IParserDefinitionError[] {\n return validateSomeNonEmptyLookaheadPath(\n rules,\n maxLookahead,\n defaultGrammarValidatorErrorProvider,\n );\n }\n\n buildLookaheadForAlternation(options: {\n prodOccurrence: number;\n rule: Rule;\n maxLookahead: number;\n hasPredicates: boolean;\n dynamicTokensEnabled: boolean;\n }): (orAlts?: IOrAlt<any>[] | undefined) => number | undefined {\n return buildLookaheadFuncForOr(\n options.prodOccurrence,\n options.rule,\n options.maxLookahead,\n options.hasPredicates,\n options.dynamicTokensEnabled,\n buildAlternativesLookAheadFunc,\n );\n }\n\n buildLookaheadForOptional(options: {\n prodOccurrence: number;\n prodType: OptionalProductionType;\n rule: Rule;\n maxLookahead: number;\n dynamicTokensEnabled: boolean;\n }): () => boolean {\n return buildLookaheadFuncForOptionalProd(\n options.prodOccurrence,\n options.rule,\n options.maxLookahead,\n options.dynamicTokensEnabled,\n getProdType(options.prodType),\n buildSingleAlternativeLookaheadFunction,\n );\n }\n}\n", "import { forEach, has } from \"lodash-es\";\nimport { DEFAULT_PARSER_CONFIG } from \"../parser.js\";\nimport {\n ILookaheadStrategy,\n IParserConfig,\n OptionalProductionType,\n} from \"@chevrotain/types\";\nimport {\n AT_LEAST_ONE_IDX,\n AT_LEAST_ONE_SEP_IDX,\n getKeyForAutomaticLookahead,\n MANY_IDX,\n MANY_SEP_IDX,\n OPTION_IDX,\n OR_IDX,\n} from \"../../grammar/keys.js\";\nimport { MixedInParser } from \"./parser_traits.js\";\nimport {\n Alternation,\n GAstVisitor,\n getProductionDslName,\n Option,\n Repetition,\n RepetitionMandatory,\n RepetitionMandatoryWithSeparator,\n RepetitionWithSeparator,\n Rule,\n} from \"@chevrotain/gast\";\nimport { LLkLookaheadStrategy } from \"../../grammar/llk_lookahead.js\";\n\n/**\n * Trait responsible for the lookahead related utilities and optimizations.\n */\nexport class LooksAhead {\n maxLookahead: number;\n lookAheadFuncsCache: any;\n dynamicTokensEnabled: boolean;\n lookaheadStrategy: ILookaheadStrategy;\n\n initLooksAhead(config: IParserConfig) {\n this.dynamicTokensEnabled = has(config, \"dynamicTokensEnabled\")\n ? (config.dynamicTokensEnabled as boolean) // assumes end user provides the correct config value/type\n : DEFAULT_PARSER_CONFIG.dynamicTokensEnabled;\n\n this.maxLookahead = has(config, \"maxLookahead\")\n ? (config.maxLookahead as number) // assumes end user provides the correct config value/type\n : DEFAULT_PARSER_CONFIG.maxLookahead;\n\n this.lookaheadStrategy = has(config, \"lookaheadStrategy\")\n ? (config.lookaheadStrategy as ILookaheadStrategy) // assumes end user provides the correct config value/type\n : new LLkLookaheadStrategy({ maxLookahead: this.maxLookahead });\n\n this.lookAheadFuncsCache = new Map();\n }\n\n preComputeLookaheadFunctions(this: MixedInParser, rules: Rule[]): void {\n forEach(rules, (currRule) => {\n this.TRACE_INIT(`${currRule.name} Rule Lookahead`, () => {\n const {\n alternation,\n repetition,\n option,\n repetitionMandatory,\n repetitionMandatoryWithSeparator,\n repetitionWithSeparator,\n } = collectMethods(currRule);\n\n forEach(alternation, (currProd) => {\n const prodIdx = currProd.idx === 0 ? \"\" : currProd.idx;\n this.TRACE_INIT(`${getProductionDslName(currProd)}${prodIdx}`, () => {\n const laFunc = this.lookaheadStrategy.buildLookaheadForAlternation({\n prodOccurrence: currProd.idx,\n rule: currRule,\n maxLookahead: currProd.maxLookahead || this.maxLookahead,\n hasPredicates: currProd.hasPredicates,\n dynamicTokensEnabled: this.dynamicTokensEnabled,\n });\n\n const key = getKeyForAutomaticLookahead(\n this.fullRuleNameToShort[currRule.name],\n OR_IDX,\n currProd.idx,\n );\n this.setLaFuncCache(key, laFunc);\n });\n });\n\n forEach(repetition, (currProd) => {\n this.computeLookaheadFunc(\n currRule,\n currProd.idx,\n MANY_IDX,\n \"Repetition\",\n currProd.maxLookahead,\n getProductionDslName(currProd),\n );\n });\n\n forEach(option, (currProd) => {\n this.computeLookaheadFunc(\n currRule,\n currProd.idx,\n OPTION_IDX,\n \"Option\",\n currProd.maxLookahead,\n getProductionDslName(currProd),\n );\n });\n\n forEach(repetitionMandatory, (currProd) => {\n this.computeLookaheadFunc(\n currRule,\n currProd.idx,\n AT_LEAST_ONE_IDX,\n \"RepetitionMandatory\",\n currProd.maxLookahead,\n getProductionDslName(currProd),\n );\n });\n\n forEach(repetitionMandatoryWithSeparator, (currProd) => {\n this.computeLookaheadFunc(\n currRule,\n currProd.idx,\n AT_LEAST_ONE_SEP_IDX,\n \"RepetitionMandatoryWithSeparator\",\n currProd.maxLookahead,\n getProductionDslName(currProd),\n );\n });\n\n forEach(repetitionWithSeparator, (currProd) => {\n this.computeLookaheadFunc(\n currRule,\n currProd.idx,\n MANY_SEP_IDX,\n \"RepetitionWithSeparator\",\n currProd.maxLookahead,\n getProductionDslName(currProd),\n );\n });\n });\n });\n }\n\n computeLookaheadFunc(\n this: MixedInParser,\n rule: Rule,\n prodOccurrence: number,\n prodKey: number,\n prodType: OptionalProductionType,\n prodMaxLookahead: number | undefined,\n dslMethodName: string,\n ): void {\n this.TRACE_INIT(\n `${dslMethodName}${prodOccurrence === 0 ? \"\" : prodOccurrence}`,\n () => {\n const laFunc = this.lookaheadStrategy.buildLookaheadForOptional({\n prodOccurrence,\n rule,\n maxLookahead: prodMaxLookahead || this.maxLookahead,\n dynamicTokensEnabled: this.dynamicTokensEnabled,\n prodType,\n });\n const key = getKeyForAutomaticLookahead(\n this.fullRuleNameToShort[rule.name],\n prodKey,\n prodOccurrence,\n );\n this.setLaFuncCache(key, laFunc);\n },\n );\n }\n\n // this actually returns a number, but it is always used as a string (object prop key)\n getKeyForAutomaticLookahead(\n this: MixedInParser,\n dslMethodIdx: number,\n occurrence: number,\n ): number {\n const currRuleShortName: any = this.getLastExplicitRuleShortName();\n return getKeyForAutomaticLookahead(\n currRuleShortName,\n dslMethodIdx,\n occurrence,\n );\n }\n\n getLaFuncFromCache(this: MixedInParser, key: number): Function {\n return this.lookAheadFuncsCache.get(key);\n }\n\n /* istanbul ignore next */\n setLaFuncCache(this: MixedInParser, key: number, value: Function): void {\n this.lookAheadFuncsCache.set(key, value);\n }\n}\n\nclass DslMethodsCollectorVisitor extends GAstVisitor {\n public dslMethods: {\n option: Option[];\n alternation: Alternation[];\n repetition: Repetition[];\n repetitionWithSeparator: RepetitionWithSeparator[];\n repetitionMandatory: RepetitionMandatory[];\n repetitionMandatoryWithSeparator: RepetitionMandatoryWithSeparator[];\n } = {\n option: [],\n alternation: [],\n repetition: [],\n repetitionWithSeparator: [],\n repetitionMandatory: [],\n repetitionMandatoryWithSeparator: [],\n };\n\n reset() {\n this.dslMethods = {\n option: [],\n alternation: [],\n repetition: [],\n repetitionWithSeparator: [],\n repetitionMandatory: [],\n repetitionMandatoryWithSeparator: [],\n };\n }\n\n public visitOption(option: Option): void {\n this.dslMethods.option.push(option);\n }\n\n public visitRepetitionWithSeparator(manySep: RepetitionWithSeparator): void {\n this.dslMethods.repetitionWithSeparator.push(manySep);\n }\n\n public visitRepetitionMandatory(atLeastOne: RepetitionMandatory): void {\n this.dslMethods.repetitionMandatory.push(atLeastOne);\n }\n\n public visitRepetitionMandatoryWithSeparator(\n atLeastOneSep: RepetitionMandatoryWithSeparator,\n ): void {\n this.dslMethods.repetitionMandatoryWithSeparator.push(atLeastOneSep);\n }\n\n public visitRepetition(many: Repetition): void {\n this.dslMethods.repetition.push(many);\n }\n\n public visitAlternation(or: Alternation): void {\n this.dslMethods.alternation.push(or);\n }\n}\n\nconst collectorVisitor = new DslMethodsCollectorVisitor();\nexport function collectMethods(rule: Rule): {\n option: Option[];\n alternation: Alternation[];\n repetition: Repetition[];\n repetitionWithSeparator: RepetitionWithSeparator[];\n repetitionMandatory: RepetitionMandatory[];\n repetitionMandatoryWithSeparator: RepetitionMandatoryWithSeparator[];\n} {\n collectorVisitor.reset();\n rule.accept(collectorVisitor);\n const dslMethods = collectorVisitor.dslMethods;\n // avoid uncleaned references\n collectorVisitor.reset();\n return <any>dslMethods;\n}\n", "import { CstNode, CstNodeLocation, IToken } from \"@chevrotain/types\";\n\n/**\n * This nodeLocation tracking is not efficient and should only be used\n * when error recovery is enabled or the Token Vector contains virtual Tokens\n * (e.g, Python Indent/Outdent)\n * As it executes the calculation for every single terminal/nonTerminal\n * and does not rely on the fact the token vector is **sorted**\n */\nexport function setNodeLocationOnlyOffset(\n currNodeLocation: CstNodeLocation,\n newLocationInfo: Required<Pick<IToken, \"startOffset\" | \"endOffset\">>,\n): void {\n // First (valid) update for this cst node\n if (isNaN(currNodeLocation.startOffset) === true) {\n // assumption1: Token location information is either NaN or a valid number\n // assumption2: Token location information is fully valid if it exist\n // (both start/end offsets exist and are numbers).\n currNodeLocation.startOffset = newLocationInfo.startOffset;\n currNodeLocation.endOffset = newLocationInfo.endOffset;\n }\n // Once the startOffset has been updated with a valid number it should never receive\n // any farther updates as the Token vector is sorted.\n // We still have to check this this condition for every new possible location info\n // because with error recovery enabled we may encounter invalid tokens (NaN location props)\n else if (currNodeLocation.endOffset! < newLocationInfo.endOffset === true) {\n currNodeLocation.endOffset = newLocationInfo.endOffset;\n }\n}\n\n/**\n * This nodeLocation tracking is not efficient and should only be used\n * when error recovery is enabled or the Token Vector contains virtual Tokens\n * (e.g, Python Indent/Outdent)\n * As it executes the calculation for every single terminal/nonTerminal\n * and does not rely on the fact the token vector is **sorted**\n */\nexport function setNodeLocationFull(\n currNodeLocation: CstNodeLocation,\n newLocationInfo: CstNodeLocation,\n): void {\n // First (valid) update for this cst node\n if (isNaN(currNodeLocation.startOffset) === true) {\n // assumption1: Token location information is either NaN or a valid number\n // assumption2: Token location information is fully valid if it exist\n // (all start/end props exist and are numbers).\n currNodeLocation.startOffset = newLocationInfo.startOffset;\n currNodeLocation.startColumn = newLocationInfo.startColumn;\n currNodeLocation.startLine = newLocationInfo.startLine;\n currNodeLocation.endOffset = newLocationInfo.endOffset;\n currNodeLocation.endColumn = newLocationInfo.endColumn;\n currNodeLocation.endLine = newLocationInfo.endLine;\n }\n // Once the start props has been updated with a valid number it should never receive\n // any farther updates as the Token vector is sorted.\n // We still have to check this this condition for every new possible location info\n // because with error recovery enabled we may encounter invalid tokens (NaN location props)\n else if (currNodeLocation.endOffset! < newLocationInfo.endOffset! === true) {\n currNodeLocation.endOffset = newLocationInfo.endOffset;\n currNodeLocation.endColumn = newLocationInfo.endColumn;\n currNodeLocation.endLine = newLocationInfo.endLine;\n }\n}\n\nexport function addTerminalToCst(\n node: CstNode,\n token: IToken,\n tokenTypeName: string,\n): void {\n if (node.children[tokenTypeName] === undefined) {\n node.children[tokenTypeName] = [token];\n } else {\n node.children[tokenTypeName].push(token);\n }\n}\n\nexport function addNoneTerminalToCst(\n node: CstNode,\n ruleName: string,\n ruleResult: any,\n): void {\n if (node.children[ruleName] === undefined) {\n node.children[ruleName] = [ruleResult];\n } else {\n node.children[ruleName].push(ruleResult);\n }\n}\n", "const NAME = \"name\";\n\nexport function defineNameProp(obj: {}, nameValue: string): void {\n Object.defineProperty(obj, NAME, {\n enumerable: false,\n configurable: true,\n writable: false,\n value: nameValue,\n });\n}\n", "import {\n compact,\n filter,\n forEach,\n isArray,\n isEmpty,\n isFunction,\n isUndefined,\n keys,\n map,\n} from \"lodash-es\";\nimport { defineNameProp } from \"../../lang/lang_extensions.js\";\nimport { CstNode, ICstVisitor } from \"@chevrotain/types\";\n\nexport function defaultVisit<IN>(ctx: any, param: IN): void {\n const childrenNames = keys(ctx);\n const childrenNamesLength = childrenNames.length;\n for (let i = 0; i < childrenNamesLength; i++) {\n const currChildName = childrenNames[i];\n const currChildArray = ctx[currChildName];\n const currChildArrayLength = currChildArray.length;\n for (let j = 0; j < currChildArrayLength; j++) {\n const currChild: any = currChildArray[j];\n // distinction between Tokens Children and CstNode children\n if (currChild.tokenTypeIdx === undefined) {\n this[currChild.name](currChild.children, param);\n }\n }\n }\n // defaultVisit does not support generic out param\n}\n\nexport function createBaseSemanticVisitorConstructor(\n grammarName: string,\n ruleNames: string[],\n): {\n new (...args: any[]): ICstVisitor<any, any>;\n} {\n const derivedConstructor: any = function () {};\n\n // can be overwritten according to:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n defineNameProp(derivedConstructor, grammarName + \"BaseSemantics\");\n\n const semanticProto = {\n visit: function (cstNode: CstNode | CstNode[], param: any) {\n // enables writing more concise visitor methods when CstNode has only a single child\n if (isArray(cstNode)) {\n // A CST Node's children dictionary can never have empty arrays as values\n // If a key is defined there will be at least one element in the corresponding value array.\n cstNode = cstNode[0];\n }\n\n // enables passing optional CstNodes concisely.\n if (isUndefined(cstNode)) {\n return undefined;\n }\n\n return this[cstNode.name](cstNode.children, param);\n },\n\n validateVisitor: function () {\n const semanticDefinitionErrors = validateVisitor(this, ruleNames);\n if (!isEmpty(semanticDefinitionErrors)) {\n const errorMessages = map(\n semanticDefinitionErrors,\n (currDefError) => currDefError.msg,\n );\n throw Error(\n `Errors Detected in CST Visitor <${this.constructor.name}>:\\n\\t` +\n `${errorMessages.join(\"\\n\\n\").replace(/\\n/g, \"\\n\\t\")}`,\n );\n }\n },\n };\n\n derivedConstructor.prototype = semanticProto;\n derivedConstructor.prototype.constructor = derivedConstructor;\n\n derivedConstructor._RULE_NAMES = ruleNames;\n\n return derivedConstructor;\n}\n\nexport function createBaseVisitorConstructorWithDefaults(\n grammarName: string,\n ruleNames: string[],\n baseConstructor: Function,\n): {\n new (...args: any[]): ICstVisitor<any, any>;\n} {\n const derivedConstructor: any = function () {};\n\n // can be overwritten according to:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n defineNameProp(derivedConstructor, grammarName + \"BaseSemanticsWithDefaults\");\n\n const withDefaultsProto = Object.create(baseConstructor.prototype);\n forEach(ruleNames, (ruleName) => {\n withDefaultsProto[ruleName] = defaultVisit;\n });\n\n derivedConstructor.prototype = withDefaultsProto;\n derivedConstructor.prototype.constructor = derivedConstructor;\n\n return derivedConstructor;\n}\n\nexport enum CstVisitorDefinitionError {\n REDUNDANT_METHOD,\n MISSING_METHOD,\n}\n\nexport interface IVisitorDefinitionError {\n msg: string;\n type: CstVisitorDefinitionError;\n methodName: string;\n}\n\nexport function validateVisitor(\n visitorInstance: ICstVisitor<unknown, unknown>,\n ruleNames: string[],\n): IVisitorDefinitionError[] {\n const missingErrors = validateMissingCstMethods(visitorInstance, ruleNames);\n\n return missingErrors;\n}\n\nexport function validateMissingCstMethods(\n visitorInstance: ICstVisitor<unknown, unknown>,\n ruleNames: string[],\n): IVisitorDefinitionError[] {\n const missingRuleNames = filter(ruleNames, (currRuleName) => {\n return isFunction((visitorInstance as any)[currRuleName]) === false;\n });\n\n const errors: IVisitorDefinitionError[] = map(\n missingRuleNames,\n (currRuleName) => {\n return {\n msg: `Missing visitor method: <${currRuleName}> on ${<any>(\n visitorInstance.constructor.name\n )} CST Visitor.`,\n type: CstVisitorDefinitionError.MISSING_METHOD,\n methodName: currRuleName,\n };\n },\n );\n\n return compact<IVisitorDefinitionError>(errors);\n}\n", "import {\n addNoneTerminalToCst,\n addTerminalToCst,\n setNodeLocationFull,\n setNodeLocationOnlyOffset,\n} from \"../../cst/cst.js\";\nimport { has, isUndefined, keys, noop } from \"lodash-es\";\nimport {\n createBaseSemanticVisitorConstructor,\n createBaseVisitorConstructorWithDefaults,\n} from \"../../cst/cst_visitor.js\";\nimport {\n CstNode,\n CstNodeLocation,\n ICstVisitor,\n IParserConfig,\n IToken,\n nodeLocationTrackingOptions,\n} from \"@chevrotain/types\";\nimport { MixedInParser } from \"./parser_traits.js\";\nimport { DEFAULT_PARSER_CONFIG } from \"../parser.js\";\n\n/**\n * This trait is responsible for the CST building logic.\n */\nexport class TreeBuilder {\n outputCst: boolean;\n CST_STACK: CstNode[];\n baseCstVisitorConstructor: Function;\n baseCstVisitorWithDefaultsConstructor: Function;\n\n // dynamically assigned Methods\n setNodeLocationFromNode: (\n nodeLocation: CstNodeLocation,\n locationInformation: CstNodeLocation,\n ) => void;\n setNodeLocationFromToken: (\n nodeLocation: CstNodeLocation,\n locationInformation: CstNodeLocation,\n ) => void;\n cstPostRule: (this: MixedInParser, ruleCstNode: CstNode) => void;\n\n setInitialNodeLocation: (cstNode: CstNode) => void;\n nodeLocationTracking: nodeLocationTrackingOptions;\n\n initTreeBuilder(this: MixedInParser, config: IParserConfig) {\n this.CST_STACK = [];\n\n // outputCst is no longer exposed/defined in the pubic API\n this.outputCst = (config as any).outputCst;\n\n this.nodeLocationTracking = has(config, \"nodeLocationTracking\")\n ? (config.nodeLocationTracking as nodeLocationTrackingOptions) // assumes end user provides the correct config value/type\n : DEFAULT_PARSER_CONFIG.nodeLocationTracking;\n\n if (!this.outputCst) {\n this.cstInvocationStateUpdate = noop;\n this.cstFinallyStateUpdate = noop;\n this.cstPostTerminal = noop;\n this.cstPostNonTerminal = noop;\n this.cstPostRule = noop;\n } else {\n if (/full/i.test(this.nodeLocationTracking)) {\n if (this.recoveryEnabled) {\n this.setNodeLocationFromToken = setNodeLocationFull;\n this.setNodeLocationFromNode = setNodeLocationFull;\n this.cstPostRule = noop;\n this.setInitialNodeLocation = this.setInitialNodeLocationFullRecovery;\n } else {\n this.setNodeLocationFromToken = noop;\n this.setNodeLocationFromNode = noop;\n this.cstPostRule = this.cstPostRuleFull;\n this.setInitialNodeLocation = this.setInitialNodeLocationFullRegular;\n }\n } else if (/onlyOffset/i.test(this.nodeLocationTracking)) {\n if (this.recoveryEnabled) {\n this.setNodeLocationFromToken = <any>setNodeLocationOnlyOffset;\n this.setNodeLocationFromNode = <any>setNodeLocationOnlyOffset;\n this.cstPostRule = noop;\n this.setInitialNodeLocation =\n this.setInitialNodeLocationOnlyOffsetRecovery;\n } else {\n this.setNodeLocationFromToken = noop;\n this.setNodeLocationFromNode = noop;\n this.cstPostRule = this.cstPostRuleOnlyOffset;\n this.setInitialNodeLocation =\n this.setInitialNodeLocationOnlyOffsetRegular;\n }\n } else if (/none/i.test(this.nodeLocationTracking)) {\n this.setNodeLocationFromToken = noop;\n this.setNodeLocationFromNode = noop;\n this.cstPostRule = noop;\n this.setInitialNodeLocation = noop;\n } else {\n throw Error(\n `Invalid <nodeLocationTracking> config option: \"${config.nodeLocationTracking}\"`,\n );\n }\n }\n }\n\n setInitialNodeLocationOnlyOffsetRecovery(\n this: MixedInParser,\n cstNode: any,\n ): void {\n cstNode.location = {\n startOffset: NaN,\n endOffset: NaN,\n };\n }\n\n setInitialNodeLocationOnlyOffsetRegular(\n this: MixedInParser,\n cstNode: any,\n ): void {\n cstNode.location = {\n // without error recovery the starting Location of a new CstNode is guaranteed\n // To be the next Token's startOffset (for valid inputs).\n // For invalid inputs there won't be any CSTOutput so this potential\n // inaccuracy does not matter\n startOffset: this.LA(1).startOffset,\n endOffset: NaN,\n };\n }\n\n setInitialNodeLocationFullRecovery(this: MixedInParser, cstNode: any): void {\n cstNode.location = {\n startOffset: NaN,\n startLine: NaN,\n startColumn: NaN,\n endOffset: NaN,\n endLine: NaN,\n endColumn: NaN,\n };\n }\n\n /**\n * @see setInitialNodeLocationOnlyOffsetRegular for explanation why this work\n\n * @param cstNode\n */\n setInitialNodeLocationFullRegular(this: MixedInParser, cstNode: any): void {\n const nextToken = this.LA(1);\n cstNode.location = {\n startOffset: nextToken.startOffset,\n startLine: nextToken.startLine,\n startColumn: nextToken.startColumn,\n endOffset: NaN,\n endLine: NaN,\n endColumn: NaN,\n };\n }\n\n cstInvocationStateUpdate(this: MixedInParser, fullRuleName: string): void {\n const cstNode: CstNode = {\n name: fullRuleName,\n children: Object.create(null),\n };\n\n this.setInitialNodeLocation(cstNode);\n this.CST_STACK.push(cstNode);\n }\n\n cstFinallyStateUpdate(this: MixedInParser): void {\n this.CST_STACK.pop();\n }\n\n cstPostRuleFull(this: MixedInParser, ruleCstNode: CstNode): void {\n // casts to `required<CstNodeLocation>` are safe because `cstPostRuleFull` should only be invoked when full location is enabled\n const prevToken = this.LA(0) as Required<CstNodeLocation>;\n const loc = ruleCstNode.location as Required<CstNodeLocation>;\n\n // If this condition is true it means we consumed at least one Token\n // In this CstNode.\n if (loc.startOffset <= prevToken.startOffset === true) {\n loc.endOffset = prevToken.endOffset;\n loc.endLine = prevToken.endLine;\n loc.endColumn = prevToken.endColumn;\n }\n // \"empty\" CstNode edge case\n else {\n loc.startOffset = NaN;\n loc.startLine = NaN;\n loc.startColumn = NaN;\n }\n }\n\n cstPostRuleOnlyOffset(this: MixedInParser, ruleCstNode: CstNode): void {\n const prevToken = this.LA(0);\n // `location' is not null because `cstPostRuleOnlyOffset` will only be invoked when location tracking is enabled.\n const loc = ruleCstNode.location!;\n\n // If this condition is true it means we consumed at least one Token\n // In this CstNode.\n if (loc.startOffset <= prevToken.startOffset === true) {\n loc.endOffset = prevToken.endOffset;\n }\n // \"empty\" CstNode edge case\n else {\n loc.startOffset = NaN;\n }\n }\n\n cstPostTerminal(\n this: MixedInParser,\n key: string,\n consumedToken: IToken,\n ): void {\n const rootCst = this.CST_STACK[this.CST_STACK.length - 1];\n addTerminalToCst(rootCst, consumedToken, key);\n // This is only used when **both** error recovery and CST Output are enabled.\n this.setNodeLocationFromToken(rootCst.location!, <any>consumedToken);\n }\n\n cstPostNonTerminal(\n this: MixedInParser,\n ruleCstResult: CstNode,\n ruleName: string,\n ): void {\n const preCstNode = this.CST_STACK[this.CST_STACK.length - 1];\n addNoneTerminalToCst(preCstNode, ruleName, ruleCstResult);\n // This is only used when **both** error recovery and CST Output are enabled.\n this.setNodeLocationFromNode(preCstNode.location!, ruleCstResult.location!);\n }\n\n getBaseCstVisitorConstructor<IN = any, OUT = any>(\n this: MixedInParser,\n ): {\n new (...args: any[]): ICstVisitor<IN, OUT>;\n } {\n if (isUndefined(this.baseCstVisitorConstructor)) {\n const newBaseCstVisitorConstructor = createBaseSemanticVisitorConstructor(\n this.className,\n keys(this.gastProductionsCache),\n );\n this.baseCstVisitorConstructor = newBaseCstVisitorConstructor;\n return newBaseCstVisitorConstructor;\n }\n\n return <any>this.baseCstVisitorConstructor;\n }\n\n getBaseCstVisitorConstructorWithDefaults<IN = any, OUT = any>(\n this: MixedInParser,\n ): {\n new (...args: any[]): ICstVisitor<IN, OUT>;\n } {\n if (isUndefined(this.baseCstVisitorWithDefaultsConstructor)) {\n const newConstructor = createBaseVisitorConstructorWithDefaults(\n this.className,\n keys(this.gastProductionsCache),\n this.getBaseCstVisitorConstructor(),\n );\n this.baseCstVisitorWithDefaultsConstructor = newConstructor;\n return newConstructor;\n }\n\n return <any>this.baseCstVisitorWithDefaultsConstructor;\n }\n\n getLastExplicitRuleShortName(this: MixedInParser): number {\n const ruleStack = this.RULE_STACK;\n return ruleStack[ruleStack.length - 1];\n }\n\n getPreviousExplicitRuleShortName(this: MixedInParser): number {\n const ruleStack = this.RULE_STACK;\n return ruleStack[ruleStack.length - 2];\n }\n\n getLastExplicitRuleOccurrenceIndex(this: MixedInParser): number {\n const occurrenceStack = this.RULE_OCCURRENCE_STACK;\n return occurrenceStack[occurrenceStack.length - 1];\n }\n}\n", "import { END_OF_FILE } from \"../parser.js\";\nimport { IToken } from \"@chevrotain/types\";\nimport { MixedInParser } from \"./parser_traits.js\";\n\n/**\n * Trait responsible abstracting over the interaction with Lexer output (Token vector).\n *\n * This could be generalized to support other kinds of lexers, e.g.\n * - Just in Time Lexing / Lexer-Less parsing.\n * - Streaming Lexer.\n */\nexport class LexerAdapter {\n tokVector: IToken[];\n tokVectorLength: number;\n currIdx: number;\n\n initLexerAdapter() {\n this.tokVector = [];\n this.tokVectorLength = 0;\n this.currIdx = -1;\n }\n\n set input(newInput: IToken[]) {\n // @ts-ignore - `this parameter` not supported in setters/getters\n // - https://www.typescriptlang.org/docs/handbook/functions.html#this-parameters\n if (this.selfAnalysisDone !== true) {\n throw Error(\n `Missing <performSelfAnalysis> invocation at the end of the Parser's constructor.`,\n );\n }\n // @ts-ignore - `this parameter` not supported in setters/getters\n // - https://www.typescriptlang.org/docs/handbook/functions.html#this-parameters\n this.reset();\n this.tokVector = newInput;\n this.tokVectorLength = newInput.length;\n }\n\n get input(): IToken[] {\n return this.tokVector;\n }\n\n // skips a token and returns the next token\n SKIP_TOKEN(this: MixedInParser): IToken {\n if (this.currIdx <= this.tokVector.length - 2) {\n this.consumeToken();\n return this.LA(1);\n } else {\n return END_OF_FILE;\n }\n }\n\n // Lexer (accessing Token vector) related methods which can be overridden to implement lazy lexers\n // or lexers dependent on parser context.\n LA(this: MixedInParser, howMuch: number): IToken {\n const soughtIdx = this.currIdx + howMuch;\n if (soughtIdx < 0 || this.tokVectorLength <= soughtIdx) {\n return END_OF_FILE;\n } else {\n return this.tokVector[soughtIdx];\n }\n }\n\n consumeToken(this: MixedInParser) {\n this.currIdx++;\n }\n\n exportLexerState(this: MixedInParser): number {\n return this.currIdx;\n }\n\n importLexerState(this: MixedInParser, newState: number) {\n this.currIdx = newState;\n }\n\n resetLexerState(this: MixedInParser): void {\n this.currIdx = -1;\n }\n\n moveToTerminatedState(this: MixedInParser): void {\n this.currIdx = this.tokVector.length - 1;\n }\n\n getLexerPosition(this: MixedInParser): number {\n return this.exportLexerState();\n }\n}\n", "import {\n AtLeastOneSepMethodOpts,\n ConsumeMethodOpts,\n DSLMethodOpts,\n DSLMethodOptsWithErr,\n GrammarAction,\n IOrAlt,\n IRuleConfig,\n ISerializedGast,\n IToken,\n ManySepMethodOpts,\n OrMethodOpts,\n SubruleMethodOpts,\n TokenType,\n} from \"@chevrotain/types\";\nimport { includes, values } from \"lodash-es\";\nimport { isRecognitionException } from \"../../exceptions_public.js\";\nimport { DEFAULT_RULE_CONFIG, ParserDefinitionErrorType } from \"../parser.js\";\nimport { defaultGrammarValidatorErrorProvider } from \"../../errors_public.js\";\nimport { validateRuleIsOverridden } from \"../../grammar/checks.js\";\nimport { MixedInParser } from \"./parser_traits.js\";\nimport { Rule, serializeGrammar } from \"@chevrotain/gast\";\nimport { IParserDefinitionError } from \"../../grammar/types.js\";\nimport { ParserMethodInternal } from \"../types.js\";\n\n/**\n * This trait is responsible for implementing the public API\n * for defining Chevrotain parsers, i.e:\n * - CONSUME\n * - RULE\n * - OPTION\n * - ...\n */\nexport class RecognizerApi {\n ACTION<T>(this: MixedInParser, impl: () => T): T {\n return impl.call(this);\n }\n\n consume(\n this: MixedInParser,\n idx: number,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, idx, options);\n }\n\n subrule<ARGS extends unknown[], R>(\n this: MixedInParser,\n idx: number,\n ruleToCall: ParserMethodInternal<ARGS, R>,\n options?: SubruleMethodOpts<ARGS>,\n ): R {\n return this.subruleInternal(ruleToCall, idx, options);\n }\n\n option<OUT>(\n this: MixedInParser,\n idx: number,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, idx);\n }\n\n or(\n this: MixedInParser,\n idx: number,\n altsOrOpts: IOrAlt<any>[] | OrMethodOpts<any>,\n ): any {\n return this.orInternal(altsOrOpts, idx);\n }\n\n many(\n this: MixedInParser,\n idx: number,\n actionORMethodDef: GrammarAction<any> | DSLMethodOpts<any>,\n ): void {\n return this.manyInternal(idx, actionORMethodDef);\n }\n\n atLeastOne(\n this: MixedInParser,\n idx: number,\n actionORMethodDef: GrammarAction<any> | DSLMethodOptsWithErr<any>,\n ): void {\n return this.atLeastOneInternal(idx, actionORMethodDef);\n }\n\n CONSUME(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 0, options);\n }\n\n CONSUME1(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 1, options);\n }\n\n CONSUME2(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 2, options);\n }\n\n CONSUME3(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 3, options);\n }\n\n CONSUME4(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 4, options);\n }\n\n CONSUME5(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 5, options);\n }\n\n CONSUME6(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 6, options);\n }\n\n CONSUME7(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 7, options);\n }\n\n CONSUME8(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 8, options);\n }\n\n CONSUME9(\n this: MixedInParser,\n tokType: TokenType,\n options?: ConsumeMethodOpts,\n ): IToken {\n return this.consumeInternal(tokType, 9, options);\n }\n\n SUBRULE<ARGS extends unknown[], R>(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal<ARGS, R>,\n options?: SubruleMethodOpts<ARGS>,\n ): R {\n return this.subruleInternal(ruleToCall, 0, options);\n }\n\n SUBRULE1<ARGS extends unknown[], R>(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal<ARGS, R>,\n options?: SubruleMethodOpts<ARGS>,\n ): R {\n return this.subruleInternal(ruleToCall, 1, options);\n }\n\n SUBRULE2<ARGS extends unknown[], R>(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal<ARGS, R>,\n options?: SubruleMethodOpts<ARGS>,\n ): R {\n return this.subruleInternal(ruleToCall, 2, options);\n }\n\n SUBRULE3<ARGS extends unknown[], R>(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal<ARGS, R>,\n options?: SubruleMethodOpts<ARGS>,\n ): R {\n return this.subruleInternal(ruleToCall, 3, options);\n }\n\n SUBRULE4<ARGS extends unknown[], R>(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal<ARGS, R>,\n options?: SubruleMethodOpts<ARGS>,\n ): R {\n return this.subruleInternal(ruleToCall, 4, options);\n }\n\n SUBRULE5<ARGS extends unknown[], R>(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal<ARGS, R>,\n options?: SubruleMethodOpts<ARGS>,\n ): R {\n return this.subruleInternal(ruleToCall, 5, options);\n }\n\n SUBRULE6<ARGS extends unknown[], R>(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal<ARGS, R>,\n options?: SubruleMethodOpts<ARGS>,\n ): R {\n return this.subruleInternal(ruleToCall, 6, options);\n }\n\n SUBRULE7<ARGS extends unknown[], R>(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal<ARGS, R>,\n options?: SubruleMethodOpts<ARGS>,\n ): R {\n return this.subruleInternal(ruleToCall, 7, options);\n }\n\n SUBRULE8<ARGS extends unknown[], R>(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal<ARGS, R>,\n options?: SubruleMethodOpts<ARGS>,\n ): R {\n return this.subruleInternal(ruleToCall, 8, options);\n }\n\n SUBRULE9<ARGS extends unknown[], R>(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal<ARGS, R>,\n options?: SubruleMethodOpts<ARGS>,\n ): R {\n return this.subruleInternal(ruleToCall, 9, options);\n }\n\n OPTION<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 0);\n }\n\n OPTION1<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 1);\n }\n\n OPTION2<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 2);\n }\n\n OPTION3<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 3);\n }\n\n OPTION4<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 4);\n }\n\n OPTION5<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 5);\n }\n\n OPTION6<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 6);\n }\n\n OPTION7<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 7);\n }\n\n OPTION8<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 8);\n }\n\n OPTION9<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): OUT | undefined {\n return this.optionInternal(actionORMethodDef, 9);\n }\n\n OR<T>(\n this: MixedInParser,\n altsOrOpts: IOrAlt<any>[] | OrMethodOpts<unknown>,\n ): T {\n return this.orInternal(altsOrOpts, 0);\n }\n\n OR1<T>(\n this: MixedInParser,\n altsOrOpts: IOrAlt<any>[] | OrMethodOpts<unknown>,\n ): T {\n return this.orInternal(altsOrOpts, 1);\n }\n\n OR2<T>(\n this: MixedInParser,\n altsOrOpts: IOrAlt<any>[] | OrMethodOpts<unknown>,\n ): T {\n return this.orInternal(altsOrOpts, 2);\n }\n\n OR3<T>(\n this: MixedInParser,\n altsOrOpts: IOrAlt<any>[] | OrMethodOpts<unknown>,\n ): T {\n return this.orInternal(altsOrOpts, 3);\n }\n\n OR4<T>(\n this: MixedInParser,\n altsOrOpts: IOrAlt<any>[] | OrMethodOpts<unknown>,\n ): T {\n return this.orInternal(altsOrOpts, 4);\n }\n\n OR5<T>(\n this: MixedInParser,\n altsOrOpts: IOrAlt<any>[] | OrMethodOpts<unknown>,\n ): T {\n return this.orInternal(altsOrOpts, 5);\n }\n\n OR6<T>(\n this: MixedInParser,\n altsOrOpts: IOrAlt<any>[] | OrMethodOpts<unknown>,\n ): T {\n return this.orInternal(altsOrOpts, 6);\n }\n\n OR7<T>(\n this: MixedInParser,\n altsOrOpts: IOrAlt<any>[] | OrMethodOpts<unknown>,\n ): T {\n return this.orInternal(altsOrOpts, 7);\n }\n\n OR8<T>(\n this: MixedInParser,\n altsOrOpts: IOrAlt<any>[] | OrMethodOpts<unknown>,\n ): T {\n return this.orInternal(altsOrOpts, 8);\n }\n\n OR9<T>(\n this: MixedInParser,\n altsOrOpts: IOrAlt<any>[] | OrMethodOpts<unknown>,\n ): T {\n return this.orInternal(altsOrOpts, 9);\n }\n\n MANY<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): void {\n this.manyInternal(0, actionORMethodDef);\n }\n\n MANY1<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): void {\n this.manyInternal(1, actionORMethodDef);\n }\n\n MANY2<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): void {\n this.manyInternal(2, actionORMethodDef);\n }\n\n MANY3<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): void {\n this.manyInternal(3, actionORMethodDef);\n }\n\n MANY4<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): void {\n this.manyInternal(4, actionORMethodDef);\n }\n\n MANY5<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): void {\n this.manyInternal(5, actionORMethodDef);\n }\n\n MANY6<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): void {\n this.manyInternal(6, actionORMethodDef);\n }\n\n MANY7<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): void {\n this.manyInternal(7, actionORMethodDef);\n }\n\n MANY8<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): void {\n this.manyInternal(8, actionORMethodDef);\n }\n\n MANY9<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): void {\n this.manyInternal(9, actionORMethodDef);\n }\n\n MANY_SEP<OUT>(this: MixedInParser, options: ManySepMethodOpts<OUT>): void {\n this.manySepFirstInternal(0, options);\n }\n\n MANY_SEP1<OUT>(this: MixedInParser, options: ManySepMethodOpts<OUT>): void {\n this.manySepFirstInternal(1, options);\n }\n\n MANY_SEP2<OUT>(this: MixedInParser, options: ManySepMethodOpts<OUT>): void {\n this.manySepFirstInternal(2, options);\n }\n\n MANY_SEP3<OUT>(this: MixedInParser, options: ManySepMethodOpts<OUT>): void {\n this.manySepFirstInternal(3, options);\n }\n\n MANY_SEP4<OUT>(this: MixedInParser, options: ManySepMethodOpts<OUT>): void {\n this.manySepFirstInternal(4, options);\n }\n\n MANY_SEP5<OUT>(this: MixedInParser, options: ManySepMethodOpts<OUT>): void {\n this.manySepFirstInternal(5, options);\n }\n\n MANY_SEP6<OUT>(this: MixedInParser, options: ManySepMethodOpts<OUT>): void {\n this.manySepFirstInternal(6, options);\n }\n\n MANY_SEP7<OUT>(this: MixedInParser, options: ManySepMethodOpts<OUT>): void {\n this.manySepFirstInternal(7, options);\n }\n\n MANY_SEP8<OUT>(this: MixedInParser, options: ManySepMethodOpts<OUT>): void {\n this.manySepFirstInternal(8, options);\n }\n\n MANY_SEP9<OUT>(this: MixedInParser, options: ManySepMethodOpts<OUT>): void {\n this.manySepFirstInternal(9, options);\n }\n\n AT_LEAST_ONE<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOptsWithErr<OUT>,\n ): void {\n this.atLeastOneInternal(0, actionORMethodDef);\n }\n\n AT_LEAST_ONE1<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOptsWithErr<OUT>,\n ): void {\n return this.atLeastOneInternal(1, actionORMethodDef);\n }\n\n AT_LEAST_ONE2<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOptsWithErr<OUT>,\n ): void {\n this.atLeastOneInternal(2, actionORMethodDef);\n }\n\n AT_LEAST_ONE3<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOptsWithErr<OUT>,\n ): void {\n this.atLeastOneInternal(3, actionORMethodDef);\n }\n\n AT_LEAST_ONE4<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOptsWithErr<OUT>,\n ): void {\n this.atLeastOneInternal(4, actionORMethodDef);\n }\n\n AT_LEAST_ONE5<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOptsWithErr<OUT>,\n ): void {\n this.atLeastOneInternal(5, actionORMethodDef);\n }\n\n AT_LEAST_ONE6<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOptsWithErr<OUT>,\n ): void {\n this.atLeastOneInternal(6, actionORMethodDef);\n }\n\n AT_LEAST_ONE7<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOptsWithErr<OUT>,\n ): void {\n this.atLeastOneInternal(7, actionORMethodDef);\n }\n\n AT_LEAST_ONE8<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOptsWithErr<OUT>,\n ): void {\n this.atLeastOneInternal(8, actionORMethodDef);\n }\n\n AT_LEAST_ONE9<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOptsWithErr<OUT>,\n ): void {\n this.atLeastOneInternal(9, actionORMethodDef);\n }\n\n AT_LEAST_ONE_SEP<OUT>(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts<OUT>,\n ): void {\n this.atLeastOneSepFirstInternal(0, options);\n }\n\n AT_LEAST_ONE_SEP1<OUT>(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts<OUT>,\n ): void {\n this.atLeastOneSepFirstInternal(1, options);\n }\n\n AT_LEAST_ONE_SEP2<OUT>(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts<OUT>,\n ): void {\n this.atLeastOneSepFirstInternal(2, options);\n }\n\n AT_LEAST_ONE_SEP3<OUT>(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts<OUT>,\n ): void {\n this.atLeastOneSepFirstInternal(3, options);\n }\n\n AT_LEAST_ONE_SEP4<OUT>(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts<OUT>,\n ): void {\n this.atLeastOneSepFirstInternal(4, options);\n }\n\n AT_LEAST_ONE_SEP5<OUT>(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts<OUT>,\n ): void {\n this.atLeastOneSepFirstInternal(5, options);\n }\n\n AT_LEAST_ONE_SEP6<OUT>(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts<OUT>,\n ): void {\n this.atLeastOneSepFirstInternal(6, options);\n }\n\n AT_LEAST_ONE_SEP7<OUT>(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts<OUT>,\n ): void {\n this.atLeastOneSepFirstInternal(7, options);\n }\n\n AT_LEAST_ONE_SEP8<OUT>(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts<OUT>,\n ): void {\n this.atLeastOneSepFirstInternal(8, options);\n }\n\n AT_LEAST_ONE_SEP9<OUT>(\n this: MixedInParser,\n options: AtLeastOneSepMethodOpts<OUT>,\n ): void {\n this.atLeastOneSepFirstInternal(9, options);\n }\n\n RULE<T>(\n this: MixedInParser,\n name: string,\n implementation: (...implArgs: any[]) => T,\n config: IRuleConfig<T> = DEFAULT_RULE_CONFIG,\n ): (idxInCallingRule?: number, ...args: any[]) => T | any {\n if (includes(this.definedRulesNames, name)) {\n const errMsg =\n defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({\n topLevelRule: name,\n grammarName: this.className,\n });\n\n const error = {\n message: errMsg,\n type: ParserDefinitionErrorType.DUPLICATE_RULE_NAME,\n ruleName: name,\n };\n this.definitionErrors.push(error);\n }\n\n this.definedRulesNames.push(name);\n\n const ruleImplementation = this.defineRule(name, implementation, config);\n (this as any)[name] = ruleImplementation;\n return ruleImplementation;\n }\n\n OVERRIDE_RULE<T>(\n this: MixedInParser,\n name: string,\n impl: (...implArgs: any[]) => T,\n config: IRuleConfig<T> = DEFAULT_RULE_CONFIG,\n ): (idxInCallingRule?: number, ...args: any[]) => T {\n const ruleErrors: IParserDefinitionError[] = validateRuleIsOverridden(\n name,\n this.definedRulesNames,\n this.className,\n );\n this.definitionErrors = this.definitionErrors.concat(ruleErrors);\n\n const ruleImplementation = this.defineRule(name, impl, config);\n (this as any)[name] = ruleImplementation;\n return ruleImplementation;\n }\n\n BACKTRACK<T>(\n this: MixedInParser,\n grammarRule: (...args: any[]) => T,\n args?: any[],\n ): () => boolean {\n return function () {\n // save org state\n this.isBackTrackingStack.push(1);\n const orgState = this.saveRecogState();\n try {\n grammarRule.apply(this, args);\n // if no exception was thrown we have succeed parsing the rule.\n return true;\n } catch (e) {\n if (isRecognitionException(e)) {\n return false;\n } else {\n throw e;\n }\n } finally {\n this.reloadRecogState(orgState);\n this.isBackTrackingStack.pop();\n }\n };\n }\n\n // GAST export APIs\n public getGAstProductions(this: MixedInParser): Record<string, Rule> {\n return this.gastProductionsCache;\n }\n\n public getSerializedGastProductions(this: MixedInParser): ISerializedGast[] {\n return serializeGrammar(values(this.gastProductionsCache));\n }\n}\n", "import {\n AtLeastOneSepMethodOpts,\n ConsumeMethodOpts,\n DSLMethodOpts,\n DSLMethodOptsWithErr,\n GrammarAction,\n IOrAlt,\n IParserConfig,\n IRuleConfig,\n IToken,\n ManySepMethodOpts,\n OrMethodOpts,\n ParserMethod,\n SubruleMethodOpts,\n TokenType,\n TokenTypeDictionary,\n TokenVocabulary,\n} from \"@chevrotain/types\";\nimport {\n clone,\n every,\n flatten,\n has,\n isArray,\n isEmpty,\n isObject,\n reduce,\n uniq,\n values,\n} from \"lodash-es\";\nimport {\n AT_LEAST_ONE_IDX,\n AT_LEAST_ONE_SEP_IDX,\n BITS_FOR_METHOD_TYPE,\n BITS_FOR_OCCURRENCE_IDX,\n MANY_IDX,\n MANY_SEP_IDX,\n OPTION_IDX,\n OR_IDX,\n} from \"../../grammar/keys.js\";\nimport {\n isRecognitionException,\n MismatchedTokenException,\n NotAllInputParsedException,\n} from \"../../exceptions_public.js\";\nimport { PROD_TYPE } from \"../../grammar/lookahead.js\";\nimport {\n AbstractNextTerminalAfterProductionWalker,\n NextTerminalAfterAtLeastOneSepWalker,\n NextTerminalAfterAtLeastOneWalker,\n NextTerminalAfterManySepWalker,\n NextTerminalAfterManyWalker,\n} from \"../../grammar/interpreter.js\";\nimport { DEFAULT_RULE_CONFIG, IParserState, TokenMatcher } from \"../parser.js\";\nimport { IN_RULE_RECOVERY_EXCEPTION } from \"./recoverable.js\";\nimport { EOF } from \"../../../scan/tokens_public.js\";\nimport { MixedInParser } from \"./parser_traits.js\";\nimport {\n augmentTokenTypes,\n isTokenType,\n tokenStructuredMatcher,\n tokenStructuredMatcherNoCategories,\n} from \"../../../scan/tokens.js\";\nimport { Rule } from \"@chevrotain/gast\";\nimport { ParserMethodInternal } from \"../types.js\";\n\n/**\n * This trait is responsible for the runtime parsing engine\n * Used by the official API (recognizer_api.ts)\n */\nexport class RecognizerEngine {\n isBackTrackingStack: boolean[];\n className: string;\n RULE_STACK: number[];\n RULE_OCCURRENCE_STACK: number[];\n definedRulesNames: string[];\n tokensMap: { [fqn: string]: TokenType };\n gastProductionsCache: Record<string, Rule>;\n shortRuleNameToFull: Record<string, string>;\n fullRuleNameToShort: Record<string, number>;\n // The shortName Index must be coded \"after\" the first 8bits to enable building unique lookahead keys\n ruleShortNameIdx: number;\n tokenMatcher: TokenMatcher;\n subruleIdx: number;\n\n initRecognizerEngine(\n tokenVocabulary: TokenVocabulary,\n config: IParserConfig,\n ) {\n this.className = this.constructor.name;\n // TODO: would using an ES6 Map or plain object be faster (CST building scenario)\n this.shortRuleNameToFull = {};\n this.fullRuleNameToShort = {};\n this.ruleShortNameIdx = 256;\n this.tokenMatcher = tokenStructuredMatcherNoCategories;\n this.subruleIdx = 0;\n\n this.definedRulesNames = [];\n this.tokensMap = {};\n this.isBackTrackingStack = [];\n this.RULE_STACK = [];\n this.RULE_OCCURRENCE_STACK = [];\n this.gastProductionsCache = {};\n\n if (has(config, \"serializedGrammar\")) {\n throw Error(\n \"The Parser's configuration can no longer contain a <serializedGrammar> property.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0\\n\" +\n \"\\tFor Further details.\",\n );\n }\n\n if (isArray(tokenVocabulary)) {\n // This only checks for Token vocabularies provided as arrays.\n // That is good enough because the main objective is to detect users of pre-V4.0 APIs\n // rather than all edge cases of empty Token vocabularies.\n if (isEmpty(tokenVocabulary as any[])) {\n throw Error(\n \"A Token Vocabulary cannot be empty.\\n\" +\n \"\\tNote that the first argument for the parser constructor\\n\" +\n \"\\tis no longer a Token vector (since v4.0).\",\n );\n }\n\n if (typeof (tokenVocabulary as any[])[0].startOffset === \"number\") {\n throw Error(\n \"The Parser constructor no longer accepts a token vector as the first argument.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0\\n\" +\n \"\\tFor Further details.\",\n );\n }\n }\n\n if (isArray(tokenVocabulary)) {\n this.tokensMap = reduce(\n tokenVocabulary,\n (acc, tokType: TokenType) => {\n acc[tokType.name] = tokType;\n return acc;\n },\n {} as { [tokenName: string]: TokenType },\n );\n } else if (\n has(tokenVocabulary, \"modes\") &&\n every(flatten(values((<any>tokenVocabulary).modes)), isTokenType)\n ) {\n const allTokenTypes = flatten(values((<any>tokenVocabulary).modes));\n const uniqueTokens = uniq(allTokenTypes);\n this.tokensMap = <any>reduce(\n uniqueTokens,\n (acc, tokType: TokenType) => {\n acc[tokType.name] = tokType;\n return acc;\n },\n {} as { [tokenName: string]: TokenType },\n );\n } else if (isObject(tokenVocabulary)) {\n this.tokensMap = clone(tokenVocabulary as TokenTypeDictionary);\n } else {\n throw new Error(\n \"<tokensDictionary> argument must be An Array of Token constructors,\" +\n \" A dictionary of Token constructors or an IMultiModeLexerDefinition\",\n );\n }\n\n // always add EOF to the tokenNames -> constructors map. it is useful to assure all the input has been\n // parsed with a clear error message (\"expecting EOF but found ...\")\n this.tokensMap[\"EOF\"] = EOF;\n\n const allTokenTypes = has(tokenVocabulary, \"modes\")\n ? flatten(values((<any>tokenVocabulary).modes))\n : values(tokenVocabulary);\n const noTokenCategoriesUsed = every(allTokenTypes, (tokenConstructor) =>\n isEmpty(tokenConstructor.categoryMatches),\n );\n\n this.tokenMatcher = noTokenCategoriesUsed\n ? tokenStructuredMatcherNoCategories\n : tokenStructuredMatcher;\n\n // Because ES2015+ syntax should be supported for creating Token classes\n // We cannot assume that the Token classes were created using the \"extendToken\" utilities\n // Therefore we must augment the Token classes both on Lexer initialization and on Parser initialization\n augmentTokenTypes(values(this.tokensMap));\n }\n\n defineRule<ARGS extends unknown[], R>(\n this: MixedInParser,\n ruleName: string,\n impl: (...args: ARGS) => R,\n config: IRuleConfig<R>,\n ): ParserMethodInternal<ARGS, R> {\n if (this.selfAnalysisDone) {\n throw Error(\n `Grammar rule <${ruleName}> may not be defined after the 'performSelfAnalysis' method has been called'\\n` +\n `Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`,\n );\n }\n const resyncEnabled: boolean = has(config, \"resyncEnabled\")\n ? (config.resyncEnabled as boolean) // assumes end user provides the correct config value/type\n : DEFAULT_RULE_CONFIG.resyncEnabled;\n const recoveryValueFunc = has(config, \"recoveryValueFunc\")\n ? (config.recoveryValueFunc as () => R) // assumes end user provides the correct config value/type\n : DEFAULT_RULE_CONFIG.recoveryValueFunc;\n\n // performance optimization: Use small integers as keys for the longer human readable \"full\" rule names.\n // this greatly improves Map access time (as much as 8% for some performance benchmarks).\n const shortName =\n this.ruleShortNameIdx << (BITS_FOR_METHOD_TYPE + BITS_FOR_OCCURRENCE_IDX);\n\n this.ruleShortNameIdx++;\n this.shortRuleNameToFull[shortName] = ruleName;\n this.fullRuleNameToShort[ruleName] = shortName;\n\n let invokeRuleWithTry: ParserMethod<ARGS, R>;\n\n // Micro optimization, only check the condition **once** on rule definition\n // instead of **every single** rule invocation.\n if (this.outputCst === true) {\n invokeRuleWithTry = function invokeRuleWithTry(\n this: MixedInParser,\n ...args: ARGS\n ): R {\n try {\n this.ruleInvocationStateUpdate(shortName, ruleName, this.subruleIdx);\n impl.apply(this, args);\n const cst = this.CST_STACK[this.CST_STACK.length - 1];\n this.cstPostRule(cst);\n return cst as unknown as R;\n } catch (e) {\n return this.invokeRuleCatch(e, resyncEnabled, recoveryValueFunc) as R;\n } finally {\n this.ruleFinallyStateUpdate();\n }\n };\n } else {\n invokeRuleWithTry = function invokeRuleWithTryCst(\n this: MixedInParser,\n ...args: ARGS\n ): R {\n try {\n this.ruleInvocationStateUpdate(shortName, ruleName, this.subruleIdx);\n return impl.apply(this, args);\n } catch (e) {\n return this.invokeRuleCatch(e, resyncEnabled, recoveryValueFunc) as R;\n } finally {\n this.ruleFinallyStateUpdate();\n }\n };\n }\n\n const wrappedGrammarRule: ParserMethodInternal<ARGS, R> = Object.assign(\n invokeRuleWithTry as any,\n { ruleName, originalGrammarAction: impl },\n );\n\n return wrappedGrammarRule;\n }\n\n invokeRuleCatch(\n this: MixedInParser,\n e: Error,\n resyncEnabledConfig: boolean,\n recoveryValueFunc: Function,\n ): unknown {\n const isFirstInvokedRule = this.RULE_STACK.length === 1;\n // note the reSync is always enabled for the first rule invocation, because we must always be able to\n // reSync with EOF and just output some INVALID ParseTree\n // during backtracking reSync recovery is disabled, otherwise we can't be certain the backtracking\n // path is really the most valid one\n const reSyncEnabled =\n resyncEnabledConfig && !this.isBackTracking() && this.recoveryEnabled;\n\n if (isRecognitionException(e)) {\n const recogError: any = e;\n if (reSyncEnabled) {\n const reSyncTokType = this.findReSyncTokenType();\n if (this.isInCurrentRuleReSyncSet(reSyncTokType)) {\n recogError.resyncedTokens = this.reSyncTo(reSyncTokType);\n if (this.outputCst) {\n const partialCstResult: any =\n this.CST_STACK[this.CST_STACK.length - 1];\n partialCstResult.recoveredNode = true;\n return partialCstResult;\n } else {\n return recoveryValueFunc(e);\n }\n } else {\n if (this.outputCst) {\n const partialCstResult: any =\n this.CST_STACK[this.CST_STACK.length - 1];\n partialCstResult.recoveredNode = true;\n recogError.partialCstResult = partialCstResult;\n }\n // to be handled Further up the call stack\n throw recogError;\n }\n } else if (isFirstInvokedRule) {\n // otherwise a Redundant input error will be created as well and we cannot guarantee that this is indeed the case\n this.moveToTerminatedState();\n // the parser should never throw one of its own errors outside its flow.\n // even if error recovery is disabled\n return recoveryValueFunc(e);\n } else {\n // to be recovered Further up the call stack\n throw recogError;\n }\n } else {\n // some other Error type which we don't know how to handle (for example a built in JavaScript Error)\n throw e;\n }\n }\n\n // Implementation of parsing DSL\n optionInternal<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n occurrence: number,\n ): OUT | undefined {\n const key = this.getKeyForAutomaticLookahead(OPTION_IDX, occurrence);\n return this.optionInternalLogic(actionORMethodDef, occurrence, key);\n }\n\n optionInternalLogic<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n occurrence: number,\n key: number,\n ): OUT | undefined {\n let lookAheadFunc = this.getLaFuncFromCache(key);\n let action: GrammarAction<OUT>;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n const predicate = actionORMethodDef.GATE;\n // predicate present\n if (predicate !== undefined) {\n const orgLookaheadFunction = lookAheadFunc;\n lookAheadFunc = () => {\n return predicate.call(this) && orgLookaheadFunction.call(this);\n };\n }\n } else {\n action = actionORMethodDef;\n }\n\n if (lookAheadFunc.call(this) === true) {\n return action.call(this);\n }\n return undefined;\n }\n\n atLeastOneInternal<OUT>(\n this: MixedInParser,\n prodOccurrence: number,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOptsWithErr<OUT>,\n ): void {\n const laKey = this.getKeyForAutomaticLookahead(\n AT_LEAST_ONE_IDX,\n prodOccurrence,\n );\n return this.atLeastOneInternalLogic(\n prodOccurrence,\n actionORMethodDef,\n laKey,\n );\n }\n\n atLeastOneInternalLogic<OUT>(\n this: MixedInParser,\n prodOccurrence: number,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOptsWithErr<OUT>,\n key: number,\n ): void {\n let lookAheadFunc = this.getLaFuncFromCache(key);\n let action;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n const predicate = actionORMethodDef.GATE;\n // predicate present\n if (predicate !== undefined) {\n const orgLookaheadFunction = lookAheadFunc;\n lookAheadFunc = () => {\n return predicate.call(this) && orgLookaheadFunction.call(this);\n };\n }\n } else {\n action = actionORMethodDef;\n }\n\n if ((<Function>lookAheadFunc).call(this) === true) {\n let notStuck = this.doSingleRepetition(action);\n while (\n (<Function>lookAheadFunc).call(this) === true &&\n notStuck === true\n ) {\n notStuck = this.doSingleRepetition(action);\n }\n } else {\n throw this.raiseEarlyExitException(\n prodOccurrence,\n PROD_TYPE.REPETITION_MANDATORY,\n (<DSLMethodOptsWithErr<OUT>>actionORMethodDef).ERR_MSG,\n );\n }\n\n // note that while it may seem that this can cause an error because by using a recursive call to\n // AT_LEAST_ONE we change the grammar to AT_LEAST_TWO, AT_LEAST_THREE ... , the possible recursive call\n // from the tryInRepetitionRecovery(...) will only happen IFF there really are TWO/THREE/.... items.\n\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(\n this.atLeastOneInternal,\n [prodOccurrence, actionORMethodDef],\n <any>lookAheadFunc,\n AT_LEAST_ONE_IDX,\n prodOccurrence,\n NextTerminalAfterAtLeastOneWalker,\n );\n }\n\n atLeastOneSepFirstInternal<OUT>(\n this: MixedInParser,\n prodOccurrence: number,\n options: AtLeastOneSepMethodOpts<OUT>,\n ): void {\n const laKey = this.getKeyForAutomaticLookahead(\n AT_LEAST_ONE_SEP_IDX,\n prodOccurrence,\n );\n this.atLeastOneSepFirstInternalLogic(prodOccurrence, options, laKey);\n }\n\n atLeastOneSepFirstInternalLogic<OUT>(\n this: MixedInParser,\n prodOccurrence: number,\n options: AtLeastOneSepMethodOpts<OUT>,\n key: number,\n ): void {\n const action = options.DEF;\n const separator = options.SEP;\n\n const firstIterationLookaheadFunc = this.getLaFuncFromCache(key);\n\n // 1st iteration\n if (firstIterationLookaheadFunc.call(this) === true) {\n (<GrammarAction<OUT>>action).call(this);\n\n // TODO: Optimization can move this function construction into \"attemptInRepetitionRecovery\"\n // because it is only needed in error recovery scenarios.\n const separatorLookAheadFunc = () => {\n return this.tokenMatcher(this.LA(1), separator);\n };\n\n // 2nd..nth iterations\n while (this.tokenMatcher(this.LA(1), separator) === true) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n // No need for checking infinite loop here due to consuming the separator.\n (<GrammarAction<OUT>>action).call(this);\n }\n\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(\n this.repetitionSepSecondInternal,\n [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n NextTerminalAfterAtLeastOneSepWalker,\n ],\n separatorLookAheadFunc,\n AT_LEAST_ONE_SEP_IDX,\n prodOccurrence,\n NextTerminalAfterAtLeastOneSepWalker,\n );\n } else {\n throw this.raiseEarlyExitException(\n prodOccurrence,\n PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,\n options.ERR_MSG,\n );\n }\n }\n\n manyInternal<OUT>(\n this: MixedInParser,\n prodOccurrence: number,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): void {\n const laKey = this.getKeyForAutomaticLookahead(MANY_IDX, prodOccurrence);\n return this.manyInternalLogic(prodOccurrence, actionORMethodDef, laKey);\n }\n\n manyInternalLogic<OUT>(\n this: MixedInParser,\n prodOccurrence: number,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n key: number,\n ) {\n let lookaheadFunction = this.getLaFuncFromCache(key);\n let action;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n const predicate = actionORMethodDef.GATE;\n // predicate present\n if (predicate !== undefined) {\n const orgLookaheadFunction = lookaheadFunction;\n lookaheadFunction = () => {\n return predicate.call(this) && orgLookaheadFunction.call(this);\n };\n }\n } else {\n action = actionORMethodDef;\n }\n\n let notStuck = true;\n while (lookaheadFunction.call(this) === true && notStuck === true) {\n notStuck = this.doSingleRepetition(action);\n }\n\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(\n this.manyInternal,\n [prodOccurrence, actionORMethodDef],\n <any>lookaheadFunction,\n MANY_IDX,\n prodOccurrence,\n NextTerminalAfterManyWalker,\n // The notStuck parameter is only relevant when \"attemptInRepetitionRecovery\"\n // is invoked from manyInternal, in the MANY_SEP case and AT_LEAST_ONE[_SEP]\n // An infinite loop cannot occur as:\n // - Either the lookahead is guaranteed to consume something (Single Token Separator)\n // - AT_LEAST_ONE by definition is guaranteed to consume something (or error out).\n notStuck,\n );\n }\n\n manySepFirstInternal<OUT>(\n this: MixedInParser,\n prodOccurrence: number,\n options: ManySepMethodOpts<OUT>,\n ): void {\n const laKey = this.getKeyForAutomaticLookahead(\n MANY_SEP_IDX,\n prodOccurrence,\n );\n this.manySepFirstInternalLogic(prodOccurrence, options, laKey);\n }\n\n manySepFirstInternalLogic<OUT>(\n this: MixedInParser,\n prodOccurrence: number,\n options: ManySepMethodOpts<OUT>,\n key: number,\n ): void {\n const action = options.DEF;\n const separator = options.SEP;\n const firstIterationLaFunc = this.getLaFuncFromCache(key);\n\n // 1st iteration\n if (firstIterationLaFunc.call(this) === true) {\n action.call(this);\n\n const separatorLookAheadFunc = () => {\n return this.tokenMatcher(this.LA(1), separator);\n };\n // 2nd..nth iterations\n while (this.tokenMatcher(this.LA(1), separator) === true) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n // No need for checking infinite loop here due to consuming the separator.\n action.call(this);\n }\n\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(\n this.repetitionSepSecondInternal,\n [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n NextTerminalAfterManySepWalker,\n ],\n separatorLookAheadFunc,\n MANY_SEP_IDX,\n prodOccurrence,\n NextTerminalAfterManySepWalker,\n );\n }\n }\n\n repetitionSepSecondInternal<OUT>(\n this: MixedInParser,\n prodOccurrence: number,\n separator: TokenType,\n separatorLookAheadFunc: () => boolean,\n action: GrammarAction<OUT>,\n nextTerminalAfterWalker: typeof AbstractNextTerminalAfterProductionWalker,\n ): void {\n while (separatorLookAheadFunc()) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n action.call(this);\n }\n\n // we can only arrive to this function after an error\n // has occurred (hence the name 'second') so the following\n // IF will always be entered, its possible to remove it...\n // however it is kept to avoid confusion and be consistent.\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n /* istanbul ignore else */\n this.attemptInRepetitionRecovery(\n this.repetitionSepSecondInternal,\n [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n nextTerminalAfterWalker,\n ],\n separatorLookAheadFunc,\n AT_LEAST_ONE_SEP_IDX,\n prodOccurrence,\n nextTerminalAfterWalker,\n );\n }\n\n doSingleRepetition(this: MixedInParser, action: Function): any {\n const beforeIteration = this.getLexerPosition();\n action.call(this);\n const afterIteration = this.getLexerPosition();\n\n // This boolean will indicate if this repetition progressed\n // or if we are \"stuck\" (potential infinite loop in the repetition).\n return afterIteration > beforeIteration;\n }\n\n orInternal<T>(\n this: MixedInParser,\n altsOrOpts: IOrAlt<any>[] | OrMethodOpts<unknown>,\n occurrence: number,\n ): T {\n const laKey = this.getKeyForAutomaticLookahead(OR_IDX, occurrence);\n const alts = isArray(altsOrOpts) ? altsOrOpts : altsOrOpts.DEF;\n\n const laFunc = this.getLaFuncFromCache(laKey);\n const altIdxToTake = laFunc.call(this, alts);\n if (altIdxToTake !== undefined) {\n const chosenAlternative: any = alts[altIdxToTake];\n return chosenAlternative.ALT.call(this);\n }\n this.raiseNoAltException(\n occurrence,\n (altsOrOpts as OrMethodOpts<unknown>).ERR_MSG,\n );\n }\n\n ruleFinallyStateUpdate(this: MixedInParser): void {\n this.RULE_STACK.pop();\n this.RULE_OCCURRENCE_STACK.pop();\n\n // NOOP when cst is disabled\n this.cstFinallyStateUpdate();\n\n if (this.RULE_STACK.length === 0 && this.isAtEndOfInput() === false) {\n const firstRedundantTok = this.LA(1);\n const errMsg = this.errorMessageProvider.buildNotAllInputParsedMessage({\n firstRedundant: firstRedundantTok,\n ruleName: this.getCurrRuleFullName(),\n });\n this.SAVE_ERROR(\n new NotAllInputParsedException(errMsg, firstRedundantTok),\n );\n }\n }\n\n subruleInternal<ARGS extends unknown[], R>(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal<ARGS, R>,\n idx: number,\n options?: SubruleMethodOpts<ARGS>,\n ): R {\n let ruleResult;\n try {\n const args = options !== undefined ? options.ARGS : undefined;\n this.subruleIdx = idx;\n ruleResult = ruleToCall.apply(this, args);\n this.cstPostNonTerminal(\n ruleResult,\n options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : ruleToCall.ruleName,\n );\n return ruleResult;\n } catch (e) {\n throw this.subruleInternalError(e, options, ruleToCall.ruleName);\n }\n }\n\n subruleInternalError(\n this: MixedInParser,\n e: any,\n options: SubruleMethodOpts<unknown[]> | undefined,\n ruleName: string,\n ): void {\n if (isRecognitionException(e) && e.partialCstResult !== undefined) {\n this.cstPostNonTerminal(\n e.partialCstResult,\n options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : ruleName,\n );\n\n delete e.partialCstResult;\n }\n throw e;\n }\n\n consumeInternal(\n this: MixedInParser,\n tokType: TokenType,\n idx: number,\n options: ConsumeMethodOpts | undefined,\n ): IToken {\n let consumedToken!: IToken;\n try {\n const nextToken = this.LA(1);\n if (this.tokenMatcher(nextToken, tokType) === true) {\n this.consumeToken();\n consumedToken = nextToken;\n } else {\n this.consumeInternalError(tokType, nextToken, options);\n }\n } catch (eFromConsumption) {\n consumedToken = this.consumeInternalRecovery(\n tokType,\n idx,\n eFromConsumption,\n );\n }\n\n this.cstPostTerminal(\n options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : tokType.name,\n consumedToken,\n );\n return consumedToken;\n }\n\n consumeInternalError(\n this: MixedInParser,\n tokType: TokenType,\n nextToken: IToken,\n options: ConsumeMethodOpts | undefined,\n ): void {\n let msg;\n const previousToken = this.LA(0);\n if (options !== undefined && options.ERR_MSG) {\n msg = options.ERR_MSG;\n } else {\n msg = this.errorMessageProvider.buildMismatchTokenMessage({\n expected: tokType,\n actual: nextToken,\n previous: previousToken,\n ruleName: this.getCurrRuleFullName(),\n });\n }\n throw this.SAVE_ERROR(\n new MismatchedTokenException(msg, nextToken, previousToken),\n );\n }\n\n consumeInternalRecovery(\n this: MixedInParser,\n tokType: TokenType,\n idx: number,\n eFromConsumption: Error,\n ): IToken {\n // no recovery allowed during backtracking, otherwise backtracking may recover invalid syntax and accept it\n // but the original syntax could have been parsed successfully without any backtracking + recovery\n if (\n this.recoveryEnabled &&\n // TODO: more robust checking of the exception type. Perhaps Typescript extending expressions?\n eFromConsumption.name === \"MismatchedTokenException\" &&\n !this.isBackTracking()\n ) {\n const follows = this.getFollowsForInRuleRecovery(<any>tokType, idx);\n try {\n return this.tryInRuleRecovery(<any>tokType, follows);\n } catch (eFromInRuleRecovery) {\n if (eFromInRuleRecovery.name === IN_RULE_RECOVERY_EXCEPTION) {\n // failed in RuleRecovery.\n // throw the original error in order to trigger reSync error recovery\n throw eFromConsumption;\n } else {\n throw eFromInRuleRecovery;\n }\n }\n } else {\n throw eFromConsumption;\n }\n }\n\n saveRecogState(this: MixedInParser): IParserState {\n // errors is a getter which will clone the errors array\n const savedErrors = this.errors;\n const savedRuleStack = clone(this.RULE_STACK);\n return {\n errors: savedErrors,\n lexerState: this.exportLexerState(),\n RULE_STACK: savedRuleStack,\n CST_STACK: this.CST_STACK,\n };\n }\n\n reloadRecogState(this: MixedInParser, newState: IParserState) {\n this.errors = newState.errors;\n this.importLexerState(newState.lexerState);\n this.RULE_STACK = newState.RULE_STACK;\n }\n\n ruleInvocationStateUpdate(\n this: MixedInParser,\n shortName: number,\n fullName: string,\n idxInCallingRule: number,\n ): void {\n this.RULE_OCCURRENCE_STACK.push(idxInCallingRule);\n this.RULE_STACK.push(shortName);\n // NOOP when cst is disabled\n this.cstInvocationStateUpdate(fullName);\n }\n\n isBackTracking(this: MixedInParser): boolean {\n return this.isBackTrackingStack.length !== 0;\n }\n\n getCurrRuleFullName(this: MixedInParser): string {\n const shortName = this.getLastExplicitRuleShortName();\n return this.shortRuleNameToFull[shortName];\n }\n\n shortRuleNameToFullName(this: MixedInParser, shortName: number) {\n return this.shortRuleNameToFull[shortName];\n }\n\n public isAtEndOfInput(this: MixedInParser): boolean {\n return this.tokenMatcher(this.LA(1), EOF);\n }\n\n public reset(this: MixedInParser): void {\n this.resetLexerState();\n this.subruleIdx = 0;\n this.isBackTrackingStack = [];\n this.errors = [];\n this.RULE_STACK = [];\n // TODO: extract a specific reset for TreeBuilder trait\n this.CST_STACK = [];\n this.RULE_OCCURRENCE_STACK = [];\n }\n}\n", "import {\n IParserConfig,\n IParserErrorMessageProvider,\n IRecognitionException,\n} from \"@chevrotain/types\";\nimport {\n EarlyExitException,\n isRecognitionException,\n NoViableAltException,\n} from \"../../exceptions_public.js\";\nimport { clone, has } from \"lodash-es\";\nimport {\n getLookaheadPathsForOptionalProd,\n getLookaheadPathsForOr,\n PROD_TYPE,\n} from \"../../grammar/lookahead.js\";\nimport { MixedInParser } from \"./parser_traits.js\";\nimport { DEFAULT_PARSER_CONFIG } from \"../parser.js\";\n\n/**\n * Trait responsible for runtime parsing errors.\n */\nexport class ErrorHandler {\n _errors: IRecognitionException[];\n errorMessageProvider: IParserErrorMessageProvider;\n\n initErrorHandler(config: IParserConfig) {\n this._errors = [];\n this.errorMessageProvider = has(config, \"errorMessageProvider\")\n ? (config.errorMessageProvider as IParserErrorMessageProvider) // assumes end user provides the correct config value/type\n : DEFAULT_PARSER_CONFIG.errorMessageProvider;\n }\n\n SAVE_ERROR(\n this: MixedInParser,\n error: IRecognitionException,\n ): IRecognitionException {\n if (isRecognitionException(error)) {\n error.context = {\n ruleStack: this.getHumanReadableRuleStack(),\n ruleOccurrenceStack: clone(this.RULE_OCCURRENCE_STACK),\n };\n this._errors.push(error);\n return error;\n } else {\n throw Error(\n \"Trying to save an Error which is not a RecognitionException\",\n );\n }\n }\n\n get errors(): IRecognitionException[] {\n return clone(this._errors);\n }\n\n set errors(newErrors: IRecognitionException[]) {\n this._errors = newErrors;\n }\n\n // TODO: consider caching the error message computed information\n raiseEarlyExitException(\n this: MixedInParser,\n occurrence: number,\n prodType: PROD_TYPE,\n userDefinedErrMsg: string | undefined,\n ): never {\n const ruleName = this.getCurrRuleFullName();\n const ruleGrammar = this.getGAstProductions()[ruleName];\n const lookAheadPathsPerAlternative = getLookaheadPathsForOptionalProd(\n occurrence,\n ruleGrammar,\n prodType,\n this.maxLookahead,\n );\n const insideProdPaths = lookAheadPathsPerAlternative[0];\n const actualTokens = [];\n for (let i = 1; i <= this.maxLookahead; i++) {\n actualTokens.push(this.LA(i));\n }\n const msg = this.errorMessageProvider.buildEarlyExitMessage({\n expectedIterationPaths: insideProdPaths,\n actual: actualTokens,\n previous: this.LA(0),\n customUserDescription: userDefinedErrMsg,\n ruleName: ruleName,\n });\n\n throw this.SAVE_ERROR(new EarlyExitException(msg, this.LA(1), this.LA(0)));\n }\n\n // TODO: consider caching the error message computed information\n raiseNoAltException(\n this: MixedInParser,\n occurrence: number,\n errMsgTypes: string | undefined,\n ): never {\n const ruleName = this.getCurrRuleFullName();\n const ruleGrammar = this.getGAstProductions()[ruleName];\n // TODO: getLookaheadPathsForOr can be slow for large enough maxLookahead and certain grammars, consider caching ?\n const lookAheadPathsPerAlternative = getLookaheadPathsForOr(\n occurrence,\n ruleGrammar,\n this.maxLookahead,\n );\n\n const actualTokens = [];\n for (let i = 1; i <= this.maxLookahead; i++) {\n actualTokens.push(this.LA(i));\n }\n const previousToken = this.LA(0);\n\n const errMsg = this.errorMessageProvider.buildNoViableAltMessage({\n expectedPathsPerAlt: lookAheadPathsPerAlternative,\n actual: actualTokens,\n previous: previousToken,\n customUserDescription: errMsgTypes,\n ruleName: this.getCurrRuleFullName(),\n });\n\n throw this.SAVE_ERROR(\n new NoViableAltException(errMsg, this.LA(1), previousToken),\n );\n }\n}\n", "import {\n ISyntacticContentAssistPath,\n IToken,\n ITokenGrammarPath,\n TokenType,\n} from \"@chevrotain/types\";\nimport {\n NextAfterTokenWalker,\n nextPossibleTokensAfter,\n} from \"../../grammar/interpreter.js\";\nimport { first, isUndefined } from \"lodash-es\";\nimport { MixedInParser } from \"./parser_traits.js\";\n\nexport class ContentAssist {\n initContentAssist() {}\n\n public computeContentAssist(\n this: MixedInParser,\n startRuleName: string,\n precedingInput: IToken[],\n ): ISyntacticContentAssistPath[] {\n const startRuleGast = this.gastProductionsCache[startRuleName];\n\n if (isUndefined(startRuleGast)) {\n throw Error(`Rule ->${startRuleName}<- does not exist in this grammar.`);\n }\n\n return nextPossibleTokensAfter(\n [startRuleGast],\n precedingInput,\n this.tokenMatcher,\n this.maxLookahead,\n );\n }\n\n // TODO: should this be a member method or a utility? it does not have any state or usage of 'this'...\n // TODO: should this be more explicitly part of the public API?\n public getNextPossibleTokenTypes(\n this: MixedInParser,\n grammarPath: ITokenGrammarPath,\n ): TokenType[] {\n const topRuleName = first(grammarPath.ruleStack)!;\n const gastProductions = this.getGAstProductions();\n const topProduction = gastProductions[topRuleName];\n const nextPossibleTokenTypes = new NextAfterTokenWalker(\n topProduction,\n grammarPath,\n ).startWalking();\n return nextPossibleTokenTypes;\n }\n}\n", "import {\n AtLeastOneSepMethodOpts,\n ConsumeMethodOpts,\n CstNode,\n DSLMethodOpts,\n DSLMethodOptsWithErr,\n GrammarAction,\n IOrAlt,\n IParserConfig,\n IProduction,\n IToken,\n ManySepMethodOpts,\n OrMethodOpts,\n SubruleMethodOpts,\n TokenType,\n} from \"@chevrotain/types\";\nimport {\n forEach,\n has,\n isArray,\n isFunction,\n last as peek,\n some,\n} from \"lodash-es\";\nimport { MixedInParser } from \"./parser_traits.js\";\nimport {\n Alternation,\n Alternative,\n NonTerminal,\n Option,\n Repetition,\n RepetitionMandatory,\n RepetitionMandatoryWithSeparator,\n RepetitionWithSeparator,\n Rule,\n Terminal,\n} from \"@chevrotain/gast\";\nimport { Lexer } from \"../../../scan/lexer_public.js\";\nimport {\n augmentTokenTypes,\n hasShortKeyProperty,\n} from \"../../../scan/tokens.js\";\nimport {\n createToken,\n createTokenInstance,\n} from \"../../../scan/tokens_public.js\";\nimport { END_OF_FILE } from \"../parser.js\";\nimport { BITS_FOR_OCCURRENCE_IDX } from \"../../grammar/keys.js\";\nimport { ParserMethodInternal } from \"../types.js\";\n\ntype ProdWithDef = IProduction & { definition?: IProduction[] };\nconst RECORDING_NULL_OBJECT = {\n description: \"This Object indicates the Parser is during Recording Phase\",\n};\nObject.freeze(RECORDING_NULL_OBJECT);\n\nconst HANDLE_SEPARATOR = true;\nconst MAX_METHOD_IDX = Math.pow(2, BITS_FOR_OCCURRENCE_IDX) - 1;\n\nconst RFT = createToken({ name: \"RECORDING_PHASE_TOKEN\", pattern: Lexer.NA });\naugmentTokenTypes([RFT]);\nconst RECORDING_PHASE_TOKEN = createTokenInstance(\n RFT,\n \"This IToken indicates the Parser is in Recording Phase\\n\\t\" +\n \"\" +\n \"See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details\",\n // Using \"-1\" instead of NaN (as in EOF) because an actual number is less likely to\n // cause errors if the output of LA or CONSUME would be (incorrectly) used during the recording phase.\n -1,\n -1,\n -1,\n -1,\n -1,\n -1,\n);\nObject.freeze(RECORDING_PHASE_TOKEN);\n\nconst RECORDING_PHASE_CSTNODE: CstNode = {\n name:\n \"This CSTNode indicates the Parser is in Recording Phase\\n\\t\" +\n \"See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details\",\n children: {},\n};\n\n/**\n * This trait handles the creation of the GAST structure for Chevrotain Grammars\n */\nexport class GastRecorder {\n recordingProdStack: ProdWithDef[];\n RECORDING_PHASE: boolean;\n\n initGastRecorder(this: MixedInParser, config: IParserConfig): void {\n this.recordingProdStack = [];\n this.RECORDING_PHASE = false;\n }\n\n enableRecording(this: MixedInParser): void {\n this.RECORDING_PHASE = true;\n\n this.TRACE_INIT(\"Enable Recording\", () => {\n /**\n * Warning Dark Voodoo Magic upcoming!\n * We are \"replacing\" the public parsing DSL methods API\n * With **new** alternative implementations on the Parser **instance**\n *\n * So far this is the only way I've found to avoid performance regressions during parsing time.\n * - Approx 30% performance regression was measured on Chrome 75 Canary when attempting to replace the \"internal\"\n * implementations directly instead.\n */\n for (let i = 0; i < 10; i++) {\n const idx = i > 0 ? i : \"\";\n this[`CONSUME${idx}` as \"CONSUME\"] = function (arg1, arg2) {\n return this.consumeInternalRecord(arg1, i, arg2);\n };\n this[`SUBRULE${idx}` as \"SUBRULE\"] = function (arg1, arg2) {\n return this.subruleInternalRecord(arg1, i, arg2) as any;\n };\n this[`OPTION${idx}` as \"OPTION\"] = function (arg1) {\n return this.optionInternalRecord(arg1, i);\n };\n this[`OR${idx}` as \"OR\"] = function (arg1) {\n return this.orInternalRecord(arg1, i);\n };\n this[`MANY${idx}` as \"MANY\"] = function (arg1) {\n this.manyInternalRecord(i, arg1);\n };\n this[`MANY_SEP${idx}` as \"MANY_SEP\"] = function (arg1) {\n this.manySepFirstInternalRecord(i, arg1);\n };\n this[`AT_LEAST_ONE${idx}` as \"AT_LEAST_ONE\"] = function (arg1) {\n this.atLeastOneInternalRecord(i, arg1);\n };\n this[`AT_LEAST_ONE_SEP${idx}` as \"AT_LEAST_ONE_SEP\"] = function (arg1) {\n this.atLeastOneSepFirstInternalRecord(i, arg1);\n };\n }\n\n // DSL methods with the idx(suffix) as an argument\n this[`consume`] = function (idx, arg1, arg2) {\n return this.consumeInternalRecord(arg1, idx, arg2);\n };\n this[`subrule`] = function (idx, arg1, arg2) {\n return this.subruleInternalRecord(arg1, idx, arg2) as any;\n };\n this[`option`] = function (idx, arg1) {\n return this.optionInternalRecord(arg1, idx);\n };\n this[`or`] = function (idx, arg1) {\n return this.orInternalRecord(arg1, idx);\n };\n this[`many`] = function (idx, arg1) {\n this.manyInternalRecord(idx, arg1);\n };\n this[`atLeastOne`] = function (idx, arg1) {\n this.atLeastOneInternalRecord(idx, arg1);\n };\n\n this.ACTION = this.ACTION_RECORD;\n this.BACKTRACK = this.BACKTRACK_RECORD;\n this.LA = this.LA_RECORD;\n });\n }\n\n disableRecording(this: MixedInParser) {\n this.RECORDING_PHASE = false;\n // By deleting these **instance** properties, any future invocation\n // will be deferred to the original methods on the **prototype** object\n // This seems to get rid of any incorrect optimizations that V8 may\n // do during the recording phase.\n this.TRACE_INIT(\"Deleting Recording methods\", () => {\n const that: any = this;\n\n for (let i = 0; i < 10; i++) {\n const idx = i > 0 ? i : \"\";\n delete that[`CONSUME${idx}`];\n delete that[`SUBRULE${idx}`];\n delete that[`OPTION${idx}`];\n delete that[`OR${idx}`];\n delete that[`MANY${idx}`];\n delete that[`MANY_SEP${idx}`];\n delete that[`AT_LEAST_ONE${idx}`];\n delete that[`AT_LEAST_ONE_SEP${idx}`];\n }\n\n delete that[`consume`];\n delete that[`subrule`];\n delete that[`option`];\n delete that[`or`];\n delete that[`many`];\n delete that[`atLeastOne`];\n\n delete that.ACTION;\n delete that.BACKTRACK;\n delete that.LA;\n });\n }\n\n // Parser methods are called inside an ACTION?\n // Maybe try/catch/finally on ACTIONS while disabling the recorders state changes?\n // @ts-expect-error -- noop place holder\n ACTION_RECORD<T>(this: MixedInParser, impl: () => T): T {\n // NO-OP during recording\n }\n\n // Executing backtracking logic will break our recording logic assumptions\n BACKTRACK_RECORD<T>(\n grammarRule: (...args: any[]) => T,\n args?: any[],\n ): () => boolean {\n return () => true;\n }\n\n // LA is part of the official API and may be used for custom lookahead logic\n // by end users who may forget to wrap it in ACTION or inside a GATE\n LA_RECORD(howMuch: number): IToken {\n // We cannot use the RECORD_PHASE_TOKEN here because someone may depend\n // On LA return EOF at the end of the input so an infinite loop may occur.\n return END_OF_FILE;\n }\n\n topLevelRuleRecord(name: string, def: Function): Rule {\n try {\n const newTopLevelRule = new Rule({ definition: [], name: name });\n newTopLevelRule.name = name;\n this.recordingProdStack.push(newTopLevelRule);\n def.call(this);\n this.recordingProdStack.pop();\n return newTopLevelRule;\n } catch (originalError) {\n if (originalError.KNOWN_RECORDER_ERROR !== true) {\n try {\n originalError.message =\n originalError.message +\n '\\n\\t This error was thrown during the \"grammar recording phase\" For more info see:\\n\\t' +\n \"https://chevrotain.io/docs/guide/internals.html#grammar-recording\";\n } catch (mutabilityError) {\n // We may not be able to modify the original error object\n throw originalError;\n }\n }\n throw originalError;\n }\n }\n\n // Implementation of parsing DSL\n optionInternalRecord<OUT>(\n this: MixedInParser,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n occurrence: number,\n ): OUT {\n return recordProd.call(this, Option, actionORMethodDef, occurrence);\n }\n\n atLeastOneInternalRecord<OUT>(\n this: MixedInParser,\n occurrence: number,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOptsWithErr<OUT>,\n ): void {\n recordProd.call(this, RepetitionMandatory, actionORMethodDef, occurrence);\n }\n\n atLeastOneSepFirstInternalRecord<OUT>(\n this: MixedInParser,\n occurrence: number,\n options: AtLeastOneSepMethodOpts<OUT>,\n ): void {\n recordProd.call(\n this,\n RepetitionMandatoryWithSeparator,\n options,\n occurrence,\n HANDLE_SEPARATOR,\n );\n }\n\n manyInternalRecord<OUT>(\n this: MixedInParser,\n occurrence: number,\n actionORMethodDef: GrammarAction<OUT> | DSLMethodOpts<OUT>,\n ): void {\n recordProd.call(this, Repetition, actionORMethodDef, occurrence);\n }\n\n manySepFirstInternalRecord<OUT>(\n this: MixedInParser,\n occurrence: number,\n options: ManySepMethodOpts<OUT>,\n ): void {\n recordProd.call(\n this,\n RepetitionWithSeparator,\n options,\n occurrence,\n HANDLE_SEPARATOR,\n );\n }\n\n orInternalRecord<T>(\n this: MixedInParser,\n altsOrOpts: IOrAlt<any>[] | OrMethodOpts<unknown>,\n occurrence: number,\n ): T {\n return recordOrProd.call(this, altsOrOpts, occurrence);\n }\n\n subruleInternalRecord<ARGS extends unknown[], R>(\n this: MixedInParser,\n ruleToCall: ParserMethodInternal<ARGS, R>,\n occurrence: number,\n options?: SubruleMethodOpts<ARGS>,\n ): R | CstNode {\n assertMethodIdxIsValid(occurrence);\n if (!ruleToCall || has(ruleToCall, \"ruleName\") === false) {\n const error: any = new Error(\n `<SUBRULE${getIdxSuffix(occurrence)}> argument is invalid` +\n ` expecting a Parser method reference but got: <${JSON.stringify(\n ruleToCall,\n )}>` +\n `\\n inside top level rule: <${\n (<Rule>this.recordingProdStack[0]).name\n }>`,\n );\n error.KNOWN_RECORDER_ERROR = true;\n throw error;\n }\n\n const prevProd: any = peek(this.recordingProdStack);\n const ruleName = ruleToCall.ruleName;\n const newNoneTerminal = new NonTerminal({\n idx: occurrence,\n nonTerminalName: ruleName,\n label: options?.LABEL,\n // The resolving of the `referencedRule` property will be done once all the Rule's GASTs have been created\n referencedRule: undefined,\n });\n prevProd.definition.push(newNoneTerminal);\n\n return this.outputCst\n ? RECORDING_PHASE_CSTNODE\n : <any>RECORDING_NULL_OBJECT;\n }\n\n consumeInternalRecord(\n this: MixedInParser,\n tokType: TokenType,\n occurrence: number,\n options?: ConsumeMethodOpts,\n ): IToken {\n assertMethodIdxIsValid(occurrence);\n if (!hasShortKeyProperty(tokType)) {\n const error: any = new Error(\n `<CONSUME${getIdxSuffix(occurrence)}> argument is invalid` +\n ` expecting a TokenType reference but got: <${JSON.stringify(\n tokType,\n )}>` +\n `\\n inside top level rule: <${\n (<Rule>this.recordingProdStack[0]).name\n }>`,\n );\n error.KNOWN_RECORDER_ERROR = true;\n throw error;\n }\n const prevProd: any = peek(this.recordingProdStack);\n const newNoneTerminal = new Terminal({\n idx: occurrence,\n terminalType: tokType,\n label: options?.LABEL,\n });\n prevProd.definition.push(newNoneTerminal);\n\n return RECORDING_PHASE_TOKEN;\n }\n}\n\nfunction recordProd(\n prodConstructor: any,\n mainProdArg: any,\n occurrence: number,\n handleSep: boolean = false,\n): any {\n assertMethodIdxIsValid(occurrence);\n const prevProd: any = peek(this.recordingProdStack);\n const grammarAction = isFunction(mainProdArg) ? mainProdArg : mainProdArg.DEF;\n\n const newProd = new prodConstructor({ definition: [], idx: occurrence });\n if (handleSep) {\n newProd.separator = mainProdArg.SEP;\n }\n if (has(mainProdArg, \"MAX_LOOKAHEAD\")) {\n newProd.maxLookahead = mainProdArg.MAX_LOOKAHEAD;\n }\n\n this.recordingProdStack.push(newProd);\n grammarAction.call(this);\n prevProd.definition.push(newProd);\n this.recordingProdStack.pop();\n\n return RECORDING_NULL_OBJECT;\n}\n\nfunction recordOrProd(mainProdArg: any, occurrence: number): any {\n assertMethodIdxIsValid(occurrence);\n const prevProd: any = peek(this.recordingProdStack);\n // Only an array of alternatives\n const hasOptions = isArray(mainProdArg) === false;\n const alts: IOrAlt<unknown>[] =\n hasOptions === false ? mainProdArg : mainProdArg.DEF;\n\n const newOrProd = new Alternation({\n definition: [],\n idx: occurrence,\n ignoreAmbiguities: hasOptions && mainProdArg.IGNORE_AMBIGUITIES === true,\n });\n if (has(mainProdArg, \"MAX_LOOKAHEAD\")) {\n newOrProd.maxLookahead = mainProdArg.MAX_LOOKAHEAD;\n }\n\n const hasPredicates = some(alts, (currAlt: any) => isFunction(currAlt.GATE));\n newOrProd.hasPredicates = hasPredicates;\n\n prevProd.definition.push(newOrProd);\n\n forEach(alts, (currAlt) => {\n const currAltFlat = new Alternative({ definition: [] });\n newOrProd.definition.push(currAltFlat);\n if (has(currAlt, \"IGNORE_AMBIGUITIES\")) {\n currAltFlat.ignoreAmbiguities = currAlt.IGNORE_AMBIGUITIES as boolean; // assumes end user provides the correct config value/type\n }\n // **implicit** ignoreAmbiguities due to usage of gate\n else if (has(currAlt, \"GATE\")) {\n currAltFlat.ignoreAmbiguities = true;\n }\n this.recordingProdStack.push(currAltFlat);\n currAlt.ALT.call(this);\n this.recordingProdStack.pop();\n });\n return RECORDING_NULL_OBJECT;\n}\n\nfunction getIdxSuffix(idx: number): string {\n return idx === 0 ? \"\" : `${idx}`;\n}\n\nfunction assertMethodIdxIsValid(idx: number): void {\n if (idx < 0 || idx > MAX_METHOD_IDX) {\n const error: any = new Error(\n // The stack trace will contain all the needed details\n `Invalid DSL Method idx value: <${idx}>\\n\\t` +\n `Idx value must be a none negative value smaller than ${\n MAX_METHOD_IDX + 1\n }`,\n );\n error.KNOWN_RECORDER_ERROR = true;\n throw error;\n }\n}\n", "import { IParserConfig } from \"@chevrotain/types\";\nimport { has } from \"lodash-es\";\nimport { timer } from \"@chevrotain/utils\";\nimport { MixedInParser } from \"./parser_traits.js\";\nimport { DEFAULT_PARSER_CONFIG } from \"../parser.js\";\n\n/**\n * Trait responsible for runtime parsing errors.\n */\nexport class PerformanceTracer {\n traceInitPerf: boolean | number;\n traceInitMaxIdent: number;\n traceInitIndent: number;\n\n initPerformanceTracer(config: IParserConfig) {\n if (has(config, \"traceInitPerf\")) {\n const userTraceInitPerf = config.traceInitPerf;\n const traceIsNumber = typeof userTraceInitPerf === \"number\";\n this.traceInitMaxIdent = traceIsNumber\n ? <number>userTraceInitPerf\n : Infinity;\n this.traceInitPerf = traceIsNumber\n ? userTraceInitPerf > 0\n : (userTraceInitPerf as boolean); // assumes end user provides the correct config value/type\n } else {\n this.traceInitMaxIdent = 0;\n this.traceInitPerf = DEFAULT_PARSER_CONFIG.traceInitPerf;\n }\n\n this.traceInitIndent = -1;\n }\n\n TRACE_INIT<T>(this: MixedInParser, phaseDesc: string, phaseImpl: () => T): T {\n // No need to optimize this using NOOP pattern because\n // It is not called in a hot spot...\n if (this.traceInitPerf === true) {\n this.traceInitIndent++;\n const indent = new Array(this.traceInitIndent + 1).join(\"\\t\");\n if (this.traceInitIndent < this.traceInitMaxIdent) {\n console.log(`${indent}--> <${phaseDesc}>`);\n }\n const { time, value } = timer(phaseImpl);\n /* istanbul ignore next - Difficult to reproduce specific performance behavior (>10ms) in tests */\n const traceMethod = time > 10 ? console.warn : console.log;\n if (this.traceInitIndent < this.traceInitMaxIdent) {\n traceMethod(`${indent}<-- <${phaseDesc}> time: ${time}ms`);\n }\n this.traceInitIndent--;\n return value;\n } else {\n return phaseImpl();\n }\n }\n}\n", "export function applyMixins(derivedCtor: any, baseCtors: any[]) {\n baseCtors.forEach((baseCtor) => {\n const baseProto = baseCtor.prototype;\n Object.getOwnPropertyNames(baseProto).forEach((propName) => {\n if (propName === \"constructor\") {\n return;\n }\n\n const basePropDescriptor = Object.getOwnPropertyDescriptor(\n baseProto,\n propName,\n );\n // Handle Accessors\n if (\n basePropDescriptor &&\n (basePropDescriptor.get || basePropDescriptor.set)\n ) {\n Object.defineProperty(\n derivedCtor.prototype,\n propName,\n basePropDescriptor,\n );\n } else {\n derivedCtor.prototype[propName] = baseCtor.prototype[propName];\n }\n });\n });\n}\n", "import { clone, forEach, has, isEmpty, map, values } from \"lodash-es\";\nimport { toFastProperties } from \"@chevrotain/utils\";\nimport { computeAllProdsFollows } from \"../grammar/follow.js\";\nimport { createTokenInstance, EOF } from \"../../scan/tokens_public.js\";\nimport {\n defaultGrammarValidatorErrorProvider,\n defaultParserErrorProvider,\n} from \"../errors_public.js\";\nimport {\n resolveGrammar,\n validateGrammar,\n} from \"../grammar/gast/gast_resolver_public.js\";\nimport {\n CstNode,\n IParserConfig,\n IRecognitionException,\n IRuleConfig,\n IToken,\n TokenType,\n TokenVocabulary,\n} from \"@chevrotain/types\";\nimport { Recoverable } from \"./traits/recoverable.js\";\nimport { LooksAhead } from \"./traits/looksahead.js\";\nimport { TreeBuilder } from \"./traits/tree_builder.js\";\nimport { LexerAdapter } from \"./traits/lexer_adapter.js\";\nimport { RecognizerApi } from \"./traits/recognizer_api.js\";\nimport { RecognizerEngine } from \"./traits/recognizer_engine.js\";\n\nimport { ErrorHandler } from \"./traits/error_handler.js\";\nimport { MixedInParser } from \"./traits/parser_traits.js\";\nimport { ContentAssist } from \"./traits/context_assist.js\";\nimport { GastRecorder } from \"./traits/gast_recorder.js\";\nimport { PerformanceTracer } from \"./traits/perf_tracer.js\";\nimport { applyMixins } from \"./utils/apply_mixins.js\";\nimport { IParserDefinitionError } from \"../grammar/types.js\";\nimport { Rule } from \"@chevrotain/gast\";\nimport { IParserConfigInternal, ParserMethodInternal } from \"./types.js\";\nimport { validateLookahead } from \"../grammar/checks.js\";\n\nexport const END_OF_FILE = createTokenInstance(\n EOF,\n \"\",\n NaN,\n NaN,\n NaN,\n NaN,\n NaN,\n NaN,\n);\nObject.freeze(END_OF_FILE);\n\nexport type TokenMatcher = (token: IToken, tokType: TokenType) => boolean;\n\nexport const DEFAULT_PARSER_CONFIG: Required<\n Omit<IParserConfigInternal, \"lookaheadStrategy\">\n> = Object.freeze({\n recoveryEnabled: false,\n maxLookahead: 3,\n dynamicTokensEnabled: false,\n outputCst: true,\n errorMessageProvider: defaultParserErrorProvider,\n nodeLocationTracking: \"none\",\n traceInitPerf: false,\n skipValidations: false,\n});\n\nexport const DEFAULT_RULE_CONFIG: Required<IRuleConfig<any>> = Object.freeze({\n recoveryValueFunc: () => undefined,\n resyncEnabled: true,\n});\n\nexport enum ParserDefinitionErrorType {\n INVALID_RULE_NAME = 0,\n DUPLICATE_RULE_NAME = 1,\n INVALID_RULE_OVERRIDE = 2,\n DUPLICATE_PRODUCTIONS = 3,\n UNRESOLVED_SUBRULE_REF = 4,\n LEFT_RECURSION = 5,\n NONE_LAST_EMPTY_ALT = 6,\n AMBIGUOUS_ALTS = 7,\n CONFLICT_TOKENS_RULES_NAMESPACE = 8,\n INVALID_TOKEN_NAME = 9,\n NO_NON_EMPTY_LOOKAHEAD = 10,\n AMBIGUOUS_PREFIX_ALTS = 11,\n TOO_MANY_ALTS = 12,\n CUSTOM_LOOKAHEAD_VALIDATION = 13,\n}\n\nexport interface IParserDuplicatesDefinitionError\n extends IParserDefinitionError {\n dslName: string;\n occurrence: number;\n parameter?: string;\n}\n\nexport interface IParserEmptyAlternativeDefinitionError\n extends IParserDefinitionError {\n occurrence: number;\n alternative: number;\n}\n\nexport interface IParserAmbiguousAlternativesDefinitionError\n extends IParserDefinitionError {\n occurrence: number | string;\n alternatives: number[];\n}\n\nexport interface IParserUnresolvedRefDefinitionError\n extends IParserDefinitionError {\n unresolvedRefName: string;\n}\n\nexport interface IParserState {\n errors: IRecognitionException[];\n lexerState: any;\n RULE_STACK: number[];\n CST_STACK: CstNode[];\n}\n\nexport type Predicate = () => boolean;\n\nexport function EMPTY_ALT(): () => undefined;\nexport function EMPTY_ALT<T>(value: T): () => T;\nexport function EMPTY_ALT(value: any = undefined) {\n return function () {\n return value;\n };\n}\n\nexport class Parser {\n // Set this flag to true if you don't want the Parser to throw error when problems in it's definition are detected.\n // (normally during the parser's constructor).\n // This is a design time flag, it will not affect the runtime error handling of the parser, just design time errors,\n // for example: duplicate rule names, referencing an unresolved subrule, ect...\n // This flag should not be enabled during normal usage, it is used in special situations, for example when\n // needing to display the parser definition errors in some GUI(online playground).\n static DEFER_DEFINITION_ERRORS_HANDLING: boolean = false;\n\n /**\n * @deprecated use the **instance** method with the same name instead\n */\n static performSelfAnalysis(parserInstance: Parser): void {\n throw Error(\n \"The **static** `performSelfAnalysis` method has been deprecated.\" +\n \"\\t\\nUse the **instance** method with the same name instead.\",\n );\n }\n\n public performSelfAnalysis(this: MixedInParser): void {\n this.TRACE_INIT(\"performSelfAnalysis\", () => {\n let defErrorsMsgs;\n\n this.selfAnalysisDone = true;\n const className = this.className;\n\n this.TRACE_INIT(\"toFastProps\", () => {\n // Without this voodoo magic the parser would be x3-x4 slower\n // It seems it is better to invoke `toFastProperties` **before**\n // Any manipulations of the `this` object done during the recording phase.\n toFastProperties(this);\n });\n\n this.TRACE_INIT(\"Grammar Recording\", () => {\n try {\n this.enableRecording();\n // Building the GAST\n forEach(this.definedRulesNames, (currRuleName) => {\n const wrappedRule = (this as any)[\n currRuleName\n ] as ParserMethodInternal<unknown[], unknown>;\n const originalGrammarAction = wrappedRule[\"originalGrammarAction\"];\n let recordedRuleGast!: Rule;\n this.TRACE_INIT(`${currRuleName} Rule`, () => {\n recordedRuleGast = this.topLevelRuleRecord(\n currRuleName,\n originalGrammarAction,\n );\n });\n this.gastProductionsCache[currRuleName] = recordedRuleGast;\n });\n } finally {\n this.disableRecording();\n }\n });\n\n let resolverErrors: IParserDefinitionError[] = [];\n this.TRACE_INIT(\"Grammar Resolving\", () => {\n resolverErrors = resolveGrammar({\n rules: values(this.gastProductionsCache),\n });\n this.definitionErrors = this.definitionErrors.concat(resolverErrors);\n });\n\n this.TRACE_INIT(\"Grammar Validations\", () => {\n // only perform additional grammar validations IFF no resolving errors have occurred.\n // as unresolved grammar may lead to unhandled runtime exceptions in the follow up validations.\n if (isEmpty(resolverErrors) && this.skipValidations === false) {\n const validationErrors = validateGrammar({\n rules: values(this.gastProductionsCache),\n tokenTypes: values(this.tokensMap),\n errMsgProvider: defaultGrammarValidatorErrorProvider,\n grammarName: className,\n });\n const lookaheadValidationErrors = validateLookahead({\n lookaheadStrategy: this.lookaheadStrategy,\n rules: values(this.gastProductionsCache),\n tokenTypes: values(this.tokensMap),\n grammarName: className,\n });\n this.definitionErrors = this.definitionErrors.concat(\n validationErrors,\n lookaheadValidationErrors,\n );\n }\n });\n\n // this analysis may fail if the grammar is not perfectly valid\n if (isEmpty(this.definitionErrors)) {\n // The results of these computations are not needed unless error recovery is enabled.\n if (this.recoveryEnabled) {\n this.TRACE_INIT(\"computeAllProdsFollows\", () => {\n const allFollows = computeAllProdsFollows(\n values(this.gastProductionsCache),\n );\n this.resyncFollows = allFollows;\n });\n }\n\n this.TRACE_INIT(\"ComputeLookaheadFunctions\", () => {\n this.lookaheadStrategy.initialize?.({\n rules: values(this.gastProductionsCache),\n });\n this.preComputeLookaheadFunctions(values(this.gastProductionsCache));\n });\n }\n\n if (\n !Parser.DEFER_DEFINITION_ERRORS_HANDLING &&\n !isEmpty(this.definitionErrors)\n ) {\n defErrorsMsgs = map(\n this.definitionErrors,\n (defError) => defError.message,\n );\n throw new Error(\n `Parser Definition Errors detected:\\n ${defErrorsMsgs.join(\n \"\\n-------------------------------\\n\",\n )}`,\n );\n }\n });\n }\n\n definitionErrors: IParserDefinitionError[] = [];\n selfAnalysisDone = false;\n protected skipValidations: boolean;\n\n constructor(tokenVocabulary: TokenVocabulary, config: IParserConfig) {\n const that: MixedInParser = this as any;\n that.initErrorHandler(config);\n that.initLexerAdapter();\n that.initLooksAhead(config);\n that.initRecognizerEngine(tokenVocabulary, config);\n that.initRecoverable(config);\n that.initTreeBuilder(config);\n that.initContentAssist();\n that.initGastRecorder(config);\n that.initPerformanceTracer(config);\n\n if (has(config, \"ignoredIssues\")) {\n throw new Error(\n \"The <ignoredIssues> IParserConfig property has been deprecated.\\n\\t\" +\n \"Please use the <IGNORE_AMBIGUITIES> flag on the relevant DSL method instead.\\n\\t\" +\n \"See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES\\n\\t\" +\n \"For further details.\",\n );\n }\n\n this.skipValidations = has(config, \"skipValidations\")\n ? (config.skipValidations as boolean) // casting assumes the end user passing the correct type\n : DEFAULT_PARSER_CONFIG.skipValidations;\n }\n}\n\napplyMixins(Parser, [\n Recoverable,\n LooksAhead,\n TreeBuilder,\n LexerAdapter,\n RecognizerEngine,\n RecognizerApi,\n ErrorHandler,\n ContentAssist,\n GastRecorder,\n PerformanceTracer,\n]);\n\nexport class CstParser extends Parser {\n constructor(\n tokenVocabulary: TokenVocabulary,\n config: IParserConfigInternal = DEFAULT_PARSER_CONFIG,\n ) {\n const configClone = clone(config);\n configClone.outputCst = true;\n super(tokenVocabulary, configClone);\n }\n}\n\nexport class EmbeddedActionsParser extends Parser {\n constructor(\n tokenVocabulary: TokenVocabulary,\n config: IParserConfigInternal = DEFAULT_PARSER_CONFIG,\n ) {\n const configClone = clone(config);\n configClone.outputCst = false;\n super(tokenVocabulary, configClone);\n }\n}\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport map from \"lodash-es/map.js\"\r\nimport filter from \"lodash-es/filter.js\"\r\nimport {\r\n IProduction,\r\n IProductionWithOccurrence,\r\n TokenType,\r\n Alternation,\r\n NonTerminal,\r\n Rule,\r\n Option,\r\n RepetitionMandatory,\r\n Repetition,\r\n Terminal,\r\n Alternative,\r\n RepetitionWithSeparator,\r\n RepetitionMandatoryWithSeparator,\r\n LookaheadProductionType\r\n} from \"chevrotain\"\r\n\r\nexport function buildATNKey(rule: Rule, type: LookaheadProductionType, occurrence: number): string {\r\n return `${rule.name}_${type}_${occurrence}`;\r\n}\r\n\r\nexport interface ATN {\r\n decisionMap: Record<string, DecisionState>\r\n states: ATNState[]\r\n decisionStates: DecisionState[]\r\n ruleToStartState: Map<Rule, RuleStartState>\r\n ruleToStopState: Map<Rule, RuleStopState>\r\n}\r\n\r\nexport const ATN_INVALID_TYPE = 0\r\nexport const ATN_BASIC = 1\r\nexport const ATN_RULE_START = 2\r\nexport const ATN_PLUS_BLOCK_START = 4\r\nexport const ATN_STAR_BLOCK_START = 5\r\n// Currently unused as the ATN is not used for lexing\r\nexport const ATN_TOKEN_START = 6\r\nexport const ATN_RULE_STOP = 7\r\nexport const ATN_BLOCK_END = 8\r\nexport const ATN_STAR_LOOP_BACK = 9\r\nexport const ATN_STAR_LOOP_ENTRY = 10\r\nexport const ATN_PLUS_LOOP_BACK = 11\r\nexport const ATN_LOOP_END = 12\r\n\r\nexport type ATNState =\r\n | BasicState\r\n | BasicBlockStartState\r\n | PlusBlockStartState\r\n | PlusLoopbackState\r\n | StarBlockStartState\r\n | StarLoopbackState\r\n | StarLoopEntryState\r\n | BlockEndState\r\n | RuleStartState\r\n | RuleStopState\r\n | LoopEndState\r\n\r\nexport interface ATNBaseState {\r\n atn: ATN\r\n production: IProductionWithOccurrence\r\n stateNumber: number\r\n rule: Rule\r\n epsilonOnlyTransitions: boolean\r\n transitions: Transition[]\r\n nextTokenWithinRule: number[]\r\n}\r\n\r\nexport interface BasicState extends ATNBaseState {\r\n type: typeof ATN_BASIC\r\n}\r\n\r\nexport interface BlockStartState extends DecisionState {\r\n end: BlockEndState\r\n}\r\n\r\nexport interface BasicBlockStartState extends BlockStartState {\r\n type: typeof ATN_BASIC\r\n}\r\n\r\nexport interface PlusBlockStartState extends BlockStartState {\r\n loopback: PlusLoopbackState\r\n type: typeof ATN_PLUS_BLOCK_START\r\n}\r\n\r\nexport interface PlusLoopbackState extends DecisionState {\r\n type: typeof ATN_PLUS_LOOP_BACK\r\n}\r\n\r\nexport interface StarBlockStartState extends BlockStartState {\r\n type: typeof ATN_STAR_BLOCK_START\r\n}\r\n\r\nexport interface StarLoopbackState extends ATNBaseState {\r\n type: typeof ATN_STAR_LOOP_BACK\r\n}\r\n\r\nexport interface StarLoopEntryState extends DecisionState {\r\n loopback: StarLoopbackState\r\n type: typeof ATN_STAR_LOOP_ENTRY\r\n}\r\n\r\nexport interface BlockEndState extends ATNBaseState {\r\n start: BlockStartState\r\n type: typeof ATN_BLOCK_END\r\n}\r\n\r\nexport interface DecisionState extends ATNBaseState {\r\n decision: number\r\n}\r\n\r\nexport interface LoopEndState extends ATNBaseState {\r\n loopback: ATNState\r\n type: typeof ATN_LOOP_END\r\n}\r\n\r\nexport interface RuleStartState extends ATNBaseState {\r\n stop: RuleStopState\r\n type: typeof ATN_RULE_START\r\n}\r\n\r\nexport interface RuleStopState extends ATNBaseState {\r\n type: typeof ATN_RULE_STOP\r\n}\r\n\r\nexport interface Transition {\r\n target: ATNState\r\n isEpsilon(): boolean\r\n}\r\n\r\nexport abstract class AbstractTransition implements Transition {\r\n target: ATNState\r\n\r\n constructor(target: ATNState) {\r\n this.target = target\r\n }\r\n\r\n isEpsilon() {\r\n return false\r\n }\r\n}\r\n\r\nexport class AtomTransition extends AbstractTransition {\r\n tokenType: TokenType\r\n\r\n constructor(target: ATNState, tokenType: TokenType) {\r\n super(target)\r\n this.tokenType = tokenType\r\n }\r\n}\r\n\r\nexport class EpsilonTransition extends AbstractTransition {\r\n constructor(target: ATNState) {\r\n super(target)\r\n }\r\n\r\n isEpsilon() {\r\n return true\r\n }\r\n}\r\n\r\nexport class RuleTransition extends AbstractTransition {\r\n rule: Rule\r\n followState: ATNState\r\n\r\n constructor(ruleStart: RuleStartState, rule: Rule, followState: ATNState) {\r\n super(ruleStart)\r\n this.rule = rule\r\n this.followState = followState\r\n }\r\n\r\n isEpsilon() {\r\n return true\r\n }\r\n}\r\n\r\ninterface ATNHandle {\r\n left: ATNState\r\n right: ATNState\r\n}\r\n\r\nexport function createATN(rules: Rule[]): ATN {\r\n const atn: ATN = {\r\n decisionMap: {},\r\n decisionStates: [],\r\n ruleToStartState: new Map(),\r\n ruleToStopState: new Map(),\r\n states: []\r\n }\r\n createRuleStartAndStopATNStates(atn, rules)\r\n const ruleLength = rules.length\r\n for (let i = 0; i < ruleLength; i++) {\r\n const rule = rules[i]\r\n const ruleBlock = block(atn, rule, rule)\r\n if (ruleBlock === undefined) {\r\n continue\r\n }\r\n buildRuleHandle(atn, rule, ruleBlock)\r\n }\r\n return atn\r\n}\r\n\r\nfunction createRuleStartAndStopATNStates(atn: ATN, rules: Rule[]): void {\r\n const ruleLength = rules.length\r\n for (let i = 0; i < ruleLength; i++) {\r\n const rule = rules[i]\r\n const start = newState<RuleStartState>(atn, rule, undefined, {\r\n type: ATN_RULE_START\r\n })\r\n const stop = newState<RuleStopState>(atn, rule, undefined, {\r\n type: ATN_RULE_STOP\r\n })\r\n start.stop = stop\r\n atn.ruleToStartState.set(rule, start)\r\n atn.ruleToStopState.set(rule, stop)\r\n }\r\n}\r\n\r\nfunction atom(\r\n atn: ATN,\r\n rule: Rule,\r\n production: IProduction\r\n): ATNHandle | undefined {\r\n if (production instanceof Terminal) {\r\n return tokenRef(atn, rule, production.terminalType, production)\r\n } else if (production instanceof NonTerminal) {\r\n return ruleRef(atn, rule, production)\r\n } else if (production instanceof Alternation) {\r\n return alternation(atn, rule, production)\r\n } else if (production instanceof Option) {\r\n return option(atn, rule, production)\r\n } else if (production instanceof Repetition) {\r\n return repetition(atn, rule, production)\r\n } else if (production instanceof RepetitionWithSeparator) {\r\n return repetitionSep(atn, rule, production)\r\n } else if (production instanceof RepetitionMandatory) {\r\n return repetitionMandatory(atn, rule, production)\r\n } else if (production instanceof RepetitionMandatoryWithSeparator) {\r\n return repetitionMandatorySep(atn, rule, production)\r\n } else {\r\n return block(atn, rule, production as Alternative)\r\n }\r\n}\r\n\r\nfunction repetition(atn: ATN, rule: Rule, repetition: Repetition): ATNHandle {\r\n const starState = newState<StarBlockStartState>(atn, rule, repetition, {\r\n type: ATN_STAR_BLOCK_START\r\n })\r\n defineDecisionState(atn, starState)\r\n const handle = makeAlts(\r\n atn,\r\n rule,\r\n starState,\r\n repetition,\r\n block(atn, rule, repetition)\r\n )\r\n return star(atn, rule, repetition, handle)\r\n}\r\n\r\nfunction repetitionSep(\r\n atn: ATN,\r\n rule: Rule,\r\n repetition: RepetitionWithSeparator\r\n): ATNHandle {\r\n const starState = newState<StarBlockStartState>(atn, rule, repetition, {\r\n type: ATN_STAR_BLOCK_START\r\n })\r\n defineDecisionState(atn, starState)\r\n const handle = makeAlts(\r\n atn,\r\n rule,\r\n starState,\r\n repetition,\r\n block(atn, rule, repetition)\r\n )\r\n const sep = tokenRef(atn, rule, repetition.separator, repetition)\r\n return star(atn, rule, repetition, handle, sep)\r\n}\r\n\r\nfunction repetitionMandatory(\r\n atn: ATN,\r\n rule: Rule,\r\n repetition: RepetitionMandatory\r\n): ATNHandle {\r\n const plusState = newState<PlusBlockStartState>(atn, rule, repetition, {\r\n type: ATN_PLUS_BLOCK_START\r\n })\r\n defineDecisionState(atn, plusState)\r\n const handle = makeAlts(\r\n atn,\r\n rule,\r\n plusState,\r\n repetition,\r\n block(atn, rule, repetition)\r\n )\r\n return plus(atn, rule, repetition, handle)\r\n}\r\n\r\nfunction repetitionMandatorySep(\r\n atn: ATN,\r\n rule: Rule,\r\n repetition: RepetitionMandatoryWithSeparator\r\n): ATNHandle {\r\n const plusState = newState<PlusBlockStartState>(atn, rule, repetition, {\r\n type: ATN_PLUS_BLOCK_START\r\n })\r\n defineDecisionState(atn, plusState)\r\n const handle = makeAlts(\r\n atn,\r\n rule,\r\n plusState,\r\n repetition,\r\n block(atn, rule, repetition)\r\n )\r\n const sep = tokenRef(atn, rule, repetition.separator, repetition)\r\n return plus(atn, rule, repetition, handle, sep)\r\n}\r\n\r\nfunction alternation(\r\n atn: ATN,\r\n rule: Rule,\r\n alternation: Alternation\r\n): ATNHandle {\r\n const start = newState<BasicBlockStartState>(atn, rule, alternation, {\r\n type: ATN_BASIC\r\n })\r\n defineDecisionState(atn, start)\r\n const alts = map(alternation.definition, (e) => atom(atn, rule, e))\r\n const handle = makeAlts(atn, rule, start, alternation, ...alts)\r\n return handle\r\n}\r\n\r\nfunction option(atn: ATN, rule: Rule, option: Option): ATNHandle {\r\n const start = newState<BasicBlockStartState>(atn, rule, option, {\r\n type: ATN_BASIC\r\n })\r\n defineDecisionState(atn, start)\r\n const handle = makeAlts(atn, rule, start, option, block(atn, rule, option))\r\n return optional(atn, rule, option, handle)\r\n}\r\n\r\nfunction block(\r\n atn: ATN,\r\n rule: Rule,\r\n block: { definition: IProduction[] }\r\n): ATNHandle | undefined {\r\n const handles = filter(\r\n map(block.definition, (e) => atom(atn, rule, e)),\r\n (e) => e !== undefined\r\n ) as ATNHandle[]\r\n if (handles.length === 1) {\r\n return handles[0]\r\n } else if (handles.length === 0) {\r\n return undefined\r\n } else {\r\n return makeBlock(atn, handles)\r\n }\r\n}\r\n\r\nfunction plus(\r\n atn: ATN,\r\n rule: Rule,\r\n plus: IProductionWithOccurrence,\r\n handle: ATNHandle,\r\n sep?: ATNHandle\r\n): ATNHandle {\r\n const blkStart = handle.left as PlusBlockStartState\r\n const blkEnd = handle.right\r\n\r\n const loop = newState<PlusLoopbackState>(atn, rule, plus, {\r\n type: ATN_PLUS_LOOP_BACK\r\n })\r\n defineDecisionState(atn, loop)\r\n const end = newState<LoopEndState>(atn, rule, plus, {\r\n type: ATN_LOOP_END\r\n })\r\n blkStart.loopback = loop\r\n end.loopback = loop\r\n atn.decisionMap[buildATNKey(rule, sep ? 'RepetitionMandatoryWithSeparator' : 'RepetitionMandatory', plus.idx)] = loop;\r\n epsilon(blkEnd, loop) // block can see loop back\r\n\r\n // Depending on whether we have a separator we put the exit transition at index 1 or 0\r\n // This influences the chosen option in the lookahead DFA\r\n if (sep === undefined) {\r\n epsilon(loop, blkStart) // loop back to start\r\n epsilon(loop, end) // exit\r\n } else {\r\n epsilon(loop, end) // exit\r\n // loop back to start with separator\r\n epsilon(loop, sep.left)\r\n epsilon(sep.right, blkStart)\r\n }\r\n\r\n return {\r\n left: blkStart,\r\n right: end\r\n }\r\n}\r\n\r\nfunction star(\r\n atn: ATN,\r\n rule: Rule,\r\n star: IProductionWithOccurrence,\r\n handle: ATNHandle,\r\n sep?: ATNHandle\r\n): ATNHandle {\r\n const start = handle.left\r\n const end = handle.right\r\n\r\n const entry = newState<StarLoopEntryState>(atn, rule, star, {\r\n type: ATN_STAR_LOOP_ENTRY\r\n })\r\n defineDecisionState(atn, entry)\r\n const loopEnd = newState<LoopEndState>(atn, rule, star, {\r\n type: ATN_LOOP_END\r\n })\r\n const loop = newState<StarLoopbackState>(atn, rule, star, {\r\n type: ATN_STAR_LOOP_BACK\r\n })\r\n entry.loopback = loop\r\n loopEnd.loopback = loop\r\n\r\n epsilon(entry, start) // loop enter edge (alt 2)\r\n epsilon(entry, loopEnd) // bypass loop edge (alt 1)\r\n epsilon(end, loop) // block end hits loop back\r\n\r\n if (sep !== undefined) {\r\n epsilon(loop, loopEnd) // end loop\r\n // loop back to start of handle using separator\r\n epsilon(loop, sep.left)\r\n epsilon(sep.right, start)\r\n } else {\r\n epsilon(loop, entry) // loop back to entry/exit decision\r\n }\r\n\r\n atn.decisionMap[buildATNKey(rule, sep ? 'RepetitionWithSeparator' : 'Repetition', star.idx)] = entry;\r\n return {\r\n left: entry,\r\n right: loopEnd\r\n }\r\n}\r\n\r\nfunction optional(atn: ATN, rule: Rule, optional: Option, handle: ATNHandle): ATNHandle {\r\n const start = handle.left as DecisionState\r\n const end = handle.right\r\n\r\n epsilon(start, end)\r\n\r\n atn.decisionMap[buildATNKey(rule, 'Option', optional.idx)] = start;\r\n return handle\r\n}\r\n\r\nfunction defineDecisionState(atn: ATN, state: DecisionState): number {\r\n atn.decisionStates.push(state)\r\n state.decision = atn.decisionStates.length - 1\r\n return state.decision\r\n}\r\n\r\nfunction makeAlts(\r\n atn: ATN,\r\n rule: Rule,\r\n start: BlockStartState,\r\n production: IProductionWithOccurrence,\r\n ...alts: (ATNHandle | undefined)[]\r\n): ATNHandle {\r\n const end = newState<BlockEndState>(atn, rule, production, {\r\n type: ATN_BLOCK_END,\r\n start\r\n })\r\n start.end = end\r\n for (const alt of alts) {\r\n if (alt !== undefined) {\r\n // hook alts up to decision block\r\n epsilon(start, alt.left)\r\n epsilon(alt.right, end)\r\n } else {\r\n epsilon(start, end)\r\n }\r\n }\r\n\r\n const handle: ATNHandle = {\r\n left: start as ATNState,\r\n right: end\r\n }\r\n atn.decisionMap[buildATNKey(rule, getProdType(production), production.idx)] = start\r\n return handle\r\n}\r\n\r\nfunction getProdType(production: IProduction): LookaheadProductionType {\r\n if (production instanceof Alternation) {\r\n return 'Alternation';\r\n } else if (production instanceof Option) {\r\n return 'Option';\r\n } else if (production instanceof Repetition) {\r\n return 'Repetition';\r\n } else if (production instanceof RepetitionWithSeparator) {\r\n return 'RepetitionWithSeparator';\r\n } else if (production instanceof RepetitionMandatory) {\r\n return 'RepetitionMandatory';\r\n } else if (production instanceof RepetitionMandatoryWithSeparator) {\r\n return 'RepetitionMandatoryWithSeparator';\r\n } else {\r\n throw new Error('Invalid production type encountered');\r\n }\r\n}\r\n\r\nfunction makeBlock(atn: ATN, alts: ATNHandle[]): ATNHandle {\r\n const altsLength = alts.length\r\n for (let i = 0; i < altsLength - 1; i++) {\r\n const handle = alts[i]\r\n let transition: Transition | undefined\r\n if (handle.left.transitions.length === 1) {\r\n transition = handle.left.transitions[0]\r\n }\r\n const isRuleTransition = transition instanceof RuleTransition\r\n const ruleTransition = transition as RuleTransition\r\n const next = alts[i + 1].left\r\n if (\r\n handle.left.type === ATN_BASIC &&\r\n handle.right.type === ATN_BASIC &&\r\n transition !== undefined &&\r\n ((isRuleTransition && ruleTransition.followState === handle.right) ||\r\n transition.target === handle.right)\r\n ) {\r\n // we can avoid epsilon edge to next element\r\n if (isRuleTransition) {\r\n ruleTransition.followState = next\r\n } else {\r\n transition.target = next\r\n }\r\n removeState(atn, handle.right) // we skipped over this state\r\n } else {\r\n // need epsilon if previous block's right end node is complex\r\n epsilon(handle.right, next)\r\n }\r\n }\r\n\r\n const first = alts[0]\r\n const last = alts[altsLength - 1]\r\n return {\r\n left: first.left,\r\n right: last.right\r\n }\r\n}\r\n\r\nfunction tokenRef(\r\n atn: ATN,\r\n rule: Rule,\r\n tokenType: TokenType,\r\n production: IProductionWithOccurrence\r\n): ATNHandle {\r\n const left = newState<BasicState>(atn, rule, production, {\r\n type: ATN_BASIC\r\n })\r\n const right = newState<BasicState>(atn, rule, production, {\r\n type: ATN_BASIC\r\n })\r\n addTransition(left, new AtomTransition(right, tokenType))\r\n return {\r\n left,\r\n right\r\n }\r\n}\r\n\r\nfunction ruleRef(\r\n atn: ATN,\r\n currentRule: Rule,\r\n nonTerminal: NonTerminal\r\n): ATNHandle {\r\n const rule = nonTerminal.referencedRule\r\n const start = atn.ruleToStartState.get(rule)!\r\n const left = newState<BasicBlockStartState>(atn, currentRule, nonTerminal, {\r\n type: ATN_BASIC\r\n })\r\n const right = newState<BasicBlockStartState>(atn, currentRule, nonTerminal, {\r\n type: ATN_BASIC\r\n })\r\n\r\n const call = new RuleTransition(start, rule, right)\r\n addTransition(left, call)\r\n\r\n return {\r\n left,\r\n right\r\n }\r\n}\r\n\r\nfunction buildRuleHandle(atn: ATN, rule: Rule, block: ATNHandle): ATNHandle {\r\n const start = atn.ruleToStartState.get(rule)!\r\n epsilon(start, block.left)\r\n const stop = atn.ruleToStopState.get(rule)!\r\n epsilon(block.right, stop)\r\n const handle: ATNHandle = {\r\n left: start,\r\n right: stop\r\n }\r\n return handle\r\n}\r\n\r\nfunction epsilon(a: ATNBaseState, b: ATNBaseState): void {\r\n const transition = new EpsilonTransition(b as ATNState)\r\n addTransition(a, transition)\r\n}\r\n\r\nfunction newState<T extends ATNState>(\r\n atn: ATN,\r\n rule: Rule,\r\n production: IProductionWithOccurrence | undefined,\r\n partial: Partial<T>\r\n): T {\r\n const t: T = {\r\n atn,\r\n production,\r\n epsilonOnlyTransitions: false,\r\n rule,\r\n transitions: [],\r\n nextTokenWithinRule: [],\r\n stateNumber: atn.states.length,\r\n ...partial\r\n } as unknown as T\r\n atn.states.push(t)\r\n return t\r\n}\r\n\r\nfunction addTransition(state: ATNBaseState, transition: Transition) {\r\n // A single ATN state can only contain epsilon transitions or non-epsilon transitions\r\n // Because they are never mixed, only setting the property for the first transition is fine\r\n if (state.transitions.length === 0) {\r\n state.epsilonOnlyTransitions = transition.isEpsilon()\r\n }\r\n state.transitions.push(transition)\r\n}\r\n\r\nfunction removeState(atn: ATN, state: ATNState): void {\r\n atn.states.splice(atn.states.indexOf(state), 1)\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport map from \"lodash-es/map.js\"\r\nimport { ATNState, DecisionState } from \"./atn.js\"\r\n\r\nexport interface DFA {\r\n start?: DFAState\r\n states: Record<string, DFAState>\r\n decision: number\r\n atnStartState: DecisionState\r\n}\r\n\r\nexport interface DFAState {\r\n configs: ATNConfigSet\r\n edges: Record<number, DFAState>\r\n isAcceptState: boolean\r\n prediction: number\r\n}\r\n\r\nexport const DFA_ERROR = {} as DFAState\r\n\r\nexport interface ATNConfig {\r\n state: ATNState\r\n alt: number\r\n stack: ATNState[]\r\n}\r\n\r\nexport class ATNConfigSet {\r\n private map: Record<string, number> = {}\r\n private configs: ATNConfig[] = []\r\n\r\n uniqueAlt: number | undefined\r\n\r\n get size(): number {\r\n return this.configs.length\r\n }\r\n\r\n finalize(): void {\r\n // Empties the map to free up memory\r\n this.map = {}\r\n }\r\n\r\n add(config: ATNConfig): void {\r\n const key = getATNConfigKey(config)\r\n // Only add configs which don't exist in our map already\r\n // While this does not influence the actual algorithm, adding them anyway would massively increase memory consumption\r\n if (!(key in this.map)) {\r\n this.map[key] = this.configs.length\r\n this.configs.push(config)\r\n }\r\n }\r\n\r\n get elements(): readonly ATNConfig[] {\r\n return this.configs\r\n }\r\n\r\n get alts(): number[] {\r\n return map(this.configs, (e) => e.alt)\r\n }\r\n\r\n get key(): string {\r\n let value = \"\"\r\n for (const k in this.map) {\r\n value += k + \":\"\r\n }\r\n return value\r\n }\r\n}\r\n\r\nexport function getATNConfigKey(config: ATNConfig, alt = true) {\r\n return `${alt ? `a${config.alt}` : \"\"}s${\r\n config.state.stateNumber\r\n }:${config.stack.map((e) => e.stateNumber.toString()).join(\"_\")}`\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport {\r\n IToken,\r\n TokenType,\r\n tokenMatcher,\r\n tokenLabel,\r\n Rule,\r\n IProductionWithOccurrence,\r\n NonTerminal,\r\n Alternation,\r\n Option,\r\n RepetitionMandatory,\r\n RepetitionMandatoryWithSeparator,\r\n RepetitionWithSeparator,\r\n Repetition,\r\n Terminal,\r\n BaseParser,\r\n LLkLookaheadStrategy,\r\n ILookaheadValidationError,\r\n IOrAlt,\r\n getLookaheadPaths,\r\n OptionalProductionType\r\n} from \"chevrotain\";\r\nimport {\r\n ATN,\r\n ATNState,\r\n ATN_RULE_STOP,\r\n AtomTransition,\r\n buildATNKey,\r\n createATN,\r\n DecisionState,\r\n EpsilonTransition,\r\n RuleTransition,\r\n Transition\r\n} from \"./atn.js\";\r\nimport {\r\n ATNConfig,\r\n ATNConfigSet,\r\n DFA,\r\n DFAState,\r\n DFA_ERROR,\r\n getATNConfigKey\r\n} from \"./dfa.js\";\r\nimport min from \"lodash-es/min.js\";\r\nimport flatMap from \"lodash-es/flatMap.js\";\r\nimport uniqBy from \"lodash-es/uniqBy.js\";\r\nimport map from \"lodash-es/map.js\";\r\nimport flatten from \"lodash-es/flatten.js\";\r\nimport forEach from \"lodash-es/forEach.js\";\r\nimport isEmpty from \"lodash-es/isEmpty.js\";\r\nimport reduce from \"lodash-es/reduce.js\";\r\n\r\ntype DFACache = (predicateSet: PredicateSet) => DFA\r\n\r\nexport type AmbiguityReport = (message: string) => void;\r\n\r\nfunction createDFACache(startState: DecisionState, decision: number): DFACache {\r\n const map: Record<string, DFA | undefined> = {}\r\n return (predicateSet) => {\r\n const key = predicateSet.toString()\r\n let existing = map[key]\r\n if (existing !== undefined) {\r\n return existing\r\n } else {\r\n existing = {\r\n atnStartState: startState,\r\n decision,\r\n states: {}\r\n }\r\n map[key] = existing\r\n return existing\r\n }\r\n }\r\n}\r\n\r\nclass PredicateSet {\r\n private predicates: boolean[] = []\r\n\r\n is(index: number): boolean {\r\n return index >= this.predicates.length || this.predicates[index]\r\n }\r\n\r\n set(index: number, value: boolean) {\r\n this.predicates[index] = value\r\n }\r\n\r\n toString(): string {\r\n let value = \"\"\r\n const size = this.predicates.length\r\n for (let i = 0; i < size; i++) {\r\n value += this.predicates[i] === true ? \"1\" : \"0\"\r\n }\r\n return value\r\n }\r\n}\r\n\r\ninterface AdaptivePredictError {\r\n tokenPath: IToken[]\r\n possibleTokenTypes: TokenType[]\r\n actualToken: IToken\r\n}\r\n\r\nconst EMPTY_PREDICATES = new PredicateSet()\r\n\r\nexport interface LLStarLookaheadOptions {\r\n logging?: AmbiguityReport\r\n}\r\n\r\nexport class LLStarLookaheadStrategy extends LLkLookaheadStrategy {\r\n\r\n private atn: ATN;\r\n private dfas: DFACache[];\r\n private logging: AmbiguityReport;\r\n\r\n constructor(options?: LLStarLookaheadOptions) {\r\n super();\r\n this.logging = options?.logging ?? ((message) => console.log(message));\r\n }\r\n\r\n override initialize(options: { rules: Rule[] }): void {\r\n this.atn = createATN(options.rules);\r\n this.dfas = initATNSimulator(this.atn);\r\n }\r\n\r\n override validateAmbiguousAlternationAlternatives(): ILookaheadValidationError[] {\r\n return [];\r\n }\r\n\r\n override validateEmptyOrAlternatives(): ILookaheadValidationError[] {\r\n return [];\r\n }\r\n\r\n override buildLookaheadForAlternation(options: {\r\n prodOccurrence: number;\r\n rule: Rule;\r\n maxLookahead: number;\r\n hasPredicates: boolean;\r\n dynamicTokensEnabled: boolean\r\n }): (this: BaseParser, orAlts?: IOrAlt<any>[] | undefined) => number | undefined {\r\n const { prodOccurrence, rule, hasPredicates, dynamicTokensEnabled } = options;\r\n const dfas = this.dfas;\r\n const logging = this.logging;\r\n const key = buildATNKey(rule, 'Alternation', prodOccurrence);\r\n const decisionState = this.atn.decisionMap[key];\r\n const decisionIndex = decisionState.decision;\r\n const partialAlts: (TokenType | undefined)[][] = map(\r\n getLookaheadPaths({\r\n maxLookahead: 1,\r\n occurrence: prodOccurrence,\r\n prodType: \"Alternation\",\r\n rule: rule\r\n }),\r\n (currAlt) => map(currAlt, (path) => path[0])\r\n )\r\n\r\n if (isLL1Sequence(partialAlts, false) && !dynamicTokensEnabled) {\r\n const choiceToAlt = reduce(\r\n partialAlts,\r\n (result, currAlt, idx) => {\r\n forEach(currAlt, (currTokType) => {\r\n if (currTokType) {\r\n result[currTokType.tokenTypeIdx!] = idx\r\n forEach(currTokType.categoryMatches!, (currExtendingType) => {\r\n result[currExtendingType] = idx\r\n })\r\n }\r\n })\r\n return result\r\n },\r\n {} as Record<number, number>\r\n )\r\n\r\n if (hasPredicates) {\r\n return function (this: BaseParser, orAlts) {\r\n const nextToken = this.LA(1)\r\n const prediction: number | undefined = choiceToAlt[nextToken.tokenTypeIdx]\r\n if (orAlts !== undefined && prediction !== undefined) {\r\n const gate = orAlts[prediction]?.GATE\r\n if (gate !== undefined && gate.call(this) === false) {\r\n return undefined;\r\n }\r\n }\r\n return prediction\r\n }\r\n } else {\r\n return function (this: BaseParser): number | undefined {\r\n const nextToken = this.LA(1)\r\n return choiceToAlt[nextToken.tokenTypeIdx];\r\n }\r\n }\r\n } else if (hasPredicates) {\r\n return function (this: BaseParser, orAlts) {\r\n const predicates = new PredicateSet()\r\n const length = orAlts === undefined ? 0 : orAlts.length\r\n for (let i = 0; i < length; i++) {\r\n const gate = orAlts?.[i].GATE\r\n predicates.set(i, gate === undefined || gate.call(this))\r\n }\r\n const result = adaptivePredict.call(this, dfas, decisionIndex, predicates, logging);\r\n return typeof result === 'number' ? result : undefined;\r\n }\r\n } else {\r\n return function (this: BaseParser) {\r\n const result = adaptivePredict.call(this, dfas, decisionIndex, EMPTY_PREDICATES, logging);\r\n return typeof result === 'number' ? result : undefined;\r\n }\r\n }\r\n }\r\n\r\n override buildLookaheadForOptional(options: {\r\n prodOccurrence: number;\r\n prodType: OptionalProductionType;\r\n rule: Rule;\r\n maxLookahead: number;\r\n dynamicTokensEnabled: boolean\r\n }): (this: BaseParser) => boolean {\r\n const { prodOccurrence, rule, prodType, dynamicTokensEnabled } = options;\r\n const dfas = this.dfas;\r\n const logging = this.logging;\r\n const key = buildATNKey(rule, prodType, prodOccurrence);\r\n const decisionState = this.atn.decisionMap[key];\r\n const decisionIndex = decisionState.decision;\r\n const alts = map(\r\n getLookaheadPaths({\r\n maxLookahead: 1,\r\n occurrence: prodOccurrence,\r\n prodType,\r\n rule\r\n }),\r\n (e) => {\r\n return map(e, (g) => g[0])\r\n }\r\n )\r\n \r\n if (isLL1Sequence(alts) && alts[0][0] && !dynamicTokensEnabled) {\r\n const alt = alts[0]\r\n const singleTokensTypes = flatten(alt)\r\n \r\n if (\r\n singleTokensTypes.length === 1 &&\r\n isEmpty(singleTokensTypes[0].categoryMatches)\r\n ) {\r\n const expectedTokenType = singleTokensTypes[0]\r\n const expectedTokenUniqueKey = expectedTokenType.tokenTypeIdx\r\n \r\n return function (this: BaseParser): boolean {\r\n return this.LA(1).tokenTypeIdx === expectedTokenUniqueKey\r\n }\r\n } else {\r\n const choiceToAlt = reduce(\r\n singleTokensTypes,\r\n (result, currTokType) => {\r\n if (currTokType !== undefined) {\r\n result[currTokType.tokenTypeIdx!] = true\r\n forEach(currTokType.categoryMatches, (currExtendingType) => {\r\n result[currExtendingType] = true\r\n })\r\n }\r\n return result\r\n },\r\n {} as Record<number, boolean>\r\n )\r\n \r\n return function (this: BaseParser): boolean {\r\n const nextToken = this.LA(1)\r\n return choiceToAlt[nextToken.tokenTypeIdx] === true\r\n }\r\n }\r\n }\r\n return function (this: BaseParser) {\r\n const result = adaptivePredict.call(this, dfas, decisionIndex, EMPTY_PREDICATES, logging)\r\n return typeof result === \"object\" ? false : result === 0;\r\n }\r\n }\r\n\r\n}\r\n\r\nfunction isLL1Sequence(sequences: (TokenType | undefined)[][], allowEmpty = true): boolean {\r\n const fullSet = new Set<number>()\r\n\r\n for (const alt of sequences) {\r\n const altSet = new Set<number>()\r\n for (const tokType of alt) {\r\n if (tokType === undefined) {\r\n if (allowEmpty) {\r\n // Epsilon production encountered\r\n break\r\n } else {\r\n return false;\r\n }\r\n }\r\n const indices = [tokType.tokenTypeIdx!].concat(tokType.categoryMatches!)\r\n for (const index of indices) {\r\n if (fullSet.has(index)) {\r\n if (!altSet.has(index)) {\r\n return false\r\n }\r\n } else {\r\n fullSet.add(index)\r\n altSet.add(index)\r\n }\r\n }\r\n }\r\n }\r\n return true\r\n}\r\n\r\nfunction initATNSimulator(atn: ATN): DFACache[] {\r\n const decisionLength = atn.decisionStates.length\r\n const decisionToDFA: DFACache[] = Array(decisionLength)\r\n for (let i = 0; i < decisionLength; i++) {\r\n decisionToDFA[i] = createDFACache(atn.decisionStates[i], i)\r\n }\r\n return decisionToDFA;\r\n}\r\n\r\nfunction adaptivePredict(\r\n this: BaseParser,\r\n dfaCaches: DFACache[],\r\n decision: number,\r\n predicateSet: PredicateSet,\r\n logging: AmbiguityReport\r\n): number | AdaptivePredictError {\r\n const dfa = dfaCaches[decision](predicateSet)\r\n let start = dfa.start\r\n if (start === undefined) {\r\n const closure = computeStartState(dfa.atnStartState as ATNState)\r\n start = addDFAState(dfa, newDFAState(closure))\r\n dfa.start = start\r\n }\r\n\r\n const alt = performLookahead.apply(this, [dfa, start, predicateSet, logging])\r\n return alt\r\n}\r\n\r\nfunction performLookahead(\r\n this: BaseParser,\r\n dfa: DFA,\r\n s0: DFAState,\r\n predicateSet: PredicateSet,\r\n logging: AmbiguityReport\r\n): number | AdaptivePredictError {\r\n let previousD = s0\r\n\r\n let i = 1\r\n const path: IToken[] = []\r\n let t = this.LA(i++)\r\n\r\n while (true) {\r\n let d = getExistingTargetState(previousD, t)\r\n if (d === undefined) {\r\n d = computeLookaheadTarget.apply(this, [dfa, previousD, t, i, predicateSet, logging])\r\n }\r\n\r\n if (d === DFA_ERROR) {\r\n return buildAdaptivePredictError(path, previousD, t)\r\n }\r\n\r\n if (d.isAcceptState === true) {\r\n return d.prediction\r\n }\r\n\r\n previousD = d\r\n path.push(t)\r\n t = this.LA(i++)\r\n }\r\n}\r\n\r\nfunction computeLookaheadTarget(\r\n this: BaseParser,\r\n dfa: DFA,\r\n previousD: DFAState,\r\n token: IToken,\r\n lookahead: number,\r\n predicateSet: PredicateSet,\r\n logging: AmbiguityReport\r\n): DFAState {\r\n const reach = computeReachSet(previousD.configs, token, predicateSet)\r\n if (reach.size === 0) {\r\n addDFAEdge(dfa, previousD, token, DFA_ERROR)\r\n return DFA_ERROR\r\n }\r\n\r\n let newState = newDFAState(reach)\r\n const predictedAlt = getUniqueAlt(reach, predicateSet)\r\n\r\n if (predictedAlt !== undefined) {\r\n newState.isAcceptState = true\r\n newState.prediction = predictedAlt\r\n newState.configs.uniqueAlt = predictedAlt\r\n } else if (hasConflictTerminatingPrediction(reach)) {\r\n const prediction = min(reach.alts)!\r\n newState.isAcceptState = true\r\n newState.prediction = prediction\r\n newState.configs.uniqueAlt = prediction\r\n reportLookaheadAmbiguity.apply(this, [dfa, lookahead, reach.alts, logging])\r\n }\r\n\r\n newState = addDFAEdge(dfa, previousD, token, newState)\r\n return newState\r\n}\r\n\r\nfunction reportLookaheadAmbiguity(\r\n this: BaseParser,\r\n dfa: DFA,\r\n lookahead: number,\r\n ambiguityIndices: number[],\r\n logging: AmbiguityReport\r\n) {\r\n const prefixPath: TokenType[] = []\r\n for (let i = 1; i <= lookahead; i++) {\r\n prefixPath.push(this.LA(i).tokenType)\r\n }\r\n const atnState = dfa.atnStartState\r\n const topLevelRule = atnState.rule\r\n const production = atnState.production\r\n const message = buildAmbiguityError({\r\n topLevelRule,\r\n ambiguityIndices,\r\n production,\r\n prefixPath\r\n })\r\n logging(message)\r\n}\r\n\r\nfunction buildAmbiguityError(options: {\r\n topLevelRule: Rule\r\n prefixPath: TokenType[]\r\n ambiguityIndices: number[]\r\n production: IProductionWithOccurrence\r\n}): string {\r\n const pathMsg = map(options.prefixPath, (currtok) =>\r\n tokenLabel(currtok)\r\n ).join(\", \")\r\n const occurrence =\r\n options.production.idx === 0 ? \"\" : options.production.idx\r\n let currMessage =\r\n `Ambiguous Alternatives Detected: <${options.ambiguityIndices.join(\r\n \", \"\r\n )}> in <${getProductionDslName(options.production)}${occurrence}>` +\r\n ` inside <${options.topLevelRule.name}> Rule,\\n` +\r\n `<${pathMsg}> may appears as a prefix path in all these alternatives.\\n`\r\n\r\n currMessage =\r\n currMessage +\r\n `See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\\n` +\r\n `For Further details.`\r\n return currMessage\r\n}\r\n\r\nfunction getProductionDslName(prod: IProductionWithOccurrence): string {\r\n if (prod instanceof NonTerminal) {\r\n return \"SUBRULE\"\r\n } else if (prod instanceof Option) {\r\n return \"OPTION\"\r\n } else if (prod instanceof Alternation) {\r\n return \"OR\"\r\n } else if (prod instanceof RepetitionMandatory) {\r\n return \"AT_LEAST_ONE\"\r\n } else if (prod instanceof RepetitionMandatoryWithSeparator) {\r\n return \"AT_LEAST_ONE_SEP\"\r\n } else if (prod instanceof RepetitionWithSeparator) {\r\n return \"MANY_SEP\"\r\n } else if (prod instanceof Repetition) {\r\n return \"MANY\"\r\n } else if (prod instanceof Terminal) {\r\n return \"CONSUME\"\r\n } else {\r\n throw Error(\"non exhaustive match\")\r\n }\r\n}\r\n\r\nfunction buildAdaptivePredictError(\r\n path: IToken[],\r\n previous: DFAState,\r\n current: IToken\r\n): AdaptivePredictError {\r\n const nextTransitions = flatMap(\r\n previous.configs.elements,\r\n (e) => e.state.transitions\r\n )\r\n const nextTokenTypes = uniqBy(\r\n nextTransitions\r\n .filter((e): e is AtomTransition => e instanceof AtomTransition)\r\n .map((e) => e.tokenType),\r\n (e) => e.tokenTypeIdx\r\n )\r\n return {\r\n actualToken: current,\r\n possibleTokenTypes: nextTokenTypes,\r\n tokenPath: path\r\n }\r\n}\r\n\r\nfunction getExistingTargetState(\r\n state: DFAState,\r\n token: IToken\r\n): DFAState | undefined {\r\n return state.edges[token.tokenTypeIdx]\r\n}\r\n\r\nfunction computeReachSet(\r\n configs: ATNConfigSet,\r\n token: IToken,\r\n predicateSet: PredicateSet\r\n): ATNConfigSet {\r\n const intermediate = new ATNConfigSet()\r\n const skippedStopStates: ATNConfig[] = []\r\n\r\n for (const c of configs.elements) {\r\n if (predicateSet.is(c.alt) === false) {\r\n continue\r\n }\r\n if (c.state.type === ATN_RULE_STOP) {\r\n skippedStopStates.push(c)\r\n continue\r\n }\r\n const transitionLength = c.state.transitions.length\r\n for (let i = 0; i < transitionLength; i++) {\r\n const transition = c.state.transitions[i]\r\n const target = getReachableTarget(transition, token)\r\n if (target !== undefined) {\r\n intermediate.add({\r\n state: target,\r\n alt: c.alt,\r\n stack: c.stack\r\n })\r\n }\r\n }\r\n }\r\n\r\n let reach: ATNConfigSet | undefined\r\n\r\n if (skippedStopStates.length === 0 && intermediate.size === 1) {\r\n reach = intermediate\r\n }\r\n\r\n if (reach === undefined) {\r\n reach = new ATNConfigSet()\r\n for (const c of intermediate.elements) {\r\n closure(c, reach)\r\n }\r\n }\r\n\r\n if (skippedStopStates.length > 0 && !hasConfigInRuleStopState(reach)) {\r\n for (const c of skippedStopStates) {\r\n reach.add(c)\r\n }\r\n }\r\n\r\n return reach\r\n}\r\n\r\nfunction getReachableTarget(\r\n transition: Transition,\r\n token: IToken\r\n): ATNState | undefined {\r\n if (\r\n transition instanceof AtomTransition &&\r\n tokenMatcher(token, transition.tokenType)\r\n ) {\r\n return transition.target\r\n }\r\n return undefined\r\n}\r\n\r\nfunction getUniqueAlt(\r\n configs: ATNConfigSet,\r\n predicateSet: PredicateSet\r\n): number | undefined {\r\n let alt: number | undefined\r\n for (const c of configs.elements) {\r\n if (predicateSet.is(c.alt) === true) {\r\n if (alt === undefined) {\r\n alt = c.alt\r\n } else if (alt !== c.alt) {\r\n return undefined\r\n }\r\n }\r\n }\r\n return alt\r\n}\r\n\r\nfunction newDFAState(closure: ATNConfigSet): DFAState {\r\n return {\r\n configs: closure,\r\n edges: {},\r\n isAcceptState: false,\r\n prediction: -1\r\n }\r\n}\r\n\r\nfunction addDFAEdge(\r\n dfa: DFA,\r\n from: DFAState,\r\n token: IToken,\r\n to: DFAState\r\n): DFAState {\r\n to = addDFAState(dfa, to)\r\n from.edges[token.tokenTypeIdx] = to\r\n return to\r\n}\r\n\r\nfunction addDFAState(dfa: DFA, state: DFAState): DFAState {\r\n if (state === DFA_ERROR) {\r\n return state\r\n }\r\n // Repetitions have the same config set\r\n // Therefore, storing the key of the config in a map allows us to create a loop in our DFA\r\n const mapKey = state.configs.key\r\n const existing = dfa.states[mapKey]\r\n if (existing !== undefined) {\r\n return existing\r\n }\r\n state.configs.finalize()\r\n dfa.states[mapKey] = state\r\n return state\r\n}\r\n\r\nfunction computeStartState(atnState: ATNState): ATNConfigSet {\r\n const configs = new ATNConfigSet()\r\n\r\n const numberOfTransitions = atnState.transitions.length\r\n for (let i = 0; i < numberOfTransitions; i++) {\r\n const target = atnState.transitions[i].target\r\n const config: ATNConfig = {\r\n state: target,\r\n alt: i,\r\n stack: []\r\n }\r\n closure(config, configs)\r\n }\r\n\r\n return configs\r\n}\r\n\r\nfunction closure(config: ATNConfig, configs: ATNConfigSet): void {\r\n const p = config.state\r\n\r\n if (p.type === ATN_RULE_STOP) {\r\n if (config.stack.length > 0) {\r\n const atnStack = [...config.stack]\r\n const followState = atnStack.pop()!\r\n const followConfig: ATNConfig = {\r\n state: followState,\r\n alt: config.alt,\r\n stack: atnStack\r\n }\r\n closure(followConfig, configs)\r\n } else {\r\n // Dipping into outer context, simply add the config\r\n // This will stop computation once every config is at the rule stop state\r\n configs.add(config)\r\n }\r\n return\r\n }\r\n\r\n if (!p.epsilonOnlyTransitions) {\r\n configs.add(config)\r\n }\r\n\r\n const transitionLength = p.transitions.length\r\n for (let i = 0; i < transitionLength; i++) {\r\n const transition = p.transitions[i]\r\n const c = getEpsilonTarget(config, transition)\r\n\r\n if (c !== undefined) {\r\n closure(c, configs)\r\n }\r\n }\r\n}\r\n\r\nfunction getEpsilonTarget(\r\n config: ATNConfig,\r\n transition: Transition\r\n): ATNConfig | undefined {\r\n if (transition instanceof EpsilonTransition) {\r\n return {\r\n state: transition.target,\r\n alt: config.alt,\r\n stack: config.stack\r\n }\r\n } else if (transition instanceof RuleTransition) {\r\n const stack = [...config.stack, transition.followState]\r\n return {\r\n state: transition.target,\r\n alt: config.alt,\r\n stack\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\nfunction hasConfigInRuleStopState(configs: ATNConfigSet): boolean {\r\n for (const c of configs.elements) {\r\n if (c.state.type === ATN_RULE_STOP) {\r\n return true\r\n }\r\n }\r\n return false\r\n}\r\n\r\nfunction allConfigsInRuleStopStates(configs: ATNConfigSet): boolean {\r\n for (const c of configs.elements) {\r\n if (c.state.type !== ATN_RULE_STOP) {\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n\r\nfunction hasConflictTerminatingPrediction(configs: ATNConfigSet): boolean {\r\n if (allConfigsInRuleStopStates(configs)) {\r\n return true\r\n }\r\n const altSets = getConflictingAltSets(configs.elements)\r\n const heuristic =\r\n hasConflictingAltSet(altSets) && !hasStateAssociatedWithOneAlt(altSets)\r\n return heuristic\r\n}\r\n\r\nfunction getConflictingAltSets(\r\n configs: readonly ATNConfig[]\r\n): Map<string, Record<number, boolean>> {\r\n const configToAlts = new Map<string, Record<number, boolean>>()\r\n for (const c of configs) {\r\n const key = getATNConfigKey(c, false)\r\n let alts = configToAlts.get(key)\r\n if (alts === undefined) {\r\n alts = {}\r\n configToAlts.set(key, alts)\r\n }\r\n alts[c.alt] = true\r\n }\r\n return configToAlts\r\n}\r\n\r\nfunction hasConflictingAltSet(\r\n altSets: Map<string, Record<number, boolean>>\r\n): boolean {\r\n for (const value of Array.from(altSets.values())) {\r\n if (Object.keys(value).length > 1) {\r\n return true\r\n }\r\n }\r\n return false\r\n}\r\n\r\nfunction hasStateAssociatedWithOneAlt(\r\n altSets: Map<string, Record<number, boolean>>\r\n): boolean {\r\n for (const value of Array.from(altSets.values())) {\r\n if (Object.keys(value).length === 1) {\r\n return true\r\n }\r\n }\r\n return false\r\n}\r\n", "/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n'use strict';\nexport var DocumentUri;\n(function (DocumentUri) {\n function is(value) {\n return typeof value === 'string';\n }\n DocumentUri.is = is;\n})(DocumentUri || (DocumentUri = {}));\nexport var URI;\n(function (URI) {\n function is(value) {\n return typeof value === 'string';\n }\n URI.is = is;\n})(URI || (URI = {}));\nexport var integer;\n(function (integer) {\n integer.MIN_VALUE = -2147483648;\n integer.MAX_VALUE = 2147483647;\n function is(value) {\n return typeof value === 'number' && integer.MIN_VALUE <= value && value <= integer.MAX_VALUE;\n }\n integer.is = is;\n})(integer || (integer = {}));\nexport var uinteger;\n(function (uinteger) {\n uinteger.MIN_VALUE = 0;\n uinteger.MAX_VALUE = 2147483647;\n function is(value) {\n return typeof value === 'number' && uinteger.MIN_VALUE <= value && value <= uinteger.MAX_VALUE;\n }\n uinteger.is = is;\n})(uinteger || (uinteger = {}));\n/**\n * The Position namespace provides helper functions to work with\n * {@link Position} literals.\n */\nexport var Position;\n(function (Position) {\n /**\n * Creates a new Position literal from the given line and character.\n * @param line The position's line.\n * @param character The position's character.\n */\n function create(line, character) {\n if (line === Number.MAX_VALUE) {\n line = uinteger.MAX_VALUE;\n }\n if (character === Number.MAX_VALUE) {\n character = uinteger.MAX_VALUE;\n }\n return { line, character };\n }\n Position.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Position} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.objectLiteral(candidate) && Is.uinteger(candidate.line) && Is.uinteger(candidate.character);\n }\n Position.is = is;\n})(Position || (Position = {}));\n/**\n * The Range namespace provides helper functions to work with\n * {@link Range} literals.\n */\nexport var Range;\n(function (Range) {\n function create(one, two, three, four) {\n if (Is.uinteger(one) && Is.uinteger(two) && Is.uinteger(three) && Is.uinteger(four)) {\n return { start: Position.create(one, two), end: Position.create(three, four) };\n }\n else if (Position.is(one) && Position.is(two)) {\n return { start: one, end: two };\n }\n else {\n throw new Error(`Range#create called with invalid arguments[${one}, ${two}, ${three}, ${four}]`);\n }\n }\n Range.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Range} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.objectLiteral(candidate) && Position.is(candidate.start) && Position.is(candidate.end);\n }\n Range.is = is;\n})(Range || (Range = {}));\n/**\n * The Location namespace provides helper functions to work with\n * {@link Location} literals.\n */\nexport var Location;\n(function (Location) {\n /**\n * Creates a Location literal.\n * @param uri The location's uri.\n * @param range The location's range.\n */\n function create(uri, range) {\n return { uri, range };\n }\n Location.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Location} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.range) && (Is.string(candidate.uri) || Is.undefined(candidate.uri));\n }\n Location.is = is;\n})(Location || (Location = {}));\n/**\n * The LocationLink namespace provides helper functions to work with\n * {@link LocationLink} literals.\n */\nexport var LocationLink;\n(function (LocationLink) {\n /**\n * Creates a LocationLink literal.\n * @param targetUri The definition's uri.\n * @param targetRange The full range of the definition.\n * @param targetSelectionRange The span of the symbol definition at the target.\n * @param originSelectionRange The span of the symbol being defined in the originating source file.\n */\n function create(targetUri, targetRange, targetSelectionRange, originSelectionRange) {\n return { targetUri, targetRange, targetSelectionRange, originSelectionRange };\n }\n LocationLink.create = create;\n /**\n * Checks whether the given literal conforms to the {@link LocationLink} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.targetRange) && Is.string(candidate.targetUri)\n && Range.is(candidate.targetSelectionRange)\n && (Range.is(candidate.originSelectionRange) || Is.undefined(candidate.originSelectionRange));\n }\n LocationLink.is = is;\n})(LocationLink || (LocationLink = {}));\n/**\n * The Color namespace provides helper functions to work with\n * {@link Color} literals.\n */\nexport var Color;\n(function (Color) {\n /**\n * Creates a new Color literal.\n */\n function create(red, green, blue, alpha) {\n return {\n red,\n green,\n blue,\n alpha,\n };\n }\n Color.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Color} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Is.numberRange(candidate.red, 0, 1)\n && Is.numberRange(candidate.green, 0, 1)\n && Is.numberRange(candidate.blue, 0, 1)\n && Is.numberRange(candidate.alpha, 0, 1);\n }\n Color.is = is;\n})(Color || (Color = {}));\n/**\n * The ColorInformation namespace provides helper functions to work with\n * {@link ColorInformation} literals.\n */\nexport var ColorInformation;\n(function (ColorInformation) {\n /**\n * Creates a new ColorInformation literal.\n */\n function create(range, color) {\n return {\n range,\n color,\n };\n }\n ColorInformation.create = create;\n /**\n * Checks whether the given literal conforms to the {@link ColorInformation} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.range) && Color.is(candidate.color);\n }\n ColorInformation.is = is;\n})(ColorInformation || (ColorInformation = {}));\n/**\n * The Color namespace provides helper functions to work with\n * {@link ColorPresentation} literals.\n */\nexport var ColorPresentation;\n(function (ColorPresentation) {\n /**\n * Creates a new ColorInformation literal.\n */\n function create(label, textEdit, additionalTextEdits) {\n return {\n label,\n textEdit,\n additionalTextEdits,\n };\n }\n ColorPresentation.create = create;\n /**\n * Checks whether the given literal conforms to the {@link ColorInformation} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Is.string(candidate.label)\n && (Is.undefined(candidate.textEdit) || TextEdit.is(candidate))\n && (Is.undefined(candidate.additionalTextEdits) || Is.typedArray(candidate.additionalTextEdits, TextEdit.is));\n }\n ColorPresentation.is = is;\n})(ColorPresentation || (ColorPresentation = {}));\n/**\n * A set of predefined range kinds.\n */\nexport var FoldingRangeKind;\n(function (FoldingRangeKind) {\n /**\n * Folding range for a comment\n */\n FoldingRangeKind.Comment = 'comment';\n /**\n * Folding range for an import or include\n */\n FoldingRangeKind.Imports = 'imports';\n /**\n * Folding range for a region (e.g. `#region`)\n */\n FoldingRangeKind.Region = 'region';\n})(FoldingRangeKind || (FoldingRangeKind = {}));\n/**\n * The folding range namespace provides helper functions to work with\n * {@link FoldingRange} literals.\n */\nexport var FoldingRange;\n(function (FoldingRange) {\n /**\n * Creates a new FoldingRange literal.\n */\n function create(startLine, endLine, startCharacter, endCharacter, kind, collapsedText) {\n const result = {\n startLine,\n endLine\n };\n if (Is.defined(startCharacter)) {\n result.startCharacter = startCharacter;\n }\n if (Is.defined(endCharacter)) {\n result.endCharacter = endCharacter;\n }\n if (Is.defined(kind)) {\n result.kind = kind;\n }\n if (Is.defined(collapsedText)) {\n result.collapsedText = collapsedText;\n }\n return result;\n }\n FoldingRange.create = create;\n /**\n * Checks whether the given literal conforms to the {@link FoldingRange} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Is.uinteger(candidate.startLine) && Is.uinteger(candidate.startLine)\n && (Is.undefined(candidate.startCharacter) || Is.uinteger(candidate.startCharacter))\n && (Is.undefined(candidate.endCharacter) || Is.uinteger(candidate.endCharacter))\n && (Is.undefined(candidate.kind) || Is.string(candidate.kind));\n }\n FoldingRange.is = is;\n})(FoldingRange || (FoldingRange = {}));\n/**\n * The DiagnosticRelatedInformation namespace provides helper functions to work with\n * {@link DiagnosticRelatedInformation} literals.\n */\nexport var DiagnosticRelatedInformation;\n(function (DiagnosticRelatedInformation) {\n /**\n * Creates a new DiagnosticRelatedInformation literal.\n */\n function create(location, message) {\n return {\n location,\n message\n };\n }\n DiagnosticRelatedInformation.create = create;\n /**\n * Checks whether the given literal conforms to the {@link DiagnosticRelatedInformation} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Location.is(candidate.location) && Is.string(candidate.message);\n }\n DiagnosticRelatedInformation.is = is;\n})(DiagnosticRelatedInformation || (DiagnosticRelatedInformation = {}));\n/**\n * The diagnostic's severity.\n */\nexport var DiagnosticSeverity;\n(function (DiagnosticSeverity) {\n /**\n * Reports an error.\n */\n DiagnosticSeverity.Error = 1;\n /**\n * Reports a warning.\n */\n DiagnosticSeverity.Warning = 2;\n /**\n * Reports an information.\n */\n DiagnosticSeverity.Information = 3;\n /**\n * Reports a hint.\n */\n DiagnosticSeverity.Hint = 4;\n})(DiagnosticSeverity || (DiagnosticSeverity = {}));\n/**\n * The diagnostic tags.\n *\n * @since 3.15.0\n */\nexport var DiagnosticTag;\n(function (DiagnosticTag) {\n /**\n * Unused or unnecessary code.\n *\n * Clients are allowed to render diagnostics with this tag faded out instead of having\n * an error squiggle.\n */\n DiagnosticTag.Unnecessary = 1;\n /**\n * Deprecated or obsolete code.\n *\n * Clients are allowed to rendered diagnostics with this tag strike through.\n */\n DiagnosticTag.Deprecated = 2;\n})(DiagnosticTag || (DiagnosticTag = {}));\n/**\n * The CodeDescription namespace provides functions to deal with descriptions for diagnostic codes.\n *\n * @since 3.16.0\n */\nexport var CodeDescription;\n(function (CodeDescription) {\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Is.string(candidate.href);\n }\n CodeDescription.is = is;\n})(CodeDescription || (CodeDescription = {}));\n/**\n * The Diagnostic namespace provides helper functions to work with\n * {@link Diagnostic} literals.\n */\nexport var Diagnostic;\n(function (Diagnostic) {\n /**\n * Creates a new Diagnostic literal.\n */\n function create(range, message, severity, code, source, relatedInformation) {\n let result = { range, message };\n if (Is.defined(severity)) {\n result.severity = severity;\n }\n if (Is.defined(code)) {\n result.code = code;\n }\n if (Is.defined(source)) {\n result.source = source;\n }\n if (Is.defined(relatedInformation)) {\n result.relatedInformation = relatedInformation;\n }\n return result;\n }\n Diagnostic.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Diagnostic} interface.\n */\n function is(value) {\n var _a;\n let candidate = value;\n return Is.defined(candidate)\n && Range.is(candidate.range)\n && Is.string(candidate.message)\n && (Is.number(candidate.severity) || Is.undefined(candidate.severity))\n && (Is.integer(candidate.code) || Is.string(candidate.code) || Is.undefined(candidate.code))\n && (Is.undefined(candidate.codeDescription) || (Is.string((_a = candidate.codeDescription) === null || _a === void 0 ? void 0 : _a.href)))\n && (Is.string(candidate.source) || Is.undefined(candidate.source))\n && (Is.undefined(candidate.relatedInformation) || Is.typedArray(candidate.relatedInformation, DiagnosticRelatedInformation.is));\n }\n Diagnostic.is = is;\n})(Diagnostic || (Diagnostic = {}));\n/**\n * The Command namespace provides helper functions to work with\n * {@link Command} literals.\n */\nexport var Command;\n(function (Command) {\n /**\n * Creates a new Command literal.\n */\n function create(title, command, ...args) {\n let result = { title, command };\n if (Is.defined(args) && args.length > 0) {\n result.arguments = args;\n }\n return result;\n }\n Command.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Command} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.title) && Is.string(candidate.command);\n }\n Command.is = is;\n})(Command || (Command = {}));\n/**\n * The TextEdit namespace provides helper function to create replace,\n * insert and delete edits more easily.\n */\nexport var TextEdit;\n(function (TextEdit) {\n /**\n * Creates a replace text edit.\n * @param range The range of text to be replaced.\n * @param newText The new text.\n */\n function replace(range, newText) {\n return { range, newText };\n }\n TextEdit.replace = replace;\n /**\n * Creates an insert text edit.\n * @param position The position to insert the text at.\n * @param newText The text to be inserted.\n */\n function insert(position, newText) {\n return { range: { start: position, end: position }, newText };\n }\n TextEdit.insert = insert;\n /**\n * Creates a delete text edit.\n * @param range The range of text to be deleted.\n */\n function del(range) {\n return { range, newText: '' };\n }\n TextEdit.del = del;\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate)\n && Is.string(candidate.newText)\n && Range.is(candidate.range);\n }\n TextEdit.is = is;\n})(TextEdit || (TextEdit = {}));\nexport var ChangeAnnotation;\n(function (ChangeAnnotation) {\n function create(label, needsConfirmation, description) {\n const result = { label };\n if (needsConfirmation !== undefined) {\n result.needsConfirmation = needsConfirmation;\n }\n if (description !== undefined) {\n result.description = description;\n }\n return result;\n }\n ChangeAnnotation.create = create;\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Is.string(candidate.label) &&\n (Is.boolean(candidate.needsConfirmation) || candidate.needsConfirmation === undefined) &&\n (Is.string(candidate.description) || candidate.description === undefined);\n }\n ChangeAnnotation.is = is;\n})(ChangeAnnotation || (ChangeAnnotation = {}));\nexport var ChangeAnnotationIdentifier;\n(function (ChangeAnnotationIdentifier) {\n function is(value) {\n const candidate = value;\n return Is.string(candidate);\n }\n ChangeAnnotationIdentifier.is = is;\n})(ChangeAnnotationIdentifier || (ChangeAnnotationIdentifier = {}));\nexport var AnnotatedTextEdit;\n(function (AnnotatedTextEdit) {\n /**\n * Creates an annotated replace text edit.\n *\n * @param range The range of text to be replaced.\n * @param newText The new text.\n * @param annotation The annotation.\n */\n function replace(range, newText, annotation) {\n return { range, newText, annotationId: annotation };\n }\n AnnotatedTextEdit.replace = replace;\n /**\n * Creates an annotated insert text edit.\n *\n * @param position The position to insert the text at.\n * @param newText The text to be inserted.\n * @param annotation The annotation.\n */\n function insert(position, newText, annotation) {\n return { range: { start: position, end: position }, newText, annotationId: annotation };\n }\n AnnotatedTextEdit.insert = insert;\n /**\n * Creates an annotated delete text edit.\n *\n * @param range The range of text to be deleted.\n * @param annotation The annotation.\n */\n function del(range, annotation) {\n return { range, newText: '', annotationId: annotation };\n }\n AnnotatedTextEdit.del = del;\n function is(value) {\n const candidate = value;\n return TextEdit.is(candidate) && (ChangeAnnotation.is(candidate.annotationId) || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n AnnotatedTextEdit.is = is;\n})(AnnotatedTextEdit || (AnnotatedTextEdit = {}));\n/**\n * The TextDocumentEdit namespace provides helper function to create\n * an edit that manipulates a text document.\n */\nexport var TextDocumentEdit;\n(function (TextDocumentEdit) {\n /**\n * Creates a new `TextDocumentEdit`\n */\n function create(textDocument, edits) {\n return { textDocument, edits };\n }\n TextDocumentEdit.create = create;\n function is(value) {\n let candidate = value;\n return Is.defined(candidate)\n && OptionalVersionedTextDocumentIdentifier.is(candidate.textDocument)\n && Array.isArray(candidate.edits);\n }\n TextDocumentEdit.is = is;\n})(TextDocumentEdit || (TextDocumentEdit = {}));\nexport var CreateFile;\n(function (CreateFile) {\n function create(uri, options, annotation) {\n let result = {\n kind: 'create',\n uri\n };\n if (options !== undefined && (options.overwrite !== undefined || options.ignoreIfExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n CreateFile.create = create;\n function is(value) {\n let candidate = value;\n return candidate && candidate.kind === 'create' && Is.string(candidate.uri) && (candidate.options === undefined ||\n ((candidate.options.overwrite === undefined || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === undefined || Is.boolean(candidate.options.ignoreIfExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n CreateFile.is = is;\n})(CreateFile || (CreateFile = {}));\nexport var RenameFile;\n(function (RenameFile) {\n function create(oldUri, newUri, options, annotation) {\n let result = {\n kind: 'rename',\n oldUri,\n newUri\n };\n if (options !== undefined && (options.overwrite !== undefined || options.ignoreIfExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n RenameFile.create = create;\n function is(value) {\n let candidate = value;\n return candidate && candidate.kind === 'rename' && Is.string(candidate.oldUri) && Is.string(candidate.newUri) && (candidate.options === undefined ||\n ((candidate.options.overwrite === undefined || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === undefined || Is.boolean(candidate.options.ignoreIfExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n RenameFile.is = is;\n})(RenameFile || (RenameFile = {}));\nexport var DeleteFile;\n(function (DeleteFile) {\n function create(uri, options, annotation) {\n let result = {\n kind: 'delete',\n uri\n };\n if (options !== undefined && (options.recursive !== undefined || options.ignoreIfNotExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n DeleteFile.create = create;\n function is(value) {\n let candidate = value;\n return candidate && candidate.kind === 'delete' && Is.string(candidate.uri) && (candidate.options === undefined ||\n ((candidate.options.recursive === undefined || Is.boolean(candidate.options.recursive)) && (candidate.options.ignoreIfNotExists === undefined || Is.boolean(candidate.options.ignoreIfNotExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n DeleteFile.is = is;\n})(DeleteFile || (DeleteFile = {}));\nexport var WorkspaceEdit;\n(function (WorkspaceEdit) {\n function is(value) {\n let candidate = value;\n return candidate &&\n (candidate.changes !== undefined || candidate.documentChanges !== undefined) &&\n (candidate.documentChanges === undefined || candidate.documentChanges.every((change) => {\n if (Is.string(change.kind)) {\n return CreateFile.is(change) || RenameFile.is(change) || DeleteFile.is(change);\n }\n else {\n return TextDocumentEdit.is(change);\n }\n }));\n }\n WorkspaceEdit.is = is;\n})(WorkspaceEdit || (WorkspaceEdit = {}));\nclass TextEditChangeImpl {\n constructor(edits, changeAnnotations) {\n this.edits = edits;\n this.changeAnnotations = changeAnnotations;\n }\n insert(position, newText, annotation) {\n let edit;\n let id;\n if (annotation === undefined) {\n edit = TextEdit.insert(position, newText);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.insert(position, newText, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.insert(position, newText, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n }\n replace(range, newText, annotation) {\n let edit;\n let id;\n if (annotation === undefined) {\n edit = TextEdit.replace(range, newText);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.replace(range, newText, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.replace(range, newText, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n }\n delete(range, annotation) {\n let edit;\n let id;\n if (annotation === undefined) {\n edit = TextEdit.del(range);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.del(range, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.del(range, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n }\n add(edit) {\n this.edits.push(edit);\n }\n all() {\n return this.edits;\n }\n clear() {\n this.edits.splice(0, this.edits.length);\n }\n assertChangeAnnotations(value) {\n if (value === undefined) {\n throw new Error(`Text edit change is not configured to manage change annotations.`);\n }\n }\n}\n/**\n * A helper class\n */\nclass ChangeAnnotations {\n constructor(annotations) {\n this._annotations = annotations === undefined ? Object.create(null) : annotations;\n this._counter = 0;\n this._size = 0;\n }\n all() {\n return this._annotations;\n }\n get size() {\n return this._size;\n }\n manage(idOrAnnotation, annotation) {\n let id;\n if (ChangeAnnotationIdentifier.is(idOrAnnotation)) {\n id = idOrAnnotation;\n }\n else {\n id = this.nextId();\n annotation = idOrAnnotation;\n }\n if (this._annotations[id] !== undefined) {\n throw new Error(`Id ${id} is already in use.`);\n }\n if (annotation === undefined) {\n throw new Error(`No annotation provided for id ${id}`);\n }\n this._annotations[id] = annotation;\n this._size++;\n return id;\n }\n nextId() {\n this._counter++;\n return this._counter.toString();\n }\n}\n/**\n * A workspace change helps constructing changes to a workspace.\n */\nexport class WorkspaceChange {\n constructor(workspaceEdit) {\n this._textEditChanges = Object.create(null);\n if (workspaceEdit !== undefined) {\n this._workspaceEdit = workspaceEdit;\n if (workspaceEdit.documentChanges) {\n this._changeAnnotations = new ChangeAnnotations(workspaceEdit.changeAnnotations);\n workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n workspaceEdit.documentChanges.forEach((change) => {\n if (TextDocumentEdit.is(change)) {\n const textEditChange = new TextEditChangeImpl(change.edits, this._changeAnnotations);\n this._textEditChanges[change.textDocument.uri] = textEditChange;\n }\n });\n }\n else if (workspaceEdit.changes) {\n Object.keys(workspaceEdit.changes).forEach((key) => {\n const textEditChange = new TextEditChangeImpl(workspaceEdit.changes[key]);\n this._textEditChanges[key] = textEditChange;\n });\n }\n }\n else {\n this._workspaceEdit = {};\n }\n }\n /**\n * Returns the underlying {@link WorkspaceEdit} literal\n * use to be returned from a workspace edit operation like rename.\n */\n get edit() {\n this.initDocumentChanges();\n if (this._changeAnnotations !== undefined) {\n if (this._changeAnnotations.size === 0) {\n this._workspaceEdit.changeAnnotations = undefined;\n }\n else {\n this._workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n }\n }\n return this._workspaceEdit;\n }\n getTextEditChange(key) {\n if (OptionalVersionedTextDocumentIdentifier.is(key)) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n const textDocument = { uri: key.uri, version: key.version };\n let result = this._textEditChanges[textDocument.uri];\n if (!result) {\n const edits = [];\n const textDocumentEdit = {\n textDocument,\n edits\n };\n this._workspaceEdit.documentChanges.push(textDocumentEdit);\n result = new TextEditChangeImpl(edits, this._changeAnnotations);\n this._textEditChanges[textDocument.uri] = result;\n }\n return result;\n }\n else {\n this.initChanges();\n if (this._workspaceEdit.changes === undefined) {\n throw new Error('Workspace edit is not configured for normal text edit changes.');\n }\n let result = this._textEditChanges[key];\n if (!result) {\n let edits = [];\n this._workspaceEdit.changes[key] = edits;\n result = new TextEditChangeImpl(edits);\n this._textEditChanges[key] = result;\n }\n return result;\n }\n }\n initDocumentChanges() {\n if (this._workspaceEdit.documentChanges === undefined && this._workspaceEdit.changes === undefined) {\n this._changeAnnotations = new ChangeAnnotations();\n this._workspaceEdit.documentChanges = [];\n this._workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n }\n }\n initChanges() {\n if (this._workspaceEdit.documentChanges === undefined && this._workspaceEdit.changes === undefined) {\n this._workspaceEdit.changes = Object.create(null);\n }\n }\n createFile(uri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n let annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n let operation;\n let id;\n if (annotation === undefined) {\n operation = CreateFile.create(uri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = CreateFile.create(uri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n }\n renameFile(oldUri, newUri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n let annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n let operation;\n let id;\n if (annotation === undefined) {\n operation = RenameFile.create(oldUri, newUri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = RenameFile.create(oldUri, newUri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n }\n deleteFile(uri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n let annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n let operation;\n let id;\n if (annotation === undefined) {\n operation = DeleteFile.create(uri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = DeleteFile.create(uri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n }\n}\n/**\n * The TextDocumentIdentifier namespace provides helper functions to work with\n * {@link TextDocumentIdentifier} literals.\n */\nexport var TextDocumentIdentifier;\n(function (TextDocumentIdentifier) {\n /**\n * Creates a new TextDocumentIdentifier literal.\n * @param uri The document's uri.\n */\n function create(uri) {\n return { uri };\n }\n TextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the {@link TextDocumentIdentifier} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri);\n }\n TextDocumentIdentifier.is = is;\n})(TextDocumentIdentifier || (TextDocumentIdentifier = {}));\n/**\n * The VersionedTextDocumentIdentifier namespace provides helper functions to work with\n * {@link VersionedTextDocumentIdentifier} literals.\n */\nexport var VersionedTextDocumentIdentifier;\n(function (VersionedTextDocumentIdentifier) {\n /**\n * Creates a new VersionedTextDocumentIdentifier literal.\n * @param uri The document's uri.\n * @param version The document's version.\n */\n function create(uri, version) {\n return { uri, version };\n }\n VersionedTextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the {@link VersionedTextDocumentIdentifier} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && Is.integer(candidate.version);\n }\n VersionedTextDocumentIdentifier.is = is;\n})(VersionedTextDocumentIdentifier || (VersionedTextDocumentIdentifier = {}));\n/**\n * The OptionalVersionedTextDocumentIdentifier namespace provides helper functions to work with\n * {@link OptionalVersionedTextDocumentIdentifier} literals.\n */\nexport var OptionalVersionedTextDocumentIdentifier;\n(function (OptionalVersionedTextDocumentIdentifier) {\n /**\n * Creates a new OptionalVersionedTextDocumentIdentifier literal.\n * @param uri The document's uri.\n * @param version The document's version.\n */\n function create(uri, version) {\n return { uri, version };\n }\n OptionalVersionedTextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the {@link OptionalVersionedTextDocumentIdentifier} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && (candidate.version === null || Is.integer(candidate.version));\n }\n OptionalVersionedTextDocumentIdentifier.is = is;\n})(OptionalVersionedTextDocumentIdentifier || (OptionalVersionedTextDocumentIdentifier = {}));\n/**\n * The TextDocumentItem namespace provides helper functions to work with\n * {@link TextDocumentItem} literals.\n */\nexport var TextDocumentItem;\n(function (TextDocumentItem) {\n /**\n * Creates a new TextDocumentItem literal.\n * @param uri The document's uri.\n * @param languageId The document's language identifier.\n * @param version The document's version number.\n * @param text The document's text.\n */\n function create(uri, languageId, version, text) {\n return { uri, languageId, version, text };\n }\n TextDocumentItem.create = create;\n /**\n * Checks whether the given literal conforms to the {@link TextDocumentItem} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && Is.string(candidate.languageId) && Is.integer(candidate.version) && Is.string(candidate.text);\n }\n TextDocumentItem.is = is;\n})(TextDocumentItem || (TextDocumentItem = {}));\n/**\n * Describes the content type that a client supports in various\n * result literals like `Hover`, `ParameterInfo` or `CompletionItem`.\n *\n * Please note that `MarkupKinds` must not start with a `$`. This kinds\n * are reserved for internal usage.\n */\nexport var MarkupKind;\n(function (MarkupKind) {\n /**\n * Plain text is supported as a content format\n */\n MarkupKind.PlainText = 'plaintext';\n /**\n * Markdown is supported as a content format\n */\n MarkupKind.Markdown = 'markdown';\n /**\n * Checks whether the given value is a value of the {@link MarkupKind} type.\n */\n function is(value) {\n const candidate = value;\n return candidate === MarkupKind.PlainText || candidate === MarkupKind.Markdown;\n }\n MarkupKind.is = is;\n})(MarkupKind || (MarkupKind = {}));\nexport var MarkupContent;\n(function (MarkupContent) {\n /**\n * Checks whether the given value conforms to the {@link MarkupContent} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(value) && MarkupKind.is(candidate.kind) && Is.string(candidate.value);\n }\n MarkupContent.is = is;\n})(MarkupContent || (MarkupContent = {}));\n/**\n * The kind of a completion entry.\n */\nexport var CompletionItemKind;\n(function (CompletionItemKind) {\n CompletionItemKind.Text = 1;\n CompletionItemKind.Method = 2;\n CompletionItemKind.Function = 3;\n CompletionItemKind.Constructor = 4;\n CompletionItemKind.Field = 5;\n CompletionItemKind.Variable = 6;\n CompletionItemKind.Class = 7;\n CompletionItemKind.Interface = 8;\n CompletionItemKind.Module = 9;\n CompletionItemKind.Property = 10;\n CompletionItemKind.Unit = 11;\n CompletionItemKind.Value = 12;\n CompletionItemKind.Enum = 13;\n CompletionItemKind.Keyword = 14;\n CompletionItemKind.Snippet = 15;\n CompletionItemKind.Color = 16;\n CompletionItemKind.File = 17;\n CompletionItemKind.Reference = 18;\n CompletionItemKind.Folder = 19;\n CompletionItemKind.EnumMember = 20;\n CompletionItemKind.Constant = 21;\n CompletionItemKind.Struct = 22;\n CompletionItemKind.Event = 23;\n CompletionItemKind.Operator = 24;\n CompletionItemKind.TypeParameter = 25;\n})(CompletionItemKind || (CompletionItemKind = {}));\n/**\n * Defines whether the insert text in a completion item should be interpreted as\n * plain text or a snippet.\n */\nexport var InsertTextFormat;\n(function (InsertTextFormat) {\n /**\n * The primary text to be inserted is treated as a plain string.\n */\n InsertTextFormat.PlainText = 1;\n /**\n * The primary text to be inserted is treated as a snippet.\n *\n * A snippet can define tab stops and placeholders with `$1`, `$2`\n * and `${3:foo}`. `$0` defines the final tab stop, it defaults to\n * the end of the snippet. Placeholders with equal identifiers are linked,\n * that is typing in one will update others too.\n *\n * See also: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#snippet_syntax\n */\n InsertTextFormat.Snippet = 2;\n})(InsertTextFormat || (InsertTextFormat = {}));\n/**\n * Completion item tags are extra annotations that tweak the rendering of a completion\n * item.\n *\n * @since 3.15.0\n */\nexport var CompletionItemTag;\n(function (CompletionItemTag) {\n /**\n * Render a completion as obsolete, usually using a strike-out.\n */\n CompletionItemTag.Deprecated = 1;\n})(CompletionItemTag || (CompletionItemTag = {}));\n/**\n * The InsertReplaceEdit namespace provides functions to deal with insert / replace edits.\n *\n * @since 3.16.0\n */\nexport var InsertReplaceEdit;\n(function (InsertReplaceEdit) {\n /**\n * Creates a new insert / replace edit\n */\n function create(newText, insert, replace) {\n return { newText, insert, replace };\n }\n InsertReplaceEdit.create = create;\n /**\n * Checks whether the given literal conforms to the {@link InsertReplaceEdit} interface.\n */\n function is(value) {\n const candidate = value;\n return candidate && Is.string(candidate.newText) && Range.is(candidate.insert) && Range.is(candidate.replace);\n }\n InsertReplaceEdit.is = is;\n})(InsertReplaceEdit || (InsertReplaceEdit = {}));\n/**\n * How whitespace and indentation is handled during completion\n * item insertion.\n *\n * @since 3.16.0\n */\nexport var InsertTextMode;\n(function (InsertTextMode) {\n /**\n * The insertion or replace strings is taken as it is. If the\n * value is multi line the lines below the cursor will be\n * inserted using the indentation defined in the string value.\n * The client will not apply any kind of adjustments to the\n * string.\n */\n InsertTextMode.asIs = 1;\n /**\n * The editor adjusts leading whitespace of new lines so that\n * they match the indentation up to the cursor of the line for\n * which the item is accepted.\n *\n * Consider a line like this: <2tabs><cursor><3tabs>foo. Accepting a\n * multi line completion item is indented using 2 tabs and all\n * following lines inserted will be indented using 2 tabs as well.\n */\n InsertTextMode.adjustIndentation = 2;\n})(InsertTextMode || (InsertTextMode = {}));\nexport var CompletionItemLabelDetails;\n(function (CompletionItemLabelDetails) {\n function is(value) {\n const candidate = value;\n return candidate && (Is.string(candidate.detail) || candidate.detail === undefined) &&\n (Is.string(candidate.description) || candidate.description === undefined);\n }\n CompletionItemLabelDetails.is = is;\n})(CompletionItemLabelDetails || (CompletionItemLabelDetails = {}));\n/**\n * The CompletionItem namespace provides functions to deal with\n * completion items.\n */\nexport var CompletionItem;\n(function (CompletionItem) {\n /**\n * Create a completion item and seed it with a label.\n * @param label The completion item's label\n */\n function create(label) {\n return { label };\n }\n CompletionItem.create = create;\n})(CompletionItem || (CompletionItem = {}));\n/**\n * The CompletionList namespace provides functions to deal with\n * completion lists.\n */\nexport var CompletionList;\n(function (CompletionList) {\n /**\n * Creates a new completion list.\n *\n * @param items The completion items.\n * @param isIncomplete The list is not complete.\n */\n function create(items, isIncomplete) {\n return { items: items ? items : [], isIncomplete: !!isIncomplete };\n }\n CompletionList.create = create;\n})(CompletionList || (CompletionList = {}));\nexport var MarkedString;\n(function (MarkedString) {\n /**\n * Creates a marked string from plain text.\n *\n * @param plainText The plain text.\n */\n function fromPlainText(plainText) {\n return plainText.replace(/[\\\\`*_{}[\\]()#+\\-.!]/g, '\\\\$&'); // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash\n }\n MarkedString.fromPlainText = fromPlainText;\n /**\n * Checks whether the given value conforms to the {@link MarkedString} type.\n */\n function is(value) {\n const candidate = value;\n return Is.string(candidate) || (Is.objectLiteral(candidate) && Is.string(candidate.language) && Is.string(candidate.value));\n }\n MarkedString.is = is;\n})(MarkedString || (MarkedString = {}));\nexport var Hover;\n(function (Hover) {\n /**\n * Checks whether the given value conforms to the {@link Hover} interface.\n */\n function is(value) {\n let candidate = value;\n return !!candidate && Is.objectLiteral(candidate) && (MarkupContent.is(candidate.contents) ||\n MarkedString.is(candidate.contents) ||\n Is.typedArray(candidate.contents, MarkedString.is)) && (value.range === undefined || Range.is(value.range));\n }\n Hover.is = is;\n})(Hover || (Hover = {}));\n/**\n * The ParameterInformation namespace provides helper functions to work with\n * {@link ParameterInformation} literals.\n */\nexport var ParameterInformation;\n(function (ParameterInformation) {\n /**\n * Creates a new parameter information literal.\n *\n * @param label A label string.\n * @param documentation A doc string.\n */\n function create(label, documentation) {\n return documentation ? { label, documentation } : { label };\n }\n ParameterInformation.create = create;\n})(ParameterInformation || (ParameterInformation = {}));\n/**\n * The SignatureInformation namespace provides helper functions to work with\n * {@link SignatureInformation} literals.\n */\nexport var SignatureInformation;\n(function (SignatureInformation) {\n function create(label, documentation, ...parameters) {\n let result = { label };\n if (Is.defined(documentation)) {\n result.documentation = documentation;\n }\n if (Is.defined(parameters)) {\n result.parameters = parameters;\n }\n else {\n result.parameters = [];\n }\n return result;\n }\n SignatureInformation.create = create;\n})(SignatureInformation || (SignatureInformation = {}));\n/**\n * A document highlight kind.\n */\nexport var DocumentHighlightKind;\n(function (DocumentHighlightKind) {\n /**\n * A textual occurrence.\n */\n DocumentHighlightKind.Text = 1;\n /**\n * Read-access of a symbol, like reading a variable.\n */\n DocumentHighlightKind.Read = 2;\n /**\n * Write-access of a symbol, like writing to a variable.\n */\n DocumentHighlightKind.Write = 3;\n})(DocumentHighlightKind || (DocumentHighlightKind = {}));\n/**\n * DocumentHighlight namespace to provide helper functions to work with\n * {@link DocumentHighlight} literals.\n */\nexport var DocumentHighlight;\n(function (DocumentHighlight) {\n /**\n * Create a DocumentHighlight object.\n * @param range The range the highlight applies to.\n * @param kind The highlight kind\n */\n function create(range, kind) {\n let result = { range };\n if (Is.number(kind)) {\n result.kind = kind;\n }\n return result;\n }\n DocumentHighlight.create = create;\n})(DocumentHighlight || (DocumentHighlight = {}));\n/**\n * A symbol kind.\n */\nexport var SymbolKind;\n(function (SymbolKind) {\n SymbolKind.File = 1;\n SymbolKind.Module = 2;\n SymbolKind.Namespace = 3;\n SymbolKind.Package = 4;\n SymbolKind.Class = 5;\n SymbolKind.Method = 6;\n SymbolKind.Property = 7;\n SymbolKind.Field = 8;\n SymbolKind.Constructor = 9;\n SymbolKind.Enum = 10;\n SymbolKind.Interface = 11;\n SymbolKind.Function = 12;\n SymbolKind.Variable = 13;\n SymbolKind.Constant = 14;\n SymbolKind.String = 15;\n SymbolKind.Number = 16;\n SymbolKind.Boolean = 17;\n SymbolKind.Array = 18;\n SymbolKind.Object = 19;\n SymbolKind.Key = 20;\n SymbolKind.Null = 21;\n SymbolKind.EnumMember = 22;\n SymbolKind.Struct = 23;\n SymbolKind.Event = 24;\n SymbolKind.Operator = 25;\n SymbolKind.TypeParameter = 26;\n})(SymbolKind || (SymbolKind = {}));\n/**\n * Symbol tags are extra annotations that tweak the rendering of a symbol.\n *\n * @since 3.16\n */\nexport var SymbolTag;\n(function (SymbolTag) {\n /**\n * Render a symbol as obsolete, usually using a strike-out.\n */\n SymbolTag.Deprecated = 1;\n})(SymbolTag || (SymbolTag = {}));\nexport var SymbolInformation;\n(function (SymbolInformation) {\n /**\n * Creates a new symbol information literal.\n *\n * @param name The name of the symbol.\n * @param kind The kind of the symbol.\n * @param range The range of the location of the symbol.\n * @param uri The resource of the location of symbol.\n * @param containerName The name of the symbol containing the symbol.\n */\n function create(name, kind, range, uri, containerName) {\n let result = {\n name,\n kind,\n location: { uri, range }\n };\n if (containerName) {\n result.containerName = containerName;\n }\n return result;\n }\n SymbolInformation.create = create;\n})(SymbolInformation || (SymbolInformation = {}));\nexport var WorkspaceSymbol;\n(function (WorkspaceSymbol) {\n /**\n * Create a new workspace symbol.\n *\n * @param name The name of the symbol.\n * @param kind The kind of the symbol.\n * @param uri The resource of the location of the symbol.\n * @param range An options range of the location.\n * @returns A WorkspaceSymbol.\n */\n function create(name, kind, uri, range) {\n return range !== undefined\n ? { name, kind, location: { uri, range } }\n : { name, kind, location: { uri } };\n }\n WorkspaceSymbol.create = create;\n})(WorkspaceSymbol || (WorkspaceSymbol = {}));\nexport var DocumentSymbol;\n(function (DocumentSymbol) {\n /**\n * Creates a new symbol information literal.\n *\n * @param name The name of the symbol.\n * @param detail The detail of the symbol.\n * @param kind The kind of the symbol.\n * @param range The range of the symbol.\n * @param selectionRange The selectionRange of the symbol.\n * @param children Children of the symbol.\n */\n function create(name, detail, kind, range, selectionRange, children) {\n let result = {\n name,\n detail,\n kind,\n range,\n selectionRange\n };\n if (children !== undefined) {\n result.children = children;\n }\n return result;\n }\n DocumentSymbol.create = create;\n /**\n * Checks whether the given literal conforms to the {@link DocumentSymbol} interface.\n */\n function is(value) {\n let candidate = value;\n return candidate &&\n Is.string(candidate.name) && Is.number(candidate.kind) &&\n Range.is(candidate.range) && Range.is(candidate.selectionRange) &&\n (candidate.detail === undefined || Is.string(candidate.detail)) &&\n (candidate.deprecated === undefined || Is.boolean(candidate.deprecated)) &&\n (candidate.children === undefined || Array.isArray(candidate.children)) &&\n (candidate.tags === undefined || Array.isArray(candidate.tags));\n }\n DocumentSymbol.is = is;\n})(DocumentSymbol || (DocumentSymbol = {}));\n/**\n * A set of predefined code action kinds\n */\nexport var CodeActionKind;\n(function (CodeActionKind) {\n /**\n * Empty kind.\n */\n CodeActionKind.Empty = '';\n /**\n * Base kind for quickfix actions: 'quickfix'\n */\n CodeActionKind.QuickFix = 'quickfix';\n /**\n * Base kind for refactoring actions: 'refactor'\n */\n CodeActionKind.Refactor = 'refactor';\n /**\n * Base kind for refactoring extraction actions: 'refactor.extract'\n *\n * Example extract actions:\n *\n * - Extract method\n * - Extract function\n * - Extract variable\n * - Extract interface from class\n * - ...\n */\n CodeActionKind.RefactorExtract = 'refactor.extract';\n /**\n * Base kind for refactoring inline actions: 'refactor.inline'\n *\n * Example inline actions:\n *\n * - Inline function\n * - Inline variable\n * - Inline constant\n * - ...\n */\n CodeActionKind.RefactorInline = 'refactor.inline';\n /**\n * Base kind for refactoring rewrite actions: 'refactor.rewrite'\n *\n * Example rewrite actions:\n *\n * - Convert JavaScript function to class\n * - Add or remove parameter\n * - Encapsulate field\n * - Make method static\n * - Move method to base class\n * - ...\n */\n CodeActionKind.RefactorRewrite = 'refactor.rewrite';\n /**\n * Base kind for source actions: `source`\n *\n * Source code actions apply to the entire file.\n */\n CodeActionKind.Source = 'source';\n /**\n * Base kind for an organize imports source action: `source.organizeImports`\n */\n CodeActionKind.SourceOrganizeImports = 'source.organizeImports';\n /**\n * Base kind for auto-fix source actions: `source.fixAll`.\n *\n * Fix all actions automatically fix errors that have a clear fix that do not require user input.\n * They should not suppress errors or perform unsafe fixes such as generating new types or classes.\n *\n * @since 3.15.0\n */\n CodeActionKind.SourceFixAll = 'source.fixAll';\n})(CodeActionKind || (CodeActionKind = {}));\n/**\n * The reason why code actions were requested.\n *\n * @since 3.17.0\n */\nexport var CodeActionTriggerKind;\n(function (CodeActionTriggerKind) {\n /**\n * Code actions were explicitly requested by the user or by an extension.\n */\n CodeActionTriggerKind.Invoked = 1;\n /**\n * Code actions were requested automatically.\n *\n * This typically happens when current selection in a file changes, but can\n * also be triggered when file content changes.\n */\n CodeActionTriggerKind.Automatic = 2;\n})(CodeActionTriggerKind || (CodeActionTriggerKind = {}));\n/**\n * The CodeActionContext namespace provides helper functions to work with\n * {@link CodeActionContext} literals.\n */\nexport var CodeActionContext;\n(function (CodeActionContext) {\n /**\n * Creates a new CodeActionContext literal.\n */\n function create(diagnostics, only, triggerKind) {\n let result = { diagnostics };\n if (only !== undefined && only !== null) {\n result.only = only;\n }\n if (triggerKind !== undefined && triggerKind !== null) {\n result.triggerKind = triggerKind;\n }\n return result;\n }\n CodeActionContext.create = create;\n /**\n * Checks whether the given literal conforms to the {@link CodeActionContext} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.typedArray(candidate.diagnostics, Diagnostic.is)\n && (candidate.only === undefined || Is.typedArray(candidate.only, Is.string))\n && (candidate.triggerKind === undefined || candidate.triggerKind === CodeActionTriggerKind.Invoked || candidate.triggerKind === CodeActionTriggerKind.Automatic);\n }\n CodeActionContext.is = is;\n})(CodeActionContext || (CodeActionContext = {}));\nexport var CodeAction;\n(function (CodeAction) {\n function create(title, kindOrCommandOrEdit, kind) {\n let result = { title };\n let checkKind = true;\n if (typeof kindOrCommandOrEdit === 'string') {\n checkKind = false;\n result.kind = kindOrCommandOrEdit;\n }\n else if (Command.is(kindOrCommandOrEdit)) {\n result.command = kindOrCommandOrEdit;\n }\n else {\n result.edit = kindOrCommandOrEdit;\n }\n if (checkKind && kind !== undefined) {\n result.kind = kind;\n }\n return result;\n }\n CodeAction.create = create;\n function is(value) {\n let candidate = value;\n return candidate && Is.string(candidate.title) &&\n (candidate.diagnostics === undefined || Is.typedArray(candidate.diagnostics, Diagnostic.is)) &&\n (candidate.kind === undefined || Is.string(candidate.kind)) &&\n (candidate.edit !== undefined || candidate.command !== undefined) &&\n (candidate.command === undefined || Command.is(candidate.command)) &&\n (candidate.isPreferred === undefined || Is.boolean(candidate.isPreferred)) &&\n (candidate.edit === undefined || WorkspaceEdit.is(candidate.edit));\n }\n CodeAction.is = is;\n})(CodeAction || (CodeAction = {}));\n/**\n * The CodeLens namespace provides helper functions to work with\n * {@link CodeLens} literals.\n */\nexport var CodeLens;\n(function (CodeLens) {\n /**\n * Creates a new CodeLens literal.\n */\n function create(range, data) {\n let result = { range };\n if (Is.defined(data)) {\n result.data = data;\n }\n return result;\n }\n CodeLens.create = create;\n /**\n * Checks whether the given literal conforms to the {@link CodeLens} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.command) || Command.is(candidate.command));\n }\n CodeLens.is = is;\n})(CodeLens || (CodeLens = {}));\n/**\n * The FormattingOptions namespace provides helper functions to work with\n * {@link FormattingOptions} literals.\n */\nexport var FormattingOptions;\n(function (FormattingOptions) {\n /**\n * Creates a new FormattingOptions literal.\n */\n function create(tabSize, insertSpaces) {\n return { tabSize, insertSpaces };\n }\n FormattingOptions.create = create;\n /**\n * Checks whether the given literal conforms to the {@link FormattingOptions} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.uinteger(candidate.tabSize) && Is.boolean(candidate.insertSpaces);\n }\n FormattingOptions.is = is;\n})(FormattingOptions || (FormattingOptions = {}));\n/**\n * The DocumentLink namespace provides helper functions to work with\n * {@link DocumentLink} literals.\n */\nexport var DocumentLink;\n(function (DocumentLink) {\n /**\n * Creates a new DocumentLink literal.\n */\n function create(range, target, data) {\n return { range, target, data };\n }\n DocumentLink.create = create;\n /**\n * Checks whether the given literal conforms to the {@link DocumentLink} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.target) || Is.string(candidate.target));\n }\n DocumentLink.is = is;\n})(DocumentLink || (DocumentLink = {}));\n/**\n * The SelectionRange namespace provides helper function to work with\n * SelectionRange literals.\n */\nexport var SelectionRange;\n(function (SelectionRange) {\n /**\n * Creates a new SelectionRange\n * @param range the range.\n * @param parent an optional parent.\n */\n function create(range, parent) {\n return { range, parent };\n }\n SelectionRange.create = create;\n function is(value) {\n let candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.range) && (candidate.parent === undefined || SelectionRange.is(candidate.parent));\n }\n SelectionRange.is = is;\n})(SelectionRange || (SelectionRange = {}));\n/**\n * A set of predefined token types. This set is not fixed\n * an clients can specify additional token types via the\n * corresponding client capabilities.\n *\n * @since 3.16.0\n */\nexport var SemanticTokenTypes;\n(function (SemanticTokenTypes) {\n SemanticTokenTypes[\"namespace\"] = \"namespace\";\n /**\n * Represents a generic type. Acts as a fallback for types which can't be mapped to\n * a specific type like class or enum.\n */\n SemanticTokenTypes[\"type\"] = \"type\";\n SemanticTokenTypes[\"class\"] = \"class\";\n SemanticTokenTypes[\"enum\"] = \"enum\";\n SemanticTokenTypes[\"interface\"] = \"interface\";\n SemanticTokenTypes[\"struct\"] = \"struct\";\n SemanticTokenTypes[\"typeParameter\"] = \"typeParameter\";\n SemanticTokenTypes[\"parameter\"] = \"parameter\";\n SemanticTokenTypes[\"variable\"] = \"variable\";\n SemanticTokenTypes[\"property\"] = \"property\";\n SemanticTokenTypes[\"enumMember\"] = \"enumMember\";\n SemanticTokenTypes[\"event\"] = \"event\";\n SemanticTokenTypes[\"function\"] = \"function\";\n SemanticTokenTypes[\"method\"] = \"method\";\n SemanticTokenTypes[\"macro\"] = \"macro\";\n SemanticTokenTypes[\"keyword\"] = \"keyword\";\n SemanticTokenTypes[\"modifier\"] = \"modifier\";\n SemanticTokenTypes[\"comment\"] = \"comment\";\n SemanticTokenTypes[\"string\"] = \"string\";\n SemanticTokenTypes[\"number\"] = \"number\";\n SemanticTokenTypes[\"regexp\"] = \"regexp\";\n SemanticTokenTypes[\"operator\"] = \"operator\";\n /**\n * @since 3.17.0\n */\n SemanticTokenTypes[\"decorator\"] = \"decorator\";\n})(SemanticTokenTypes || (SemanticTokenTypes = {}));\n/**\n * A set of predefined token modifiers. This set is not fixed\n * an clients can specify additional token types via the\n * corresponding client capabilities.\n *\n * @since 3.16.0\n */\nexport var SemanticTokenModifiers;\n(function (SemanticTokenModifiers) {\n SemanticTokenModifiers[\"declaration\"] = \"declaration\";\n SemanticTokenModifiers[\"definition\"] = \"definition\";\n SemanticTokenModifiers[\"readonly\"] = \"readonly\";\n SemanticTokenModifiers[\"static\"] = \"static\";\n SemanticTokenModifiers[\"deprecated\"] = \"deprecated\";\n SemanticTokenModifiers[\"abstract\"] = \"abstract\";\n SemanticTokenModifiers[\"async\"] = \"async\";\n SemanticTokenModifiers[\"modification\"] = \"modification\";\n SemanticTokenModifiers[\"documentation\"] = \"documentation\";\n SemanticTokenModifiers[\"defaultLibrary\"] = \"defaultLibrary\";\n})(SemanticTokenModifiers || (SemanticTokenModifiers = {}));\n/**\n * @since 3.16.0\n */\nexport var SemanticTokens;\n(function (SemanticTokens) {\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && (candidate.resultId === undefined || typeof candidate.resultId === 'string') &&\n Array.isArray(candidate.data) && (candidate.data.length === 0 || typeof candidate.data[0] === 'number');\n }\n SemanticTokens.is = is;\n})(SemanticTokens || (SemanticTokens = {}));\n/**\n * The InlineValueText namespace provides functions to deal with InlineValueTexts.\n *\n * @since 3.17.0\n */\nexport var InlineValueText;\n(function (InlineValueText) {\n /**\n * Creates a new InlineValueText literal.\n */\n function create(range, text) {\n return { range, text };\n }\n InlineValueText.create = create;\n function is(value) {\n const candidate = value;\n return candidate !== undefined && candidate !== null && Range.is(candidate.range) && Is.string(candidate.text);\n }\n InlineValueText.is = is;\n})(InlineValueText || (InlineValueText = {}));\n/**\n * The InlineValueVariableLookup namespace provides functions to deal with InlineValueVariableLookups.\n *\n * @since 3.17.0\n */\nexport var InlineValueVariableLookup;\n(function (InlineValueVariableLookup) {\n /**\n * Creates a new InlineValueText literal.\n */\n function create(range, variableName, caseSensitiveLookup) {\n return { range, variableName, caseSensitiveLookup };\n }\n InlineValueVariableLookup.create = create;\n function is(value) {\n const candidate = value;\n return candidate !== undefined && candidate !== null && Range.is(candidate.range) && Is.boolean(candidate.caseSensitiveLookup)\n && (Is.string(candidate.variableName) || candidate.variableName === undefined);\n }\n InlineValueVariableLookup.is = is;\n})(InlineValueVariableLookup || (InlineValueVariableLookup = {}));\n/**\n * The InlineValueEvaluatableExpression namespace provides functions to deal with InlineValueEvaluatableExpression.\n *\n * @since 3.17.0\n */\nexport var InlineValueEvaluatableExpression;\n(function (InlineValueEvaluatableExpression) {\n /**\n * Creates a new InlineValueEvaluatableExpression literal.\n */\n function create(range, expression) {\n return { range, expression };\n }\n InlineValueEvaluatableExpression.create = create;\n function is(value) {\n const candidate = value;\n return candidate !== undefined && candidate !== null && Range.is(candidate.range)\n && (Is.string(candidate.expression) || candidate.expression === undefined);\n }\n InlineValueEvaluatableExpression.is = is;\n})(InlineValueEvaluatableExpression || (InlineValueEvaluatableExpression = {}));\n/**\n * The InlineValueContext namespace provides helper functions to work with\n * {@link InlineValueContext} literals.\n *\n * @since 3.17.0\n */\nexport var InlineValueContext;\n(function (InlineValueContext) {\n /**\n * Creates a new InlineValueContext literal.\n */\n function create(frameId, stoppedLocation) {\n return { frameId, stoppedLocation };\n }\n InlineValueContext.create = create;\n /**\n * Checks whether the given literal conforms to the {@link InlineValueContext} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.defined(candidate) && Range.is(value.stoppedLocation);\n }\n InlineValueContext.is = is;\n})(InlineValueContext || (InlineValueContext = {}));\n/**\n * Inlay hint kinds.\n *\n * @since 3.17.0\n */\nexport var InlayHintKind;\n(function (InlayHintKind) {\n /**\n * An inlay hint that for a type annotation.\n */\n InlayHintKind.Type = 1;\n /**\n * An inlay hint that is for a parameter.\n */\n InlayHintKind.Parameter = 2;\n function is(value) {\n return value === 1 || value === 2;\n }\n InlayHintKind.is = is;\n})(InlayHintKind || (InlayHintKind = {}));\nexport var InlayHintLabelPart;\n(function (InlayHintLabelPart) {\n function create(value) {\n return { value };\n }\n InlayHintLabelPart.create = create;\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate)\n && (candidate.tooltip === undefined || Is.string(candidate.tooltip) || MarkupContent.is(candidate.tooltip))\n && (candidate.location === undefined || Location.is(candidate.location))\n && (candidate.command === undefined || Command.is(candidate.command));\n }\n InlayHintLabelPart.is = is;\n})(InlayHintLabelPart || (InlayHintLabelPart = {}));\nexport var InlayHint;\n(function (InlayHint) {\n function create(position, label, kind) {\n const result = { position, label };\n if (kind !== undefined) {\n result.kind = kind;\n }\n return result;\n }\n InlayHint.create = create;\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Position.is(candidate.position)\n && (Is.string(candidate.label) || Is.typedArray(candidate.label, InlayHintLabelPart.is))\n && (candidate.kind === undefined || InlayHintKind.is(candidate.kind))\n && (candidate.textEdits === undefined) || Is.typedArray(candidate.textEdits, TextEdit.is)\n && (candidate.tooltip === undefined || Is.string(candidate.tooltip) || MarkupContent.is(candidate.tooltip))\n && (candidate.paddingLeft === undefined || Is.boolean(candidate.paddingLeft))\n && (candidate.paddingRight === undefined || Is.boolean(candidate.paddingRight));\n }\n InlayHint.is = is;\n})(InlayHint || (InlayHint = {}));\nexport var StringValue;\n(function (StringValue) {\n function createSnippet(value) {\n return { kind: 'snippet', value };\n }\n StringValue.createSnippet = createSnippet;\n})(StringValue || (StringValue = {}));\nexport var InlineCompletionItem;\n(function (InlineCompletionItem) {\n function create(insertText, filterText, range, command) {\n return { insertText, filterText, range, command };\n }\n InlineCompletionItem.create = create;\n})(InlineCompletionItem || (InlineCompletionItem = {}));\nexport var InlineCompletionList;\n(function (InlineCompletionList) {\n function create(items) {\n return { items };\n }\n InlineCompletionList.create = create;\n})(InlineCompletionList || (InlineCompletionList = {}));\n/**\n * Describes how an {@link InlineCompletionItemProvider inline completion provider} was triggered.\n *\n * @since 3.18.0\n * @proposed\n */\nexport var InlineCompletionTriggerKind;\n(function (InlineCompletionTriggerKind) {\n /**\n * Completion was triggered explicitly by a user gesture.\n */\n InlineCompletionTriggerKind.Invoked = 0;\n /**\n * Completion was triggered automatically while editing.\n */\n InlineCompletionTriggerKind.Automatic = 1;\n})(InlineCompletionTriggerKind || (InlineCompletionTriggerKind = {}));\nexport var SelectedCompletionInfo;\n(function (SelectedCompletionInfo) {\n function create(range, text) {\n return { range, text };\n }\n SelectedCompletionInfo.create = create;\n})(SelectedCompletionInfo || (SelectedCompletionInfo = {}));\nexport var InlineCompletionContext;\n(function (InlineCompletionContext) {\n function create(triggerKind, selectedCompletionInfo) {\n return { triggerKind, selectedCompletionInfo };\n }\n InlineCompletionContext.create = create;\n})(InlineCompletionContext || (InlineCompletionContext = {}));\nexport var WorkspaceFolder;\n(function (WorkspaceFolder) {\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && URI.is(candidate.uri) && Is.string(candidate.name);\n }\n WorkspaceFolder.is = is;\n})(WorkspaceFolder || (WorkspaceFolder = {}));\nexport const EOL = ['\\n', '\\r\\n', '\\r'];\n/**\n * @deprecated Use the text document from the new vscode-languageserver-textdocument package.\n */\nexport var TextDocument;\n(function (TextDocument) {\n /**\n * Creates a new ITextDocument literal from the given uri and content.\n * @param uri The document's uri.\n * @param languageId The document's language Id.\n * @param version The document's version.\n * @param content The document's content.\n */\n function create(uri, languageId, version, content) {\n return new FullTextDocument(uri, languageId, version, content);\n }\n TextDocument.create = create;\n /**\n * Checks whether the given literal conforms to the {@link ITextDocument} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && (Is.undefined(candidate.languageId) || Is.string(candidate.languageId)) && Is.uinteger(candidate.lineCount)\n && Is.func(candidate.getText) && Is.func(candidate.positionAt) && Is.func(candidate.offsetAt) ? true : false;\n }\n TextDocument.is = is;\n function applyEdits(document, edits) {\n let text = document.getText();\n let sortedEdits = mergeSort(edits, (a, b) => {\n let diff = a.range.start.line - b.range.start.line;\n if (diff === 0) {\n return a.range.start.character - b.range.start.character;\n }\n return diff;\n });\n let lastModifiedOffset = text.length;\n for (let i = sortedEdits.length - 1; i >= 0; i--) {\n let e = sortedEdits[i];\n let startOffset = document.offsetAt(e.range.start);\n let endOffset = document.offsetAt(e.range.end);\n if (endOffset <= lastModifiedOffset) {\n text = text.substring(0, startOffset) + e.newText + text.substring(endOffset, text.length);\n }\n else {\n throw new Error('Overlapping edit');\n }\n lastModifiedOffset = startOffset;\n }\n return text;\n }\n TextDocument.applyEdits = applyEdits;\n function mergeSort(data, compare) {\n if (data.length <= 1) {\n // sorted\n return data;\n }\n const p = (data.length / 2) | 0;\n const left = data.slice(0, p);\n const right = data.slice(p);\n mergeSort(left, compare);\n mergeSort(right, compare);\n let leftIdx = 0;\n let rightIdx = 0;\n let i = 0;\n while (leftIdx < left.length && rightIdx < right.length) {\n let ret = compare(left[leftIdx], right[rightIdx]);\n if (ret <= 0) {\n // smaller_equal -> take left to preserve order\n data[i++] = left[leftIdx++];\n }\n else {\n // greater -> take right\n data[i++] = right[rightIdx++];\n }\n }\n while (leftIdx < left.length) {\n data[i++] = left[leftIdx++];\n }\n while (rightIdx < right.length) {\n data[i++] = right[rightIdx++];\n }\n return data;\n }\n})(TextDocument || (TextDocument = {}));\n/**\n * @deprecated Use the text document from the new vscode-languageserver-textdocument package.\n */\nclass FullTextDocument {\n constructor(uri, languageId, version, content) {\n this._uri = uri;\n this._languageId = languageId;\n this._version = version;\n this._content = content;\n this._lineOffsets = undefined;\n }\n get uri() {\n return this._uri;\n }\n get languageId() {\n return this._languageId;\n }\n get version() {\n return this._version;\n }\n getText(range) {\n if (range) {\n let start = this.offsetAt(range.start);\n let end = this.offsetAt(range.end);\n return this._content.substring(start, end);\n }\n return this._content;\n }\n update(event, version) {\n this._content = event.text;\n this._version = version;\n this._lineOffsets = undefined;\n }\n getLineOffsets() {\n if (this._lineOffsets === undefined) {\n let lineOffsets = [];\n let text = this._content;\n let isLineStart = true;\n for (let i = 0; i < text.length; i++) {\n if (isLineStart) {\n lineOffsets.push(i);\n isLineStart = false;\n }\n let ch = text.charAt(i);\n isLineStart = (ch === '\\r' || ch === '\\n');\n if (ch === '\\r' && i + 1 < text.length && text.charAt(i + 1) === '\\n') {\n i++;\n }\n }\n if (isLineStart && text.length > 0) {\n lineOffsets.push(text.length);\n }\n this._lineOffsets = lineOffsets;\n }\n return this._lineOffsets;\n }\n positionAt(offset) {\n offset = Math.max(Math.min(offset, this._content.length), 0);\n let lineOffsets = this.getLineOffsets();\n let low = 0, high = lineOffsets.length;\n if (high === 0) {\n return Position.create(0, offset);\n }\n while (low < high) {\n let mid = Math.floor((low + high) / 2);\n if (lineOffsets[mid] > offset) {\n high = mid;\n }\n else {\n low = mid + 1;\n }\n }\n // low is the least x for which the line offset is larger than the current offset\n // or array.length if no line offset is larger than the current offset\n let line = low - 1;\n return Position.create(line, offset - lineOffsets[line]);\n }\n offsetAt(position) {\n let lineOffsets = this.getLineOffsets();\n if (position.line >= lineOffsets.length) {\n return this._content.length;\n }\n else if (position.line < 0) {\n return 0;\n }\n let lineOffset = lineOffsets[position.line];\n let nextLineOffset = (position.line + 1 < lineOffsets.length) ? lineOffsets[position.line + 1] : this._content.length;\n return Math.max(Math.min(lineOffset + position.character, nextLineOffset), lineOffset);\n }\n get lineCount() {\n return this.getLineOffsets().length;\n }\n}\nvar Is;\n(function (Is) {\n const toString = Object.prototype.toString;\n function defined(value) {\n return typeof value !== 'undefined';\n }\n Is.defined = defined;\n function undefined(value) {\n return typeof value === 'undefined';\n }\n Is.undefined = undefined;\n function boolean(value) {\n return value === true || value === false;\n }\n Is.boolean = boolean;\n function string(value) {\n return toString.call(value) === '[object String]';\n }\n Is.string = string;\n function number(value) {\n return toString.call(value) === '[object Number]';\n }\n Is.number = number;\n function numberRange(value, min, max) {\n return toString.call(value) === '[object Number]' && min <= value && value <= max;\n }\n Is.numberRange = numberRange;\n function integer(value) {\n return toString.call(value) === '[object Number]' && -2147483648 <= value && value <= 2147483647;\n }\n Is.integer = integer;\n function uinteger(value) {\n return toString.call(value) === '[object Number]' && 0 <= value && value <= 2147483647;\n }\n Is.uinteger = uinteger;\n function func(value) {\n return toString.call(value) === '[object Function]';\n }\n Is.func = func;\n function objectLiteral(value) {\n // Strictly speaking class instances pass this check as well. Since the LSP\n // doesn't use classes we ignore this for now. If we do we need to add something\n // like this: `Object.getPrototypeOf(Object.getPrototypeOf(x)) === null`\n return value !== null && typeof value === 'object';\n }\n Is.objectLiteral = objectLiteral;\n function typedArray(value, check) {\n return Array.isArray(value) && value.every(check);\n }\n Is.typedArray = typedArray;\n})(Is || (Is = {}));\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { IToken, TokenType } from 'chevrotain';\r\nimport type { Range } from 'vscode-languageserver-types';\r\nimport type { AbstractElement } from '../languages/generated/ast.js';\r\nimport type { AstNode, CompositeCstNode, CstNode, LeafCstNode, RootCstNode } from '../syntax-tree.js';\r\nimport { Position } from 'vscode-languageserver-types';\r\nimport { tokenToRange } from '../utils/cst-utils.js';\r\n\r\nexport class CstNodeBuilder {\r\n\r\n private rootNode!: RootCstNodeImpl;\r\n private nodeStack: CompositeCstNodeImpl[] = [];\r\n\r\n get current(): CompositeCstNodeImpl {\r\n return this.nodeStack[this.nodeStack.length - 1] ?? this.rootNode;\r\n }\r\n\r\n buildRootNode(input: string): RootCstNode {\r\n this.rootNode = new RootCstNodeImpl(input);\r\n this.rootNode.root = this.rootNode;\r\n this.nodeStack = [this.rootNode];\r\n return this.rootNode;\r\n }\r\n\r\n buildCompositeNode(feature: AbstractElement): CompositeCstNode {\r\n const compositeNode = new CompositeCstNodeImpl();\r\n compositeNode.grammarSource = feature;\r\n compositeNode.root = this.rootNode;\r\n this.current.content.push(compositeNode);\r\n this.nodeStack.push(compositeNode);\r\n return compositeNode;\r\n }\r\n\r\n buildLeafNode(token: IToken, feature?: AbstractElement): LeafCstNode {\r\n const leafNode = new LeafCstNodeImpl(token.startOffset, token.image.length, tokenToRange(token), token.tokenType, !feature);\r\n leafNode.grammarSource = feature;\r\n leafNode.root = this.rootNode;\r\n this.current.content.push(leafNode);\r\n return leafNode;\r\n }\r\n\r\n removeNode(node: CstNode): void {\r\n const parent = node.container;\r\n if (parent) {\r\n const index = parent.content.indexOf(node);\r\n if (index >= 0) {\r\n parent.content.splice(index, 1);\r\n }\r\n }\r\n }\r\n\r\n addHiddenNodes(tokens: IToken[]): void {\r\n const nodes: LeafCstNode[] = [];\r\n for (const token of tokens) {\r\n const leafNode = new LeafCstNodeImpl(token.startOffset, token.image.length, tokenToRange(token), token.tokenType, true);\r\n leafNode.root = this.rootNode;\r\n nodes.push(leafNode);\r\n }\r\n let current: CompositeCstNode = this.current;\r\n let added = false;\r\n // If we are within a composite node, we add the hidden nodes to the content\r\n if (current.content.length > 0) {\r\n current.content.push(...nodes);\r\n return;\r\n }\r\n // Otherwise we are at a newly created node\r\n // Instead of adding the hidden nodes here, we search for the first parent node with content\r\n while (current.container) {\r\n const index = current.container.content.indexOf(current);\r\n if (index > 0) {\r\n // Add the hidden nodes before the current node\r\n current.container.content.splice(index, 0, ...nodes);\r\n added = true;\r\n break;\r\n }\r\n current = current.container;\r\n }\r\n // If we arrive at the root node, we add the hidden nodes at the beginning\r\n // This is the case if the hidden nodes are the first nodes in the tree\r\n if (!added) {\r\n this.rootNode.content.unshift(...nodes);\r\n }\r\n }\r\n\r\n construct(item: { $type: string | symbol | undefined, $cstNode: CstNode }): void {\r\n const current: CstNode = this.current;\r\n // The specified item could be a datatype ($type is symbol) or a fragment ($type is undefined)\r\n // Only if the $type is a string, we actually assign the element\r\n if (typeof item.$type === 'string') {\r\n this.current.astNode = <AstNode>item;\r\n }\r\n item.$cstNode = current;\r\n const node = this.nodeStack.pop();\r\n // Empty composite nodes are not valid\r\n // Simply remove the node from the tree\r\n if (node?.content.length === 0) {\r\n this.removeNode(node);\r\n }\r\n }\r\n}\r\n\r\nexport abstract class AbstractCstNode implements CstNode {\r\n abstract get offset(): number;\r\n abstract get length(): number;\r\n abstract get end(): number;\r\n abstract get range(): Range;\r\n\r\n container?: CompositeCstNode;\r\n grammarSource?: AbstractElement;\r\n root: RootCstNode;\r\n private _astNode?: AstNode;\r\n\r\n /** @deprecated use `container` instead. */\r\n get parent(): CompositeCstNode | undefined {\r\n return this.container;\r\n }\r\n\r\n /** @deprecated use `grammarSource` instead. */\r\n get feature(): AbstractElement | undefined {\r\n return this.grammarSource;\r\n }\r\n\r\n get hidden(): boolean {\r\n return false;\r\n }\r\n\r\n get astNode(): AstNode {\r\n const node = typeof this._astNode?.$type === 'string' ? this._astNode : this.container?.astNode;\r\n if (!node) {\r\n throw new Error('This node has no associated AST element');\r\n }\r\n return node;\r\n }\r\n\r\n set astNode(value: AstNode | undefined) {\r\n this._astNode = value;\r\n }\r\n\r\n /** @deprecated use `astNode` instead. */\r\n get element(): AstNode {\r\n return this.astNode;\r\n }\r\n\r\n get text(): string {\r\n return this.root.fullText.substring(this.offset, this.end);\r\n }\r\n}\r\n\r\nexport class LeafCstNodeImpl extends AbstractCstNode implements LeafCstNode {\r\n get offset(): number {\r\n return this._offset;\r\n }\r\n\r\n get length(): number {\r\n return this._length;\r\n }\r\n\r\n get end(): number {\r\n return this._offset + this._length;\r\n }\r\n\r\n override get hidden(): boolean {\r\n return this._hidden;\r\n }\r\n\r\n get tokenType(): TokenType {\r\n return this._tokenType;\r\n }\r\n\r\n get range(): Range {\r\n return this._range;\r\n }\r\n\r\n private _hidden: boolean;\r\n private _offset: number;\r\n private _length: number;\r\n private _range: Range;\r\n private _tokenType: TokenType;\r\n\r\n constructor(offset: number, length: number, range: Range, tokenType: TokenType, hidden = false) {\r\n super();\r\n this._hidden = hidden;\r\n this._offset = offset;\r\n this._tokenType = tokenType;\r\n this._length = length;\r\n this._range = range;\r\n }\r\n}\r\n\r\nexport class CompositeCstNodeImpl extends AbstractCstNode implements CompositeCstNode {\r\n readonly content: CstNode[] = new CstNodeContainer(this);\r\n private _rangeCache?: Range;\r\n\r\n /** @deprecated use `content` instead. */\r\n get children(): CstNode[] {\r\n return this.content;\r\n }\r\n\r\n get offset(): number {\r\n return this.firstNonHiddenNode?.offset ?? 0;\r\n }\r\n\r\n get length(): number {\r\n return this.end - this.offset;\r\n }\r\n\r\n get end(): number {\r\n return this.lastNonHiddenNode?.end ?? 0;\r\n }\r\n\r\n get range(): Range {\r\n const firstNode = this.firstNonHiddenNode;\r\n const lastNode = this.lastNonHiddenNode;\r\n if (firstNode && lastNode) {\r\n if (this._rangeCache === undefined) {\r\n const { range: firstRange } = firstNode;\r\n const { range: lastRange } = lastNode;\r\n this._rangeCache = { start: firstRange.start, end: lastRange.end.line < firstRange.start.line ? firstRange.start : lastRange.end };\r\n }\r\n return this._rangeCache;\r\n } else {\r\n return { start: Position.create(0, 0), end: Position.create(0, 0) };\r\n }\r\n }\r\n\r\n private get firstNonHiddenNode(): CstNode | undefined {\r\n for (const child of this.content) {\r\n if (!child.hidden) {\r\n return child;\r\n }\r\n }\r\n return this.content[0];\r\n }\r\n\r\n private get lastNonHiddenNode(): CstNode | undefined {\r\n for (let i = this.content.length - 1; i >= 0; i--) {\r\n const child = this.content[i];\r\n if (!child.hidden) {\r\n return child;\r\n }\r\n }\r\n return this.content[this.content.length - 1];\r\n }\r\n}\r\n\r\nclass CstNodeContainer extends Array<CstNode> {\r\n readonly parent: CompositeCstNode;\r\n\r\n constructor(parent: CompositeCstNode) {\r\n super();\r\n this.parent = parent;\r\n Object.setPrototypeOf(this, CstNodeContainer.prototype);\r\n }\r\n\r\n override push(...items: CstNode[]): number {\r\n this.addParents(items);\r\n return super.push(...items);\r\n }\r\n\r\n override unshift(...items: CstNode[]): number {\r\n this.addParents(items);\r\n return super.unshift(...items);\r\n }\r\n\r\n override splice(start: number, count: number, ...items: CstNode[]): CstNode[] {\r\n this.addParents(items);\r\n return super.splice(start, count, ...items);\r\n }\r\n\r\n private addParents(items: CstNode[]): void {\r\n for (const item of items) {\r\n (<AbstractCstNode>item).container = this.parent;\r\n }\r\n }\r\n}\r\n\r\nexport class RootCstNodeImpl extends CompositeCstNodeImpl implements RootCstNode {\r\n private _text = '';\r\n\r\n override get text(): string {\r\n return this._text.substring(this.offset, this.end);\r\n }\r\n\r\n get fullText(): string {\r\n return this._text;\r\n }\r\n\r\n constructor(input?: string) {\r\n super();\r\n this._text = input ?? '';\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport type { DSLMethodOpts, ILexingError, IOrAlt, IParserErrorMessageProvider, IRecognitionException, IToken, TokenType, TokenVocabulary } from 'chevrotain';\r\nimport type { AbstractElement, Action, Assignment, ParserRule } from '../languages/generated/ast.js';\r\nimport type { Linker } from '../references/linker.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, AstReflection, CompositeCstNode, CstNode } from '../syntax-tree.js';\r\nimport type { Lexer, LexerResult } from './lexer.js';\r\nimport type { IParserConfig } from './parser-config.js';\r\nimport type { ValueConverter } from './value-converter.js';\r\nimport { defaultParserErrorProvider, EmbeddedActionsParser, LLkLookaheadStrategy } from 'chevrotain';\r\nimport { LLStarLookaheadStrategy } from 'chevrotain-allstar';\r\nimport { isAssignment, isCrossReference, isKeyword } from '../languages/generated/ast.js';\r\nimport { getExplicitRuleType, isDataTypeRule } from '../utils/grammar-utils.js';\r\nimport { assignMandatoryProperties, getContainerOfType, linkContentToContainer } from '../utils/ast-utils.js';\r\nimport { CstNodeBuilder } from './cst-node-builder.js';\r\nimport type { LexingReport } from './token-builder.js';\r\n\r\nexport type ParseResult<T = AstNode> = {\r\n value: T,\r\n parserErrors: IRecognitionException[],\r\n lexerErrors: ILexingError[],\r\n lexerReport?: LexingReport\r\n}\r\n\r\nexport const DatatypeSymbol = Symbol('Datatype');\r\n\r\ninterface DataTypeNode {\r\n $cstNode: CompositeCstNode\r\n /** Instead of a string, this node is uniquely identified by the `Datatype` symbol */\r\n $type: symbol\r\n /** Used as a storage for all parsed terminals, keywords and sub-datatype rules */\r\n value: string\r\n}\r\n\r\nfunction isDataTypeNode(node: { $type: string | symbol | undefined }): node is DataTypeNode {\r\n return node.$type === DatatypeSymbol;\r\n}\r\n\r\ntype RuleResult = (args: Args) => any;\r\n\r\ntype Args = Record<string, boolean>;\r\n\r\ntype RuleImpl = (args: Args) => any;\r\n\r\ninterface AssignmentElement {\r\n assignment?: Assignment\r\n isCrossRef: boolean\r\n}\r\n\r\n/**\r\n * Base interface for all parsers. Mainly used by the `parser-builder-base.ts` to perform work on different kinds of parsers.\r\n * The main use cases are:\r\n * * AST parser: Based on a string, create an AST for the current grammar\r\n * * Completion parser: Based on a partial string, identify the current position of the input within the grammar\r\n */\r\nexport interface BaseParser {\r\n /**\r\n * Adds a new parser rule to the parser\r\n */\r\n rule(rule: ParserRule, impl: RuleImpl): RuleResult;\r\n /**\r\n * Returns the executable rule function for the specified rule name\r\n */\r\n getRule(name: string): RuleResult | undefined;\r\n /**\r\n * Performs alternatives parsing (the `|` operation in EBNF/Langium)\r\n */\r\n alternatives(idx: number, choices: Array<IOrAlt<any>>): void;\r\n /**\r\n * Parses the callback as optional (the `?` operation in EBNF/Langium)\r\n */\r\n optional(idx: number, callback: DSLMethodOpts<unknown>): void;\r\n /**\r\n * Parses the callback 0 or more times (the `*` operation in EBNF/Langium)\r\n */\r\n many(idx: number, callback: DSLMethodOpts<unknown>): void;\r\n /**\r\n * Parses the callback 1 or more times (the `+` operation in EBNF/Langium)\r\n */\r\n atLeastOne(idx: number, callback: DSLMethodOpts<unknown>): void;\r\n /**\r\n * Consumes a specific token type from the token input stream.\r\n * Requires a unique index within the rule for a specific token type.\r\n */\r\n consume(idx: number, tokenType: TokenType, feature: AbstractElement): void;\r\n /**\r\n * Invokes the executable function for a given parser rule.\r\n * Requires a unique index within the rule for a specific sub rule.\r\n * Arguments can be supplied to the rule invocation for semantic predicates\r\n */\r\n subrule(idx: number, rule: RuleResult, fragment: boolean, feature: AbstractElement, args: Args): void;\r\n /**\r\n * Executes a grammar action that modifies the currently active AST node\r\n */\r\n action($type: string, action: Action): void;\r\n /**\r\n * Finishes construction of the current AST node. Only used by the AST parser.\r\n */\r\n construct(): unknown;\r\n /**\r\n * Whether the parser is currently actually in use or in \"recording mode\".\r\n * Recording mode is activated once when the parser is analyzing itself.\r\n * During this phase, no input exists and therefore no AST should be constructed\r\n */\r\n isRecording(): boolean;\r\n /**\r\n * Current state of the unordered groups\r\n */\r\n get unorderedGroups(): Map<string, boolean[]>;\r\n /**\r\n * The rule stack indicates the indices of rules that are currently invoked,\r\n * in order of their invocation.\r\n */\r\n getRuleStack(): number[];\r\n}\r\n\r\nconst ruleSuffix = '\\u200B';\r\nconst withRuleSuffix = (name: string): string => name.endsWith(ruleSuffix) ? name : name + ruleSuffix;\r\n\r\nexport abstract class AbstractLangiumParser implements BaseParser {\r\n\r\n protected readonly lexer: Lexer;\r\n protected readonly wrapper: ChevrotainWrapper;\r\n protected _unorderedGroups: Map<string, boolean[]> = new Map<string, boolean[]>();\r\n\r\n protected allRules = new Map<string, RuleResult>();\r\n protected mainRule!: RuleResult;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.lexer = services.parser.Lexer;\r\n const tokens = this.lexer.definition;\r\n const production = services.LanguageMetaData.mode === 'production';\r\n this.wrapper = new ChevrotainWrapper(tokens, {\r\n ...services.parser.ParserConfig,\r\n skipValidations: production,\r\n errorMessageProvider: services.parser.ParserErrorMessageProvider\r\n });\r\n }\r\n\r\n alternatives(idx: number, choices: Array<IOrAlt<any>>): void {\r\n this.wrapper.wrapOr(idx, choices);\r\n }\r\n\r\n optional(idx: number, callback: DSLMethodOpts<unknown>): void {\r\n this.wrapper.wrapOption(idx, callback);\r\n }\r\n\r\n many(idx: number, callback: DSLMethodOpts<unknown>): void {\r\n this.wrapper.wrapMany(idx, callback);\r\n }\r\n\r\n atLeastOne(idx: number, callback: DSLMethodOpts<unknown>): void {\r\n this.wrapper.wrapAtLeastOne(idx, callback);\r\n }\r\n\r\n abstract rule(rule: ParserRule, impl: RuleImpl): RuleResult;\r\n abstract consume(idx: number, tokenType: TokenType, feature: AbstractElement): void;\r\n abstract subrule(idx: number, rule: RuleResult, fragment: boolean, feature: AbstractElement, args: Args): void;\r\n abstract action($type: string, action: Action): void;\r\n abstract construct(): unknown;\r\n\r\n getRule(name: string): RuleResult | undefined {\r\n return this.allRules.get(name);\r\n }\r\n\r\n isRecording(): boolean {\r\n return this.wrapper.IS_RECORDING;\r\n }\r\n\r\n get unorderedGroups(): Map<string, boolean[]> {\r\n return this._unorderedGroups;\r\n }\r\n\r\n getRuleStack(): number[] {\r\n return (this.wrapper as any).RULE_STACK;\r\n }\r\n\r\n finalize(): void {\r\n this.wrapper.wrapSelfAnalysis();\r\n }\r\n}\r\n\r\nexport interface ParserOptions {\r\n rule?: string\r\n}\r\n\r\nexport class LangiumParser extends AbstractLangiumParser {\r\n private readonly linker: Linker;\r\n private readonly converter: ValueConverter;\r\n private readonly astReflection: AstReflection;\r\n private readonly nodeBuilder = new CstNodeBuilder();\r\n private lexerResult?: LexerResult;\r\n private stack: any[] = [];\r\n private assignmentMap = new Map<AbstractElement, AssignmentElement | undefined>();\r\n\r\n private get current(): any {\r\n return this.stack[this.stack.length - 1];\r\n }\r\n\r\n constructor(services: LangiumCoreServices) {\r\n super(services);\r\n this.linker = services.references.Linker;\r\n this.converter = services.parser.ValueConverter;\r\n this.astReflection = services.shared.AstReflection;\r\n }\r\n\r\n rule(rule: ParserRule, impl: RuleImpl): RuleResult {\r\n const type = this.computeRuleType(rule);\r\n const ruleMethod = this.wrapper.DEFINE_RULE(withRuleSuffix(rule.name), this.startImplementation(type, impl).bind(this));\r\n this.allRules.set(rule.name, ruleMethod);\r\n if (rule.entry) {\r\n this.mainRule = ruleMethod;\r\n }\r\n return ruleMethod;\r\n }\r\n\r\n private computeRuleType(rule: ParserRule): string | symbol | undefined {\r\n if (rule.fragment) {\r\n return undefined;\r\n } else if (isDataTypeRule(rule)) {\r\n return DatatypeSymbol;\r\n } else {\r\n const explicit = getExplicitRuleType(rule);\r\n return explicit ?? rule.name;\r\n }\r\n }\r\n\r\n parse<T extends AstNode = AstNode>(input: string, options: ParserOptions = {}): ParseResult<T> {\r\n this.nodeBuilder.buildRootNode(input);\r\n const lexerResult = this.lexerResult = this.lexer.tokenize(input);\r\n this.wrapper.input = lexerResult.tokens;\r\n const ruleMethod = options.rule ? this.allRules.get(options.rule) : this.mainRule;\r\n if (!ruleMethod) {\r\n throw new Error(options.rule ? `No rule found with name '${options.rule}'` : 'No main rule available.');\r\n }\r\n const result = ruleMethod.call(this.wrapper, {});\r\n this.nodeBuilder.addHiddenNodes(lexerResult.hidden);\r\n this.unorderedGroups.clear();\r\n this.lexerResult = undefined;\r\n return {\r\n value: result,\r\n lexerErrors: lexerResult.errors,\r\n lexerReport: lexerResult.report,\r\n parserErrors: this.wrapper.errors\r\n };\r\n }\r\n\r\n private startImplementation($type: string | symbol | undefined, implementation: RuleImpl): RuleImpl {\r\n return (args) => {\r\n // Only create a new AST node in case the calling rule is not a fragment rule\r\n const createNode = !this.isRecording() && $type !== undefined;\r\n if (createNode) {\r\n const node: any = { $type };\r\n this.stack.push(node);\r\n if ($type === DatatypeSymbol) {\r\n node.value = '';\r\n }\r\n }\r\n let result: unknown;\r\n try {\r\n result = implementation(args);\r\n } catch (err) {\r\n result = undefined;\r\n }\r\n if (result === undefined && createNode) {\r\n result = this.construct();\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n private extractHiddenTokens(token: IToken): IToken[] {\r\n const hiddenTokens = this.lexerResult!.hidden;\r\n if (!hiddenTokens.length) {\r\n return [];\r\n }\r\n const offset = token.startOffset;\r\n for (let i = 0; i < hiddenTokens.length; i++) {\r\n const token = hiddenTokens[i];\r\n if (token.startOffset > offset) {\r\n return hiddenTokens.splice(0, i);\r\n }\r\n }\r\n return hiddenTokens.splice(0, hiddenTokens.length);\r\n }\r\n\r\n consume(idx: number, tokenType: TokenType, feature: AbstractElement): void {\r\n const token = this.wrapper.wrapConsume(idx, tokenType);\r\n if (!this.isRecording() && this.isValidToken(token)) {\r\n const hiddenTokens = this.extractHiddenTokens(token);\r\n this.nodeBuilder.addHiddenNodes(hiddenTokens);\r\n const leafNode = this.nodeBuilder.buildLeafNode(token, feature);\r\n const { assignment, isCrossRef } = this.getAssignment(feature);\r\n const current = this.current;\r\n if (assignment) {\r\n const convertedValue = isKeyword(feature) ? token.image : this.converter.convert(token.image, leafNode);\r\n this.assign(assignment.operator, assignment.feature, convertedValue, leafNode, isCrossRef);\r\n } else if (isDataTypeNode(current)) {\r\n let text = token.image;\r\n if (!isKeyword(feature)) {\r\n text = this.converter.convert(text, leafNode).toString();\r\n }\r\n current.value += text;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Most consumed parser tokens are valid. However there are two cases in which they are not valid:\r\n *\r\n * 1. They were inserted during error recovery by the parser. These tokens don't really exist and should not be further processed\r\n * 2. They contain invalid token ranges. This might include the special EOF token, or other tokens produced by invalid token builders.\r\n */\r\n private isValidToken(token: IToken): boolean {\r\n return !token.isInsertedInRecovery && !isNaN(token.startOffset) && typeof token.endOffset === 'number' && !isNaN(token.endOffset);\r\n }\r\n\r\n subrule(idx: number, rule: RuleResult, fragment: boolean, feature: AbstractElement, args: Args): void {\r\n let cstNode: CompositeCstNode | undefined;\r\n if (!this.isRecording() && !fragment) {\r\n // We only want to create a new CST node if the subrule actually creates a new AST node.\r\n // In other cases like calls of fragment rules the current CST/AST is populated further.\r\n // Note that skipping this initialization and leaving cstNode unassigned also skips the subrule assignment later on.\r\n // This is intended, as fragment rules only enrich the current AST node\r\n cstNode = this.nodeBuilder.buildCompositeNode(feature);\r\n }\r\n const subruleResult = this.wrapper.wrapSubrule(idx, rule, args) as any;\r\n if (!this.isRecording() && cstNode && cstNode.length > 0) {\r\n this.performSubruleAssignment(subruleResult, feature, cstNode);\r\n }\r\n }\r\n\r\n private performSubruleAssignment(result: any, feature: AbstractElement, cstNode: CompositeCstNode): void {\r\n const { assignment, isCrossRef } = this.getAssignment(feature);\r\n if (assignment) {\r\n this.assign(assignment.operator, assignment.feature, result, cstNode, isCrossRef);\r\n } else if (!assignment) {\r\n // If we call a subrule without an assignment we either:\r\n // 1. append the result of the subrule (data type rule)\r\n // 2. override the current object with the newly parsed object\r\n // If the current element is an AST node and the result of the subrule\r\n // is a data type rule, we can safely discard the results.\r\n const current = this.current;\r\n if (isDataTypeNode(current)) {\r\n current.value += result.toString();\r\n } else if (typeof result === 'object' && result) {\r\n const object = this.assignWithoutOverride(result, current);\r\n const newItem = object;\r\n this.stack.pop();\r\n this.stack.push(newItem);\r\n }\r\n }\r\n }\r\n\r\n action($type: string, action: Action): void {\r\n if (!this.isRecording()) {\r\n let last = this.current;\r\n if (action.feature && action.operator) {\r\n last = this.construct();\r\n this.nodeBuilder.removeNode(last.$cstNode);\r\n const node = this.nodeBuilder.buildCompositeNode(action);\r\n node.content.push(last.$cstNode);\r\n const newItem = { $type };\r\n this.stack.push(newItem);\r\n this.assign(action.operator, action.feature, last, last.$cstNode, false);\r\n } else {\r\n last.$type = $type;\r\n }\r\n }\r\n }\r\n\r\n construct(): unknown {\r\n if (this.isRecording()) {\r\n return undefined;\r\n }\r\n const obj = this.current;\r\n linkContentToContainer(obj);\r\n this.nodeBuilder.construct(obj);\r\n this.stack.pop();\r\n if (isDataTypeNode(obj)) {\r\n return this.converter.convert(obj.value, obj.$cstNode);\r\n } else {\r\n assignMandatoryProperties(this.astReflection, obj);\r\n }\r\n return obj;\r\n }\r\n\r\n private getAssignment(feature: AbstractElement): AssignmentElement {\r\n if (!this.assignmentMap.has(feature)) {\r\n const assignment = getContainerOfType(feature, isAssignment);\r\n this.assignmentMap.set(feature, {\r\n assignment: assignment,\r\n isCrossRef: assignment ? isCrossReference(assignment.terminal) : false\r\n });\r\n }\r\n return this.assignmentMap.get(feature)!;\r\n }\r\n\r\n private assign(operator: string, feature: string, value: unknown, cstNode: CstNode, isCrossRef: boolean): void {\r\n const obj = this.current;\r\n let item: unknown;\r\n if (isCrossRef && typeof value === 'string') {\r\n item = this.linker.buildReference(obj, feature, cstNode, value);\r\n } else {\r\n item = value;\r\n }\r\n switch (operator) {\r\n case '=': {\r\n obj[feature] = item;\r\n break;\r\n }\r\n case '?=': {\r\n obj[feature] = true;\r\n break;\r\n }\r\n case '+=': {\r\n if (!Array.isArray(obj[feature])) {\r\n obj[feature] = [];\r\n }\r\n obj[feature].push(item);\r\n }\r\n }\r\n }\r\n\r\n private assignWithoutOverride(target: any, source: any): any {\r\n for (const [name, existingValue] of Object.entries(source)) {\r\n const newValue = target[name];\r\n if (newValue === undefined) {\r\n target[name] = existingValue;\r\n } else if (Array.isArray(newValue) && Array.isArray(existingValue)) {\r\n existingValue.push(...newValue);\r\n target[name] = existingValue;\r\n }\r\n }\r\n // The target was parsed from a unassigned subrule\r\n // After the subrule construction, it received a cst node\r\n // This CST node will later be overriden by the cst node builder\r\n // To prevent references to stale AST nodes in the CST,\r\n // we need to remove the reference here\r\n const targetCstNode = target.$cstNode;\r\n if (targetCstNode) {\r\n targetCstNode.astNode = undefined;\r\n target.$cstNode = undefined;\r\n }\r\n return target;\r\n }\r\n\r\n get definitionErrors(): IParserDefinitionError[] {\r\n return this.wrapper.definitionErrors;\r\n }\r\n}\r\n\r\nexport interface IParserDefinitionError {\r\n message: string\r\n type: number\r\n ruleName?: string\r\n}\r\n\r\nexport abstract class AbstractParserErrorMessageProvider implements IParserErrorMessageProvider {\r\n\r\n buildMismatchTokenMessage(options: {\r\n expected: TokenType\r\n actual: IToken\r\n previous: IToken\r\n ruleName: string\r\n }): string {\r\n return defaultParserErrorProvider.buildMismatchTokenMessage(options);\r\n }\r\n\r\n buildNotAllInputParsedMessage(options: {\r\n firstRedundant: IToken\r\n ruleName: string\r\n }): string {\r\n return defaultParserErrorProvider.buildNotAllInputParsedMessage(options);\r\n }\r\n\r\n buildNoViableAltMessage(options: {\r\n expectedPathsPerAlt: TokenType[][][]\r\n actual: IToken[]\r\n previous: IToken\r\n customUserDescription: string\r\n ruleName: string\r\n }): string {\r\n return defaultParserErrorProvider.buildNoViableAltMessage(options);\r\n }\r\n\r\n buildEarlyExitMessage(options: {\r\n expectedIterationPaths: TokenType[][]\r\n actual: IToken[]\r\n previous: IToken\r\n customUserDescription: string\r\n ruleName: string\r\n }): string {\r\n return defaultParserErrorProvider.buildEarlyExitMessage(options);\r\n }\r\n\r\n}\r\n\r\nexport class LangiumParserErrorMessageProvider extends AbstractParserErrorMessageProvider {\r\n\r\n override buildMismatchTokenMessage({ expected, actual }: {\r\n expected: TokenType\r\n actual: IToken\r\n previous: IToken\r\n ruleName: string\r\n }): string {\r\n const expectedMsg = expected.LABEL\r\n ? '`' + expected.LABEL + '`'\r\n : expected.name.endsWith(':KW')\r\n ? `keyword '${expected.name.substring(0, expected.name.length - 3)}'`\r\n : `token of type '${expected.name}'`;\r\n return `Expecting ${expectedMsg} but found \\`${actual.image}\\`.`;\r\n }\r\n\r\n override buildNotAllInputParsedMessage({ firstRedundant }: {\r\n firstRedundant: IToken\r\n ruleName: string\r\n }): string {\r\n return `Expecting end of file but found \\`${firstRedundant.image}\\`.`;\r\n }\r\n}\r\n\r\nexport interface CompletionParserResult {\r\n tokens: IToken[]\r\n elementStack: AbstractElement[]\r\n tokenIndex: number\r\n}\r\n\r\nexport class LangiumCompletionParser extends AbstractLangiumParser {\r\n private tokens: IToken[] = [];\r\n\r\n private elementStack: AbstractElement[] = [];\r\n private lastElementStack: AbstractElement[] = [];\r\n private nextTokenIndex = 0;\r\n private stackSize = 0;\r\n\r\n action(): void {\r\n // NOOP\r\n }\r\n\r\n construct(): unknown {\r\n // NOOP\r\n return undefined;\r\n }\r\n\r\n parse(input: string): CompletionParserResult {\r\n this.resetState();\r\n const tokens = this.lexer.tokenize(input, { mode: 'partial' });\r\n this.tokens = tokens.tokens;\r\n this.wrapper.input = [...this.tokens];\r\n this.mainRule.call(this.wrapper, {});\r\n this.unorderedGroups.clear();\r\n return {\r\n tokens: this.tokens,\r\n elementStack: [...this.lastElementStack],\r\n tokenIndex: this.nextTokenIndex\r\n };\r\n }\r\n\r\n rule(rule: ParserRule, impl: RuleImpl): RuleResult {\r\n const ruleMethod = this.wrapper.DEFINE_RULE(withRuleSuffix(rule.name), this.startImplementation(impl).bind(this));\r\n this.allRules.set(rule.name, ruleMethod);\r\n if (rule.entry) {\r\n this.mainRule = ruleMethod;\r\n }\r\n return ruleMethod;\r\n }\r\n\r\n private resetState(): void {\r\n this.elementStack = [];\r\n this.lastElementStack = [];\r\n this.nextTokenIndex = 0;\r\n this.stackSize = 0;\r\n }\r\n\r\n private startImplementation(implementation: RuleImpl): RuleImpl {\r\n return (args) => {\r\n const size = this.keepStackSize();\r\n try {\r\n implementation(args);\r\n } finally {\r\n this.resetStackSize(size);\r\n }\r\n };\r\n }\r\n\r\n private removeUnexpectedElements(): void {\r\n this.elementStack.splice(this.stackSize);\r\n }\r\n\r\n keepStackSize(): number {\r\n const size = this.elementStack.length;\r\n this.stackSize = size;\r\n return size;\r\n }\r\n\r\n resetStackSize(size: number): void {\r\n this.removeUnexpectedElements();\r\n this.stackSize = size;\r\n }\r\n\r\n consume(idx: number, tokenType: TokenType, feature: AbstractElement): void {\r\n this.wrapper.wrapConsume(idx, tokenType);\r\n if (!this.isRecording()) {\r\n this.lastElementStack = [...this.elementStack, feature];\r\n this.nextTokenIndex = this.currIdx + 1;\r\n }\r\n }\r\n\r\n subrule(idx: number, rule: RuleResult, fragment: boolean, feature: AbstractElement, args: Args): void {\r\n this.before(feature);\r\n this.wrapper.wrapSubrule(idx, rule, args);\r\n this.after(feature);\r\n }\r\n\r\n before(element: AbstractElement): void {\r\n if (!this.isRecording()) {\r\n this.elementStack.push(element);\r\n }\r\n }\r\n\r\n after(element: AbstractElement): void {\r\n if (!this.isRecording()) {\r\n const index = this.elementStack.lastIndexOf(element);\r\n if (index >= 0) {\r\n this.elementStack.splice(index);\r\n }\r\n }\r\n }\r\n\r\n get currIdx(): number {\r\n return (this.wrapper as any).currIdx;\r\n }\r\n}\r\n\r\nconst defaultConfig: IParserConfig = {\r\n recoveryEnabled: true,\r\n nodeLocationTracking: 'full',\r\n skipValidations: true,\r\n errorMessageProvider: new LangiumParserErrorMessageProvider()\r\n};\r\n\r\n/**\r\n * This class wraps the embedded actions parser of chevrotain and exposes protected methods.\r\n * This way, we can build the `LangiumParser` as a composition.\r\n */\r\nclass ChevrotainWrapper extends EmbeddedActionsParser {\r\n\r\n // This array is set in the base implementation of Chevrotain.\r\n definitionErrors: IParserDefinitionError[];\r\n\r\n constructor(tokens: TokenVocabulary, config: IParserConfig) {\r\n const useDefaultLookahead = config && 'maxLookahead' in config;\r\n super(tokens, {\r\n ...defaultConfig,\r\n lookaheadStrategy: useDefaultLookahead\r\n ? new LLkLookaheadStrategy({ maxLookahead: config.maxLookahead })\r\n : new LLStarLookaheadStrategy({\r\n // If validations are skipped, don't log the lookahead warnings\r\n logging: config.skipValidations ? () => { } : undefined\r\n }),\r\n ...config,\r\n });\r\n }\r\n\r\n get IS_RECORDING(): boolean {\r\n return this.RECORDING_PHASE;\r\n }\r\n\r\n DEFINE_RULE(name: string, impl: RuleImpl): RuleResult {\r\n return this.RULE(name, impl);\r\n }\r\n\r\n wrapSelfAnalysis(): void {\r\n this.performSelfAnalysis();\r\n }\r\n\r\n wrapConsume(idx: number, tokenType: TokenType): IToken {\r\n return this.consume(idx, tokenType);\r\n }\r\n\r\n wrapSubrule(idx: number, rule: RuleResult, args: Args): unknown {\r\n return this.subrule(idx, rule, {\r\n ARGS: [args]\r\n });\r\n }\r\n\r\n wrapOr(idx: number, choices: Array<IOrAlt<any>>): void {\r\n this.or(idx, choices);\r\n }\r\n\r\n wrapOption(idx: number, callback: DSLMethodOpts<unknown>): void {\r\n this.option(idx, callback);\r\n }\r\n\r\n wrapMany(idx: number, callback: DSLMethodOpts<unknown>): void {\r\n this.many(idx, callback);\r\n }\r\n\r\n wrapAtLeastOne(idx: number, callback: DSLMethodOpts<unknown>): void {\r\n this.atLeastOne(idx, callback);\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { IOrAlt, TokenType, TokenTypeDictionary } from 'chevrotain';\r\nimport type { AbstractElement, Action, Alternatives, Condition, CrossReference, Grammar, Group, Keyword, NamedArgument, ParserRule, RuleCall, UnorderedGroup } from '../languages/generated/ast.js';\r\nimport type { BaseParser } from './langium-parser.js';\r\nimport type { AstNode } from '../syntax-tree.js';\r\nimport type { Cardinality } from '../utils/grammar-utils.js';\r\nimport { EMPTY_ALT, EOF } from 'chevrotain';\r\nimport { isAction, isAlternatives, isEndOfFile, isAssignment, isConjunction, isCrossReference, isDisjunction, isGroup, isKeyword, isNegation, isParameterReference, isParserRule, isRuleCall, isTerminalRule, isUnorderedGroup, isBooleanLiteral } from '../languages/generated/ast.js';\r\nimport { assertUnreachable, ErrorWithLocation } from '../utils/errors.js';\r\nimport { stream } from '../utils/stream.js';\r\nimport { findNameAssignment, getAllReachableRules, getTypeName } from '../utils/grammar-utils.js';\r\n\r\ntype RuleContext = {\r\n optional: number,\r\n consume: number,\r\n subrule: number,\r\n many: number,\r\n or: number\r\n} & ParserContext;\r\n\r\ntype ParserContext = {\r\n parser: BaseParser\r\n tokens: TokenTypeDictionary\r\n ruleNames: Map<AstNode, string>\r\n}\r\n\r\ntype Rule = (args: Args) => unknown;\r\n\r\ntype Args = Record<string, boolean>;\r\n\r\ntype Predicate = (args: Args) => boolean;\r\n\r\ntype Method = (args: Args) => void;\r\n\r\nexport function createParser<T extends BaseParser>(grammar: Grammar, parser: T, tokens: TokenTypeDictionary): T {\r\n const parserContext: ParserContext = {\r\n parser,\r\n tokens,\r\n ruleNames: new Map()\r\n };\r\n buildRules(parserContext, grammar);\r\n return parser;\r\n}\r\n\r\nfunction buildRules(parserContext: ParserContext, grammar: Grammar): void {\r\n const reachable = getAllReachableRules(grammar, false);\r\n const parserRules = stream(grammar.rules).filter(isParserRule).filter(rule => reachable.has(rule));\r\n for (const rule of parserRules) {\r\n const ctx: RuleContext = {\r\n ...parserContext,\r\n consume: 1,\r\n optional: 1,\r\n subrule: 1,\r\n many: 1,\r\n or: 1\r\n };\r\n parserContext.parser.rule(rule, buildElement(ctx, rule.definition));\r\n }\r\n}\r\n\r\nfunction buildElement(ctx: RuleContext, element: AbstractElement, ignoreGuard = false): Method {\r\n let method: Method;\r\n if (isKeyword(element)) {\r\n method = buildKeyword(ctx, element);\r\n } else if (isAction(element)) {\r\n method = buildAction(ctx, element);\r\n } else if (isAssignment(element)) {\r\n method = buildElement(ctx, element.terminal);\r\n } else if (isCrossReference(element)) {\r\n method = buildCrossReference(ctx, element);\r\n } else if (isRuleCall(element)) {\r\n method = buildRuleCall(ctx, element);\r\n } else if (isAlternatives(element)) {\r\n method = buildAlternatives(ctx, element);\r\n } else if (isUnorderedGroup(element)) {\r\n method = buildUnorderedGroup(ctx, element);\r\n } else if (isGroup(element)) {\r\n method = buildGroup(ctx, element);\r\n } else if(isEndOfFile(element)) {\r\n const idx = ctx.consume++;\r\n method = () => ctx.parser.consume(idx, EOF, element);\r\n } else {\r\n throw new ErrorWithLocation(element.$cstNode, `Unexpected element type: ${element.$type}`);\r\n }\r\n return wrap(ctx, ignoreGuard ? undefined : getGuardCondition(element), method, element.cardinality);\r\n}\r\n\r\nfunction buildAction(ctx: RuleContext, action: Action): Method {\r\n const actionType = getTypeName(action);\r\n return () => ctx.parser.action(actionType, action);\r\n}\r\n\r\nfunction buildRuleCall(ctx: RuleContext, ruleCall: RuleCall): Method {\r\n const rule = ruleCall.rule.ref;\r\n if (isParserRule(rule)) {\r\n const idx = ctx.subrule++;\r\n const fragment = rule.fragment;\r\n const predicate = ruleCall.arguments.length > 0 ? buildRuleCallPredicate(rule, ruleCall.arguments) : () => ({});\r\n return (args) => ctx.parser.subrule(idx, getRule(ctx, rule), fragment, ruleCall, predicate(args));\r\n } else if (isTerminalRule(rule)) {\r\n const idx = ctx.consume++;\r\n const method = getToken(ctx, rule.name);\r\n return () => ctx.parser.consume(idx, method, ruleCall);\r\n } else if (!rule) {\r\n throw new ErrorWithLocation(ruleCall.$cstNode, `Undefined rule: ${ruleCall.rule.$refText}`);\r\n } else {\r\n assertUnreachable(rule);\r\n }\r\n}\r\n\r\nfunction buildRuleCallPredicate(rule: ParserRule, namedArgs: NamedArgument[]): (args: Args) => Args {\r\n const predicates = namedArgs.map(e => buildPredicate(e.value));\r\n return (args) => {\r\n const ruleArgs: Args = {};\r\n for (let i = 0; i < predicates.length; i++) {\r\n const ruleTarget = rule.parameters[i];\r\n const predicate = predicates[i];\r\n ruleArgs[ruleTarget.name] = predicate(args);\r\n }\r\n return ruleArgs;\r\n };\r\n}\r\n\r\ninterface PredicatedMethod {\r\n ALT: Method,\r\n GATE?: Predicate\r\n}\r\n\r\nfunction buildPredicate(condition: Condition): Predicate {\r\n if (isDisjunction(condition)) {\r\n const left = buildPredicate(condition.left);\r\n const right = buildPredicate(condition.right);\r\n return (args) => (left(args) || right(args));\r\n } else if (isConjunction(condition)) {\r\n const left = buildPredicate(condition.left);\r\n const right = buildPredicate(condition.right);\r\n return (args) => (left(args) && right(args));\r\n } else if (isNegation(condition)) {\r\n const value = buildPredicate(condition.value);\r\n return (args) => !value(args);\r\n } else if (isParameterReference(condition)) {\r\n const name = condition.parameter.ref!.name;\r\n return (args) => args !== undefined && args[name] === true;\r\n } else if (isBooleanLiteral(condition)) {\r\n const value = Boolean(condition.true);\r\n return () => value;\r\n }\r\n assertUnreachable(condition);\r\n}\r\n\r\nfunction buildAlternatives(ctx: RuleContext, alternatives: Alternatives): Method {\r\n if (alternatives.elements.length === 1) {\r\n return buildElement(ctx, alternatives.elements[0]);\r\n } else {\r\n const methods: PredicatedMethod[] = [];\r\n\r\n for (const element of alternatives.elements) {\r\n const predicatedMethod: PredicatedMethod = {\r\n // Since we handle the guard condition in the alternative already\r\n // We can ignore the group guard condition inside\r\n ALT: buildElement(ctx, element, true)\r\n };\r\n const guard = getGuardCondition(element);\r\n if (guard) {\r\n predicatedMethod.GATE = buildPredicate(guard);\r\n }\r\n methods.push(predicatedMethod);\r\n }\r\n\r\n const idx = ctx.or++;\r\n return (args) => ctx.parser.alternatives(idx, methods.map(method => {\r\n const alt: IOrAlt<unknown> = {\r\n ALT: () => method.ALT(args)\r\n };\r\n const gate = method.GATE;\r\n if (gate) {\r\n alt.GATE = () => gate(args);\r\n }\r\n return alt;\r\n }));\r\n }\r\n}\r\n\r\nfunction buildUnorderedGroup(ctx: RuleContext, group: UnorderedGroup): Method {\r\n if (group.elements.length === 1) {\r\n return buildElement(ctx, group.elements[0]);\r\n }\r\n const methods: PredicatedMethod[] = [];\r\n\r\n for (const element of group.elements) {\r\n const predicatedMethod: PredicatedMethod = {\r\n // Since we handle the guard condition in the alternative already\r\n // We can ignore the group guard condition inside\r\n ALT: buildElement(ctx, element, true)\r\n };\r\n const guard = getGuardCondition(element);\r\n if (guard) {\r\n predicatedMethod.GATE = buildPredicate(guard);\r\n }\r\n methods.push(predicatedMethod);\r\n }\r\n\r\n const orIdx = ctx.or++;\r\n\r\n const idFunc = (groupIdx: number, lParser: BaseParser) => {\r\n const stackId = lParser.getRuleStack().join('-');\r\n return `uGroup_${groupIdx}_${stackId}`;\r\n };\r\n const alternatives: Method = (args) => ctx.parser.alternatives(orIdx, methods.map((method, idx) => {\r\n const alt: IOrAlt<unknown> = { ALT: () => true };\r\n const parser = ctx.parser;\r\n alt.ALT = () => {\r\n method.ALT(args);\r\n if (!parser.isRecording()) {\r\n const key = idFunc(orIdx, parser);\r\n if (!parser.unorderedGroups.get(key)) {\r\n // init after clear state\r\n parser.unorderedGroups.set(key, []);\r\n }\r\n const groupState = parser.unorderedGroups.get(key)!;\r\n if (typeof groupState?.[idx] === 'undefined') {\r\n // Not accessed yet\r\n groupState[idx] = true;\r\n }\r\n }\r\n };\r\n const gate = method.GATE;\r\n if (gate) {\r\n alt.GATE = () => gate(args);\r\n } else {\r\n alt.GATE = () => {\r\n const trackedAlternatives = parser.unorderedGroups.get(idFunc(orIdx, parser));\r\n const allow = !trackedAlternatives?.[idx];\r\n return allow;\r\n };\r\n }\r\n return alt;\r\n }));\r\n const wrapped = wrap(ctx, getGuardCondition(group), alternatives, '*');\r\n return (args) => {\r\n wrapped(args);\r\n if (!ctx.parser.isRecording()) {\r\n ctx.parser.unorderedGroups.delete(idFunc(orIdx, ctx.parser));\r\n }\r\n };\r\n}\r\n\r\nfunction buildGroup(ctx: RuleContext, group: Group): Method {\r\n const methods = group.elements.map(e => buildElement(ctx, e));\r\n return (args) => methods.forEach(method => method(args));\r\n}\r\n\r\nfunction getGuardCondition(element: AbstractElement): Condition | undefined {\r\n if (isGroup(element)) {\r\n return element.guardCondition;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction buildCrossReference(ctx: RuleContext, crossRef: CrossReference, terminal = crossRef.terminal): Method {\r\n if (!terminal) {\r\n if (!crossRef.type.ref) {\r\n throw new Error('Could not resolve reference to type: ' + crossRef.type.$refText);\r\n }\r\n const assignment = findNameAssignment(crossRef.type.ref);\r\n const assignTerminal = assignment?.terminal;\r\n if (!assignTerminal) {\r\n throw new Error('Could not find name assignment for type: ' + getTypeName(crossRef.type.ref));\r\n }\r\n return buildCrossReference(ctx, crossRef, assignTerminal);\r\n } else if (isRuleCall(terminal) && isParserRule(terminal.rule.ref)) {\r\n // The terminal is a data type rule here. Everything else will result in a validation error.\r\n const rule = terminal.rule.ref;\r\n const idx = ctx.subrule++;\r\n return (args) => ctx.parser.subrule(idx, getRule(ctx, rule), false, crossRef, args);\r\n } else if (isRuleCall(terminal) && isTerminalRule(terminal.rule.ref)) {\r\n const idx = ctx.consume++;\r\n const terminalRule = getToken(ctx, terminal.rule.ref.name);\r\n return () => ctx.parser.consume(idx, terminalRule, crossRef);\r\n } else if (isKeyword(terminal)) {\r\n const idx = ctx.consume++;\r\n const keyword = getToken(ctx, terminal.value);\r\n return () => ctx.parser.consume(idx, keyword, crossRef);\r\n }\r\n else {\r\n throw new Error('Could not build cross reference parser');\r\n }\r\n}\r\n\r\nfunction buildKeyword(ctx: RuleContext, keyword: Keyword): Method {\r\n const idx = ctx.consume++;\r\n const token = ctx.tokens[keyword.value];\r\n if (!token) {\r\n throw new Error('Could not find token for keyword: ' + keyword.value);\r\n }\r\n return () => ctx.parser.consume(idx, token, keyword);\r\n}\r\n\r\nfunction wrap(ctx: RuleContext, guard: Condition | undefined, method: Method, cardinality: Cardinality): Method {\r\n const gate = guard && buildPredicate(guard);\r\n\r\n if (!cardinality) {\r\n if (gate) {\r\n const idx = ctx.or++;\r\n return (args) => ctx.parser.alternatives(idx, [\r\n {\r\n ALT: () => method(args),\r\n GATE: () => gate(args)\r\n },\r\n {\r\n ALT: EMPTY_ALT(),\r\n GATE: () => !gate(args)\r\n }\r\n ]);\r\n } else {\r\n return method;\r\n }\r\n }\r\n\r\n if (cardinality === '*') {\r\n const idx = ctx.many++;\r\n return (args) => ctx.parser.many(idx, {\r\n DEF: () => method(args),\r\n GATE: gate ? () => gate(args) : undefined\r\n });\r\n } else if (cardinality === '+') {\r\n const idx = ctx.many++;\r\n if (gate) {\r\n const orIdx = ctx.or++;\r\n // In the case of a guard condition for the `+` group\r\n // We combine it with an empty alternative\r\n // If the condition returns true, it needs to parse at least a single iteration\r\n // If its false, it is not allowed to parse anything\r\n return (args) => ctx.parser.alternatives(orIdx, [\r\n {\r\n ALT: () => ctx.parser.atLeastOne(idx, {\r\n DEF: () => method(args)\r\n }),\r\n GATE: () => gate(args)\r\n },\r\n {\r\n ALT: EMPTY_ALT(),\r\n GATE: () => !gate(args)\r\n }\r\n ]);\r\n } else {\r\n return (args) => ctx.parser.atLeastOne(idx, {\r\n DEF: () => method(args),\r\n });\r\n }\r\n } else if (cardinality === '?') {\r\n const idx = ctx.optional++;\r\n return (args) => ctx.parser.optional(idx, {\r\n DEF: () => method(args),\r\n GATE: gate ? () => gate(args) : undefined\r\n });\r\n } else {\r\n assertUnreachable(cardinality);\r\n }\r\n}\r\n\r\nfunction getRule(ctx: ParserContext, element: ParserRule | AbstractElement): Rule {\r\n const name = getRuleName(ctx, element);\r\n const rule = ctx.parser.getRule(name);\r\n if (!rule) throw new Error(`Rule \"${name}\" not found.\"`);\r\n return rule;\r\n}\r\n\r\nfunction getRuleName(ctx: ParserContext, element: ParserRule | AbstractElement): string {\r\n if (isParserRule(element)) {\r\n return element.name;\r\n } else if (ctx.ruleNames.has(element)) {\r\n return ctx.ruleNames.get(element)!;\r\n } else {\r\n let item: AstNode = element;\r\n let parent: AstNode = item.$container!;\r\n let ruleName: string = element.$type;\r\n while (!isParserRule(parent)) {\r\n if (isGroup(parent) || isAlternatives(parent) || isUnorderedGroup(parent)) {\r\n const index = parent.elements.indexOf(item as AbstractElement);\r\n ruleName = index.toString() + ':' + ruleName;\r\n }\r\n item = parent;\r\n parent = parent.$container!;\r\n }\r\n const rule = parent as ParserRule;\r\n ruleName = rule.name + ':' + ruleName;\r\n ctx.ruleNames.set(element, ruleName);\r\n return ruleName;\r\n }\r\n}\r\n\r\nfunction getToken(ctx: ParserContext, name: string): TokenType {\r\n const token = ctx.tokens[name];\r\n if (!token) throw new Error(`Token \"${name}\" not found.\"`);\r\n return token;\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport { LangiumCompletionParser } from './langium-parser.js';\r\nimport { createParser } from './parser-builder-base.js';\r\n\r\nexport function createCompletionParser(services: LangiumCoreServices): LangiumCompletionParser {\r\n const grammar = services.Grammar;\r\n const lexer = services.parser.Lexer;\r\n const parser = new LangiumCompletionParser(services);\r\n createParser(grammar, parser, lexer.definition);\r\n parser.finalize();\r\n return parser;\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport { LangiumParser } from './langium-parser.js';\r\nimport { createParser } from './parser-builder-base.js';\r\n\r\n/**\r\n * Create and finalize a Langium parser. The parser rules are derived from the grammar, which is\r\n * available at `services.Grammar`.\r\n */\r\nexport function createLangiumParser(services: LangiumCoreServices): LangiumParser {\r\n const parser = prepareLangiumParser(services);\r\n parser.finalize();\r\n return parser;\r\n}\r\n\r\n/**\r\n * Create a Langium parser without finalizing it. This is used to extract more detailed error\r\n * information when the parser is initially validated.\r\n */\r\nexport function prepareLangiumParser(services: LangiumCoreServices): LangiumParser {\r\n const grammar = services.Grammar;\r\n const lexer = services.parser.Lexer;\r\n const parser = new LangiumParser(services);\r\n return createParser(grammar, parser, lexer.definition);\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { CustomPatternMatcherFunc, ILexingError, TokenPattern, TokenType, TokenVocabulary } from 'chevrotain';\r\nimport type { AbstractRule, Grammar, Keyword, TerminalRule } from '../languages/generated/ast.js';\r\nimport type { Stream } from '../utils/stream.js';\r\nimport { Lexer } from 'chevrotain';\r\nimport { isKeyword, isParserRule, isTerminalRule } from '../languages/generated/ast.js';\r\nimport { streamAllContents } from '../utils/ast-utils.js';\r\nimport { getAllReachableRules, terminalRegex } from '../utils/grammar-utils.js';\r\nimport { getCaseInsensitivePattern, isWhitespace, partialMatches } from '../utils/regexp-utils.js';\r\nimport { stream } from '../utils/stream.js';\r\n\r\nexport interface TokenBuilderOptions {\r\n caseInsensitive?: boolean\r\n}\r\n\r\nexport interface TokenBuilder {\r\n buildTokens(grammar: Grammar, options?: TokenBuilderOptions): TokenVocabulary;\r\n /**\r\n * Produces a lexing report for the given text that was just tokenized using the tokens provided by this builder.\r\n *\r\n * @param text The text that was tokenized.\r\n */\r\n flushLexingReport?(text: string): LexingReport;\r\n}\r\n\r\n/**\r\n * A custom lexing report that can be produced by the token builder during the lexing process.\r\n * Adopters need to ensure that the any custom fields are serializable so they can be sent across worker threads.\r\n */\r\nexport interface LexingReport {\r\n diagnostics: LexingDiagnostic[];\r\n}\r\n\r\nexport type LexingDiagnosticSeverity = 'error' | 'warning' | 'info' | 'hint';\r\n\r\nexport interface LexingDiagnostic extends ILexingError {\r\n severity?: LexingDiagnosticSeverity;\r\n}\r\n\r\nexport class DefaultTokenBuilder implements TokenBuilder {\r\n /**\r\n * The list of diagnostics stored during the lexing process of a single text.\r\n */\r\n protected diagnostics: LexingDiagnostic[] = [];\r\n\r\n buildTokens(grammar: Grammar, options?: TokenBuilderOptions): TokenVocabulary {\r\n const reachableRules = stream(getAllReachableRules(grammar, false));\r\n const terminalTokens: TokenType[] = this.buildTerminalTokens(reachableRules);\r\n const tokens: TokenType[] = this.buildKeywordTokens(reachableRules, terminalTokens, options);\r\n\r\n terminalTokens.forEach(terminalToken => {\r\n const pattern = terminalToken.PATTERN;\r\n if (typeof pattern === 'object' && pattern && 'test' in pattern && isWhitespace(pattern)) {\r\n tokens.unshift(terminalToken);\r\n } else {\r\n tokens.push(terminalToken);\r\n }\r\n });\r\n // We don't need to add the EOF token explicitly.\r\n // It is automatically available at the end of the token stream.\r\n return tokens;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n flushLexingReport(text: string): LexingReport {\r\n return { diagnostics: this.popDiagnostics() };\r\n }\r\n\r\n protected popDiagnostics(): LexingDiagnostic[] {\r\n const diagnostics = [...this.diagnostics];\r\n this.diagnostics = [];\r\n return diagnostics;\r\n }\r\n\r\n protected buildTerminalTokens(rules: Stream<AbstractRule>): TokenType[] {\r\n return rules.filter(isTerminalRule).filter(e => !e.fragment)\r\n .map(terminal => this.buildTerminalToken(terminal)).toArray();\r\n }\r\n\r\n protected buildTerminalToken(terminal: TerminalRule): TokenType {\r\n const regex = terminalRegex(terminal);\r\n const pattern = this.requiresCustomPattern(regex) ? this.regexPatternFunction(regex) : regex;\r\n const tokenType: TokenType = {\r\n name: terminal.name,\r\n PATTERN: pattern,\r\n };\r\n if (typeof pattern === 'function') {\r\n tokenType.LINE_BREAKS = true;\r\n }\r\n if (terminal.hidden) {\r\n // Only skip tokens that are able to accept whitespace\r\n tokenType.GROUP = isWhitespace(regex) ? Lexer.SKIPPED : 'hidden';\r\n }\r\n return tokenType;\r\n }\r\n\r\n protected requiresCustomPattern(regex: RegExp): boolean {\r\n if (regex.flags.includes('u') || regex.flags.includes('s')) {\r\n // Unicode and dotall regexes are not supported by Chevrotain.\r\n return true;\r\n } else if (regex.source.includes('?<=') || regex.source.includes('?<!')) {\r\n // Negative and positive lookbehind are not supported by Chevrotain yet.\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n protected regexPatternFunction(regex: RegExp): CustomPatternMatcherFunc {\r\n const stickyRegex = new RegExp(regex, regex.flags + 'y');\r\n return (text, offset) => {\r\n stickyRegex.lastIndex = offset;\r\n const execResult = stickyRegex.exec(text);\r\n return execResult;\r\n };\r\n }\r\n\r\n protected buildKeywordTokens(rules: Stream<AbstractRule>, terminalTokens: TokenType[], options?: TokenBuilderOptions): TokenType[] {\r\n return rules\r\n // We filter by parser rules, since keywords in terminal rules get transformed into regex and are not actual tokens\r\n .filter(isParserRule)\r\n .flatMap(rule => streamAllContents(rule).filter(isKeyword))\r\n .distinct(e => e.value).toArray()\r\n // Sort keywords by descending length\r\n .sort((a, b) => b.value.length - a.value.length)\r\n .map(keyword => this.buildKeywordToken(keyword, terminalTokens, Boolean(options?.caseInsensitive)));\r\n }\r\n\r\n protected buildKeywordToken(keyword: Keyword, terminalTokens: TokenType[], caseInsensitive: boolean): TokenType {\r\n const keywordPattern = this.buildKeywordPattern(keyword, caseInsensitive);\r\n const tokenType: TokenType = {\r\n name: keyword.value,\r\n PATTERN: keywordPattern,\r\n LONGER_ALT: this.findLongerAlt(keyword, terminalTokens)\r\n };\r\n\r\n if (typeof keywordPattern === 'function') {\r\n tokenType.LINE_BREAKS = true;\r\n }\r\n\r\n return tokenType;\r\n }\r\n\r\n protected buildKeywordPattern(keyword: Keyword, caseInsensitive: boolean): TokenPattern {\r\n return caseInsensitive ?\r\n new RegExp(getCaseInsensitivePattern(keyword.value)) :\r\n keyword.value;\r\n }\r\n\r\n protected findLongerAlt(keyword: Keyword, terminalTokens: TokenType[]): TokenType[] {\r\n return terminalTokens.reduce((longerAlts: TokenType[], token) => {\r\n const pattern = token?.PATTERN as RegExp;\r\n if (pattern?.source && partialMatches('^' + pattern.source + '$', keyword.value)) {\r\n longerAlts.push(token);\r\n }\r\n return longerAlts;\r\n }, []);\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { AbstractElement, AbstractRule } from '../languages/generated/ast.js';\r\nimport type { CstNode } from '../syntax-tree.js';\r\nimport { isCrossReference, isRuleCall } from '../languages/generated/ast.js';\r\nimport { getCrossReferenceTerminal, getRuleType } from '../utils/grammar-utils.js';\r\n\r\n/**\r\n * Language-specific service for converting string values from the source text format into a value to be held in the AST.\r\n */\r\nexport interface ValueConverter {\r\n /**\r\n * Converts a string value from the source text format into a value to be held in the AST.\r\n */\r\n convert(input: string, cstNode: CstNode): ValueType;\r\n}\r\n\r\nexport type ValueType = string | number | boolean | bigint | Date;\r\n\r\nexport class DefaultValueConverter implements ValueConverter {\r\n\r\n convert(input: string, cstNode: CstNode): ValueType {\r\n let feature: AbstractElement | undefined = cstNode.grammarSource;\r\n if (isCrossReference(feature)) {\r\n feature = getCrossReferenceTerminal(feature);\r\n }\r\n if (isRuleCall(feature)) {\r\n const rule = feature.rule.ref;\r\n if (!rule) {\r\n throw new Error('This cst node was not parsed by a rule.');\r\n }\r\n return this.runConverter(rule, input, cstNode);\r\n }\r\n return input;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected runConverter(rule: AbstractRule, input: string, cstNode: CstNode): ValueType {\r\n switch (rule.name.toUpperCase()) {\r\n case 'INT': return ValueConverter.convertInt(input);\r\n case 'STRING': return ValueConverter.convertString(input);\r\n case 'ID': return ValueConverter.convertID(input);\r\n }\r\n switch (getRuleType(rule)?.toLowerCase()) {\r\n case 'number': return ValueConverter.convertNumber(input);\r\n case 'boolean': return ValueConverter.convertBoolean(input);\r\n case 'bigint': return ValueConverter.convertBigint(input);\r\n case 'date': return ValueConverter.convertDate(input);\r\n default: return input;\r\n }\r\n }\r\n}\r\n\r\nexport namespace ValueConverter {\r\n\r\n export function convertString(input: string): string {\r\n let result = '';\r\n for (let i = 1; i < input.length - 1; i++) {\r\n const c = input.charAt(i);\r\n if (c === '\\\\') {\r\n const c1 = input.charAt(++i);\r\n result += convertEscapeCharacter(c1);\r\n } else {\r\n result += c;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n function convertEscapeCharacter(char: string): string {\r\n switch (char) {\r\n case 'b': return '\\b';\r\n case 'f': return '\\f';\r\n case 'n': return '\\n';\r\n case 'r': return '\\r';\r\n case 't': return '\\t';\r\n case 'v': return '\\v';\r\n case '0': return '\\0';\r\n default: return char;\r\n }\r\n }\r\n\r\n export function convertID(input: string): string {\r\n if (input.charAt(0) === '^') {\r\n return input.substring(1);\r\n } else {\r\n return input;\r\n }\r\n }\r\n\r\n export function convertInt(input: string): number {\r\n return parseInt(input);\r\n }\r\n\r\n export function convertBigint(input: string): bigint {\r\n return BigInt(input);\r\n }\r\n\r\n export function convertDate(input: string): Date {\r\n return new Date(input);\r\n }\r\n\r\n export function convertNumber(input: string): number {\r\n return Number(input);\r\n }\r\n\r\n export function convertBoolean(input: string): boolean {\r\n return input.toLowerCase() === 'true';\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2024 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\n// eslint-disable-next-line no-restricted-imports\r\nexport * from 'vscode-jsonrpc/lib/common/cancellation.js';\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { CancellationToken, CancellationTokenSource, type AbstractCancellationTokenSource } from '../utils/cancellation.js';\r\n\r\nexport type MaybePromise<T> = T | Promise<T>\r\n\r\n/**\r\n * Delays the execution of the current code to the next tick of the event loop.\r\n * Don't call this method directly in a tight loop to prevent too many promises from being created.\r\n */\r\nexport function delayNextTick(): Promise<void> {\r\n return new Promise(resolve => {\r\n // In case we are running in a non-node environment, `setImmediate` isn't available.\r\n // Using `setTimeout` of the browser API accomplishes the same result.\r\n if (typeof setImmediate === 'undefined') {\r\n setTimeout(resolve, 0);\r\n } else {\r\n setImmediate(resolve);\r\n }\r\n });\r\n}\r\n\r\nlet lastTick = 0;\r\nlet globalInterruptionPeriod = 10;\r\n\r\n/**\r\n * Reset the global interruption period and create a cancellation token source.\r\n */\r\nexport function startCancelableOperation(): AbstractCancellationTokenSource {\r\n lastTick = performance.now();\r\n return new CancellationTokenSource();\r\n}\r\n\r\n/**\r\n * Change the period duration for `interruptAndCheck` to the given number of milliseconds.\r\n * The default value is 10ms.\r\n */\r\nexport function setInterruptionPeriod(period: number): void {\r\n globalInterruptionPeriod = period;\r\n}\r\n\r\n/**\r\n * This symbol may be thrown in an asynchronous context by any Langium service that receives\r\n * a `CancellationToken`. This means that the promise returned by such a service is rejected with\r\n * this symbol as rejection reason.\r\n */\r\nexport const OperationCancelled = Symbol('OperationCancelled');\r\n\r\n/**\r\n * Use this in a `catch` block to check whether the thrown object indicates that the operation\r\n * has been cancelled.\r\n */\r\nexport function isOperationCancelled(err: unknown): err is typeof OperationCancelled {\r\n return err === OperationCancelled;\r\n}\r\n\r\n/**\r\n * This function does two things:\r\n * 1. Check the elapsed time since the last call to this function or to `startCancelableOperation`. If the predefined\r\n * period (configured with `setInterruptionPeriod`) is exceeded, execution is delayed with `delayNextTick`.\r\n * 2. If the predefined period is not met yet or execution is resumed after an interruption, the given cancellation\r\n * token is checked, and if cancellation is requested, `OperationCanceled` is thrown.\r\n *\r\n * All services in Langium that receive a `CancellationToken` may potentially call this function, so the\r\n * `CancellationToken` must be caught (with an `async` try-catch block or a `catch` callback attached to\r\n * the promise) to avoid that event being exposed as an error.\r\n */\r\nexport async function interruptAndCheck(token: CancellationToken): Promise<void> {\r\n if (token === CancellationToken.None) {\r\n // Early exit in case cancellation was disabled by the caller\r\n return;\r\n }\r\n const current = performance.now();\r\n if (current - lastTick >= globalInterruptionPeriod) {\r\n lastTick = current;\r\n await delayNextTick();\r\n // prevent calling delayNextTick every iteration of loop\r\n // where delayNextTick takes up the majority or all of the\r\n // globalInterruptionPeriod itself\r\n lastTick = performance.now();\r\n }\r\n if (token.isCancellationRequested) {\r\n throw OperationCancelled;\r\n }\r\n}\r\n\r\n/**\r\n * Simple implementation of the deferred pattern.\r\n * An object that exposes a promise and functions to resolve and reject it.\r\n */\r\nexport class Deferred<T = void> {\r\n resolve: (value: T) => this;\r\n reject: (err?: unknown) => this;\r\n\r\n promise = new Promise<T>((resolve, reject) => {\r\n this.resolve = (arg) => {\r\n resolve(arg);\r\n return this;\r\n };\r\n this.reject = (err) => {\r\n reject(err);\r\n return this;\r\n };\r\n });\r\n}\r\n", "/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n'use strict';\nclass FullTextDocument {\n constructor(uri, languageId, version, content) {\n this._uri = uri;\n this._languageId = languageId;\n this._version = version;\n this._content = content;\n this._lineOffsets = undefined;\n }\n get uri() {\n return this._uri;\n }\n get languageId() {\n return this._languageId;\n }\n get version() {\n return this._version;\n }\n getText(range) {\n if (range) {\n const start = this.offsetAt(range.start);\n const end = this.offsetAt(range.end);\n return this._content.substring(start, end);\n }\n return this._content;\n }\n update(changes, version) {\n for (const change of changes) {\n if (FullTextDocument.isIncremental(change)) {\n // makes sure start is before end\n const range = getWellformedRange(change.range);\n // update content\n const startOffset = this.offsetAt(range.start);\n const endOffset = this.offsetAt(range.end);\n this._content = this._content.substring(0, startOffset) + change.text + this._content.substring(endOffset, this._content.length);\n // update the offsets\n const startLine = Math.max(range.start.line, 0);\n const endLine = Math.max(range.end.line, 0);\n let lineOffsets = this._lineOffsets;\n const addedLineOffsets = computeLineOffsets(change.text, false, startOffset);\n if (endLine - startLine === addedLineOffsets.length) {\n for (let i = 0, len = addedLineOffsets.length; i < len; i++) {\n lineOffsets[i + startLine + 1] = addedLineOffsets[i];\n }\n }\n else {\n if (addedLineOffsets.length < 10000) {\n lineOffsets.splice(startLine + 1, endLine - startLine, ...addedLineOffsets);\n }\n else { // avoid too many arguments for splice\n this._lineOffsets = lineOffsets = lineOffsets.slice(0, startLine + 1).concat(addedLineOffsets, lineOffsets.slice(endLine + 1));\n }\n }\n const diff = change.text.length - (endOffset - startOffset);\n if (diff !== 0) {\n for (let i = startLine + 1 + addedLineOffsets.length, len = lineOffsets.length; i < len; i++) {\n lineOffsets[i] = lineOffsets[i] + diff;\n }\n }\n }\n else if (FullTextDocument.isFull(change)) {\n this._content = change.text;\n this._lineOffsets = undefined;\n }\n else {\n throw new Error('Unknown change event received');\n }\n }\n this._version = version;\n }\n getLineOffsets() {\n if (this._lineOffsets === undefined) {\n this._lineOffsets = computeLineOffsets(this._content, true);\n }\n return this._lineOffsets;\n }\n positionAt(offset) {\n offset = Math.max(Math.min(offset, this._content.length), 0);\n const lineOffsets = this.getLineOffsets();\n let low = 0, high = lineOffsets.length;\n if (high === 0) {\n return { line: 0, character: offset };\n }\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (lineOffsets[mid] > offset) {\n high = mid;\n }\n else {\n low = mid + 1;\n }\n }\n // low is the least x for which the line offset is larger than the current offset\n // or array.length if no line offset is larger than the current offset\n const line = low - 1;\n offset = this.ensureBeforeEOL(offset, lineOffsets[line]);\n return { line, character: offset - lineOffsets[line] };\n }\n offsetAt(position) {\n const lineOffsets = this.getLineOffsets();\n if (position.line >= lineOffsets.length) {\n return this._content.length;\n }\n else if (position.line < 0) {\n return 0;\n }\n const lineOffset = lineOffsets[position.line];\n if (position.character <= 0) {\n return lineOffset;\n }\n const nextLineOffset = (position.line + 1 < lineOffsets.length) ? lineOffsets[position.line + 1] : this._content.length;\n const offset = Math.min(lineOffset + position.character, nextLineOffset);\n return this.ensureBeforeEOL(offset, lineOffset);\n }\n ensureBeforeEOL(offset, lineOffset) {\n while (offset > lineOffset && isEOL(this._content.charCodeAt(offset - 1))) {\n offset--;\n }\n return offset;\n }\n get lineCount() {\n return this.getLineOffsets().length;\n }\n static isIncremental(event) {\n const candidate = event;\n return candidate !== undefined && candidate !== null &&\n typeof candidate.text === 'string' && candidate.range !== undefined &&\n (candidate.rangeLength === undefined || typeof candidate.rangeLength === 'number');\n }\n static isFull(event) {\n const candidate = event;\n return candidate !== undefined && candidate !== null &&\n typeof candidate.text === 'string' && candidate.range === undefined && candidate.rangeLength === undefined;\n }\n}\nexport var TextDocument;\n(function (TextDocument) {\n /**\n * Creates a new text document.\n *\n * @param uri The document's uri.\n * @param languageId The document's language Id.\n * @param version The document's initial version number.\n * @param content The document's content.\n */\n function create(uri, languageId, version, content) {\n return new FullTextDocument(uri, languageId, version, content);\n }\n TextDocument.create = create;\n /**\n * Updates a TextDocument by modifying its content.\n *\n * @param document the document to update. Only documents created by TextDocument.create are valid inputs.\n * @param changes the changes to apply to the document.\n * @param version the changes version for the document.\n * @returns The updated TextDocument. Note: That's the same document instance passed in as first parameter.\n *\n */\n function update(document, changes, version) {\n if (document instanceof FullTextDocument) {\n document.update(changes, version);\n return document;\n }\n else {\n throw new Error('TextDocument.update: document must be created by TextDocument.create');\n }\n }\n TextDocument.update = update;\n function applyEdits(document, edits) {\n const text = document.getText();\n const sortedEdits = mergeSort(edits.map(getWellformedEdit), (a, b) => {\n const diff = a.range.start.line - b.range.start.line;\n if (diff === 0) {\n return a.range.start.character - b.range.start.character;\n }\n return diff;\n });\n let lastModifiedOffset = 0;\n const spans = [];\n for (const e of sortedEdits) {\n const startOffset = document.offsetAt(e.range.start);\n if (startOffset < lastModifiedOffset) {\n throw new Error('Overlapping edit');\n }\n else if (startOffset > lastModifiedOffset) {\n spans.push(text.substring(lastModifiedOffset, startOffset));\n }\n if (e.newText.length) {\n spans.push(e.newText);\n }\n lastModifiedOffset = document.offsetAt(e.range.end);\n }\n spans.push(text.substr(lastModifiedOffset));\n return spans.join('');\n }\n TextDocument.applyEdits = applyEdits;\n})(TextDocument || (TextDocument = {}));\nfunction mergeSort(data, compare) {\n if (data.length <= 1) {\n // sorted\n return data;\n }\n const p = (data.length / 2) | 0;\n const left = data.slice(0, p);\n const right = data.slice(p);\n mergeSort(left, compare);\n mergeSort(right, compare);\n let leftIdx = 0;\n let rightIdx = 0;\n let i = 0;\n while (leftIdx < left.length && rightIdx < right.length) {\n const ret = compare(left[leftIdx], right[rightIdx]);\n if (ret <= 0) {\n // smaller_equal -> take left to preserve order\n data[i++] = left[leftIdx++];\n }\n else {\n // greater -> take right\n data[i++] = right[rightIdx++];\n }\n }\n while (leftIdx < left.length) {\n data[i++] = left[leftIdx++];\n }\n while (rightIdx < right.length) {\n data[i++] = right[rightIdx++];\n }\n return data;\n}\nfunction computeLineOffsets(text, isAtLineStart, textOffset = 0) {\n const result = isAtLineStart ? [textOffset] : [];\n for (let i = 0; i < text.length; i++) {\n const ch = text.charCodeAt(i);\n if (isEOL(ch)) {\n if (ch === 13 /* CharCode.CarriageReturn */ && i + 1 < text.length && text.charCodeAt(i + 1) === 10 /* CharCode.LineFeed */) {\n i++;\n }\n result.push(textOffset + i + 1);\n }\n }\n return result;\n}\nfunction isEOL(char) {\n return char === 13 /* CharCode.CarriageReturn */ || char === 10 /* CharCode.LineFeed */;\n}\nfunction getWellformedRange(range) {\n const start = range.start;\n const end = range.end;\n if (start.line > end.line || (start.line === end.line && start.character > end.character)) {\n return { start: end, end: start };\n }\n return range;\n}\nfunction getWellformedEdit(textEdit) {\n const range = getWellformedRange(textEdit.range);\n if (range !== textEdit.range) {\n return { newText: textEdit.newText, range };\n }\n return textEdit;\n}\n", "// 'path' module extracted from Node.js v8.11.1 (only the posix part)\n// transplited with Babel\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nfunction assertPath(path) {\n if (typeof path !== 'string') {\n throw new TypeError('Path must be a string. Received ' + JSON.stringify(path));\n }\n}\n\n// Resolves . and .. elements in a path with directory names\nfunction normalizeStringPosix(path, allowAboveRoot) {\n var res = '';\n var lastSegmentLength = 0;\n var lastSlash = -1;\n var dots = 0;\n var code;\n for (var i = 0; i <= path.length; ++i) {\n if (i < path.length)\n code = path.charCodeAt(i);\n else if (code === 47 /*/*/)\n break;\n else\n code = 47 /*/*/;\n if (code === 47 /*/*/) {\n if (lastSlash === i - 1 || dots === 1) {\n // NOOP\n } else if (lastSlash !== i - 1 && dots === 2) {\n if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {\n if (res.length > 2) {\n var lastSlashIndex = res.lastIndexOf('/');\n if (lastSlashIndex !== res.length - 1) {\n if (lastSlashIndex === -1) {\n res = '';\n lastSegmentLength = 0;\n } else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf('/');\n }\n lastSlash = i;\n dots = 0;\n continue;\n }\n } else if (res.length === 2 || res.length === 1) {\n res = '';\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n if (res.length > 0)\n res += '/..';\n else\n res = '..';\n lastSegmentLength = 2;\n }\n } else {\n if (res.length > 0)\n res += '/' + path.slice(lastSlash + 1, i);\n else\n res = path.slice(lastSlash + 1, i);\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n } else if (code === 46 /*.*/ && dots !== -1) {\n ++dots;\n } else {\n dots = -1;\n }\n }\n return res;\n}\n\nfunction _format(sep, pathObject) {\n var dir = pathObject.dir || pathObject.root;\n var base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');\n if (!dir) {\n return base;\n }\n if (dir === pathObject.root) {\n return dir + base;\n }\n return dir + sep + base;\n}\n\nvar posix = {\n // path.resolve([from ...], to)\n resolve: function resolve() {\n var resolvedPath = '';\n var resolvedAbsolute = false;\n var cwd;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path;\n if (i >= 0)\n path = arguments[i];\n else {\n if (cwd === undefined)\n cwd = process.cwd();\n path = cwd;\n }\n\n assertPath(path);\n\n // Skip empty entries\n if (path.length === 0) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charCodeAt(0) === 47 /*/*/;\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);\n\n if (resolvedAbsolute) {\n if (resolvedPath.length > 0)\n return '/' + resolvedPath;\n else\n return '/';\n } else if (resolvedPath.length > 0) {\n return resolvedPath;\n } else {\n return '.';\n }\n },\n\n normalize: function normalize(path) {\n assertPath(path);\n\n if (path.length === 0) return '.';\n\n var isAbsolute = path.charCodeAt(0) === 47 /*/*/;\n var trailingSeparator = path.charCodeAt(path.length - 1) === 47 /*/*/;\n\n // Normalize the path\n path = normalizeStringPosix(path, !isAbsolute);\n\n if (path.length === 0 && !isAbsolute) path = '.';\n if (path.length > 0 && trailingSeparator) path += '/';\n\n if (isAbsolute) return '/' + path;\n return path;\n },\n\n isAbsolute: function isAbsolute(path) {\n assertPath(path);\n return path.length > 0 && path.charCodeAt(0) === 47 /*/*/;\n },\n\n join: function join() {\n if (arguments.length === 0)\n return '.';\n var joined;\n for (var i = 0; i < arguments.length; ++i) {\n var arg = arguments[i];\n assertPath(arg);\n if (arg.length > 0) {\n if (joined === undefined)\n joined = arg;\n else\n joined += '/' + arg;\n }\n }\n if (joined === undefined)\n return '.';\n return posix.normalize(joined);\n },\n\n relative: function relative(from, to) {\n assertPath(from);\n assertPath(to);\n\n if (from === to) return '';\n\n from = posix.resolve(from);\n to = posix.resolve(to);\n\n if (from === to) return '';\n\n // Trim any leading backslashes\n var fromStart = 1;\n for (; fromStart < from.length; ++fromStart) {\n if (from.charCodeAt(fromStart) !== 47 /*/*/)\n break;\n }\n var fromEnd = from.length;\n var fromLen = fromEnd - fromStart;\n\n // Trim any leading backslashes\n var toStart = 1;\n for (; toStart < to.length; ++toStart) {\n if (to.charCodeAt(toStart) !== 47 /*/*/)\n break;\n }\n var toEnd = to.length;\n var toLen = toEnd - toStart;\n\n // Compare paths to find the longest common path from root\n var length = fromLen < toLen ? fromLen : toLen;\n var lastCommonSep = -1;\n var i = 0;\n for (; i <= length; ++i) {\n if (i === length) {\n if (toLen > length) {\n if (to.charCodeAt(toStart + i) === 47 /*/*/) {\n // We get here if `from` is the exact base path for `to`.\n // For example: from='/foo/bar'; to='/foo/bar/baz'\n return to.slice(toStart + i + 1);\n } else if (i === 0) {\n // We get here if `from` is the root\n // For example: from='/'; to='/foo'\n return to.slice(toStart + i);\n }\n } else if (fromLen > length) {\n if (from.charCodeAt(fromStart + i) === 47 /*/*/) {\n // We get here if `to` is the exact base path for `from`.\n // For example: from='/foo/bar/baz'; to='/foo/bar'\n lastCommonSep = i;\n } else if (i === 0) {\n // We get here if `to` is the root.\n // For example: from='/foo'; to='/'\n lastCommonSep = 0;\n }\n }\n break;\n }\n var fromCode = from.charCodeAt(fromStart + i);\n var toCode = to.charCodeAt(toStart + i);\n if (fromCode !== toCode)\n break;\n else if (fromCode === 47 /*/*/)\n lastCommonSep = i;\n }\n\n var out = '';\n // Generate the relative path based on the path difference between `to`\n // and `from`\n for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n if (i === fromEnd || from.charCodeAt(i) === 47 /*/*/) {\n if (out.length === 0)\n out += '..';\n else\n out += '/..';\n }\n }\n\n // Lastly, append the rest of the destination (`to`) path that comes after\n // the common path parts\n if (out.length > 0)\n return out + to.slice(toStart + lastCommonSep);\n else {\n toStart += lastCommonSep;\n if (to.charCodeAt(toStart) === 47 /*/*/)\n ++toStart;\n return to.slice(toStart);\n }\n },\n\n _makeLong: function _makeLong(path) {\n return path;\n },\n\n dirname: function dirname(path) {\n assertPath(path);\n if (path.length === 0) return '.';\n var code = path.charCodeAt(0);\n var hasRoot = code === 47 /*/*/;\n var end = -1;\n var matchedSlash = true;\n for (var i = path.length - 1; i >= 1; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n\n if (end === -1) return hasRoot ? '/' : '.';\n if (hasRoot && end === 1) return '//';\n return path.slice(0, end);\n },\n\n basename: function basename(path, ext) {\n if (ext !== undefined && typeof ext !== 'string') throw new TypeError('\"ext\" argument must be a string');\n assertPath(path);\n\n var start = 0;\n var end = -1;\n var matchedSlash = true;\n var i;\n\n if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {\n if (ext.length === path.length && ext === path) return '';\n var extIdx = ext.length - 1;\n var firstNonSlashEnd = -1;\n for (i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else {\n if (firstNonSlashEnd === -1) {\n // We saw the first non-path separator, remember this index in case\n // we need it if the extension ends up not matching\n matchedSlash = false;\n firstNonSlashEnd = i + 1;\n }\n if (extIdx >= 0) {\n // Try to match the explicit extension\n if (code === ext.charCodeAt(extIdx)) {\n if (--extIdx === -1) {\n // We matched the extension, so mark this as the end of our path\n // component\n end = i;\n }\n } else {\n // Extension does not match, so our result is the entire path\n // component\n extIdx = -1;\n end = firstNonSlashEnd;\n }\n }\n }\n }\n\n if (start === end) end = firstNonSlashEnd;else if (end === -1) end = path.length;\n return path.slice(start, end);\n } else {\n for (i = path.length - 1; i >= 0; --i) {\n if (path.charCodeAt(i) === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // path component\n matchedSlash = false;\n end = i + 1;\n }\n }\n\n if (end === -1) return '';\n return path.slice(start, end);\n }\n },\n\n extname: function extname(path) {\n assertPath(path);\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n for (var i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1)\n startDot = i;\n else if (preDotState !== 1)\n preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n return '';\n }\n return path.slice(startDot, end);\n },\n\n format: function format(pathObject) {\n if (pathObject === null || typeof pathObject !== 'object') {\n throw new TypeError('The \"pathObject\" argument must be of type Object. Received type ' + typeof pathObject);\n }\n return _format('/', pathObject);\n },\n\n parse: function parse(path) {\n assertPath(path);\n\n var ret = { root: '', dir: '', base: '', ext: '', name: '' };\n if (path.length === 0) return ret;\n var code = path.charCodeAt(0);\n var isAbsolute = code === 47 /*/*/;\n var start;\n if (isAbsolute) {\n ret.root = '/';\n start = 1;\n } else {\n start = 0;\n }\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n var i = path.length - 1;\n\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n\n // Get non-dir info\n for (; i >= start; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) startDot = i;else if (preDotState !== 1) preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n if (end !== -1) {\n if (startPart === 0 && isAbsolute) ret.base = ret.name = path.slice(1, end);else ret.base = ret.name = path.slice(startPart, end);\n }\n } else {\n if (startPart === 0 && isAbsolute) {\n ret.name = path.slice(1, startDot);\n ret.base = path.slice(1, end);\n } else {\n ret.name = path.slice(startPart, startDot);\n ret.base = path.slice(startPart, end);\n }\n ret.ext = path.slice(startDot, end);\n }\n\n if (startPart > 0) ret.dir = path.slice(0, startPart - 1);else if (isAbsolute) ret.dir = '/';\n\n return ret;\n },\n\n sep: '/',\n delimiter: ':',\n win32: null,\n posix: null\n};\n\nposix.posix = posix;\n\nmodule.exports = posix;\n", "// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n", "// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};", "__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))", "// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\n\n// !!!!!\n// SEE https://github.com/microsoft/vscode/blob/master/src/vs/base/common/platform.ts\n// !!!!!\n\ndeclare const process: { platform: 'win32' };\ndeclare const navigator: { userAgent: string };\n\nexport let isWindows: boolean;\n\nif (typeof process === 'object') {\n\tisWindows = process.platform === 'win32';\n} else if (typeof navigator === 'object') {\n\tlet userAgent = navigator.userAgent;\n\tisWindows = userAgent.indexOf('Windows') >= 0;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\n\nimport { CharCode } from './charCode'\nimport { isWindows } from './platform';\n\nconst _schemePattern = /^\\w[\\w\\d+.-]*$/;\nconst _singleSlashStart = /^\\//;\nconst _doubleSlashStart = /^\\/\\//;\n\nfunction _validateUri(ret: URI, _strict?: boolean): void {\n\n\t// scheme, must be set\n\tif (!ret.scheme && _strict) {\n\t\tthrow new Error(`[UriError]: Scheme is missing: {scheme: \"\", authority: \"${ret.authority}\", path: \"${ret.path}\", query: \"${ret.query}\", fragment: \"${ret.fragment}\"}`);\n\t}\n\n\t// scheme, https://tools.ietf.org/html/rfc3986#section-3.1\n\t// ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\n\tif (ret.scheme && !_schemePattern.test(ret.scheme)) {\n\t\tthrow new Error('[UriError]: Scheme contains illegal characters.');\n\t}\n\n\t// path, http://tools.ietf.org/html/rfc3986#section-3.3\n\t// If a URI contains an authority component, then the path component\n\t// must either be empty or begin with a slash (\"/\") character. If a URI\n\t// does not contain an authority component, then the path cannot begin\n\t// with two slash characters (\"//\").\n\tif (ret.path) {\n\t\tif (ret.authority) {\n\t\t\tif (!_singleSlashStart.test(ret.path)) {\n\t\t\t\tthrow new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash (\"/\") character');\n\t\t\t}\n\t\t} else {\n\t\t\tif (_doubleSlashStart.test(ret.path)) {\n\t\t\t\tthrow new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters (\"//\")');\n\t\t\t}\n\t\t}\n\t}\n}\n\n// for a while we allowed uris *without* schemes and this is the migration\n// for them, e.g. an uri without scheme and without strict-mode warns and falls\n// back to the file-scheme. that should cause the least carnage and still be a\n// clear warning\nfunction _schemeFix(scheme: string, _strict: boolean): string {\n\tif (!scheme && !_strict) {\n\t\treturn 'file';\n\t}\n\treturn scheme;\n}\n\n// implements a bit of https://tools.ietf.org/html/rfc3986#section-5\nfunction _referenceResolution(scheme: string, path: string): string {\n\n\t// the slash-character is our 'default base' as we don't\n\t// support constructing URIs relative to other URIs. This\n\t// also means that we alter and potentially break paths.\n\t// see https://tools.ietf.org/html/rfc3986#section-5.1.4\n\tswitch (scheme) {\n\t\tcase 'https':\n\t\tcase 'http':\n\t\tcase 'file':\n\t\t\tif (!path) {\n\t\t\t\tpath = _slash;\n\t\t\t} else if (path[0] !== _slash) {\n\t\t\t\tpath = _slash + path;\n\t\t\t}\n\t\t\tbreak;\n\t}\n\treturn path;\n}\n\nconst _empty = '';\nconst _slash = '/';\nconst _regexp = /^(([^:/?#]+?):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?/;\n\n/**\n * Uniform Resource Identifier (URI) http://tools.ietf.org/html/rfc3986.\n * This class is a simple parser which creates the basic component parts\n * (http://tools.ietf.org/html/rfc3986#section-3) with minimal validation\n * and encoding.\n *\n * ```txt\n * foo://example.com:8042/over/there?name=ferret#nose\n * \\_/ \\______________/\\_________/ \\_________/ \\__/\n * | | | | |\n * scheme authority path query fragment\n * | _____________________|__\n * / \\ / \\\n * urn:example:animal:ferret:nose\n * ```\n */\nexport class URI implements UriComponents {\n\n\tstatic isUri(thing: any): thing is URI {\n\t\tif (thing instanceof URI) {\n\t\t\treturn true;\n\t\t}\n\t\tif (!thing) {\n\t\t\treturn false;\n\t\t}\n\t\treturn typeof (<URI>thing).authority === 'string'\n\t\t\t&& typeof (<URI>thing).fragment === 'string'\n\t\t\t&& typeof (<URI>thing).path === 'string'\n\t\t\t&& typeof (<URI>thing).query === 'string'\n\t\t\t&& typeof (<URI>thing).scheme === 'string'\n\t\t\t&& typeof (<URI>thing).fsPath === 'string'\n\t\t\t&& typeof (<URI>thing).with === 'function'\n\t\t\t&& typeof (<URI>thing).toString === 'function';\n\t}\n\n\t/**\n\t * scheme is the 'http' part of 'http://www.example.com/some/path?query#fragment'.\n\t * The part before the first colon.\n\t */\n\treadonly scheme: string;\n\n\t/**\n\t * authority is the 'www.example.com' part of 'http://www.example.com/some/path?query#fragment'.\n\t * The part between the first double slashes and the next slash.\n\t */\n\treadonly authority: string;\n\n\t/**\n\t * path is the '/some/path' part of 'http://www.example.com/some/path?query#fragment'.\n\t */\n\treadonly path: string;\n\n\t/**\n\t * query is the 'query' part of 'http://www.example.com/some/path?query#fragment'.\n\t */\n\treadonly query: string;\n\n\t/**\n\t * fragment is the 'fragment' part of 'http://www.example.com/some/path?query#fragment'.\n\t */\n\treadonly fragment: string;\n\n\t/**\n\t * @internal\n\t */\n\tprotected constructor(scheme: string, authority?: string, path?: string, query?: string, fragment?: string, _strict?: boolean);\n\n\t/**\n\t * @internal\n\t */\n\tprotected constructor(components: UriComponents);\n\n\t/**\n\t * @internal\n\t */\n\tprotected constructor(schemeOrData: string | UriComponents, authority?: string, path?: string, query?: string, fragment?: string, _strict: boolean = false) {\n\n\t\tif (typeof schemeOrData === 'object') {\n\t\t\tthis.scheme = schemeOrData.scheme || _empty;\n\t\t\tthis.authority = schemeOrData.authority || _empty;\n\t\t\tthis.path = schemeOrData.path || _empty;\n\t\t\tthis.query = schemeOrData.query || _empty;\n\t\t\tthis.fragment = schemeOrData.fragment || _empty;\n\t\t\t// no validation because it's this URI\n\t\t\t// that creates uri components.\n\t\t\t// _validateUri(this);\n\t\t} else {\n\t\t\tthis.scheme = _schemeFix(schemeOrData, _strict);\n\t\t\tthis.authority = authority || _empty;\n\t\t\tthis.path = _referenceResolution(this.scheme, path || _empty);\n\t\t\tthis.query = query || _empty;\n\t\t\tthis.fragment = fragment || _empty;\n\n\t\t\t_validateUri(this, _strict);\n\t\t}\n\t}\n\n\t// ---- filesystem path -----------------------\n\n\t/**\n\t * Returns a string representing the corresponding file system path of this URI.\n\t * Will handle UNC paths, normalizes windows drive letters to lower-case, and uses the\n\t * platform specific path separator.\n\t *\n\t * * Will *not* validate the path for invalid characters and semantics.\n\t * * Will *not* look at the scheme of this URI.\n\t * * The result shall *not* be used for display purposes but for accessing a file on disk.\n\t *\n\t *\n\t * The *difference* to `URI#path` is the use of the platform specific separator and the handling\n\t * of UNC paths. See the below sample of a file-uri with an authority (UNC path).\n\t *\n\t * ```ts\n\t\tconst u = URI.parse('file://server/c$/folder/file.txt')\n\t\tu.authority === 'server'\n\t\tu.path === '/shares/c$/file.txt'\n\t\tu.fsPath === '\\\\server\\c$\\folder\\file.txt'\n\t```\n\t *\n\t * Using `URI#path` to read a file (using fs-apis) would not be enough because parts of the path,\n\t * namely the server name, would be missing. Therefore `URI#fsPath` exists - it's sugar to ease working\n\t * with URIs that represent files on disk (`file` scheme).\n\t */\n\tget fsPath(): string {\n\t\t// if (this.scheme !== 'file') {\n\t\t// \tconsole.warn(`[UriError] calling fsPath with scheme ${this.scheme}`);\n\t\t// }\n\t\treturn uriToFsPath(this, false);\n\t}\n\n\t// ---- modify to new -------------------------\n\n\twith(change: { scheme?: string; authority?: string | null; path?: string | null; query?: string | null; fragment?: string | null }): URI {\n\n\t\tif (!change) {\n\t\t\treturn this;\n\t\t}\n\n\t\tlet { scheme, authority, path, query, fragment } = change;\n\t\tif (scheme === undefined) {\n\t\t\tscheme = this.scheme;\n\t\t} else if (scheme === null) {\n\t\t\tscheme = _empty;\n\t\t}\n\t\tif (authority === undefined) {\n\t\t\tauthority = this.authority;\n\t\t} else if (authority === null) {\n\t\t\tauthority = _empty;\n\t\t}\n\t\tif (path === undefined) {\n\t\t\tpath = this.path;\n\t\t} else if (path === null) {\n\t\t\tpath = _empty;\n\t\t}\n\t\tif (query === undefined) {\n\t\t\tquery = this.query;\n\t\t} else if (query === null) {\n\t\t\tquery = _empty;\n\t\t}\n\t\tif (fragment === undefined) {\n\t\t\tfragment = this.fragment;\n\t\t} else if (fragment === null) {\n\t\t\tfragment = _empty;\n\t\t}\n\n\t\tif (scheme === this.scheme\n\t\t\t&& authority === this.authority\n\t\t\t&& path === this.path\n\t\t\t&& query === this.query\n\t\t\t&& fragment === this.fragment) {\n\n\t\t\treturn this;\n\t\t}\n\n\t\treturn new Uri(scheme, authority, path, query, fragment);\n\t}\n\n\t// ---- parse & validate ------------------------\n\n\t/**\n\t * Creates a new URI from a string, e.g. `http://www.example.com/some/path`,\n\t * `file:///usr/home`, or `scheme:with/path`.\n\t *\n\t * @param value A string which represents an URI (see `URI#toString`).\n\t */\n\tstatic parse(value: string, _strict: boolean = false): URI {\n\t\tconst match = _regexp.exec(value);\n\t\tif (!match) {\n\t\t\treturn new Uri(_empty, _empty, _empty, _empty, _empty);\n\t\t}\n\t\treturn new Uri(\n\t\t\tmatch[2] || _empty,\n\t\t\tpercentDecode(match[4] || _empty),\n\t\t\tpercentDecode(match[5] || _empty),\n\t\t\tpercentDecode(match[7] || _empty),\n\t\t\tpercentDecode(match[9] || _empty),\n\t\t\t_strict\n\t\t);\n\t}\n\n\t/**\n\t * Creates a new URI from a file system path, e.g. `c:\\my\\files`,\n\t * `/usr/home`, or `\\\\server\\share\\some\\path`.\n\t *\n\t * The *difference* between `URI#parse` and `URI#file` is that the latter treats the argument\n\t * as path, not as stringified-uri. E.g. `URI.file(path)` is **not the same as**\n\t * `URI.parse('file://' + path)` because the path might contain characters that are\n\t * interpreted (# and ?). See the following sample:\n\t * ```ts\n\tconst good = URI.file('/coding/c#/project1');\n\tgood.scheme === 'file';\n\tgood.path === '/coding/c#/project1';\n\tgood.fragment === '';\n\tconst bad = URI.parse('file://' + '/coding/c#/project1');\n\tbad.scheme === 'file';\n\tbad.path === '/coding/c'; // path is now broken\n\tbad.fragment === '/project1';\n\t```\n\t *\n\t * @param path A file system path (see `URI#fsPath`)\n\t */\n\tstatic file(path: string): URI {\n\n\t\tlet authority = _empty;\n\n\t\t// normalize to fwd-slashes on windows,\n\t\t// on other systems bwd-slashes are valid\n\t\t// filename character, eg /f\\oo/ba\\r.txt\n\t\tif (isWindows) {\n\t\t\tpath = path.replace(/\\\\/g, _slash);\n\t\t}\n\n\t\t// check for authority as used in UNC shares\n\t\t// or use the path as given\n\t\tif (path[0] === _slash && path[1] === _slash) {\n\t\t\tconst idx = path.indexOf(_slash, 2);\n\t\t\tif (idx === -1) {\n\t\t\t\tauthority = path.substring(2);\n\t\t\t\tpath = _slash;\n\t\t\t} else {\n\t\t\t\tauthority = path.substring(2, idx);\n\t\t\t\tpath = path.substring(idx) || _slash;\n\t\t\t}\n\t\t}\n\n\t\treturn new Uri('file', authority, path, _empty, _empty);\n\t}\n\n\tstatic from(components: { scheme: string; authority?: string; path?: string; query?: string; fragment?: string }): URI {\n\t\tconst result = new Uri(\n\t\t\tcomponents.scheme,\n\t\t\tcomponents.authority,\n\t\t\tcomponents.path,\n\t\t\tcomponents.query,\n\t\t\tcomponents.fragment,\n\t\t);\n\t\t_validateUri(result, true);\n\t\treturn result;\n\t}\n\n\t// ---- printing/externalize ---------------------------\n\n\t/**\n\t * Creates a string representation for this URI. It's guaranteed that calling\n\t * `URI.parse` with the result of this function creates an URI which is equal\n\t * to this URI.\n\t *\n\t * * The result shall *not* be used for display purposes but for externalization or transport.\n\t * * The result will be encoded using the percentage encoding and encoding happens mostly\n\t * ignore the scheme-specific encoding rules.\n\t *\n\t * @param skipEncoding Do not encode the result, default is `false`\n\t */\n\ttoString(skipEncoding: boolean = false): string {\n\t\treturn _asFormatted(this, skipEncoding);\n\t}\n\n\ttoJSON(): UriComponents {\n\t\treturn this;\n\t}\n\n\tstatic revive(data: UriComponents | URI): URI;\n\tstatic revive(data: UriComponents | URI | undefined): URI | undefined;\n\tstatic revive(data: UriComponents | URI | null): URI | null;\n\tstatic revive(data: UriComponents | URI | undefined | null): URI | undefined | null;\n\tstatic revive(data: UriComponents | URI | undefined | null): URI | undefined | null {\n\t\tif (!data) {\n\t\t\treturn <any>data;\n\t\t} else if (data instanceof URI) {\n\t\t\treturn data;\n\t\t} else {\n\t\t\tconst result = new Uri(data);\n\t\t\tresult._formatted = (<UriState>data).external;\n\t\t\tresult._fsPath = (<UriState>data)._sep === _pathSepMarker ? (<UriState>data).fsPath : null;\n\t\t\treturn result;\n\t\t}\n\t}\n}\n\nexport interface UriComponents {\n\tscheme: string;\n\tauthority: string;\n\tpath: string;\n\tquery: string;\n\tfragment: string;\n}\n\ninterface UriState extends UriComponents {\n\t$mid: number;\n\texternal: string;\n\tfsPath: string;\n\t_sep: 1 | undefined;\n}\n\nconst _pathSepMarker = isWindows ? 1 : undefined;\n\n// This class exists so that URI is compatible with vscode.Uri (API).\nclass Uri extends URI {\n\n\t_formatted: string | null = null;\n\t_fsPath: string | null = null;\n\n\toverride get fsPath(): string {\n\t\tif (!this._fsPath) {\n\t\t\tthis._fsPath = uriToFsPath(this, false);\n\t\t}\n\t\treturn this._fsPath;\n\t}\n\n\toverride toString(skipEncoding: boolean = false): string {\n\t\tif (!skipEncoding) {\n\t\t\tif (!this._formatted) {\n\t\t\t\tthis._formatted = _asFormatted(this, false);\n\t\t\t}\n\t\t\treturn this._formatted;\n\t\t} else {\n\t\t\t// we don't cache that\n\t\t\treturn _asFormatted(this, true);\n\t\t}\n\t}\n\n\toverride toJSON(): UriComponents {\n\t\tconst res = <UriState>{\n\t\t\t$mid: 1\n\t\t};\n\t\t// cached state\n\t\tif (this._fsPath) {\n\t\t\tres.fsPath = this._fsPath;\n\t\t\tres._sep = _pathSepMarker;\n\t\t}\n\t\tif (this._formatted) {\n\t\t\tres.external = this._formatted;\n\t\t}\n\t\t// uri components\n\t\tif (this.path) {\n\t\t\tres.path = this.path;\n\t\t}\n\t\tif (this.scheme) {\n\t\t\tres.scheme = this.scheme;\n\t\t}\n\t\tif (this.authority) {\n\t\t\tres.authority = this.authority;\n\t\t}\n\t\tif (this.query) {\n\t\t\tres.query = this.query;\n\t\t}\n\t\tif (this.fragment) {\n\t\t\tres.fragment = this.fragment;\n\t\t}\n\t\treturn res;\n\t}\n}\n\n// reserved characters: https://tools.ietf.org/html/rfc3986#section-2.2\nconst encodeTable: { [ch: number]: string } = {\n\t[CharCode.Colon]: '%3A', // gen-delims\n\t[CharCode.Slash]: '%2F',\n\t[CharCode.QuestionMark]: '%3F',\n\t[CharCode.Hash]: '%23',\n\t[CharCode.OpenSquareBracket]: '%5B',\n\t[CharCode.CloseSquareBracket]: '%5D',\n\t[CharCode.AtSign]: '%40',\n\n\t[CharCode.ExclamationMark]: '%21', // sub-delims\n\t[CharCode.DollarSign]: '%24',\n\t[CharCode.Ampersand]: '%26',\n\t[CharCode.SingleQuote]: '%27',\n\t[CharCode.OpenParen]: '%28',\n\t[CharCode.CloseParen]: '%29',\n\t[CharCode.Asterisk]: '%2A',\n\t[CharCode.Plus]: '%2B',\n\t[CharCode.Comma]: '%2C',\n\t[CharCode.Semicolon]: '%3B',\n\t[CharCode.Equals]: '%3D',\n\n\t[CharCode.Space]: '%20',\n};\n\nfunction encodeURIComponentFast(uriComponent: string, isPath: boolean, isAuthority: boolean): string {\n\tlet res: string | undefined = undefined;\n\tlet nativeEncodePos = -1;\n\n\tfor (let pos = 0; pos < uriComponent.length; pos++) {\n\t\tconst code = uriComponent.charCodeAt(pos);\n\n\t\t// unreserved characters: https://tools.ietf.org/html/rfc3986#section-2.3\n\t\tif (\n\t\t\t(code >= CharCode.a && code <= CharCode.z)\n\t\t\t|| (code >= CharCode.A && code <= CharCode.Z)\n\t\t\t|| (code >= CharCode.Digit0 && code <= CharCode.Digit9)\n\t\t\t|| code === CharCode.Dash\n\t\t\t|| code === CharCode.Period\n\t\t\t|| code === CharCode.Underline\n\t\t\t|| code === CharCode.Tilde\n\t\t\t|| (isPath && code === CharCode.Slash)\n\t\t\t|| (isAuthority && code === CharCode.OpenSquareBracket)\n\t\t\t|| (isAuthority && code === CharCode.CloseSquareBracket)\n\t\t\t|| (isAuthority && code === CharCode.Colon)\n\t\t) {\n\t\t\t// check if we are delaying native encode\n\t\t\tif (nativeEncodePos !== -1) {\n\t\t\t\tres += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));\n\t\t\t\tnativeEncodePos = -1;\n\t\t\t}\n\t\t\t// check if we write into a new string (by default we try to return the param)\n\t\t\tif (res !== undefined) {\n\t\t\t\tres += uriComponent.charAt(pos);\n\t\t\t}\n\n\t\t} else {\n\t\t\t// encoding needed, we need to allocate a new string\n\t\t\tif (res === undefined) {\n\t\t\t\tres = uriComponent.substr(0, pos);\n\t\t\t}\n\n\t\t\t// check with default table first\n\t\t\tconst escaped = encodeTable[code];\n\t\t\tif (escaped !== undefined) {\n\n\t\t\t\t// check if we are delaying native encode\n\t\t\t\tif (nativeEncodePos !== -1) {\n\t\t\t\t\tres += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));\n\t\t\t\t\tnativeEncodePos = -1;\n\t\t\t\t}\n\n\t\t\t\t// append escaped variant to result\n\t\t\t\tres += escaped;\n\n\t\t\t} else if (nativeEncodePos === -1) {\n\t\t\t\t// use native encode only when needed\n\t\t\t\tnativeEncodePos = pos;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (nativeEncodePos !== -1) {\n\t\tres += encodeURIComponent(uriComponent.substring(nativeEncodePos));\n\t}\n\n\treturn res !== undefined ? res : uriComponent;\n}\n\nfunction encodeURIComponentMinimal(path: string): string {\n\tlet res: string | undefined = undefined;\n\tfor (let pos = 0; pos < path.length; pos++) {\n\t\tconst code = path.charCodeAt(pos);\n\t\tif (code === CharCode.Hash || code === CharCode.QuestionMark) {\n\t\t\tif (res === undefined) {\n\t\t\t\tres = path.substr(0, pos);\n\t\t\t}\n\t\t\tres += encodeTable[code];\n\t\t} else {\n\t\t\tif (res !== undefined) {\n\t\t\t\tres += path[pos];\n\t\t\t}\n\t\t}\n\t}\n\treturn res !== undefined ? res : path;\n}\n\n/**\n * Compute `fsPath` for the given uri\n */\nexport function uriToFsPath(uri: URI, keepDriveLetterCasing: boolean): string {\n\n\tlet value: string;\n\tif (uri.authority && uri.path.length > 1 && uri.scheme === 'file') {\n\t\t// unc path: file://shares/c$/far/boo\n\t\tvalue = `//${uri.authority}${uri.path}`;\n\t} else if (\n\t\turi.path.charCodeAt(0) === CharCode.Slash\n\t\t&& (uri.path.charCodeAt(1) >= CharCode.A && uri.path.charCodeAt(1) <= CharCode.Z || uri.path.charCodeAt(1) >= CharCode.a && uri.path.charCodeAt(1) <= CharCode.z)\n\t\t&& uri.path.charCodeAt(2) === CharCode.Colon\n\t) {\n\t\tif (!keepDriveLetterCasing) {\n\t\t\t// windows drive letter: file:///c:/far/boo\n\t\t\tvalue = uri.path[1].toLowerCase() + uri.path.substr(2);\n\t\t} else {\n\t\t\tvalue = uri.path.substr(1);\n\t\t}\n\t} else {\n\t\t// other path\n\t\tvalue = uri.path;\n\t}\n\tif (isWindows) {\n\t\tvalue = value.replace(/\\//g, '\\\\');\n\t}\n\treturn value;\n}\n\n/**\n * Create the external version of a uri\n */\nfunction _asFormatted(uri: URI, skipEncoding: boolean): string {\n\n\tconst encoder = !skipEncoding\n\t\t? encodeURIComponentFast\n\t\t: encodeURIComponentMinimal;\n\n\tlet res = '';\n\tlet { scheme, authority, path, query, fragment } = uri;\n\tif (scheme) {\n\t\tres += scheme;\n\t\tres += ':';\n\t}\n\tif (authority || scheme === 'file') {\n\t\tres += _slash;\n\t\tres += _slash;\n\t}\n\tif (authority) {\n\t\tlet idx = authority.indexOf('@');\n\t\tif (idx !== -1) {\n\t\t\t// <user>@<auth>\n\t\t\tconst userinfo = authority.substr(0, idx);\n\t\t\tauthority = authority.substr(idx + 1);\n\t\t\tidx = userinfo.lastIndexOf(':');\n\t\t\tif (idx === -1) {\n\t\t\t\tres += encoder(userinfo, false, false);\n\t\t\t} else {\n\t\t\t\t// <user>:<pass>@<auth>\n\t\t\t\tres += encoder(userinfo.substr(0, idx), false, false);\n\t\t\t\tres += ':';\n\t\t\t\tres += encoder(userinfo.substr(idx + 1), false, true);\n\t\t\t}\n\t\t\tres += '@';\n\t\t}\n\t\tauthority = authority.toLowerCase();\n\t\tidx = authority.lastIndexOf(':');\n\t\tif (idx === -1) {\n\t\t\tres += encoder(authority, false, true);\n\t\t} else {\n\t\t\t// <auth>:<port>\n\t\t\tres += encoder(authority.substr(0, idx), false, true);\n\t\t\tres += authority.substr(idx);\n\t\t}\n\t}\n\tif (path) {\n\t\t// lower-case windows drive letters in /C:/fff or C:/fff\n\t\tif (path.length >= 3 && path.charCodeAt(0) === CharCode.Slash && path.charCodeAt(2) === CharCode.Colon) {\n\t\t\tconst code = path.charCodeAt(1);\n\t\t\tif (code >= CharCode.A && code <= CharCode.Z) {\n\t\t\t\tpath = `/${String.fromCharCode(code + 32)}:${path.substr(3)}`; // \"/c:\".length === 3\n\t\t\t}\n\t\t} else if (path.length >= 2 && path.charCodeAt(1) === CharCode.Colon) {\n\t\t\tconst code = path.charCodeAt(0);\n\t\t\tif (code >= CharCode.A && code <= CharCode.Z) {\n\t\t\t\tpath = `${String.fromCharCode(code + 32)}:${path.substr(2)}`; // \"/c:\".length === 3\n\t\t\t}\n\t\t}\n\t\t// encode the rest of the path\n\t\tres += encoder(path, true, false);\n\t}\n\tif (query) {\n\t\tres += '?';\n\t\tres += encoder(query, false, false);\n\t}\n\tif (fragment) {\n\t\tres += '#';\n\t\tres += !skipEncoding ? encodeURIComponentFast(fragment, false, false) : fragment;\n\t}\n\treturn res;\n}\n\n// --- decode\n\nfunction decodeURIComponentGraceful(str: string): string {\n\ttry {\n\t\treturn decodeURIComponent(str);\n\t} catch {\n\t\tif (str.length > 3) {\n\t\t\treturn str.substr(0, 3) + decodeURIComponentGraceful(str.substr(3));\n\t\t} else {\n\t\t\treturn str;\n\t\t}\n\t}\n}\n\nconst _rEncodedAsHex = /(%[0-9A-Za-z][0-9A-Za-z])+/g;\n\nfunction percentDecode(str: string): string {\n\tif (!str.match(_rEncodedAsHex)) {\n\t\treturn str;\n\t}\n\treturn str.replace(_rEncodedAsHex, (match) => decodeURIComponentGraceful(match));\n}\n\n/**\n * Mapped-type that replaces all occurrences of URI with UriComponents\n */\nexport type UriDto<T> = { [K in keyof T]: T[K] extends URI\n\t? UriComponents\n\t: UriDto<T[K]> };\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n'use strict';\n\nimport { CharCode } from './charCode';\nimport { URI } from './uri';\nimport * as nodePath from 'path';\n\nconst posixPath = nodePath.posix || nodePath;\nconst slash = '/';\n\nexport namespace Utils {\n\n /**\n * Joins one or more input paths to the path of URI. \n * '/' is used as the directory separation character. \n * \n * The resolved path will be normalized. That means:\n * - all '..' and '.' segments are resolved.\n * - multiple, sequential occurences of '/' are replaced by a single instance of '/'.\n * - trailing separators are preserved.\n * \n * @param uri The input URI.\n * @param paths The paths to be joined with the path of URI.\n * @returns A URI with the joined path. All other properties of the URI (scheme, authority, query, fragments, ...) will be taken from the input URI.\n */\n export function joinPath(uri: URI, ...paths: string[]): URI {\n return uri.with({ path: posixPath.join(uri.path, ...paths) });\n }\n\n\n /**\n * Resolves one or more paths against the path of a URI. \n * '/' is used as the directory separation character. \n * \n * The resolved path will be normalized. That means:\n * - all '..' and '.' segments are resolved. \n * - multiple, sequential occurences of '/' are replaced by a single instance of '/'.\n * - trailing separators are removed.\n * \n * @param uri The input URI.\n * @param paths The paths to resolve against the path of URI.\n * @returns A URI with the resolved path. All other properties of the URI (scheme, authority, query, fragments, ...) will be taken from the input URI.\n */\n export function resolvePath(uri: URI, ...paths: string[]): URI {\n let path = uri.path; \n let slashAdded = false;\n if (path[0] !== slash) {\n path = slash + path; // make the path abstract: for posixPath.resolve the first segments has to be absolute or cwd is used.\n slashAdded = true;\n }\n let resolvedPath = posixPath.resolve(path, ...paths);\n if (slashAdded && resolvedPath[0] === slash && !uri.authority) {\n resolvedPath = resolvedPath.substring(1);\n }\n return uri.with({ path: resolvedPath });\n }\n\n /**\n * Returns a URI where the path is the directory name of the input uri, similar to the Unix dirname command. \n * In the path, '/' is recognized as the directory separation character. Trailing directory separators are ignored.\n * The orignal URI is returned if the URIs path is empty or does not contain any path segments.\n * \n * @param uri The input URI.\n * @return The last segment of the URIs path.\n */\n export function dirname(uri: URI): URI {\n if (uri.path.length === 0 || uri.path === slash) {\n return uri;\n }\n let path = posixPath.dirname(uri.path);\n if (path.length === 1 && path.charCodeAt(0) === CharCode.Period) {\n path = '';\n }\n return uri.with({ path });\n }\n\n /**\n * Returns the last segment of the path of a URI, similar to the Unix basename command. \n * In the path, '/' is recognized as the directory separation character. Trailing directory separators are ignored.\n * The empty string is returned if the URIs path is empty or does not contain any path segments.\n * \n * @param uri The input URI.\n * @return The base name of the URIs path.\n */\n export function basename(uri: URI): string {\n return posixPath.basename(uri.path);\n }\n\n /**\n * Returns the extension name of the path of a URI, similar to the Unix extname command. \n * In the path, '/' is recognized as the directory separation character. Trailing directory separators are ignored.\n * The empty string is returned if the URIs path is empty or does not contain any path segments.\n * \n * @param uri The input URI.\n * @return The extension name of the URIs path.\n */\n export function extname(uri: URI): string {\n return posixPath.extname(uri.path);\n }\n}", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { URI, Utils } from 'vscode-uri';\r\n\r\nexport { URI };\r\n\r\nexport namespace UriUtils {\r\n\r\n export const basename = Utils.basename;\r\n export const dirname = Utils.dirname;\r\n export const extname = Utils.extname;\r\n export const joinPath = Utils.joinPath;\r\n export const resolvePath = Utils.resolvePath;\r\n\r\n export function equals(a?: URI | string, b?: URI | string): boolean {\r\n return a?.toString() === b?.toString();\r\n }\r\n\r\n export function relative(from: URI | string, to: URI | string): string {\r\n const fromPath = typeof from === 'string' ? from : from.path;\r\n const toPath = typeof to === 'string' ? to : to.path;\r\n const fromParts = fromPath.split('/').filter(e => e.length > 0);\r\n const toParts = toPath.split('/').filter(e => e.length > 0);\r\n let i = 0;\r\n for (; i < fromParts.length; i++) {\r\n if (fromParts[i] !== toParts[i]) {\r\n break;\r\n }\r\n }\r\n const backPart = '../'.repeat(fromParts.length - i);\r\n const toPart = toParts.slice(i).join('/');\r\n return backPart + toPart;\r\n }\r\n\r\n export function normalize(uri: URI | string): string {\r\n return URI.parse(uri.toString()).toString();\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\n/**\r\n * Re-export 'TextDocument' from 'vscode-languageserver-textdocument' for convenience,\r\n * including both type _and_ symbol (namespace), as we here and there also refer to the symbol,\r\n * the overhead is very small, just a few kilobytes.\r\n * Everything else of that package (at the time contributing) is also defined\r\n * in 'vscode-languageserver-protocol' or 'vscode-languageserver-types'.\r\n */\r\nexport { TextDocument } from 'vscode-languageserver-textdocument';\r\n\r\nimport type { Diagnostic, Range } from 'vscode-languageserver-types';\r\nimport type { FileSystemProvider } from './file-system-provider.js';\r\nimport type { ParseResult, ParserOptions } from '../parser/langium-parser.js';\r\nimport type { ServiceRegistry } from '../service-registry.js';\r\nimport type { LangiumSharedCoreServices } from '../services.js';\r\nimport type { AstNode, AstNodeDescription, Mutable, Reference } from '../syntax-tree.js';\r\nimport type { MultiMap } from '../utils/collections.js';\r\nimport type { Stream } from '../utils/stream.js';\r\nimport { TextDocument } from './documents.js';\r\nimport { CancellationToken } from '../utils/cancellation.js';\r\nimport { stream } from '../utils/stream.js';\r\nimport { URI } from '../utils/uri-utils.js';\r\n\r\n/**\r\n * A Langium document holds the parse result (AST and CST) and any additional state that is derived\r\n * from the AST, e.g. the result of scope precomputation.\r\n */\r\nexport interface LangiumDocument<T extends AstNode = AstNode> {\r\n /** The Uniform Resource Identifier (URI) of the document */\r\n readonly uri: URI;\r\n /** The text document used to convert between offsets and positions */\r\n readonly textDocument: TextDocument;\r\n /** The current state of the document */\r\n state: DocumentState;\r\n /** The parse result holds the Abstract Syntax Tree (AST) and potentially also parser / lexer errors */\r\n parseResult: ParseResult<T>;\r\n /** Result of the scope precomputation phase */\r\n precomputedScopes?: PrecomputedScopes;\r\n /** An array of all cross-references found in the AST while linking */\r\n references: Reference[];\r\n /** Result of the validation phase */\r\n diagnostics?: Diagnostic[]\r\n}\r\n\r\n/**\r\n * A document is subject to several phases that are run in predefined order. Any state value implies that\r\n * smaller state values are finished as well.\r\n */\r\nexport enum DocumentState {\r\n /**\r\n * The text content has changed and needs to be parsed again. The AST held by this outdated\r\n * document instance is no longer valid.\r\n */\r\n Changed = 0,\r\n /**\r\n * An AST has been created from the text content. The document structure can be traversed,\r\n * but cross-references cannot be resolved yet. If necessary, the structure can be manipulated\r\n * at this stage as a preprocessing step.\r\n */\r\n Parsed = 1,\r\n /**\r\n * The `IndexManager` service has processed AST nodes of this document. This means the\r\n * exported symbols are available in the global scope and can be resolved from other documents.\r\n */\r\n IndexedContent = 2,\r\n /**\r\n * The `ScopeComputation` service has processed this document. This means the local symbols\r\n * are stored in a MultiMap so they can be looked up by the `ScopeProvider` service.\r\n * Once a document has reached this state, you may follow every reference - it will lazily\r\n * resolve its `ref` property and yield either the target AST node or `undefined` in case\r\n * the target is not in scope.\r\n */\r\n ComputedScopes = 3,\r\n /**\r\n * The `Linker` service has processed this document. All outgoing references have been\r\n * resolved or marked as erroneous.\r\n */\r\n Linked = 4,\r\n /**\r\n * The `IndexManager` service has processed AST node references of this document. This is\r\n * necessary to determine which documents are affected by a change in one of the workspace\r\n * documents.\r\n */\r\n IndexedReferences = 5,\r\n /**\r\n * The `DocumentValidator` service has processed this document. The language server listens\r\n * to the results of this phase and sends diagnostics to the client.\r\n */\r\n Validated = 6\r\n}\r\n\r\n/**\r\n * Result of the scope precomputation phase (`ScopeComputation` service).\r\n * It maps every AST node to the set of symbols that are visible in the subtree of that node.\r\n */\r\nexport type PrecomputedScopes = MultiMap<AstNode, AstNodeDescription>\r\n\r\nexport interface DocumentSegment {\r\n readonly range: Range\r\n readonly offset: number\r\n readonly length: number\r\n readonly end: number\r\n}\r\n\r\n/**\r\n * Surrogate definition of the `TextDocuments` interface from the `vscode-languageserver` package.\r\n * No implementation object is expected to be offered by `LangiumCoreServices`, but only by `LangiumLSPServices`.\r\n */\r\nexport type TextDocumentProvider = {\r\n get(uri: string | URI): TextDocument | undefined\r\n}\r\n\r\n/**\r\n * Shared service for creating `LangiumDocument` instances.\r\n *\r\n * Register a custom implementation if special (additional) behavior is required for your language(s).\r\n * Note: If you specialize {@link fromString} or {@link fromTextDocument} you probably might want to\r\n * specialize {@link update}, too!\r\n */\r\nexport interface LangiumDocumentFactory {\r\n /**\r\n * Create a Langium document from a `TextDocument` (usually associated with a file).\r\n */\r\n fromTextDocument<T extends AstNode = AstNode>(textDocument: TextDocument, uri?: URI, options?: ParserOptions): LangiumDocument<T>;\r\n /**\r\n * Create a Langium document from a `TextDocument` asynchronously. This action can be cancelled if a cancellable parser implementation has been provided.\r\n */\r\n fromTextDocument<T extends AstNode = AstNode>(textDocument: TextDocument, uri: URI | undefined, cancellationToken: CancellationToken): Promise<LangiumDocument<T>>;\r\n\r\n /**\r\n * Create an Langium document from an in-memory string.\r\n */\r\n fromString<T extends AstNode = AstNode>(text: string, uri: URI, options?: ParserOptions): LangiumDocument<T>;\r\n /**\r\n * Create a Langium document from an in-memory string asynchronously. This action can be cancelled if a cancellable parser implementation has been provided.\r\n */\r\n fromString<T extends AstNode = AstNode>(text: string, uri: URI, cancellationToken: CancellationToken): Promise<LangiumDocument<T>>;\r\n\r\n /**\r\n * Create an Langium document from a model that has been constructed in memory.\r\n */\r\n fromModel<T extends AstNode = AstNode>(model: T, uri: URI): LangiumDocument<T>;\r\n\r\n /**\r\n * Create an Langium document from a specified `URI`. The factory will use the `FileSystemAccess` service to read the file.\r\n */\r\n fromUri<T extends AstNode = AstNode>(uri: URI, cancellationToken?: CancellationToken): Promise<LangiumDocument<T>>;\r\n\r\n /**\r\n * Update the given document after changes in the corresponding textual representation.\r\n * Method is called by the document builder after it has been requested to build an existing\r\n * document and the document's state is {@link DocumentState.Changed}.\r\n * The text parsing is expected to be done the same way as in {@link fromTextDocument}\r\n * and {@link fromString}.\r\n */\r\n update<T extends AstNode = AstNode>(document: LangiumDocument<T>, cancellationToken: CancellationToken): Promise<LangiumDocument<T>>\r\n}\r\n\r\nexport class DefaultLangiumDocumentFactory implements LangiumDocumentFactory {\r\n\r\n protected readonly serviceRegistry: ServiceRegistry;\r\n protected readonly textDocuments?: TextDocumentProvider;\r\n protected readonly fileSystemProvider: FileSystemProvider;\r\n\r\n constructor(services: LangiumSharedCoreServices) {\r\n this.serviceRegistry = services.ServiceRegistry;\r\n this.textDocuments = services.workspace.TextDocuments;\r\n this.fileSystemProvider = services.workspace.FileSystemProvider;\r\n }\r\n\r\n async fromUri<T extends AstNode = AstNode>(uri: URI, cancellationToken = CancellationToken.None): Promise<LangiumDocument<T>> {\r\n const content = await this.fileSystemProvider.readFile(uri);\r\n return this.createAsync<T>(uri, content, cancellationToken);\r\n }\r\n\r\n fromTextDocument<T extends AstNode = AstNode>(textDocument: TextDocument, uri?: URI, options?: ParserOptions): LangiumDocument<T>;\r\n fromTextDocument<T extends AstNode = AstNode>(textDocument: TextDocument, uri: URI | undefined, cancellationToken: CancellationToken): Promise<LangiumDocument<T>>;\r\n fromTextDocument<T extends AstNode = AstNode>(textDocument: TextDocument, uri?: URI, token?: CancellationToken | ParserOptions): LangiumDocument<T> | Promise<LangiumDocument<T>> {\r\n uri = uri ?? URI.parse(textDocument.uri);\r\n if (CancellationToken.is(token)) {\r\n return this.createAsync<T>(uri, textDocument, token);\r\n } else {\r\n return this.create<T>(uri, textDocument, token);\r\n }\r\n }\r\n\r\n fromString<T extends AstNode = AstNode>(text: string, uri: URI, options?: ParserOptions): LangiumDocument<T>;\r\n fromString<T extends AstNode = AstNode>(text: string, uri: URI, cancellationToken: CancellationToken): Promise<LangiumDocument<T>>;\r\n fromString<T extends AstNode = AstNode>(text: string, uri: URI, token?: CancellationToken | ParserOptions): LangiumDocument<T> | Promise<LangiumDocument<T>> {\r\n if (CancellationToken.is(token)) {\r\n return this.createAsync<T>(uri, text, token);\r\n } else {\r\n return this.create<T>(uri, text, token);\r\n }\r\n }\r\n\r\n fromModel<T extends AstNode = AstNode>(model: T, uri: URI): LangiumDocument<T> {\r\n return this.create<T>(uri, { $model: model });\r\n }\r\n\r\n protected create<T extends AstNode = AstNode>(uri: URI, content: string | TextDocument | { $model: T }, options?: ParserOptions): LangiumDocument<T> {\r\n if (typeof content === 'string') {\r\n const parseResult = this.parse<T>(uri, content, options);\r\n return this.createLangiumDocument<T>(parseResult, uri, undefined, content);\r\n\r\n } else if ('$model' in content) {\r\n const parseResult = { value: content.$model, parserErrors: [], lexerErrors: [] };\r\n return this.createLangiumDocument<T>(parseResult, uri);\r\n\r\n } else {\r\n const parseResult = this.parse<T>(uri, content.getText(), options);\r\n return this.createLangiumDocument(parseResult, uri, content);\r\n }\r\n }\r\n\r\n protected async createAsync<T extends AstNode = AstNode>(uri: URI, content: string | TextDocument, cancelToken: CancellationToken): Promise<LangiumDocument<T>> {\r\n if (typeof content === 'string') {\r\n const parseResult = await this.parseAsync<T>(uri, content, cancelToken);\r\n return this.createLangiumDocument<T>(parseResult, uri, undefined, content);\r\n } else {\r\n const parseResult = await this.parseAsync<T>(uri, content.getText(), cancelToken);\r\n return this.createLangiumDocument(parseResult, uri, content);\r\n }\r\n }\r\n\r\n /**\r\n * Create a LangiumDocument from a given parse result.\r\n *\r\n * A TextDocument is created on demand if it is not provided as argument here. Usually this\r\n * should not be necessary because the main purpose of the TextDocument is to convert between\r\n * text ranges and offsets, which is done solely in LSP request handling.\r\n *\r\n * With the introduction of {@link update} below this method is supposed to be mainly called\r\n * during workspace initialization and on addition/recognition of new files, while changes in\r\n * existing documents are processed via {@link update}.\r\n */\r\n protected createLangiumDocument<T extends AstNode = AstNode>(parseResult: ParseResult<T>, uri: URI, textDocument?: TextDocument, text?: string): LangiumDocument<T> {\r\n let document: LangiumDocument<T>;\r\n if (textDocument) {\r\n document = {\r\n parseResult,\r\n uri,\r\n state: DocumentState.Parsed,\r\n references: [],\r\n textDocument\r\n };\r\n } else {\r\n const textDocumentGetter = this.createTextDocumentGetter(uri, text);\r\n document = {\r\n parseResult,\r\n uri,\r\n state: DocumentState.Parsed,\r\n references: [],\r\n get textDocument() {\r\n return textDocumentGetter();\r\n }\r\n };\r\n }\r\n (parseResult.value as Mutable<AstNode>).$document = document;\r\n return document;\r\n }\r\n\r\n async update<T extends AstNode = AstNode>(document: Mutable<LangiumDocument<T>>, cancellationToken: CancellationToken): Promise<LangiumDocument<T>> {\r\n // The CST full text property contains the original text that was used to create the AST.\r\n const oldText = document.parseResult.value.$cstNode?.root.fullText;\r\n const textDocument = this.textDocuments?.get(document.uri.toString());\r\n const text = textDocument ? textDocument.getText() : await this.fileSystemProvider.readFile(document.uri);\r\n\r\n if (textDocument) {\r\n Object.defineProperty(\r\n document,\r\n 'textDocument',\r\n {\r\n value: textDocument\r\n }\r\n );\r\n } else {\r\n const textDocumentGetter = this.createTextDocumentGetter(document.uri, text);\r\n Object.defineProperty(\r\n document,\r\n 'textDocument',\r\n {\r\n get: textDocumentGetter\r\n }\r\n );\r\n }\r\n\r\n // Some of these documents can be pretty large, so parsing them again can be quite expensive.\r\n // Therefore, we only parse if the text has actually changed.\r\n if (oldText !== text) {\r\n document.parseResult = await this.parseAsync(document.uri, text, cancellationToken);\r\n (document.parseResult.value as Mutable<AstNode>).$document = document;\r\n }\r\n document.state = DocumentState.Parsed;\r\n return document;\r\n }\r\n\r\n protected parse<T extends AstNode>(uri: URI, text: string, options?: ParserOptions): ParseResult<T> {\r\n const services = this.serviceRegistry.getServices(uri);\r\n return services.parser.LangiumParser.parse<T>(text, options);\r\n }\r\n\r\n protected parseAsync<T extends AstNode>(uri: URI, text: string, cancellationToken: CancellationToken): Promise<ParseResult<T>> {\r\n const services = this.serviceRegistry.getServices(uri);\r\n return services.parser.AsyncParser.parse<T>(text, cancellationToken);\r\n }\r\n\r\n protected createTextDocumentGetter(uri: URI, text?: string): () => TextDocument {\r\n const serviceRegistry = this.serviceRegistry;\r\n let textDoc: TextDocument | undefined = undefined;\r\n return () => {\r\n return textDoc ??= TextDocument.create(\r\n uri.toString(), serviceRegistry.getServices(uri).LanguageMetaData.languageId, 0, text ?? ''\r\n );\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Shared service for managing Langium documents.\r\n */\r\nexport interface LangiumDocuments {\r\n\r\n /**\r\n * A stream of all documents managed under this service.\r\n */\r\n readonly all: Stream<LangiumDocument>\r\n\r\n /**\r\n * Manage a new document under this service.\r\n * @throws an error if a document with the same URI is already present.\r\n */\r\n addDocument(document: LangiumDocument): void;\r\n\r\n /**\r\n * Retrieve the document with the given URI, if present. Otherwise returns `undefined`.\r\n */\r\n getDocument(uri: URI): LangiumDocument | undefined;\r\n\r\n /**\r\n * Retrieve the document with the given URI. If not present, a new one will be created using the file system access.\r\n * The new document will be added to the list of documents managed under this service.\r\n */\r\n getOrCreateDocument(uri: URI, cancellationToken?: CancellationToken): Promise<LangiumDocument>;\r\n\r\n /**\r\n * Creates a new document with the given URI and text content.\r\n * The new document is automatically added to this service and can be retrieved using {@link getDocument}.\r\n *\r\n * @throws an error if a document with the same URI is already present.\r\n */\r\n createDocument(uri: URI, text: string): LangiumDocument;\r\n\r\n /**\r\n * Creates a new document with the given URI and text content asynchronously.\r\n * The process can be interrupted with a cancellation token.\r\n * The new document is automatically added to this service and can be retrieved using {@link getDocument}.\r\n *\r\n * @throws an error if a document with the same URI is already present.\r\n */\r\n createDocument(uri: URI, text: string, cancellationToken: CancellationToken): Promise<LangiumDocument>;\r\n\r\n /**\r\n * Returns `true` if a document with the given URI is managed under this service.\r\n */\r\n hasDocument(uri: URI): boolean;\r\n\r\n /**\r\n * Flag the document with the given URI as `Changed`, if present, meaning that its content\r\n * is no longer valid. The content (parseResult) stays untouched, while internal data may\r\n * be dropped to reduce memory footprint.\r\n *\r\n * @returns the affected {@link LangiumDocument} if existing for convenience\r\n */\r\n invalidateDocument(uri: URI): LangiumDocument | undefined;\r\n\r\n /**\r\n * Remove the document with the given URI, if present, and mark it as `Changed`, meaning\r\n * that its content is no longer valid. The next call to `getOrCreateDocument` with the same\r\n * URI will create a new document instance.\r\n *\r\n * @returns the affected {@link LangiumDocument} if existing for convenience\r\n */\r\n deleteDocument(uri: URI): LangiumDocument | undefined;\r\n}\r\n\r\nexport class DefaultLangiumDocuments implements LangiumDocuments {\r\n\r\n protected readonly langiumDocumentFactory: LangiumDocumentFactory;\r\n protected readonly serviceRegistry: ServiceRegistry;\r\n\r\n protected readonly documentMap: Map<string, LangiumDocument> = new Map();\r\n\r\n constructor(services: LangiumSharedCoreServices) {\r\n this.langiumDocumentFactory = services.workspace.LangiumDocumentFactory;\r\n this.serviceRegistry = services.ServiceRegistry;\r\n }\r\n\r\n get all(): Stream<LangiumDocument> {\r\n return stream(this.documentMap.values());\r\n }\r\n\r\n addDocument(document: LangiumDocument): void {\r\n const uriString = document.uri.toString();\r\n if (this.documentMap.has(uriString)) {\r\n throw new Error(`A document with the URI '${uriString}' is already present.`);\r\n }\r\n this.documentMap.set(uriString, document);\r\n }\r\n\r\n getDocument(uri: URI): LangiumDocument | undefined {\r\n const uriString = uri.toString();\r\n return this.documentMap.get(uriString);\r\n }\r\n\r\n async getOrCreateDocument(uri: URI, cancellationToken?: CancellationToken): Promise<LangiumDocument> {\r\n let document = this.getDocument(uri);\r\n if (document) {\r\n return document;\r\n }\r\n document = await this.langiumDocumentFactory.fromUri(uri, cancellationToken);\r\n this.addDocument(document);\r\n return document;\r\n }\r\n\r\n createDocument(uri: URI, text: string): LangiumDocument;\r\n createDocument(uri: URI, text: string, cancellationToken: CancellationToken): Promise<LangiumDocument>;\r\n createDocument(uri: URI, text: string, cancellationToken?: CancellationToken): LangiumDocument | Promise<LangiumDocument> {\r\n if (cancellationToken) {\r\n return this.langiumDocumentFactory.fromString(text, uri, cancellationToken).then(document => {\r\n this.addDocument(document);\r\n return document;\r\n });\r\n } else {\r\n const document = this.langiumDocumentFactory.fromString(text, uri);\r\n this.addDocument(document);\r\n return document;\r\n }\r\n }\r\n\r\n hasDocument(uri: URI): boolean {\r\n return this.documentMap.has(uri.toString());\r\n }\r\n\r\n invalidateDocument(uri: URI): LangiumDocument | undefined {\r\n const uriString = uri.toString();\r\n const langiumDoc = this.documentMap.get(uriString);\r\n if (langiumDoc) {\r\n const linker = this.serviceRegistry.getServices(uri).references.Linker;\r\n linker.unlink(langiumDoc);\r\n langiumDoc.state = DocumentState.Changed;\r\n langiumDoc.precomputedScopes = undefined;\r\n langiumDoc.diagnostics = undefined;\r\n }\r\n return langiumDoc;\r\n }\r\n\r\n deleteDocument(uri: URI): LangiumDocument | undefined {\r\n const uriString = uri.toString();\r\n const langiumDoc = this.documentMap.get(uriString);\r\n if (langiumDoc) {\r\n langiumDoc.state = DocumentState.Changed;\r\n this.documentMap.delete(uriString);\r\n }\r\n return langiumDoc;\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, AstNodeDescription, AstReflection, CstNode, LinkingError, Reference, ReferenceInfo } from '../syntax-tree.js';\r\nimport type { AstNodeLocator } from '../workspace/ast-node-locator.js';\r\nimport type { LangiumDocument, LangiumDocuments } from '../workspace/documents.js';\r\nimport type { ScopeProvider } from './scope-provider.js';\r\nimport { CancellationToken } from '../utils/cancellation.js';\r\nimport { isAstNode, isAstNodeDescription, isLinkingError } from '../syntax-tree.js';\r\nimport { findRootNode, streamAst, streamReferences } from '../utils/ast-utils.js';\r\nimport { interruptAndCheck } from '../utils/promise-utils.js';\r\nimport { DocumentState } from '../workspace/documents.js';\r\n\r\n/**\r\n * Language-specific service for resolving cross-references in the AST.\r\n */\r\nexport interface Linker {\r\n\r\n /**\r\n * Links all cross-references within the specified document. The default implementation loads only target\r\n * elements from documents that are present in the `LangiumDocuments` service. The linked references are\r\n * stored in the document's `references` property.\r\n *\r\n * @param document A LangiumDocument that shall be linked.\r\n * @param cancelToken A token for cancelling the operation.\r\n *\r\n * @throws `OperationCancelled` if a cancellation event is detected\r\n */\r\n link(document: LangiumDocument, cancelToken?: CancellationToken): Promise<void>;\r\n\r\n /**\r\n * Unlinks all references within the specified document and removes them from the list of `references`.\r\n *\r\n * @param document A LangiumDocument that shall be unlinked.\r\n */\r\n unlink(document: LangiumDocument): void;\r\n\r\n /**\r\n * Determines a candidate AST node description for linking the given reference.\r\n *\r\n * @param refInfo Information about the reference.\r\n */\r\n getCandidate(refInfo: ReferenceInfo): AstNodeDescription | LinkingError;\r\n\r\n /**\r\n * Creates a cross reference node being aware of its containing AstNode, the corresponding CstNode,\r\n * the cross reference text denoting the target AstNode being already extracted of the document text,\r\n * as well as the unique cross reference identifier.\r\n *\r\n * Default behavior:\r\n * - The returned Reference's 'ref' property pointing to the target AstNode is populated lazily on its\r\n * first visit.\r\n * - If the target AstNode cannot be resolved on the first visit, an error indicator will be installed\r\n * and further resolution attempts will *not* be performed.\r\n *\r\n * @param node The containing AST node\r\n * @param property The AST node property being referenced\r\n * @param refNode The corresponding CST node\r\n * @param refText The cross reference text denoting the target AstNode\r\n * @returns the desired Reference node, whose behavior wrt. resolving the cross reference is implementation specific.\r\n */\r\n buildReference(node: AstNode, property: string, refNode: CstNode | undefined, refText: string): Reference;\r\n\r\n}\r\n\r\nconst ref_resolving = Symbol('ref_resolving');\r\n\r\ninterface DefaultReference extends Reference {\r\n _ref?: AstNode | LinkingError | typeof ref_resolving;\r\n _nodeDescription?: AstNodeDescription;\r\n}\r\n\r\nexport class DefaultLinker implements Linker {\r\n protected readonly reflection: AstReflection;\r\n protected readonly scopeProvider: ScopeProvider;\r\n protected readonly astNodeLocator: AstNodeLocator;\r\n protected readonly langiumDocuments: () => LangiumDocuments;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.reflection = services.shared.AstReflection;\r\n this.langiumDocuments = () => services.shared.workspace.LangiumDocuments;\r\n this.scopeProvider = services.references.ScopeProvider;\r\n this.astNodeLocator = services.workspace.AstNodeLocator;\r\n }\r\n\r\n async link(document: LangiumDocument, cancelToken = CancellationToken.None): Promise<void> {\r\n for (const node of streamAst(document.parseResult.value)) {\r\n await interruptAndCheck(cancelToken);\r\n streamReferences(node).forEach(ref => this.doLink(ref, document));\r\n }\r\n }\r\n\r\n protected doLink(refInfo: ReferenceInfo, document: LangiumDocument): void {\r\n const ref = refInfo.reference as DefaultReference;\r\n // The reference may already have been resolved lazily by accessing its `ref` property.\r\n if (ref._ref === undefined) {\r\n ref._ref = ref_resolving;\r\n try {\r\n const description = this.getCandidate(refInfo);\r\n if (isLinkingError(description)) {\r\n ref._ref = description;\r\n } else {\r\n ref._nodeDescription = description;\r\n if (this.langiumDocuments().hasDocument(description.documentUri)) {\r\n // The target document is already loaded\r\n const linkedNode = this.loadAstNode(description);\r\n ref._ref = linkedNode ?? this.createLinkingError(refInfo, description);\r\n } else {\r\n // Try to load the target AST node later using the already provided description\r\n ref._ref = undefined;\r\n }\r\n }\r\n } catch (err) {\r\n console.error(`An error occurred while resolving reference to '${ref.$refText}':`, err);\r\n const errorMessage = (err as Error).message ?? String(err);\r\n ref._ref = {\r\n ...refInfo,\r\n message: `An error occurred while resolving reference to '${ref.$refText}': ${errorMessage}`\r\n };\r\n }\r\n // Add the reference to the document's array of references\r\n // Only add if the reference has been not been resolved earlier\r\n // Otherwise we end up with duplicates\r\n // See also implementation of `buildReference`\r\n document.references.push(ref);\r\n }\r\n }\r\n\r\n unlink(document: LangiumDocument): void {\r\n for (const ref of document.references) {\r\n delete (ref as DefaultReference)._ref;\r\n delete (ref as DefaultReference)._nodeDescription;\r\n }\r\n document.references = [];\r\n }\r\n\r\n getCandidate(refInfo: ReferenceInfo): AstNodeDescription | LinkingError {\r\n const scope = this.scopeProvider.getScope(refInfo);\r\n const description = scope.getElement(refInfo.reference.$refText);\r\n return description ?? this.createLinkingError(refInfo);\r\n }\r\n\r\n buildReference(node: AstNode, property: string, refNode: CstNode | undefined, refText: string): Reference {\r\n // See behavior description in doc of Linker, update that on changes in here.\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const linker = this;\r\n const reference: DefaultReference = {\r\n $refNode: refNode,\r\n $refText: refText,\r\n\r\n get ref() {\r\n if (isAstNode(this._ref)) {\r\n // Most frequent case: the target is already resolved.\r\n return this._ref;\r\n } else if (isAstNodeDescription(this._nodeDescription)) {\r\n // A candidate has been found before, but it is not loaded yet.\r\n const linkedNode = linker.loadAstNode(this._nodeDescription);\r\n this._ref = linkedNode ??\r\n linker.createLinkingError({ reference, container: node, property }, this._nodeDescription);\r\n } else if (this._ref === undefined) {\r\n // The reference has not been linked yet, so do that now.\r\n this._ref = ref_resolving;\r\n const document = findRootNode(node).$document;\r\n const refData = linker.getLinkedNode({ reference, container: node, property });\r\n if (refData.error && document && document.state < DocumentState.ComputedScopes) {\r\n // Document scope is not ready, don't set `this._ref` so linker can retry later.\r\n return this._ref = undefined;\r\n }\r\n this._ref = refData.node ?? refData.error;\r\n this._nodeDescription = refData.descr;\r\n document?.references.push(this);\r\n } else if (this._ref === ref_resolving) {\r\n throw new Error(`Cyclic reference resolution detected: ${linker.astNodeLocator.getAstNodePath(node)}/${property} (symbol '${refText}')`);\r\n }\r\n return isAstNode(this._ref) ? this._ref : undefined;\r\n },\r\n get $nodeDescription() {\r\n return this._nodeDescription;\r\n },\r\n get error() {\r\n return isLinkingError(this._ref) ? this._ref : undefined;\r\n }\r\n };\r\n return reference;\r\n }\r\n\r\n protected getLinkedNode(refInfo: ReferenceInfo): { node?: AstNode, descr?: AstNodeDescription, error?: LinkingError } {\r\n try {\r\n const description = this.getCandidate(refInfo);\r\n if (isLinkingError(description)) {\r\n return { error: description };\r\n }\r\n const linkedNode = this.loadAstNode(description);\r\n if (linkedNode) {\r\n return { node: linkedNode, descr: description };\r\n }\r\n else {\r\n return {\r\n descr: description,\r\n error:\r\n this.createLinkingError(refInfo, description)\r\n };\r\n }\r\n } catch (err) {\r\n console.error(`An error occurred while resolving reference to '${refInfo.reference.$refText}':`, err);\r\n const errorMessage = (err as Error).message ?? String(err);\r\n return {\r\n error: {\r\n ...refInfo,\r\n message: `An error occurred while resolving reference to '${refInfo.reference.$refText}': ${errorMessage}`\r\n }\r\n };\r\n }\r\n }\r\n\r\n protected loadAstNode(nodeDescription: AstNodeDescription): AstNode | undefined {\r\n if (nodeDescription.node) {\r\n return nodeDescription.node;\r\n }\r\n const doc = this.langiumDocuments().getDocument(nodeDescription.documentUri);\r\n if (!doc) {\r\n return undefined;\r\n }\r\n return this.astNodeLocator.getAstNode(doc.parseResult.value, nodeDescription.path);\r\n }\r\n\r\n protected createLinkingError(refInfo: ReferenceInfo, targetDescription?: AstNodeDescription): LinkingError {\r\n // Check whether the document is sufficiently processed by the DocumentBuilder. If not, this is a hint for a bug\r\n // in the language implementation.\r\n const document = findRootNode(refInfo.container).$document;\r\n if (document && document.state < DocumentState.ComputedScopes) {\r\n console.warn(`Attempted reference resolution before document reached ComputedScopes state (${document.uri}).`);\r\n }\r\n const referenceType = this.reflection.getReferenceType(refInfo);\r\n return {\r\n ...refInfo,\r\n message: `Could not resolve reference to ${referenceType} named '${refInfo.reference.$refText}'.`,\r\n targetDescription\r\n };\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { AstNode, CstNode } from '../syntax-tree.js';\r\nimport { findNodeForProperty } from '../utils/grammar-utils.js';\r\n\r\nexport interface NamedAstNode extends AstNode {\r\n name: string;\r\n}\r\n\r\nexport function isNamed(node: AstNode): node is NamedAstNode {\r\n return typeof (node as NamedAstNode).name === 'string';\r\n}\r\n\r\n/**\r\n * Utility service for retrieving the `name` of an `AstNode` or the `CstNode` containing a `name`.\r\n */\r\nexport interface NameProvider {\r\n /**\r\n * Returns the `name` of a given AstNode.\r\n * @param node Specified `AstNode` whose name node shall be retrieved.\r\n */\r\n getName(node: AstNode): string | undefined;\r\n /**\r\n * Returns the `CstNode` which contains the parsed value of the `name` assignment.\r\n * @param node Specified `AstNode` whose name node shall be retrieved.\r\n */\r\n getNameNode(node: AstNode): CstNode | undefined;\r\n}\r\n\r\nexport class DefaultNameProvider implements NameProvider {\r\n getName(node: AstNode): string | undefined {\r\n if (isNamed(node)) {\r\n return node.name;\r\n }\r\n return undefined;\r\n }\r\n\r\n getNameNode(node: AstNode): CstNode | undefined {\r\n return findNodeForProperty(node.$cstNode, 'name');\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, CstNode, GenericAstNode } from '../syntax-tree.js';\r\nimport type { Stream } from '../utils/stream.js';\r\nimport type { ReferenceDescription } from '../workspace/ast-descriptions.js';\r\nimport type { AstNodeLocator } from '../workspace/ast-node-locator.js';\r\nimport type { IndexManager } from '../workspace/index-manager.js';\r\nimport type { NameProvider } from './name-provider.js';\r\nimport type { URI } from '../utils/uri-utils.js';\r\nimport { findAssignment } from '../utils/grammar-utils.js';\r\nimport { isReference } from '../syntax-tree.js';\r\nimport { getDocument } from '../utils/ast-utils.js';\r\nimport { isChildNode, toDocumentSegment } from '../utils/cst-utils.js';\r\nimport { stream } from '../utils/stream.js';\r\nimport { UriUtils } from '../utils/uri-utils.js';\r\n\r\n/**\r\n * Language-specific service for finding references and declaration of a given `CstNode`.\r\n */\r\nexport interface References {\r\n\r\n /**\r\n * If the CstNode is a reference node the target CstNode will be returned.\r\n * If the CstNode is a significant node of the CstNode this CstNode will be returned.\r\n *\r\n * @param sourceCstNode CstNode that points to a AstNode\r\n */\r\n findDeclaration(sourceCstNode: CstNode): AstNode | undefined;\r\n\r\n /**\r\n * If the CstNode is a reference node the target CstNode will be returned.\r\n * If the CstNode is a significant node of the CstNode this CstNode will be returned.\r\n *\r\n * @param sourceCstNode CstNode that points to a AstNode\r\n */\r\n findDeclarationNode(sourceCstNode: CstNode): CstNode | undefined;\r\n\r\n /**\r\n * Finds all references to the target node as references (local references) or reference descriptions.\r\n *\r\n * @param targetNode Specified target node whose references should be returned\r\n */\r\n findReferences(targetNode: AstNode, options: FindReferencesOptions): Stream<ReferenceDescription>;\r\n}\r\n\r\nexport interface FindReferencesOptions {\r\n /**\r\n * @deprecated Since v1.2.0. Please use `documentUri` instead.\r\n */\r\n onlyLocal?: boolean;\r\n /**\r\n * When set, the `findReferences` method will only return references/declarations from the specified document.\r\n */\r\n documentUri?: URI;\r\n /**\r\n * Whether the returned list of references should include the declaration.\r\n */\r\n includeDeclaration?: boolean;\r\n}\r\n\r\nexport class DefaultReferences implements References {\r\n protected readonly nameProvider: NameProvider;\r\n protected readonly index: IndexManager;\r\n protected readonly nodeLocator: AstNodeLocator;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.nameProvider = services.references.NameProvider;\r\n this.index = services.shared.workspace.IndexManager;\r\n this.nodeLocator = services.workspace.AstNodeLocator;\r\n }\r\n\r\n findDeclaration(sourceCstNode: CstNode): AstNode | undefined {\r\n if (sourceCstNode) {\r\n const assignment = findAssignment(sourceCstNode);\r\n const nodeElem = sourceCstNode.astNode;\r\n if (assignment && nodeElem) {\r\n const reference = (nodeElem as GenericAstNode)[assignment.feature];\r\n\r\n if (isReference(reference)) {\r\n return reference.ref;\r\n } else if (Array.isArray(reference)) {\r\n for (const ref of reference) {\r\n if (isReference(ref) && ref.$refNode\r\n && ref.$refNode.offset <= sourceCstNode.offset\r\n && ref.$refNode.end >= sourceCstNode.end) {\r\n return ref.ref;\r\n }\r\n }\r\n }\r\n }\r\n if (nodeElem) {\r\n const nameNode = this.nameProvider.getNameNode(nodeElem);\r\n // Only return the targeted node in case the targeted cst node is the name node or part of it\r\n if (nameNode && (nameNode === sourceCstNode || isChildNode(sourceCstNode, nameNode))) {\r\n return nodeElem;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n findDeclarationNode(sourceCstNode: CstNode): CstNode | undefined {\r\n const astNode = this.findDeclaration(sourceCstNode);\r\n if (astNode?.$cstNode) {\r\n const targetNode = this.nameProvider.getNameNode(astNode);\r\n return targetNode ?? astNode.$cstNode;\r\n }\r\n return undefined;\r\n }\r\n\r\n findReferences(targetNode: AstNode, options: FindReferencesOptions): Stream<ReferenceDescription> {\r\n const refs: ReferenceDescription[] = [];\r\n if (options.includeDeclaration) {\r\n const ref = this.getReferenceToSelf(targetNode);\r\n if (ref) {\r\n refs.push(ref);\r\n }\r\n }\r\n let indexReferences = this.index.findAllReferences(targetNode, this.nodeLocator.getAstNodePath(targetNode));\r\n if (options.documentUri) {\r\n indexReferences = indexReferences.filter(ref => UriUtils.equals(ref.sourceUri, options.documentUri));\r\n }\r\n refs.push(...indexReferences);\r\n return stream(refs);\r\n }\r\n\r\n protected getReferenceToSelf(targetNode: AstNode): ReferenceDescription | undefined {\r\n const nameNode = this.nameProvider.getNameNode(targetNode);\r\n if (nameNode) {\r\n const doc = getDocument(targetNode);\r\n const path = this.nodeLocator.getAstNodePath(targetNode);\r\n return {\r\n sourceUri: doc.uri,\r\n sourcePath: path,\r\n targetUri: doc.uri,\r\n targetPath: path,\r\n segment: toDocumentSegment(nameNode),\r\n local: true\r\n };\r\n }\r\n return undefined;\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { Stream } from './stream.js';\r\nimport { Reduction, stream } from './stream.js';\r\n\r\n/**\r\n * A multimap is a variation of a Map that has potentially multiple values for every key.\r\n */\r\nexport class MultiMap<K, V> {\r\n\r\n private map = new Map<K, V[]>();\r\n\r\n constructor()\r\n constructor(elements: Array<[K, V]>)\r\n constructor(elements?: Array<[K, V]>) {\r\n if (elements) {\r\n for (const [key, value] of elements) {\r\n this.add(key, value);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * The total number of values in the multimap.\r\n */\r\n get size(): number {\r\n return Reduction.sum(stream(this.map.values()).map(a => a.length));\r\n }\r\n\r\n /**\r\n * Clear all entries in the multimap.\r\n */\r\n clear(): void {\r\n this.map.clear();\r\n }\r\n\r\n /**\r\n * Operates differently depending on whether a `value` is given:\r\n * * With a value, this method deletes the specific key / value pair from the multimap.\r\n * * Without a value, all values associated with the given key are deleted.\r\n *\r\n * @returns `true` if a value existed and has been removed, or `false` if the specified\r\n * key / value does not exist.\r\n */\r\n delete(key: K, value?: V): boolean {\r\n if (value === undefined) {\r\n return this.map.delete(key);\r\n } else {\r\n const values = this.map.get(key);\r\n if (values) {\r\n const index = values.indexOf(value);\r\n if (index >= 0) {\r\n if (values.length === 1) {\r\n this.map.delete(key);\r\n } else {\r\n values.splice(index, 1);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Returns an array of all values associated with the given key. If no value exists,\r\n * an empty array is returned.\r\n *\r\n * _Note:_ The returned array is assumed not to be modified. Use the `set` method to add a\r\n * value and `delete` to remove a value from the multimap.\r\n */\r\n get(key: K): readonly V[] {\r\n return this.map.get(key) ?? [];\r\n }\r\n\r\n /**\r\n * Operates differently depending on whether a `value` is given:\r\n * * With a value, this method returns `true` if the specific key / value pair is present in the multimap.\r\n * * Without a value, this method returns `true` if the given key is present in the multimap.\r\n */\r\n has(key: K, value?: V): boolean {\r\n if (value === undefined) {\r\n return this.map.has(key);\r\n } else {\r\n const values = this.map.get(key);\r\n if (values) {\r\n return values.indexOf(value) >= 0;\r\n }\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Add the given key / value pair to the multimap.\r\n */\r\n add(key: K, value: V): this {\r\n if (this.map.has(key)) {\r\n this.map.get(key)!.push(value);\r\n } else {\r\n this.map.set(key, [value]);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Add the given set of key / value pairs to the multimap.\r\n */\r\n addAll(key: K, values: Iterable<V>): this {\r\n if (this.map.has(key)) {\r\n this.map.get(key)!.push(...values);\r\n } else {\r\n this.map.set(key, Array.from(values));\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Invokes the given callback function for every key / value pair in the multimap.\r\n */\r\n forEach(callbackfn: (value: V, key: K, map: this) => void): void {\r\n this.map.forEach((array, key) =>\r\n array.forEach(value => callbackfn(value, key, this))\r\n );\r\n }\r\n\r\n /**\r\n * Returns an iterator of key, value pairs for every entry in the map.\r\n */\r\n [Symbol.iterator](): Iterator<[K, V]> {\r\n return this.entries().iterator();\r\n }\r\n\r\n /**\r\n * Returns a stream of key, value pairs for every entry in the map.\r\n */\r\n entries(): Stream<[K, V]> {\r\n return stream(this.map.entries())\r\n .flatMap(([key, array]) => array.map(value => [key, value] as [K, V]));\r\n }\r\n\r\n /**\r\n * Returns a stream of keys in the map.\r\n */\r\n keys(): Stream<K> {\r\n return stream(this.map.keys());\r\n }\r\n\r\n /**\r\n * Returns a stream of values in the map.\r\n */\r\n values(): Stream<V> {\r\n return stream(this.map.values()).flat();\r\n }\r\n\r\n /**\r\n * Returns a stream of key, value set pairs for every key in the map.\r\n */\r\n entriesGroupedByKey(): Stream<[K, V[]]> {\r\n return stream(this.map.entries());\r\n }\r\n\r\n}\r\n\r\nexport class BiMap<K, V> {\r\n\r\n private map = new Map<K, V>();\r\n private inverse = new Map<V, K>();\r\n\r\n get size(): number {\r\n return this.map.size;\r\n }\r\n\r\n constructor()\r\n constructor(elements: Array<[K, V]>)\r\n constructor(elements?: Array<[K, V]>) {\r\n if (elements) {\r\n for (const [key, value] of elements) {\r\n this.set(key, value);\r\n }\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.map.clear();\r\n this.inverse.clear();\r\n }\r\n\r\n set(key: K, value: V): this {\r\n this.map.set(key, value);\r\n this.inverse.set(value, key);\r\n return this;\r\n }\r\n\r\n get(key: K): V | undefined {\r\n return this.map.get(key);\r\n }\r\n\r\n getKey(value: V): K | undefined {\r\n return this.inverse.get(value);\r\n }\r\n\r\n delete(key: K): boolean {\r\n const value = this.map.get(key);\r\n if (value !== undefined) {\r\n this.map.delete(key);\r\n this.inverse.delete(value);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021-2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, AstNodeDescription } from '../syntax-tree.js';\r\nimport type { AstNodeDescriptionProvider } from '../workspace/ast-descriptions.js';\r\nimport type { LangiumDocument, PrecomputedScopes } from '../workspace/documents.js';\r\nimport type { NameProvider } from './name-provider.js';\r\nimport { CancellationToken } from '../utils/cancellation.js';\r\nimport { streamAllContents, streamContents } from '../utils/ast-utils.js';\r\nimport { MultiMap } from '../utils/collections.js';\r\nimport { interruptAndCheck } from '../utils/promise-utils.js';\r\n\r\n/**\r\n * Language-specific service for precomputing global and local scopes. The service methods are executed\r\n * as the first and second phase in the `DocumentBuilder`.\r\n */\r\nexport interface ScopeComputation {\r\n\r\n /**\r\n * Creates descriptions of all AST nodes that shall be exported into the _global_ scope from the given\r\n * document. These descriptions are gathered by the `IndexManager` and stored in the global index so\r\n * they can be referenced from other documents.\r\n *\r\n * _Note:_ You should not resolve any cross-references in this service method. Cross-reference resolution\r\n * depends on the scope computation phase to be completed (`computeScope` method), which runs after the\r\n * initial indexing where this method is used.\r\n *\r\n * @param document The document from which to gather exported AST nodes.\r\n * @param cancelToken Indicates when to cancel the current operation.\r\n * @throws `OperationCanceled` if a user action occurs during execution\r\n */\r\n computeExports(document: LangiumDocument, cancelToken?: CancellationToken): Promise<AstNodeDescription[]>;\r\n\r\n /**\r\n * Precomputes the _local_ scopes for a document, which are necessary for the default way of\r\n * resolving references to symbols in the same document. The result is a multimap assigning a\r\n * set of AST node descriptions to every level of the AST. These data are used by the `ScopeProvider`\r\n * service to determine which target nodes are visible in the context of a specific cross-reference.\r\n *\r\n * _Note:_ You should not resolve any cross-references in this service method. Cross-reference\r\n * resolution depends on the scope computation phase to be completed.\r\n *\r\n * @param document The document in which to compute scopes.\r\n * @param cancelToken Indicates when to cancel the current operation.\r\n * @throws `OperationCanceled` if a user action occurs during execution\r\n */\r\n computeLocalScopes(document: LangiumDocument, cancelToken?: CancellationToken): Promise<PrecomputedScopes>;\r\n\r\n}\r\n\r\n/**\r\n * The default scope computation creates and collectes descriptions of the AST nodes to be exported into the\r\n * _global_ scope from the given document. By default those are the document's root AST node and its directly\r\n * contained child nodes.\r\n *\r\n * Besides, it gathers all AST nodes that have a name (according to the `NameProvider` service) and includes them\r\n * in the local scope of their particular container nodes. As a result, for every cross-reference in the AST,\r\n * target elements from the same level (siblings) and further up towards the root (parents and siblings of parents)\r\n * are visible. Elements being nested inside lower levels (children, children of siblings and parents' siblings)\r\n * are _invisible_ by default, but that can be changed by customizing this service.\r\n */\r\nexport class DefaultScopeComputation implements ScopeComputation {\r\n\r\n protected readonly nameProvider: NameProvider;\r\n protected readonly descriptions: AstNodeDescriptionProvider;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.nameProvider = services.references.NameProvider;\r\n this.descriptions = services.workspace.AstNodeDescriptionProvider;\r\n }\r\n\r\n async computeExports(document: LangiumDocument, cancelToken = CancellationToken.None): Promise<AstNodeDescription[]> {\r\n return this.computeExportsForNode(document.parseResult.value, document, undefined, cancelToken);\r\n }\r\n\r\n /**\r\n * Creates {@link AstNodeDescription AstNodeDescriptions} for the given {@link AstNode parentNode} and its children.\r\n * The list of children to be considered is determined by the function parameter {@link children}.\r\n * By default only the direct children of {@link parentNode} are visited, nested nodes are not exported.\r\n *\r\n * @param parentNode AST node to be exported, i.e., of which an {@link AstNodeDescription} shall be added to the returned list.\r\n * @param document The document containing the AST node to be exported.\r\n * @param children A function called with {@link parentNode} as single argument and returning an {@link Iterable} supplying the children to be visited, which must be directly or transitively contained in {@link parentNode}.\r\n * @param cancelToken Indicates when to cancel the current operation.\r\n * @throws `OperationCancelled` if a user action occurs during execution.\r\n * @returns A list of {@link AstNodeDescription AstNodeDescriptions} to be published to index.\r\n */\r\n async computeExportsForNode(parentNode: AstNode, document: LangiumDocument<AstNode>, children: (root: AstNode) => Iterable<AstNode> = streamContents, cancelToken: CancellationToken = CancellationToken.None): Promise<AstNodeDescription[]> {\r\n const exports: AstNodeDescription[] = [];\r\n\r\n this.exportNode(parentNode, exports, document);\r\n for (const node of children(parentNode)) {\r\n await interruptAndCheck(cancelToken);\r\n this.exportNode(node, exports, document);\r\n }\r\n return exports;\r\n }\r\n\r\n /**\r\n * Add a single node to the list of exports if it has a name. Override this method to change how\r\n * symbols are exported, e.g. by modifying their exported name.\r\n */\r\n protected exportNode(node: AstNode, exports: AstNodeDescription[], document: LangiumDocument): void {\r\n const name = this.nameProvider.getName(node);\r\n if (name) {\r\n exports.push(this.descriptions.createDescription(node, name, document));\r\n }\r\n }\r\n\r\n async computeLocalScopes(document: LangiumDocument, cancelToken = CancellationToken.None): Promise<PrecomputedScopes> {\r\n const rootNode = document.parseResult.value;\r\n const scopes = new MultiMap<AstNode, AstNodeDescription>();\r\n // Here we navigate the full AST - local scopes shall be available in the whole document\r\n for (const node of streamAllContents(rootNode)) {\r\n await interruptAndCheck(cancelToken);\r\n this.processNode(node, document, scopes);\r\n }\r\n return scopes;\r\n }\r\n\r\n /**\r\n * Process a single node during scopes computation. The default implementation makes the node visible\r\n * in the subtree of its container (if the node has a name). Override this method to change this,\r\n * e.g. by increasing the visibility to a higher level in the AST.\r\n */\r\n protected processNode(node: AstNode, document: LangiumDocument, scopes: PrecomputedScopes): void {\r\n const container = node.$container;\r\n if (container) {\r\n const name = this.nameProvider.getName(node);\r\n if (name) {\r\n scopes.add(container, this.descriptions.createDescription(node, name, document));\r\n }\r\n }\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { AstNodeDescription } from '../syntax-tree.js';\r\nimport type { Stream } from '../utils/stream.js';\r\nimport { EMPTY_STREAM, stream } from '../utils/stream.js';\r\n\r\n/**\r\n * A scope describes what target elements are visible from a specific cross-reference context.\r\n */\r\nexport interface Scope {\r\n\r\n /**\r\n * Find a target element matching the given name. If no element is found, `undefined` is returned.\r\n * If multiple matching elements are present, the selection of the returned element should be done\r\n * according to the semantics of your language. Usually it is the element that is most closely defined.\r\n *\r\n * @param name Name of the cross-reference target as it appears in the source text.\r\n */\r\n getElement(name: string): AstNodeDescription | undefined;\r\n\r\n /**\r\n * Create a stream of all elements in the scope. This is used to compute completion proposals to be\r\n * shown in the editor.\r\n */\r\n getAllElements(): Stream<AstNodeDescription>;\r\n\r\n}\r\n\r\nexport interface ScopeOptions {\r\n caseInsensitive?: boolean;\r\n}\r\n\r\n/**\r\n * The default scope implementation is based on a `Stream`. It has an optional _outer scope_ describing\r\n * the next level of elements, which are queried when a target element is not found in the stream provided\r\n * to this scope.\r\n */\r\nexport class StreamScope implements Scope {\r\n readonly elements: Stream<AstNodeDescription>;\r\n readonly outerScope?: Scope;\r\n readonly caseInsensitive: boolean;\r\n\r\n constructor(elements: Stream<AstNodeDescription>, outerScope?: Scope, options?: ScopeOptions) {\r\n this.elements = elements;\r\n this.outerScope = outerScope;\r\n this.caseInsensitive = options?.caseInsensitive ?? false;\r\n }\r\n\r\n getAllElements(): Stream<AstNodeDescription> {\r\n if (this.outerScope) {\r\n return this.elements.concat(this.outerScope.getAllElements());\r\n } else {\r\n return this.elements;\r\n }\r\n }\r\n\r\n getElement(name: string): AstNodeDescription | undefined {\r\n const local = this.caseInsensitive\r\n ? this.elements.find(e => e.name.toLowerCase() === name.toLowerCase())\r\n : this.elements.find(e => e.name === name);\r\n if (local) {\r\n return local;\r\n }\r\n if (this.outerScope) {\r\n return this.outerScope.getElement(name);\r\n }\r\n return undefined;\r\n }\r\n}\r\n\r\nexport class MapScope implements Scope {\r\n readonly elements: Map<string, AstNodeDescription>;\r\n readonly outerScope?: Scope;\r\n readonly caseInsensitive: boolean;\r\n\r\n constructor(elements: Iterable<AstNodeDescription>, outerScope?: Scope, options?: ScopeOptions) {\r\n this.elements = new Map();\r\n this.caseInsensitive = options?.caseInsensitive ?? false;\r\n for (const element of elements) {\r\n const name = this.caseInsensitive\r\n ? element.name.toLowerCase()\r\n : element.name;\r\n this.elements.set(name, element);\r\n }\r\n this.outerScope = outerScope;\r\n }\r\n\r\n getElement(name: string): AstNodeDescription | undefined {\r\n const localName = this.caseInsensitive ? name.toLowerCase() : name;\r\n const local = this.elements.get(localName);\r\n if (local) {\r\n return local;\r\n }\r\n if (this.outerScope) {\r\n return this.outerScope.getElement(name);\r\n }\r\n return undefined;\r\n }\r\n\r\n getAllElements(): Stream<AstNodeDescription> {\r\n let elementStream = stream(this.elements.values());\r\n if (this.outerScope) {\r\n elementStream = elementStream.concat(this.outerScope.getAllElements());\r\n }\r\n return elementStream;\r\n }\r\n\r\n}\r\n\r\nexport const EMPTY_SCOPE: Scope = {\r\n getElement(): undefined {\r\n return undefined;\r\n },\r\n getAllElements(): Stream<AstNodeDescription> {\r\n return EMPTY_STREAM;\r\n }\r\n};\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { Disposable } from './disposable.js';\r\nimport type { URI } from './uri-utils.js';\r\nimport type { LangiumSharedCoreServices } from '../services.js';\r\nimport type { DocumentState } from '../workspace/documents.js';\r\n\r\nexport abstract class DisposableCache implements Disposable {\r\n\r\n protected toDispose: Disposable[] = [];\r\n protected isDisposed = false;\r\n\r\n onDispose(disposable: Disposable): void {\r\n this.toDispose.push(disposable);\r\n }\r\n\r\n dispose(): void {\r\n this.throwIfDisposed();\r\n this.clear();\r\n this.isDisposed = true;\r\n this.toDispose.forEach(disposable => disposable.dispose());\r\n }\r\n\r\n protected throwIfDisposed(): void {\r\n if (this.isDisposed) {\r\n throw new Error('This cache has already been disposed');\r\n }\r\n }\r\n\r\n abstract clear(): void;\r\n}\r\n\r\nexport class SimpleCache<K, V> extends DisposableCache {\r\n protected readonly cache = new Map<K, V>();\r\n\r\n has(key: K): boolean {\r\n this.throwIfDisposed();\r\n return this.cache.has(key);\r\n }\r\n\r\n set(key: K, value: V): void {\r\n this.throwIfDisposed();\r\n this.cache.set(key, value);\r\n }\r\n\r\n get(key: K): V | undefined;\r\n get(key: K, provider: () => V): V;\r\n get(key: K, provider?: () => V): V | undefined {\r\n this.throwIfDisposed();\r\n if (this.cache.has(key)) {\r\n return this.cache.get(key);\r\n } else if (provider) {\r\n const value = provider();\r\n this.cache.set(key, value);\r\n return value;\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n delete(key: K): boolean {\r\n this.throwIfDisposed();\r\n return this.cache.delete(key);\r\n }\r\n\r\n clear(): void {\r\n this.throwIfDisposed();\r\n this.cache.clear();\r\n }\r\n}\r\n\r\nexport class ContextCache<Context, Key, Value, ContextKey = Context> extends DisposableCache {\r\n\r\n private readonly cache = new Map<ContextKey | Context, Map<Key, Value>>();\r\n private readonly converter: (input: Context) => ContextKey | Context;\r\n\r\n constructor(converter?: (input: Context) => ContextKey) {\r\n super();\r\n this.converter = converter ?? (value => value);\r\n }\r\n\r\n has(contextKey: Context, key: Key): boolean {\r\n this.throwIfDisposed();\r\n return this.cacheForContext(contextKey).has(key);\r\n }\r\n\r\n set(contextKey: Context, key: Key, value: Value): void {\r\n this.throwIfDisposed();\r\n this.cacheForContext(contextKey).set(key, value);\r\n }\r\n\r\n get(contextKey: Context, key: Key): Value | undefined;\r\n get(contextKey: Context, key: Key, provider: () => Value): Value;\r\n get(contextKey: Context, key: Key, provider?: () => Value): Value | undefined {\r\n this.throwIfDisposed();\r\n const contextCache = this.cacheForContext(contextKey);\r\n if (contextCache.has(key)) {\r\n return contextCache.get(key);\r\n } else if (provider) {\r\n const value = provider();\r\n contextCache.set(key, value);\r\n return value;\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n delete(contextKey: Context, key: Key): boolean {\r\n this.throwIfDisposed();\r\n return this.cacheForContext(contextKey).delete(key);\r\n }\r\n\r\n clear(): void;\r\n clear(contextKey: Context): void;\r\n clear(contextKey?: Context): void {\r\n this.throwIfDisposed();\r\n if (contextKey) {\r\n const mapKey = this.converter(contextKey);\r\n this.cache.delete(mapKey);\r\n } else {\r\n this.cache.clear();\r\n }\r\n }\r\n\r\n protected cacheForContext(contextKey: Context): Map<Key, Value> {\r\n const mapKey = this.converter(contextKey);\r\n let documentCache = this.cache.get(mapKey);\r\n if (!documentCache) {\r\n documentCache = new Map();\r\n this.cache.set(mapKey, documentCache);\r\n }\r\n return documentCache;\r\n }\r\n}\r\n\r\n/**\r\n * Every key/value pair in this cache is scoped to a document.\r\n * If this document is changed or deleted, all associated key/value pairs are deleted.\r\n */\r\nexport class DocumentCache<K, V> extends ContextCache<URI | string, K, V, string> {\r\n\r\n /**\r\n * Creates a new document cache.\r\n *\r\n * @param sharedServices Service container instance to hook into document lifecycle events.\r\n * @param state Optional document state on which the cache should evict.\r\n * If not provided, the cache will evict on `DocumentBuilder#onUpdate`.\r\n * *Deleted* documents are considered in both cases.\r\n *\r\n * Providing a state here will use `DocumentBuilder#onDocumentPhase` instead,\r\n * which triggers on all documents that have been affected by this change, assuming that the\r\n * state is `DocumentState.Linked` or a later state.\r\n */\r\n constructor(sharedServices: LangiumSharedCoreServices, state?: DocumentState) {\r\n super(uri => uri.toString());\r\n if (state) {\r\n this.toDispose.push(sharedServices.workspace.DocumentBuilder.onDocumentPhase(state, document => {\r\n this.clear(document.uri.toString());\r\n }));\r\n this.toDispose.push(sharedServices.workspace.DocumentBuilder.onUpdate((_changed, deleted) => {\r\n for (const uri of deleted) { // react only on deleted documents\r\n this.clear(uri);\r\n }\r\n }));\r\n } else {\r\n this.toDispose.push(sharedServices.workspace.DocumentBuilder.onUpdate((changed, deleted) => {\r\n const allUris = changed.concat(deleted); // react on both changed and deleted documents\r\n for (const uri of allUris) {\r\n this.clear(uri);\r\n }\r\n }));\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Every key/value pair in this cache is scoped to the whole workspace.\r\n * If any document in the workspace is added, changed or deleted, the whole cache is evicted.\r\n */\r\nexport class WorkspaceCache<K, V> extends SimpleCache<K, V> {\r\n\r\n /**\r\n * Creates a new workspace cache.\r\n *\r\n * @param sharedServices Service container instance to hook into document lifecycle events.\r\n * @param state Optional document state on which the cache should evict.\r\n * If not provided, the cache will evict on `DocumentBuilder#onUpdate`.\r\n * *Deleted* documents are considered in both cases.\r\n */\r\n constructor(sharedServices: LangiumSharedCoreServices, state?: DocumentState) {\r\n super();\r\n if (state) {\r\n this.toDispose.push(sharedServices.workspace.DocumentBuilder.onBuildPhase(state, () => {\r\n this.clear();\r\n }));\r\n this.toDispose.push(sharedServices.workspace.DocumentBuilder.onUpdate((_changed, deleted) => {\r\n if (deleted.length > 0) { // react only on deleted documents\r\n this.clear();\r\n }\r\n }));\r\n } else {\r\n this.toDispose.push(sharedServices.workspace.DocumentBuilder.onUpdate(() => { // react on both changed and deleted documents\r\n this.clear();\r\n }));\r\n }\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021-2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, AstNodeDescription, AstReflection, ReferenceInfo } from '../syntax-tree.js';\r\nimport type { Stream } from '../utils/stream.js';\r\nimport type { AstNodeDescriptionProvider } from '../workspace/ast-descriptions.js';\r\nimport type { IndexManager } from '../workspace/index-manager.js';\r\nimport type { NameProvider } from './name-provider.js';\r\nimport type { Scope, ScopeOptions} from './scope.js';\r\nimport { MapScope, StreamScope } from './scope.js';\r\nimport { getDocument } from '../utils/ast-utils.js';\r\nimport { stream } from '../utils/stream.js';\r\nimport { WorkspaceCache } from '../utils/caching.js';\r\n\r\n/**\r\n * Language-specific service for determining the scope of target elements visible in a specific cross-reference context.\r\n */\r\nexport interface ScopeProvider {\r\n\r\n /**\r\n * Return a scope describing what elements are visible for the given AST node and cross-reference\r\n * identifier.\r\n *\r\n * @param context Information about the reference for which a scope is requested.\r\n */\r\n getScope(context: ReferenceInfo): Scope;\r\n\r\n}\r\n\r\nexport class DefaultScopeProvider implements ScopeProvider {\r\n\r\n protected readonly reflection: AstReflection;\r\n protected readonly nameProvider: NameProvider;\r\n protected readonly descriptions: AstNodeDescriptionProvider;\r\n protected readonly indexManager: IndexManager;\r\n\r\n protected readonly globalScopeCache: WorkspaceCache<string, Scope>;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.reflection = services.shared.AstReflection;\r\n this.nameProvider = services.references.NameProvider;\r\n this.descriptions = services.workspace.AstNodeDescriptionProvider;\r\n this.indexManager = services.shared.workspace.IndexManager;\r\n this.globalScopeCache = new WorkspaceCache<string, Scope>(services.shared);\r\n }\r\n\r\n getScope(context: ReferenceInfo): Scope {\r\n const scopes: Array<Stream<AstNodeDescription>> = [];\r\n const referenceType = this.reflection.getReferenceType(context);\r\n\r\n const precomputed = getDocument(context.container).precomputedScopes;\r\n if (precomputed) {\r\n let currentNode: AstNode | undefined = context.container;\r\n do {\r\n const allDescriptions = precomputed.get(currentNode);\r\n if (allDescriptions.length > 0) {\r\n scopes.push(stream(allDescriptions).filter(\r\n desc => this.reflection.isSubtype(desc.type, referenceType)));\r\n }\r\n currentNode = currentNode.$container;\r\n } while (currentNode);\r\n }\r\n\r\n let result: Scope = this.getGlobalScope(referenceType, context);\r\n for (let i = scopes.length - 1; i >= 0; i--) {\r\n result = this.createScope(scopes[i], result);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Create a scope for the given collection of AST node descriptions.\r\n */\r\n protected createScope(elements: Iterable<AstNodeDescription>, outerScope?: Scope, options?: ScopeOptions): Scope {\r\n return new StreamScope(stream(elements), outerScope, options);\r\n }\r\n\r\n /**\r\n * Create a scope for the given collection of AST nodes, which need to be transformed into respective\r\n * descriptions first. This is done using the `NameProvider` and `AstNodeDescriptionProvider` services.\r\n */\r\n protected createScopeForNodes(elements: Iterable<AstNode>, outerScope?: Scope, options?: ScopeOptions): Scope {\r\n const s = stream(elements).map(e => {\r\n const name = this.nameProvider.getName(e);\r\n if (name) {\r\n return this.descriptions.createDescription(e, name);\r\n }\r\n return undefined;\r\n }).nonNullable();\r\n return new StreamScope(s, outerScope, options);\r\n }\r\n\r\n /**\r\n * Create a global scope filtered for the given reference type.\r\n */\r\n protected getGlobalScope(referenceType: string, _context: ReferenceInfo): Scope {\r\n return this.globalScopeCache.get(referenceType, () => new MapScope(this.indexManager.allElements(referenceType)));\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { URI } from 'vscode-uri';\r\nimport type { CommentProvider } from '../documentation/comment-provider.js';\r\nimport type { NameProvider } from '../references/name-provider.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, CstNode, GenericAstNode, Mutable, Reference } from '../syntax-tree.js';\r\nimport { isAstNode, isReference } from '../syntax-tree.js';\r\nimport { getDocument } from '../utils/ast-utils.js';\r\nimport { findNodesForProperty } from '../utils/grammar-utils.js';\r\nimport type { AstNodeLocator } from '../workspace/ast-node-locator.js';\r\nimport type { DocumentSegment, LangiumDocument, LangiumDocuments } from '../workspace/documents.js';\r\n\r\nexport interface JsonSerializeOptions {\r\n /** The space parameter for `JSON.stringify`, controlling whether and how to pretty-print the output. */\r\n space?: string | number;\r\n /** Whether to include the `$refText` property for references (the name used to identify the target node). */\r\n refText?: boolean;\r\n /** Whether to include the `$sourceText` property, which holds the full source text from which an AST node was parsed. */\r\n sourceText?: boolean;\r\n /** Whether to include the `$textRegion` property, which holds information to trace AST node properties to their respective source text regions. */\r\n textRegions?: boolean;\r\n /** Whether to include the `$comment` property, which holds comments according to the CommentProvider service. */\r\n comments?: boolean;\r\n /** The replacer parameter for `JSON.stringify`; the default replacer given as parameter should be used to apply basic replacements. */\r\n replacer?: (key: string, value: unknown, defaultReplacer: (key: string, value: unknown) => unknown) => unknown\r\n /** Used to convert and serialize URIs when the target of a cross-reference is in a different document. */\r\n uriConverter?: (uri: URI, reference: Reference) => string\r\n}\r\n\r\nexport interface JsonDeserializeOptions {\r\n /** Used to parse and convert URIs when the target of a cross-reference is in a different document. */\r\n uriConverter?: (uri: string) => URI\r\n}\r\n\r\n/**\r\n * {@link AstNode}s that may carry information on their definition area within the DSL text.\r\n */\r\nexport interface AstNodeWithTextRegion extends AstNode {\r\n $sourceText?: string;\r\n $textRegion?: AstNodeRegionWithAssignments;\r\n}\r\n\r\n/**\r\n * {@link AstNode}s that may carry a semantically relevant comment.\r\n */\r\nexport interface AstNodeWithComment extends AstNode {\r\n $comment?: string;\r\n}\r\n\r\nexport function isAstNodeWithComment(node: AstNode): node is AstNodeWithComment {\r\n return typeof (node as AstNodeWithComment).$comment === 'string';\r\n}\r\n\r\n/**\r\n * A {@link DocumentSegment} representing the definition area of an AstNode within the DSL text.\r\n * Usually contains text region information on all assigned property values of the AstNode,\r\n * and may contain the defining file's URI as string.\r\n */\r\nexport interface AstNodeRegionWithAssignments extends DocumentSegment {\r\n /**\r\n * A record containing an entry for each assigned property of the AstNode.\r\n * The key is equal to the property name and the value is an array of the property values'\r\n * text regions, regardless of whether the property is a single value or list property.\r\n */\r\n assignments?: Record<string, DocumentSegment[]>;\r\n /**\r\n * The AstNode defining file's URI as string\r\n */\r\n documentURI?: string;\r\n}\r\n\r\n/**\r\n * Utility service for transforming an `AstNode` into a JSON string and vice versa.\r\n */\r\nexport interface JsonSerializer {\r\n /**\r\n * Serialize an `AstNode` into a JSON `string`.\r\n * @param node The `AstNode` to be serialized.\r\n * @param options Serialization options\r\n */\r\n serialize(node: AstNode, options?: JsonSerializeOptions): string;\r\n /**\r\n * Deserialize (parse) a JSON `string` into an `AstNode`.\r\n */\r\n deserialize<T extends AstNode = AstNode>(content: string, options?: JsonDeserializeOptions): T;\r\n}\r\n\r\n/**\r\n * A cross-reference in the serialized JSON representation of an AstNode.\r\n */\r\ninterface IntermediateReference {\r\n /** URI pointing to the target element. This is either `#${path}` if the target is in the same document, or `${documentURI}#${path}` otherwise. */\r\n $ref?: string\r\n /** The actual text used to look up the reference target in the surrounding scope. */\r\n $refText?: string\r\n /** If any problem occurred while resolving the reference, it is described by this property. */\r\n $error?: string\r\n}\r\n\r\nfunction isIntermediateReference(obj: unknown): obj is IntermediateReference {\r\n return typeof obj === 'object' && !!obj && ('$ref' in obj || '$error' in obj);\r\n}\r\n\r\nexport class DefaultJsonSerializer implements JsonSerializer {\r\n\r\n /** The set of AstNode properties to be ignored by the serializer. */\r\n ignoreProperties = new Set(['$container', '$containerProperty', '$containerIndex', '$document', '$cstNode']);\r\n\r\n /** The document that is currently processed by the serializer; this is used by the replacer function. */\r\n protected currentDocument: LangiumDocument | undefined;\r\n\r\n protected readonly langiumDocuments: LangiumDocuments;\r\n protected readonly astNodeLocator: AstNodeLocator;\r\n protected readonly nameProvider: NameProvider;\r\n protected readonly commentProvider: CommentProvider;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.langiumDocuments = services.shared.workspace.LangiumDocuments;\r\n this.astNodeLocator = services.workspace.AstNodeLocator;\r\n this.nameProvider = services.references.NameProvider;\r\n this.commentProvider = services.documentation.CommentProvider;\r\n }\r\n\r\n serialize(node: AstNode, options?: JsonSerializeOptions): string {\r\n const serializeOptions = options ?? {};\r\n const specificReplacer = options?.replacer;\r\n const defaultReplacer = (key: string, value: unknown) => this.replacer(key, value, serializeOptions);\r\n const replacer = specificReplacer ? (key: string, value: unknown) => specificReplacer(key, value, defaultReplacer) : defaultReplacer;\r\n\r\n try {\r\n this.currentDocument = getDocument(node);\r\n return JSON.stringify(node, replacer, options?.space);\r\n } finally {\r\n this.currentDocument = undefined;\r\n }\r\n }\r\n\r\n deserialize<T extends AstNode = AstNode>(content: string, options?: JsonDeserializeOptions): T {\r\n const deserializeOptions = options ?? {};\r\n const root = JSON.parse(content);\r\n this.linkNode(root, root, deserializeOptions);\r\n return root;\r\n }\r\n\r\n protected replacer(key: string, value: unknown, { refText, sourceText, textRegions, comments, uriConverter }: JsonSerializeOptions): unknown {\r\n if (this.ignoreProperties.has(key)) {\r\n return undefined;\r\n } else if (isReference(value)) {\r\n const refValue = value.ref;\r\n const $refText = refText ? value.$refText : undefined;\r\n if (refValue) {\r\n const targetDocument = getDocument(refValue);\r\n let targetUri = '';\r\n if (this.currentDocument && this.currentDocument !== targetDocument) {\r\n if (uriConverter) {\r\n targetUri = uriConverter(targetDocument.uri, value);\r\n } else {\r\n targetUri = targetDocument.uri.toString();\r\n }\r\n }\r\n const targetPath = this.astNodeLocator.getAstNodePath(refValue);\r\n return {\r\n $ref: `${targetUri}#${targetPath}`,\r\n $refText\r\n } satisfies IntermediateReference;\r\n } else {\r\n return {\r\n $error: value.error?.message ?? 'Could not resolve reference',\r\n $refText\r\n } satisfies IntermediateReference;\r\n }\r\n } else if (isAstNode(value)) {\r\n let astNode: AstNodeWithTextRegion | undefined = undefined;\r\n if (textRegions) {\r\n astNode = this.addAstNodeRegionWithAssignmentsTo({ ...value });\r\n if ((!key || value.$document) && astNode?.$textRegion) {\r\n // The document URI is added to the root node of the resulting JSON tree\r\n astNode.$textRegion.documentURI = this.currentDocument?.uri.toString();\r\n }\r\n }\r\n if (sourceText && !key) {\r\n astNode ??= { ...value };\r\n astNode.$sourceText = value.$cstNode?.text;\r\n }\r\n if (comments) {\r\n astNode ??= { ...value };\r\n const comment = this.commentProvider.getComment(value);\r\n if (comment) {\r\n (astNode as AstNodeWithComment).$comment = comment.replace(/\\r/g, '');\r\n }\r\n }\r\n return astNode ?? value;\r\n } else {\r\n return value;\r\n }\r\n }\r\n\r\n protected addAstNodeRegionWithAssignmentsTo(node: AstNodeWithTextRegion) {\r\n const createDocumentSegment: (cstNode: CstNode) => AstNodeRegionWithAssignments = cstNode => <DocumentSegment>{\r\n offset: cstNode.offset,\r\n end: cstNode.end,\r\n length: cstNode.length,\r\n range: cstNode.range,\r\n };\r\n\r\n if (node.$cstNode) {\r\n const textRegion = node.$textRegion = createDocumentSegment(node.$cstNode);\r\n const assignments: Record<string, DocumentSegment[]> = textRegion.assignments = {};\r\n\r\n Object.keys(node).filter(key => !key.startsWith('$')).forEach(key => {\r\n const propertyAssignments = findNodesForProperty(node.$cstNode, key).map(createDocumentSegment);\r\n if (propertyAssignments.length !== 0) {\r\n assignments[key] = propertyAssignments;\r\n }\r\n });\r\n\r\n return node;\r\n }\r\n return undefined;\r\n }\r\n\r\n protected linkNode(node: GenericAstNode, root: AstNode, options: JsonDeserializeOptions, container?: AstNode, containerProperty?: string, containerIndex?: number) {\r\n for (const [propertyName, item] of Object.entries(node)) {\r\n if (Array.isArray(item)) {\r\n for (let index = 0; index < item.length; index++) {\r\n const element = item[index];\r\n if (isIntermediateReference(element)) {\r\n item[index] = this.reviveReference(node, propertyName, root, element, options);\r\n } else if (isAstNode(element)) {\r\n this.linkNode(element as GenericAstNode, root, options, node, propertyName, index);\r\n }\r\n }\r\n } else if (isIntermediateReference(item)) {\r\n node[propertyName] = this.reviveReference(node, propertyName, root, item, options);\r\n } else if (isAstNode(item)) {\r\n this.linkNode(item as GenericAstNode, root, options, node, propertyName);\r\n }\r\n }\r\n const mutable = node as Mutable<AstNode>;\r\n mutable.$container = container;\r\n mutable.$containerProperty = containerProperty;\r\n mutable.$containerIndex = containerIndex;\r\n }\r\n\r\n protected reviveReference(container: AstNode, property: string, root: AstNode, reference: IntermediateReference, options: JsonDeserializeOptions): Reference | undefined {\r\n let refText = reference.$refText;\r\n let error = reference.$error;\r\n if (reference.$ref) {\r\n const ref = this.getRefNode(root, reference.$ref, options.uriConverter);\r\n if (isAstNode(ref)) {\r\n if (!refText) {\r\n refText = this.nameProvider.getName(ref);\r\n }\r\n return {\r\n $refText: refText ?? '',\r\n ref\r\n };\r\n } else {\r\n error = ref;\r\n }\r\n }\r\n if (error) {\r\n const ref: Mutable<Reference> = {\r\n $refText: refText ?? ''\r\n };\r\n ref.error = {\r\n container,\r\n property,\r\n message: error,\r\n reference: ref\r\n };\r\n return ref;\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n protected getRefNode(root: AstNode, uri: string, uriConverter?: (uri: string) => URI): AstNode | string {\r\n try {\r\n const fragmentIndex = uri.indexOf('#');\r\n if (fragmentIndex === 0) {\r\n const node = this.astNodeLocator.getAstNode(root, uri.substring(1));\r\n if (!node) {\r\n return 'Could not resolve path: ' + uri;\r\n }\r\n return node;\r\n }\r\n if (fragmentIndex < 0) {\r\n const documentUri = uriConverter ? uriConverter(uri) : URI.parse(uri);\r\n const document = this.langiumDocuments.getDocument(documentUri);\r\n if (!document) {\r\n return 'Could not find document for URI: ' + uri;\r\n }\r\n return document.parseResult.value;\r\n }\r\n const documentUri = uriConverter ? uriConverter(uri.substring(0, fragmentIndex)) : URI.parse(uri.substring(0, fragmentIndex));\r\n const document = this.langiumDocuments.getDocument(documentUri);\r\n if (!document) {\r\n return 'Could not find document for URI: ' + uri;\r\n }\r\n if (fragmentIndex === uri.length - 1) {\r\n return document.parseResult.value;\r\n }\r\n const node = this.astNodeLocator.getAstNode(document.parseResult.value, uri.substring(fragmentIndex + 1));\r\n if (!node) {\r\n return 'Could not resolve URI: ' + uri;\r\n }\r\n return node;\r\n } catch (err) {\r\n return String(err);\r\n }\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices, LangiumSharedCoreServices } from './services.js';\r\nimport type { TextDocumentProvider } from './workspace/documents.js';\r\nimport { UriUtils, type URI } from './utils/uri-utils.js';\r\n\r\n/**\r\n * The service registry provides access to the language-specific {@link LangiumCoreServices} optionally including LSP-related services.\r\n * These are resolved via the URI of a text document.\r\n */\r\nexport interface ServiceRegistry {\r\n\r\n /**\r\n * Register a language via its injected services.\r\n */\r\n register(language: LangiumCoreServices): void;\r\n\r\n /**\r\n * Retrieve the language-specific services for the given URI. In case only one language is\r\n * registered, it may be used regardless of the URI format.\r\n */\r\n getServices(uri: URI): LangiumCoreServices;\r\n\r\n /**\r\n * Check whether services are available for the given URI.\r\n */\r\n hasServices(uri: URI): boolean;\r\n\r\n /**\r\n * The full set of registered language services.\r\n */\r\n readonly all: readonly LangiumCoreServices[];\r\n}\r\n\r\n/**\r\n * Generic registry for Langium services, but capable of being used with extending service sets as well (such as the lsp-complete LangiumCoreServices set)\r\n */\r\nexport class DefaultServiceRegistry implements ServiceRegistry {\r\n\r\n protected singleton?: LangiumCoreServices;\r\n protected readonly languageIdMap = new Map<string, LangiumCoreServices>();\r\n protected readonly fileExtensionMap = new Map<string, LangiumCoreServices>();\r\n\r\n /**\r\n * @deprecated Use the new `fileExtensionMap` (or `languageIdMap`) property instead.\r\n */\r\n protected get map(): Map<string, LangiumCoreServices> | undefined {\r\n return this.fileExtensionMap;\r\n }\r\n\r\n protected readonly textDocuments?: TextDocumentProvider;\r\n\r\n constructor(services?: LangiumSharedCoreServices) {\r\n this.textDocuments = services?.workspace.TextDocuments;\r\n }\r\n\r\n register(language: LangiumCoreServices): void {\r\n const data = language.LanguageMetaData;\r\n for (const ext of data.fileExtensions) {\r\n if (this.fileExtensionMap.has(ext)) {\r\n console.warn(`The file extension ${ext} is used by multiple languages. It is now assigned to '${data.languageId}'.`);\r\n }\r\n this.fileExtensionMap.set(ext, language);\r\n }\r\n this.languageIdMap.set(data.languageId, language);\r\n if (this.languageIdMap.size === 1) {\r\n this.singleton = language;\r\n } else {\r\n this.singleton = undefined;\r\n }\r\n }\r\n\r\n getServices(uri: URI): LangiumCoreServices {\r\n if (this.singleton !== undefined) {\r\n return this.singleton;\r\n }\r\n if (this.languageIdMap.size === 0) {\r\n throw new Error('The service registry is empty. Use `register` to register the services of a language.');\r\n }\r\n const languageId = this.textDocuments?.get(uri)?.languageId;\r\n if (languageId !== undefined) {\r\n const services = this.languageIdMap.get(languageId);\r\n if (services) {\r\n return services;\r\n }\r\n }\r\n const ext = UriUtils.extname(uri);\r\n const services = this.fileExtensionMap.get(ext);\r\n if (!services) {\r\n if (languageId) {\r\n throw new Error(`The service registry contains no services for the extension '${ext}' for language '${languageId}'.`);\r\n } else {\r\n throw new Error(`The service registry contains no services for the extension '${ext}'.`);\r\n }\r\n }\r\n return services;\r\n }\r\n\r\n hasServices(uri: URI): boolean {\r\n try {\r\n this.getServices(uri);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n get all(): readonly LangiumCoreServices[] {\r\n return Array.from(this.languageIdMap.values());\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { CodeDescription, DiagnosticRelatedInformation, DiagnosticTag, integer, Range } from 'vscode-languageserver-types';\r\nimport { assertUnreachable } from '../index.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, AstReflection, Properties } from '../syntax-tree.js';\r\nimport type { CancellationToken } from '../utils/cancellation.js';\r\nimport { MultiMap } from '../utils/collections.js';\r\nimport type { MaybePromise } from '../utils/promise-utils.js';\r\nimport { isOperationCancelled } from '../utils/promise-utils.js';\r\nimport type { Stream } from '../utils/stream.js';\r\nimport { stream } from '../utils/stream.js';\r\nimport type { DocumentSegment } from '../workspace/documents.js';\r\n\r\nexport type DiagnosticInfo<N extends AstNode, P extends string = Properties<N>> = {\r\n /** The AST node to which the diagnostic is attached. */\r\n node: N;\r\n /** If a property name is given, the diagnostic is restricted to the corresponding text region. */\r\n property?: P;\r\n /** If the value of a keyword is given, the diagnostic will appear at its corresponding text region */\r\n keyword?: string;\r\n /** In case of a multi-value property (array), an index can be given to select a specific element. */\r\n index?: number;\r\n /** If you want to create a diagnostic independent to any property, use the range property. */\r\n range?: Range;\r\n /** The diagnostic's code, which usually appear in the user interface. */\r\n code?: integer | string;\r\n /** An optional property to describe the error code. */\r\n codeDescription?: CodeDescription;\r\n /** Additional metadata about the diagnostic. */\r\n tags?: DiagnosticTag[];\r\n /** An array of related diagnostic information, e.g. when symbol-names within a scope collide all definitions can be marked via this property. */\r\n relatedInformation?: DiagnosticRelatedInformation[];\r\n /** A data entry field that is preserved between a `textDocument/publishDiagnostics` notification and `textDocument/codeAction` request. */\r\n data?: unknown;\r\n}\r\n\r\n/**\r\n * Shape of information commonly used in the `data` field of diagnostics.\r\n */\r\nexport interface DiagnosticData {\r\n /** Diagnostic code for identifying which code action to apply. This code is _not_ shown in the user interface. */\r\n code: string\r\n /** Specifies where to apply the code action in the form of a `DocumentSegment`. */\r\n actionSegment?: DocumentSegment\r\n /** Specifies where to apply the code action in the form of a `Range`. */\r\n actionRange?: Range\r\n}\r\n\r\n/**\r\n * Create DiagnosticData for a given diagnostic code. The result can be put into the `data` field of a DiagnosticInfo.\r\n */\r\nexport function diagnosticData(code: string): DiagnosticData {\r\n return { code };\r\n}\r\n\r\nexport type ValidationSeverity = 'error' | 'warning' | 'info' | 'hint';\r\n\r\nexport type ValidationAcceptor = <N extends AstNode>(severity: ValidationSeverity, message: string, info: DiagnosticInfo<N>) => void\r\n\r\nexport type ValidationCheck<T extends AstNode = AstNode> = (node: T, accept: ValidationAcceptor, cancelToken: CancellationToken) => MaybePromise<void>;\r\n\r\n/**\r\n * A utility type for describing functions which will be called once before or after all the AstNodes of an AST/Langium document are validated.\r\n *\r\n * The AST is represented by its root AstNode.\r\n *\r\n * The given validation acceptor helps to report some early or lately detected issues.\r\n *\r\n * The 'categories' indicate, which validation categories are executed for all the AstNodes.\r\n * This helps to tailor the preparations/tear-down logic to the actually executed checks on the nodes.\r\n *\r\n * It is recommended to support interrupts during long-running logic with 'interruptAndCheck(cancelToken)'.\r\n */\r\nexport type ValidationPreparation = (rootNode: AstNode, accept: ValidationAcceptor, categories: ValidationCategory[], cancelToken: CancellationToken) => MaybePromise<void>;\r\n\r\n/**\r\n * A utility type for associating non-primitive AST types to corresponding validation checks. For example:\r\n *\r\n * ```ts\r\n * const checks: ValidationChecks<StatemachineAstType> = {\r\n * State: validator.checkStateNameStartsWithCapital\r\n * };\r\n * ```\r\n *\r\n * If an AST type does not extend AstNode, e.g. if it describes a union of string literals, that type's name must not occur as a key in objects of type `ValidationCheck<...>`.\r\n *\r\n * @param T a type definition mapping language specific type names (keys) to the corresponding types (values)\r\n */\r\nexport type ValidationChecks<T> = {\r\n [K in keyof T]?: T[K] extends AstNode ? ValidationCheck<T[K]> | Array<ValidationCheck<T[K]>> : never\r\n} & {\r\n AstNode?: ValidationCheck<AstNode> | Array<ValidationCheck<AstNode>>;\r\n}\r\n\r\n/**\r\n * `fast` checks can be executed after every document change (i.e. as the user is typing). If a check\r\n * is too slow it can delay the response to document changes, yielding bad user experience. By marking\r\n * it as `slow`, it will be skipped for normal as-you-type validation. Then it's up to you when to\r\n * schedule these long-running checks: after the fast checks are done, or after saving a document,\r\n * or with an explicit command, etc.\r\n *\r\n * `built-in` checks are errors produced by the lexer, the parser, or the linker. They cannot be used\r\n * for custom validation checks.\r\n */\r\nexport type ValidationCategory = 'fast' | 'slow' | 'built-in'\r\n\r\nexport namespace ValidationCategory {\r\n export const all: readonly ValidationCategory[] = ['fast', 'slow', 'built-in'];\r\n}\r\n\r\ntype ValidationCheckEntry = {\r\n check: ValidationCheck\r\n category: ValidationCategory\r\n}\r\n\r\n/**\r\n * Manages a set of `ValidationCheck`s to be applied when documents are validated.\r\n */\r\nexport class ValidationRegistry {\r\n private readonly entries = new MultiMap<string, ValidationCheckEntry>();\r\n private readonly reflection: AstReflection;\r\n\r\n private entriesBefore: ValidationPreparation[] = [];\r\n private entriesAfter: ValidationPreparation[] = [];\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.reflection = services.shared.AstReflection;\r\n }\r\n\r\n /**\r\n * Register a set of validation checks. Each value in the record can be either a single validation check (i.e. a function)\r\n * or an array of validation checks.\r\n *\r\n * @param checksRecord Set of validation checks to register.\r\n * @param category Optional category for the validation checks (defaults to `'fast'`).\r\n * @param thisObj Optional object to be used as `this` when calling the validation check functions.\r\n */\r\n register<T>(checksRecord: ValidationChecks<T>, thisObj: ThisParameterType<unknown> = this, category: ValidationCategory = 'fast'): void {\r\n if (category === 'built-in') {\r\n throw new Error(\"The 'built-in' category is reserved for lexer, parser, and linker errors.\");\r\n }\r\n for (const [type, ch] of Object.entries(checksRecord)) {\r\n const callbacks = ch as ValidationCheck | ValidationCheck[];\r\n if (Array.isArray(callbacks)) {\r\n for (const check of callbacks) {\r\n const entry: ValidationCheckEntry = {\r\n check: this.wrapValidationException(check, thisObj),\r\n category\r\n };\r\n this.addEntry(type, entry);\r\n }\r\n } else if (typeof callbacks === 'function') {\r\n const entry: ValidationCheckEntry = {\r\n check: this.wrapValidationException(callbacks, thisObj),\r\n category\r\n };\r\n this.addEntry(type, entry);\r\n } else {\r\n assertUnreachable(callbacks);\r\n }\r\n }\r\n }\r\n\r\n protected wrapValidationException(check: ValidationCheck, thisObj: unknown): ValidationCheck {\r\n return async (node, accept, cancelToken) => {\r\n await this.handleException(() => check.call(thisObj, node, accept, cancelToken), 'An error occurred during validation', accept, node);\r\n };\r\n }\r\n\r\n protected async handleException(functionality: () => MaybePromise<void>, messageContext: string, accept: ValidationAcceptor, node: AstNode): Promise<void> {\r\n try {\r\n await functionality();\r\n } catch (err) {\r\n if (isOperationCancelled(err)) {\r\n throw err;\r\n }\r\n console.error(`${messageContext}:`, err);\r\n if (err instanceof Error && err.stack) {\r\n console.error(err.stack);\r\n }\r\n const messageDetails = err instanceof Error ? err.message : String(err);\r\n accept('error', `${messageContext}: ${messageDetails}`, { node });\r\n }\r\n }\r\n\r\n protected addEntry(type: string, entry: ValidationCheckEntry): void {\r\n if (type === 'AstNode') {\r\n this.entries.add('AstNode', entry);\r\n return;\r\n }\r\n for (const subtype of this.reflection.getAllSubTypes(type)) {\r\n this.entries.add(subtype, entry);\r\n }\r\n }\r\n\r\n getChecks(type: string, categories?: ValidationCategory[]): Stream<ValidationCheck> {\r\n let checks = stream(this.entries.get(type))\r\n .concat(this.entries.get('AstNode'));\r\n if (categories) {\r\n checks = checks.filter(entry => categories.includes(entry.category));\r\n }\r\n return checks.map(entry => entry.check);\r\n }\r\n\r\n /**\r\n * Register logic which will be executed once before validating all the nodes of an AST/Langium document.\r\n * This helps to prepare or initialize some information which are required or reusable for the following checks on the AstNodes.\r\n *\r\n * As an example, for validating unique fully-qualified names of nodes in the AST,\r\n * here the map for mapping names to nodes could be established.\r\n * During the usual checks on the nodes, they are put into this map with their name.\r\n *\r\n * Note that this approach makes validations stateful, which is relevant e.g. when cancelling the validation.\r\n * Therefore it is recommended to clear stored information\r\n * _before_ validating an AST to validate each AST unaffected from other ASTs\r\n * AND _after_ validating the AST to free memory by information which are no longer used.\r\n *\r\n * @param checkBefore a set-up function which will be called once before actually validating an AST\r\n * @param thisObj Optional object to be used as `this` when calling the validation check functions.\r\n */\r\n registerBeforeDocument(checkBefore: ValidationPreparation, thisObj: ThisParameterType<unknown> = this): void {\r\n this.entriesBefore.push(this.wrapPreparationException(checkBefore, 'An error occurred during set-up of the validation', thisObj));\r\n }\r\n\r\n /**\r\n * Register logic which will be executed once after validating all the nodes of an AST/Langium document.\r\n * This helps to finally evaluate information which are collected during the checks on the AstNodes.\r\n *\r\n * As an example, for validating unique fully-qualified names of nodes in the AST,\r\n * here the map with all the collected nodes and their names is checked\r\n * and validation hints are created for all nodes with the same name.\r\n *\r\n * Note that this approach makes validations stateful, which is relevant e.g. when cancelling the validation.\r\n * Therefore it is recommended to clear stored information\r\n * _before_ validating an AST to validate each AST unaffected from other ASTs\r\n * AND _after_ validating the AST to free memory by information which are no longer used.\r\n *\r\n * @param checkBefore a set-up function which will be called once before actually validating an AST\r\n * @param thisObj Optional object to be used as `this` when calling the validation check functions.\r\n */\r\n registerAfterDocument(checkAfter: ValidationPreparation, thisObj: ThisParameterType<unknown> = this): void {\r\n this.entriesAfter.push(this.wrapPreparationException(checkAfter, 'An error occurred during tear-down of the validation', thisObj));\r\n }\r\n\r\n protected wrapPreparationException(check: ValidationPreparation, messageContext: string, thisObj: unknown): ValidationPreparation {\r\n return async (rootNode, accept, categories, cancelToken) => {\r\n await this.handleException(() => check.call(thisObj, rootNode, accept, categories, cancelToken), messageContext, accept, rootNode);\r\n };\r\n }\r\n\r\n get checksBefore(): ValidationPreparation[] {\r\n return this.entriesBefore;\r\n }\r\n\r\n get checksAfter(): ValidationPreparation[] {\r\n return this.entriesAfter;\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { MismatchedTokenException } from 'chevrotain';\r\nimport type { DiagnosticSeverity, Position, Range, Diagnostic } from 'vscode-languageserver-types';\r\nimport type { LanguageMetaData } from '../languages/language-meta-data.js';\r\nimport type { ParseResult } from '../parser/langium-parser.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, CstNode } from '../syntax-tree.js';\r\nimport type { LangiumDocument } from '../workspace/documents.js';\r\nimport type { DiagnosticData, DiagnosticInfo, ValidationAcceptor, ValidationCategory, ValidationRegistry, ValidationSeverity } from './validation-registry.js';\r\nimport { CancellationToken } from '../utils/cancellation.js';\r\nimport { findNodeForKeyword, findNodeForProperty } from '../utils/grammar-utils.js';\r\nimport { streamAst } from '../utils/ast-utils.js';\r\nimport { tokenToRange } from '../utils/cst-utils.js';\r\nimport { interruptAndCheck, isOperationCancelled } from '../utils/promise-utils.js';\r\nimport { diagnosticData } from './validation-registry.js';\r\nimport type { LexingDiagnostic, LexingDiagnosticSeverity } from '../parser/token-builder.js';\r\n\r\nexport interface ValidationOptions {\r\n /**\r\n * If this is set, only the checks associated with these categories are executed; otherwise\r\n * all checks are executed. The default category if not specified to the registry is `'fast'`.\r\n */\r\n categories?: ValidationCategory[];\r\n /** If true, no further diagnostics are reported if there are lexing errors. */\r\n stopAfterLexingErrors?: boolean\r\n /** If true, no further diagnostics are reported if there are parsing errors. */\r\n stopAfterParsingErrors?: boolean\r\n /** If true, no further diagnostics are reported if there are linking errors. */\r\n stopAfterLinkingErrors?: boolean\r\n}\r\n\r\n/**\r\n * Language-specific service for validating `LangiumDocument`s.\r\n */\r\nexport interface DocumentValidator {\r\n /**\r\n * Validates the whole specified document.\r\n *\r\n * @param document specified document to validate\r\n * @param options options to control the validation process\r\n * @param cancelToken allows to cancel the current operation\r\n * @throws `OperationCanceled` if a user action occurs during execution\r\n */\r\n validateDocument(document: LangiumDocument, options?: ValidationOptions, cancelToken?: CancellationToken): Promise<Diagnostic[]>;\r\n}\r\n\r\nexport class DefaultDocumentValidator implements DocumentValidator {\r\n\r\n protected readonly validationRegistry: ValidationRegistry;\r\n protected readonly metadata: LanguageMetaData;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.validationRegistry = services.validation.ValidationRegistry;\r\n this.metadata = services.LanguageMetaData;\r\n }\r\n\r\n async validateDocument(document: LangiumDocument, options: ValidationOptions = {}, cancelToken = CancellationToken.None): Promise<Diagnostic[]> {\r\n const parseResult = document.parseResult;\r\n const diagnostics: Diagnostic[] = [];\r\n\r\n await interruptAndCheck(cancelToken);\r\n\r\n if (!options.categories || options.categories.includes('built-in')) {\r\n this.processLexingErrors(parseResult, diagnostics, options);\r\n if (options.stopAfterLexingErrors && diagnostics.some(d => d.data?.code === DocumentValidator.LexingError)) {\r\n return diagnostics;\r\n }\r\n\r\n this.processParsingErrors(parseResult, diagnostics, options);\r\n if (options.stopAfterParsingErrors && diagnostics.some(d => d.data?.code === DocumentValidator.ParsingError)) {\r\n return diagnostics;\r\n }\r\n\r\n this.processLinkingErrors(document, diagnostics, options);\r\n if (options.stopAfterLinkingErrors && diagnostics.some(d => d.data?.code === DocumentValidator.LinkingError)) {\r\n return diagnostics;\r\n }\r\n }\r\n\r\n // Process custom validations\r\n try {\r\n diagnostics.push(...await this.validateAst(parseResult.value, options, cancelToken));\r\n } catch (err) {\r\n if (isOperationCancelled(err)) {\r\n throw err;\r\n }\r\n console.error('An error occurred during validation:', err);\r\n }\r\n\r\n await interruptAndCheck(cancelToken);\r\n\r\n return diagnostics;\r\n }\r\n\r\n protected processLexingErrors(parseResult: ParseResult, diagnostics: Diagnostic[], _options: ValidationOptions): void {\r\n const lexerDiagnostics = [...parseResult.lexerErrors, ...parseResult.lexerReport?.diagnostics ?? []] as LexingDiagnostic[];\r\n for (const lexerDiagnostic of lexerDiagnostics) {\r\n const severity = lexerDiagnostic.severity ?? 'error';\r\n const diagnostic: Diagnostic = {\r\n severity: toDiagnosticSeverity(severity),\r\n range: {\r\n start: {\r\n line: lexerDiagnostic.line! - 1,\r\n character: lexerDiagnostic.column! - 1\r\n },\r\n end: {\r\n line: lexerDiagnostic.line! - 1,\r\n character: lexerDiagnostic.column! + lexerDiagnostic.length - 1\r\n }\r\n },\r\n message: lexerDiagnostic.message,\r\n data: toDiagnosticData(severity),\r\n source: this.getSource()\r\n };\r\n diagnostics.push(diagnostic);\r\n }\r\n }\r\n\r\n protected processParsingErrors(parseResult: ParseResult, diagnostics: Diagnostic[], _options: ValidationOptions): void {\r\n for (const parserError of parseResult.parserErrors) {\r\n let range: Range | undefined = undefined;\r\n // We can run into the chevrotain error recovery here\r\n // The token contained in the parser error might be automatically inserted\r\n // In this case every position value will be `NaN`\r\n if (isNaN(parserError.token.startOffset)) {\r\n // Some special parser error types contain a `previousToken`\r\n // We can simply append our diagnostic to that token\r\n if ('previousToken' in parserError) {\r\n const token = (parserError as MismatchedTokenException).previousToken;\r\n if (!isNaN(token.startOffset)) {\r\n const position: Position = { line: token.endLine! - 1, character: token.endColumn! };\r\n range = { start: position, end: position};\r\n } else {\r\n // No valid prev token. Might be empty document or containing only hidden tokens.\r\n // Point to document start\r\n const position: Position = { line: 0, character: 0 };\r\n range = { start: position, end: position};\r\n }\r\n }\r\n } else {\r\n range = tokenToRange(parserError.token);\r\n }\r\n if (range) {\r\n const diagnostic: Diagnostic = {\r\n severity: toDiagnosticSeverity('error'),\r\n range,\r\n message: parserError.message,\r\n data: diagnosticData(DocumentValidator.ParsingError),\r\n source: this.getSource()\r\n };\r\n diagnostics.push(diagnostic);\r\n }\r\n }\r\n }\r\n\r\n protected processLinkingErrors(document: LangiumDocument, diagnostics: Diagnostic[], _options: ValidationOptions): void {\r\n for (const reference of document.references) {\r\n const linkingError = reference.error;\r\n if (linkingError) {\r\n const info: DiagnosticInfo<AstNode, string> = {\r\n node: linkingError.container,\r\n property: linkingError.property,\r\n index: linkingError.index,\r\n data: {\r\n code: DocumentValidator.LinkingError,\r\n containerType: linkingError.container.$type,\r\n property: linkingError.property,\r\n refText: linkingError.reference.$refText\r\n } satisfies LinkingErrorData\r\n };\r\n diagnostics.push(this.toDiagnostic('error', linkingError.message, info));\r\n }\r\n }\r\n }\r\n\r\n protected async validateAst(rootNode: AstNode, options: ValidationOptions, cancelToken = CancellationToken.None): Promise<Diagnostic[]> {\r\n const validationItems: Diagnostic[] = [];\r\n const acceptor: ValidationAcceptor = <N extends AstNode>(severity: ValidationSeverity, message: string, info: DiagnosticInfo<N>) => {\r\n validationItems.push(this.toDiagnostic(severity, message, info));\r\n };\r\n\r\n await this.validateAstBefore(rootNode, options, acceptor, cancelToken);\r\n await this.validateAstNodes(rootNode, options, acceptor, cancelToken);\r\n await this.validateAstAfter(rootNode, options, acceptor, cancelToken);\r\n\r\n return validationItems;\r\n }\r\n\r\n protected async validateAstBefore(rootNode: AstNode, options: ValidationOptions, acceptor: ValidationAcceptor, cancelToken = CancellationToken.None): Promise<void> {\r\n const checksBefore = this.validationRegistry.checksBefore;\r\n for (const checkBefore of checksBefore) {\r\n await interruptAndCheck(cancelToken);\r\n await checkBefore(rootNode, acceptor, options.categories ?? [], cancelToken);\r\n }\r\n }\r\n\r\n protected async validateAstNodes(rootNode: AstNode, options: ValidationOptions, acceptor: ValidationAcceptor, cancelToken = CancellationToken.None): Promise<void> {\r\n await Promise.all(streamAst(rootNode).map(async node => {\r\n await interruptAndCheck(cancelToken);\r\n const checks = this.validationRegistry.getChecks(node.$type, options.categories);\r\n for (const check of checks) {\r\n await check(node, acceptor, cancelToken);\r\n }\r\n }));\r\n }\r\n\r\n protected async validateAstAfter(rootNode: AstNode, options: ValidationOptions, acceptor: ValidationAcceptor, cancelToken = CancellationToken.None): Promise<void> {\r\n const checksAfter = this.validationRegistry.checksAfter;\r\n for (const checkAfter of checksAfter) {\r\n await interruptAndCheck(cancelToken);\r\n await checkAfter(rootNode, acceptor, options.categories ?? [], cancelToken);\r\n }\r\n }\r\n\r\n protected toDiagnostic<N extends AstNode>(severity: ValidationSeverity, message: string, info: DiagnosticInfo<N, string>): Diagnostic {\r\n return {\r\n message,\r\n range: getDiagnosticRange(info),\r\n severity: toDiagnosticSeverity(severity),\r\n code: info.code,\r\n codeDescription: info.codeDescription,\r\n tags: info.tags,\r\n relatedInformation: info.relatedInformation,\r\n data: info.data,\r\n source: this.getSource()\r\n };\r\n }\r\n\r\n protected getSource(): string | undefined {\r\n return this.metadata.languageId;\r\n }\r\n}\r\n\r\nexport function getDiagnosticRange<N extends AstNode>(info: DiagnosticInfo<N, string>): Range {\r\n if (info.range) {\r\n return info.range;\r\n }\r\n let cstNode: CstNode | undefined;\r\n if (typeof info.property === 'string') {\r\n cstNode = findNodeForProperty(info.node.$cstNode, info.property, info.index);\r\n } else if (typeof info.keyword === 'string') {\r\n cstNode = findNodeForKeyword(info.node.$cstNode, info.keyword, info.index);\r\n }\r\n cstNode ??= info.node.$cstNode;\r\n if (!cstNode) {\r\n return {\r\n start: { line: 0, character: 0 },\r\n end: { line: 0, character: 0 }\r\n };\r\n }\r\n return cstNode.range;\r\n}\r\n\r\n/**\r\n * Transforms the diagnostic severity from the {@link LexingDiagnosticSeverity} format to LSP's `DiagnosticSeverity` format.\r\n *\r\n * @param severity The lexing diagnostic severity\r\n * @returns Diagnostic severity according to `vscode-languageserver-types/lib/esm/main.js#DiagnosticSeverity`\r\n */\r\nexport function toDiagnosticSeverity(severity: LexingDiagnosticSeverity): DiagnosticSeverity {\r\n switch (severity) {\r\n case 'error':\r\n return 1 satisfies typeof DiagnosticSeverity.Error;\r\n case 'warning':\r\n return 2 satisfies typeof DiagnosticSeverity.Warning;\r\n case 'info':\r\n return 3 satisfies typeof DiagnosticSeverity.Information;\r\n case 'hint':\r\n return 4 satisfies typeof DiagnosticSeverity.Hint;\r\n default:\r\n throw new Error('Invalid diagnostic severity: ' + severity);\r\n }\r\n}\r\n\r\nexport function toDiagnosticData(severity: LexingDiagnosticSeverity): DiagnosticData {\r\n switch (severity) {\r\n case 'error':\r\n return diagnosticData(DocumentValidator.LexingError);\r\n case 'warning':\r\n return diagnosticData(DocumentValidator.LexingWarning);\r\n case 'info':\r\n return diagnosticData(DocumentValidator.LexingInfo);\r\n case 'hint':\r\n return diagnosticData(DocumentValidator.LexingHint);\r\n default:\r\n throw new Error('Invalid diagnostic severity: ' + severity);\r\n }\r\n}\r\n\r\nexport namespace DocumentValidator {\r\n export const LexingError = 'lexing-error';\r\n export const LexingWarning = 'lexing-warning';\r\n export const LexingInfo = 'lexing-info';\r\n export const LexingHint = 'lexing-hint';\r\n export const ParsingError = 'parsing-error';\r\n export const LinkingError = 'linking-error';\r\n}\r\n\r\nexport interface LinkingErrorData extends DiagnosticData {\r\n containerType: string\r\n property: string\r\n refText: string\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { URI } from '../utils/uri-utils.js';\r\nimport type { NameProvider } from '../references/name-provider.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, AstNodeDescription, ReferenceInfo } from '../syntax-tree.js';\r\nimport type { AstNodeLocator } from './ast-node-locator.js';\r\nimport type { DocumentSegment, LangiumDocument } from './documents.js';\r\nimport { CancellationToken } from '../utils/cancellation.js';\r\nimport { isLinkingError } from '../syntax-tree.js';\r\nimport { getDocument, streamAst, streamReferences } from '../utils/ast-utils.js';\r\nimport { toDocumentSegment } from '../utils/cst-utils.js';\r\nimport { interruptAndCheck } from '../utils/promise-utils.js';\r\nimport { UriUtils } from '../utils/uri-utils.js';\r\n\r\n/**\r\n * Language-specific service for creating descriptions of AST nodes to be used for cross-reference resolutions.\r\n */\r\nexport interface AstNodeDescriptionProvider {\r\n\r\n /**\r\n * Create a description for the given AST node. This service method is typically used while indexing\r\n * the contents of a document and during scope computation.\r\n *\r\n * @param node An AST node.\r\n * @param name The name to be used to refer to the AST node. By default, this is determined by the\r\n * `NameProvider` service, but alternative names may be provided according to the semantics\r\n * of your language.\r\n * @param document The document containing the AST node. If omitted, it is taken from the root AST node.\r\n */\r\n createDescription(node: AstNode, name: string | undefined, document?: LangiumDocument): AstNodeDescription;\r\n\r\n}\r\n\r\nexport class DefaultAstNodeDescriptionProvider implements AstNodeDescriptionProvider {\r\n\r\n protected readonly astNodeLocator: AstNodeLocator;\r\n protected readonly nameProvider: NameProvider;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.astNodeLocator = services.workspace.AstNodeLocator;\r\n this.nameProvider = services.references.NameProvider;\r\n }\r\n\r\n createDescription(node: AstNode, name: string | undefined, document?: LangiumDocument): AstNodeDescription {\r\n const doc = document ?? getDocument(node);\r\n name ??= this.nameProvider.getName(node);\r\n const path = this.astNodeLocator.getAstNodePath(node);\r\n if (!name) {\r\n throw new Error(`Node at path ${path} has no name.`);\r\n }\r\n let nameNodeSegment: DocumentSegment | undefined;\r\n const nameSegmentGetter = () => nameNodeSegment ??= toDocumentSegment(this.nameProvider.getNameNode(node) ?? node.$cstNode);\r\n return {\r\n node,\r\n name,\r\n get nameSegment() {\r\n return nameSegmentGetter();\r\n },\r\n selectionSegment: toDocumentSegment(node.$cstNode),\r\n type: node.$type,\r\n documentUri: doc.uri,\r\n path\r\n };\r\n }\r\n\r\n}\r\n\r\n/**\r\n * Describes a cross-reference within a document or between two documents.\r\n */\r\nexport interface ReferenceDescription {\r\n /** URI of the document that holds a reference */\r\n sourceUri: URI\r\n /** Path to AstNode that holds a reference */\r\n sourcePath: string\r\n /** Target document uri */\r\n targetUri: URI\r\n /** Path to the target AstNode inside the document */\r\n targetPath: string\r\n /** Segment of the reference text. */\r\n segment: DocumentSegment\r\n /** Marks a local reference i.e. a cross reference inside a document. */\r\n local?: boolean\r\n}\r\n\r\n/**\r\n * Language-specific service to create descriptions of all cross-references in a document. These are used by the `IndexManager`\r\n * to determine which documents are affected and should be rebuilt when a document is changed.\r\n */\r\nexport interface ReferenceDescriptionProvider {\r\n /**\r\n * Create descriptions of all cross-references found in the given document. These descriptions are\r\n * gathered by the `IndexManager` and stored in the global index so they can be considered when\r\n * a document change is reported by the client.\r\n *\r\n * @param document The document in which to gather cross-references.\r\n * @param cancelToken Indicates when to cancel the current operation.\r\n * @throws `OperationCanceled` if a user action occurs during execution\r\n */\r\n createDescriptions(document: LangiumDocument, cancelToken?: CancellationToken): Promise<ReferenceDescription[]>;\r\n}\r\n\r\nexport class DefaultReferenceDescriptionProvider implements ReferenceDescriptionProvider {\r\n\r\n protected readonly nodeLocator: AstNodeLocator;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.nodeLocator = services.workspace.AstNodeLocator;\r\n }\r\n\r\n async createDescriptions(document: LangiumDocument, cancelToken = CancellationToken.None): Promise<ReferenceDescription[]> {\r\n const descr: ReferenceDescription[] = [];\r\n const rootNode = document.parseResult.value;\r\n for (const astNode of streamAst(rootNode)) {\r\n await interruptAndCheck(cancelToken);\r\n streamReferences(astNode).filter(refInfo => !isLinkingError(refInfo)).forEach(refInfo => {\r\n // TODO: Consider logging a warning or throw an exception when DocumentState is < than Linked\r\n const description = this.createDescription(refInfo);\r\n if (description) {\r\n descr.push(description);\r\n }\r\n });\r\n }\r\n return descr;\r\n }\r\n\r\n protected createDescription(refInfo: ReferenceInfo): ReferenceDescription | undefined {\r\n const targetNodeDescr = refInfo.reference.$nodeDescription;\r\n const refCstNode = refInfo.reference.$refNode;\r\n if (!targetNodeDescr || !refCstNode) {\r\n return undefined;\r\n }\r\n const docUri = getDocument(refInfo.container).uri;\r\n return {\r\n sourceUri: docUri,\r\n sourcePath: this.nodeLocator.getAstNodePath(refInfo.container),\r\n targetUri: targetNodeDescr.documentUri,\r\n targetPath: targetNodeDescr.path,\r\n segment: toDocumentSegment(refCstNode),\r\n local: UriUtils.equals(targetNodeDescr.documentUri, docUri)\r\n };\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { AstNode } from '../syntax-tree.js';\r\n\r\n/**\r\n * Language-specific service for locating an `AstNode` in a document.\r\n */\r\nexport interface AstNodeLocator {\r\n\r\n /**\r\n * Creates a path represented by a `string` that identifies an `AstNode` inside its document.\r\n * It must be possible to retrieve exactly the same `AstNode` from the document using this path.\r\n *\r\n * @param node The `AstNode` for which to create the path.\r\n * @returns a path represented by a `string` that identifies `node` inside its document.\r\n * @see AstNodeLocator.getAstNode\r\n */\r\n getAstNodePath(node: AstNode): string;\r\n\r\n /**\r\n * Locates an `AstNode` inside another node by following the given path.\r\n *\r\n * @param node Parent element.\r\n * @param path Describes how to locate the `AstNode` inside the given `node`.\r\n * @returns The `AstNode` located under the given path, or `undefined` if the path cannot be resolved.\r\n * @see AstNodeLocator.getAstNodePath\r\n */\r\n getAstNode<T extends AstNode = AstNode>(node: AstNode, path: string): T | undefined;\r\n\r\n}\r\n\r\nexport class DefaultAstNodeLocator implements AstNodeLocator {\r\n protected segmentSeparator = '/';\r\n protected indexSeparator = '@';\r\n\r\n getAstNodePath(node: AstNode): string {\r\n if (node.$container) {\r\n const containerPath = this.getAstNodePath(node.$container);\r\n const newSegment = this.getPathSegment(node);\r\n const nodePath = containerPath + this.segmentSeparator + newSegment;\r\n return nodePath;\r\n }\r\n return '';\r\n }\r\n\r\n protected getPathSegment({ $containerProperty, $containerIndex }: AstNode): string {\r\n if (!$containerProperty) {\r\n throw new Error(\"Missing '$containerProperty' in AST node.\");\r\n }\r\n if ($containerIndex !== undefined) {\r\n return $containerProperty + this.indexSeparator + $containerIndex;\r\n }\r\n return $containerProperty;\r\n }\r\n\r\n getAstNode<T extends AstNode = AstNode>(node: AstNode, path: string): T | undefined {\r\n const segments = path.split(this.segmentSeparator);\r\n return segments.reduce((previousValue, currentValue) => {\r\n if (!previousValue || currentValue.length === 0) {\r\n return previousValue;\r\n }\r\n const propertyIndex = currentValue.indexOf(this.indexSeparator);\r\n if (propertyIndex > 0) {\r\n const property = currentValue.substring(0, propertyIndex);\r\n const arrayIndex = parseInt(currentValue.substring(propertyIndex + 1));\r\n const array = (previousValue as unknown as Record<string, AstNode[]>)[property];\r\n return array?.[arrayIndex];\r\n }\r\n return (previousValue as unknown as Record<string, AstNode>)[currentValue];\r\n }, node) as T;\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2024 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\n// eslint-disable-next-line no-restricted-imports\r\nexport * from 'vscode-jsonrpc/lib/common/events.js';\r\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { Emitter } from '../utils/event.js';\r\nimport type {\r\n ConfigurationItem,\r\n DidChangeConfigurationParams,\r\n DidChangeConfigurationRegistrationOptions,\r\n Disposable,\r\n Event,\r\n InitializeParams,\r\n InitializedParams\r\n} from 'vscode-languageserver-protocol';\r\nimport type { ServiceRegistry } from '../service-registry.js';\r\nimport type { LangiumSharedCoreServices } from '../services.js';\r\nimport { Deferred } from '../utils/promise-utils.js';\r\n\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nexport interface ConfigurationProvider {\r\n\r\n /**\r\n * A promise that resolves when the configuration provider is ready to be used.\r\n */\r\n readonly ready: Promise<void>;\r\n\r\n /**\r\n * When used in a language server context, this method is called when the server receives\r\n * the `initialize` request.\r\n */\r\n initialize(params: InitializeParams): void;\r\n\r\n /**\r\n * When used in a language server context, this method is called when the server receives\r\n * the `initialized` notification.\r\n */\r\n initialized(params: ConfigurationInitializedParams): Promise<void>;\r\n\r\n /**\r\n * Returns a configuration value stored for the given language.\r\n *\r\n * @param language The language id\r\n * @param configuration Configuration name\r\n */\r\n getConfiguration(language: string, configuration: string): Promise<any>;\r\n\r\n /**\r\n * Updates the cached configurations using the `change` notification parameters.\r\n *\r\n * @param change The parameters of a change configuration notification.\r\n * `settings` property of the change object could be expressed as `Record<string, Record<string, any>>`\r\n */\r\n updateConfiguration(change: DidChangeConfigurationParams): void;\r\n\r\n /**\r\n * Get notified after a configuration section has been updated.\r\n */\r\n onConfigurationSectionUpdate(callback: ConfigurationSectionUpdateListener): Disposable\r\n}\r\n\r\nexport interface ConfigurationInitializedParams extends InitializedParams {\r\n register?: (params: DidChangeConfigurationRegistrationOptions) => void,\r\n fetchConfiguration?: (configuration: ConfigurationItem[]) => Promise<any>\r\n}\r\n\r\nexport interface ConfigurationSectionUpdate {\r\n /**\r\n * The name of the configuration section that has been updated.\r\n */\r\n section: string;\r\n\r\n /**\r\n * The updated configuration section.\r\n */\r\n configuration: any;\r\n}\r\n\r\nexport type ConfigurationSectionUpdateListener = (update: ConfigurationSectionUpdate) => void;\r\n\r\n/**\r\n * Base configuration provider for building up other configuration providers\r\n */\r\nexport class DefaultConfigurationProvider implements ConfigurationProvider {\r\n\r\n protected readonly serviceRegistry: ServiceRegistry;\r\n protected readonly _ready = new Deferred<void>();\r\n protected settings: Record<string, Record<string, any>> = {};\r\n protected workspaceConfig = false;\r\n protected onConfigurationSectionUpdateEmitter = new Emitter<ConfigurationSectionUpdate>();\r\n\r\n constructor(services: LangiumSharedCoreServices) {\r\n this.serviceRegistry = services.ServiceRegistry;\r\n }\r\n\r\n get ready(): Promise<void> {\r\n return this._ready.promise;\r\n }\r\n\r\n initialize(params: InitializeParams): void {\r\n this.workspaceConfig = params.capabilities.workspace?.configuration ?? false;\r\n }\r\n\r\n async initialized(params: ConfigurationInitializedParams): Promise<void> {\r\n if (this.workspaceConfig) {\r\n if (params.register) {\r\n // params.register(...) is a function to be provided by the calling language server for the sake of\r\n // decoupling this implementation from the concrete LSP implementations, specifically the LSP Connection\r\n\r\n const languages = this.serviceRegistry.all;\r\n params.register({\r\n // Listen to configuration changes for all languages\r\n section: languages.map(lang => this.toSectionName(lang.LanguageMetaData.languageId))\r\n });\r\n }\r\n\r\n if (params.fetchConfiguration) {\r\n // params.fetchConfiguration(...) is a function to be provided by the calling language server for the sake of\r\n // decoupling this implementation from the concrete LSP implementations, specifically the LSP Connection\r\n const configToUpdate = this.serviceRegistry.all.map(lang => <ConfigurationItem>{\r\n // Fetch the configuration changes for all languages\r\n section: this.toSectionName(lang.LanguageMetaData.languageId)\r\n });\r\n\r\n // get workspace configurations (default scope URI)\r\n const configs = await params.fetchConfiguration(configToUpdate);\r\n configToUpdate.forEach((conf, idx) => {\r\n this.updateSectionConfiguration(conf.section!, configs[idx]);\r\n });\r\n }\r\n }\r\n this._ready.resolve();\r\n }\r\n\r\n /**\r\n * Updates the cached configurations using the `change` notification parameters.\r\n *\r\n * @param change The parameters of a change configuration notification.\r\n * `settings` property of the change object could be expressed as `Record<string, Record<string, any>>`\r\n */\r\n updateConfiguration(change: DidChangeConfigurationParams): void {\r\n if (!change.settings) {\r\n return;\r\n }\r\n Object.keys(change.settings).forEach(section => {\r\n const configuration = change.settings[section];\r\n this.updateSectionConfiguration(section, configuration);\r\n this.onConfigurationSectionUpdateEmitter.fire({ section, configuration });\r\n });\r\n }\r\n\r\n protected updateSectionConfiguration(section: string, configuration: any): void {\r\n this.settings[section] = configuration;\r\n }\r\n\r\n /**\r\n * Returns a configuration value stored for the given language.\r\n *\r\n * @param language The language id\r\n * @param configuration Configuration name\r\n */\r\n async getConfiguration(language: string, configuration: string): Promise<any> {\r\n await this.ready;\r\n\r\n const sectionName = this.toSectionName(language);\r\n if (this.settings[sectionName]) {\r\n return this.settings[sectionName][configuration];\r\n }\r\n }\r\n\r\n protected toSectionName(languageId: string): string {\r\n return `${languageId}`;\r\n }\r\n\r\n get onConfigurationSectionUpdate(): Event<ConfigurationSectionUpdate> {\r\n return this.onConfigurationSectionUpdateEmitter.event;\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nexport interface Disposable {\r\n /**\r\n * Dispose this object.\r\n */\r\n dispose(): void;\r\n}\r\n\r\nexport interface AsyncDisposable {\r\n /**\r\n * Dispose this object.\r\n */\r\n dispose(): Promise<void>;\r\n}\r\n\r\nexport namespace Disposable {\r\n export function create(callback: () => Promise<void>): AsyncDisposable;\r\n export function create(callback: () => void): Disposable;\r\n export function create(callback: () => void | Promise<void>): Disposable | AsyncDisposable {\r\n return {\r\n dispose: async () => await callback()\r\n };\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { CancellationToken } from '../utils/cancellation.js';\r\nimport { Disposable } from '../utils/disposable.js';\r\nimport type { ServiceRegistry } from '../service-registry.js';\r\nimport type { LangiumSharedCoreServices } from '../services.js';\r\nimport type { AstNode } from '../syntax-tree.js';\r\nimport type { MaybePromise } from '../utils/promise-utils.js';\r\nimport type { Deferred } from '../utils/promise-utils.js';\r\nimport type { ValidationOptions } from '../validation/document-validator.js';\r\nimport type { IndexManager } from '../workspace/index-manager.js';\r\nimport type { LangiumDocument, LangiumDocuments, LangiumDocumentFactory, TextDocumentProvider } from './documents.js';\r\nimport { MultiMap } from '../utils/collections.js';\r\nimport { OperationCancelled, interruptAndCheck, isOperationCancelled } from '../utils/promise-utils.js';\r\nimport { stream } from '../utils/stream.js';\r\nimport type { URI } from '../utils/uri-utils.js';\r\nimport { ValidationCategory } from '../validation/validation-registry.js';\r\nimport { DocumentState } from './documents.js';\r\n\r\nexport interface BuildOptions {\r\n /**\r\n * Control the validation phase with this option:\r\n * - `true` enables all validation checks and forces revalidating the documents\r\n * - `false` or `undefined` disables all validation checks\r\n * - An object runs only the necessary validation checks; the `categories` property restricts this to a specific subset\r\n */\r\n validation?: boolean | ValidationOptions\r\n}\r\n\r\nexport interface DocumentBuildState {\r\n /** Whether a document has completed its last build process. */\r\n completed: boolean\r\n /** The options used for the last build process. */\r\n options: BuildOptions\r\n /** Additional information about the last build result. */\r\n result?: {\r\n validationChecks?: ValidationCategory[]\r\n }\r\n}\r\n\r\n/**\r\n * Shared-service for building and updating `LangiumDocument`s.\r\n */\r\nexport interface DocumentBuilder {\r\n\r\n /** The options used for rebuilding documents after an update. */\r\n updateBuildOptions: BuildOptions;\r\n\r\n /**\r\n * Execute all necessary build steps for the given documents.\r\n *\r\n * @param documents Set of documents to be built.\r\n * @param options Options for the document builder.\r\n * @param cancelToken Indicates when to cancel the current operation.\r\n * @throws `OperationCanceled` if a user action occurs during execution\r\n */\r\n build<T extends AstNode>(documents: Array<LangiumDocument<T>>, options?: BuildOptions, cancelToken?: CancellationToken): Promise<void>;\r\n\r\n /**\r\n * This method is called when a document change is detected. It updates the state of all\r\n * affected documents, including those with references to the changed ones, so they are rebuilt.\r\n *\r\n * @param changed URIs of changed or created documents\r\n * @param deleted URIs of deleted documents\r\n * @param cancelToken allows to cancel the current operation\r\n * @throws `OperationCancelled` if cancellation is detected during execution\r\n */\r\n update(changed: URI[], deleted: URI[], cancelToken?: CancellationToken): Promise<void>;\r\n\r\n /**\r\n * Notify the given callback when a document update was triggered, but before any document\r\n * is rebuilt. Listeners to this event should not perform any long-running task.\r\n */\r\n onUpdate(callback: DocumentUpdateListener): Disposable;\r\n\r\n /**\r\n * Notify the given callback when a set of documents has been built reaching the specified target state.\r\n */\r\n onBuildPhase(targetState: DocumentState, callback: DocumentBuildListener): Disposable;\r\n\r\n /**\r\n * Notify the specified callback when a document has been built reaching the specified target state.\r\n * Unlike {@link onBuildPhase} the listener is called for every single document.\r\n *\r\n * There are two main advantages compared to {@link onBuildPhase}:\r\n * 1. If the build is cancelled, {@link onDocumentPhase} will still fire for documents that have reached a specific state.\r\n * Meanwhile, {@link onBuildPhase} won't fire for that state.\r\n * 2. The {@link DocumentBuilder} ensures that all {@link DocumentPhaseListener} instances are called for a built document.\r\n * Even if the build is cancelled before those listeners were called.\r\n */\r\n onDocumentPhase(targetState: DocumentState, callback: DocumentPhaseListener): Disposable;\r\n\r\n /**\r\n * Wait until the workspace has reached the specified state for all documents.\r\n *\r\n * @param state The desired state. The promise won't resolve until all documents have reached this state\r\n * @param cancelToken Optionally allows to cancel the wait operation, disposing any listeners in the process\r\n * @throws `OperationCancelled` if cancellation has been requested before the state has been reached\r\n */\r\n waitUntil(state: DocumentState, cancelToken?: CancellationToken): Promise<void>;\r\n\r\n /**\r\n * Wait until the document specified by the {@link uri} has reached the specified state.\r\n *\r\n * @param state The desired state. The promise won't resolve until the document has reached this state.\r\n * @param uri The specified URI that points to the document. If the URI does not exist, the promise will resolve once the workspace has reached the specified state.\r\n * @param cancelToken Optionally allows to cancel the wait operation, disposing any listeners in the process.\r\n * @return The URI of the document that has reached the desired state, or `undefined` if the document does not exist.\r\n * @throws `OperationCancelled` if cancellation has been requested before the state has been reached\r\n */\r\n waitUntil(state: DocumentState, uri?: URI, cancelToken?: CancellationToken): Promise<URI | undefined>;\r\n}\r\n\r\nexport type DocumentUpdateListener = (changed: URI[], deleted: URI[]) => void | Promise<void>\r\nexport type DocumentBuildListener = (built: LangiumDocument[], cancelToken: CancellationToken) => void | Promise<void>\r\nexport type DocumentPhaseListener = (built: LangiumDocument, cancelToken: CancellationToken) => void | Promise<void>\r\nexport class DefaultDocumentBuilder implements DocumentBuilder {\r\n\r\n updateBuildOptions: BuildOptions = {\r\n // Default: run only the built-in validation checks and those in the _fast_ category (includes those without category)\r\n validation: {\r\n categories: ['built-in', 'fast']\r\n }\r\n };\r\n\r\n protected readonly langiumDocuments: LangiumDocuments;\r\n protected readonly langiumDocumentFactory: LangiumDocumentFactory;\r\n protected readonly textDocuments: TextDocumentProvider | undefined;\r\n protected readonly indexManager: IndexManager;\r\n protected readonly serviceRegistry: ServiceRegistry;\r\n protected readonly updateListeners: DocumentUpdateListener[] = [];\r\n protected readonly buildPhaseListeners = new MultiMap<DocumentState, DocumentBuildListener>();\r\n protected readonly documentPhaseListeners = new MultiMap<DocumentState, DocumentPhaseListener>();\r\n protected readonly buildState = new Map<string, DocumentBuildState>();\r\n protected readonly documentBuildWaiters = new Map<string, Deferred<void>>();\r\n protected currentState = DocumentState.Changed;\r\n\r\n constructor(services: LangiumSharedCoreServices) {\r\n this.langiumDocuments = services.workspace.LangiumDocuments;\r\n this.langiumDocumentFactory = services.workspace.LangiumDocumentFactory;\r\n this.textDocuments = services.workspace.TextDocuments;\r\n this.indexManager = services.workspace.IndexManager;\r\n this.serviceRegistry = services.ServiceRegistry;\r\n }\r\n\r\n async build<T extends AstNode>(documents: Array<LangiumDocument<T>>, options: BuildOptions = {}, cancelToken = CancellationToken.None): Promise<void> {\r\n for (const document of documents) {\r\n const key = document.uri.toString();\r\n if (document.state === DocumentState.Validated) {\r\n if (typeof options.validation === 'boolean' && options.validation) {\r\n // Force re-running all validation checks\r\n document.state = DocumentState.IndexedReferences;\r\n document.diagnostics = undefined;\r\n this.buildState.delete(key);\r\n } else if (typeof options.validation === 'object') {\r\n const buildState = this.buildState.get(key);\r\n const previousCategories = buildState?.result?.validationChecks;\r\n if (previousCategories) {\r\n // Validation with explicit options was requested for a document that has already been partly validated.\r\n // In this case, we need to merge the previous validation categories with the new ones.\r\n const newCategories = options.validation.categories ?? ValidationCategory.all as ValidationCategory[];\r\n const categories = newCategories.filter(c => !previousCategories.includes(c));\r\n if (categories.length > 0) {\r\n this.buildState.set(key, {\r\n completed: false,\r\n options: {\r\n validation: {\r\n ...options.validation,\r\n categories\r\n }\r\n },\r\n result: buildState.result\r\n });\r\n document.state = DocumentState.IndexedReferences;\r\n }\r\n }\r\n }\r\n } else {\r\n // Default: forget any previous build options\r\n this.buildState.delete(key);\r\n }\r\n }\r\n this.currentState = DocumentState.Changed;\r\n await this.emitUpdate(documents.map(e => e.uri), []);\r\n await this.buildDocuments(documents, options, cancelToken);\r\n }\r\n\r\n async update(changed: URI[], deleted: URI[], cancelToken = CancellationToken.None): Promise<void> {\r\n this.currentState = DocumentState.Changed;\r\n // Remove all metadata of documents that are reported as deleted\r\n for (const deletedUri of deleted) {\r\n this.langiumDocuments.deleteDocument(deletedUri);\r\n this.buildState.delete(deletedUri.toString());\r\n this.indexManager.remove(deletedUri);\r\n }\r\n // Set the state of all changed documents to `Changed` so they are completely rebuilt\r\n for (const changedUri of changed) {\r\n const invalidated = this.langiumDocuments.invalidateDocument(changedUri);\r\n if (!invalidated) {\r\n // We create an unparsed, invalid document.\r\n // This will be parsed as soon as we reach the first document builder phase.\r\n // This allows to cancel the parsing process later in case we need it.\r\n const newDocument = this.langiumDocumentFactory.fromModel({ $type: 'INVALID' }, changedUri);\r\n newDocument.state = DocumentState.Changed;\r\n this.langiumDocuments.addDocument(newDocument);\r\n }\r\n this.buildState.delete(changedUri.toString());\r\n }\r\n // Set the state of all documents that should be relinked to `ComputedScopes` (if not already lower)\r\n const allChangedUris = stream(changed).concat(deleted).map(uri => uri.toString()).toSet();\r\n this.langiumDocuments.all\r\n .filter(doc => !allChangedUris.has(doc.uri.toString()) && this.shouldRelink(doc, allChangedUris))\r\n .forEach(doc => {\r\n const linker = this.serviceRegistry.getServices(doc.uri).references.Linker;\r\n linker.unlink(doc);\r\n doc.state = Math.min(doc.state, DocumentState.ComputedScopes);\r\n doc.diagnostics = undefined;\r\n });\r\n // Notify listeners of the update\r\n await this.emitUpdate(changed, deleted);\r\n // Only allow interrupting the execution after all state changes are done\r\n await interruptAndCheck(cancelToken);\r\n\r\n // Collect and sort all documents that we should rebuild\r\n const rebuildDocuments = this.sortDocuments(\r\n this.langiumDocuments.all\r\n .filter(doc =>\r\n // This includes those that were reported as changed and those that we selected for relinking\r\n doc.state < DocumentState.Linked\r\n // This includes those for which a previous build has been cancelled\r\n || !this.buildState.get(doc.uri.toString())?.completed\r\n )\r\n .toArray()\r\n );\r\n await this.buildDocuments(rebuildDocuments, this.updateBuildOptions, cancelToken);\r\n }\r\n\r\n protected async emitUpdate(changed: URI[], deleted: URI[]): Promise<void> {\r\n await Promise.all(this.updateListeners.map(listener => listener(changed, deleted)));\r\n }\r\n\r\n /**\r\n * Sort the given documents by priority. By default, documents with an open text document are prioritized.\r\n * This is useful to ensure that visible documents show their diagnostics before all other documents.\r\n *\r\n * This improves the responsiveness in large workspaces as users usually don't care about diagnostics\r\n * in files that are currently not opened in the editor.\r\n */\r\n protected sortDocuments(documents: LangiumDocument[]): LangiumDocument[] {\r\n let left = 0;\r\n let right = documents.length - 1;\r\n\r\n while (left < right) {\r\n while (left < documents.length && this.hasTextDocument(documents[left])) {\r\n left++;\r\n }\r\n\r\n while (right >= 0 && !this.hasTextDocument(documents[right])) {\r\n right--;\r\n }\r\n\r\n if (left < right) {\r\n [documents[left], documents[right]] = [documents[right], documents[left]];\r\n }\r\n }\r\n\r\n return documents;\r\n }\r\n\r\n private hasTextDocument(doc: LangiumDocument): boolean {\r\n return Boolean(this.textDocuments?.get(doc.uri));\r\n }\r\n\r\n /**\r\n * Check whether the given document should be relinked after changes were found in the given URIs.\r\n */\r\n protected shouldRelink(document: LangiumDocument, changedUris: Set<string>): boolean {\r\n // Relink documents with linking errors -- maybe those references can be resolved now\r\n if (document.references.some(ref => ref.error !== undefined)) {\r\n return true;\r\n }\r\n // Check whether the document is affected by any of the changed URIs\r\n return this.indexManager.isAffected(document, changedUris);\r\n }\r\n\r\n onUpdate(callback: DocumentUpdateListener): Disposable {\r\n this.updateListeners.push(callback);\r\n return Disposable.create(() => {\r\n const index = this.updateListeners.indexOf(callback);\r\n if (index >= 0) {\r\n this.updateListeners.splice(index, 1);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Build the given documents by stepping through all build phases. If a document's state indicates\r\n * that a certain build phase is already done, the phase is skipped for that document.\r\n *\r\n * @param documents The documents to build.\r\n * @param options the {@link BuildOptions} to use.\r\n * @param cancelToken A cancellation token that can be used to cancel the build.\r\n * @returns A promise that resolves when the build is done.\r\n */\r\n protected async buildDocuments(documents: LangiumDocument[], options: BuildOptions, cancelToken: CancellationToken): Promise<void> {\r\n this.prepareBuild(documents, options);\r\n // 0. Parse content\r\n await this.runCancelable(documents, DocumentState.Parsed, cancelToken, doc =>\r\n this.langiumDocumentFactory.update(doc, cancelToken)\r\n );\r\n // 1. Index content\r\n await this.runCancelable(documents, DocumentState.IndexedContent, cancelToken, doc =>\r\n this.indexManager.updateContent(doc, cancelToken)\r\n );\r\n // 2. Compute scopes\r\n await this.runCancelable(documents, DocumentState.ComputedScopes, cancelToken, async doc => {\r\n const scopeComputation = this.serviceRegistry.getServices(doc.uri).references.ScopeComputation;\r\n doc.precomputedScopes = await scopeComputation.computeLocalScopes(doc, cancelToken);\r\n });\r\n // 3. Linking\r\n await this.runCancelable(documents, DocumentState.Linked, cancelToken, doc => {\r\n const linker = this.serviceRegistry.getServices(doc.uri).references.Linker;\r\n return linker.link(doc, cancelToken);\r\n });\r\n // 4. Index references\r\n await this.runCancelable(documents, DocumentState.IndexedReferences, cancelToken, doc =>\r\n this.indexManager.updateReferences(doc, cancelToken)\r\n );\r\n // 5. Validation\r\n const toBeValidated = documents.filter(doc => this.shouldValidate(doc));\r\n await this.runCancelable(toBeValidated, DocumentState.Validated, cancelToken, doc =>\r\n this.validate(doc, cancelToken)\r\n );\r\n\r\n // If we've made it to this point without being cancelled, we can mark the build state as completed.\r\n for (const doc of documents) {\r\n const state = this.buildState.get(doc.uri.toString());\r\n if (state) {\r\n state.completed = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Runs prior to beginning the build process to update the {@link DocumentBuildState} for each document\r\n *\r\n * @param documents collection of documents to be built\r\n * @param options the {@link BuildOptions} to use\r\n */\r\n protected prepareBuild(documents: LangiumDocument[], options: BuildOptions): void {\r\n for (const doc of documents) {\r\n const key = doc.uri.toString();\r\n const state = this.buildState.get(key);\r\n // If the document has no previous build state, we set it. If it has one, but it's already marked\r\n // as completed, we overwrite it. If the previous build was not completed, we keep its state\r\n // and continue where it was cancelled.\r\n if (!state || state.completed) {\r\n this.buildState.set(key, {\r\n completed: false,\r\n options,\r\n result: state?.result\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Runs a cancelable operation on a set of documents to bring them to a specified {@link DocumentState}.\r\n *\r\n * @param documents The array of documents to process.\r\n * @param targetState The target {@link DocumentState} to bring the documents to.\r\n * @param cancelToken A token that can be used to cancel the operation.\r\n * @param callback A function to be called for each document.\r\n * @returns A promise that resolves when all documents have been processed or the operation is canceled.\r\n * @throws Will throw `OperationCancelled` if the operation is canceled via a `CancellationToken`.\r\n */\r\n protected async runCancelable(documents: LangiumDocument[], targetState: DocumentState, cancelToken: CancellationToken,\r\n callback: (document: LangiumDocument) => MaybePromise<unknown>): Promise<void> {\r\n const filtered = documents.filter(doc => doc.state < targetState);\r\n for (const document of filtered) {\r\n await interruptAndCheck(cancelToken);\r\n await callback(document);\r\n document.state = targetState;\r\n await this.notifyDocumentPhase(document, targetState, cancelToken);\r\n }\r\n\r\n // Do not use `filtered` here, as that will miss documents that have previously reached the current target state\r\n // For example, this happens in case the cancellation triggers between the processing of two documents\r\n // Or files that were picked up during the workspace initialization\r\n const targetStateDocs = documents.filter(doc => doc.state === targetState);\r\n await this.notifyBuildPhase(targetStateDocs, targetState, cancelToken);\r\n this.currentState = targetState;\r\n }\r\n\r\n onBuildPhase(targetState: DocumentState, callback: DocumentBuildListener): Disposable {\r\n this.buildPhaseListeners.add(targetState, callback);\r\n return Disposable.create(() => {\r\n this.buildPhaseListeners.delete(targetState, callback);\r\n });\r\n }\r\n\r\n onDocumentPhase(targetState: DocumentState, callback: DocumentPhaseListener): Disposable {\r\n this.documentPhaseListeners.add(targetState, callback);\r\n return Disposable.create(() => {\r\n this.documentPhaseListeners.delete(targetState, callback);\r\n });\r\n }\r\n\r\n waitUntil(state: DocumentState, cancelToken?: CancellationToken): Promise<void>;\r\n waitUntil(state: DocumentState, uri?: URI, cancelToken?: CancellationToken): Promise<URI | undefined>;\r\n waitUntil(state: DocumentState, uriOrToken?: URI | CancellationToken, cancelToken?: CancellationToken): Promise<URI | undefined | void> {\r\n let uri: URI | undefined = undefined;\r\n if (uriOrToken && 'path' in uriOrToken) {\r\n uri = uriOrToken;\r\n } else {\r\n cancelToken = uriOrToken;\r\n }\r\n cancelToken ??= CancellationToken.None;\r\n if (uri) {\r\n const document = this.langiumDocuments.getDocument(uri);\r\n if (document && document.state > state) {\r\n return Promise.resolve(uri);\r\n }\r\n }\r\n if (this.currentState >= state) {\r\n return Promise.resolve(undefined);\r\n } else if (cancelToken.isCancellationRequested) {\r\n return Promise.reject(OperationCancelled);\r\n }\r\n return new Promise((resolve, reject) => {\r\n const buildDisposable = this.onBuildPhase(state, () => {\r\n buildDisposable.dispose();\r\n cancelDisposable.dispose();\r\n if (uri) {\r\n const document = this.langiumDocuments.getDocument(uri);\r\n resolve(document?.uri);\r\n } else {\r\n resolve(undefined);\r\n }\r\n });\r\n const cancelDisposable = cancelToken!.onCancellationRequested(() => {\r\n buildDisposable.dispose();\r\n cancelDisposable.dispose();\r\n reject(OperationCancelled);\r\n });\r\n });\r\n }\r\n\r\n protected async notifyDocumentPhase(document: LangiumDocument, state: DocumentState, cancelToken: CancellationToken): Promise<void> {\r\n const listeners = this.documentPhaseListeners.get(state);\r\n const listenersCopy = listeners.slice();\r\n for (const listener of listenersCopy) {\r\n try {\r\n await listener(document, cancelToken);\r\n } catch (err) {\r\n // Ignore cancellation errors\r\n // We want to finish the listeners before throwing\r\n if (!isOperationCancelled(err)) {\r\n throw err;\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected async notifyBuildPhase(documents: LangiumDocument[], state: DocumentState, cancelToken: CancellationToken): Promise<void> {\r\n if (documents.length === 0) {\r\n // Don't notify when no document has been processed\r\n return;\r\n }\r\n const listeners = this.buildPhaseListeners.get(state);\r\n const listenersCopy = listeners.slice();\r\n for (const listener of listenersCopy) {\r\n await interruptAndCheck(cancelToken);\r\n await listener(documents, cancelToken);\r\n }\r\n }\r\n\r\n /**\r\n * Determine whether the given document should be validated during a build. The default\r\n * implementation checks the `validation` property of the build options. If it's set to `true`\r\n * or a `ValidationOptions` object, the document is included in the validation phase.\r\n */\r\n protected shouldValidate(document: LangiumDocument): boolean {\r\n return Boolean(this.getBuildOptions(document).validation);\r\n }\r\n\r\n /**\r\n * Run validation checks on the given document and store the resulting diagnostics in the document.\r\n * If the document already contains diagnostics, the new ones are added to the list.\r\n */\r\n protected async validate(document: LangiumDocument, cancelToken: CancellationToken): Promise<void> {\r\n const validator = this.serviceRegistry.getServices(document.uri).validation.DocumentValidator;\r\n const validationSetting = this.getBuildOptions(document).validation;\r\n const options = typeof validationSetting === 'object' ? validationSetting : undefined;\r\n const diagnostics = await validator.validateDocument(document, options, cancelToken);\r\n if (document.diagnostics) {\r\n document.diagnostics.push(...diagnostics);\r\n } else {\r\n document.diagnostics = diagnostics;\r\n }\r\n\r\n // Store information about the executed validation in the build state\r\n const state = this.buildState.get(document.uri.toString());\r\n if (state) {\r\n state.result ??= {};\r\n const newCategories = options?.categories ?? ValidationCategory.all;\r\n if (state.result.validationChecks) {\r\n state.result.validationChecks.push(...newCategories);\r\n } else {\r\n state.result.validationChecks = [...newCategories];\r\n }\r\n }\r\n }\r\n\r\n protected getBuildOptions(document: LangiumDocument): BuildOptions {\r\n return this.buildState.get(document.uri.toString())?.options ?? {};\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { ServiceRegistry } from '../service-registry.js';\r\nimport type { LangiumSharedCoreServices } from '../services.js';\r\nimport type { AstNode, AstNodeDescription, AstReflection } from '../syntax-tree.js';\r\nimport { getDocument } from '../utils/ast-utils.js';\r\nimport { ContextCache } from '../utils/caching.js';\r\nimport { CancellationToken } from '../utils/cancellation.js';\r\nimport type { Stream } from '../utils/stream.js';\r\nimport { stream } from '../utils/stream.js';\r\nimport type { URI } from '../utils/uri-utils.js';\r\nimport { UriUtils } from '../utils/uri-utils.js';\r\nimport type { ReferenceDescription } from './ast-descriptions.js';\r\nimport type { LangiumDocument, LangiumDocuments } from './documents.js';\r\n\r\n/**\r\n * The index manager is responsible for keeping metadata about symbols and cross-references\r\n * in the workspace. It is used to look up symbols in the global scope, mostly during linking\r\n * and completion. This service is shared between all languages of a language server.\r\n */\r\nexport interface IndexManager {\r\n\r\n /**\r\n * Removes the specified document URI from the index.\r\n * Necessary when documents are deleted and not referenceable anymore.\r\n *\r\n * @param uri The URI of the document for which index data shall be removed\r\n */\r\n remove(uri: URI): void;\r\n\r\n /**\r\n * Updates the information about the exportable content of a document inside the index.\r\n *\r\n * @param document Document to be updated\r\n * @param cancelToken Indicates when to cancel the current operation.\r\n * @throws `OperationCanceled` if a user action occurs during execution\r\n */\r\n updateContent(document: LangiumDocument, cancelToken?: CancellationToken): Promise<void>;\r\n\r\n /**\r\n * Updates the information about the cross-references of a document inside the index.\r\n *\r\n * @param document Document to be updated\r\n * @param cancelToken Indicates when to cancel the current operation.\r\n * @throws `OperationCanceled` if a user action occurs during execution\r\n */\r\n updateReferences(document: LangiumDocument, cancelToken?: CancellationToken): Promise<void>;\r\n\r\n /**\r\n * Determine whether the given document could be affected by changes of the documents\r\n * identified by the given URIs (second parameter). The document is typically regarded as\r\n * affected if it contains a reference to any of the changed files.\r\n *\r\n * @param document Document to check whether it's affected\r\n * @param changedUris URIs of the changed documents\r\n */\r\n isAffected(document: LangiumDocument, changedUris: Set<string>): boolean;\r\n\r\n /**\r\n * Compute a list of all exported elements, optionally filtered using a type identifier and document URIs.\r\n *\r\n * @param nodeType The type to filter with, or `undefined` to return descriptions of all types.\r\n * @param uris If specified, only returns elements from the given URIs.\r\n * @returns a `Stream` containing all globally visible nodes (of a given type).\r\n */\r\n allElements(nodeType?: string, uris?: Set<string>): Stream<AstNodeDescription>;\r\n\r\n /**\r\n * Returns all known references that are pointing to the given `targetNode`.\r\n *\r\n * @param targetNode the `AstNode` to look up references for\r\n * @param astNodePath the path that points to the `targetNode` inside the document. See also `AstNodeLocator`\r\n *\r\n * @returns a `Stream` of references that are targeting the `targetNode`\r\n */\r\n findAllReferences(targetNode: AstNode, astNodePath: string): Stream<ReferenceDescription>;\r\n\r\n}\r\n\r\nexport class DefaultIndexManager implements IndexManager {\r\n\r\n protected readonly serviceRegistry: ServiceRegistry;\r\n protected readonly documents: LangiumDocuments;\r\n protected readonly astReflection: AstReflection;\r\n\r\n /**\r\n * The symbol index stores all `AstNodeDescription` items exported by a document.\r\n * The key used in this map is the string representation of the specific document URI.\r\n */\r\n protected readonly symbolIndex = new Map<string, AstNodeDescription[]>();\r\n /**\r\n * This is a cache for the `allElements()` method.\r\n * It caches the descriptions from `symbolIndex` grouped by types.\r\n */\r\n protected readonly symbolByTypeIndex = new ContextCache<string, string, AstNodeDescription[]>();\r\n /**\r\n * This index keeps track of all `ReferenceDescription` items exported by a document.\r\n * This is used to compute which elements are affected by a document change\r\n * and for finding references to an AST node.\r\n */\r\n protected readonly referenceIndex = new Map<string, ReferenceDescription[]>();\r\n\r\n constructor(services: LangiumSharedCoreServices) {\r\n this.documents = services.workspace.LangiumDocuments;\r\n this.serviceRegistry = services.ServiceRegistry;\r\n this.astReflection = services.AstReflection;\r\n }\r\n\r\n findAllReferences(targetNode: AstNode, astNodePath: string): Stream<ReferenceDescription> {\r\n const targetDocUri = getDocument(targetNode).uri;\r\n const result: ReferenceDescription[] = [];\r\n this.referenceIndex.forEach(docRefs => {\r\n docRefs.forEach(refDescr => {\r\n if (UriUtils.equals(refDescr.targetUri, targetDocUri) && refDescr.targetPath === astNodePath) {\r\n result.push(refDescr);\r\n }\r\n });\r\n });\r\n return stream(result);\r\n }\r\n\r\n allElements(nodeType?: string, uris?: Set<string>): Stream<AstNodeDescription> {\r\n let documentUris = stream(this.symbolIndex.keys());\r\n if (uris) {\r\n documentUris = documentUris.filter(uri => !uris || uris.has(uri));\r\n }\r\n return documentUris\r\n .map(uri => this.getFileDescriptions(uri, nodeType))\r\n .flat();\r\n }\r\n\r\n protected getFileDescriptions(uri: string, nodeType?: string): AstNodeDescription[] {\r\n if (!nodeType) {\r\n return this.symbolIndex.get(uri) ?? [];\r\n }\r\n const descriptions = this.symbolByTypeIndex.get(uri, nodeType, () => {\r\n const allFileDescriptions = this.symbolIndex.get(uri) ?? [];\r\n return allFileDescriptions.filter(e => this.astReflection.isSubtype(e.type, nodeType));\r\n });\r\n return descriptions;\r\n }\r\n\r\n remove(uri: URI): void {\r\n const uriString = uri.toString();\r\n this.symbolIndex.delete(uriString);\r\n this.symbolByTypeIndex.clear(uriString);\r\n this.referenceIndex.delete(uriString);\r\n }\r\n\r\n async updateContent(document: LangiumDocument, cancelToken = CancellationToken.None): Promise<void> {\r\n const services = this.serviceRegistry.getServices(document.uri);\r\n const exports = await services.references.ScopeComputation.computeExports(document, cancelToken);\r\n const uri = document.uri.toString();\r\n this.symbolIndex.set(uri, exports);\r\n this.symbolByTypeIndex.clear(uri);\r\n }\r\n\r\n async updateReferences(document: LangiumDocument, cancelToken = CancellationToken.None): Promise<void> {\r\n const services = this.serviceRegistry.getServices(document.uri);\r\n const indexData = await services.workspace.ReferenceDescriptionProvider.createDescriptions(document, cancelToken);\r\n this.referenceIndex.set(document.uri.toString(), indexData);\r\n }\r\n\r\n isAffected(document: LangiumDocument, changedUris: Set<string>): boolean {\r\n const references = this.referenceIndex.get(document.uri.toString());\r\n if (!references) {\r\n return false;\r\n }\r\n return references.some(ref => !ref.local && changedUris.has(ref.targetUri.toString()));\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { InitializeParams, InitializedParams } from 'vscode-languageserver-protocol';\r\nimport type { WorkspaceFolder } from 'vscode-languageserver-types';\r\nimport type { ServiceRegistry } from '../service-registry.js';\r\nimport type { LangiumSharedCoreServices } from '../services.js';\r\nimport { CancellationToken } from '../utils/cancellation.js';\r\nimport { Deferred, interruptAndCheck } from '../utils/promise-utils.js';\r\nimport { URI, UriUtils } from '../utils/uri-utils.js';\r\nimport type { BuildOptions, DocumentBuilder } from './document-builder.js';\r\nimport type { LangiumDocument, LangiumDocuments } from './documents.js';\r\nimport type { FileSystemNode, FileSystemProvider } from './file-system-provider.js';\r\nimport type { WorkspaceLock } from './workspace-lock.js';\r\n\r\n// export type WorkspaceFolder from 'vscode-languageserver-types' for convenience,\r\n// is supposed to avoid confusion as 'WorkspaceFolder' might accidentally be imported via 'vscode-languageclient'\r\nexport type { WorkspaceFolder };\r\n\r\n/**\r\n * The workspace manager is responsible for finding source files in the workspace.\r\n * This service is shared between all languages of a language server.\r\n */\r\nexport interface WorkspaceManager {\r\n\r\n /** The options used for the initial workspace build. */\r\n initialBuildOptions: BuildOptions | undefined;\r\n\r\n /**\r\n * A promise that resolves when the workspace manager is ready to be used.\r\n * Use this to ensure that the workspace manager has finished its initialization.\r\n */\r\n readonly ready: Promise<void>;\r\n\r\n /**\r\n * The workspace folders of the current workspace.\r\n * Available only after the `ready` promise resolves.\r\n */\r\n get workspaceFolders(): readonly WorkspaceFolder[] | undefined;\r\n\r\n /**\r\n * When used in a language server context, this method is called when the server receives\r\n * the `initialize` request.\r\n */\r\n initialize(params: InitializeParams): void;\r\n\r\n /**\r\n * When used in a language server context, this method is called when the server receives\r\n * the `initialized` notification.\r\n */\r\n initialized(params: InitializedParams): Promise<void>;\r\n\r\n /**\r\n * Does the initial indexing of workspace folders.\r\n * Collects information about exported and referenced AstNodes in\r\n * each language file and stores it locally.\r\n *\r\n * @param folders The set of workspace folders to be indexed.\r\n * @param cancelToken A cancellation token that can be used to cancel the operation.\r\n *\r\n * @throws OperationCancelled if a cancellation event has been detected\r\n */\r\n initializeWorkspace(folders: WorkspaceFolder[], cancelToken?: CancellationToken): Promise<void>;\r\n\r\n}\r\n\r\nexport class DefaultWorkspaceManager implements WorkspaceManager {\r\n\r\n initialBuildOptions: BuildOptions = {};\r\n\r\n protected readonly serviceRegistry: ServiceRegistry;\r\n protected readonly langiumDocuments: LangiumDocuments;\r\n protected readonly documentBuilder: DocumentBuilder;\r\n protected readonly fileSystemProvider: FileSystemProvider;\r\n protected readonly mutex: WorkspaceLock;\r\n protected readonly _ready = new Deferred<void>();\r\n protected folders?: WorkspaceFolder[];\r\n\r\n constructor(services: LangiumSharedCoreServices) {\r\n this.serviceRegistry = services.ServiceRegistry;\r\n this.langiumDocuments = services.workspace.LangiumDocuments;\r\n this.documentBuilder = services.workspace.DocumentBuilder;\r\n this.fileSystemProvider = services.workspace.FileSystemProvider;\r\n this.mutex = services.workspace.WorkspaceLock;\r\n }\r\n\r\n get ready(): Promise<void> {\r\n return this._ready.promise;\r\n }\r\n\r\n get workspaceFolders(): readonly WorkspaceFolder[] | undefined {\r\n return this.folders;\r\n }\r\n\r\n initialize(params: InitializeParams): void {\r\n this.folders = params.workspaceFolders ?? undefined;\r\n }\r\n\r\n initialized(_params: InitializedParams): Promise<void> {\r\n // Initialize the workspace even if there are no workspace folders\r\n // We still want to load additional documents (language library or similar) during initialization\r\n return this.mutex.write(token => this.initializeWorkspace(this.folders ?? [], token));\r\n }\r\n\r\n async initializeWorkspace(folders: WorkspaceFolder[], cancelToken = CancellationToken.None): Promise<void> {\r\n const documents = await this.performStartup(folders);\r\n // Only after creating all documents do we check whether we need to cancel the initialization\r\n // The document builder will later pick up on all unprocessed documents\r\n await interruptAndCheck(cancelToken);\r\n await this.documentBuilder.build(documents, this.initialBuildOptions, cancelToken);\r\n }\r\n\r\n /**\r\n * Performs the uninterruptable startup sequence of the workspace manager.\r\n * This methods loads all documents in the workspace and other documents and returns them.\r\n */\r\n protected async performStartup(folders: WorkspaceFolder[]): Promise<LangiumDocument[]> {\r\n const fileExtensions = this.serviceRegistry.all.flatMap(e => e.LanguageMetaData.fileExtensions);\r\n const documents: LangiumDocument[] = [];\r\n const collector = (document: LangiumDocument) => {\r\n documents.push(document);\r\n if (!this.langiumDocuments.hasDocument(document.uri)) {\r\n this.langiumDocuments.addDocument(document);\r\n }\r\n };\r\n // Even though we don't await the initialization of the workspace manager,\r\n // we can still assume that all library documents and file documents are loaded by the time we start building documents.\r\n // The mutex prevents anything from performing a workspace build until we check the cancellation token\r\n await this.loadAdditionalDocuments(folders, collector);\r\n await Promise.all(\r\n folders.map(wf => [wf, this.getRootFolder(wf)] as [WorkspaceFolder, URI])\r\n .map(async entry => this.traverseFolder(...entry, fileExtensions, collector))\r\n );\r\n this._ready.resolve();\r\n return documents;\r\n }\r\n\r\n /**\r\n * Load all additional documents that shall be visible in the context of the given workspace\r\n * folders and add them to the collector. This can be used to include built-in libraries of\r\n * your language, which can be either loaded from provided files or constructed in memory.\r\n */\r\n protected loadAdditionalDocuments(_folders: WorkspaceFolder[], _collector: (document: LangiumDocument) => void): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n /**\r\n * Determine the root folder of the source documents in the given workspace folder.\r\n * The default implementation returns the URI of the workspace folder, but you can override\r\n * this to return a subfolder like `src` instead.\r\n */\r\n protected getRootFolder(workspaceFolder: WorkspaceFolder): URI {\r\n return URI.parse(workspaceFolder.uri);\r\n }\r\n\r\n /**\r\n * Traverse the file system folder identified by the given URI and its subfolders. All\r\n * contained files that match the file extensions are added to the collector.\r\n */\r\n protected async traverseFolder(workspaceFolder: WorkspaceFolder, folderPath: URI, fileExtensions: string[], collector: (document: LangiumDocument) => void): Promise<void> {\r\n const content = await this.fileSystemProvider.readDirectory(folderPath);\r\n await Promise.all(content.map(async entry => {\r\n if (this.includeEntry(workspaceFolder, entry, fileExtensions)) {\r\n if (entry.isDirectory) {\r\n await this.traverseFolder(workspaceFolder, entry.uri, fileExtensions, collector);\r\n } else if (entry.isFile) {\r\n const document = await this.langiumDocuments.getOrCreateDocument(entry.uri);\r\n collector(document);\r\n }\r\n }\r\n }));\r\n }\r\n\r\n /**\r\n * Determine whether the given folder entry shall be included while indexing the workspace.\r\n */\r\n protected includeEntry(_workspaceFolder: WorkspaceFolder, entry: FileSystemNode, fileExtensions: string[]): boolean {\r\n const name = UriUtils.basename(entry.uri);\r\n if (name.startsWith('.')) {\r\n return false;\r\n }\r\n if (entry.isDirectory) {\r\n return name !== 'node_modules' && name !== 'out';\r\n } else if (entry.isFile) {\r\n const extname = UriUtils.extname(entry.uri);\r\n return fileExtensions.includes(extname);\r\n }\r\n return false;\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { ILexerErrorMessageProvider, ILexingError, IMultiModeLexerDefinition, IToken, TokenType, TokenTypeDictionary, TokenVocabulary } from 'chevrotain';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport { Lexer as ChevrotainLexer, defaultLexerErrorProvider } from 'chevrotain';\r\nimport type { LexingReport, TokenBuilder } from './token-builder.js';\r\n\r\nexport class DefaultLexerErrorMessageProvider implements ILexerErrorMessageProvider {\r\n\r\n buildUnexpectedCharactersMessage(fullText: string, startOffset: number, length: number, line?: number, column?: number): string {\r\n return defaultLexerErrorProvider.buildUnexpectedCharactersMessage(fullText, startOffset, length, line, column);\r\n }\r\n\r\n buildUnableToPopLexerModeMessage(token: IToken): string {\r\n return defaultLexerErrorProvider.buildUnableToPopLexerModeMessage(token);\r\n }\r\n}\r\n\r\nexport interface LexerResult {\r\n /**\r\n * A list of all tokens that were lexed from the input.\r\n *\r\n * Note that Langium requires the optional properties\r\n * `startLine`, `startColumn`, `endOffset`, `endLine` and `endColumn` to be set on each token.\r\n */\r\n tokens: IToken[];\r\n /**\r\n * Contains hidden tokens, usually comments.\r\n */\r\n hidden: IToken[];\r\n errors: ILexingError[];\r\n report?: LexingReport;\r\n}\r\n\r\nexport type TokenizeMode = 'full' | 'partial';\r\n\r\nexport interface TokenizeOptions {\r\n mode?: TokenizeMode;\r\n}\r\n\r\nexport const DEFAULT_TOKENIZE_OPTIONS: TokenizeOptions = { mode: 'full' };\r\n\r\nexport interface Lexer {\r\n readonly definition: TokenTypeDictionary;\r\n tokenize(text: string, options?: TokenizeOptions): LexerResult;\r\n}\r\n\r\nexport class DefaultLexer implements Lexer {\r\n\r\n protected readonly tokenBuilder: TokenBuilder;\r\n protected readonly errorMessageProvider: ILexerErrorMessageProvider;\r\n protected tokenTypes: TokenTypeDictionary;\r\n protected chevrotainLexer: ChevrotainLexer;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.errorMessageProvider = services.parser.LexerErrorMessageProvider;\r\n this.tokenBuilder = services.parser.TokenBuilder;\r\n const tokens = this.tokenBuilder.buildTokens(services.Grammar, {\r\n caseInsensitive: services.LanguageMetaData.caseInsensitive\r\n });\r\n this.tokenTypes = this.toTokenTypeDictionary(tokens);\r\n const lexerTokens = isTokenTypeDictionary(tokens) ? Object.values(tokens) : tokens;\r\n const production = services.LanguageMetaData.mode === 'production';\r\n this.chevrotainLexer = new ChevrotainLexer(lexerTokens, {\r\n positionTracking: 'full',\r\n skipValidations: production,\r\n errorMessageProvider: this.errorMessageProvider\r\n });\r\n }\r\n\r\n get definition(): TokenTypeDictionary {\r\n return this.tokenTypes;\r\n }\r\n\r\n tokenize(text: string, _options: TokenizeOptions = DEFAULT_TOKENIZE_OPTIONS): LexerResult {\r\n const chevrotainResult = this.chevrotainLexer.tokenize(text);\r\n return {\r\n tokens: chevrotainResult.tokens,\r\n errors: chevrotainResult.errors,\r\n hidden: chevrotainResult.groups.hidden ?? [],\r\n report: this.tokenBuilder.flushLexingReport?.(text)\r\n };\r\n }\r\n\r\n protected toTokenTypeDictionary(buildTokens: TokenVocabulary): TokenTypeDictionary {\r\n if (isTokenTypeDictionary(buildTokens)) return buildTokens;\r\n const tokens = isIMultiModeLexerDefinition(buildTokens) ? Object.values(buildTokens.modes).flat() : buildTokens;\r\n const res: TokenTypeDictionary = {};\r\n tokens.forEach(token => res[token.name] = token);\r\n return res;\r\n }\r\n}\r\n\r\n/**\r\n * Returns a check whether the given TokenVocabulary is TokenType array\r\n */\r\nexport function isTokenTypeArray(tokenVocabulary: TokenVocabulary): tokenVocabulary is TokenType[] {\r\n return Array.isArray(tokenVocabulary) && (tokenVocabulary.length === 0 || 'name' in tokenVocabulary[0]);\r\n}\r\n\r\n/**\r\n * Returns a check whether the given TokenVocabulary is IMultiModeLexerDefinition\r\n */\r\nexport function isIMultiModeLexerDefinition(tokenVocabulary: TokenVocabulary): tokenVocabulary is IMultiModeLexerDefinition {\r\n return tokenVocabulary && 'modes' in tokenVocabulary && 'defaultMode' in tokenVocabulary;\r\n}\r\n\r\n/**\r\n * Returns a check whether the given TokenVocabulary is TokenTypeDictionary\r\n */\r\nexport function isTokenTypeDictionary(tokenVocabulary: TokenVocabulary): tokenVocabulary is TokenTypeDictionary {\r\n return !isTokenTypeArray(tokenVocabulary) && !isIMultiModeLexerDefinition(tokenVocabulary);\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { Position, Range } from 'vscode-languageserver-types';\r\nimport type { CstNode } from '../syntax-tree.js';\r\nimport { NEWLINE_REGEXP, escapeRegExp } from '../utils/regexp-utils.js';\r\nimport { URI } from '../utils/uri-utils.js';\r\n\r\nexport interface JSDocComment extends JSDocValue {\r\n readonly elements: JSDocElement[]\r\n getTag(name: string): JSDocTag | undefined\r\n getTags(name: string): JSDocTag[]\r\n}\r\n\r\nexport type JSDocElement = JSDocParagraph | JSDocTag;\r\n\r\nexport type JSDocInline = JSDocTag | JSDocLine;\r\n\r\nexport interface JSDocValue {\r\n /**\r\n * Represents the range that this JSDoc element occupies.\r\n * If the JSDoc was parsed from a `CstNode`, the range will represent the location in the source document.\r\n */\r\n readonly range: Range\r\n /**\r\n * Renders this JSDoc element to a plain text representation.\r\n */\r\n toString(): string\r\n /**\r\n * Renders this JSDoc element to a markdown representation.\r\n *\r\n * @param options Rendering options to customize the markdown result.\r\n */\r\n toMarkdown(options?: JSDocRenderOptions): string\r\n}\r\n\r\nexport interface JSDocParagraph extends JSDocValue {\r\n readonly inlines: JSDocInline[]\r\n}\r\n\r\nexport interface JSDocLine extends JSDocValue {\r\n readonly text: string\r\n}\r\n\r\nexport interface JSDocTag extends JSDocValue {\r\n readonly name: string\r\n readonly content: JSDocParagraph\r\n readonly inline: boolean\r\n}\r\n\r\nexport interface JSDocParseOptions {\r\n /**\r\n * The start symbol of your comment format. Defaults to `/**`.\r\n */\r\n readonly start?: RegExp | string\r\n /**\r\n * The symbol that start a line of your comment format. Defaults to `*`.\r\n */\r\n readonly line?: RegExp | string\r\n /**\r\n * The end symbol of your comment format. Defaults to `*\\/`.\r\n */\r\n readonly end?: RegExp | string\r\n}\r\n\r\nexport interface JSDocRenderOptions {\r\n /**\r\n * Determines the style for rendering tags. Defaults to `italic`.\r\n */\r\n tag?: 'plain' | 'italic' | 'bold' | 'bold-italic'\r\n /**\r\n * Determines the default for rendering `@link` tags. Defaults to `plain`.\r\n */\r\n link?: 'code' | 'plain'\r\n /**\r\n * Custom tag rendering function.\r\n * Return a markdown formatted tag or `undefined` to fall back to the default rendering.\r\n */\r\n renderTag?(tag: JSDocTag): string | undefined\r\n /**\r\n * Custom link rendering function. Accepts a link target and a display value for the link.\r\n * Return a markdown formatted link with the format `[$display]($link)` or `undefined` if the link is not a valid target.\r\n */\r\n renderLink?(link: string, display: string): string | undefined\r\n}\r\n\r\n/**\r\n * Parses a JSDoc from a `CstNode` containing a comment.\r\n *\r\n * @param node A `CstNode` from a parsed Langium document.\r\n * @param options Parsing options specialized to your language. See {@link JSDocParseOptions}.\r\n */\r\nexport function parseJSDoc(node: CstNode, options?: JSDocParseOptions): JSDocComment;\r\n/**\r\n * Parses a JSDoc from a string comment.\r\n *\r\n * @param content A string containing the source of the JSDoc comment.\r\n * @param start The start position the comment occupies in the source document.\r\n * @param options Parsing options specialized to your language. See {@link JSDocParseOptions}.\r\n */\r\nexport function parseJSDoc(content: string, start?: Position, options?: JSDocParseOptions): JSDocComment;\r\nexport function parseJSDoc(node: CstNode | string, start?: Position | JSDocParseOptions, options?: JSDocParseOptions): JSDocComment {\r\n let opts: JSDocParseOptions | undefined;\r\n let position: Position | undefined;\r\n if (typeof node === 'string') {\r\n position = start as Position | undefined;\r\n opts = options as JSDocParseOptions | undefined;\r\n } else {\r\n position = node.range.start;\r\n opts = start as JSDocParseOptions | undefined;\r\n }\r\n if (!position) {\r\n position = Position.create(0, 0);\r\n }\r\n\r\n const lines = getLines(node);\r\n const normalizedOptions = normalizeOptions(opts);\r\n\r\n const tokens = tokenize({\r\n lines,\r\n position,\r\n options: normalizedOptions\r\n });\r\n\r\n return parseJSDocComment({\r\n index: 0,\r\n tokens,\r\n position\r\n });\r\n}\r\n\r\nexport function isJSDoc(node: CstNode | string, options?: JSDocParseOptions): boolean {\r\n const normalizedOptions = normalizeOptions(options);\r\n const lines = getLines(node);\r\n if (lines.length === 0) {\r\n return false;\r\n }\r\n\r\n const first = lines[0];\r\n const last = lines[lines.length - 1];\r\n const firstRegex = normalizedOptions.start;\r\n const lastRegex = normalizedOptions.end;\r\n\r\n return Boolean(firstRegex?.exec(first)) && Boolean(lastRegex?.exec(last));\r\n}\r\n\r\nfunction getLines(node: CstNode | string): string[] {\r\n let content = '';\r\n if (typeof node === 'string') {\r\n content = node;\r\n } else {\r\n content = node.text;\r\n }\r\n const lines = content.split(NEWLINE_REGEXP);\r\n return lines;\r\n}\r\n\r\n// Tokenization\r\n\r\ninterface JSDocToken {\r\n type: 'text' | 'tag' | 'inline-tag' | 'break'\r\n content: string\r\n range: Range\r\n}\r\n\r\nconst tagRegex = /\\s*(@([\\p{L}][\\p{L}\\p{N}]*)?)/uy;\r\nconst inlineTagRegex = /\\{(@[\\p{L}][\\p{L}\\p{N}]*)(\\s*)([^\\r\\n}]+)?\\}/gu;\r\n\r\nfunction tokenize(context: TokenizationContext): JSDocToken[] {\r\n const tokens: JSDocToken[] = [];\r\n let currentLine = context.position.line;\r\n let currentCharacter = context.position.character;\r\n for (let i = 0; i < context.lines.length; i++) {\r\n const first = i === 0;\r\n const last = i === context.lines.length - 1;\r\n let line = context.lines[i];\r\n let index = 0;\r\n\r\n if (first && context.options.start) {\r\n const match = context.options.start?.exec(line);\r\n if (match) {\r\n index = match.index + match[0].length;\r\n }\r\n } else {\r\n const match = context.options.line?.exec(line);\r\n if (match) {\r\n index = match.index + match[0].length;\r\n }\r\n }\r\n if (last) {\r\n const match = context.options.end?.exec(line);\r\n if (match) {\r\n line = line.substring(0, match.index);\r\n }\r\n }\r\n\r\n line = line.substring(0, lastCharacter(line));\r\n const whitespaceEnd = skipWhitespace(line, index);\r\n\r\n if (whitespaceEnd >= line.length) {\r\n // Only create a break token when we already have previous tokens\r\n if (tokens.length > 0) {\r\n const position = Position.create(currentLine, currentCharacter);\r\n tokens.push({\r\n type: 'break',\r\n content: '',\r\n range: Range.create(position, position)\r\n });\r\n }\r\n } else {\r\n tagRegex.lastIndex = index;\r\n const tagMatch = tagRegex.exec(line);\r\n if (tagMatch) {\r\n const fullMatch = tagMatch[0];\r\n const value = tagMatch[1];\r\n const start = Position.create(currentLine, currentCharacter + index);\r\n const end = Position.create(currentLine, currentCharacter + index + fullMatch.length);\r\n tokens.push({\r\n type: 'tag',\r\n content: value,\r\n range: Range.create(start, end)\r\n });\r\n index += fullMatch.length;\r\n index = skipWhitespace(line, index);\r\n }\r\n\r\n if (index < line.length) {\r\n const rest = line.substring(index);\r\n const inlineTagMatches = Array.from(rest.matchAll(inlineTagRegex));\r\n tokens.push(...buildInlineTokens(inlineTagMatches, rest, currentLine, currentCharacter + index));\r\n }\r\n }\r\n\r\n currentLine++;\r\n currentCharacter = 0;\r\n }\r\n\r\n // Remove last break token if there is one\r\n if (tokens.length > 0 && tokens[tokens.length - 1].type === 'break') {\r\n return tokens.slice(0, -1);\r\n }\r\n\r\n return tokens;\r\n}\r\n\r\nfunction buildInlineTokens(tags: RegExpMatchArray[], line: string, lineIndex: number, characterIndex: number): JSDocToken[] {\r\n const tokens: JSDocToken[] = [];\r\n\r\n if (tags.length === 0) {\r\n const start = Position.create(lineIndex, characterIndex);\r\n const end = Position.create(lineIndex, characterIndex + line.length);\r\n tokens.push({\r\n type: 'text',\r\n content: line,\r\n range: Range.create(start, end)\r\n });\r\n } else {\r\n let lastIndex = 0;\r\n for (const match of tags) {\r\n const matchIndex = match.index!;\r\n const startContent = line.substring(lastIndex, matchIndex);\r\n if (startContent.length > 0) {\r\n tokens.push({\r\n type: 'text',\r\n content: line.substring(lastIndex, matchIndex),\r\n range: Range.create(\r\n Position.create(lineIndex, lastIndex + characterIndex),\r\n Position.create(lineIndex, matchIndex + characterIndex)\r\n )\r\n });\r\n }\r\n let offset = startContent.length + 1;\r\n const tagName = match[1];\r\n tokens.push({\r\n type: 'inline-tag',\r\n content: tagName,\r\n range: Range.create(\r\n Position.create(lineIndex, lastIndex + offset + characterIndex),\r\n Position.create(lineIndex, lastIndex + offset + tagName.length + characterIndex)\r\n )\r\n });\r\n offset += tagName.length;\r\n if (match.length === 4) {\r\n offset += match[2].length;\r\n const value = match[3];\r\n tokens.push({\r\n type: 'text',\r\n content: value,\r\n range: Range.create(\r\n Position.create(lineIndex, lastIndex + offset + characterIndex),\r\n Position.create(lineIndex, lastIndex + offset + value.length + characterIndex)\r\n )\r\n });\r\n } else {\r\n tokens.push({\r\n type: 'text',\r\n content: '',\r\n range: Range.create(\r\n Position.create(lineIndex, lastIndex + offset + characterIndex),\r\n Position.create(lineIndex, lastIndex + offset + characterIndex)\r\n )\r\n });\r\n }\r\n lastIndex = matchIndex + match[0].length;\r\n }\r\n const endContent = line.substring(lastIndex);\r\n if (endContent.length > 0) {\r\n tokens.push({\r\n type: 'text',\r\n content: endContent,\r\n range: Range.create(\r\n Position.create(lineIndex, lastIndex + characterIndex),\r\n Position.create(lineIndex, lastIndex + characterIndex + endContent.length)\r\n )\r\n });\r\n }\r\n }\r\n\r\n return tokens;\r\n}\r\n\r\nconst nonWhitespaceRegex = /\\S/;\r\nconst whitespaceEndRegex = /\\s*$/;\r\n\r\nfunction skipWhitespace(line: string, index: number): number {\r\n const match = line.substring(index).match(nonWhitespaceRegex);\r\n if (match) {\r\n return index + match.index!;\r\n } else {\r\n return line.length;\r\n }\r\n}\r\n\r\nfunction lastCharacter(line: string): number | undefined {\r\n const match = line.match(whitespaceEndRegex);\r\n if (match && typeof match.index === 'number') {\r\n return match.index;\r\n }\r\n return undefined;\r\n}\r\n\r\n// Parsing\r\n\r\nfunction parseJSDocComment(context: ParseContext): JSDocComment {\r\n const startPosition: Position = Position.create(context.position.line, context.position.character);\r\n if (context.tokens.length === 0) {\r\n return new JSDocCommentImpl([], Range.create(startPosition, startPosition));\r\n }\r\n const elements: JSDocElement[] = [];\r\n while (context.index < context.tokens.length) {\r\n const element = parseJSDocElement(context, elements[elements.length - 1]);\r\n if (element) {\r\n elements.push(element);\r\n }\r\n }\r\n const start = elements[0]?.range.start ?? startPosition;\r\n const end = elements[elements.length - 1]?.range.end ?? startPosition;\r\n return new JSDocCommentImpl(elements, Range.create(start, end));\r\n}\r\n\r\nfunction parseJSDocElement(context: ParseContext, last?: JSDocElement): JSDocElement | undefined {\r\n const next = context.tokens[context.index];\r\n if (next.type === 'tag') {\r\n return parseJSDocTag(context, false);\r\n } else if (next.type === 'text' || next.type === 'inline-tag') {\r\n return parseJSDocText(context);\r\n } else {\r\n appendEmptyLine(next, last);\r\n context.index++;\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction appendEmptyLine(token: JSDocToken, element?: JSDocElement): void {\r\n if (element) {\r\n const line = new JSDocLineImpl('', token.range);\r\n if ('inlines' in element) {\r\n element.inlines.push(line);\r\n } else {\r\n element.content.inlines.push(line);\r\n }\r\n }\r\n}\r\n\r\nfunction parseJSDocText(context: ParseContext): JSDocParagraph {\r\n let token = context.tokens[context.index];\r\n const firstToken = token;\r\n let lastToken = token;\r\n const lines: JSDocInline[] = [];\r\n while (token && token.type !== 'break' && token.type !== 'tag') {\r\n lines.push(parseJSDocInline(context));\r\n lastToken = token;\r\n token = context.tokens[context.index];\r\n }\r\n return new JSDocTextImpl(lines, Range.create(firstToken.range.start, lastToken.range.end));\r\n}\r\n\r\nfunction parseJSDocInline(context: ParseContext): JSDocInline {\r\n const token = context.tokens[context.index];\r\n if (token.type === 'inline-tag') {\r\n return parseJSDocTag(context, true);\r\n } else {\r\n return parseJSDocLine(context);\r\n }\r\n}\r\n\r\nfunction parseJSDocTag(context: ParseContext, inline: boolean): JSDocTag {\r\n const tagToken = context.tokens[context.index++];\r\n const name = tagToken.content.substring(1);\r\n const nextToken = context.tokens[context.index];\r\n if (nextToken?.type === 'text') {\r\n if (inline) {\r\n const docLine = parseJSDocLine(context);\r\n return new JSDocTagImpl(\r\n name,\r\n new JSDocTextImpl([docLine], docLine.range),\r\n inline,\r\n Range.create(tagToken.range.start, docLine.range.end)\r\n );\r\n } else {\r\n const textDoc = parseJSDocText(context);\r\n return new JSDocTagImpl(\r\n name,\r\n textDoc,\r\n inline,\r\n Range.create(tagToken.range.start, textDoc.range.end)\r\n );\r\n }\r\n } else {\r\n const range = tagToken.range;\r\n return new JSDocTagImpl(name, new JSDocTextImpl([], range), inline, range);\r\n }\r\n}\r\n\r\nfunction parseJSDocLine(context: ParseContext): JSDocLine {\r\n const token = context.tokens[context.index++];\r\n return new JSDocLineImpl(token.content, token.range);\r\n}\r\n\r\ninterface NormalizedOptions {\r\n start?: RegExp\r\n end?: RegExp\r\n line?: RegExp\r\n}\r\n\r\ninterface TokenizationContext {\r\n position: Position\r\n lines: string[]\r\n options: NormalizedOptions\r\n}\r\n\r\ninterface ParseContext {\r\n position: Position\r\n tokens: JSDocToken[]\r\n index: number\r\n}\r\n\r\nfunction normalizeOptions(options?: JSDocParseOptions): NormalizedOptions {\r\n if (!options) {\r\n return normalizeOptions({\r\n start: '/**',\r\n end: '*/',\r\n line: '*'\r\n });\r\n }\r\n const { start, end, line } = options;\r\n return {\r\n start: normalizeOption(start, true),\r\n end: normalizeOption(end, false),\r\n line: normalizeOption(line, true)\r\n };\r\n}\r\n\r\nfunction normalizeOption(option: RegExp | string | undefined, start: boolean): RegExp | undefined {\r\n if (typeof option === 'string' || typeof option === 'object') {\r\n const escaped = typeof option === 'string' ? escapeRegExp(option) : option.source;\r\n if (start) {\r\n return new RegExp(`^\\\\s*${escaped}`);\r\n } else {\r\n return new RegExp(`\\\\s*${escaped}\\\\s*$`);\r\n }\r\n } else {\r\n return option;\r\n }\r\n}\r\n\r\nclass JSDocCommentImpl implements JSDocComment {\r\n\r\n readonly elements: JSDocElement[];\r\n readonly range: Range;\r\n\r\n constructor(elements: JSDocElement[], range: Range) {\r\n this.elements = elements;\r\n this.range = range;\r\n }\r\n\r\n getTag(name: string): JSDocTag | undefined {\r\n return this.getAllTags().find(e => e.name === name);\r\n }\r\n\r\n getTags(name: string): JSDocTag[] {\r\n return this.getAllTags().filter(e => e.name === name);\r\n }\r\n\r\n private getAllTags(): JSDocTag[] {\r\n return this.elements.filter((e): e is JSDocTag => 'name' in e);\r\n }\r\n\r\n toString(): string {\r\n let value = '';\r\n for (const element of this.elements) {\r\n if (value.length === 0) {\r\n value = element.toString();\r\n } else {\r\n const text = element.toString();\r\n value += fillNewlines(value) + text;\r\n }\r\n }\r\n return value.trim();\r\n }\r\n\r\n toMarkdown(options?: JSDocRenderOptions): string {\r\n let value = '';\r\n for (const element of this.elements) {\r\n if (value.length === 0) {\r\n value = element.toMarkdown(options);\r\n } else {\r\n const text = element.toMarkdown(options);\r\n value += fillNewlines(value) + text;\r\n }\r\n }\r\n return value.trim();\r\n }\r\n}\r\n\r\nclass JSDocTagImpl implements JSDocTag {\r\n name: string;\r\n content: JSDocParagraph;\r\n range: Range;\r\n inline: boolean;\r\n\r\n constructor(name: string, content: JSDocParagraph, inline: boolean, range: Range) {\r\n this.name = name;\r\n this.content = content;\r\n this.inline = inline;\r\n this.range = range;\r\n }\r\n\r\n toString(): string {\r\n let text = `@${this.name}`;\r\n const content = this.content.toString();\r\n if (this.content.inlines.length === 1) {\r\n text = `${text} ${content}`;\r\n } else if (this.content.inlines.length > 1) {\r\n text = `${text}\\n${content}`;\r\n }\r\n if (this.inline) {\r\n // Inline tags are surrounded by curly braces\r\n return `{${text}}`;\r\n } else {\r\n return text;\r\n }\r\n }\r\n\r\n toMarkdown(options?: JSDocRenderOptions): string {\r\n return options?.renderTag?.(this) ?? this.toMarkdownDefault(options);\r\n }\r\n\r\n private toMarkdownDefault(options?: JSDocRenderOptions): string {\r\n const content = this.content.toMarkdown(options);\r\n if (this.inline) {\r\n const rendered = renderInlineTag(this.name, content, options ?? {});\r\n if (typeof rendered === 'string') {\r\n return rendered;\r\n }\r\n }\r\n let marker = '';\r\n if (options?.tag === 'italic' || options?.tag === undefined) {\r\n marker = '*';\r\n } else if (options?.tag === 'bold') {\r\n marker = '**';\r\n } else if (options?.tag === 'bold-italic') {\r\n marker = '***';\r\n }\r\n let text = `${marker}@${this.name}${marker}`;\r\n if (this.content.inlines.length === 1) {\r\n text = `${text} \u2014 ${content}`;\r\n } else if (this.content.inlines.length > 1) {\r\n text = `${text}\\n${content}`;\r\n }\r\n if (this.inline) {\r\n // Inline tags are surrounded by curly braces\r\n return `{${text}}`;\r\n } else {\r\n return text;\r\n }\r\n }\r\n}\r\n\r\nfunction renderInlineTag(tag: string, content: string, options: JSDocRenderOptions): string | undefined {\r\n if (tag === 'linkplain' || tag === 'linkcode' || tag === 'link') {\r\n const index = content.indexOf(' ');\r\n let display = content;\r\n if (index > 0) {\r\n const displayStart = skipWhitespace(content, index);\r\n display = content.substring(displayStart);\r\n content = content.substring(0, index);\r\n }\r\n if (tag === 'linkcode' || (tag === 'link' && options.link === 'code')) {\r\n // Surround the display value in a markdown inline code block\r\n display = `\\`${display}\\``;\r\n }\r\n const renderedLink = options.renderLink?.(content, display) ?? renderLinkDefault(content, display);\r\n return renderedLink;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction renderLinkDefault(content: string, display: string): string {\r\n try {\r\n URI.parse(content, true);\r\n return `[${display}](${content})`;\r\n } catch {\r\n return content;\r\n }\r\n}\r\n\r\nclass JSDocTextImpl implements JSDocParagraph {\r\n inlines: JSDocInline[];\r\n range: Range;\r\n\r\n constructor(lines: JSDocInline[], range: Range) {\r\n this.inlines = lines;\r\n this.range = range;\r\n }\r\n\r\n toString(): string {\r\n let text = '';\r\n for (let i = 0; i < this.inlines.length; i++) {\r\n const inline = this.inlines[i];\r\n const next = this.inlines[i + 1];\r\n text += inline.toString();\r\n if (next && next.range.start.line > inline.range.start.line) {\r\n text += '\\n';\r\n }\r\n }\r\n return text;\r\n }\r\n\r\n toMarkdown(options?: JSDocRenderOptions): string {\r\n let text = '';\r\n for (let i = 0; i < this.inlines.length; i++) {\r\n const inline = this.inlines[i];\r\n const next = this.inlines[i + 1];\r\n text += inline.toMarkdown(options);\r\n if (next && next.range.start.line > inline.range.start.line) {\r\n text += '\\n';\r\n }\r\n }\r\n return text;\r\n }\r\n}\r\n\r\nclass JSDocLineImpl implements JSDocLine {\r\n text: string;\r\n range: Range;\r\n\r\n constructor(text: string, range: Range) {\r\n this.text = text;\r\n this.range = range;\r\n }\r\n\r\n toString(): string {\r\n return this.text;\r\n }\r\n toMarkdown(): string {\r\n return this.text;\r\n }\r\n\r\n}\r\n\r\nfunction fillNewlines(text: string): string {\r\n if (text.endsWith('\\n')) {\r\n return '\\n';\r\n } else {\r\n return '\\n\\n';\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode, AstNodeDescription } from '../syntax-tree.js';\r\nimport type { IndexManager } from '../workspace/index-manager.js';\r\nimport type { CommentProvider } from './comment-provider.js';\r\nimport type { JSDocTag } from './jsdoc.js';\r\nimport { getDocument } from '../utils/ast-utils.js';\r\nimport { isJSDoc, parseJSDoc } from './jsdoc.js';\r\n\r\n/**\r\n * Provides documentation for AST nodes.\r\n */\r\nexport interface DocumentationProvider {\r\n /**\r\n * Returns a markdown documentation string for the specified AST node.\r\n *\r\n * The default implementation `JSDocDocumentationProvider` will inspect the comment associated with the specified node.\r\n */\r\n getDocumentation(node: AstNode): string | undefined;\r\n}\r\n\r\nexport class JSDocDocumentationProvider implements DocumentationProvider {\r\n\r\n protected readonly indexManager: IndexManager;\r\n protected readonly commentProvider: CommentProvider;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.indexManager = services.shared.workspace.IndexManager;\r\n this.commentProvider = services.documentation.CommentProvider;\r\n }\r\n\r\n getDocumentation(node: AstNode): string | undefined {\r\n const comment = this.commentProvider.getComment(node);\r\n if (comment && isJSDoc(comment)) {\r\n const parsedJSDoc = parseJSDoc(comment);\r\n return parsedJSDoc.toMarkdown({\r\n renderLink: (link, display) => {\r\n return this.documentationLinkRenderer(node, link, display);\r\n },\r\n renderTag: (tag) => {\r\n return this.documentationTagRenderer(node, tag);\r\n }\r\n });\r\n }\r\n return undefined;\r\n }\r\n\r\n protected documentationLinkRenderer(node: AstNode, name: string, display: string): string | undefined {\r\n const description = this.findNameInPrecomputedScopes(node, name) ?? this.findNameInGlobalScope(node, name);\r\n if (description && description.nameSegment) {\r\n const line = description.nameSegment.range.start.line + 1;\r\n const character = description.nameSegment.range.start.character + 1;\r\n const uri = description.documentUri.with({ fragment: `L${line},${character}` });\r\n return `[${display}](${uri.toString()})`;\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n protected documentationTagRenderer(_node: AstNode, _tag: JSDocTag): string | undefined {\r\n // Fall back to the default tag rendering\r\n return undefined;\r\n }\r\n\r\n protected findNameInPrecomputedScopes(node: AstNode, name: string): AstNodeDescription | undefined {\r\n const document = getDocument(node);\r\n const precomputed = document.precomputedScopes;\r\n if (!precomputed) {\r\n return undefined;\r\n }\r\n let currentNode: AstNode | undefined = node;\r\n do {\r\n const allDescriptions = precomputed.get(currentNode);\r\n const description = allDescriptions.find(e => e.name === name);\r\n if (description) {\r\n return description;\r\n }\r\n currentNode = currentNode.$container;\r\n } while (currentNode);\r\n\r\n return undefined;\r\n }\r\n\r\n protected findNameInGlobalScope(node: AstNode, name: string): AstNodeDescription | undefined {\r\n const description = this.indexManager.allElements().find(e => e.name === name);\r\n return description;\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { GrammarConfig } from '../languages/grammar-config.js';\r\nimport { isAstNodeWithComment } from '../serializer/json-serializer.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode } from '../syntax-tree.js';\r\nimport { findCommentNode } from '../utils/cst-utils.js';\r\n\r\n/**\r\n * Provides comments for AST nodes.\r\n */\r\nexport interface CommentProvider {\r\n /**\r\n * Returns the comment associated with the specified AST node.\r\n * @param node The AST node to get the comment for.\r\n * @returns The comment associated with the specified AST node or `undefined` if there is no comment.\r\n */\r\n getComment(node: AstNode): string | undefined;\r\n}\r\n\r\nexport class DefaultCommentProvider implements CommentProvider {\r\n protected readonly grammarConfig: () => GrammarConfig;\r\n constructor(services: LangiumCoreServices) {\r\n this.grammarConfig = () => services.parser.GrammarConfig;\r\n }\r\n getComment(node: AstNode): string | undefined {\r\n if(isAstNodeWithComment(node)) {\r\n return node.$comment;\r\n }\r\n return findCommentNode(node.$cstNode, this.grammarConfig().multilineCommentRules)?.text;\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { CancellationToken } from '../utils/cancellation.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { AstNode } from '../syntax-tree.js';\r\nimport type { LangiumParser, ParseResult } from './langium-parser.js';\r\nimport type { Hydrator } from '../serializer/hydrator.js';\r\nimport type { Event } from '../utils/event.js';\r\nimport { Deferred, OperationCancelled } from '../utils/promise-utils.js';\r\nimport { Emitter } from '../utils/event.js';\r\n\r\n/**\r\n * Async parser that allows cancellation of the current parsing process.\r\n *\r\n * @remarks\r\n * The sync parser implementation is blocking the event loop, which can become quite problematic for large files.\r\n * The default implementation is not actually async. It just wraps the sync parser in a promise. A real implementation would create worker threads or web workers to offload the parsing work.\r\n */\r\nexport interface AsyncParser {\r\n /**\r\n * Parses the given text and returns the parse result.\r\n *\r\n * @param text The text to parse.\r\n * @param cancelToken A cancellation token that can be used to cancel the parsing process.\r\n * @returns A promise that resolves to the parse result.\r\n *\r\n * @throws `OperationCancelled` if the parsing process is cancelled.\r\n */\r\n parse<T extends AstNode>(text: string, cancelToken: CancellationToken): Promise<ParseResult<T>>;\r\n}\r\n\r\n/**\r\n * Default implementation of the async parser which simply wraps the sync parser in a promise.\r\n *\r\n * @remarks\r\n * A real implementation would create worker threads or web workers to offload the parsing work.\r\n */\r\nexport class DefaultAsyncParser implements AsyncParser {\r\n\r\n protected readonly syncParser: LangiumParser;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.syncParser = services.parser.LangiumParser;\r\n }\r\n\r\n parse<T extends AstNode>(text: string, _cancelToken: CancellationToken): Promise<ParseResult<T>> {\r\n return Promise.resolve(this.syncParser.parse<T>(text));\r\n }\r\n}\r\n\r\nexport abstract class AbstractThreadedAsyncParser implements AsyncParser {\r\n\r\n /**\r\n * The thread count determines how many threads are used to parse files in parallel.\r\n * The default value is 8. Decreasing this value increases startup performance, but decreases parallel parsing performance.\r\n */\r\n protected threadCount = 8;\r\n /**\r\n * The termination delay determines how long the parser waits for a thread to finish after a cancellation request.\r\n * The default value is 200(ms).\r\n */\r\n protected terminationDelay = 200;\r\n protected workerPool: ParserWorker[] = [];\r\n protected queue: Array<Deferred<ParserWorker>> = [];\r\n\r\n protected readonly hydrator: Hydrator;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.hydrator = services.serializer.Hydrator;\r\n }\r\n\r\n protected initializeWorkers(): void {\r\n while (this.workerPool.length < this.threadCount) {\r\n const worker = this.createWorker();\r\n worker.onReady(() => {\r\n if (this.queue.length > 0) {\r\n const deferred = this.queue.shift();\r\n if (deferred) {\r\n worker.lock();\r\n deferred.resolve(worker);\r\n }\r\n }\r\n });\r\n this.workerPool.push(worker);\r\n }\r\n }\r\n\r\n async parse<T extends AstNode>(text: string, cancelToken: CancellationToken): Promise<ParseResult<T>> {\r\n const worker = await this.acquireParserWorker(cancelToken);\r\n const deferred = new Deferred<ParseResult<T>>();\r\n let timeout: NodeJS.Timeout | undefined;\r\n // If the cancellation token is requested, we wait for a certain time before terminating the worker.\r\n // Since the cancellation token lives longer than the parsing process, we need to dispose the event listener.\r\n // Otherwise, we might accidentally terminate the worker after the parsing process has finished.\r\n const cancellation = cancelToken.onCancellationRequested(() => {\r\n timeout = setTimeout(() => {\r\n this.terminateWorker(worker);\r\n }, this.terminationDelay);\r\n });\r\n worker.parse(text).then(result => {\r\n const hydrated = this.hydrator.hydrate<T>(result);\r\n deferred.resolve(hydrated);\r\n }).catch(err => {\r\n deferred.reject(err);\r\n }).finally(() => {\r\n cancellation.dispose();\r\n clearTimeout(timeout);\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n protected terminateWorker(worker: ParserWorker): void {\r\n worker.terminate();\r\n const index = this.workerPool.indexOf(worker);\r\n if (index >= 0) {\r\n this.workerPool.splice(index, 1);\r\n }\r\n }\r\n\r\n protected async acquireParserWorker(cancelToken: CancellationToken): Promise<ParserWorker> {\r\n this.initializeWorkers();\r\n for (const worker of this.workerPool) {\r\n if (worker.ready) {\r\n worker.lock();\r\n return worker;\r\n }\r\n }\r\n const deferred = new Deferred<ParserWorker>();\r\n cancelToken.onCancellationRequested(() => {\r\n const index = this.queue.indexOf(deferred);\r\n if (index >= 0) {\r\n this.queue.splice(index, 1);\r\n }\r\n deferred.reject(OperationCancelled);\r\n });\r\n this.queue.push(deferred);\r\n return deferred.promise;\r\n }\r\n\r\n protected abstract createWorker(): ParserWorker;\r\n}\r\n\r\nexport type WorkerMessagePost = (message: unknown) => void;\r\nexport type WorkerMessageCallback = (cb: (message: unknown) => void) => void;\r\n\r\nexport class ParserWorker {\r\n\r\n protected readonly sendMessage: WorkerMessagePost;\r\n protected readonly _terminate: () => void;\r\n protected readonly onReadyEmitter = new Emitter<void>();\r\n\r\n protected deferred = new Deferred<ParseResult>();\r\n protected _ready = true;\r\n protected _parsing = false;\r\n\r\n get ready(): boolean {\r\n return this._ready;\r\n }\r\n\r\n get onReady(): Event<void> {\r\n return this.onReadyEmitter.event;\r\n }\r\n\r\n constructor(sendMessage: WorkerMessagePost, onMessage: WorkerMessageCallback, onError: WorkerMessageCallback, terminate: () => void) {\r\n this.sendMessage = sendMessage;\r\n this._terminate = terminate;\r\n onMessage(result => {\r\n const parseResult = result as ParseResult;\r\n this.deferred.resolve(parseResult);\r\n this.unlock();\r\n });\r\n onError(error => {\r\n this.deferred.reject(error);\r\n this.unlock();\r\n });\r\n }\r\n\r\n terminate(): void {\r\n this.deferred.reject(OperationCancelled);\r\n this._terminate();\r\n }\r\n\r\n lock(): void {\r\n this._ready = false;\r\n }\r\n\r\n unlock(): void {\r\n this._parsing = false;\r\n this._ready = true;\r\n this.onReadyEmitter.fire();\r\n }\r\n\r\n parse(text: string): Promise<ParseResult> {\r\n if (this._parsing) {\r\n throw new Error('Parser worker is busy');\r\n }\r\n this._parsing = true;\r\n this.deferred = new Deferred();\r\n this.sendMessage(text);\r\n return this.deferred.promise;\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { type AbstractCancellationTokenSource, CancellationToken, CancellationTokenSource } from '../utils/cancellation.js';\r\nimport { Deferred, isOperationCancelled, startCancelableOperation, type MaybePromise } from '../utils/promise-utils.js';\r\n\r\n/**\r\n * Utility service to execute mutually exclusive actions.\r\n */\r\nexport interface WorkspaceLock {\r\n /**\r\n * Performs a single async action, like initializing the workspace or processing document changes.\r\n * Only one action will be executed at a time.\r\n *\r\n * When another action is queued up, the token provided for the action will be cancelled.\r\n * Assuming the action makes use of this token, the next action only has to wait for the current action to finish cancellation.\r\n */\r\n write(action: (token: CancellationToken) => MaybePromise<void>): Promise<void>;\r\n\r\n /**\r\n * Performs a single action, like computing completion results or providing workspace symbols.\r\n * Read actions will only be executed after all write actions have finished. They will be executed in parallel if possible.\r\n *\r\n * If a write action is currently running, the read action will be queued up and executed afterwards.\r\n * If a new write action is queued up while a read action is waiting, the write action will receive priority and will be handled before the read action.\r\n *\r\n * Note that read actions are not allowed to modify anything in the workspace. Please use {@link write} instead.\r\n */\r\n read<T>(action: () => MaybePromise<T>): Promise<T>;\r\n\r\n /**\r\n * Cancels the last queued write action. All previous write actions already have been cancelled.\r\n */\r\n cancelWrite(): void;\r\n}\r\n\r\ntype LockAction<T = void> = (token: CancellationToken) => MaybePromise<T>;\r\n\r\ninterface LockEntry {\r\n action: LockAction<unknown>;\r\n deferred: Deferred<unknown>;\r\n cancellationToken: CancellationToken;\r\n}\r\n\r\nexport class DefaultWorkspaceLock implements WorkspaceLock {\r\n\r\n private previousTokenSource: AbstractCancellationTokenSource = new CancellationTokenSource();\r\n private writeQueue: LockEntry[] = [];\r\n private readQueue: LockEntry[] = [];\r\n private done = true;\r\n\r\n write(action: (token: CancellationToken) => MaybePromise<void>): Promise<void> {\r\n this.cancelWrite();\r\n const tokenSource = startCancelableOperation();\r\n this.previousTokenSource = tokenSource;\r\n return this.enqueue(this.writeQueue, action, tokenSource.token);\r\n }\r\n\r\n read<T>(action: () => MaybePromise<T>): Promise<T> {\r\n return this.enqueue(this.readQueue, action);\r\n }\r\n\r\n private enqueue<T = void>(queue: LockEntry[], action: LockAction<T>, cancellationToken = CancellationToken.None): Promise<T> {\r\n const deferred = new Deferred<unknown>();\r\n const entry: LockEntry = {\r\n action,\r\n deferred,\r\n cancellationToken\r\n };\r\n queue.push(entry);\r\n this.performNextOperation();\r\n return deferred.promise as Promise<T>;\r\n }\r\n\r\n private async performNextOperation(): Promise<void> {\r\n if (!this.done) {\r\n return;\r\n }\r\n const entries: LockEntry[] = [];\r\n if (this.writeQueue.length > 0) {\r\n // Just perform the next write action\r\n entries.push(this.writeQueue.shift()!);\r\n } else if (this.readQueue.length > 0) {\r\n // Empty the read queue and perform all actions in parallel\r\n entries.push(...this.readQueue.splice(0, this.readQueue.length));\r\n } else {\r\n return;\r\n }\r\n this.done = false;\r\n await Promise.all(entries.map(async ({ action, deferred, cancellationToken }) => {\r\n try {\r\n // Move the execution of the action to the next event loop tick via `Promise.resolve()`\r\n const result = await Promise.resolve().then(() => action(cancellationToken));\r\n deferred.resolve(result);\r\n } catch (err) {\r\n if (isOperationCancelled(err)) {\r\n // If the operation was cancelled, we don't want to reject the promise\r\n deferred.resolve(undefined);\r\n } else {\r\n deferred.reject(err);\r\n }\r\n }\r\n }));\r\n this.done = true;\r\n this.performNextOperation();\r\n }\r\n\r\n cancelWrite(): void {\r\n this.previousTokenSource.cancel();\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2024 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport type { TokenType } from 'chevrotain';\r\nimport { CompositeCstNodeImpl, LeafCstNodeImpl, RootCstNodeImpl } from '../parser/cst-node-builder.js';\r\nimport { isAbstractElement, type AbstractElement, type Grammar } from '../languages/generated/ast.js';\r\nimport type { Linker } from '../references/linker.js';\r\nimport type { Lexer } from '../parser/lexer.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport type { ParseResult } from '../parser/langium-parser.js';\r\nimport type { Reference, AstNode, CstNode, LeafCstNode, GenericAstNode, Mutable, RootCstNode } from '../syntax-tree.js';\r\nimport { isRootCstNode, isCompositeCstNode, isLeafCstNode, isAstNode, isReference } from '../syntax-tree.js';\r\nimport { streamAst } from '../utils/ast-utils.js';\r\nimport { BiMap } from '../utils/collections.js';\r\nimport { streamCst } from '../utils/cst-utils.js';\r\nimport type { LexingReport } from '../parser/token-builder.js';\r\n\r\n/**\r\n * The hydrator service is responsible for allowing AST parse results to be sent across worker threads.\r\n */\r\nexport interface Hydrator {\r\n /**\r\n * Converts a parse result to a plain object. The resulting object can be sent across worker threads.\r\n */\r\n dehydrate(result: ParseResult<AstNode>): ParseResult<object>;\r\n /**\r\n * Converts a plain object to a parse result. The included AST node can then be used in the main thread.\r\n * Calling this method on objects that have not been dehydrated first will result in undefined behavior.\r\n */\r\n hydrate<T extends AstNode = AstNode>(result: ParseResult<object>): ParseResult<T>;\r\n}\r\n\r\nexport interface DehydrateContext {\r\n astNodes: Map<AstNode, any>;\r\n cstNodes: Map<CstNode, any>;\r\n}\r\n\r\nexport interface HydrateContext {\r\n astNodes: Map<any, AstNode>;\r\n cstNodes: Map<any, CstNode>;\r\n}\r\n\r\nexport class DefaultHydrator implements Hydrator {\r\n\r\n protected readonly grammar: Grammar;\r\n protected readonly lexer: Lexer;\r\n protected readonly linker: Linker;\r\n\r\n protected readonly grammarElementIdMap = new BiMap<AbstractElement, number>();\r\n protected readonly tokenTypeIdMap = new BiMap<number, TokenType>();\r\n\r\n constructor(services: LangiumCoreServices) {\r\n this.grammar = services.Grammar;\r\n this.lexer = services.parser.Lexer;\r\n this.linker = services.references.Linker;\r\n }\r\n\r\n dehydrate(result: ParseResult<AstNode>): ParseResult<object> {\r\n return {\r\n lexerErrors: result.lexerErrors,\r\n lexerReport: result.lexerReport ? this.dehydrateLexerReport(result.lexerReport) : undefined,\r\n // We need to create shallow copies of the errors\r\n // The original errors inherit from the `Error` class, which is not transferable across worker threads\r\n parserErrors: result.parserErrors.map(e => ({ ...e, message: e.message })),\r\n value: this.dehydrateAstNode(result.value, this.createDehyrationContext(result.value))\r\n };\r\n }\r\n\r\n protected dehydrateLexerReport(lexerReport: LexingReport): LexingReport {\r\n // By default, lexer reports are serializable\r\n return lexerReport;\r\n }\r\n\r\n protected createDehyrationContext(node: AstNode): DehydrateContext {\r\n const astNodes = new Map<AstNode, any>();\r\n const cstNodes = new Map<CstNode, any>();\r\n for (const astNode of streamAst(node)) {\r\n astNodes.set(astNode, {});\r\n }\r\n if (node.$cstNode) {\r\n for (const cstNode of streamCst(node.$cstNode)) {\r\n cstNodes.set(cstNode, {});\r\n }\r\n }\r\n return {\r\n astNodes,\r\n cstNodes\r\n };\r\n }\r\n\r\n protected dehydrateAstNode(node: AstNode, context: DehydrateContext): object {\r\n const obj = context.astNodes.get(node) as Record<string, any>;\r\n obj.$type = node.$type;\r\n obj.$containerIndex = node.$containerIndex;\r\n obj.$containerProperty = node.$containerProperty;\r\n if (node.$cstNode !== undefined) {\r\n obj.$cstNode = this.dehydrateCstNode(node.$cstNode, context);\r\n }\r\n for (const [name, value] of Object.entries(node)) {\r\n if (name.startsWith('$')) {\r\n continue;\r\n }\r\n if (Array.isArray(value)) {\r\n const arr: any[] = [];\r\n obj[name] = arr;\r\n for (const item of value) {\r\n if (isAstNode(item)) {\r\n arr.push(this.dehydrateAstNode(item, context));\r\n } else if (isReference(item)) {\r\n arr.push(this.dehydrateReference(item, context));\r\n } else {\r\n arr.push(item);\r\n }\r\n }\r\n } else if (isAstNode(value)) {\r\n obj[name] = this.dehydrateAstNode(value, context);\r\n } else if (isReference(value)) {\r\n obj[name] = this.dehydrateReference(value, context);\r\n } else if (value !== undefined) {\r\n obj[name] = value;\r\n }\r\n }\r\n return obj;\r\n }\r\n\r\n protected dehydrateReference(reference: Reference, context: DehydrateContext): any {\r\n const obj: Record<string, unknown> = {};\r\n obj.$refText = reference.$refText;\r\n if (reference.$refNode) {\r\n obj.$refNode = context.cstNodes.get(reference.$refNode);\r\n }\r\n return obj;\r\n }\r\n\r\n protected dehydrateCstNode(node: CstNode, context: DehydrateContext): any {\r\n const cstNode = context.cstNodes.get(node) as Record<string, any>;\r\n if (isRootCstNode(node)) {\r\n cstNode.fullText = node.fullText;\r\n } else {\r\n // Note: This returns undefined for hidden nodes (i.e. comments)\r\n cstNode.grammarSource = this.getGrammarElementId(node.grammarSource);\r\n }\r\n cstNode.hidden = node.hidden;\r\n cstNode.astNode = context.astNodes.get(node.astNode);\r\n if (isCompositeCstNode(node)) {\r\n cstNode.content = node.content.map(child => this.dehydrateCstNode(child, context));\r\n } else if (isLeafCstNode(node)) {\r\n cstNode.tokenType = node.tokenType.name;\r\n cstNode.offset = node.offset;\r\n cstNode.length = node.length;\r\n cstNode.startLine = node.range.start.line;\r\n cstNode.startColumn = node.range.start.character;\r\n cstNode.endLine = node.range.end.line;\r\n cstNode.endColumn = node.range.end.character;\r\n }\r\n return cstNode;\r\n }\r\n\r\n hydrate<T extends AstNode = AstNode>(result: ParseResult<object>): ParseResult<T> {\r\n const node = result.value;\r\n const context = this.createHydrationContext(node);\r\n if ('$cstNode' in node) {\r\n this.hydrateCstNode(node.$cstNode, context);\r\n }\r\n return {\r\n lexerErrors: result.lexerErrors,\r\n lexerReport: result.lexerReport,\r\n parserErrors: result.parserErrors,\r\n value: this.hydrateAstNode(node, context) as T\r\n };\r\n }\r\n\r\n protected createHydrationContext(node: any): HydrateContext {\r\n const astNodes = new Map<any, AstNode>();\r\n const cstNodes = new Map<any, CstNode>();\r\n for (const astNode of streamAst(node)) {\r\n astNodes.set(astNode, {} as AstNode);\r\n }\r\n let root: RootCstNode;\r\n if (node.$cstNode) {\r\n for (const cstNode of streamCst(node.$cstNode)) {\r\n let cst: Mutable<CstNode> | undefined;\r\n if ('fullText' in cstNode) {\r\n cst = new RootCstNodeImpl(cstNode.fullText as string);\r\n root = cst as RootCstNode;\r\n } else if ('content' in cstNode) {\r\n cst = new CompositeCstNodeImpl();\r\n } else if ('tokenType' in cstNode) {\r\n cst = this.hydrateCstLeafNode(cstNode);\r\n }\r\n if (cst) {\r\n cstNodes.set(cstNode, cst);\r\n cst.root = root!;\r\n }\r\n }\r\n }\r\n return {\r\n astNodes,\r\n cstNodes\r\n };\r\n }\r\n\r\n protected hydrateAstNode(node: any, context: HydrateContext): AstNode {\r\n const astNode = context.astNodes.get(node) as Mutable<GenericAstNode>;\r\n astNode.$type = node.$type;\r\n astNode.$containerIndex = node.$containerIndex;\r\n astNode.$containerProperty = node.$containerProperty;\r\n if (node.$cstNode) {\r\n astNode.$cstNode = context.cstNodes.get(node.$cstNode);\r\n }\r\n for (const [name, value] of Object.entries(node)) {\r\n if (name.startsWith('$')) {\r\n continue;\r\n }\r\n if (Array.isArray(value)) {\r\n const arr: unknown[] = [];\r\n astNode[name] = arr;\r\n for (const item of value) {\r\n if (isAstNode(item)) {\r\n arr.push(this.setParent(this.hydrateAstNode(item, context), astNode));\r\n } else if (isReference(item)) {\r\n arr.push(this.hydrateReference(item, astNode, name, context));\r\n } else {\r\n arr.push(item);\r\n }\r\n }\r\n } else if (isAstNode(value)) {\r\n astNode[name] = this.setParent(this.hydrateAstNode(value, context), astNode);\r\n } else if (isReference(value)) {\r\n astNode[name] = this.hydrateReference(value, astNode, name, context);\r\n } else if (value !== undefined) {\r\n astNode[name] = value;\r\n }\r\n }\r\n return astNode;\r\n }\r\n\r\n protected setParent(node: any, parent: any): any {\r\n node.$container = parent as AstNode;\r\n return node;\r\n }\r\n\r\n protected hydrateReference(reference: any, node: AstNode, name: string, context: HydrateContext): Reference {\r\n return this.linker.buildReference(node, name, context.cstNodes.get(reference.$refNode)!, reference.$refText);\r\n }\r\n\r\n protected hydrateCstNode(cstNode: any, context: HydrateContext, num = 0): CstNode {\r\n const cstNodeObj = context.cstNodes.get(cstNode) as Mutable<CstNode>;\r\n if (typeof cstNode.grammarSource === 'number') {\r\n cstNodeObj.grammarSource = this.getGrammarElement(cstNode.grammarSource);\r\n }\r\n cstNodeObj.astNode = context.astNodes.get(cstNode.astNode)!;\r\n if (isCompositeCstNode(cstNodeObj)) {\r\n for (const child of cstNode.content) {\r\n const hydrated = this.hydrateCstNode(child, context, num++);\r\n cstNodeObj.content.push(hydrated);\r\n }\r\n }\r\n return cstNodeObj;\r\n }\r\n\r\n protected hydrateCstLeafNode(cstNode: any): LeafCstNode {\r\n const tokenType = this.getTokenType(cstNode.tokenType);\r\n const offset = cstNode.offset;\r\n const length = cstNode.length;\r\n const startLine = cstNode.startLine;\r\n const startColumn = cstNode.startColumn;\r\n const endLine = cstNode.endLine;\r\n const endColumn = cstNode.endColumn;\r\n const hidden = cstNode.hidden;\r\n const node = new LeafCstNodeImpl(\r\n offset,\r\n length,\r\n {\r\n start: {\r\n line: startLine,\r\n character: startColumn\r\n },\r\n end: {\r\n line: endLine,\r\n character: endColumn\r\n }\r\n },\r\n tokenType,\r\n hidden\r\n );\r\n return node;\r\n }\r\n\r\n protected getTokenType(name: string): TokenType {\r\n return this.lexer.definition[name];\r\n }\r\n\r\n protected getGrammarElementId(node: AbstractElement | undefined): number | undefined {\r\n if (!node) {\r\n return undefined;\r\n }\r\n if (this.grammarElementIdMap.size === 0) {\r\n this.createGrammarElementIdMap();\r\n }\r\n return this.grammarElementIdMap.get(node);\r\n }\r\n\r\n protected getGrammarElement(id: number): AbstractElement | undefined {\r\n if (this.grammarElementIdMap.size === 0) {\r\n this.createGrammarElementIdMap();\r\n }\r\n const element = this.grammarElementIdMap.getKey(id);\r\n return element;\r\n }\r\n\r\n protected createGrammarElementIdMap(): void {\r\n let id = 0;\r\n for (const element of streamAst(this.grammar)) {\r\n if (isAbstractElement(element)) {\r\n this.grammarElementIdMap.set(element, id++);\r\n }\r\n }\r\n }\r\n\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n******************************************************************************/\r\n\r\nimport type { Module } from './dependency-injection.js';\r\nimport type { LangiumDefaultCoreServices, LangiumDefaultSharedCoreServices, LangiumCoreServices, LangiumSharedCoreServices } from './services.js';\r\nimport type { FileSystemProvider } from './workspace/file-system-provider.js';\r\nimport { createGrammarConfig } from './languages/grammar-config.js';\r\nimport { createCompletionParser } from './parser/completion-parser-builder.js';\r\nimport { createLangiumParser } from './parser/langium-parser-builder.js';\r\nimport { DefaultTokenBuilder } from './parser/token-builder.js';\r\nimport { DefaultValueConverter } from './parser/value-converter.js';\r\nimport { DefaultLinker } from './references/linker.js';\r\nimport { DefaultNameProvider } from './references/name-provider.js';\r\nimport { DefaultReferences } from './references/references.js';\r\nimport { DefaultScopeComputation } from './references/scope-computation.js';\r\nimport { DefaultScopeProvider } from './references/scope-provider.js';\r\nimport { DefaultJsonSerializer } from './serializer/json-serializer.js';\r\nimport { DefaultServiceRegistry } from './service-registry.js';\r\nimport { DefaultDocumentValidator } from './validation/document-validator.js';\r\nimport { ValidationRegistry } from './validation/validation-registry.js';\r\nimport { DefaultAstNodeDescriptionProvider, DefaultReferenceDescriptionProvider } from './workspace/ast-descriptions.js';\r\nimport { DefaultAstNodeLocator } from './workspace/ast-node-locator.js';\r\nimport { DefaultConfigurationProvider } from './workspace/configuration.js';\r\nimport { DefaultDocumentBuilder } from './workspace/document-builder.js';\r\nimport { DefaultLangiumDocumentFactory, DefaultLangiumDocuments } from './workspace/documents.js';\r\nimport { DefaultIndexManager } from './workspace/index-manager.js';\r\nimport { DefaultWorkspaceManager } from './workspace/workspace-manager.js';\r\nimport { DefaultLexer, DefaultLexerErrorMessageProvider } from './parser/lexer.js';\r\nimport { JSDocDocumentationProvider } from './documentation/documentation-provider.js';\r\nimport { DefaultCommentProvider } from './documentation/comment-provider.js';\r\nimport { LangiumParserErrorMessageProvider } from './parser/langium-parser.js';\r\nimport { DefaultAsyncParser } from './parser/async-parser.js';\r\nimport { DefaultWorkspaceLock } from './workspace/workspace-lock.js';\r\nimport { DefaultHydrator } from './serializer/hydrator.js';\r\n\r\n/**\r\n * Context required for creating the default language-specific dependency injection module.\r\n */\r\nexport interface DefaultCoreModuleContext {\r\n shared: LangiumSharedCoreServices;\r\n}\r\n\r\n/**\r\n * Creates a dependency injection module configuring the default core services.\r\n * This is a set of services that are dedicated to a specific language.\r\n */\r\nexport function createDefaultCoreModule(context: DefaultCoreModuleContext): Module<LangiumCoreServices, LangiumDefaultCoreServices> {\r\n return {\r\n documentation: {\r\n CommentProvider: (services) => new DefaultCommentProvider(services),\r\n DocumentationProvider: (services) => new JSDocDocumentationProvider(services)\r\n },\r\n parser: {\r\n AsyncParser: (services) => new DefaultAsyncParser(services),\r\n GrammarConfig: (services) => createGrammarConfig(services),\r\n LangiumParser: (services) => createLangiumParser(services),\r\n CompletionParser: (services) => createCompletionParser(services),\r\n ValueConverter: () => new DefaultValueConverter(),\r\n TokenBuilder: () => new DefaultTokenBuilder(),\r\n Lexer: (services) => new DefaultLexer(services),\r\n ParserErrorMessageProvider: () => new LangiumParserErrorMessageProvider(),\r\n LexerErrorMessageProvider: () => new DefaultLexerErrorMessageProvider()\r\n },\r\n workspace: {\r\n AstNodeLocator: () => new DefaultAstNodeLocator(),\r\n AstNodeDescriptionProvider: (services) => new DefaultAstNodeDescriptionProvider(services),\r\n ReferenceDescriptionProvider: (services) => new DefaultReferenceDescriptionProvider(services)\r\n },\r\n references: {\r\n Linker: (services) => new DefaultLinker(services),\r\n NameProvider: () => new DefaultNameProvider(),\r\n ScopeProvider: (services) => new DefaultScopeProvider(services),\r\n ScopeComputation: (services) => new DefaultScopeComputation(services),\r\n References: (services) => new DefaultReferences(services)\r\n },\r\n serializer: {\r\n Hydrator: (services) => new DefaultHydrator(services),\r\n JsonSerializer: (services) => new DefaultJsonSerializer(services)\r\n },\r\n validation: {\r\n DocumentValidator: (services) => new DefaultDocumentValidator(services),\r\n ValidationRegistry: (services) => new ValidationRegistry(services)\r\n },\r\n shared: () => context.shared\r\n };\r\n}\r\n\r\n/**\r\n * Context required for creating the default shared dependency injection module.\r\n */\r\nexport interface DefaultSharedCoreModuleContext {\r\n /**\r\n * Factory function to create a {@link FileSystemProvider}.\r\n *\r\n * Langium exposes an `EmptyFileSystem` and `NodeFileSystem`, exported through `langium/node`.\r\n * When running Langium as part of a vscode language server or a Node.js app, using the `NodeFileSystem` is recommended,\r\n * the `EmptyFileSystem` in every other use case.\r\n */\r\n fileSystemProvider: (services: LangiumSharedCoreServices) => FileSystemProvider;\r\n}\r\n\r\n/**\r\n * Creates a dependency injection module configuring the default shared core services.\r\n * This is the set of services that are shared between multiple languages.\r\n */\r\nexport function createDefaultSharedCoreModule(context: DefaultSharedCoreModuleContext): Module<LangiumSharedCoreServices, LangiumDefaultSharedCoreServices> {\r\n return {\r\n ServiceRegistry: (services) => new DefaultServiceRegistry(services),\r\n workspace: {\r\n LangiumDocuments: (services) => new DefaultLangiumDocuments(services),\r\n LangiumDocumentFactory: (services) => new DefaultLangiumDocumentFactory(services),\r\n DocumentBuilder: (services) => new DefaultDocumentBuilder(services),\r\n IndexManager: (services) => new DefaultIndexManager(services),\r\n WorkspaceManager: (services) => new DefaultWorkspaceManager(services),\r\n FileSystemProvider: (services) => context.fileSystemProvider(services),\r\n WorkspaceLock: () => new DefaultWorkspaceLock(),\r\n ConfigurationProvider: (services) => new DefaultConfigurationProvider(services)\r\n }\r\n };\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2021 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\n/**\r\n * A `Module<I>` is a description of possibly grouped service factories.\r\n *\r\n * Given a type I = { group: { service: A } },\r\n * Module<I> := { group: { service: (injector: I) => A } }\r\n *\r\n * Making `I` available during the creation of `I` allows us to create cyclic\r\n * dependencies.\r\n */\r\nexport type Module<I, T = I> = {\r\n [K in keyof T]: Module<I, T[K]> | ((injector: I) => T[K])\r\n}\r\n\r\nexport namespace Module {\r\n export const merge = <M1, M2, R extends M1 & M2>(m1: Module<R, M1>, m2: Module<R, M2>) => (_merge(_merge({}, m1), m2) as Module<R, M1 & M2>);\r\n}\r\n\r\n/**\r\n * Given a set of modules, the inject function returns a lazily evaluated injector\r\n * that injects dependencies into the requested service when it is requested the\r\n * first time. Subsequent requests will return the same service.\r\n *\r\n * In the case of cyclic dependencies, an Error will be thrown. This can be fixed\r\n * by injecting a provider `() => T` instead of a `T`.\r\n *\r\n * Please note that the arguments may be objects or arrays. However, the result will\r\n * be an object. Using it with for..of will have no effect.\r\n *\r\n * @param module1 first Module\r\n * @param module2 (optional) second Module\r\n * @param module3 (optional) third Module\r\n * @param module4 (optional) fourth Module\r\n * @param module5 (optional) fifth Module\r\n * @param module6 (optional) sixth Module\r\n * @param module7 (optional) seventh Module\r\n * @param module8 (optional) eighth Module\r\n * @param module9 (optional) ninth Module\r\n * @returns a new object of type I\r\n */\r\nexport function inject<I1, I2, I3, I4, I5, I6, I7, I8, I9, I extends I1 & I2 & I3 & I4 & I5 & I6 & I7 & I8 & I9>(\r\n module1: Module<I, I1>, module2?: Module<I, I2>, module3?: Module<I, I3>, module4?: Module<I, I4>, module5?: Module<I, I5>, module6?: Module<I, I6>, module7?: Module<I, I7>, module8?: Module<I, I8>, module9?: Module<I, I9>\r\n): I {\r\n const module = [module1, module2, module3, module4, module5, module6, module7, module8, module9].reduce(_merge, {}) as Module<I>;\r\n return _inject(module);\r\n}\r\n\r\nconst isProxy = Symbol('isProxy');\r\n\r\n/**\r\n * Eagerly load all services in the given dependency injection container. This is sometimes\r\n * necessary because services can register event listeners in their constructors.\r\n */\r\nexport function eagerLoad<T>(item: T): T {\r\n if (item && (item as any)[isProxy]) {\r\n for (const value of Object.values(item)) {\r\n eagerLoad(value);\r\n }\r\n }\r\n return item;\r\n}\r\n\r\n/**\r\n * Helper function that returns an injector by creating a proxy.\r\n * Invariant: injector is of type I. If injector is undefined, then T = I.\r\n */\r\nfunction _inject<I, T>(module: Module<I, T>, injector?: any): T {\r\n const proxy: any = new Proxy({} as any, {\r\n deleteProperty: () => false,\r\n set: () => {\r\n throw new Error('Cannot set property on injected service container');\r\n },\r\n get: (obj, prop) => {\r\n if (prop === isProxy) {\r\n return true;\r\n } else {\r\n return _resolve(obj, prop, module, injector || proxy);\r\n }\r\n },\r\n getOwnPropertyDescriptor: (obj, prop) => (_resolve(obj, prop, module, injector || proxy), Object.getOwnPropertyDescriptor(obj, prop)), // used by for..in\r\n has: (_, prop) => prop in module, // used by ..in..\r\n ownKeys: () => [...Object.getOwnPropertyNames(module)] // used by for..in\r\n });\r\n return proxy;\r\n}\r\n\r\n/**\r\n * Internally used to tag a requested dependency, directly before calling the factory.\r\n * This allows us to find cycles during instance creation.\r\n */\r\nconst __requested__ = Symbol();\r\n\r\n/**\r\n * Returns the value `obj[prop]`. If the value does not exist, yet, it is resolved from\r\n * the module description. The result of service factories is cached. Groups are\r\n * recursively proxied.\r\n *\r\n * @param obj an object holding all group proxies and services\r\n * @param prop the key of a value within obj\r\n * @param module an object containing groups and service factories\r\n * @param injector the first level proxy that provides access to all values\r\n * @returns the requested value `obj[prop]`\r\n * @throws Error if a dependency cycle is detected\r\n */\r\nfunction _resolve<I, T>(obj: any, prop: string | symbol | number, module: Module<I, T>, injector: I): T[keyof T] | undefined {\r\n if (prop in obj) {\r\n if (obj[prop] instanceof Error) {\r\n throw new Error('Construction failure. Please make sure that your dependencies are constructable.', {cause: obj[prop]});\r\n }\r\n if (obj[prop] === __requested__) {\r\n throw new Error('Cycle detected. Please make \"' + String(prop) + '\" lazy. Visit https://langium.org/docs/reference/configuration-services/#resolving-cyclic-dependencies');\r\n }\r\n return obj[prop];\r\n } else if (prop in module) {\r\n const value: Module<I, T[keyof T]> | ((injector: I) => T[keyof T]) = module[prop as keyof T];\r\n obj[prop] = __requested__;\r\n try {\r\n obj[prop] = (typeof value === 'function') ? value(injector) : _inject(value, injector);\r\n } catch (error) {\r\n obj[prop] = error instanceof Error ? error : undefined;\r\n throw error;\r\n }\r\n return obj[prop];\r\n } else {\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Performs a deep-merge of two modules by writing source entries into the target module.\r\n *\r\n * @param target the module which is written\r\n * @param source the module which is read\r\n * @returns the target module\r\n */\r\nfunction _merge(target: Module<any>, source?: Module<any>): Module<unknown> {\r\n if (source) {\r\n for (const [key, value2] of Object.entries(source)) {\r\n if (value2 !== undefined) {\r\n const value1 = target[key];\r\n if (value1 !== null && value2 !== null && typeof value1 === 'object' && typeof value2 === 'object') {\r\n target[key] = _merge(value1, value2);\r\n } else {\r\n target[key] = value2;\r\n }\r\n }\r\n }\r\n }\r\n return target;\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2024 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { CustomPatternMatcherFunc, TokenType, IToken, IMultiModeLexerDefinition, TokenVocabulary } from 'chevrotain';\r\nimport type { Grammar, TerminalRule } from '../languages/generated/ast.js';\r\nimport type { LexingReport, TokenBuilderOptions } from './token-builder.js';\r\nimport type { LexerResult, TokenizeOptions } from './lexer.js';\r\nimport type { LangiumCoreServices } from '../services.js';\r\nimport { createToken, createTokenInstance, Lexer } from 'chevrotain';\r\nimport { DefaultTokenBuilder } from './token-builder.js';\r\nimport { DEFAULT_TOKENIZE_OPTIONS, DefaultLexer, isTokenTypeArray } from './lexer.js';\r\n\r\ntype IndentationAwareDelimiter<TokenName extends string> = [begin: TokenName, end: TokenName];\r\n\r\nexport interface IndentationTokenBuilderOptions<TerminalName extends string = string, KeywordName extends string = string> {\r\n /**\r\n * The name of the token used to denote indentation in the grammar.\r\n * A possible definition in the grammar could look like this:\r\n * ```langium\r\n * terminal INDENT: ':synthetic-indent:';\r\n * ```\r\n *\r\n * @default 'INDENT'\r\n */\r\n indentTokenName: TerminalName;\r\n /**\r\n * The name of the token used to denote deindentation in the grammar.\r\n * A possible definition in the grammar could look like this:\r\n * ```langium\r\n * terminal DEDENT: ':synthetic-dedent:';\r\n * ```\r\n *\r\n * @default 'DEDENT'\r\n */\r\n dedentTokenName: TerminalName;\r\n /**\r\n * The name of the token used to denote whitespace other than indentation and newlines in the grammar.\r\n * A possible definition in the grammar could look like this:\r\n * ```langium\r\n * hidden terminal WS: /[ \\t]+/;\r\n * ```\r\n *\r\n * @default 'WS'\r\n */\r\n whitespaceTokenName: TerminalName;\r\n /**\r\n * The delimiter tokens inside of which indentation should be ignored and treated as normal whitespace.\r\n * For example, Python doesn't treat any whitespace between `(` and `)` as significant.\r\n *\r\n * Can be either terminal tokens or keyword tokens.\r\n *\r\n * @default []\r\n */\r\n ignoreIndentationDelimiters: Array<IndentationAwareDelimiter<TerminalName | KeywordName>>\r\n}\r\n\r\nexport const indentationBuilderDefaultOptions: IndentationTokenBuilderOptions = {\r\n indentTokenName: 'INDENT',\r\n dedentTokenName: 'DEDENT',\r\n whitespaceTokenName: 'WS',\r\n ignoreIndentationDelimiters: [],\r\n};\r\n\r\nexport enum LexingMode {\r\n REGULAR = 'indentation-sensitive',\r\n IGNORE_INDENTATION = 'ignore-indentation',\r\n}\r\n\r\nexport interface IndentationLexingReport extends LexingReport {\r\n /** Dedent tokens that are necessary to close the remaining indents. */\r\n remainingDedents: IToken[];\r\n}\r\n\r\n/**\r\n * A token builder that is sensitive to indentation in the input text.\r\n * It will generate tokens for indentation and dedentation based on the indentation level.\r\n *\r\n * The first generic parameter corresponds to the names of terminal tokens,\r\n * while the second one corresponds to the names of keyword tokens.\r\n * Both parameters are optional and can be imported from `./generated/ast.js`.\r\n *\r\n * Inspired by https://github.com/chevrotain/chevrotain/blob/master/examples/lexer/python_indentation/python_indentation.js\r\n */\r\nexport class IndentationAwareTokenBuilder<Terminals extends string = string, KeywordName extends string = string> extends DefaultTokenBuilder {\r\n /**\r\n * The stack stores all the previously matched indentation levels to understand how deeply the next tokens are nested.\r\n * The stack is valid for lexing\r\n */\r\n protected indentationStack: number[] = [0];\r\n\r\n readonly options: IndentationTokenBuilderOptions<Terminals, KeywordName>;\r\n\r\n /**\r\n * The token type to be used for indentation tokens\r\n */\r\n readonly indentTokenType: TokenType;\r\n\r\n /**\r\n * The token type to be used for dedentation tokens\r\n */\r\n readonly dedentTokenType: TokenType;\r\n\r\n /**\r\n * A regular expression to match a series of tabs and/or spaces.\r\n * Override this to customize what the indentation is allowed to consist of.\r\n */\r\n protected whitespaceRegExp = /[ \\t]+/y;\r\n\r\n constructor(options: Partial<IndentationTokenBuilderOptions<NoInfer<Terminals>, NoInfer<KeywordName>>> = indentationBuilderDefaultOptions as IndentationTokenBuilderOptions<Terminals, KeywordName>) {\r\n super();\r\n this.options = {\r\n ...indentationBuilderDefaultOptions as IndentationTokenBuilderOptions<Terminals, KeywordName>,\r\n ...options,\r\n };\r\n\r\n this.indentTokenType = createToken({\r\n name: this.options.indentTokenName,\r\n pattern: this.indentMatcher.bind(this),\r\n line_breaks: false,\r\n });\r\n\r\n this.dedentTokenType = createToken({\r\n name: this.options.dedentTokenName,\r\n pattern: this.dedentMatcher.bind(this),\r\n line_breaks: false,\r\n });\r\n }\r\n\r\n override buildTokens(grammar: Grammar, options?: TokenBuilderOptions | undefined): TokenVocabulary {\r\n const tokenTypes = super.buildTokens(grammar, options);\r\n if (!isTokenTypeArray(tokenTypes)) {\r\n throw new Error('Invalid tokens built by default builder');\r\n }\r\n\r\n const { indentTokenName, dedentTokenName, whitespaceTokenName, ignoreIndentationDelimiters } = this.options;\r\n\r\n // Rearrange tokens because whitespace (which is ignored) goes to the beginning by default, consuming indentation as well\r\n // Order should be: dedent, indent, spaces\r\n let dedent: TokenType | undefined;\r\n let indent: TokenType | undefined;\r\n let ws: TokenType | undefined;\r\n const otherTokens: TokenType[] = [];\r\n for (const tokenType of tokenTypes) {\r\n for (const [begin, end] of ignoreIndentationDelimiters) {\r\n if (tokenType.name === begin) {\r\n tokenType.PUSH_MODE = LexingMode.IGNORE_INDENTATION;\r\n } else if (tokenType.name === end) {\r\n tokenType.POP_MODE = true;\r\n }\r\n }\r\n if (tokenType.name === dedentTokenName) {\r\n dedent = tokenType;\r\n } else if (tokenType.name === indentTokenName) {\r\n indent = tokenType;\r\n } else if (tokenType.name === whitespaceTokenName) {\r\n ws = tokenType;\r\n } else {\r\n otherTokens.push(tokenType);\r\n }\r\n }\r\n if (!dedent || !indent || !ws) {\r\n throw new Error('Some indentation/whitespace tokens not found!');\r\n }\r\n\r\n if (ignoreIndentationDelimiters.length > 0) {\r\n const multiModeLexerDef: IMultiModeLexerDefinition = {\r\n modes: {\r\n [LexingMode.REGULAR]: [dedent, indent, ...otherTokens, ws],\r\n [LexingMode.IGNORE_INDENTATION]: [...otherTokens, ws],\r\n },\r\n defaultMode: LexingMode.REGULAR,\r\n };\r\n return multiModeLexerDef;\r\n } else {\r\n return [dedent, indent, ws, ...otherTokens];\r\n }\r\n }\r\n\r\n override flushLexingReport(text: string): IndentationLexingReport {\r\n const result = super.flushLexingReport(text);\r\n return {\r\n ...result,\r\n remainingDedents: this.flushRemainingDedents(text),\r\n };\r\n }\r\n\r\n /**\r\n * Helper function to check if the current position is the start of a new line.\r\n *\r\n * @param text The full input string.\r\n * @param offset The current position at which to check\r\n * @returns Whether the current position is the start of a new line\r\n */\r\n protected isStartOfLine(text: string, offset: number): boolean {\r\n return offset === 0 || '\\r\\n'.includes(text[offset - 1]);\r\n }\r\n\r\n /**\r\n * A helper function used in matching both indents and dedents.\r\n *\r\n * @param text The full input string.\r\n * @param offset The current position at which to attempt a match\r\n * @param tokens Previously scanned tokens\r\n * @param groups Token Groups\r\n * @returns The current and previous indentation levels and the matched whitespace\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected matchWhitespace(text: string, offset: number, tokens: IToken[], groups: Record<string, IToken[]>): { currIndentLevel: number, prevIndentLevel: number, match: RegExpExecArray | null } {\r\n this.whitespaceRegExp.lastIndex = offset;\r\n const match = this.whitespaceRegExp.exec(text);\r\n return {\r\n currIndentLevel: match?.[0].length ?? 0,\r\n prevIndentLevel: this.indentationStack.at(-1)!,\r\n match,\r\n };\r\n }\r\n\r\n /**\r\n * Helper function to create an instance of an indentation token.\r\n *\r\n * @param tokenType Indent or dedent token type\r\n * @param text Full input string, used to calculate the line number\r\n * @param image The original image of the token (tabs or spaces)\r\n * @param offset Current position in the input string\r\n * @returns The indentation token instance\r\n */\r\n protected createIndentationTokenInstance(tokenType: TokenType, text: string, image: string, offset: number): IToken {\r\n const lineNumber = this.getLineNumber(text, offset);\r\n return createTokenInstance(\r\n tokenType,\r\n image,\r\n offset, offset + image.length,\r\n lineNumber, lineNumber,\r\n 1, image.length,\r\n );\r\n }\r\n\r\n /**\r\n * Helper function to get the line number at a given offset.\r\n *\r\n * @param text Full input string, used to calculate the line number\r\n * @param offset Current position in the input string\r\n * @returns The line number at the given offset\r\n */\r\n protected getLineNumber(text: string, offset: number): number {\r\n return text.substring(0, offset).split(/\\r\\n|\\r|\\n/).length;\r\n }\r\n\r\n /**\r\n * A custom pattern for matching indents\r\n *\r\n * @param text The full input string.\r\n * @param offset The offset at which to attempt a match\r\n * @param tokens Previously scanned tokens\r\n * @param groups Token Groups\r\n */\r\n protected indentMatcher(text: string, offset: number, tokens: IToken[], groups: Record<string, IToken[]>): ReturnType<CustomPatternMatcherFunc> {\r\n if (!this.isStartOfLine(text, offset)) {\r\n return null;\r\n }\r\n\r\n const { currIndentLevel, prevIndentLevel, match } = this.matchWhitespace(text, offset, tokens, groups);\r\n\r\n if (currIndentLevel <= prevIndentLevel) {\r\n // shallower indentation (should be matched by dedent)\r\n // or same indentation level (should be matched by whitespace and ignored)\r\n return null;\r\n }\r\n\r\n this.indentationStack.push(currIndentLevel);\r\n\r\n return match;\r\n }\r\n\r\n /**\r\n * A custom pattern for matching dedents\r\n *\r\n * @param text The full input string.\r\n * @param offset The offset at which to attempt a match\r\n * @param tokens Previously scanned tokens\r\n * @param groups Token Groups\r\n */\r\n protected dedentMatcher(text: string, offset: number, tokens: IToken[], groups: Record<string, IToken[]>): ReturnType<CustomPatternMatcherFunc> {\r\n if (!this.isStartOfLine(text, offset)) {\r\n return null;\r\n }\r\n\r\n const { currIndentLevel, prevIndentLevel, match } = this.matchWhitespace(text, offset, tokens, groups);\r\n\r\n if (currIndentLevel >= prevIndentLevel) {\r\n // bigger indentation (should be matched by indent)\r\n // or same indentation level (should be matched by whitespace and ignored)\r\n return null;\r\n }\r\n\r\n const matchIndentIndex = this.indentationStack.lastIndexOf(currIndentLevel);\r\n\r\n // Any dedent must match some previous indentation level.\r\n if (matchIndentIndex === -1) {\r\n this.diagnostics.push({\r\n severity: 'error',\r\n message: `Invalid dedent level ${currIndentLevel} at offset: ${offset}. Current indentation stack: ${this.indentationStack}`,\r\n offset,\r\n length: match?.[0]?.length ?? 0,\r\n line: this.getLineNumber(text, offset),\r\n column: 1\r\n });\r\n return null;\r\n }\r\n\r\n const numberOfDedents = this.indentationStack.length - matchIndentIndex - 1;\r\n const newlinesBeforeDedent = text.substring(0, offset).match(/[\\r\\n]+$/)?.[0].length ?? 1;\r\n\r\n for (let i = 0; i < numberOfDedents; i++) {\r\n const token = this.createIndentationTokenInstance(\r\n this.dedentTokenType,\r\n text,\r\n '', // Dedents are 0-width tokens\r\n offset - (newlinesBeforeDedent - 1), // Place the dedent after the first new line character\r\n );\r\n tokens.push(token);\r\n this.indentationStack.pop();\r\n }\r\n\r\n // Token already added, let the dedentation now be consumed as whitespace (if any) and ignored\r\n return null;\r\n }\r\n\r\n protected override buildTerminalToken(terminal: TerminalRule): TokenType {\r\n const tokenType = super.buildTerminalToken(terminal);\r\n const { indentTokenName, dedentTokenName, whitespaceTokenName } = this.options;\r\n\r\n if (tokenType.name === indentTokenName) {\r\n return this.indentTokenType;\r\n } else if (tokenType.name === dedentTokenName) {\r\n return this.dedentTokenType;\r\n } else if (tokenType.name === whitespaceTokenName) {\r\n return createToken({\r\n name: whitespaceTokenName,\r\n pattern: this.whitespaceRegExp,\r\n group: Lexer.SKIPPED,\r\n });\r\n }\r\n return tokenType;\r\n }\r\n\r\n /**\r\n * Resets the indentation stack between different runs of the lexer\r\n *\r\n * @param text Full text that was tokenized\r\n * @returns Remaining dedent tokens to match all previous indents at the end of the file\r\n */\r\n flushRemainingDedents(text: string): IToken[] {\r\n const remainingDedents: IToken[] = [];\r\n while (this.indentationStack.length > 1) {\r\n remainingDedents.push(\r\n this.createIndentationTokenInstance(this.dedentTokenType, text, '', text.length)\r\n );\r\n this.indentationStack.pop();\r\n }\r\n\r\n this.indentationStack = [0];\r\n return remainingDedents;\r\n }\r\n}\r\n\r\n/**\r\n * A lexer that is aware of indentation in the input text.\r\n * The only purpose of this lexer is to reset the internal state of the {@link IndentationAwareTokenBuilder}\r\n * between the tokenization of different text inputs.\r\n *\r\n * In your module, you can override the default lexer with this one as such:\r\n * ```ts\r\n * parser: {\r\n * TokenBuilder: () => new IndentationAwareTokenBuilder(),\r\n * Lexer: (services) => new IndentationAwareLexer(services),\r\n * }\r\n * ```\r\n */\r\nexport class IndentationAwareLexer extends DefaultLexer {\r\n\r\n protected readonly indentationTokenBuilder: IndentationAwareTokenBuilder;\r\n\r\n constructor(services: LangiumCoreServices) {\r\n super(services);\r\n if (services.parser.TokenBuilder instanceof IndentationAwareTokenBuilder) {\r\n this.indentationTokenBuilder = services.parser.TokenBuilder;\r\n } else {\r\n throw new Error('IndentationAwareLexer requires an accompanying IndentationAwareTokenBuilder');\r\n }\r\n }\r\n\r\n override tokenize(text: string, options: TokenizeOptions = DEFAULT_TOKENIZE_OPTIONS): LexerResult {\r\n const result = super.tokenize(text);\r\n\r\n // consuming all remaining dedents and remove them as they might not be serializable\r\n const report = result.report as IndentationLexingReport;\r\n if (options?.mode === 'full') {\r\n // auto-complete document with remaining dedents\r\n result.tokens.push(...report.remainingDedents);\r\n }\r\n report.remainingDedents = [];\r\n\r\n // remove any \"indent-dedent\" pair with an empty body as these are typically\r\n // added by comments or lines with just whitespace but have no real value\r\n const { indentTokenType, dedentTokenType } = this.indentationTokenBuilder;\r\n // Use tokenTypeIdx for fast comparison\r\n const indentTokenIdx = indentTokenType.tokenTypeIdx;\r\n const dedentTokenIdx = dedentTokenType.tokenTypeIdx;\r\n const cleanTokens: IToken[] = [];\r\n const length = result.tokens.length - 1;\r\n for (let i = 0; i < length; i++) {\r\n const token = result.tokens[i];\r\n const nextToken = result.tokens[i + 1];\r\n if (token.tokenTypeIdx === indentTokenIdx && nextToken.tokenTypeIdx === dedentTokenIdx) {\r\n i++;\r\n continue;\r\n }\r\n\r\n cleanTokens.push(token);\r\n }\r\n // Push last token separately\r\n if (length >= 0) {\r\n cleanTokens.push(result.tokens[length]);\r\n }\r\n result.tokens = cleanTokens;\r\n\r\n return result;\r\n }\r\n}\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nexport * from './caching.js';\r\nexport * from './event.js';\r\nexport * from './collections.js';\r\nexport * from './disposable.js';\r\nexport * from './errors.js';\r\nexport * from './grammar-loader.js';\r\nexport * from './promise-utils.js';\r\nexport * from './stream.js';\r\nexport * from './uri-utils.js';\r\n\r\nimport * as AstUtils from './ast-utils.js';\r\nimport * as Cancellation from './cancellation.js';\r\nimport * as CstUtils from './cst-utils.js';\r\nimport * as GrammarUtils from './grammar-utils.js';\r\nimport * as RegExpUtils from './regexp-utils.js';\r\nexport { AstUtils, Cancellation, CstUtils, GrammarUtils, RegExpUtils };\r\n", "/******************************************************************************\r\n * Copyright 2022 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport type { URI } from '../utils/uri-utils.js';\r\n\r\nexport interface FileSystemNode {\r\n readonly isFile: boolean;\r\n readonly isDirectory: boolean;\r\n readonly uri: URI;\r\n}\r\n\r\nexport type FileSystemFilter = (node: FileSystemNode) => boolean;\r\n\r\n/**\r\n * Provides methods to interact with an abstract file system. The default implementation is based on the node.js `fs` API.\r\n */\r\nexport interface FileSystemProvider {\r\n /**\r\n * Reads a document asynchronously from a given URI.\r\n * @returns The string content of the file with the specified URI.\r\n */\r\n readFile(uri: URI): Promise<string>;\r\n /**\r\n * Reads the directory information for the given URI.\r\n * @returns The list of file system entries that are contained within the specified directory.\r\n */\r\n readDirectory(uri: URI): Promise<FileSystemNode[]>;\r\n}\r\n\r\nexport class EmptyFileSystemProvider implements FileSystemProvider {\r\n\r\n readFile(): Promise<string> {\r\n throw new Error('No file system is available.');\r\n }\r\n\r\n async readDirectory(): Promise<FileSystemNode[]> {\r\n return [];\r\n }\r\n\r\n}\r\n\r\nexport const EmptyFileSystem = {\r\n fileSystemProvider: () => new EmptyFileSystemProvider()\r\n};\r\n", "/******************************************************************************\r\n * Copyright 2023 TypeFox GmbH\r\n * This program and the accompanying materials are made available under the\r\n * terms of the MIT License, which is available in the project root.\r\n ******************************************************************************/\r\n\r\nimport { createDefaultCoreModule, createDefaultSharedCoreModule } from '../default-module.js';\r\nimport type { Module } from '../dependency-injection.js';\r\nimport { inject } from '../dependency-injection.js';\r\nimport * as ast from '../languages/generated/ast.js';\r\nimport type { LangiumCoreServices, LangiumSharedCoreServices, PartialLangiumCoreServices, PartialLangiumSharedCoreServices } from '../services.js';\r\nimport type { Mutable } from '../syntax-tree.js';\r\nimport { EmptyFileSystem } from '../workspace/file-system-provider.js';\r\nimport { URI } from './uri-utils.js';\r\n\r\nconst minimalGrammarModule: Module<LangiumCoreServices, PartialLangiumCoreServices> = {\r\n Grammar: () => undefined as unknown as ast.Grammar,\r\n LanguageMetaData: () => ({\r\n caseInsensitive: false,\r\n fileExtensions: ['.langium'],\r\n languageId: 'langium'\r\n })\r\n};\r\n\r\nconst minimalSharedGrammarModule: Module<LangiumSharedCoreServices, PartialLangiumSharedCoreServices> = {\r\n AstReflection: () => new ast.LangiumGrammarAstReflection()\r\n};\r\n\r\nfunction createMinimalGrammarServices(): LangiumCoreServices {\r\n const shared = inject(\r\n createDefaultSharedCoreModule(EmptyFileSystem),\r\n minimalSharedGrammarModule\r\n );\r\n const grammar = inject(\r\n createDefaultCoreModule({ shared }),\r\n minimalGrammarModule\r\n );\r\n shared.ServiceRegistry.register(grammar);\r\n return grammar;\r\n}\r\n\r\n/**\r\n * Load a Langium grammar for your language from a JSON string. This is used by several services,\r\n * most notably the parser builder which interprets the grammar to create a parser.\r\n */\r\nexport function loadGrammarFromJson(json: string): ast.Grammar {\r\n const services = createMinimalGrammarServices();\r\n const astNode = services.serializer.JsonSerializer.deserialize(json) as Mutable<ast.Grammar>;\r\n services.shared.workspace.LangiumDocumentFactory.fromModel(astNode, URI.parse(`memory://${astNode.name ?? 'grammar'}.langium`));\r\n return astNode;\r\n}\r\n", "/******************************************************************************\n * This file was generated by langium-cli 3.3.0.\n * DO NOT EDIT MANUALLY!\n ******************************************************************************/\n\n/* eslint-disable */\nimport type { AstNode, Reference, ReferenceInfo, TypeMetaData } from 'langium';\nimport { AbstractAstReflection } from 'langium';\n\nexport const MermaidTerminals = {\n ACC_DESCR: /[\\t ]*accDescr(?:[\\t ]*:([^\\n\\r]*?(?=%%)|[^\\n\\r]*)|\\s*{([^}]*)})/,\n ACC_TITLE: /[\\t ]*accTitle[\\t ]*:(?:[^\\n\\r]*?(?=%%)|[^\\n\\r]*)/,\n TITLE: /[\\t ]*title(?:[\\t ][^\\n\\r]*?(?=%%)|[\\t ][^\\n\\r]*|)/,\n NEWLINE: /\\r?\\n/,\n WHITESPACE: /[\\t ]+/,\n YAML: /---[\\t ]*\\r?\\n(?:[\\S\\s]*?\\r?\\n)?---(?:\\r?\\n|(?!\\S))/,\n DIRECTIVE: /[\\t ]*%%{[\\S\\s]*?}%%(?:\\r?\\n|(?!\\S))/,\n SINGLE_LINE_COMMENT: /[\\t ]*%%[^\\n\\r]*/,\n INT: /0|[1-9][0-9]*(?!\\.)/,\n STRING: /\"([^\"\\\\]|\\\\.)*\"|'([^'\\\\]|\\\\.)*'/,\n NUMBER: /(([0-9]+\\.[0-9]+(?!\\.))|(0|[1-9][0-9]*(?!\\.)))/,\n ARROW_DIRECTION: /(((L|R)|T)|B)/,\n ARROW_GROUP: /\\{group\\}/,\n ARROW_INTO: /<|>/,\n ID: /[\\w]([-\\w]*\\w)?/,\n ARCH_ICON: /\\([\\w-:]+\\)/,\n ARCH_TITLE: /\\[[\\w ]+\\]/,\n REFERENCE: /\\w([-\\./\\w]*[-\\w])?/,\n GRATICULE: /(circle|polygon)/,\n BOOLEAN: /(true|false)/,\n TREEMAP_KEYWORD: /(treemap-beta|treemap)/,\n CLASS_DEF: /classDef\\s+([a-zA-Z_][a-zA-Z0-9_]+)(?:\\s+([^;\\r\\n]*))?(?:;)?/,\n STYLE_SEPARATOR: /:::/,\n SEPARATOR: /:/,\n COMMA: /,/,\n WS: /[ \\t]+/,\n ML_COMMENT: /\\%\\%[^\\n]*/,\n NL: /\\r?\\n/,\n INDENTATION: /[ \\t]{1,}/,\n ID2: /[a-zA-Z_][a-zA-Z0-9_]*/,\n NUMBER2: /[0-9_\\.\\,]+/,\n STRING2: /\"[^\"]*\"|'[^']*'/,\n};\n\nexport type MermaidTerminalNames = keyof typeof MermaidTerminals;\n\nexport type MermaidKeywordNames = \n | \"+\"\n | \",\"\n | \"-\"\n | \"--\"\n | \":\"\n | \"BT\"\n | \"HIGHLIGHT\"\n | \"LR\"\n | \"NORMAL\"\n | \"REVERSE\"\n | \"TB\"\n | \"[\"\n | \"]\"\n | \"architecture-beta\"\n | \"axis\"\n | \"branch\"\n | \"checkout\"\n | \"cherry-pick\"\n | \"commit\"\n | \"curve\"\n | \"gitGraph\"\n | \"gitGraph:\"\n | \"graticule\"\n | \"group\"\n | \"id:\"\n | \"in\"\n | \"info\"\n | \"junction\"\n | \"max\"\n | \"merge\"\n | \"min\"\n | \"msg:\"\n | \"order:\"\n | \"packet\"\n | \"packet-beta\"\n | \"parent:\"\n | \"pie\"\n | \"radar-beta\"\n | \"radar-beta:\"\n | \"service\"\n | \"showData\"\n | \"showInfo\"\n | \"showLegend\"\n | \"switch\"\n | \"tag:\"\n | \"ticks\"\n | \"type:\"\n | \"{\"\n | \"}\";\n\nexport type MermaidTokenNames = MermaidTerminalNames | MermaidKeywordNames;\n\nexport type ClassDef = string;\n\nexport function isClassDef(item: unknown): item is ClassDef {\n return (typeof item === 'string' && (/classDef\\s+([a-zA-Z_][a-zA-Z0-9_]+)(?:\\s+([^;\\r\\n]*))?(?:;)?/.test(item)));\n}\n\nexport type MyNumber = number;\n\nexport function isMyNumber(item: unknown): item is MyNumber {\n return typeof item === 'number';\n}\n\nexport type Statement = Branch | Checkout | CherryPicking | Commit | Merge;\n\nexport const Statement = 'Statement';\n\nexport function isStatement(item: unknown): item is Statement {\n return reflection.isInstance(item, Statement);\n}\n\nexport interface Architecture extends AstNode {\n readonly $type: 'Architecture';\n accDescr?: string;\n accTitle?: string;\n edges: Array<Edge>;\n groups: Array<Group>;\n junctions: Array<Junction>;\n services: Array<Service>;\n title?: string;\n}\n\nexport const Architecture = 'Architecture';\n\nexport function isArchitecture(item: unknown): item is Architecture {\n return reflection.isInstance(item, Architecture);\n}\n\nexport interface Axis extends AstNode {\n readonly $container: Radar;\n readonly $type: 'Axis';\n label?: string;\n name: string;\n}\n\nexport const Axis = 'Axis';\n\nexport function isAxis(item: unknown): item is Axis {\n return reflection.isInstance(item, Axis);\n}\n\nexport interface Branch extends AstNode {\n readonly $container: GitGraph;\n readonly $type: 'Branch';\n name: string;\n order?: number;\n}\n\nexport const Branch = 'Branch';\n\nexport function isBranch(item: unknown): item is Branch {\n return reflection.isInstance(item, Branch);\n}\n\nexport interface Checkout extends AstNode {\n readonly $container: GitGraph;\n readonly $type: 'Checkout';\n branch: string;\n}\n\nexport const Checkout = 'Checkout';\n\nexport function isCheckout(item: unknown): item is Checkout {\n return reflection.isInstance(item, Checkout);\n}\n\nexport interface CherryPicking extends AstNode {\n readonly $container: GitGraph;\n readonly $type: 'CherryPicking';\n id?: string;\n parent?: string;\n tags: Array<string>;\n}\n\nexport const CherryPicking = 'CherryPicking';\n\nexport function isCherryPicking(item: unknown): item is CherryPicking {\n return reflection.isInstance(item, CherryPicking);\n}\n\nexport interface ClassDefStatement extends AstNode {\n readonly $type: 'ClassDefStatement';\n className: string;\n styleText: string;\n}\n\nexport const ClassDefStatement = 'ClassDefStatement';\n\nexport function isClassDefStatement(item: unknown): item is ClassDefStatement {\n return reflection.isInstance(item, ClassDefStatement);\n}\n\nexport interface Commit extends AstNode {\n readonly $container: GitGraph;\n readonly $type: 'Commit';\n id?: string;\n message?: string;\n tags: Array<string>;\n type?: 'HIGHLIGHT' | 'NORMAL' | 'REVERSE';\n}\n\nexport const Commit = 'Commit';\n\nexport function isCommit(item: unknown): item is Commit {\n return reflection.isInstance(item, Commit);\n}\n\nexport interface Curve extends AstNode {\n readonly $container: Radar;\n readonly $type: 'Curve';\n entries: Array<Entry>;\n label?: string;\n name: string;\n}\n\nexport const Curve = 'Curve';\n\nexport function isCurve(item: unknown): item is Curve {\n return reflection.isInstance(item, Curve);\n}\n\nexport interface Edge extends AstNode {\n readonly $container: Architecture;\n readonly $type: 'Edge';\n lhsDir: string;\n lhsGroup: boolean;\n lhsId: string;\n lhsInto: boolean;\n rhsDir: string;\n rhsGroup: boolean;\n rhsId: string;\n rhsInto: boolean;\n title?: string;\n}\n\nexport const Edge = 'Edge';\n\nexport function isEdge(item: unknown): item is Edge {\n return reflection.isInstance(item, Edge);\n}\n\nexport interface Entry extends AstNode {\n readonly $container: Curve;\n readonly $type: 'Entry';\n axis?: Reference<Axis>;\n value: number;\n}\n\nexport const Entry = 'Entry';\n\nexport function isEntry(item: unknown): item is Entry {\n return reflection.isInstance(item, Entry);\n}\n\nexport interface GitGraph extends AstNode {\n readonly $type: 'Direction' | 'GitGraph';\n accDescr?: string;\n accTitle?: string;\n statements: Array<Statement>;\n title?: string;\n}\n\nexport const GitGraph = 'GitGraph';\n\nexport function isGitGraph(item: unknown): item is GitGraph {\n return reflection.isInstance(item, GitGraph);\n}\n\nexport interface Group extends AstNode {\n readonly $container: Architecture;\n readonly $type: 'Group';\n icon?: string;\n id: string;\n in?: string;\n title?: string;\n}\n\nexport const Group = 'Group';\n\nexport function isGroup(item: unknown): item is Group {\n return reflection.isInstance(item, Group);\n}\n\nexport interface Info extends AstNode {\n readonly $type: 'Info';\n accDescr?: string;\n accTitle?: string;\n title?: string;\n}\n\nexport const Info = 'Info';\n\nexport function isInfo(item: unknown): item is Info {\n return reflection.isInstance(item, Info);\n}\n\nexport interface Item extends AstNode {\n readonly $type: 'Item' | 'Leaf' | 'Section';\n classSelector?: string;\n name: string;\n}\n\nexport const Item = 'Item';\n\nexport function isItem(item: unknown): item is Item {\n return reflection.isInstance(item, Item);\n}\n\nexport interface Junction extends AstNode {\n readonly $container: Architecture;\n readonly $type: 'Junction';\n id: string;\n in?: string;\n}\n\nexport const Junction = 'Junction';\n\nexport function isJunction(item: unknown): item is Junction {\n return reflection.isInstance(item, Junction);\n}\n\nexport interface Merge extends AstNode {\n readonly $container: GitGraph;\n readonly $type: 'Merge';\n branch: string;\n id?: string;\n tags: Array<string>;\n type?: 'HIGHLIGHT' | 'NORMAL' | 'REVERSE';\n}\n\nexport const Merge = 'Merge';\n\nexport function isMerge(item: unknown): item is Merge {\n return reflection.isInstance(item, Merge);\n}\n\nexport interface Option extends AstNode {\n readonly $container: Radar;\n readonly $type: 'Option';\n name: 'graticule' | 'max' | 'min' | 'showLegend' | 'ticks';\n value: boolean | number | string;\n}\n\nexport const Option = 'Option';\n\nexport function isOption(item: unknown): item is Option {\n return reflection.isInstance(item, Option);\n}\n\nexport interface Packet extends AstNode {\n readonly $type: 'Packet';\n accDescr?: string;\n accTitle?: string;\n blocks: Array<PacketBlock>;\n title?: string;\n}\n\nexport const Packet = 'Packet';\n\nexport function isPacket(item: unknown): item is Packet {\n return reflection.isInstance(item, Packet);\n}\n\nexport interface PacketBlock extends AstNode {\n readonly $container: Packet;\n readonly $type: 'PacketBlock';\n bits?: number;\n end?: number;\n label: string;\n start?: number;\n}\n\nexport const PacketBlock = 'PacketBlock';\n\nexport function isPacketBlock(item: unknown): item is PacketBlock {\n return reflection.isInstance(item, PacketBlock);\n}\n\nexport interface Pie extends AstNode {\n readonly $type: 'Pie';\n accDescr?: string;\n accTitle?: string;\n sections: Array<PieSection>;\n showData: boolean;\n title?: string;\n}\n\nexport const Pie = 'Pie';\n\nexport function isPie(item: unknown): item is Pie {\n return reflection.isInstance(item, Pie);\n}\n\nexport interface PieSection extends AstNode {\n readonly $container: Pie;\n readonly $type: 'PieSection';\n label: string;\n value: number;\n}\n\nexport const PieSection = 'PieSection';\n\nexport function isPieSection(item: unknown): item is PieSection {\n return reflection.isInstance(item, PieSection);\n}\n\nexport interface Radar extends AstNode {\n readonly $type: 'Radar';\n accDescr?: string;\n accTitle?: string;\n axes: Array<Axis>;\n curves: Array<Curve>;\n options: Array<Option>;\n title?: string;\n}\n\nexport const Radar = 'Radar';\n\nexport function isRadar(item: unknown): item is Radar {\n return reflection.isInstance(item, Radar);\n}\n\nexport interface Service extends AstNode {\n readonly $container: Architecture;\n readonly $type: 'Service';\n icon?: string;\n iconText?: string;\n id: string;\n in?: string;\n title?: string;\n}\n\nexport const Service = 'Service';\n\nexport function isService(item: unknown): item is Service {\n return reflection.isInstance(item, Service);\n}\n\nexport interface Treemap extends AstNode {\n readonly $type: 'Treemap';\n accDescr?: string;\n accTitle?: string;\n title?: string;\n TreemapRows: Array<TreemapRow>;\n}\n\nexport const Treemap = 'Treemap';\n\nexport function isTreemap(item: unknown): item is Treemap {\n return reflection.isInstance(item, Treemap);\n}\n\nexport interface TreemapRow extends AstNode {\n readonly $container: Treemap;\n readonly $type: 'ClassDef' | 'TreemapRow';\n indent?: string;\n item: Item;\n}\n\nexport const TreemapRow = 'TreemapRow';\n\nexport function isTreemapRow(item: unknown): item is TreemapRow {\n return reflection.isInstance(item, TreemapRow);\n}\n\nexport interface Direction extends GitGraph {\n readonly $type: 'Direction';\n dir: 'BT' | 'LR' | 'TB';\n}\n\nexport const Direction = 'Direction';\n\nexport function isDirection(item: unknown): item is Direction {\n return reflection.isInstance(item, Direction);\n}\n\nexport interface Leaf extends Item {\n readonly $type: 'Leaf';\n value: number;\n}\n\nexport const Leaf = 'Leaf';\n\nexport function isLeaf(item: unknown): item is Leaf {\n return reflection.isInstance(item, Leaf);\n}\n\nexport interface Section extends Item {\n readonly $type: 'Section';\n}\n\nexport const Section = 'Section';\n\nexport function isSection(item: unknown): item is Section {\n return reflection.isInstance(item, Section);\n}\n\nexport type MermaidAstType = {\n Architecture: Architecture\n Axis: Axis\n Branch: Branch\n Checkout: Checkout\n CherryPicking: CherryPicking\n ClassDefStatement: ClassDefStatement\n Commit: Commit\n Curve: Curve\n Direction: Direction\n Edge: Edge\n Entry: Entry\n GitGraph: GitGraph\n Group: Group\n Info: Info\n Item: Item\n Junction: Junction\n Leaf: Leaf\n Merge: Merge\n Option: Option\n Packet: Packet\n PacketBlock: PacketBlock\n Pie: Pie\n PieSection: PieSection\n Radar: Radar\n Section: Section\n Service: Service\n Statement: Statement\n Treemap: Treemap\n TreemapRow: TreemapRow\n}\n\nexport class MermaidAstReflection extends AbstractAstReflection {\n\n getAllTypes(): string[] {\n return [Architecture, Axis, Branch, Checkout, CherryPicking, ClassDefStatement, Commit, Curve, Direction, Edge, Entry, GitGraph, Group, Info, Item, Junction, Leaf, Merge, Option, Packet, PacketBlock, Pie, PieSection, Radar, Section, Service, Statement, Treemap, TreemapRow];\n }\n\n protected override computeIsSubtype(subtype: string, supertype: string): boolean {\n switch (subtype) {\n case Branch:\n case Checkout:\n case CherryPicking:\n case Commit:\n case Merge: {\n return this.isSubtype(Statement, supertype);\n }\n case Direction: {\n return this.isSubtype(GitGraph, supertype);\n }\n case Leaf:\n case Section: {\n return this.isSubtype(Item, supertype);\n }\n default: {\n return false;\n }\n }\n }\n\n getReferenceType(refInfo: ReferenceInfo): string {\n const referenceId = `${refInfo.container.$type}:${refInfo.property}`;\n switch (referenceId) {\n case 'Entry:axis': {\n return Axis;\n }\n default: {\n throw new Error(`${referenceId} is not a valid reference id.`);\n }\n }\n }\n\n getTypeMetaData(type: string): TypeMetaData {\n switch (type) {\n case Architecture: {\n return {\n name: Architecture,\n properties: [\n { name: 'accDescr' },\n { name: 'accTitle' },\n { name: 'edges', defaultValue: [] },\n { name: 'groups', defaultValue: [] },\n { name: 'junctions', defaultValue: [] },\n { name: 'services', defaultValue: [] },\n { name: 'title' }\n ]\n };\n }\n case Axis: {\n return {\n name: Axis,\n properties: [\n { name: 'label' },\n { name: 'name' }\n ]\n };\n }\n case Branch: {\n return {\n name: Branch,\n properties: [\n { name: 'name' },\n { name: 'order' }\n ]\n };\n }\n case Checkout: {\n return {\n name: Checkout,\n properties: [\n { name: 'branch' }\n ]\n };\n }\n case CherryPicking: {\n return {\n name: CherryPicking,\n properties: [\n { name: 'id' },\n { name: 'parent' },\n { name: 'tags', defaultValue: [] }\n ]\n };\n }\n case ClassDefStatement: {\n return {\n name: ClassDefStatement,\n properties: [\n { name: 'className' },\n { name: 'styleText' }\n ]\n };\n }\n case Commit: {\n return {\n name: Commit,\n properties: [\n { name: 'id' },\n { name: 'message' },\n { name: 'tags', defaultValue: [] },\n { name: 'type' }\n ]\n };\n }\n case Curve: {\n return {\n name: Curve,\n properties: [\n { name: 'entries', defaultValue: [] },\n { name: 'label' },\n { name: 'name' }\n ]\n };\n }\n case Edge: {\n return {\n name: Edge,\n properties: [\n { name: 'lhsDir' },\n { name: 'lhsGroup', defaultValue: false },\n { name: 'lhsId' },\n { name: 'lhsInto', defaultValue: false },\n { name: 'rhsDir' },\n { name: 'rhsGroup', defaultValue: false },\n { name: 'rhsId' },\n { name: 'rhsInto', defaultValue: false },\n { name: 'title' }\n ]\n };\n }\n case Entry: {\n return {\n name: Entry,\n properties: [\n { name: 'axis' },\n { name: 'value' }\n ]\n };\n }\n case GitGraph: {\n return {\n name: GitGraph,\n properties: [\n { name: 'accDescr' },\n { name: 'accTitle' },\n { name: 'statements', defaultValue: [] },\n { name: 'title' }\n ]\n };\n }\n case Group: {\n return {\n name: Group,\n properties: [\n { name: 'icon' },\n { name: 'id' },\n { name: 'in' },\n { name: 'title' }\n ]\n };\n }\n case Info: {\n return {\n name: Info,\n properties: [\n { name: 'accDescr' },\n { name: 'accTitle' },\n { name: 'title' }\n ]\n };\n }\n case Item: {\n return {\n name: Item,\n properties: [\n { name: 'classSelector' },\n { name: 'name' }\n ]\n };\n }\n case Junction: {\n return {\n name: Junction,\n properties: [\n { name: 'id' },\n { name: 'in' }\n ]\n };\n }\n case Merge: {\n return {\n name: Merge,\n properties: [\n { name: 'branch' },\n { name: 'id' },\n { name: 'tags', defaultValue: [] },\n { name: 'type' }\n ]\n };\n }\n case Option: {\n return {\n name: Option,\n properties: [\n { name: 'name' },\n { name: 'value', defaultValue: false }\n ]\n };\n }\n case Packet: {\n return {\n name: Packet,\n properties: [\n { name: 'accDescr' },\n { name: 'accTitle' },\n { name: 'blocks', defaultValue: [] },\n { name: 'title' }\n ]\n };\n }\n case PacketBlock: {\n return {\n name: PacketBlock,\n properties: [\n { name: 'bits' },\n { name: 'end' },\n { name: 'label' },\n { name: 'start' }\n ]\n };\n }\n case Pie: {\n return {\n name: Pie,\n properties: [\n { name: 'accDescr' },\n { name: 'accTitle' },\n { name: 'sections', defaultValue: [] },\n { name: 'showData', defaultValue: false },\n { name: 'title' }\n ]\n };\n }\n case PieSection: {\n return {\n name: PieSection,\n properties: [\n { name: 'label' },\n { name: 'value' }\n ]\n };\n }\n case Radar: {\n return {\n name: Radar,\n properties: [\n { name: 'accDescr' },\n { name: 'accTitle' },\n { name: 'axes', defaultValue: [] },\n { name: 'curves', defaultValue: [] },\n { name: 'options', defaultValue: [] },\n { name: 'title' }\n ]\n };\n }\n case Service: {\n return {\n name: Service,\n properties: [\n { name: 'icon' },\n { name: 'iconText' },\n { name: 'id' },\n { name: 'in' },\n { name: 'title' }\n ]\n };\n }\n case Treemap: {\n return {\n name: Treemap,\n properties: [\n { name: 'accDescr' },\n { name: 'accTitle' },\n { name: 'title' },\n { name: 'TreemapRows', defaultValue: [] }\n ]\n };\n }\n case TreemapRow: {\n return {\n name: TreemapRow,\n properties: [\n { name: 'indent' },\n { name: 'item' }\n ]\n };\n }\n case Direction: {\n return {\n name: Direction,\n properties: [\n { name: 'accDescr' },\n { name: 'accTitle' },\n { name: 'dir' },\n { name: 'statements', defaultValue: [] },\n { name: 'title' }\n ]\n };\n }\n case Leaf: {\n return {\n name: Leaf,\n properties: [\n { name: 'classSelector' },\n { name: 'name' },\n { name: 'value' }\n ]\n };\n }\n case Section: {\n return {\n name: Section,\n properties: [\n { name: 'classSelector' },\n { name: 'name' }\n ]\n };\n }\n default: {\n return {\n name: type,\n properties: []\n };\n }\n }\n }\n}\n\nexport const reflection = new MermaidAstReflection();\n", "/******************************************************************************\n * This file was generated by langium-cli 3.3.0.\n * DO NOT EDIT MANUALLY!\n ******************************************************************************/\n\nimport type { Grammar } from 'langium';\nimport { loadGrammarFromJson } from 'langium';\n\nlet loadedInfoGrammar: Grammar | undefined;\nexport const InfoGrammar = (): Grammar => loadedInfoGrammar ?? (loadedInfoGrammar = loadGrammarFromJson('{\"$type\":\"Grammar\",\"isDeclared\":true,\"name\":\"Info\",\"imports\":[],\"rules\":[{\"$type\":\"ParserRule\",\"entry\":true,\"name\":\"Info\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Keyword\",\"value\":\"info\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"showInfo\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[],\"cardinality\":\"*\"}],\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[],\"cardinality\":\"?\"}]},\"definesHiddenTokens\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"TitleAndAccessibilities\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"accDescr\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@4\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[]}}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"BOOLEAN\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"boolean\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"true\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"false\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_DESCR\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accDescr(?:[\\\\\\\\t ]*:([^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)|\\\\\\\\s*{([^}]*)})/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accTitle[\\\\\\\\t ]*:(?:[^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*title(?:[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*|)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"FLOAT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[0-9]+\\\\\\\\.[0-9]+(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"INT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/0|[1-9][0-9]*(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NUMBER\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@7\"}},{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"STRING\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"([^\\\\\"\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\\\\"|\\'([^\\'\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\'/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ID\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\w]([-\\\\\\\\w]*\\\\\\\\w)?/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"WHITESPACE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]+/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"YAML\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/---[\\\\\\\\t ]*\\\\\\\\r?\\\\\\\\n(?:[\\\\\\\\S\\\\\\\\s]*?\\\\\\\\r?\\\\\\\\n)?---(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"DIRECTIVE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%{[\\\\\\\\S\\\\\\\\s]*?}%%(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"SINGLE_LINE_COMMENT\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%[^\\\\\\\\n\\\\\\\\r]*/\"},\"fragment\":false}],\"definesHiddenTokens\":false,\"hiddenTokens\":[],\"interfaces\":[],\"types\":[],\"usedGrammars\":[]}'));\n\nlet loadedPacketGrammar: Grammar | undefined;\nexport const PacketGrammar = (): Grammar => loadedPacketGrammar ?? (loadedPacketGrammar = loadGrammarFromJson('{\"$type\":\"Grammar\",\"isDeclared\":true,\"name\":\"Packet\",\"imports\":[],\"rules\":[{\"$type\":\"ParserRule\",\"entry\":true,\"name\":\"Packet\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"packet\"},{\"$type\":\"Keyword\",\"value\":\"packet-beta\"}]},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"blocks\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[]}],\"cardinality\":\"*\"}]},\"definesHiddenTokens\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"PacketBlock\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"start\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"-\"},{\"$type\":\"Assignment\",\"feature\":\"end\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]}}],\"cardinality\":\"?\"}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"+\"},{\"$type\":\"Assignment\",\"feature\":\"bits\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]}}]}]},{\"$type\":\"Keyword\",\"value\":\":\"},{\"$type\":\"Assignment\",\"feature\":\"label\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@11\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"TitleAndAccessibilities\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"accDescr\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@7\"},\"arguments\":[]}}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"BOOLEAN\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"boolean\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"true\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"false\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_DESCR\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accDescr(?:[\\\\\\\\t ]*:([^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)|\\\\\\\\s*{([^}]*)})/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accTitle[\\\\\\\\t ]*:(?:[^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*title(?:[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*|)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"FLOAT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[0-9]+\\\\\\\\.[0-9]+(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"INT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/0|[1-9][0-9]*(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NUMBER\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"}},{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"STRING\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"([^\\\\\"\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\\\\"|\\'([^\\'\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\'/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ID\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\w]([-\\\\\\\\w]*\\\\\\\\w)?/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"WHITESPACE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]+/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"YAML\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/---[\\\\\\\\t ]*\\\\\\\\r?\\\\\\\\n(?:[\\\\\\\\S\\\\\\\\s]*?\\\\\\\\r?\\\\\\\\n)?---(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"DIRECTIVE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%{[\\\\\\\\S\\\\\\\\s]*?}%%(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"SINGLE_LINE_COMMENT\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%[^\\\\\\\\n\\\\\\\\r]*/\"},\"fragment\":false}],\"definesHiddenTokens\":false,\"hiddenTokens\":[],\"interfaces\":[],\"types\":[],\"usedGrammars\":[]}'));\n\nlet loadedPieGrammar: Grammar | undefined;\nexport const PieGrammar = (): Grammar => loadedPieGrammar ?? (loadedPieGrammar = loadGrammarFromJson('{\"$type\":\"Grammar\",\"isDeclared\":true,\"name\":\"Pie\",\"imports\":[],\"rules\":[{\"$type\":\"ParserRule\",\"entry\":true,\"name\":\"Pie\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Keyword\",\"value\":\"pie\"},{\"$type\":\"Assignment\",\"feature\":\"showData\",\"operator\":\"?=\",\"terminal\":{\"$type\":\"Keyword\",\"value\":\"showData\"},\"cardinality\":\"?\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"sections\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[]}],\"cardinality\":\"*\"}]},\"definesHiddenTokens\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"PieSection\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"label\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@11\"},\"arguments\":[]}},{\"$type\":\"Keyword\",\"value\":\":\"},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@10\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"TitleAndAccessibilities\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"accDescr\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@7\"},\"arguments\":[]}}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"BOOLEAN\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"boolean\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"true\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"false\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_DESCR\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accDescr(?:[\\\\\\\\t ]*:([^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)|\\\\\\\\s*{([^}]*)})/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accTitle[\\\\\\\\t ]*:(?:[^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*title(?:[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*|)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"FLOAT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[0-9]+\\\\\\\\.[0-9]+(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"INT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/0|[1-9][0-9]*(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NUMBER\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"}},{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"STRING\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"([^\\\\\"\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\\\\"|\\'([^\\'\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\'/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ID\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\w]([-\\\\\\\\w]*\\\\\\\\w)?/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"WHITESPACE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]+/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"YAML\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/---[\\\\\\\\t ]*\\\\\\\\r?\\\\\\\\n(?:[\\\\\\\\S\\\\\\\\s]*?\\\\\\\\r?\\\\\\\\n)?---(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"DIRECTIVE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%{[\\\\\\\\S\\\\\\\\s]*?}%%(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"SINGLE_LINE_COMMENT\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%[^\\\\\\\\n\\\\\\\\r]*/\"},\"fragment\":false}],\"definesHiddenTokens\":false,\"hiddenTokens\":[],\"interfaces\":[],\"types\":[],\"usedGrammars\":[]}'));\n\nlet loadedArchitectureGrammar: Grammar | undefined;\nexport const ArchitectureGrammar = (): Grammar => loadedArchitectureGrammar ?? (loadedArchitectureGrammar = loadGrammarFromJson('{\"$type\":\"Grammar\",\"isDeclared\":true,\"name\":\"Architecture\",\"imports\":[],\"rules\":[{\"$type\":\"ParserRule\",\"entry\":true,\"name\":\"Architecture\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@23\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Keyword\",\"value\":\"architecture-beta\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@23\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[]}],\"cardinality\":\"*\"}]},\"definesHiddenTokens\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"Statement\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"groups\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"services\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"junctions\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@7\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"edges\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"LeftPort\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\":\"},{\"$type\":\"Assignment\",\"feature\":\"lhsDir\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]}}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"RightPort\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"rhsDir\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]}},{\"$type\":\"Keyword\",\"value\":\":\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"Arrow\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"lhsInto\",\"operator\":\"?=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@11\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"--\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"-\"},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@29\"},\"arguments\":[]}},{\"$type\":\"Keyword\",\"value\":\"-\"}]}]},{\"$type\":\"Assignment\",\"feature\":\"rhsInto\",\"operator\":\"?=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@11\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Group\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"group\"},{\"$type\":\"Assignment\",\"feature\":\"id\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"icon\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@28\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@29\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"in\"},{\"$type\":\"Assignment\",\"feature\":\"in\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}}],\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Service\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"service\"},{\"$type\":\"Assignment\",\"feature\":\"id\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"iconText\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@21\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"icon\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@28\"},\"arguments\":[]}}],\"cardinality\":\"?\"},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@29\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"in\"},{\"$type\":\"Assignment\",\"feature\":\"in\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}}],\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Junction\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"junction\"},{\"$type\":\"Assignment\",\"feature\":\"id\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"in\"},{\"$type\":\"Assignment\",\"feature\":\"in\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}}],\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Edge\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"lhsId\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"lhsGroup\",\"operator\":\"?=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@10\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@4\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"rhsId\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"rhsGroup\",\"operator\":\"?=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@10\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"ARROW_DIRECTION\",\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"L\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"R\"}}]},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"T\"}}]},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"B\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ARROW_GROUP\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\{group\\\\\\\\}/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ARROW_INTO\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/<|>/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@23\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"TitleAndAccessibilities\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"accDescr\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@15\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@16\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"BOOLEAN\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"boolean\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"true\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"false\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_DESCR\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accDescr(?:[\\\\\\\\t ]*:([^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)|\\\\\\\\s*{([^}]*)})/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accTitle[\\\\\\\\t ]*:(?:[^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*title(?:[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*|)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"FLOAT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[0-9]+\\\\\\\\.[0-9]+(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"INT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/0|[1-9][0-9]*(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NUMBER\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@18\"}},{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"STRING\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"([^\\\\\"\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\\\\"|\\'([^\\'\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\'/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ID\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\w]([-\\\\\\\\w]*\\\\\\\\w)?/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"WHITESPACE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]+/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"YAML\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/---[\\\\\\\\t ]*\\\\\\\\r?\\\\\\\\n(?:[\\\\\\\\S\\\\\\\\s]*?\\\\\\\\r?\\\\\\\\n)?---(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"DIRECTIVE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%{[\\\\\\\\S\\\\\\\\s]*?}%%(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"SINGLE_LINE_COMMENT\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%[^\\\\\\\\n\\\\\\\\r]*/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"name\":\"ARCH_ICON\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\([\\\\\\\\w-:]+\\\\\\\\)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ARCH_TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\[[\\\\\\\\w ]+\\\\\\\\]/\"},\"fragment\":false,\"hidden\":false}],\"definesHiddenTokens\":false,\"hiddenTokens\":[],\"interfaces\":[],\"types\":[],\"usedGrammars\":[]}'));\n\nlet loadedGitGraphGrammar: Grammar | undefined;\nexport const GitGraphGrammar = (): Grammar => loadedGitGraphGrammar ?? (loadedGitGraphGrammar = loadGrammarFromJson('{\"$type\":\"Grammar\",\"isDeclared\":true,\"name\":\"GitGraph\",\"imports\":[],\"rules\":[{\"$type\":\"ParserRule\",\"entry\":true,\"name\":\"GitGraph\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"gitGraph\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"gitGraph\"},{\"$type\":\"Keyword\",\"value\":\":\"}]},{\"$type\":\"Keyword\",\"value\":\"gitGraph:\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"gitGraph\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]},{\"$type\":\"Keyword\",\"value\":\":\"}]}]},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"statements\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[]}}],\"cardinality\":\"*\"}]},\"definesHiddenTokens\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Statement\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@4\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@7\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Direction\",\"definition\":{\"$type\":\"Assignment\",\"feature\":\"dir\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"LR\"},{\"$type\":\"Keyword\",\"value\":\"TB\"},{\"$type\":\"Keyword\",\"value\":\"BT\"}]}},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Commit\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"commit\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"id:\"},{\"$type\":\"Assignment\",\"feature\":\"id\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"msg:\",\"cardinality\":\"?\"},{\"$type\":\"Assignment\",\"feature\":\"message\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"tag:\"},{\"$type\":\"Assignment\",\"feature\":\"tags\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"type:\"},{\"$type\":\"Assignment\",\"feature\":\"type\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"NORMAL\"},{\"$type\":\"Keyword\",\"value\":\"REVERSE\"},{\"$type\":\"Keyword\",\"value\":\"HIGHLIGHT\"}]}}]}],\"cardinality\":\"*\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Branch\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"branch\"},{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@24\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"order:\"},{\"$type\":\"Assignment\",\"feature\":\"order\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@15\"},\"arguments\":[]}}],\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Merge\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"merge\"},{\"$type\":\"Assignment\",\"feature\":\"branch\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@24\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}]}},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"id:\"},{\"$type\":\"Assignment\",\"feature\":\"id\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"tag:\"},{\"$type\":\"Assignment\",\"feature\":\"tags\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"type:\"},{\"$type\":\"Assignment\",\"feature\":\"type\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"NORMAL\"},{\"$type\":\"Keyword\",\"value\":\"REVERSE\"},{\"$type\":\"Keyword\",\"value\":\"HIGHLIGHT\"}]}}]}],\"cardinality\":\"*\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Checkout\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"checkout\"},{\"$type\":\"Keyword\",\"value\":\"switch\"}]},{\"$type\":\"Assignment\",\"feature\":\"branch\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@24\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"CherryPicking\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"cherry-pick\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"id:\"},{\"$type\":\"Assignment\",\"feature\":\"id\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"tag:\"},{\"$type\":\"Assignment\",\"feature\":\"tags\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"parent:\"},{\"$type\":\"Assignment\",\"feature\":\"parent\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]}],\"cardinality\":\"*\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"TitleAndAccessibilities\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"accDescr\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@11\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[]}}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"BOOLEAN\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"boolean\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"true\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"false\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_DESCR\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accDescr(?:[\\\\\\\\t ]*:([^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)|\\\\\\\\s*{([^}]*)})/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accTitle[\\\\\\\\t ]*:(?:[^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*title(?:[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*|)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"FLOAT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[0-9]+\\\\\\\\.[0-9]+(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"INT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/0|[1-9][0-9]*(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NUMBER\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@14\"}},{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@15\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"STRING\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"([^\\\\\"\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\\\\"|\\'([^\\'\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\'/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ID\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\w]([-\\\\\\\\w]*\\\\\\\\w)?/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"WHITESPACE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]+/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"YAML\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/---[\\\\\\\\t ]*\\\\\\\\r?\\\\\\\\n(?:[\\\\\\\\S\\\\\\\\s]*?\\\\\\\\r?\\\\\\\\n)?---(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"DIRECTIVE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%{[\\\\\\\\S\\\\\\\\s]*?}%%(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"SINGLE_LINE_COMMENT\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%[^\\\\\\\\n\\\\\\\\r]*/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"name\":\"REFERENCE\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\w([-\\\\\\\\./\\\\\\\\w]*[-\\\\\\\\w])?/\"},\"fragment\":false,\"hidden\":false}],\"definesHiddenTokens\":false,\"hiddenTokens\":[],\"interfaces\":[],\"types\":[],\"usedGrammars\":[]}'));\n\nlet loadedRadarGrammar: Grammar | undefined;\nexport const RadarGrammar = (): Grammar => loadedRadarGrammar ?? (loadedRadarGrammar = loadGrammarFromJson('{\"$type\":\"Grammar\",\"isDeclared\":true,\"name\":\"Radar\",\"imports\":[],\"rules\":[{\"$type\":\"ParserRule\",\"entry\":true,\"name\":\"Radar\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"radar-beta\"},{\"$type\":\"Keyword\",\"value\":\"radar-beta:\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"radar-beta\"},{\"$type\":\"Keyword\",\"value\":\":\"}]}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@10\"},\"arguments\":[]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"axis\"},{\"$type\":\"Assignment\",\"feature\":\"axes\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\",\"},{\"$type\":\"Assignment\",\"feature\":\"axes\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]}}],\"cardinality\":\"*\"}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"curve\"},{\"$type\":\"Assignment\",\"feature\":\"curves\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\",\"},{\"$type\":\"Assignment\",\"feature\":\"curves\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[]}}],\"cardinality\":\"*\"}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"options\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@7\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\",\"},{\"$type\":\"Assignment\",\"feature\":\"options\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@7\"},\"arguments\":[]}}],\"cardinality\":\"*\"}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[]}],\"cardinality\":\"*\"}]},\"definesHiddenTokens\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"Label\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"[\"},{\"$type\":\"Assignment\",\"feature\":\"label\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@18\"},\"arguments\":[]}},{\"$type\":\"Keyword\",\"value\":\"]\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Axis\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[],\"cardinality\":\"?\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Curve\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[],\"cardinality\":\"?\"},{\"$type\":\"Keyword\",\"value\":\"{\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@4\"},\"arguments\":[]},{\"$type\":\"Keyword\",\"value\":\"}\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"Entries\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Assignment\",\"feature\":\"entries\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\",\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Assignment\",\"feature\":\"entries\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[]}}],\"cardinality\":\"*\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"*\"}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Assignment\",\"feature\":\"entries\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\",\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Assignment\",\"feature\":\"entries\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}}],\"cardinality\":\"*\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"*\"}]}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"DetailedEntry\",\"returnType\":{\"$ref\":\"#/interfaces@0\"},\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"axis\",\"operator\":\"=\",\"terminal\":{\"$type\":\"CrossReference\",\"type\":{\"$ref\":\"#/rules@2\"},\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[]},\"deprecatedSyntax\":false}},{\"$type\":\"Keyword\",\"value\":\":\",\"cardinality\":\"?\"},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"NumberEntry\",\"returnType\":{\"$ref\":\"#/interfaces@0\"},\"definition\":{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Option\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Keyword\",\"value\":\"showLegend\"}},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@11\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Keyword\",\"value\":\"ticks\"}},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Keyword\",\"value\":\"max\"}},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Keyword\",\"value\":\"min\"}},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"Keyword\",\"value\":\"graticule\"}},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}}]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"GRATICULE\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"circle\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"polygon\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"TitleAndAccessibilities\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"accDescr\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@14\"},\"arguments\":[]}}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"BOOLEAN\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"boolean\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"true\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"false\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_DESCR\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accDescr(?:[\\\\\\\\t ]*:([^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)|\\\\\\\\s*{([^}]*)})/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accTitle[\\\\\\\\t ]*:(?:[^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*title(?:[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*|)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"FLOAT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[0-9]+\\\\\\\\.[0-9]+(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"INT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/0|[1-9][0-9]*(?!\\\\\\\\.)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NUMBER\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@15\"}},{\"$type\":\"TerminalRuleCall\",\"rule\":{\"$ref\":\"#/rules@16\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"STRING\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"([^\\\\\"\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\\\\"|\\'([^\\'\\\\\\\\\\\\\\\\]|\\\\\\\\\\\\\\\\.)*\\'/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ID\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\w]([-\\\\\\\\w]*\\\\\\\\w)?/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"WHITESPACE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]+/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"YAML\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/---[\\\\\\\\t ]*\\\\\\\\r?\\\\\\\\n(?:[\\\\\\\\S\\\\\\\\s]*?\\\\\\\\r?\\\\\\\\n)?---(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"DIRECTIVE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%{[\\\\\\\\S\\\\\\\\s]*?}%%(?:\\\\\\\\r?\\\\\\\\n|(?!\\\\\\\\S))/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"SINGLE_LINE_COMMENT\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*%%[^\\\\\\\\n\\\\\\\\r]*/\"},\"fragment\":false}],\"interfaces\":[{\"$type\":\"Interface\",\"name\":\"Entry\",\"attributes\":[{\"$type\":\"TypeAttribute\",\"name\":\"axis\",\"isOptional\":true,\"type\":{\"$type\":\"ReferenceType\",\"referenceType\":{\"$type\":\"SimpleType\",\"typeRef\":{\"$ref\":\"#/rules@2\"}}}},{\"$type\":\"TypeAttribute\",\"name\":\"value\",\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"number\"},\"isOptional\":false}],\"superTypes\":[]}],\"definesHiddenTokens\":false,\"hiddenTokens\":[],\"types\":[],\"usedGrammars\":[]}'));\n\nlet loadedTreemapGrammar: Grammar | undefined;\nexport const TreemapGrammar = (): Grammar => loadedTreemapGrammar ?? (loadedTreemapGrammar = loadGrammarFromJson('{\"$type\":\"Grammar\",\"isDeclared\":true,\"name\":\"Treemap\",\"rules\":[{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"TitleAndAccessibilities\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"accDescr\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@4\"},\"arguments\":[]}}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"BOOLEAN\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"boolean\"},\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"true\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"false\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_DESCR\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accDescr(?:[\\\\\\\\t ]*:([^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)|\\\\\\\\s*{([^}]*)})/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ACC_TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*accTitle[\\\\\\\\t ]*:(?:[^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[^\\\\\\\\n\\\\\\\\r]*)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"TITLE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\t ]*title(?:[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*?(?=%%)|[\\\\\\\\t ][^\\\\\\\\n\\\\\\\\r]*|)/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"ParserRule\",\"entry\":true,\"name\":\"Treemap\",\"returnType\":{\"$ref\":\"#/interfaces@4\"},\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[]},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@0\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"TreemapRows\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@14\"},\"arguments\":[]}}],\"cardinality\":\"*\"}]},\"definesHiddenTokens\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"TREEMAP_KEYWORD\",\"definition\":{\"$type\":\"TerminalAlternatives\",\"elements\":[{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"treemap-beta\"}},{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\"treemap\"}}]},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"CLASS_DEF\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/classDef\\\\\\\\s+([a-zA-Z_][a-zA-Z0-9_]+)(?:\\\\\\\\s+([^;\\\\\\\\r\\\\\\\\n]*))?(?:;)?/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"STYLE_SEPARATOR\",\"definition\":{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\":::\"}},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"SEPARATOR\",\"definition\":{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\":\"}},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"COMMA\",\"definition\":{\"$type\":\"CharacterRange\",\"left\":{\"$type\":\"Keyword\",\"value\":\",\"}},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"WS\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[ \\\\\\\\t]+/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"ML_COMMENT\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\%\\\\\\\\%[^\\\\\\\\n]*/\"},\"fragment\":false},{\"$type\":\"TerminalRule\",\"hidden\":true,\"name\":\"NL\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"fragment\":false},{\"$type\":\"ParserRule\",\"name\":\"TreemapRow\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"indent\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"item\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@16\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@15\"},\"arguments\":[]}]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"ClassDef\",\"dataType\":\"string\",\"definition\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@7\"},\"arguments\":[]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Item\",\"returnType\":{\"$ref\":\"#/interfaces@0\"},\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@18\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Section\",\"returnType\":{\"$ref\":\"#/interfaces@1\"},\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@23\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"classSelector\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[]}}],\"cardinality\":\"?\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Leaf\",\"returnType\":{\"$ref\":\"#/interfaces@2\"},\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"name\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@23\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[],\"cardinality\":\"?\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@10\"},\"arguments\":[]}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[],\"cardinality\":\"?\"},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@22\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"classSelector\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[]}}],\"cardinality\":\"?\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"INDENTATION\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[ \\\\\\\\t]{1,}/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ID2\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[a-zA-Z_][a-zA-Z0-9_]*/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"NUMBER2\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[0-9_\\\\\\\\.\\\\\\\\,]+/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"ParserRule\",\"name\":\"MyNumber\",\"dataType\":\"number\",\"definition\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@21\"},\"arguments\":[]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"STRING2\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"[^\\\\\"]*\\\\\"|\\'[^\\']*\\'/\"},\"fragment\":false,\"hidden\":false}],\"interfaces\":[{\"$type\":\"Interface\",\"name\":\"Item\",\"attributes\":[{\"$type\":\"TypeAttribute\",\"name\":\"name\",\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"},\"isOptional\":false},{\"$type\":\"TypeAttribute\",\"name\":\"classSelector\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}}],\"superTypes\":[]},{\"$type\":\"Interface\",\"name\":\"Section\",\"superTypes\":[{\"$ref\":\"#/interfaces@0\"}],\"attributes\":[]},{\"$type\":\"Interface\",\"name\":\"Leaf\",\"superTypes\":[{\"$ref\":\"#/interfaces@0\"}],\"attributes\":[{\"$type\":\"TypeAttribute\",\"name\":\"value\",\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"number\"},\"isOptional\":false}]},{\"$type\":\"Interface\",\"name\":\"ClassDefStatement\",\"attributes\":[{\"$type\":\"TypeAttribute\",\"name\":\"className\",\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"},\"isOptional\":false},{\"$type\":\"TypeAttribute\",\"name\":\"styleText\",\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"},\"isOptional\":false}],\"superTypes\":[]},{\"$type\":\"Interface\",\"name\":\"Treemap\",\"attributes\":[{\"$type\":\"TypeAttribute\",\"name\":\"TreemapRows\",\"type\":{\"$type\":\"ArrayType\",\"elementType\":{\"$type\":\"SimpleType\",\"typeRef\":{\"$ref\":\"#/rules@14\"}}},\"isOptional\":false},{\"$type\":\"TypeAttribute\",\"name\":\"title\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}},{\"$type\":\"TypeAttribute\",\"name\":\"accTitle\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}},{\"$type\":\"TypeAttribute\",\"name\":\"accDescr\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}}],\"superTypes\":[]}],\"definesHiddenTokens\":false,\"hiddenTokens\":[],\"imports\":[],\"types\":[],\"usedGrammars\":[],\"$comment\":\"/**\\\\n * Treemap grammar for Langium\\\\n * Converted from mindmap grammar\\\\n *\\\\n * The ML_COMMENT and NL hidden terminals handle whitespace, comments, and newlines\\\\n * before the treemap keyword, allowing for empty lines and comments before the\\\\n * treemap declaration.\\\\n */\"}'));\n", "/******************************************************************************\n * This file was generated by langium-cli 3.3.0.\n * DO NOT EDIT MANUALLY!\n ******************************************************************************/\n\nimport type { LangiumSharedCoreServices, LangiumCoreServices, LangiumGeneratedCoreServices, LangiumGeneratedSharedCoreServices, LanguageMetaData, Module } from 'langium';\nimport { MermaidAstReflection } from './ast.js';\nimport { InfoGrammar, PacketGrammar, PieGrammar, ArchitectureGrammar, GitGraphGrammar, RadarGrammar, TreemapGrammar } from './grammar.js';\n\nexport const InfoLanguageMetaData = {\n languageId: 'info',\n fileExtensions: ['.mmd', '.mermaid'],\n caseInsensitive: false,\n mode: 'production'\n} as const satisfies LanguageMetaData;\n\nexport const PacketLanguageMetaData = {\n languageId: 'packet',\n fileExtensions: ['.mmd', '.mermaid'],\n caseInsensitive: false,\n mode: 'production'\n} as const satisfies LanguageMetaData;\n\nexport const PieLanguageMetaData = {\n languageId: 'pie',\n fileExtensions: ['.mmd', '.mermaid'],\n caseInsensitive: false,\n mode: 'production'\n} as const satisfies LanguageMetaData;\n\nexport const ArchitectureLanguageMetaData = {\n languageId: 'architecture',\n fileExtensions: ['.mmd', '.mermaid'],\n caseInsensitive: false,\n mode: 'production'\n} as const satisfies LanguageMetaData;\n\nexport const GitGraphLanguageMetaData = {\n languageId: 'gitGraph',\n fileExtensions: ['.mmd', '.mermaid'],\n caseInsensitive: false,\n mode: 'production'\n} as const satisfies LanguageMetaData;\n\nexport const RadarLanguageMetaData = {\n languageId: 'radar',\n fileExtensions: ['.mmd', '.mermaid'],\n caseInsensitive: false,\n mode: 'production'\n} as const satisfies LanguageMetaData;\n\nexport const TreemapLanguageMetaData = {\n languageId: 'treemap',\n fileExtensions: ['.mmd', '.mermaid'],\n caseInsensitive: false,\n mode: 'production'\n} as const satisfies LanguageMetaData;\n\nexport const MermaidGeneratedSharedModule: Module<LangiumSharedCoreServices, LangiumGeneratedSharedCoreServices> = {\n AstReflection: () => new MermaidAstReflection()\n};\n\nexport const InfoGeneratedModule: Module<LangiumCoreServices, LangiumGeneratedCoreServices> = {\n Grammar: () => InfoGrammar(),\n LanguageMetaData: () => InfoLanguageMetaData,\n parser: {}\n};\n\nexport const PacketGeneratedModule: Module<LangiumCoreServices, LangiumGeneratedCoreServices> = {\n Grammar: () => PacketGrammar(),\n LanguageMetaData: () => PacketLanguageMetaData,\n parser: {}\n};\n\nexport const PieGeneratedModule: Module<LangiumCoreServices, LangiumGeneratedCoreServices> = {\n Grammar: () => PieGrammar(),\n LanguageMetaData: () => PieLanguageMetaData,\n parser: {}\n};\n\nexport const ArchitectureGeneratedModule: Module<LangiumCoreServices, LangiumGeneratedCoreServices> = {\n Grammar: () => ArchitectureGrammar(),\n LanguageMetaData: () => ArchitectureLanguageMetaData,\n parser: {}\n};\n\nexport const GitGraphGeneratedModule: Module<LangiumCoreServices, LangiumGeneratedCoreServices> = {\n Grammar: () => GitGraphGrammar(),\n LanguageMetaData: () => GitGraphLanguageMetaData,\n parser: {}\n};\n\nexport const RadarGeneratedModule: Module<LangiumCoreServices, LangiumGeneratedCoreServices> = {\n Grammar: () => RadarGrammar(),\n LanguageMetaData: () => RadarLanguageMetaData,\n parser: {}\n};\n\nexport const TreemapGeneratedModule: Module<LangiumCoreServices, LangiumGeneratedCoreServices> = {\n Grammar: () => TreemapGrammar(),\n LanguageMetaData: () => TreemapLanguageMetaData,\n parser: {}\n};\n", "/**\n * Matches single and multi line accessible description\n */\nexport const accessibilityDescrRegex = /accDescr(?:[\\t ]*:([^\\n\\r]*)|\\s*{([^}]*)})/;\n\n/**\n * Matches single line accessible title\n */\nexport const accessibilityTitleRegex = /accTitle[\\t ]*:([^\\n\\r]*)/;\n\n/**\n * Matches a single line title\n */\nexport const titleRegex = /title([\\t ][^\\n\\r]*|)/;\n", "import type { CstNode, GrammarAST, ValueType } from 'langium';\nimport { DefaultValueConverter } from 'langium';\n\nimport { accessibilityDescrRegex, accessibilityTitleRegex, titleRegex } from './matcher.js';\n\nconst rulesRegexes: Record<string, RegExp> = {\n ACC_DESCR: accessibilityDescrRegex,\n ACC_TITLE: accessibilityTitleRegex,\n TITLE: titleRegex,\n};\n\nexport abstract class AbstractMermaidValueConverter extends DefaultValueConverter {\n /**\n * A method contains convert logic to be used by class.\n *\n * @param rule - Parsed rule.\n * @param input - Matched string.\n * @param cstNode - Node in the Concrete Syntax Tree (CST).\n * @returns converted the value if it's available or `undefined` if it's not.\n */\n protected abstract runCustomConverter(\n rule: GrammarAST.AbstractRule,\n input: string,\n cstNode: CstNode\n ): ValueType | undefined;\n\n protected override runConverter(\n rule: GrammarAST.AbstractRule,\n input: string,\n cstNode: CstNode\n ): ValueType {\n let value: ValueType | undefined = this.runCommonConverter(rule, input, cstNode);\n\n if (value === undefined) {\n value = this.runCustomConverter(rule, input, cstNode);\n }\n if (value === undefined) {\n return super.runConverter(rule, input, cstNode);\n }\n\n return value;\n }\n\n private runCommonConverter(\n rule: GrammarAST.AbstractRule,\n input: string,\n _cstNode: CstNode\n ): ValueType | undefined {\n const regex: RegExp | undefined = rulesRegexes[rule.name];\n if (regex === undefined) {\n return undefined;\n }\n const match = regex.exec(input);\n if (match === null) {\n return undefined;\n }\n // single line title, accTitle, accDescr\n if (match[1] !== undefined) {\n return match[1].trim().replace(/[\\t ]{2,}/gm, ' ');\n }\n // multi line accDescr\n if (match[2] !== undefined) {\n return match[2]\n .replace(/^\\s*/gm, '')\n .replace(/\\s+$/gm, '')\n .replace(/[\\t ]{2,}/gm, ' ')\n .replace(/[\\n\\r]{2,}/gm, '\\n');\n }\n return undefined;\n }\n}\n\nexport class CommonValueConverter extends AbstractMermaidValueConverter {\n protected override runCustomConverter(\n _rule: GrammarAST.AbstractRule,\n _input: string,\n _cstNode: CstNode\n ): ValueType | undefined {\n return undefined;\n }\n}\n", "import type { GrammarAST, Stream, TokenBuilderOptions } from 'langium';\nimport type { TokenType } from 'chevrotain';\n\nimport { DefaultTokenBuilder } from 'langium';\n\nexport abstract class AbstractMermaidTokenBuilder extends DefaultTokenBuilder {\n private keywords: Set<string>;\n\n public constructor(keywords: string[]) {\n super();\n this.keywords = new Set<string>(keywords);\n }\n\n protected override buildKeywordTokens(\n rules: Stream<GrammarAST.AbstractRule>,\n terminalTokens: TokenType[],\n options?: TokenBuilderOptions\n ): TokenType[] {\n const tokenTypes: TokenType[] = super.buildKeywordTokens(rules, terminalTokens, options);\n // to restrict users, they mustn't have any non-whitespace characters after the keyword.\n tokenTypes.forEach((tokenType: TokenType): void => {\n if (this.keywords.has(tokenType.name) && tokenType.PATTERN !== undefined) {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n tokenType.PATTERN = new RegExp(tokenType.PATTERN.toString() + '(?:(?=%%)|(?!\\\\S))');\n }\n });\n return tokenTypes;\n }\n}\n\nexport class CommonTokenBuilder extends AbstractMermaidTokenBuilder {}\n"],
"mappings": "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",
"names": ["exports", "RAL", "exports", "exports", "Event", "Emitter", "exports", "Is", "CancellationToken", "CancellationTokenSource", "TextDocument", "URI", "stream", "root", "Reduction", "min", "RangeComparison", "last", "property", "root", "reflection", "newState", "atom", "process", "property", "first", "negate", "Symbol", "objectProto", "nativeObjectToString", "symToStringTag", "INFINITY", "funcProto", "objectProto", "funcToString", "hasOwnProperty", "objectProto", "hasOwnProperty", "MAX_SAFE_INTEGER", "objectProto", "objectProto", "hasOwnProperty", "Buffer", "argsTag", "funcTag", "freeExports", "freeModule", "moduleExports", "objectProto", "hasOwnProperty", "isType", "objectProto", "hasOwnProperty", "objectProto", "hasOwnProperty", "objectProto", "hasOwnProperty", "objectProto", "hasOwnProperty", "objectProto", "hasOwnProperty", "HASH_UNDEFINED", "Map", "map", "toString", "INFINITY", "values", "freeExports", "freeModule", "moduleExports", "Buffer", "objectProto", "propertyIsEnumerable", "nativeGetSymbols", "Promise", "Set", "mapTag", "objectTag", "setTag", "weakMapTag", "dataViewTag", "objectProto", "hasOwnProperty", "Uint8Array", "symbolProto", "boolTag", "dateTag", "mapTag", "numberTag", "regexpTag", "setTag", "stringTag", "symbolTag", "arrayBufferTag", "dataViewTag", "float32Tag", "float64Tag", "int8Tag", "int16Tag", "int32Tag", "uint8Tag", "uint8ClampedTag", "uint16Tag", "uint32Tag", "mapTag", "setTag", "argsTag", "arrayTag", "boolTag", "dateTag", "errorTag", "funcTag", "genTag", "mapTag", "numberTag", "objectTag", "regexpTag", "setTag", "stringTag", "symbolTag", "weakMapTag", "arrayBufferTag", "dataViewTag", "float32Tag", "float64Tag", "int8Tag", "int16Tag", "int32Tag", "uint8Tag", "uint8ClampedTag", "uint16Tag", "uint32Tag", "key", "CLONE_SYMBOLS_FLAG", "HASH_UNDEFINED", "values", "othValue", "map", "COMPARE_PARTIAL_FLAG", "COMPARE_UNORDERED_FLAG", "boolTag", "dateTag", "errorTag", "mapTag", "numberTag", "regexpTag", "setTag", "stringTag", "symbolTag", "arrayBufferTag", "dataViewTag", "symbolProto", "symbolValueOf", "COMPARE_PARTIAL_FLAG", "objectProto", "hasOwnProperty", "COMPARE_PARTIAL_FLAG", "argsTag", "arrayTag", "objectTag", "objectProto", "hasOwnProperty", "COMPARE_PARTIAL_FLAG", "COMPARE_UNORDERED_FLAG", "COMPARE_PARTIAL_FLAG", "COMPARE_UNORDERED_FLAG", "collection", "objectProto", "hasOwnProperty", "LARGE_ARRAY_SIZE", "values", "includes", "values", "collection", "collection", "nativeMax", "collection", "objectProto", "hasOwnProperty", "objectProto", "hasOwnProperty", "stringTag", "nativeMax", "nativeMax", "mapTag", "setTag", "objectProto", "hasOwnProperty", "regexpTag", "FUNC_ERROR_TEXT", "collection", "collection", "INFINITY", "values", "LARGE_ARRAY_SIZE", "includes", "visitor", "atom", "map", "LexerDefinitionErrorType", "msg", "currConfig", "tokenLabel", "hasTokenLabel", "hasTokenLabel", "hasTokenLabel", "tokenLabel", "getExtraProductionArgument", "PROD_TYPE", "tokenMatcher", "keys", "prefixKeys", "visitor", "collectorVisitor", "option", "alternation", "resolveGrammar", "validateGrammar", "alternation", "repetition", "option", "repetitionMandatory", "CstVisitorDefinitionError", "newState", "allTokenTypes", "invokeRuleWithTry", "newState", "ParserDefinitionErrorType", "resolveGrammar", "validateGrammar", "repetition", "alternation", "option", "block", "plus", "star", "optional", "getProdType", "first", "last", "map", "closure", "newState", "tokenLabel", "getProductionDslName", "DocumentUri", "URI", "integer", "uinteger", "Position", "Range", "Location", "LocationLink", "Color", "ColorInformation", "ColorPresentation", "FoldingRangeKind", "FoldingRange", "DiagnosticRelatedInformation", "DiagnosticSeverity", "DiagnosticTag", "CodeDescription", "Diagnostic", "Command", "TextEdit", "ChangeAnnotation", "ChangeAnnotationIdentifier", "AnnotatedTextEdit", "TextDocumentEdit", "CreateFile", "RenameFile", "DeleteFile", "WorkspaceEdit", "TextDocumentIdentifier", "VersionedTextDocumentIdentifier", "OptionalVersionedTextDocumentIdentifier", "TextDocumentItem", "MarkupKind", "MarkupContent", "CompletionItemKind", "InsertTextFormat", "CompletionItemTag", "InsertReplaceEdit", "InsertTextMode", "CompletionItemLabelDetails", "CompletionItem", "CompletionList", "MarkedString", "Hover", "ParameterInformation", "SignatureInformation", "DocumentHighlightKind", "DocumentHighlight", "SymbolKind", "SymbolTag", "SymbolInformation", "WorkspaceSymbol", "DocumentSymbol", "CodeActionKind", "CodeActionTriggerKind", "CodeActionContext", "CodeAction", "CodeLens", "FormattingOptions", "DocumentLink", "SelectionRange", "SemanticTokenTypes", "SemanticTokenModifiers", "SemanticTokens", "InlineValueText", "InlineValueVariableLookup", "InlineValueEvaluatableExpression", "InlineValueContext", "InlayHintKind", "InlayHintLabelPart", "InlayHint", "StringValue", "InlineCompletionItem", "InlineCompletionList", "InlineCompletionTriggerKind", "SelectedCompletionInfo", "InlineCompletionContext", "WorkspaceFolder", "TextDocument", "mergeSort", "Is", "toString", "undefined", "min", "integer", "uinteger", "token", "last", "ValueConverter", "reject", "FullTextDocument", "TextDocument", "assertPath", "path", "TypeError", "JSON", "stringify", "normalizeStringPosix", "allowAboveRoot", "code", "res", "lastSegmentLength", "lastSlash", "dots", "i", "length", "charCodeAt", "lastSlashIndex", "lastIndexOf", "slice", "posix", "resolve", "cwd", "resolvedPath", "resolvedAbsolute", "arguments", "process", "normalize", "isAbsolute", "trailingSeparator", "join", "joined", "arg", "relative", "from", "to", "fromStart", "fromEnd", "fromLen", "toStart", "toLen", "lastCommonSep", "fromCode", "out", "_makeLong", "dirname", "hasRoot", "end", "matchedSlash", "basename", "ext", "start", "extIdx", "firstNonSlashEnd", "extname", "startDot", "startPart", "preDotState", "format", "pathObject", "sep", "dir", "root", "base", "name", "parse", "ret", "delimiter", "win32", "module", "exports", "__webpack_module_cache__", "__webpack_require__", "moduleId", "cachedModule", "__webpack_modules__", "d", "definition", "key", "o", "Object", "defineProperty", "enumerable", "get", "obj", "prop", "prototype", "hasOwnProperty", "call", "r", "Symbol", "toStringTag", "value", "isWindows", "platform", "navigator", "userAgent", "indexOf", "_schemePattern", "_singleSlashStart", "_doubleSlashStart", "_validateUri", "_strict", "scheme", "Error", "authority", "query", "fragment", "test", "_empty", "_slash", "_regexp", "URI", "thing", "fsPath", "with", "toString", "schemeOrData", "this", "uriToFsPath", "change", "Uri", "match", "exec", "percentDecode", "replace", "idx", "substring", "components", "result", "skipEncoding", "_asFormatted", "toJSON", "data", "_formatted", "external", "_fsPath", "_sep", "_pathSepMarker", "$mid", "encodeTable", "encodeURIComponentFast", "uriComponent", "isPath", "isAuthority", "nativeEncodePos", "pos", "encodeURIComponent", "charAt", "substr", "escaped", "encodeURIComponentMinimal", "uri", "keepDriveLetterCasing", "toLowerCase", "encoder", "userinfo", "String", "fromCharCode", "decodeURIComponentGraceful", "str", "decodeURIComponent", "_rEncodedAsHex", "posixPath", "slash", "Utils", "t", "joinPath", "paths", "resolvePath", "slashAdded", "UriUtils", "URI", "DocumentState", "URI", "TextDocument", "property", "values", "exports", "root", "property", "node", "documentUri", "URI", "document", "services", "ValidationCategory", "DocumentValidator", "property", "Disposable", "reject", "_a", "exports", "URI", "first", "last", "option", "URI", "root", "Module", "module", "LexingMode", "URI", "URI", "reflection", "reflection", "reflection", "reflection", "Group", "reflection", "reflection", "Option", "reflection", "reflection", "Group", "Option", "reflection"]
}