| 1282 | } |
| 1283 | |
| 1284 | void GDScriptParser::parse_property_setter(VariableNode *p_variable) { |
| 1285 | switch (p_variable->property) { |
| 1286 | case VariableNode::PROP_INLINE: { |
| 1287 | FunctionNode *function = alloc_node<FunctionNode>(); |
| 1288 | IdentifierNode *identifier = alloc_node<IdentifierNode>(); |
| 1289 | complete_extents(identifier); |
| 1290 | identifier->name = "@" + p_variable->identifier->name + "_setter"; |
| 1291 | function->identifier = identifier; |
| 1292 | function->is_static = p_variable->is_static; |
| 1293 | |
| 1294 | consume(GDScriptTokenizer::Token::PARENTHESIS_OPEN, R"(Expected "(" after "set".)"); |
| 1295 | |
| 1296 | ParameterNode *parameter = alloc_node<ParameterNode>(); |
| 1297 | if (consume(GDScriptTokenizer::Token::IDENTIFIER, R"(Expected parameter name after "(".)")) { |
| 1298 | reset_extents(parameter, previous); |
| 1299 | p_variable->setter_parameter = parse_identifier(); |
| 1300 | parameter->identifier = p_variable->setter_parameter; |
| 1301 | function->parameters_indices[parameter->identifier->name] = 0; |
| 1302 | function->parameters.push_back(parameter); |
| 1303 | } |
| 1304 | complete_extents(parameter); |
| 1305 | |
| 1306 | consume(GDScriptTokenizer::Token::PARENTHESIS_CLOSE, R"*(Expected ")" after parameter name.)*"); |
| 1307 | consume(GDScriptTokenizer::Token::COLON, R"*(Expected ":" after ")".)*"); |
| 1308 | |
| 1309 | FunctionNode *previous_function = current_function; |
| 1310 | current_function = function; |
| 1311 | if (p_variable->setter_parameter != nullptr) { |
| 1312 | SuiteNode *body = alloc_node<SuiteNode>(); |
| 1313 | body->add_local(parameter, function); |
| 1314 | function->body = parse_suite("setter declaration", body); |
| 1315 | p_variable->setter = function; |
| 1316 | } |
| 1317 | current_function = previous_function; |
| 1318 | complete_extents(function); |
| 1319 | break; |
| 1320 | } |
| 1321 | case VariableNode::PROP_SETGET: |
| 1322 | consume(GDScriptTokenizer::Token::EQUAL, R"(Expected "=" after "set")"); |
| 1323 | make_completion_context(COMPLETION_PROPERTY_METHOD, p_variable); |
| 1324 | if (consume(GDScriptTokenizer::Token::IDENTIFIER, R"(Expected setter function name after "=".)")) { |
| 1325 | p_variable->setter_pointer = parse_identifier(); |
| 1326 | } |
| 1327 | break; |
| 1328 | case VariableNode::PROP_NONE: |
| 1329 | break; // Unreachable. |
| 1330 | } |
| 1331 | } |
| 1332 | |
| 1333 | void GDScriptParser::parse_property_getter(VariableNode *p_variable) { |
| 1334 | switch (p_variable->property) { |