package RakuAST::Doc { }
The RakuAST::Doc package serves as a common namespace for all classes that provide RakuDoc functionality.
Support for RakuAST functionality is available in language version 6.e+ and was added in Rakudo compiler release 2023.02. In earlier language versions it is only available when specifying:
use experimental :rakuast;
Classes§
Relations between the RakuAST::Doc:: classes:
RakuAST::Doc::Block
\- paragraphs
|- string
|- RakuAST::Doc::Paragraph
| \- atoms
| |- string
| \- RakuAST::Doc::Markup
| \- atoms
| |- string
| \- RakuAST::Doc::Markup
\- RakuAST::Doc::Block
Note that this structure is recursive with regards to the RakuAST::Doc::Block object (which can occur as an element of the paragraphs of a RakuAST::Doc::Block), and the RakuAST::Doc::Markup object (which can occur as an element of the atoms of a RakuAST::Doc::Markup).
class RakuAST::Doc::Block§
The RakuAST::Doc::Block object contains the information about a block of RakuDoc. It has a type ("foo" in the case of =begin foo) and it has zero or more paragraphs. Each paragraph may consist of a string (which implies there is no extra markup in there) or a RakuAST::Doc::Paragraph object, or another RakuAST::Doc::Block in the case of RakuDoc blocks embedding other blocks.
A RakuAST::Doc::Block typically occurs in RakuAST::StatementList objects when it is the result of parsing Raku Programming Language code, or RakuDoc documentation.
class RakuAST::Doc::Paragraph§
The RakuAST::Doc::Paragraph object contains the information about the atoms that constitute the paragraph. Each atom may be either a string or a RakuAST::Doc::Markup object.
class RakuAST::Doc::Markup§
The RakuAST::Doc::Markup object contains the information about a markup atom, and itself contains a list of atoms. Each atom may be either a string or a RakuAST::Doc::Markup object in the case of embedded markup.
EXAMPLE§
This small piece of RakuDoc:
=begin rakudoc This is L<B<example>|https://example.com>>. =end rakudoc
is represented in RakuAST::Doc:: objects like this:
RakuAST::Doc::Block.new( type => "rakudoc", paragraphs => ( RakuAST::Doc::Paragraph.new( "This is ", RakuAST::Doc::Markup.new( letter => "L", opener => "<", closer => ">", atoms => ( RakuAST::Doc::Markup.new( letter => "B", opener => "<", closer => ">", atoms => ( "example", ) ), ), meta => ( "https://example.com", ) ), ">.\n" ), ) );
class RakuAST::Doc::Declarator§
The RakuAST::Doc::Declarator object contains the leading and trailing documentation of a RakuAST object doing the RakuAST::Doc::DeclaratorTarget role.
role RakuAST::Doc::DeclaratorTarget§
The RakuAST::Doc::DeclaratorTarget role is done by RakuAST objects that allow leading and/or trailing documentation when used in Raku source code.
EXAMPLE§
Raku code with leading and trailing declarator doc:
#| important variable my $foo; #= really!
is represented like this:
RakuAST::VarDeclaration::Simple.new( sigil => "\$", desigilname => RakuAST::Name.from-identifier("foo") ).declarator-docs( leading => ( "important variable\n", ), trailing => ( "really!\n", ) );
Note that the representation is not showing the actual RakuAST::Doc::Declarator object. This is hidden in the .declarator-docs call.
This is needed to create a single-statement representation of the target object (in this case the RakuAST::VarDeclaration::Simple object) and its associated RakuAST::Doc::Declarator object.
That is because objects doing the RakuAST::Doc::DeclaratorTarget refer to the associated RakuAST::Doc::Declarator object in the .WHY method. But conversely, the RakuAST::Doc::Declarator object refers to its subject with the .WHEREFORE method. So there's a chicken-and-egg problem, which was solved by introducing the .declarator-docs method on objects doing the RakuAST::Doc::DeclaratorTarget role.