From 60e3f14d98780ce6139df890aab3f372e8d190fd Mon Sep 17 00:00:00 2001 From: Danil Alexeev Date: Tue, 1 Aug 2023 11:52:42 +0300 Subject: [PATCH] Update "GDScript documentation comments" page --- .../gdscript_documentation_comments.rst | 110 +++++++++++++----- .../deprecated_and_experimental_marks.webp | Bin 0 -> 18686 bytes 2 files changed, 83 insertions(+), 27 deletions(-) create mode 100644 tutorials/scripting/gdscript/img/deprecated_and_experimental_marks.webp diff --git a/tutorials/scripting/gdscript/gdscript_documentation_comments.rst b/tutorials/scripting/gdscript/gdscript_documentation_comments.rst index 86492b1e6d6..d621e4f52f8 100644 --- a/tutorials/scripting/gdscript/gdscript_documentation_comments.rst +++ b/tutorials/scripting/gdscript/gdscript_documentation_comments.rst @@ -19,29 +19,31 @@ suggested format for script documentation can be divided into three parts. - A brief description of the script. - Detailed description. -- Tutorials. +- Tutorials and deprecated/experimental marks. To separate these from each other, the documentation comments use special tags. -The tag must be at the beginning of a line (ignoring preceding white space) and must -have the format ``@``, followed by the keyword, and finishing with a colon. +The tag must be at the beginning of a line (ignoring preceding white space) +and must have the format ``@``, followed by the keyword. Tags ~~~~ +-------------------+--------------------------------------------------------+ -| Brief description | No tag and lives at the very beginning of | +| Brief description | No tag. Lives at the very beginning of | | | the documentation section. | +-------------------+--------------------------------------------------------+ -| Description | Use one blank line to separate the description from | -| | the brief. | +| Description | No tag. Use one blank line to separate the description | +| | from the brief. | +-------------------+--------------------------------------------------------+ | Tutorial | | ``@tutorial:`` | | | | ``@tutorial(The Title Here):`` | +-------------------+--------------------------------------------------------+ +| Deprecated | ``@deprecated`` | ++-------------------+--------------------------------------------------------+ +| Experimental | ``@experimental`` | ++-------------------+--------------------------------------------------------+ -For example: - -:: +For example:: extends Node2D ## A brief description of the class's role and functionality. @@ -51,6 +53,7 @@ For example: ## ## @tutorial: https://the/tutorial1/url.com ## @tutorial(Tutorial2): https://the/tutorial2/url.com + ## @experimental .. warning:: @@ -66,16 +69,6 @@ For example: Documenting script members -------------------------- -Documentation of a script member must immediately precede the member or its -annotations if it has any. The exception to this is enum values whose description should -be on the same line as the enum for readability. -The description can have more than one line but every line must start -with the double hash symbol ``##`` to be considered as part of the documentation. -The script documentation will update in the editor help window every time the -script is updated. If any member variable or function name starts with an -underscore, it will be treated as private. It will not appear in the documentation and -will be ignored in the help window. - Members that are applicable for documentation: - Inner class @@ -86,8 +79,48 @@ Members that are applicable for documentation: - Enum - Enum value -Example -------- +Documentation of a script member must immediately precede the member or its annotations +if it has any. The description can have more than one line but every line must start with +the double hash symbol ``##`` to be considered as part of the documentation. + +Tags +~~~~ + ++--------------+-------------------+ +| Description | No tag. | ++--------------+-------------------+ +| Deprecated | ``@deprecated`` | ++--------------+-------------------+ +| Experimental | ``@experimental`` | ++--------------+-------------------+ + +For example:: + + ## The description of the variable. + ## @deprecated + var my_var + +Variables, constants, signals, and enum values support inline documentation comments. +Note that inline comments do not support tags. + +:: + + var my_var ## My variable. + const MY_CONST = 1 ## My constant. + signal my_signal ## My signal. + enum Direction { + UP = 0, ## Direction up. + DOWN = 1, ## Direction down. + LEFT = 2, ## Direction left. + RIGHT = 3, ## Direction right. + } + +The script documentation will update in the editor help window every time the script is updated. +If any member variable or function name starts with an underscore, it will be treated as private. +It will not appear in the documentation and will be ignored in the help window. + +Complete script example +----------------------- :: @@ -99,6 +132,7 @@ Example ## ## @tutorial: https://the/tutorial1/url.com ## @tutorial(Tutorial2): https://the/tutorial2/url.com + ## @experimental ## The description of a constant. const GRAVITY = 9.8 @@ -106,13 +140,16 @@ Example ## The description of a signal. signal my_signal - ## This is a description of the below enums. Note below that - ## the enum values are documented on the same line as the enum. + ## This is a description of the below enum. enum Direction { - UP = 0, ## Direction up. - DOWN = 1, ## Direction down. - LEFT = 2, ## Direction left. - RIGHT = 3, ## Direction right. + ## Direction up. + UP = 0, + ## Direction down. + DOWN = 1, + ## Direction left. + LEFT = 2, + ## Direction right. + RIGHT = 3, } ## The description of a constant. @@ -149,6 +186,7 @@ Example ## immediately precede the class definition. ## ## @tutorial: https://the/tutorial/url.com + ## @experimental class Inner: ## Inner class variable v4. @@ -158,6 +196,24 @@ Example ## Inner class function fn. func fn(): pass +``@deprecated`` and ``@experimental`` tags +------------------------------------------ + +You can mark a class or any of its members as deprecated or experimental. +This will add the corresponding indicator in the built-in documentation viewer. +This can be especially useful for plugin and library creators. + +.. image:: img/deprecated_and_experimental_marks.webp + +- **Deprecated** marks a non-recommended API that is subject to removal or incompatible change + in a future major release. Usually the API is kept for backwards compatibility. +- **Experimental** marks a new unstable API that may be changed or removed in the current + major branch. Using this API is not recommended in production code. + +.. note:: + + While technically you can use both ``@deprecated`` and ``@experimental`` tags on the same + class/member, this is not recommended as it is against common conventions. BBCode and class reference -------------------------- diff --git a/tutorials/scripting/gdscript/img/deprecated_and_experimental_marks.webp b/tutorials/scripting/gdscript/img/deprecated_and_experimental_marks.webp new file mode 100644 index 0000000000000000000000000000000000000000..45a9ce512b96edd71e861081a865e97219008bc9 GIT binary patch literal 18686 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

-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 Tot%!-EVv^pb&zu5KQ0CU7MDpg literal 0 HcmV?d00001