diff --git a/Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.cpp b/Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.cpp index a1ea591e46..d8cd98178b 100644 --- a/Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.cpp +++ b/Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.cpp @@ -72,7 +72,7 @@ OwnPtr ParserAutoComplete::create_document_dat auto document = filedb().get(file); ASSERT(document); auto content = document->text(); - auto document_data = make(document->text()); + auto document_data = make(document->text(), file); auto root = document_data->parser.parse(); for (auto& path : document_data->preprocessor.included_paths()) { get_or_create_document_data(document_path_from_include_path(path)); @@ -88,10 +88,10 @@ void ParserAutoComplete::set_document_data(const String& file, OwnPtr #include #include #include @@ -60,6 +61,10 @@ public: ASSERT(m_end.has_value()); return m_end.value(); } + const FlyString& filename() const + { + return m_filename; + } void set_end(const Position& end) { m_end = end; } void set_parent(ASTNode& parent) { m_parent = &parent; } @@ -68,12 +73,15 @@ public: virtual bool is_identifier() const { return false; } virtual bool is_member_expression() const { return false; } virtual bool is_variable_or_parameter_declaration() const { return false; } + virtual bool is_function_call() const { return false; } + virtual bool is_type() const { return false; } protected: - ASTNode(ASTNode* parent, Optional start, Optional end) + ASTNode(ASTNode* parent, Optional start, Optional end, const String& filename) : m_parent(parent) , m_start(start) , m_end(end) + , m_filename(filename) { } @@ -81,6 +89,7 @@ private: ASTNode* m_parent { nullptr }; Optional m_start; Optional m_end; + FlyString m_filename; }; class TranslationUnit : public ASTNode { @@ -97,8 +106,8 @@ public: virtual NonnullRefPtrVector declarations() const override { return m_children; } public: - TranslationUnit(ASTNode* parent, Optional start, Optional end) - : ASTNode(parent, start, end) + TranslationUnit(ASTNode* parent, Optional start, Optional end, const String& filename) + : ASTNode(parent, start, end, filename) { } @@ -115,8 +124,8 @@ public: virtual NonnullRefPtrVector declarations() const override; protected: - Statement(ASTNode* parent, Optional start, Optional end) - : ASTNode(parent, start, end) + Statement(ASTNode* parent, Optional start, Optional end, const String& filename) + : ASTNode(parent, start, end, filename) { } }; @@ -131,8 +140,8 @@ public: virtual bool is_function() const { return false; } protected: - Declaration(ASTNode* parent, Optional start, Optional end) - : Statement(parent, start, end) + Declaration(ASTNode* parent, Optional start, Optional end, const String& filename) + : Statement(parent, start, end, filename) { } }; @@ -142,8 +151,8 @@ class InvalidDeclaration : public Declaration { public: virtual ~InvalidDeclaration() override = default; virtual const char* class_name() const override { return "InvalidDeclaration"; } - InvalidDeclaration(ASTNode* parent, Optional start, Optional end) - : Declaration(parent, start, end) + InvalidDeclaration(ASTNode* parent, Optional start, Optional end, const String& filename) + : Declaration(parent, start, end, filename) { } }; @@ -157,8 +166,8 @@ public: const StringView& name() const { return m_name; } RefPtr definition() { return m_definition; } - FunctionDeclaration(ASTNode* parent, Optional start, Optional end) - : Declaration(parent, start, end) + FunctionDeclaration(ASTNode* parent, Optional start, Optional end, const String& filename) + : Declaration(parent, start, end, filename) { } @@ -179,8 +188,8 @@ public: RefPtr m_type; protected: - VariableOrParameterDeclaration(ASTNode* parent, Optional start, Optional end) - : Declaration(parent, start, end) + VariableOrParameterDeclaration(ASTNode* parent, Optional start, Optional end, const String& filename) + : Declaration(parent, start, end, filename) { } }; @@ -191,8 +200,8 @@ public: virtual const char* class_name() const override { return "Parameter"; } virtual void dump(size_t indent) const override; - Parameter(ASTNode* parent, Optional start, Optional end, StringView name) - : VariableOrParameterDeclaration(parent, start, end) + Parameter(ASTNode* parent, Optional start, Optional end, StringView name, const String& filename) + : VariableOrParameterDeclaration(parent, start, end, filename) { m_name = name; } @@ -206,9 +215,10 @@ public: virtual const char* class_name() const override { return "Type"; } const StringView& name() const { return m_name; } virtual void dump(size_t indent) const override; + virtual bool is_type() const override { return true; } - Type(ASTNode* parent, Optional start, Optional end, StringView name) - : ASTNode(parent, start, end) + Type(ASTNode* parent, Optional start, Optional end, const String& filename, StringView name) + : ASTNode(parent, start, end, filename) , m_name(name) { } @@ -222,8 +232,8 @@ public: virtual const char* class_name() const override { return "Pointer"; } virtual void dump(size_t indent) const override; - Pointer(ASTNode* parent, Optional start, Optional end) - : Type(parent, start, end, {}) + Pointer(ASTNode* parent, Optional start, Optional end, const String& filename) + : Type(parent, start, end, filename, {}) { } @@ -237,8 +247,8 @@ public: NonnullRefPtrVector& statements() { return m_statements; } virtual void dump(size_t indent) const override; - FunctionDefinition(ASTNode* parent, Optional start, Optional end) - : ASTNode(parent, start, end) + FunctionDefinition(ASTNode* parent, Optional start, Optional end, const String& filename) + : ASTNode(parent, start, end, filename) { } @@ -251,8 +261,8 @@ class InvalidStatement : public Statement { public: virtual ~InvalidStatement() override = default; virtual const char* class_name() const override { return "InvalidStatement"; } - InvalidStatement(ASTNode* parent, Optional start, Optional end) - : Statement(parent, start, end) + InvalidStatement(ASTNode* parent, Optional start, Optional end, const String& filename) + : Statement(parent, start, end, filename) { } }; @@ -263,8 +273,8 @@ public: virtual const char* class_name() const override { return "Expression"; } protected: - Expression(ASTNode* parent, Optional start, Optional end) - : Statement(parent, start, end) + Expression(ASTNode* parent, Optional start, Optional end, const String& filename) + : Statement(parent, start, end, filename) { } }; @@ -273,8 +283,8 @@ class InvalidExpression : public Expression { public: virtual ~InvalidExpression() override = default; virtual const char* class_name() const override { return "InvalidExpression"; } - InvalidExpression(ASTNode* parent, Optional start, Optional end) - : Expression(parent, start, end) + InvalidExpression(ASTNode* parent, Optional start, Optional end, const String& filename) + : Expression(parent, start, end, filename) { } }; @@ -285,8 +295,8 @@ public: virtual const char* class_name() const override { return "VariableDeclaration"; } virtual void dump(size_t indent) const override; - VariableDeclaration(ASTNode* parent, Optional start, Optional end) - : VariableOrParameterDeclaration(parent, start, end) + VariableDeclaration(ASTNode* parent, Optional start, Optional end, const String& filename) + : VariableOrParameterDeclaration(parent, start, end, filename) { } @@ -301,13 +311,13 @@ public: virtual const char* class_name() const override { return "Identifier"; } virtual void dump(size_t indent) const override; - Identifier(ASTNode* parent, Optional start, Optional end, StringView name) - : Expression(parent, start, end) + Identifier(ASTNode* parent, Optional start, Optional end, const String& filename, StringView name) + : Expression(parent, start, end, filename) , m_name(name) { } - Identifier(ASTNode* parent, Optional start, Optional end) - : Identifier(parent, start, end, {}) + Identifier(ASTNode* parent, Optional start, Optional end, const String& filename) + : Identifier(parent, start, end, filename, {}) { } @@ -322,8 +332,8 @@ public: virtual const char* class_name() const override { return "NumricLiteral"; } virtual void dump(size_t indent) const override; - NumericLiteral(ASTNode* parent, Optional start, Optional end, StringView value) - : Expression(parent, start, end) + NumericLiteral(ASTNode* parent, Optional start, Optional end, const String& filename, StringView value) + : Expression(parent, start, end, filename) , m_value(value) { } @@ -337,8 +347,8 @@ public: virtual const char* class_name() const override { return "BooleanLiteral"; } virtual void dump(size_t indent) const override; - BooleanLiteral(ASTNode* parent, Optional start, Optional end, bool value) - : Expression(parent, start, end) + BooleanLiteral(ASTNode* parent, Optional start, Optional end, const String& filename, bool value) + : Expression(parent, start, end, filename) , m_value(value) { } @@ -365,8 +375,8 @@ enum class BinaryOp { class BinaryExpression : public Expression { public: - BinaryExpression(ASTNode* parent, Optional start, Optional end) - : Expression(parent, start, end) + BinaryExpression(ASTNode* parent, Optional start, Optional end, const String& filename) + : Expression(parent, start, end, filename) { } @@ -387,8 +397,8 @@ enum class AssignmentOp { class AssignmentExpression : public Expression { public: - AssignmentExpression(ASTNode* parent, Optional start, Optional end) - : Expression(parent, start, end) + AssignmentExpression(ASTNode* parent, Optional start, Optional end, const String& filename) + : Expression(parent, start, end, filename) { } @@ -403,14 +413,15 @@ public: class FunctionCall final : public Expression { public: - FunctionCall(ASTNode* parent, Optional start, Optional end) - : Expression(parent, start, end) + FunctionCall(ASTNode* parent, Optional start, Optional end, const String& filename) + : Expression(parent, start, end, filename) { } ~FunctionCall() override = default; virtual const char* class_name() const override { return "FunctionCall"; } virtual void dump(size_t indent) const override; + virtual bool is_function_call() const override { return true; } StringView m_name; NonnullRefPtrVector m_arguments; @@ -418,8 +429,8 @@ public: class StringLiteral final : public Expression { public: - StringLiteral(ASTNode* parent, Optional start, Optional end) - : Expression(parent, start, end) + StringLiteral(ASTNode* parent, Optional start, Optional end, const String& filename) + : Expression(parent, start, end, filename) { } @@ -435,8 +446,8 @@ public: virtual ~ReturnStatement() override = default; virtual const char* class_name() const override { return "ReturnStatement"; } - ReturnStatement(ASTNode* parent, Optional start, Optional end) - : Statement(parent, start, end) + ReturnStatement(ASTNode* parent, Optional start, Optional end, const String& filename) + : Statement(parent, start, end, filename) { } virtual void dump(size_t indent) const override; @@ -450,8 +461,8 @@ public: virtual const char* class_name() const override { return "EnumDeclaration"; } virtual void dump(size_t indent) const override; - EnumDeclaration(ASTNode* parent, Optional start, Optional end) - : Declaration(parent, start, end) + EnumDeclaration(ASTNode* parent, Optional start, Optional end, const String& filename) + : Declaration(parent, start, end, filename) { } @@ -465,8 +476,8 @@ public: virtual const char* class_name() const override { return "MemberDeclaration"; } virtual void dump(size_t indent) const override; - MemberDeclaration(ASTNode* parent, Optional start, Optional end) - : Declaration(parent, start, end) + MemberDeclaration(ASTNode* parent, Optional start, Optional end, const String& filename) + : Declaration(parent, start, end, filename) { } @@ -487,8 +498,8 @@ public: Class }; - StructOrClassDeclaration(ASTNode* parent, Optional start, Optional end, StructOrClassDeclaration::Type type) - : Declaration(parent, start, end) + StructOrClassDeclaration(ASTNode* parent, Optional start, Optional end, const String& filename, StructOrClassDeclaration::Type type) + : Declaration(parent, start, end, filename) , m_type(type) { } @@ -509,8 +520,8 @@ enum class UnaryOp { class UnaryExpression : public Expression { public: - UnaryExpression(ASTNode* parent, Optional start, Optional end) - : Expression(parent, start, end) + UnaryExpression(ASTNode* parent, Optional start, Optional end, const String& filename) + : Expression(parent, start, end, filename) { } @@ -524,8 +535,8 @@ public: class MemberExpression : public Expression { public: - MemberExpression(ASTNode* parent, Optional start, Optional end) - : Expression(parent, start, end) + MemberExpression(ASTNode* parent, Optional start, Optional end, const String& filename) + : Expression(parent, start, end, filename) { } @@ -540,8 +551,8 @@ public: class ForStatement : public Statement { public: - ForStatement(ASTNode* parent, Optional start, Optional end) - : Statement(parent, start, end) + ForStatement(ASTNode* parent, Optional start, Optional end, const String& filename) + : Statement(parent, start, end, filename) { } @@ -559,8 +570,8 @@ public: class BlockStatement final : public Statement { public: - BlockStatement(ASTNode* parent, Optional start, Optional end) - : Statement(parent, start, end) + BlockStatement(ASTNode* parent, Optional start, Optional end, const String& filename) + : Statement(parent, start, end, filename) { } @@ -575,8 +586,8 @@ public: class Comment final : public Statement { public: - Comment(ASTNode* parent, Optional start, Optional end) - : Statement(parent, start, end) + Comment(ASTNode* parent, Optional start, Optional end, const String& filename) + : Statement(parent, start, end, filename) { } @@ -586,8 +597,8 @@ public: class IfStatement : public Statement { public: - IfStatement(ASTNode* parent, Optional start, Optional end) - : Statement(parent, start, end) + IfStatement(ASTNode* parent, Optional start, Optional end, const String& filename) + : Statement(parent, start, end, filename) { } diff --git a/Userland/Libraries/LibCpp/Parser.cpp b/Userland/Libraries/LibCpp/Parser.cpp index e06a449f27..e44a31b854 100644 --- a/Userland/Libraries/LibCpp/Parser.cpp +++ b/Userland/Libraries/LibCpp/Parser.cpp @@ -38,9 +38,10 @@ namespace Cpp { -Parser::Parser(const StringView& program) +Parser::Parser(const StringView& program, const String& filename) : m_program(program) , m_lines(m_program.split_view("\n", true)) + , m_filename(filename) { Lexer lexer(m_program); for (auto& token : lexer.lex()) { diff --git a/Userland/Libraries/LibCpp/Parser.h b/Userland/Libraries/LibCpp/Parser.h index 5fe0ec6279..91e3580792 100644 --- a/Userland/Libraries/LibCpp/Parser.h +++ b/Userland/Libraries/LibCpp/Parser.h @@ -34,7 +34,7 @@ namespace Cpp { class Parser final { public: - explicit Parser(const StringView&); + explicit Parser(const StringView& program, const String& filename); ~Parser() = default; NonnullRefPtr parse(); @@ -137,7 +137,7 @@ private: NonnullRefPtr create_ast_node(ASTNode& parent, const Position& start, Optional end, Args&&... args) { - auto node = adopt(*new T(&parent, start, end, forward(args)...)); + auto node = adopt(*new T(&parent, start, end, m_filename, forward(args)...)); m_nodes.append(node); return node; } @@ -145,7 +145,7 @@ private: NonnullRefPtr create_root_ast_node(const Position& start, Position end) { - auto node = adopt(*new TranslationUnit(nullptr, start, end)); + auto node = adopt(*new TranslationUnit(nullptr, start, end, m_filename)); m_nodes.append(node); m_root_node = node; return node; @@ -153,6 +153,7 @@ private: StringView m_program; Vector m_lines; + String m_filename; Vector m_tokens; State m_state; Vector m_saved_states; diff --git a/Userland/Utilities/CppParserTest.cpp b/Userland/Utilities/CppParserTest.cpp index 2fd78329aa..c793b91c50 100644 --- a/Userland/Utilities/CppParserTest.cpp +++ b/Userland/Utilities/CppParserTest.cpp @@ -48,7 +48,7 @@ int main(int argc, char** argv) } auto content = file->read_all(); StringView content_view(content); - ::Cpp::Parser parser(content_view); + ::Cpp::Parser parser(content_view, path); if (tokens_mode) { parser.print_tokens(); return 0;