| 1050 | } |
| 1051 | |
| 1052 | function findRefsToProperty(srv, query, sourceFile, expr, prop) { |
| 1053 | var exprType = infer.expressionType(expr); |
| 1054 | if (expr.node.type == "MethodDefinition") { |
| 1055 | exprType = exprType.propertyOf; |
| 1056 | } |
| 1057 | var objType = exprType.getObjType(); |
| 1058 | if (!objType) throw ternError("Couldn't determine type of base object."); |
| 1059 | |
| 1060 | var refs = []; |
| 1061 | function storeRef(file) { |
| 1062 | return function(node) { |
| 1063 | refs.push({file: file.name, |
| 1064 | start: outputPos(query, file, node.start), |
| 1065 | end: outputPos(query, file, node.end)}); |
| 1066 | }; |
| 1067 | } |
| 1068 | |
| 1069 | if (query.onlySourceFile) { |
| 1070 | infer.findPropRefs(sourceFile.ast, sourceFile.scope, objType, prop.name, storeRef(sourceFile)); |
| 1071 | } else { |
| 1072 | for (var i = 0; i < srv.files.length; ++i) { |
| 1073 | var cur = srv.files[i]; |
| 1074 | infer.findPropRefs(cur.ast, cur.scope, objType, prop.name, storeRef(cur)); |
| 1075 | } |
| 1076 | } |
| 1077 | |
| 1078 | return {refs: refs, name: prop.name}; |
| 1079 | } |
| 1080 | |
| 1081 | function findRefs(srv, query, file) { |
| 1082 | var expr = findExprOrThrow(file, query, true); |