Statement

- Added support for adding `Comment` objects to a given `Statement`

Comments (module)

- Added `CommentParser`
- Added `Comment` type
This commit is contained in:
Tristan B. Velloza Kildaire 2024-04-16 11:27:40 +02:00
parent 158f618ca9
commit 30293f7dd7
2 changed files with 141 additions and 7 deletions

View File

@ -0,0 +1,116 @@
module tlang.compiler.symbols.comments;
// TODO: Add comment parsing
import std.string : startsWith, split, strip, stripLeft;
import std.array : join;
private class CommentParser
{
private string source;
this(string source)
{
this.source = source;
}
private string commentPart;
private string extract()
{
string buildUp;
if(this.source.startsWith("/**"))
{
string[] lines = split(this.source, "\n");
// Strip all lines of any white space on the left-hand or right-hand margins
for(ulong i = 0; i < lines.length; i++)
{
lines[i] = strip(lines[i]);
}
// Strip first line of the `/**`
lines[0] = stripLeft(lines[0], "/**");
// Strip all lines between the starting and ending delimiter
// of their `*`s
for(ulong i = 1; i < lines.length-1; i++)
{
lines[i] = stripLeft(lines[i], "*");
}
// Strip last line of a a `*/`
lines[lines.length-1] = stripLeft(lines[lines.length-1], "*/");
version(unittest)
{
import niknaks.debugging;
import std.stdio : writeln;
writeln(dumpArray!(lines));
}
// Now get rid of the first line if it is empty
if(lines[0].length == 0)
{
lines = lines[1..$];
}
// Get rid of the last line if it is empty
if(lines[$-1].length == 0)
{
lines = lines[0..$-1];
}
// Now put it all together in a new-line seperate string
buildUp = join(lines, "\n");
}
return buildUp;
}
}
version(unittest)
{
import std.stdio;
import std.string : format;
}
unittest
{
// It will NEVER start with a ' ' due to how it is tokenized
string source = `/**
* Hello
* there
*/`;
CommentParser parser = new CommentParser(source);
string comment = parser.extract();
writeln(format("Comment: '%s'", comment));
// *cast(int*)0 = 1;
assert(" Hello\n there" == comment);
}
/**
* Represents a comment
* which can be attached
* to a `Statement`
*/
public final class Comment
{
private string content;
this(string content)
{
// TODO: Parse the comment into text but annotated section
this.content = content;
}
public string getContent()
{
return this.content;
}
}

View File

@ -12,6 +12,7 @@ import tlang.compiler.symbols.mcro : MStatementSearchable, MStatementReplaceable
// Module entry management
import tlang.compiler.modman : ModuleEntry;
import tlang.compiler.symbols.comments;
/**
* The _program_ holds a bunch of _modules_ as
@ -207,15 +208,32 @@ public class Statement
}
/* !!!! END TYPE CHECK ROUTINES AND DATA !!!! */
/**
* An optionally attached comment
*/
private Comment comment;
/**
* Returns the comment attached
*
* Returns: the `Comment` or `null`
* if none if attached
*/
public final Comment getComment()
{
return this.comment;
}
/**
* Sets the comment for this node
*
* Params:
* comment = the `Comment`
*/
public final void setComment(Comment comment)
{
this.comment = comment;
}
private static ulong rollingCount = 0;