…lines 1–170 unchanged (170 lines)
171 * @param definitionProvider The name reference graph
172 * @param name Query node
173 * @return non-empty definition list or null
174 */
175 private static Collection<Definition> getCallableDefinitions(
176 DefinitionProvider definitionProvider, Node name) {
177 if (NodeUtil.isGetProp(name) || NodeUtil.isName(name)) {
178 List<Definition> result = Lists.newArrayList();
179
180 Collection<Definition> decls =
181 definitionProvider.getDefinitionsReferencedAt(name);
182 if (decls == null) {
183 return null;
184 }
185
186 for (Definition current : decls) {
187 Node rValue = current.getRValue();
188 if ((rValue != null) && NodeUtil.isFunction(rValue)) {
189 result.add(current);
190 } else {
191 return null;
192 }
193 }
194
195 return result;
196 } else if (name.getType() == Token.OR || name.getType() == Token.HOOK) {
197 Node firstVal;
198 if (name.getType() == Token.HOOK) {
199 firstVal = name.getFirstChild().getNext();
200 } else {
201 firstVal = name.getFirstChild();
202 }
203
204 Collection<Definition> defs1 = getCallableDefinitions(definitionProvider,
205 firstVal);
206 Collection<Definition> defs2 = getCallableDefinitions(definitionProvider,
207 firstVal.getNext());
208 if (defs1 != null && defs2 != null) {
209 defs1.addAll(defs2);
210 return defs1;
211 } else {
212 return null;
213 }
214 } else {
215 return null;
216 }
217 }
218
219 /**
220 * Propagate side effect information by building a graph based on
221 * call site information stored in FunctionInformation and the
222 * DefinitionProvider and then running GraphReachability to
…lines 223–714 unchanged (492 lines)