GDScript: Fix resolution of dictionary keys
There was a mixup between String and StringName keys. Now they're clearly separated. This also means you have to consider which type you're using for the dictionary keys and how you are accessing them.
This commit is contained in:
parent
77a876c6e1
commit
c7511de02e
|
@ -2621,25 +2621,6 @@ void GDScriptAnalyzer::reduce_subscript(GDScriptParser::SubscriptNode *p_subscri
|
|||
|
||||
GDScriptParser::DataType result_type;
|
||||
|
||||
// Reduce index first. If it's a constant StringName, use attribute instead.
|
||||
if (!p_subscript->is_attribute) {
|
||||
if (p_subscript->index == nullptr) {
|
||||
return;
|
||||
}
|
||||
reduce_expression(p_subscript->index);
|
||||
|
||||
if (p_subscript->index->is_constant && p_subscript->index->reduced_value.get_type() == Variant::STRING_NAME) {
|
||||
GDScriptParser::IdentifierNode *attribute = parser->alloc_node<GDScriptParser::IdentifierNode>();
|
||||
// Copy location for better error message.
|
||||
attribute->start_line = p_subscript->index->start_line;
|
||||
attribute->end_line = p_subscript->index->end_line;
|
||||
attribute->leftmost_column = p_subscript->index->leftmost_column;
|
||||
attribute->rightmost_column = p_subscript->index->rightmost_column;
|
||||
p_subscript->is_attribute = true;
|
||||
p_subscript->attribute = attribute;
|
||||
}
|
||||
}
|
||||
|
||||
if (p_subscript->is_attribute) {
|
||||
if (p_subscript->attribute == nullptr) {
|
||||
return;
|
||||
|
@ -2682,7 +2663,10 @@ void GDScriptAnalyzer::reduce_subscript(GDScriptParser::SubscriptNode *p_subscri
|
|||
}
|
||||
}
|
||||
} else {
|
||||
// Index was already reduced before.
|
||||
if (p_subscript->index == nullptr) {
|
||||
return;
|
||||
}
|
||||
reduce_expression(p_subscript->index);
|
||||
|
||||
if (p_subscript->base->is_constant && p_subscript->index->is_constant) {
|
||||
// Just try to get it.
|
||||
|
|
|
@ -680,9 +680,9 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
|
|||
name = subscript->attribute->name;
|
||||
named = true;
|
||||
} else {
|
||||
if (subscript->index->type == GDScriptParser::Node::LITERAL && static_cast<const GDScriptParser::LiteralNode *>(subscript->index)->value.get_type() == Variant::STRING) {
|
||||
if (subscript->index->is_constant && subscript->index->reduced_value.get_type() == Variant::STRING_NAME) {
|
||||
// Also, somehow, named (speed up anyway).
|
||||
name = static_cast<const GDScriptParser::LiteralNode *>(subscript->index)->value;
|
||||
name = subscript->index->reduced_value;
|
||||
named = true;
|
||||
} else {
|
||||
// Regular indexing.
|
||||
|
|
Loading…
Reference in New Issue