Spaces:
Sleeping
Sleeping
| ; | |
| function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); } | |
| function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } | |
| function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } | |
| function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; } | |
| function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } | |
| const { | |
| Definition, | |
| PatternVisitor: OriginalPatternVisitor, | |
| Referencer: OriginalReferencer, | |
| Scope, | |
| ScopeManager | |
| } = require("@nicolo-ribaudo/eslint-scope-5-internals"); | |
| const { | |
| getKeys: fallback | |
| } = require("eslint-visitor-keys"); | |
| let visitorKeysMap; | |
| function getVisitorValues(nodeType, client) { | |
| if (visitorKeysMap) return visitorKeysMap[nodeType]; | |
| const { | |
| FLOW_FLIPPED_ALIAS_KEYS, | |
| VISITOR_KEYS | |
| } = client.getTypesInfo(); | |
| const flowFlippedAliasKeys = new Set(FLOW_FLIPPED_ALIAS_KEYS.concat(["ArrayPattern", "ClassDeclaration", "ClassExpression", "FunctionDeclaration", "FunctionExpression", "Identifier", "ObjectPattern", "RestElement"])); | |
| visitorKeysMap = (Object.entries || (o => Object.keys(o).map(k => [k, o[k]])))(VISITOR_KEYS).reduce((acc, [key, value]) => { | |
| if (!flowFlippedAliasKeys.has(value)) { | |
| acc[key] = value; | |
| } | |
| return acc; | |
| }, {}); | |
| return visitorKeysMap[nodeType]; | |
| } | |
| const propertyTypes = { | |
| callProperties: { | |
| type: "loop", | |
| values: ["value"] | |
| }, | |
| indexers: { | |
| type: "loop", | |
| values: ["key", "value"] | |
| }, | |
| properties: { | |
| type: "loop", | |
| values: ["argument", "value"] | |
| }, | |
| types: { | |
| type: "loop" | |
| }, | |
| params: { | |
| type: "loop" | |
| }, | |
| argument: { | |
| type: "single" | |
| }, | |
| elementType: { | |
| type: "single" | |
| }, | |
| qualification: { | |
| type: "single" | |
| }, | |
| rest: { | |
| type: "single" | |
| }, | |
| returnType: { | |
| type: "single" | |
| }, | |
| typeAnnotation: { | |
| type: "typeAnnotation" | |
| }, | |
| typeParameters: { | |
| type: "typeParameters" | |
| }, | |
| id: { | |
| type: "id" | |
| } | |
| }; | |
| class PatternVisitor extends OriginalPatternVisitor { | |
| ArrayPattern(node) { | |
| node.elements.forEach(this.visit, this); | |
| } | |
| ObjectPattern(node) { | |
| node.properties.forEach(this.visit, this); | |
| } | |
| } | |
| var _client = new WeakMap(); | |
| class Referencer extends OriginalReferencer { | |
| constructor(options, scopeManager, client) { | |
| super(options, scopeManager); | |
| _classPrivateFieldInitSpec(this, _client, void 0); | |
| _classPrivateFieldSet(_client, this, client); | |
| } | |
| visitPattern(node, options, callback) { | |
| if (!node) { | |
| return; | |
| } | |
| this._checkIdentifierOrVisit(node.typeAnnotation); | |
| if (node.type === "AssignmentPattern") { | |
| this._checkIdentifierOrVisit(node.left.typeAnnotation); | |
| } | |
| if (typeof options === "function") { | |
| callback = options; | |
| options = { | |
| processRightHandNodes: false | |
| }; | |
| } | |
| const visitor = new PatternVisitor(this.options, node, callback); | |
| visitor.visit(node); | |
| if (options.processRightHandNodes) { | |
| visitor.rightHandNodes.forEach(this.visit, this); | |
| } | |
| } | |
| visitClass(node) { | |
| var _ref; | |
| this._visitArray(node.decorators); | |
| const typeParamScope = this._nestTypeParamScope(node); | |
| this._visitTypeAnnotation(node.implements); | |
| this._visitTypeAnnotation((_ref = node.superTypeParameters) == null ? void 0 : _ref.params); | |
| super.visitClass(node); | |
| if (typeParamScope) { | |
| this.close(node); | |
| } | |
| } | |
| visitFunction(node) { | |
| const typeParamScope = this._nestTypeParamScope(node); | |
| this._checkIdentifierOrVisit(node.returnType); | |
| super.visitFunction(node); | |
| if (typeParamScope) { | |
| this.close(node); | |
| } | |
| } | |
| visitProperty(node) { | |
| var _node$value; | |
| if (((_node$value = node.value) == null ? void 0 : _node$value.type) === "TypeCastExpression") { | |
| this._visitTypeAnnotation(node.value); | |
| } | |
| this._visitArray(node.decorators); | |
| super.visitProperty(node); | |
| } | |
| InterfaceDeclaration(node) { | |
| this._createScopeVariable(node, node.id); | |
| const typeParamScope = this._nestTypeParamScope(node); | |
| this._visitArray(node.extends); | |
| this.visit(node.body); | |
| if (typeParamScope) { | |
| this.close(node); | |
| } | |
| } | |
| TypeAlias(node) { | |
| this._createScopeVariable(node, node.id); | |
| const typeParamScope = this._nestTypeParamScope(node); | |
| this.visit(node.right); | |
| if (typeParamScope) { | |
| this.close(node); | |
| } | |
| } | |
| ClassProperty(node) { | |
| this._visitClassProperty(node); | |
| } | |
| ClassPrivateProperty(node) { | |
| this._visitClassProperty(node); | |
| } | |
| AccessorProperty(node) { | |
| this._visitClassProperty(node); | |
| } | |
| ClassAccessorProperty(node) { | |
| this._visitClassProperty(node); | |
| } | |
| PropertyDefinition(node) { | |
| this._visitClassProperty(node); | |
| } | |
| ClassPrivateMethod(node) { | |
| super.MethodDefinition(node); | |
| } | |
| DeclareModule(node) { | |
| this._visitDeclareX(node); | |
| } | |
| DeclareFunction(node) { | |
| this._visitDeclareX(node); | |
| } | |
| DeclareVariable(node) { | |
| this._visitDeclareX(node); | |
| } | |
| DeclareClass(node) { | |
| this._visitDeclareX(node); | |
| } | |
| OptionalMemberExpression(node) { | |
| super.MemberExpression(node); | |
| } | |
| _visitClassProperty(node) { | |
| const { | |
| computed, | |
| key, | |
| typeAnnotation, | |
| decorators, | |
| value | |
| } = node; | |
| this._visitArray(decorators); | |
| if (computed) this.visit(key); | |
| this._visitTypeAnnotation(typeAnnotation); | |
| if (value) { | |
| if (this.scopeManager.__nestClassFieldInitializerScope) { | |
| this.scopeManager.__nestClassFieldInitializerScope(value); | |
| } else { | |
| this.scopeManager.__nestScope(new Scope(this.scopeManager, "function", this.scopeManager.__currentScope, value, true)); | |
| } | |
| this.visit(value); | |
| this.close(value); | |
| } | |
| } | |
| _visitDeclareX(node) { | |
| if (node.id) { | |
| this._createScopeVariable(node, node.id); | |
| } | |
| const typeParamScope = this._nestTypeParamScope(node); | |
| if (typeParamScope) { | |
| this.close(node); | |
| } | |
| } | |
| _createScopeVariable(node, name) { | |
| this.currentScope().variableScope.__define(name, new Definition("Variable", name, node, null, null, null)); | |
| } | |
| _nestTypeParamScope(node) { | |
| if (!node.typeParameters) { | |
| return null; | |
| } | |
| const parentScope = this.scopeManager.__currentScope; | |
| const scope = new Scope(this.scopeManager, "type-parameters", parentScope, node, false); | |
| this.scopeManager.__nestScope(scope); | |
| for (let j = 0; j < node.typeParameters.params.length; j++) { | |
| const name = node.typeParameters.params[j]; | |
| scope.__define(name, new Definition("TypeParameter", name, name)); | |
| if (name.typeAnnotation) { | |
| this._checkIdentifierOrVisit(name); | |
| } | |
| } | |
| scope.__define = parentScope.__define.bind(parentScope); | |
| return scope; | |
| } | |
| _visitTypeAnnotation(node) { | |
| if (!node) { | |
| return; | |
| } | |
| if (Array.isArray(node)) { | |
| node.forEach(this._visitTypeAnnotation, this); | |
| return; | |
| } | |
| const visitorValues = getVisitorValues(node.type, _classPrivateFieldGet(_client, this)); | |
| if (!visitorValues) { | |
| return; | |
| } | |
| for (let i = 0; i < visitorValues.length; i++) { | |
| const visitorValue = visitorValues[i]; | |
| const propertyType = propertyTypes[visitorValue]; | |
| const nodeProperty = node[visitorValue]; | |
| if (propertyType == null || nodeProperty == null) { | |
| continue; | |
| } | |
| if (propertyType.type === "loop") { | |
| for (let j = 0; j < nodeProperty.length; j++) { | |
| if (Array.isArray(propertyType.values)) { | |
| for (let k = 0; k < propertyType.values.length; k++) { | |
| const loopPropertyNode = nodeProperty[j][propertyType.values[k]]; | |
| if (loopPropertyNode) { | |
| this._checkIdentifierOrVisit(loopPropertyNode); | |
| } | |
| } | |
| } else { | |
| this._checkIdentifierOrVisit(nodeProperty[j]); | |
| } | |
| } | |
| } else if (propertyType.type === "single") { | |
| this._checkIdentifierOrVisit(nodeProperty); | |
| } else if (propertyType.type === "typeAnnotation") { | |
| this._visitTypeAnnotation(node.typeAnnotation); | |
| } else if (propertyType.type === "typeParameters") { | |
| for (let l = 0; l < node.typeParameters.params.length; l++) { | |
| this._checkIdentifierOrVisit(node.typeParameters.params[l]); | |
| } | |
| } else if (propertyType.type === "id") { | |
| if (node.id.type === "Identifier") { | |
| this._checkIdentifierOrVisit(node.id); | |
| } else { | |
| this._visitTypeAnnotation(node.id); | |
| } | |
| } | |
| } | |
| } | |
| _checkIdentifierOrVisit(node) { | |
| if (node != null && node.typeAnnotation) { | |
| this._visitTypeAnnotation(node.typeAnnotation); | |
| } else if ((node == null ? void 0 : node.type) === "Identifier") { | |
| this.visit(node); | |
| } else { | |
| this._visitTypeAnnotation(node); | |
| } | |
| } | |
| _visitArray(nodeList) { | |
| if (nodeList) { | |
| for (const node of nodeList) { | |
| this.visit(node); | |
| } | |
| } | |
| } | |
| } | |
| module.exports = function analyzeScope(ast, parserOptions, client) { | |
| var _parserOptions$ecmaFe; | |
| const options = { | |
| ignoreEval: true, | |
| optimistic: false, | |
| directive: false, | |
| nodejsScope: ast.sourceType === "script" && ((_parserOptions$ecmaFe = parserOptions.ecmaFeatures) == null ? void 0 : _parserOptions$ecmaFe.globalReturn) === true, | |
| impliedStrict: false, | |
| sourceType: ast.sourceType, | |
| ecmaVersion: parserOptions.ecmaVersion, | |
| fallback, | |
| childVisitorKeys: client.getVisitorKeys() | |
| }; | |
| const scopeManager = new ScopeManager(options); | |
| const referencer = new Referencer(options, scopeManager, client); | |
| referencer.visit(ast); | |
| return scopeManager; | |
| }; | |
| //# sourceMappingURL=analyze-scope.cjs.map | |