diff options
author | Juan Linietsky <reduzio@gmail.com> | 2015-12-15 09:19:00 -0300 |
---|---|---|
committer | Juan Linietsky <reduzio@gmail.com> | 2015-12-15 09:19:00 -0300 |
commit | 035bb03331fba3fedbc5d968916fec33ea8b6aa4 (patch) | |
tree | f14be09bd26f7382d39c4d7e5dbaca38c855a65a /modules/gdscript/gd_parser.cpp | |
parent | b12a2f456ccccae315426c7dd358bcec87112a0c (diff) | |
parent | 69c79c0d4a6107313c24fa1202d9709551d95c03 (diff) | |
download | redot-engine-035bb03331fba3fedbc5d968916fec33ea8b6aa4.tar.gz |
Merge branch 'master' of https://github.com/godotengine/godot
Diffstat (limited to 'modules/gdscript/gd_parser.cpp')
-rw-r--r-- | modules/gdscript/gd_parser.cpp | 114 |
1 files changed, 106 insertions, 8 deletions
diff --git a/modules/gdscript/gd_parser.cpp b/modules/gdscript/gd_parser.cpp index c55bfee591..4339a13edf 100644 --- a/modules/gdscript/gd_parser.cpp +++ b/modules/gdscript/gd_parser.cpp @@ -2381,10 +2381,48 @@ void GDParser::_parse_class(ClassNode *p_class) { current_export.hint=PROPERTY_HINT_ALL_FLAGS; tokenizer->advance(); - if (tokenizer->get_token()!=GDTokenizer::TK_PARENTHESIS_CLOSE) { - _set_error("Expected ')' in hint."); + + if (tokenizer->get_token()==GDTokenizer::TK_PARENTHESIS_CLOSE) { + break; + } + if (tokenizer->get_token()!=GDTokenizer::TK_COMMA) + { + _set_error("Expected ')' or ',' in bit flags hint."); return; } + + current_export.hint=PROPERTY_HINT_FLAGS; + tokenizer->advance(); + + bool first = true; + while(true) { + + if (tokenizer->get_token()!=GDTokenizer::TK_CONSTANT || tokenizer->get_token_constant().get_type()!=Variant::STRING) { + current_export=PropertyInfo(); + _set_error("Expected a string constant in named bit flags hint."); + return; + } + + String c = tokenizer->get_token_constant(); + if (!first) + current_export.hint_string+=","; + else + first=false; + + current_export.hint_string+=c.xml_escape(); + + tokenizer->advance(); + if (tokenizer->get_token()==GDTokenizer::TK_PARENTHESIS_CLOSE) + break; + + if (tokenizer->get_token()!=GDTokenizer::TK_COMMA) { + current_export=PropertyInfo(); + _set_error("Expected ')' or ',' in named bit flags hint."); + return; + } + tokenizer->advance(); + } + break; } @@ -2439,6 +2477,23 @@ void GDParser::_parse_class(ClassNode *p_class) { break; } + // range + if (tokenizer->get_token()==GDTokenizer::TK_IDENTIFIER && tokenizer->get_token_identifier()=="EXP") { + + current_export.hint=PROPERTY_HINT_EXP_RANGE; + tokenizer->advance(); + + if (tokenizer->get_token()==GDTokenizer::TK_PARENTHESIS_CLOSE) + break; + else if (tokenizer->get_token()!=GDTokenizer::TK_COMMA) { + _set_error("Expected ')' or ',' in exponential range hint."); + return; + } + tokenizer->advance(); + } + else + current_export.hint=PROPERTY_HINT_RANGE; + float sign=1.0; if (tokenizer->get_token()==GDTokenizer::TK_OP_SUB) { @@ -2452,8 +2507,6 @@ void GDParser::_parse_class(ClassNode *p_class) { return; } - //enumeration - current_export.hint=PROPERTY_HINT_RANGE; current_export.hint_string=rtos(sign*double(tokenizer->get_token_constant())); tokenizer->advance(); @@ -2556,10 +2609,32 @@ void GDParser::_parse_class(ClassNode *p_class) { if (tokenizer->get_token()==GDTokenizer::TK_IDENTIFIER && tokenizer->get_token_identifier()=="DIR") { - current_export.hint=PROPERTY_HINT_DIR; tokenizer->advance(); - if (tokenizer->get_token()!=GDTokenizer::TK_PARENTHESIS_CLOSE) { - _set_error("Expected ')' in hint."); + + if (tokenizer->get_token()==GDTokenizer::TK_PARENTHESIS_CLOSE) + current_export.hint=PROPERTY_HINT_DIR; + else if (tokenizer->get_token()==GDTokenizer::TK_COMMA ) { + + tokenizer->advance(); + + if (tokenizer->get_token()!=GDTokenizer::TK_IDENTIFIER || !(tokenizer->get_token_identifier()=="GLOBAL")) { + _set_error("Expected 'GLOBAL' after comma in directory hint."); + return; + } + if (!p_class->tool) { + _set_error("Global filesystem hints may only be used in tool scripts."); + return; + } + current_export.hint=PROPERTY_HINT_GLOBAL_DIR; + tokenizer->advance(); + + if (tokenizer->get_token()!=GDTokenizer::TK_PARENTHESIS_CLOSE) { + _set_error("Expected ')' in hint."); + return; + } + } + else { + _set_error("Expected ')' or ',' in hint."); return; } break; @@ -2573,9 +2648,32 @@ void GDParser::_parse_class(ClassNode *p_class) { if (tokenizer->get_token()==GDTokenizer::TK_COMMA) { tokenizer->advance(); + + if (tokenizer->get_token()==GDTokenizer::TK_IDENTIFIER && tokenizer->get_token_identifier()=="GLOBAL") { + + if (!p_class->tool) { + _set_error("Global filesystem hints may only be used in tool scripts."); + return; + } + current_export.hint=PROPERTY_HINT_GLOBAL_FILE; + tokenizer->advance(); + + if (tokenizer->get_token()==GDTokenizer::TK_PARENTHESIS_CLOSE) + break; + else if (tokenizer->get_token()==GDTokenizer::TK_COMMA) + tokenizer->advance(); + else { + _set_error("Expected ')' or ',' in hint."); + return; + } + } + if (tokenizer->get_token()!=GDTokenizer::TK_CONSTANT || tokenizer->get_token_constant().get_type()!=Variant::STRING) { - _set_error("Expected string constant with filter"); + if (current_export.hint==PROPERTY_HINT_GLOBAL_FILE) + _set_error("Expected string constant with filter"); + else + _set_error("Expected 'GLOBAL' or string constant with filter"); return; } current_export.hint_string=tokenizer->get_token_constant(); |