1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 18:07:35 +00:00

LibCpp: Store filename in ASTNodes

As part of the position information, we now also store the filename the
ASTNode belongs to.
This commit is contained in:
Itamar 2021-02-20 12:23:53 +02:00 committed by Andreas Kling
parent c4139be461
commit d3ff82ba80
5 changed files with 86 additions and 73 deletions

View file

@ -72,7 +72,7 @@ OwnPtr<ParserAutoComplete::DocumentData> ParserAutoComplete::create_document_dat
auto document = filedb().get(file); auto document = filedb().get(file);
ASSERT(document); ASSERT(document);
auto content = document->text(); auto content = document->text();
auto document_data = make<DocumentData>(document->text()); auto document_data = make<DocumentData>(document->text(), file);
auto root = document_data->parser.parse(); auto root = document_data->parser.parse();
for (auto& path : document_data->preprocessor.included_paths()) { for (auto& path : document_data->preprocessor.included_paths()) {
get_or_create_document_data(document_path_from_include_path(path)); get_or_create_document_data(document_path_from_include_path(path));
@ -88,10 +88,10 @@ void ParserAutoComplete::set_document_data(const String& file, OwnPtr<DocumentDa
m_documents.set(filedb().to_absolute_path(file), move(data)); m_documents.set(filedb().to_absolute_path(file), move(data));
} }
ParserAutoComplete::DocumentData::DocumentData(String&& _text) ParserAutoComplete::DocumentData::DocumentData(String&& _text, const String& filename)
: text(move(_text)) : text(move(_text))
, preprocessor(text.view()) , preprocessor(text.view())
, parser(preprocessor.process().view()) , parser(preprocessor.process().view(), filename)
{ {
} }

View file

@ -26,6 +26,7 @@
#pragma once #pragma once
#include <AK/FlyString.h>
#include <AK/NonnullRefPtrVector.h> #include <AK/NonnullRefPtrVector.h>
#include <AK/Optional.h> #include <AK/Optional.h>
#include <AK/RefCounted.h> #include <AK/RefCounted.h>
@ -60,6 +61,10 @@ public:
ASSERT(m_end.has_value()); ASSERT(m_end.has_value());
return m_end.value(); return m_end.value();
} }
const FlyString& filename() const
{
return m_filename;
}
void set_end(const Position& end) { m_end = end; } void set_end(const Position& end) { m_end = end; }
void set_parent(ASTNode& parent) { m_parent = &parent; } void set_parent(ASTNode& parent) { m_parent = &parent; }
@ -68,12 +73,15 @@ public:
virtual bool is_identifier() const { return false; } virtual bool is_identifier() const { return false; }
virtual bool is_member_expression() const { return false; } virtual bool is_member_expression() const { return false; }
virtual bool is_variable_or_parameter_declaration() 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: protected:
ASTNode(ASTNode* parent, Optional<Position> start, Optional<Position> end) ASTNode(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: m_parent(parent) : m_parent(parent)
, m_start(start) , m_start(start)
, m_end(end) , m_end(end)
, m_filename(filename)
{ {
} }
@ -81,6 +89,7 @@ private:
ASTNode* m_parent { nullptr }; ASTNode* m_parent { nullptr };
Optional<Position> m_start; Optional<Position> m_start;
Optional<Position> m_end; Optional<Position> m_end;
FlyString m_filename;
}; };
class TranslationUnit : public ASTNode { class TranslationUnit : public ASTNode {
@ -97,8 +106,8 @@ public:
virtual NonnullRefPtrVector<Declaration> declarations() const override { return m_children; } virtual NonnullRefPtrVector<Declaration> declarations() const override { return m_children; }
public: public:
TranslationUnit(ASTNode* parent, Optional<Position> start, Optional<Position> end) TranslationUnit(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: ASTNode(parent, start, end) : ASTNode(parent, start, end, filename)
{ {
} }
@ -115,8 +124,8 @@ public:
virtual NonnullRefPtrVector<Declaration> declarations() const override; virtual NonnullRefPtrVector<Declaration> declarations() const override;
protected: protected:
Statement(ASTNode* parent, Optional<Position> start, Optional<Position> end) Statement(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: ASTNode(parent, start, end) : ASTNode(parent, start, end, filename)
{ {
} }
}; };
@ -131,8 +140,8 @@ public:
virtual bool is_function() const { return false; } virtual bool is_function() const { return false; }
protected: protected:
Declaration(ASTNode* parent, Optional<Position> start, Optional<Position> end) Declaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Statement(parent, start, end) : Statement(parent, start, end, filename)
{ {
} }
}; };
@ -142,8 +151,8 @@ class InvalidDeclaration : public Declaration {
public: public:
virtual ~InvalidDeclaration() override = default; virtual ~InvalidDeclaration() override = default;
virtual const char* class_name() const override { return "InvalidDeclaration"; } virtual const char* class_name() const override { return "InvalidDeclaration"; }
InvalidDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end) InvalidDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Declaration(parent, start, end) : Declaration(parent, start, end, filename)
{ {
} }
}; };
@ -157,8 +166,8 @@ public:
const StringView& name() const { return m_name; } const StringView& name() const { return m_name; }
RefPtr<FunctionDefinition> definition() { return m_definition; } RefPtr<FunctionDefinition> definition() { return m_definition; }
FunctionDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end) FunctionDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Declaration(parent, start, end) : Declaration(parent, start, end, filename)
{ {
} }
@ -179,8 +188,8 @@ public:
RefPtr<Type> m_type; RefPtr<Type> m_type;
protected: protected:
VariableOrParameterDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end) VariableOrParameterDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Declaration(parent, start, end) : Declaration(parent, start, end, filename)
{ {
} }
}; };
@ -191,8 +200,8 @@ public:
virtual const char* class_name() const override { return "Parameter"; } virtual const char* class_name() const override { return "Parameter"; }
virtual void dump(size_t indent) const override; virtual void dump(size_t indent) const override;
Parameter(ASTNode* parent, Optional<Position> start, Optional<Position> end, StringView name) Parameter(ASTNode* parent, Optional<Position> start, Optional<Position> end, StringView name, const String& filename)
: VariableOrParameterDeclaration(parent, start, end) : VariableOrParameterDeclaration(parent, start, end, filename)
{ {
m_name = name; m_name = name;
} }
@ -206,9 +215,10 @@ public:
virtual const char* class_name() const override { return "Type"; } virtual const char* class_name() const override { return "Type"; }
const StringView& name() const { return m_name; } const StringView& name() const { return m_name; }
virtual void dump(size_t indent) const override; virtual void dump(size_t indent) const override;
virtual bool is_type() const override { return true; }
Type(ASTNode* parent, Optional<Position> start, Optional<Position> end, StringView name) Type(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename, StringView name)
: ASTNode(parent, start, end) : ASTNode(parent, start, end, filename)
, m_name(name) , m_name(name)
{ {
} }
@ -222,8 +232,8 @@ public:
virtual const char* class_name() const override { return "Pointer"; } virtual const char* class_name() const override { return "Pointer"; }
virtual void dump(size_t indent) const override; virtual void dump(size_t indent) const override;
Pointer(ASTNode* parent, Optional<Position> start, Optional<Position> end) Pointer(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Type(parent, start, end, {}) : Type(parent, start, end, filename, {})
{ {
} }
@ -237,8 +247,8 @@ public:
NonnullRefPtrVector<Statement>& statements() { return m_statements; } NonnullRefPtrVector<Statement>& statements() { return m_statements; }
virtual void dump(size_t indent) const override; virtual void dump(size_t indent) const override;
FunctionDefinition(ASTNode* parent, Optional<Position> start, Optional<Position> end) FunctionDefinition(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: ASTNode(parent, start, end) : ASTNode(parent, start, end, filename)
{ {
} }
@ -251,8 +261,8 @@ class InvalidStatement : public Statement {
public: public:
virtual ~InvalidStatement() override = default; virtual ~InvalidStatement() override = default;
virtual const char* class_name() const override { return "InvalidStatement"; } virtual const char* class_name() const override { return "InvalidStatement"; }
InvalidStatement(ASTNode* parent, Optional<Position> start, Optional<Position> end) InvalidStatement(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Statement(parent, start, end) : Statement(parent, start, end, filename)
{ {
} }
}; };
@ -263,8 +273,8 @@ public:
virtual const char* class_name() const override { return "Expression"; } virtual const char* class_name() const override { return "Expression"; }
protected: protected:
Expression(ASTNode* parent, Optional<Position> start, Optional<Position> end) Expression(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Statement(parent, start, end) : Statement(parent, start, end, filename)
{ {
} }
}; };
@ -273,8 +283,8 @@ class InvalidExpression : public Expression {
public: public:
virtual ~InvalidExpression() override = default; virtual ~InvalidExpression() override = default;
virtual const char* class_name() const override { return "InvalidExpression"; } virtual const char* class_name() const override { return "InvalidExpression"; }
InvalidExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end) InvalidExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Expression(parent, start, end) : Expression(parent, start, end, filename)
{ {
} }
}; };
@ -285,8 +295,8 @@ public:
virtual const char* class_name() const override { return "VariableDeclaration"; } virtual const char* class_name() const override { return "VariableDeclaration"; }
virtual void dump(size_t indent) const override; virtual void dump(size_t indent) const override;
VariableDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end) VariableDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: VariableOrParameterDeclaration(parent, start, end) : VariableOrParameterDeclaration(parent, start, end, filename)
{ {
} }
@ -301,13 +311,13 @@ public:
virtual const char* class_name() const override { return "Identifier"; } virtual const char* class_name() const override { return "Identifier"; }
virtual void dump(size_t indent) const override; virtual void dump(size_t indent) const override;
Identifier(ASTNode* parent, Optional<Position> start, Optional<Position> end, StringView name) Identifier(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename, StringView name)
: Expression(parent, start, end) : Expression(parent, start, end, filename)
, m_name(name) , m_name(name)
{ {
} }
Identifier(ASTNode* parent, Optional<Position> start, Optional<Position> end) Identifier(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Identifier(parent, start, end, {}) : Identifier(parent, start, end, filename, {})
{ {
} }
@ -322,8 +332,8 @@ public:
virtual const char* class_name() const override { return "NumricLiteral"; } virtual const char* class_name() const override { return "NumricLiteral"; }
virtual void dump(size_t indent) const override; virtual void dump(size_t indent) const override;
NumericLiteral(ASTNode* parent, Optional<Position> start, Optional<Position> end, StringView value) NumericLiteral(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename, StringView value)
: Expression(parent, start, end) : Expression(parent, start, end, filename)
, m_value(value) , m_value(value)
{ {
} }
@ -337,8 +347,8 @@ public:
virtual const char* class_name() const override { return "BooleanLiteral"; } virtual const char* class_name() const override { return "BooleanLiteral"; }
virtual void dump(size_t indent) const override; virtual void dump(size_t indent) const override;
BooleanLiteral(ASTNode* parent, Optional<Position> start, Optional<Position> end, bool value) BooleanLiteral(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename, bool value)
: Expression(parent, start, end) : Expression(parent, start, end, filename)
, m_value(value) , m_value(value)
{ {
} }
@ -365,8 +375,8 @@ enum class BinaryOp {
class BinaryExpression : public Expression { class BinaryExpression : public Expression {
public: public:
BinaryExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end) BinaryExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Expression(parent, start, end) : Expression(parent, start, end, filename)
{ {
} }
@ -387,8 +397,8 @@ enum class AssignmentOp {
class AssignmentExpression : public Expression { class AssignmentExpression : public Expression {
public: public:
AssignmentExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end) AssignmentExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Expression(parent, start, end) : Expression(parent, start, end, filename)
{ {
} }
@ -403,14 +413,15 @@ public:
class FunctionCall final : public Expression { class FunctionCall final : public Expression {
public: public:
FunctionCall(ASTNode* parent, Optional<Position> start, Optional<Position> end) FunctionCall(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Expression(parent, start, end) : Expression(parent, start, end, filename)
{ {
} }
~FunctionCall() override = default; ~FunctionCall() override = default;
virtual const char* class_name() const override { return "FunctionCall"; } virtual const char* class_name() const override { return "FunctionCall"; }
virtual void dump(size_t indent) const override; virtual void dump(size_t indent) const override;
virtual bool is_function_call() const override { return true; }
StringView m_name; StringView m_name;
NonnullRefPtrVector<Expression> m_arguments; NonnullRefPtrVector<Expression> m_arguments;
@ -418,8 +429,8 @@ public:
class StringLiteral final : public Expression { class StringLiteral final : public Expression {
public: public:
StringLiteral(ASTNode* parent, Optional<Position> start, Optional<Position> end) StringLiteral(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Expression(parent, start, end) : Expression(parent, start, end, filename)
{ {
} }
@ -435,8 +446,8 @@ public:
virtual ~ReturnStatement() override = default; virtual ~ReturnStatement() override = default;
virtual const char* class_name() const override { return "ReturnStatement"; } virtual const char* class_name() const override { return "ReturnStatement"; }
ReturnStatement(ASTNode* parent, Optional<Position> start, Optional<Position> end) ReturnStatement(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Statement(parent, start, end) : Statement(parent, start, end, filename)
{ {
} }
virtual void dump(size_t indent) const override; virtual void dump(size_t indent) const override;
@ -450,8 +461,8 @@ public:
virtual const char* class_name() const override { return "EnumDeclaration"; } virtual const char* class_name() const override { return "EnumDeclaration"; }
virtual void dump(size_t indent) const override; virtual void dump(size_t indent) const override;
EnumDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end) EnumDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Declaration(parent, start, end) : Declaration(parent, start, end, filename)
{ {
} }
@ -465,8 +476,8 @@ public:
virtual const char* class_name() const override { return "MemberDeclaration"; } virtual const char* class_name() const override { return "MemberDeclaration"; }
virtual void dump(size_t indent) const override; virtual void dump(size_t indent) const override;
MemberDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end) MemberDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Declaration(parent, start, end) : Declaration(parent, start, end, filename)
{ {
} }
@ -487,8 +498,8 @@ public:
Class Class
}; };
StructOrClassDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, StructOrClassDeclaration::Type type) StructOrClassDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename, StructOrClassDeclaration::Type type)
: Declaration(parent, start, end) : Declaration(parent, start, end, filename)
, m_type(type) , m_type(type)
{ {
} }
@ -509,8 +520,8 @@ enum class UnaryOp {
class UnaryExpression : public Expression { class UnaryExpression : public Expression {
public: public:
UnaryExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end) UnaryExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Expression(parent, start, end) : Expression(parent, start, end, filename)
{ {
} }
@ -524,8 +535,8 @@ public:
class MemberExpression : public Expression { class MemberExpression : public Expression {
public: public:
MemberExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end) MemberExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Expression(parent, start, end) : Expression(parent, start, end, filename)
{ {
} }
@ -540,8 +551,8 @@ public:
class ForStatement : public Statement { class ForStatement : public Statement {
public: public:
ForStatement(ASTNode* parent, Optional<Position> start, Optional<Position> end) ForStatement(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Statement(parent, start, end) : Statement(parent, start, end, filename)
{ {
} }
@ -559,8 +570,8 @@ public:
class BlockStatement final : public Statement { class BlockStatement final : public Statement {
public: public:
BlockStatement(ASTNode* parent, Optional<Position> start, Optional<Position> end) BlockStatement(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Statement(parent, start, end) : Statement(parent, start, end, filename)
{ {
} }
@ -575,8 +586,8 @@ public:
class Comment final : public Statement { class Comment final : public Statement {
public: public:
Comment(ASTNode* parent, Optional<Position> start, Optional<Position> end) Comment(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Statement(parent, start, end) : Statement(parent, start, end, filename)
{ {
} }
@ -586,8 +597,8 @@ public:
class IfStatement : public Statement { class IfStatement : public Statement {
public: public:
IfStatement(ASTNode* parent, Optional<Position> start, Optional<Position> end) IfStatement(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
: Statement(parent, start, end) : Statement(parent, start, end, filename)
{ {
} }

View file

@ -38,9 +38,10 @@
namespace Cpp { namespace Cpp {
Parser::Parser(const StringView& program) Parser::Parser(const StringView& program, const String& filename)
: m_program(program) : m_program(program)
, m_lines(m_program.split_view("\n", true)) , m_lines(m_program.split_view("\n", true))
, m_filename(filename)
{ {
Lexer lexer(m_program); Lexer lexer(m_program);
for (auto& token : lexer.lex()) { for (auto& token : lexer.lex()) {

View file

@ -34,7 +34,7 @@ namespace Cpp {
class Parser final { class Parser final {
public: public:
explicit Parser(const StringView&); explicit Parser(const StringView& program, const String& filename);
~Parser() = default; ~Parser() = default;
NonnullRefPtr<TranslationUnit> parse(); NonnullRefPtr<TranslationUnit> parse();
@ -137,7 +137,7 @@ private:
NonnullRefPtr<T> NonnullRefPtr<T>
create_ast_node(ASTNode& parent, const Position& start, Optional<Position> end, Args&&... args) create_ast_node(ASTNode& parent, const Position& start, Optional<Position> end, Args&&... args)
{ {
auto node = adopt(*new T(&parent, start, end, forward<Args>(args)...)); auto node = adopt(*new T(&parent, start, end, m_filename, forward<Args>(args)...));
m_nodes.append(node); m_nodes.append(node);
return node; return node;
} }
@ -145,7 +145,7 @@ private:
NonnullRefPtr<TranslationUnit> NonnullRefPtr<TranslationUnit>
create_root_ast_node(const Position& start, Position end) 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_nodes.append(node);
m_root_node = node; m_root_node = node;
return node; return node;
@ -153,6 +153,7 @@ private:
StringView m_program; StringView m_program;
Vector<StringView> m_lines; Vector<StringView> m_lines;
String m_filename;
Vector<Token> m_tokens; Vector<Token> m_tokens;
State m_state; State m_state;
Vector<State> m_saved_states; Vector<State> m_saved_states;

View file

@ -48,7 +48,7 @@ int main(int argc, char** argv)
} }
auto content = file->read_all(); auto content = file->read_all();
StringView content_view(content); StringView content_view(content);
::Cpp::Parser parser(content_view); ::Cpp::Parser parser(content_view, path);
if (tokens_mode) { if (tokens_mode) {
parser.print_tokens(); parser.print_tokens();
return 0; return 0;