package RakuAST::Doc
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.