UNPKG

1.61 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"];
4
5exports.__esModule = true;
6
7var _leven = require("leven");
8
9var _leven2 = _interopRequireDefault(_leven);
10
11exports["default"] = function (_ref) {
12 var messages = _ref.messages;
13
14 return {
15 visitor: {
16 ReferencedIdentifier: function ReferencedIdentifier(path) {
17 var node = path.node;
18 var scope = path.scope;
19
20 var binding = scope.getBinding(node.name);
21 if (binding && binding.kind === "type" && !path.parentPath.isFlow()) {
22 throw path.buildCodeFrameError(messages.get("undeclaredVariableType", node.name), ReferenceError);
23 }
24
25 if (scope.hasBinding(node.name)) return;
26
27 // get the closest declaration to offer as a suggestion
28 // the variable name may have just been mistyped
29
30 var bindings = scope.getAllBindings();
31
32 var closest = undefined;
33 var shortest = -1;
34
35 for (var _name in bindings) {
36 var distance = _leven2["default"](node.name, _name);
37 if (distance <= 0 || distance > 3) continue;
38 if (distance <= shortest) continue;
39
40 closest = _name;
41 shortest = distance;
42 }
43
44 var msg = undefined;
45 if (closest) {
46 msg = messages.get("undeclaredVariableSuggestion", node.name, closest);
47 } else {
48 msg = messages.get("undeclaredVariable", node.name);
49 }
50
51 //
52
53 throw path.buildCodeFrameError(msg, ReferenceError);
54 }
55 }
56 };
57};
58
59module.exports = exports["default"];
\No newline at end of file