void ScriptTextEditor::_code_complete_script(const String& p_code, List<String>* r_options) {

	Node *base = get_tree()->get_edited_scene_root();
	if (base) {
		base = _find_node_for_script(base,base,script);
	}
	String hint;
	Error err = script->get_language()->complete_code(p_code,script->get_path().get_base_dir(),base,r_options,hint);
	if (hint!="") {
		code_editor->get_text_edit()->set_code_hint(hint);
	}

}
static Node* _find_node_for_script(Node* p_base, Node*p_current, const Ref<Script>& p_script) {

	if (p_current->get_owner()!=p_base && p_base!=p_current)
		return NULL;
	Ref<Script> c = p_current->get_script();
	if (c==p_script)
		return p_current;
	for(int i=0;i<p_current->get_child_count();i++) {
		Node *found = _find_node_for_script(p_base,p_current->get_child(i),p_script);
		if (found)
			return found;
	}

	return NULL;
}
void ScriptTextEditor::_lookup_symbol(const String& p_symbol,int p_row, int p_column) {

	Node *base = get_tree()->get_edited_scene_root();
	if (base) {
		base = _find_node_for_script(base,base,script);
	}


	ScriptLanguage::LookupResult result;
	if (script->get_language()->lookup_code(code_editor->get_text_edit()->get_text_for_lookup_completion(),p_symbol,script->get_path().get_base_dir(),base,result)==OK) {

		_goto_line(p_row);

		switch(result.type) {
			case ScriptLanguage::LookupResult::RESULT_SCRIPT_LOCATION: {

				if (result.script.is_valid()) {
					emit_signal("request_open_script_at_line",result.script,result.location-1);
				} else {
					emit_signal("request_save_history");
					_goto_line(result.location-1);
				}
			} break;
			case ScriptLanguage::LookupResult::RESULT_CLASS: {
				emit_signal("go_to_help","class_name:"+result.class_name);
			} break;
			case ScriptLanguage::LookupResult::RESULT_CLASS_CONSTANT: {

				StringName cname = result.class_name;
				bool success;
				while(true) {
					ObjectTypeDB::get_integer_constant(cname,result.class_member,&success);
					if (success) {
						result.class_name=cname;
						cname=ObjectTypeDB::type_inherits_from(cname);
					} else {
						break;
					}
				}


				emit_signal("go_to_help","class_constant:"+result.class_name+":"+result.class_member);

			} break;
			case ScriptLanguage::LookupResult::RESULT_CLASS_PROPERTY: {
				emit_signal("go_to_help","class_property:"+result.class_name+":"+result.class_member);

			} break;
			case ScriptLanguage::LookupResult::RESULT_CLASS_METHOD: {

				StringName cname = result.class_name;

				while(true) {
					if (ObjectTypeDB::has_method(cname,result.class_member)) {
						result.class_name=cname;
						cname=ObjectTypeDB::type_inherits_from(cname);
					} else {
						break;
					}
				}

				emit_signal("go_to_help","class_method:"+result.class_name+":"+result.class_member);

			} break;
		}

	}
}