statements = $statements; } public function function_calls($global_scope = FALSE, $name = NULL) { $calls = $this->function_calls = isset($this->function_calls) ? $this->function_calls : $this->resolve_something('resolve_function_calls'); if ($name) { $names = array_slice(func_get_args(), 1); $filtered = array(); foreach ($names as $name) { $filtered = array_merge($filtered, array_filter($calls, create_function('$item', 'return $item->name() == "' . $name . '";'))); } $calls = $filtered; } if ($global_scope) { $calls = array_filter($calls, create_function('$item', 'return $item->is_global();')); } return $calls; } private function resolve_function_calls($statement) { if ($statement->id == '(' && $statement->arity == 'binary') { return new JavaScriptFunctionCall($statement->first, $statement->second); } } public function assignments($global_scope = FALSE) { $assignments = $this->function_assignments = isset($this->function_assignments) ? $this->function_assignments : $this->resolve_something('resolve_assignments'); if ($global_scope) { $assignments = array_filter($assignments, create_function('$item', 'return $item->is_global();')); } return $assignments; } private function resolve_assignments($statement) { if ($statement->id == '=' && ($statement->first->id == '.' || $statement->first->id == '[' || $statement->arity == 'name')) { return new JavaScriptAssignment($statement->first, $statement->second); } } public function prefix($prefix_name) { return $this->prefixes[$prefix_name] ? $this->prefixes[$prefix_name] : $this->resolve_something('resolve_prefix', array($prefix_name)); } private function resolve_prefix($statement, $prefix_name) { if ($statement->arity == 'statement' && $statement->value == $prefix_name) { return $statement; } } private function resolve_something($found_callback, $passed_args = array(), $somethings = array(), $statements = NULL) { if (!$statements) { $statements = $this->statements; } if (!is_array($statements)) { $statements = array($statements); } foreach ($statements as $statement) { array_unshift($passed_args, $statement); if ($something = call_user_func_array(array($this, $found_callback), $passed_args)) { $somethings[] = $something; continue; } array_shift($passed_args); if ($statement->first) { $somethings = $this->resolve_something($found_callback, $passed_args, $somethings, $statement->first); } if ($statement->second) { $somethings = $this->resolve_something($found_callback, $passed_args, $somethings, $statement->second); } if ($statement->third) { $somethings = $this->resolve_something($found_callback, $passed_args, $somethings, $statement->third); } if ($statement->block) { $somethings = $this->resolve_something($found_callback, $passed_args, $somethings, $statement->block); } } return $somethings; } }