Browse Source

Allow to extends constant class variable

sanikoyes 7 years ago
parent
commit
2004c24a6e
2 changed files with 51 additions and 9 deletions
  1. 24 1
      modules/gdscript/gd_compiler.cpp
  2. 27 8
      modules/gdscript/gd_parser.cpp

+ 24 - 1
modules/gdscript/gd_compiler.cpp

@@ -1537,21 +1537,44 @@ Error GDCompiler::_parse_class(GDScript *p_script, GDScript *p_owner, const GDPa
 					base_class = p->subclasses[base];
 					base_class = p->subclasses[base];
 					break;
 					break;
 				}
 				}
+
+				if (p->constants.has(base)) {
+
+					base_class = p->constants[base];
+					if (base_class.is_null()) {
+						_set_error("Constant not a class: " + base, p_class);
+						return ERR_SCRIPT_FAILED;
+					}
+					break;
+				}
+
 				p = p->_owner;
 				p = p->_owner;
 			}
 			}
 
 
 			if (base_class.is_valid()) {
 			if (base_class.is_valid()) {
 
 
+				String ident = base;
+
 				for (int i = 1; i < p_class->extends_class.size(); i++) {
 				for (int i = 1; i < p_class->extends_class.size(); i++) {
 
 
 					String subclass = p_class->extends_class[i];
 					String subclass = p_class->extends_class[i];
 
 
+					ident += ("." + subclass);
+
 					if (base_class->subclasses.has(subclass)) {
 					if (base_class->subclasses.has(subclass)) {
 
 
 						base_class = base_class->subclasses[subclass];
 						base_class = base_class->subclasses[subclass];
+					} else if (base_class->constants.has(subclass)) {
+
+						Ref<GDScript> base = base_class->constants[subclass];
+						if (base.is_null()) {
+							_set_error("Constant not a class: " + ident, p_class);
+							return ERR_SCRIPT_FAILED;
+						}
+						base_class = base;
 					} else {
 					} else {
 
 
-						_set_error("Could not find subclass: " + subclass, p_class);
+						_set_error("Could not find subclass: " + ident, p_class);
 						return ERR_FILE_NOT_FOUND;
 						return ERR_FILE_NOT_FOUND;
 					}
 					}
 				}
 				}

+ 27 - 8
modules/gdscript/gd_parser.cpp

@@ -2132,18 +2132,37 @@ void GDParser::_parse_extends(ClassNode *p_class) {
 	}
 	}
 
 
 	while (true) {
 	while (true) {
-		if (tokenizer->get_token() != GDTokenizer::TK_IDENTIFIER) {
 
 
-			_set_error("Invalid 'extends' syntax, expected string constant (path) and/or identifier (parent class).");
-			return;
-		}
+		switch (tokenizer->get_token()) {
+
+			case GDTokenizer::TK_IDENTIFIER: {
+
+					StringName identifier = tokenizer->get_token_identifier();
+					p_class->extends_class.push_back(identifier);
+				}
+				break;
+
+			case GDTokenizer::TK_PERIOD:
+				break;
+
+			default: {
 
 
-		StringName identifier = tokenizer->get_token_identifier();
-		p_class->extends_class.push_back(identifier);
+				_set_error("Invalid 'extends' syntax, expected string constant (path) and/or identifier (parent class).");
+				return;
+			}
+		}
 
 
 		tokenizer->advance(1);
 		tokenizer->advance(1);
-		if (tokenizer->get_token() != GDTokenizer::TK_PERIOD)
-			return;
+
+		switch (tokenizer->get_token()) {
+
+			case GDTokenizer::TK_IDENTIFIER:
+			case GDTokenizer::TK_PERIOD:
+				continue;
+
+			default:
+				return;
+		}
 	}
 	}
 }
 }