GDScript: Allow keywords to be used in $ notation
This commit is contained in:
parent
35176247af
commit
a52e457ada
|
@ -2489,15 +2489,18 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_get_node(ExpressionNode *p
|
||||||
make_completion_context(COMPLETION_GET_NODE, get_node);
|
make_completion_context(COMPLETION_GET_NODE, get_node);
|
||||||
get_node->string = parse_literal();
|
get_node->string = parse_literal();
|
||||||
return get_node;
|
return get_node;
|
||||||
} else if (check(GDScriptTokenizer::Token::IDENTIFIER)) {
|
} else if (current.is_node_name()) {
|
||||||
GetNodeNode *get_node = alloc_node<GetNodeNode>();
|
GetNodeNode *get_node = alloc_node<GetNodeNode>();
|
||||||
int chain_position = 0;
|
int chain_position = 0;
|
||||||
do {
|
do {
|
||||||
make_completion_context(COMPLETION_GET_NODE, get_node, chain_position++);
|
make_completion_context(COMPLETION_GET_NODE, get_node, chain_position++);
|
||||||
if (!consume(GDScriptTokenizer::Token::IDENTIFIER, R"(Expect node identifer after "/".)")) {
|
if (!current.is_node_name()) {
|
||||||
|
push_error(R"(Expect node path after "/".)");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
IdentifierNode *identifier = parse_identifier();
|
advance();
|
||||||
|
IdentifierNode *identifier = alloc_node<IdentifierNode>();
|
||||||
|
identifier->name = previous.get_identifier();
|
||||||
get_node->chain.push_back(identifier);
|
get_node->chain.push_back(identifier);
|
||||||
} while (match(GDScriptTokenizer::Token::SLASH));
|
} while (match(GDScriptTokenizer::Token::SLASH));
|
||||||
return get_node;
|
return get_node;
|
||||||
|
|
|
@ -168,6 +168,52 @@ bool GDScriptTokenizer::Token::is_identifier() const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GDScriptTokenizer::Token::is_node_name() const {
|
||||||
|
// This is meant to allow keywords with the $ notation, but not as general identifiers.
|
||||||
|
switch (type) {
|
||||||
|
case IDENTIFIER:
|
||||||
|
case AND:
|
||||||
|
case AS:
|
||||||
|
case ASSERT:
|
||||||
|
case AWAIT:
|
||||||
|
case BREAK:
|
||||||
|
case BREAKPOINT:
|
||||||
|
case CLASS_NAME:
|
||||||
|
case CLASS:
|
||||||
|
case CONST:
|
||||||
|
case CONTINUE:
|
||||||
|
case ELIF:
|
||||||
|
case ELSE:
|
||||||
|
case ENUM:
|
||||||
|
case EXTENDS:
|
||||||
|
case FOR:
|
||||||
|
case FUNC:
|
||||||
|
case IF:
|
||||||
|
case IN:
|
||||||
|
case IS:
|
||||||
|
case MATCH:
|
||||||
|
case NAMESPACE:
|
||||||
|
case NOT:
|
||||||
|
case OR:
|
||||||
|
case PASS:
|
||||||
|
case PRELOAD:
|
||||||
|
case RETURN:
|
||||||
|
case SELF:
|
||||||
|
case SIGNAL:
|
||||||
|
case STATIC:
|
||||||
|
case SUPER:
|
||||||
|
case TRAIT:
|
||||||
|
case UNDERSCORE:
|
||||||
|
case VAR:
|
||||||
|
case VOID:
|
||||||
|
case WHILE:
|
||||||
|
case YIELD:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
String GDScriptTokenizer::get_token_name(Token::Type p_token_type) {
|
String GDScriptTokenizer::get_token_name(Token::Type p_token_type) {
|
||||||
ERR_FAIL_INDEX_V_MSG(p_token_type, Token::TK_MAX, "<error>", "Using token type out of the enum.");
|
ERR_FAIL_INDEX_V_MSG(p_token_type, Token::TK_MAX, "<error>", "Using token type out of the enum.");
|
||||||
return token_names[p_token_type];
|
return token_names[p_token_type];
|
||||||
|
|
|
@ -169,6 +169,7 @@ public:
|
||||||
|
|
||||||
const char *get_name() const;
|
const char *get_name() const;
|
||||||
bool is_identifier() const;
|
bool is_identifier() const;
|
||||||
|
bool is_node_name() const;
|
||||||
StringName get_identifier() const { return source; }
|
StringName get_identifier() const { return source; }
|
||||||
|
|
||||||
Token(Type p_type) {
|
Token(Type p_type) {
|
||||||
|
|
Loading…
Reference in New Issue