| 332 | } |
| 333 | |
| 334 | void GDScriptDocGen::_generate_docs(GDScript *p_script, const GDP::ClassNode *p_class) { |
| 335 | p_script->_clear_doc(); |
| 336 | |
| 337 | DocData::ClassDoc &doc = p_script->doc; |
| 338 | |
| 339 | doc.is_script_doc = true; |
| 340 | |
| 341 | if (p_script->local_name == StringName()) { |
| 342 | // This is an outer unnamed class. |
| 343 | doc.name = _get_script_name(p_script->get_script_path()); |
| 344 | } else { |
| 345 | // This is an inner or global outer class. |
| 346 | doc.name = p_script->local_name; |
| 347 | if (p_script->_owner) { |
| 348 | doc.name = p_script->_owner->doc.name + "." + doc.name; |
| 349 | } |
| 350 | } |
| 351 | |
| 352 | doc.script_path = p_script->get_script_path(); |
| 353 | |
| 354 | if (p_script->base.is_valid() && p_script->base->is_valid()) { |
| 355 | if (!p_script->base->doc.name.is_empty()) { |
| 356 | doc.inherits = p_script->base->doc.name; |
| 357 | } else { |
| 358 | doc.inherits = p_script->base->get_instance_base_type(); |
| 359 | } |
| 360 | } else if (p_script->native.is_valid()) { |
| 361 | doc.inherits = p_script->native->get_name(); |
| 362 | } |
| 363 | |
| 364 | doc.brief_description = p_class->doc_data.brief; |
| 365 | doc.description = p_class->doc_data.description; |
| 366 | for (const Pair<String, String> &p : p_class->doc_data.tutorials) { |
| 367 | DocData::TutorialDoc td; |
| 368 | td.title = p.first; |
| 369 | td.link = p.second; |
| 370 | doc.tutorials.append(td); |
| 371 | } |
| 372 | doc.is_deprecated = p_class->doc_data.is_deprecated; |
| 373 | doc.deprecated_message = p_class->doc_data.deprecated_message; |
| 374 | doc.is_experimental = p_class->doc_data.is_experimental; |
| 375 | doc.experimental_message = p_class->doc_data.experimental_message; |
| 376 | |
| 377 | for (const GDP::ClassNode::Member &member : p_class->members) { |
| 378 | switch (member.type) { |
| 379 | case GDP::ClassNode::Member::CLASS: { |
| 380 | const GDP::ClassNode *inner_class = member.m_class; |
| 381 | const StringName &class_name = inner_class->identifier->name; |
| 382 | |
| 383 | p_script->member_lines[class_name] = inner_class->start_line; |
| 384 | |
| 385 | // Recursively generate inner class docs. |
| 386 | // Needs inner GDScripts to exist: previously generated in GDScriptCompiler::make_scripts(). |
| 387 | GDScriptDocGen::_generate_docs(*p_script->subclasses[class_name], inner_class); |
| 388 | } break; |
| 389 | |
| 390 | case GDP::ClassNode::Member::CONSTANT: { |
| 391 | const GDP::ConstantNode *m_const = member.constant; |
nothing calls this directly
no test coverage detected