diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 89c798e..3dfaf52 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -35,7 +35,7 @@ jobs: - name: Upload Artifacts uses: actions/upload-artifact@v4 with: - name: Vertex + name: Mamba path: | build/macosx/arm64/release/Jvav build/windows/x64/release/Jvav.exe diff --git a/src/Mamba/Code Analysis/Diagnostic.cpp b/src/Mamba/Code Analysis/Diagnostic.cpp index 829ed99..f0cdf3a 100644 --- a/src/Mamba/Code Analysis/Diagnostic.cpp +++ b/src/Mamba/Code Analysis/Diagnostic.cpp @@ -1,10 +1,10 @@ #include "Diagnostic.h" + #include "MambaCore.h" namespace Mamba { - Diagnostic::Diagnostic(const DiagnosticSeverity Severity, - const TextLocation Location, + Diagnostic::Diagnostic(const DiagnosticSeverity Severity, const TextLocation Location, const std::shared_ptr Message) noexcept : Severity(Severity), Location(Location), Message(Message) { diff --git a/src/Mamba/Code Analysis/Diagnostic.h b/src/Mamba/Code Analysis/Diagnostic.h index 29b9982..352f5ec 100644 --- a/src/Mamba/Code Analysis/Diagnostic.h +++ b/src/Mamba/Code Analysis/Diagnostic.h @@ -1,6 +1,7 @@ #pragma once #include "MambaCore.h" + #include "TextLocation.h" #include @@ -16,8 +17,7 @@ namespace Mamba class Diagnostic final { public: - [[nodiscard]] Diagnostic(const DiagnosticSeverity Severity, - const TextLocation Location, + [[nodiscard]] Diagnostic(const DiagnosticSeverity Severity, const TextLocation Location, const std::shared_ptr Message) noexcept; const DiagnosticSeverity Severity; diff --git a/src/Mamba/Code Analysis/DiagnosticBag.h b/src/Mamba/Code Analysis/DiagnosticBag.h index 30a92c5..d16d4e3 100644 --- a/src/Mamba/Code Analysis/DiagnosticBag.h +++ b/src/Mamba/Code Analysis/DiagnosticBag.h @@ -1,12 +1,11 @@ #pragma once -#include "MambaCore.h" -#include "SyntaxKind.h" -#include "TextLocation.h" - #include #include +#include "SyntaxKind.h" +#include "TextLocation.h" + namespace Mamba { class DiagnosticBag : public std::vector> diff --git a/src/Mamba/Code Analysis/Syntax/ExpressionSyntax.cpp b/src/Mamba/Code Analysis/Syntax/ExpressionSyntax.cpp index 2a646bc..fc212c9 100644 --- a/src/Mamba/Code Analysis/Syntax/ExpressionSyntax.cpp +++ b/src/Mamba/Code Analysis/Syntax/ExpressionSyntax.cpp @@ -1,5 +1,7 @@ #include "ExpressionSyntax.h" +#include "SyntaxTree.h" + namespace Mamba { ExpressionSyntax::ExpressionSyntax(const std::shared_ptr SyntaxTree) noexcept : diff --git a/src/Mamba/Code Analysis/Syntax/Lexer.cpp b/src/Mamba/Code Analysis/Syntax/Lexer.cpp index 3ff49a5..8744760 100644 --- a/src/Mamba/Code Analysis/Syntax/Lexer.cpp +++ b/src/Mamba/Code Analysis/Syntax/Lexer.cpp @@ -1,6 +1,7 @@ #include "Lexer.h" + #include "DiagnosticBag.h" -#include "MambaCore.h" +#include "Literal.h" #include "SourceText.h" #include "SyntaxFacts.h" #include "SyntaxKind.h" @@ -16,11 +17,11 @@ namespace Mamba { Lexer::Lexer(const std::shared_ptr SyntaxTree) : - SyntaxTree(SyntaxTree), Text(SyntaxTree->Text), Start(), Position(), Kind(SyntaxKind::BadToken) + SyntaxTree(SyntaxTree), Text(SyntaxTree->Text), Position(), Start(), Kind(SyntaxKind::BadToken) { } - std::shared_ptr Lexer::Lex() noexcept + std::shared_ptr Lexer::Lex() noexcept { const auto TokenStart = Position; diff --git a/src/Mamba/Code Analysis/Syntax/Lexer.h b/src/Mamba/Code Analysis/Syntax/Lexer.h index 1a1ffe1..b026e46 100644 --- a/src/Mamba/Code Analysis/Syntax/Lexer.h +++ b/src/Mamba/Code Analysis/Syntax/Lexer.h @@ -1,7 +1,6 @@ #pragma once #include "DiagnosticBag.h" -#include "Literal.h" #include "MambaCore.h" #include "SourceText.h" #include "SyntaxKind.h" @@ -20,7 +19,7 @@ namespace Mamba std::size_t Start; SyntaxKind Kind; - NullableSharedPtr Value; + NullableSharedPtr Value; public: DiagnosticBag Diagnostics; @@ -84,7 +83,7 @@ namespace Mamba // Report an invalid number diagnostic with the specified base and literal template - void ReportInvalidNumber(const TextSpan& Span, const StringView& Literal) + void ReportInvalidNumber(const TextSpan Span, const StringView Literal) requires(Base == 2 || Base == 8 || Base == 10 || Base == 16) { diff --git a/src/Mamba/Code Analysis/Syntax/Literal.cpp b/src/Mamba/Code Analysis/Syntax/Literal.cpp index bab07ab..de91799 100644 --- a/src/Mamba/Code Analysis/Syntax/Literal.cpp +++ b/src/Mamba/Code Analysis/Syntax/Literal.cpp @@ -18,7 +18,7 @@ namespace Mamba Literal::Literal() noexcept {} Literal::Literal(const std::shared_ptr String) noexcept : - StringValue(String), Value(StringView(*String)), Type(LiteralType::String) + Value(StringView(*String)), Type(LiteralType::String), StringValue(String) { } diff --git a/src/Mamba/Code Analysis/Syntax/Literal.h b/src/Mamba/Code Analysis/Syntax/Literal.h index 4b95eba..8200903 100644 --- a/src/Mamba/Code Analysis/Syntax/Literal.h +++ b/src/Mamba/Code Analysis/Syntax/Literal.h @@ -1,8 +1,10 @@ #pragma once #include "MambaCore.h" + #include #include +#include namespace Mamba { @@ -43,7 +45,7 @@ namespace Mamba LiteralValue(const LiteralValue&) = default; LiteralValue(LiteralValue&&) = default; - friend class Literal; + friend struct Literal; }; enum class LiteralType @@ -74,7 +76,7 @@ namespace Mamba LiteralValue Value; LiteralType Type; - std::optional> StringValue; + ::std::optional> StringValue; [[nodiscard]] Literal() noexcept; [[nodiscard]] Literal(const std::shared_ptr String) noexcept; diff --git a/src/Mamba/Code Analysis/Syntax/LiteralExpressionSyntax.cpp b/src/Mamba/Code Analysis/Syntax/LiteralExpressionSyntax.cpp index ff75efc..8a6eb93 100644 --- a/src/Mamba/Code Analysis/Syntax/LiteralExpressionSyntax.cpp +++ b/src/Mamba/Code Analysis/Syntax/LiteralExpressionSyntax.cpp @@ -1,19 +1,20 @@ #include "LiteralExpressionSyntax.h" +#include "Literal.h" #include "SyntaxToken.h" +#include "SyntaxTree.h" namespace Mamba { - LiteralExpressionSyntax::LiteralExpressionSyntax( - const std::shared_ptr SyntaxTree, - const std::shared_ptr LiteralToken) noexcept : + LiteralExpressionSyntax::LiteralExpressionSyntax(const std::shared_ptr SyntaxTree, + const std::shared_ptr LiteralToken) noexcept : Super(SyntaxTree), LiteralToken(LiteralToken), Value(LiteralToken->Value) { } LiteralExpressionSyntax::LiteralExpressionSyntax(const std::shared_ptr SyntaxTree, - const std::shared_ptr LiteralToken, - const std::shared_ptr Value) noexcept : + const std::shared_ptr LiteralToken, + const std::shared_ptr Value) noexcept : Super(SyntaxTree), LiteralToken(LiteralToken), Value(Value) { } diff --git a/src/Mamba/Code Analysis/Syntax/LiteralExpressionSyntax.h b/src/Mamba/Code Analysis/Syntax/LiteralExpressionSyntax.h index 72b0945..78a958b 100644 --- a/src/Mamba/Code Analysis/Syntax/LiteralExpressionSyntax.h +++ b/src/Mamba/Code Analysis/Syntax/LiteralExpressionSyntax.h @@ -17,12 +17,15 @@ namespace Mamba [[nodiscard]] LiteralExpressionSyntax(const std::shared_ptr SyntaxTree, const std::shared_ptr LiteralToken, - const std::shared_ptr Value) noexcept; + // msvc bug, struct keyword is required here, class is not allowed + // https://eel.is/c++draft/dcl.dcl#dcl.type.elab-7 + // https://zh.cppreference.com/w/cpp/language/elaborated_type_specifier + const std::shared_ptr Value) noexcept; virtual SyntaxKind Kind() const noexcept override; virtual std::vector> Children() const noexcept override; const std::shared_ptr LiteralToken; - const std::shared_ptr Value; + const std::shared_ptr Value; }; } // namespace Mamba \ No newline at end of file diff --git a/src/Mamba/Code Analysis/Syntax/Parser.cpp b/src/Mamba/Code Analysis/Syntax/Parser.cpp index fed2907..ced4de9 100644 --- a/src/Mamba/Code Analysis/Syntax/Parser.cpp +++ b/src/Mamba/Code Analysis/Syntax/Parser.cpp @@ -1,34 +1,41 @@ #include "Parser.h" + +#include + #include "AssignmentExpressionSyntax.h" #include "BinaryExpressionSyntax.h" +#include "BlockStatementSyntax.h" #include "BreakStatementSyntax.h" #include "CallExpressionSyntax.h" +#include "CompilationUnitSyntax.h" #include "ContinueStatementSyntax.h" #include "DoWhileStatementSyntax.h" +#include "ElseClauseSyntax.h" +#include "ExpressionStatementSyntax.h" #include "ExpressionSyntax.h" #include "ForStatementSyntax.h" +#include "FunctionDeclarationSyntax.h" #include "GlobalStatementSyntax.h" #include "IfStatementSyntax.h" #include "Lexer.h" +#include "Literal.h" #include "LiteralExpressionSyntax.h" #include "MambaCore.h" #include "NameExpressionSyntax.h" #include "ParameterSyntax.h" #include "ParenthesizedExpressionSyntax.h" #include "ReturnStatementSyntax.h" +#include "StatementSyntax.h" #include "SyntaxFacts.h" #include "SyntaxKind.h" #include "SyntaxNode.h" #include "SyntaxToken.h" #include "SyntaxTree.h" +#include "TypeClauseSyntax.h" #include "UnaryExpressionSyntax.h" #include "VariableDeclarationSyntax.h" - -#include "MambaCore.h" #include "WhileStatementSyntax.h" -#include - namespace Mamba { Parser::Parser(const std::shared_ptr SyntaxTree) noexcept : @@ -234,8 +241,8 @@ namespace Mamba } const auto CloseBraceToken = MatchToken(SyntaxKind::CloseBraceToken); - return std::make_shared(SyntaxTree, OpenBraceToken, std::move(Statements), - CloseBraceToken); + return std::make_shared(SyntaxTree, OpenBraceToken, std::move(Statements), + CloseBraceToken); } std::shared_ptr Parser::ParseVariableDeclaration() noexcept @@ -354,7 +361,7 @@ namespace Mamba std::shared_ptr Parser::ParseExpressionStatement() noexcept { const auto Expression = ParseExpression(); - return std::make_shared(SyntaxTree, Expression); + return std::make_shared(SyntaxTree, Expression); } std::shared_ptr Parser::ParseExpression() noexcept @@ -451,26 +458,27 @@ namespace Mamba const auto Left = MatchToken(SyntaxKind::OpenParenthesisToken); const auto Expression = ParseExpression(); const auto Right = MatchToken(SyntaxKind::CloseParenthesisToken); - return std::make_shared(SyntaxTree, Left, Expression, Right); + return std::make_shared(SyntaxTree, Left, Expression, Right); } std::shared_ptr Parser::ParseBooleanLiteral() noexcept { const auto IsTrue = Current()->Kind() == SyntaxKind::TrueKeyword; const auto KeywordToken = MatchToken(IsTrue ? SyntaxKind::TrueKeyword : SyntaxKind::FalseKeyword); - return std::make_shared(SyntaxTree, KeywordToken, std::make_shared(IsTrue)); + return std::make_shared(SyntaxTree, KeywordToken, + std::make_shared(IsTrue)); } std::shared_ptr Parser::ParseNumericLiteral() noexcept { const auto NumberToken = MatchToken(SyntaxKind::NumberToken); - return std::make_shared(SyntaxTree, NumberToken); + return std::make_shared(SyntaxTree, NumberToken); } std::shared_ptr Parser::ParseStringLiteral() noexcept { const auto StringToken = MatchToken(SyntaxKind::StringToken); - return std::make_shared(SyntaxTree, StringToken); + return std::make_shared(SyntaxTree, StringToken); } std::shared_ptr Parser::ParseNameOrCallExpression() noexcept diff --git a/src/Mamba/Code Analysis/Syntax/Parser.h b/src/Mamba/Code Analysis/Syntax/Parser.h index e99317b..3561cc4 100644 --- a/src/Mamba/Code Analysis/Syntax/Parser.h +++ b/src/Mamba/Code Analysis/Syntax/Parser.h @@ -1,21 +1,10 @@ #pragma once -#include "BlockStatementSyntax.h" -#include "CompilationUnitSyntax.h" +#include +#include + #include "DiagnosticBag.h" -#include "ElseClauseSyntax.h" -#include "ExpressionStatementSyntax.h" -#include "ExpressionSyntax.h" -#include "FunctionDeclarationSyntax.h" -#include "MambaCore.h" -#include "MemberSyntax.h" -#include "ParameterSyntax.h" #include "SeperatedSyntaxList.h" -#include "StatementSyntax.h" -#include "SyntaxKind.h" -#include "SyntaxToken.h" -#include "TypeClauseSyntax.h" -#include namespace Mamba { diff --git a/src/Mamba/Code Analysis/Syntax/SeperatedSyntaxList.h b/src/Mamba/Code Analysis/Syntax/SeperatedSyntaxList.h index 52965f0..06246c0 100644 --- a/src/Mamba/Code Analysis/Syntax/SeperatedSyntaxList.h +++ b/src/Mamba/Code Analysis/Syntax/SeperatedSyntaxList.h @@ -12,7 +12,11 @@ namespace Mamba [[nodiscard]] constexpr Container SkipSeperators(Container&& NodesAndSeparators) const noexcept { auto Result = Container(NodesAndSeparators.size() / 2); +#if __cpp_size_t_suffix == 202011L for (auto Index = 0uz; Index < NodesAndSeparators.size() / 2; ++Index) +#else + for (auto Index = std::size_t(); Index < NodesAndSeparators.size() / 2; ++Index) +#endif { Result[Index] = std::move(NodesAndSeparators[Index * 2]); } diff --git a/src/Mamba/Code Analysis/Syntax/SyntaxFacts.cpp b/src/Mamba/Code Analysis/Syntax/SyntaxFacts.cpp index 3f9dc37..6bc8e18 100644 --- a/src/Mamba/Code Analysis/Syntax/SyntaxFacts.cpp +++ b/src/Mamba/Code Analysis/Syntax/SyntaxFacts.cpp @@ -356,12 +356,9 @@ namespace Mamba return TEXT("AssignmentExpression"); case SyntaxKind::CallExpression: return TEXT("CallExpression"); - deafult: + default: return TEXT("Unknown"); } - - // GCC & MSVC reports that control reaches end of non-void function [-Wreturn-type] - std::unreachable(); } bool SyntaxFacts::IsKeyword(const SyntaxKind Kind) noexcept diff --git a/src/Mamba/Code Analysis/Syntax/SyntaxNode.cpp b/src/Mamba/Code Analysis/Syntax/SyntaxNode.cpp index 871e1db..43da8f2 100644 --- a/src/Mamba/Code Analysis/Syntax/SyntaxNode.cpp +++ b/src/Mamba/Code Analysis/Syntax/SyntaxNode.cpp @@ -1,5 +1,6 @@ -#include "SyntaxNode.h" +#include "SyntaxNode.h" +#include "Literal.h" #include "MambaCore.h" #include "SourceText.h" #include "SyntaxFacts.h" @@ -16,6 +17,8 @@ namespace Mamba { } + SyntaxNode::~SyntaxNode() noexcept {} + const std::shared_ptr SyntaxNode::Parent() const noexcept { return SyntaxTree->GetParent(shared_from_this()); @@ -185,7 +188,7 @@ namespace Mamba const auto LastChild = Node->Children().size() == 0 ? nullptr : Node->Children().back(); - for (const auto Child : Node->Children()) + for (auto&& Child : Node->Children()) { PrettyPrint(Stream, Child, Indent, Child == LastChild); } diff --git a/src/Mamba/Code Analysis/Syntax/SyntaxNode.h b/src/Mamba/Code Analysis/Syntax/SyntaxNode.h index 27f1127..c4b93c7 100644 --- a/src/Mamba/Code Analysis/Syntax/SyntaxNode.h +++ b/src/Mamba/Code Analysis/Syntax/SyntaxNode.h @@ -16,6 +16,8 @@ namespace Mamba [[nodiscard]] SyntaxNode(const std::shared_ptr SyntaxTree) noexcept; public: + virtual ~SyntaxNode() noexcept; + const std::shared_ptr SyntaxTree; [[nodiscard]] const NullableSharedPtr Parent() const noexcept; diff --git a/src/Mamba/Code Analysis/Syntax/SyntaxToken.cpp b/src/Mamba/Code Analysis/Syntax/SyntaxToken.cpp index b194fa7..51276f7 100644 --- a/src/Mamba/Code Analysis/Syntax/SyntaxToken.cpp +++ b/src/Mamba/Code Analysis/Syntax/SyntaxToken.cpp @@ -4,12 +4,10 @@ namespace Mamba { - SyntaxToken::SyntaxToken(const std::shared_ptr SyntaxTree, - const SyntaxKind Kind, - const std::size_t Position, - const std::shared_ptr Text, + SyntaxToken::SyntaxToken(const std::shared_ptr SyntaxTree, const SyntaxKind Kind, + const std::size_t Position, const std::shared_ptr Text, const NullableSharedPtr Value) noexcept : - Super(SyntaxTree), KindValue(Kind), Position(Position), Text(Text), Value(Value) + Super(SyntaxTree), Position(Position), Text(Text), Value(Value), KindValue(Kind) { } diff --git a/src/Mamba/Code Analysis/Syntax/SyntaxToken.h b/src/Mamba/Code Analysis/Syntax/SyntaxToken.h index 0e6fbc3..b1dba93 100644 --- a/src/Mamba/Code Analysis/Syntax/SyntaxToken.h +++ b/src/Mamba/Code Analysis/Syntax/SyntaxToken.h @@ -1,6 +1,5 @@ #pragma once -#include "Literal.h" #include "MambaCore.h" #include "SyntaxKind.h" #include "SyntaxNode.h" @@ -14,11 +13,9 @@ namespace Mamba using Super = SyntaxNode; public: - [[nodiscard]] SyntaxToken(const std::shared_ptr SyntaxTree, - const SyntaxKind Kind, - const std::size_t Position, - const std::shared_ptr Text, - const NullableSharedPtr Value) noexcept; + [[nodiscard]] SyntaxToken(const std::shared_ptr SyntaxTree, const SyntaxKind Kind, + const std::size_t Position, const std::shared_ptr Text, + const NullableSharedPtr Value) noexcept; virtual SyntaxKind Kind() const noexcept override; diff --git a/src/Mamba/Code Analysis/Syntax/SyntaxTree.cpp b/src/Mamba/Code Analysis/Syntax/SyntaxTree.cpp index bf5530b..0f91dde 100644 --- a/src/Mamba/Code Analysis/Syntax/SyntaxTree.cpp +++ b/src/Mamba/Code Analysis/Syntax/SyntaxTree.cpp @@ -1,9 +1,12 @@ #include "SyntaxTree.h" + +#include "CompilationUnitSyntax.h" #include "Lexer.h" #include "MambaCore.h" #include "Parser.h" #include "SourceText.h" #include "SyntaxKind.h" +#include "SyntaxNode.h" #include "SyntaxToken.h" #include diff --git a/src/Mamba/Code Analysis/Syntax/SyntaxTree.h b/src/Mamba/Code Analysis/Syntax/SyntaxTree.h index ef81caa..11ec31f 100644 --- a/src/Mamba/Code Analysis/Syntax/SyntaxTree.h +++ b/src/Mamba/Code Analysis/Syntax/SyntaxTree.h @@ -1,9 +1,9 @@ #pragma once #include "MambaCore.h" -#include "TextLine.h" #include +#include #include #include #include diff --git a/src/Mamba/Code Analysis/Syntax/VariableDeclarationSyntax.h b/src/Mamba/Code Analysis/Syntax/VariableDeclarationSyntax.h index c27208d..681a4c4 100644 --- a/src/Mamba/Code Analysis/Syntax/VariableDeclarationSyntax.h +++ b/src/Mamba/Code Analysis/Syntax/VariableDeclarationSyntax.h @@ -1,11 +1,9 @@ #pragma once -#include "MambaCore.h" -#include "StatementSyntax.h" -#include "TypeClauseSyntax.h" - #include +#include "StatementSyntax.h" + namespace Mamba { class VariableDeclarationSyntax : public StatementSyntax diff --git a/src/Mamba/Code Analysis/Text/SourceText.cpp b/src/Mamba/Code Analysis/Text/SourceText.cpp index 6a824a2..69df70c 100644 --- a/src/Mamba/Code Analysis/Text/SourceText.cpp +++ b/src/Mamba/Code Analysis/Text/SourceText.cpp @@ -25,8 +25,13 @@ namespace Mamba { auto Result = std::vector>(); +#if __cpp_size_t_suffix == 202011L auto Position = 0uz; auto LineStart = 0uz; +#else + auto Position = std::size_t(); + auto LineStart = std::size_t(); +#endif while (Position < Text.length()) { @@ -89,7 +94,11 @@ namespace Mamba std::size_t SourceText::GetLineIndex(const std::size_t Position) const noexcept { +#if __cpp_size_t_suffix == 202011L auto Lower = 0uz; +#else + auto Lower = std::size_t(); +#endif auto Upper = Lines.size() - 1; while (Lower <= Upper) diff --git a/src/Mamba/Code Analysis/Text/SourceText.h b/src/Mamba/Code Analysis/Text/SourceText.h index 5ac8fd0..dc0d24e 100644 --- a/src/Mamba/Code Analysis/Text/SourceText.h +++ b/src/Mamba/Code Analysis/Text/SourceText.h @@ -1,6 +1,7 @@ #pragma once #include "MambaCore.h" +#include "TextSpan.h" #include #include @@ -31,10 +32,17 @@ namespace Mamba [[nodiscard]] static std::size_t GetLineBreakWidth(const String& Text, const std::size_t Position) noexcept; public: +#if __cpp_explicit_this_parameter == 202110L [[nodiscard]] auto&& operator[](this auto&& Self, const std::size_t Position) noexcept { return (*std::forward(Self).Text)[Position]; } +#else + [[nodiscard]] Char operator[](const std::size_t Position) const noexcept + { + return (*Text)[Position]; + } +#endif [[nodiscard]] std::size_t Length() const noexcept; @@ -45,10 +53,10 @@ namespace Mamba [[nodiscard]] std::shared_ptr ToString(const std::size_t Start, const std::size_t Length) const noexcept; - [[nodiscard]] std::shared_ptr ToString(const class TextSpan Span) const noexcept; + [[nodiscard]] std::shared_ptr ToString(const TextSpan Span) const noexcept; [[nodiscard]] StringView ToView(const std::size_t Start, const std::size_t Length) const noexcept; - [[nodiscard]] StringView ToView(const class TextSpan Span) const noexcept; + [[nodiscard]] StringView ToView(const TextSpan Span) const noexcept; }; } // namespace Mamba diff --git a/src/Mamba/Code Analysis/Text/TextLine.h b/src/Mamba/Code Analysis/Text/TextLine.h index 42ae275..e1756b3 100644 --- a/src/Mamba/Code Analysis/Text/TextLine.h +++ b/src/Mamba/Code Analysis/Text/TextLine.h @@ -16,13 +16,11 @@ namespace Mamba std::size_t End() const noexcept; const std::size_t LengthIncludeLineBreak; - class TextSpan Span() const noexcept; - class TextSpan SpanIncludeLineBreak() const noexcept; + struct TextSpan Span() const noexcept; + struct TextSpan SpanIncludeLineBreak() const noexcept; - [[nodiscard]] TextLine(const std::shared_ptr Text, - const std::size_t Start, - const std::size_t Length, - const std::size_t LengthIncludeLineBreak) noexcept; + [[nodiscard]] TextLine(const std::shared_ptr Text, const std::size_t Start, + const std::size_t Length, const std::size_t LengthIncludeLineBreak) noexcept; [[nodiscard]] std::shared_ptr ToString() const noexcept; }; diff --git a/src/Mamba/MambaCore.h b/src/Mamba/MambaCore.h index c634dc2..f620b81 100644 --- a/src/Mamba/MambaCore.h +++ b/src/Mamba/MambaCore.h @@ -5,6 +5,7 @@ #include #include +#include #define MAMBA_NAMESPACE_BEGIN \ namespace Mamba \ diff --git a/src/main.cpp b/src/main.cpp index 6174f5a..a5fa51f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,11 +1,12 @@ -#include "CompilationUnitSyntax.h" -#include "fast_io_core_impl/codecvt/general.h" -#include "fast_io_core_impl/error.h" -#include "fast_io_unit/string_impl/concat.h" -#include "MambaCore.h" -#include "SyntaxTree.h" #include #include +#include + +#include "Diagnostic.h" +#include "MambaCore.h" +#include "SyntaxTree.h" + +#include "CompilationUnitSyntax.h" int main(int argc, char* argv[]) { @@ -14,11 +15,30 @@ int main(int argc, char* argv[]) for (auto i = 1; i < argc; ++i) { auto Argument = fast_io::mnp::os_c_str(argv[i]); - fast_io::io::perrln("Compiling: ", Argument); + fast_io::io::println("Compiling: ", Argument); const auto SyntaxTree = Mamba::SyntaxTree::Load( std::make_shared(fast_io::u8concat(fast_io::mnp::code_cvt(Argument)))); fast_io::io::println(fast_io::mnp::code_cvt(SyntaxTree.Root()->ToString())); + + if (!SyntaxTree.Diagnostics().empty()) + { + for (auto&& Diagnostic : SyntaxTree.Diagnostics()) + { + if (Diagnostic->Severity == Mamba::DiagnosticSeverity::Error) + { + fast_io::io::println("Error: ", fast_io::mnp::code_cvt(*Diagnostic->Message)); + } + else if (Diagnostic->Severity == Mamba::DiagnosticSeverity::Warning) + { + fast_io::io::println("Warning: ", fast_io::mnp::code_cvt(*Diagnostic->Message)); + } + else + { + fast_io::io::println("Info: ", fast_io::mnp::code_cvt(*Diagnostic->Message)); + } + } + } } } catch (const std::exception& exception) @@ -29,4 +49,4 @@ int main(int argc, char* argv[]) { fast_io::io::perrln(exception); } -} +} \ No newline at end of file diff --git a/xmake.lua b/xmake.lua index fc0cd14..e308a92 100644 --- a/xmake.lua +++ b/xmake.lua @@ -10,8 +10,11 @@ target("Jvav") set_languages("clatest", "c++latest") add_packages("fast_io") set_toolchains("llvm") + set_warnings("all") add_includedirs("src/Mamba", "src/Mamba/Code Analysis", "src/Mamba/Code Analysis/Syntax", "src/Mamba/Code Analysis/Text") - add_linkdirs("/opt/homebrew/opt/llvm/lib/c++") -- macOS compability + if is_os("macosx") then + add_linkdirs("/opt/homebrew/opt/llvm/lib/c++") -- macOS compability + end if is_mode("release") then set_optimize("fastest") end