summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2015-01-03 16:53:39 -0300
committerJuan Linietsky <reduzio@gmail.com>2015-01-03 16:53:39 -0300
commitddf7457894abf4678727b8a751575fee3e0e55ac (patch)
tree33cc7904f0e8bd6bf1671f80481d759c9552f1e1 /modules
parentfbdd925d9be1c4c96d05089d7d5a58cd938b002c (diff)
parent507736690de2f4125aec25ecb0339196fb89ba56 (diff)
Merge branch 'master' of https://github.com/okamstudio/godot
Diffstat (limited to 'modules')
-rw-r--r--modules/gdscript/gd_editor.cpp53
-rw-r--r--modules/gdscript/gd_parser.cpp14
-rw-r--r--modules/gdscript/gd_parser.h1
3 files changed, 61 insertions, 7 deletions
diff --git a/modules/gdscript/gd_editor.cpp b/modules/gdscript/gd_editor.cpp
index eb1d0a4db3..12dc1bb139 100644
--- a/modules/gdscript/gd_editor.cpp
+++ b/modules/gdscript/gd_editor.cpp
@@ -28,7 +28,7 @@
/*************************************************************************/
#include "gd_script.h"
#include "gd_compiler.h"
-
+#include "globals.h"
void GDScriptLanguage::get_comment_delimiters(List<String> *p_delimiters) const {
@@ -1276,7 +1276,23 @@ static void _make_function_hint(const GDParser::FunctionNode* p_func,int p_argid
static void _find_type_arguments(const GDParser::Node*p_node,int p_line,const StringName& p_method,const GDCompletionIdentifier& id, int p_argidx, Set<String>& result, String& arghint) {
- if (id.type==Variant::OBJECT && id.obj_type!=StringName()) {
+ if (id.type==Variant::INPUT_EVENT && String(p_method)=="is_action" && p_argidx==0) {
+
+ List<PropertyInfo> pinfo;
+ Globals::get_singleton()->get_property_list(&pinfo);
+
+ for(List<PropertyInfo>::Element *E=pinfo.front();E;E=E->next()) {
+ const PropertyInfo &pi=E->get();
+
+ if (!pi.name.begins_with("input/"))
+ continue;
+
+ String name = pi.name.substr(pi.name.find("/")+1,pi.name.length());
+ result.insert("\""+name+"\"");
+ }
+
+
+ } else if (id.type==Variant::OBJECT && id.obj_type!=StringName()) {
MethodBind *m = ObjectTypeDB::get_method(id.obj_type,p_method);
@@ -1299,7 +1315,7 @@ static void _find_type_arguments(const GDParser::Node*p_node,int p_line,const St
const GDParser::OperatorNode *op=static_cast<const GDParser::OperatorNode *>(p_node);
if (op->arguments.size()>)
- }*/
+ }*/
} else {
Object *obj=id.value;
@@ -1826,6 +1842,37 @@ Error GDScriptLanguage::complete_code(const String& p_code, const String& p_base
_find_call_arguments(context,p.get_completion_node(),p.get_completion_line(),p.get_completion_argument_index(),options,r_call_hint);
} break;
+ case GDParser::COMPLETION_VIRTUAL_FUNC: {
+
+ GDCompletionIdentifier cid = _get_native_class(context);
+
+ if (cid.obj_type!=StringName()) {
+ List<MethodInfo> vm;
+ ObjectTypeDB::get_virtual_methods(cid.obj_type,&vm);
+ for(List<MethodInfo>::Element *E=vm.front();E;E=E->next()) {
+
+ MethodInfo &mi=E->get();
+ String m = mi.name;
+ if (m.find(":")!=-1)
+ m=m.substr(0,m.find(":"));
+ m+="(";
+
+ if (mi.arguments.size()) {
+ for(int i=0;i<mi.arguments.size();i++) {
+ if (i>0)
+ m+=", ";
+ String n =mi.arguments[i].name;
+ if (n.find(":")!=-1)
+ n=n.substr(0,n.find(":"));
+ m+=n;
+ }
+ }
+ m+="):";
+
+ options.insert(m);
+ }
+ }
+ } break;
}
diff --git a/modules/gdscript/gd_parser.cpp b/modules/gdscript/gd_parser.cpp
index f79f3ee44a..aa2878f9e1 100644
--- a/modules/gdscript/gd_parser.cpp
+++ b/modules/gdscript/gd_parser.cpp
@@ -2027,14 +2027,20 @@ void GDParser::_parse_class(ClassNode *p_class) {
}
- if (tokenizer->get_token(1)!=GDTokenizer::TK_IDENTIFIER) {
+ tokenizer->advance();
+ StringName name;
+
+ if (_get_completable_identifier(COMPLETION_VIRTUAL_FUNC,name)) {
+
+ }
+
+
+ if (name==StringName()) {
_set_error("Expected identifier after 'func' (syntax: 'func <identifier>([arguments]):' ).");
return;
}
- StringName name = tokenizer->get_token_identifier(1);
-
for(int i=0;i<p_class->functions.size();i++) {
if (p_class->functions[i]->name==name) {
_set_error("Function '"+String(name)+"' already exists in this class (at line: "+itos(p_class->functions[i]->line)+").");
@@ -2045,7 +2051,7 @@ void GDParser::_parse_class(ClassNode *p_class) {
_set_error("Function '"+String(name)+"' already exists in this class (at line: "+itos(p_class->static_functions[i]->line)+").");
}
}
- tokenizer->advance(2);
+
if (tokenizer->get_token()!=GDTokenizer::TK_PARENTHESIS_OPEN) {
diff --git a/modules/gdscript/gd_parser.h b/modules/gdscript/gd_parser.h
index 26955d2b7a..44e7b55323 100644
--- a/modules/gdscript/gd_parser.h
+++ b/modules/gdscript/gd_parser.h
@@ -363,6 +363,7 @@ public:
COMPLETION_METHOD,
COMPLETION_CALL_ARGUMENTS,
COMPLETION_INDEX,
+ COMPLETION_VIRTUAL_FUNC
};