(srv, query, file, expr, isRename)
| 1061 | } |
| 1062 | |
| 1063 | function findRefsToVariable(srv, query, file, expr, isRename) { |
| 1064 | var name = expr.node.name; |
| 1065 | |
| 1066 | for (var scope = expr.state; scope && !(name in scope.props); scope = scope.prev) {} |
| 1067 | if (!scope) throw ternError("Could not find a definition for " + name); |
| 1068 | |
| 1069 | var type, refs = []; |
| 1070 | function storeRef(file) { |
| 1071 | return function(node, scopeHere, ancestors) { |
| 1072 | var value = {file: file.name, |
| 1073 | start: outputPos(query, file, node.start), |
| 1074 | end: outputPos(query, file, node.end)}; |
| 1075 | if (isRename) { |
| 1076 | for (var s = scopeHere; s != scope; s = s.prev) { |
| 1077 | var exists = s.hasProp(isRename); |
| 1078 | if (exists) |
| 1079 | throw ternError("Renaming `" + name + "` to `" + isRename + "` would make a variable at line " + |
| 1080 | (asLineChar(file, node.start).line + 1) + " point to the definition at line " + |
| 1081 | (asLineChar(file, exists.name.start).line + 1)); |
| 1082 | } |
| 1083 | var parent = ancestors[ancestors.length - 2]; |
| 1084 | if (parent && parent.type == "Property" && parent.key == parent.value) |
| 1085 | value.isShorthand = true; |
| 1086 | } |
| 1087 | refs.push(value); |
| 1088 | }; |
| 1089 | } |
| 1090 | |
| 1091 | if (scope.originNode) { |
| 1092 | type = "local"; |
| 1093 | if (isRename) { |
| 1094 | for (var prev = scope.prev; prev; prev = prev.prev) |
| 1095 | if (isRename in prev.props) break; |
| 1096 | if (prev) infer.findRefs(scope.originNode, scope, isRename, prev, function(node) { |
| 1097 | throw ternError("Renaming `" + name + "` to `" + isRename + "` would shadow the definition used at line " + |
| 1098 | (asLineChar(file, node.start).line + 1)); |
| 1099 | }); |
| 1100 | } |
| 1101 | infer.findRefs(scope.originNode, scope, name, scope, storeRef(file)); |
| 1102 | } else { |
| 1103 | type = "global"; |
| 1104 | if (query.onlySourceFile) { |
| 1105 | infer.findRefs(file.ast, file.scope, name, scope, storeRef(file)); |
| 1106 | } else { |
| 1107 | for (var i = 0; i < srv.files.length; ++i) { |
| 1108 | var cur = srv.files[i]; |
| 1109 | infer.findRefs(cur.ast, cur.scope, name, scope, storeRef(cur)); |
| 1110 | } |
| 1111 | } |
| 1112 | } |
| 1113 | |
| 1114 | return {refs: refs, type: type, name: name}; |
| 1115 | } |
| 1116 | |
| 1117 | function findRefsToProperty(srv, query, sourceFile, expr, prop) { |
| 1118 | var exprType = infer.expressionType(expr); |
no test coverage detected
searching dependent graphs…