(srv, query, file, expr, isRename)
| 996 | } |
| 997 | |
| 998 | function findRefsToVariable(srv, query, file, expr, isRename) { |
| 999 | var name = expr.node.name; |
| 1000 | |
| 1001 | for (var scope = expr.state; scope && !(name in scope.props); scope = scope.prev) {} |
| 1002 | if (!scope) throw ternError("Could not find a definition for " + name); |
| 1003 | |
| 1004 | var type, refs = []; |
| 1005 | function storeRef(file) { |
| 1006 | return function(node, scopeHere, ancestors) { |
| 1007 | var value = {file: file.name, |
| 1008 | start: outputPos(query, file, node.start), |
| 1009 | end: outputPos(query, file, node.end)} |
| 1010 | if (isRename) { |
| 1011 | for (var s = scopeHere; s != scope; s = s.prev) { |
| 1012 | var exists = s.hasProp(isRename); |
| 1013 | if (exists) |
| 1014 | throw ternError("Renaming `" + name + "` to `" + isRename + "` would make a variable at line " + |
| 1015 | (asLineChar(file, node.start).line + 1) + " point to the definition at line " + |
| 1016 | (asLineChar(file, exists.name.start).line + 1)); |
| 1017 | } |
| 1018 | var parent = ancestors[ancestors.length - 2] |
| 1019 | if (parent && parent.type == "Property" && parent.key == parent.value) |
| 1020 | value.isShorthand = true |
| 1021 | } |
| 1022 | refs.push(value); |
| 1023 | }; |
| 1024 | } |
| 1025 | |
| 1026 | if (scope.originNode) { |
| 1027 | type = "local"; |
| 1028 | if (isRename) { |
| 1029 | for (var prev = scope.prev; prev; prev = prev.prev) |
| 1030 | if (isRename in prev.props) break; |
| 1031 | if (prev) infer.findRefs(scope.originNode, scope, isRename, prev, function(node) { |
| 1032 | throw ternError("Renaming `" + name + "` to `" + isRename + "` would shadow the definition used at line " + |
| 1033 | (asLineChar(file, node.start).line + 1)); |
| 1034 | }); |
| 1035 | } |
| 1036 | infer.findRefs(scope.originNode, scope, name, scope, storeRef(file)); |
| 1037 | } else { |
| 1038 | type = "global"; |
| 1039 | if (query.onlySourceFile) { |
| 1040 | infer.findRefs(file.ast, file.scope, name, scope, storeRef(file)); |
| 1041 | } else { |
| 1042 | for (var i = 0; i < srv.files.length; ++i) { |
| 1043 | var cur = srv.files[i]; |
| 1044 | infer.findRefs(cur.ast, cur.scope, name, scope, storeRef(cur)); |
| 1045 | } |
| 1046 | } |
| 1047 | } |
| 1048 | |
| 1049 | return {refs: refs, type: type, name: name}; |
| 1050 | } |
| 1051 | |
| 1052 | function findRefsToProperty(srv, query, sourceFile, expr, prop) { |
| 1053 | var exprType = infer.expressionType(expr); |
no test coverage detected