Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/torque/ast-generator.cc')
-rw-r--r--deps/v8/src/torque/ast-generator.cc833
1 files changed, 0 insertions, 833 deletions
diff --git a/deps/v8/src/torque/ast-generator.cc b/deps/v8/src/torque/ast-generator.cc
deleted file mode 100644
index 5eb2f37ef6c..00000000000
--- a/deps/v8/src/torque/ast-generator.cc
+++ /dev/null
@@ -1,833 +0,0 @@
-// Copyright 2018 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string>
-
-#include "src/base/macros.h"
-#include "src/torque/ast-generator.h"
-
-namespace v8 {
-namespace internal {
-namespace torque {
-
-namespace {
-
-std::vector<std::string> GetIdentifierVector(
- std::vector<antlr4::tree::TerminalNode*> source) {
- std::vector<std::string> result;
- for (auto s : source) {
- result.push_back(s->getSymbol()->getText());
- }
- return result;
-}
-
-std::string StringLiteralUnquote(const std::string& s) {
- assert('"' == s.front() || '\'' == s.front());
- assert('"' == s.back() || '\'' == s.back());
- std::stringstream result;
- for (size_t i = 1; i < s.length() - 1; ++i) {
- if (s[i] == '\\') {
- switch (s[++i]) {
- case 'n':
- result << '\n';
- break;
- case 'r':
- result << '\r';
- break;
- case 't':
- result << '\t';
- break;
- case '\'':
- case '"':
- case '\\':
- result << s[i];
- break;
- default:
- UNREACHABLE();
- }
- } else {
- result << s[i];
- }
- }
- return result.str();
-}
-
-} // namespace
-
-LabelAndTypesVector AstGenerator::GetOptionalLabelAndTypeList(
- TorqueParser::OptionalLabelListContext* context) {
- LabelAndTypesVector labels;
- if (context) {
- for (auto* label : context->labelParameter()) {
- LabelAndTypes new_label;
- new_label.name = label->IDENTIFIER()->getSymbol()->getText();
- if (label->typeList() != nullptr) {
- for (auto* type : label->typeList()->type()) {
- new_label.types.emplace_back(GetType(type));
- }
- }
- labels.emplace_back(new_label);
- }
- }
- return labels;
-}
-
-TypeExpression* AstGenerator::GetType(TorqueParser::TypeContext* context) {
- if (context->BUILTIN()) {
- ParameterList parameters = context->typeList()->accept(this);
- TypeExpression* return_type = GetType(context->type(0));
- return RegisterNode(
- new FunctionTypeExpression(Pos(context), parameters, return_type));
- } else if (context->BIT_OR()) {
- return RegisterNode(new UnionTypeExpression(
- Pos(context), GetType(context->type(0)), GetType(context->type(1))));
- } else if (context->IDENTIFIER()) {
- bool is_constexpr = context->CONSTEXPR() != nullptr;
- std::string name = context->IDENTIFIER()->getSymbol()->getText();
- return RegisterNode(
- new BasicTypeExpression(Pos(context), is_constexpr, std::move(name)));
- } else {
- DCHECK_EQ(1, context->type().size());
- return GetType(context->type(0));
- }
-}
-
-TypeExpression* AstGenerator::GetOptionalType(
- TorqueParser::OptionalTypeContext* context) {
- if (!context->type())
- return RegisterNode(new BasicTypeExpression(Pos(context), false, "void"));
- return GetType(context->type());
-}
-
-std::vector<TypeExpression*> AstGenerator::GetTypeVector(
- TorqueParser::TypeListContext* type_list) {
- std::vector<TypeExpression*> result;
- for (auto t : type_list->type()) {
- result.push_back(GetType(t));
- }
- return result;
-}
-
-ParameterList AstGenerator::GetOptionalParameterList(
- TorqueParser::ParameterListContext* context) {
- if (context != nullptr) {
- return context->accept(this).as<ParameterList>();
- } else {
- return ParameterList();
- }
-}
-
-Statement* AstGenerator::GetOptionalHelperBody(
- TorqueParser::HelperBodyContext* context) {
- if (context) return context->accept(this).as<Statement*>();
- return nullptr;
-}
-
-antlrcpp::Any AstGenerator::visitParameterList(
- TorqueParser::ParameterListContext* context) {
- ParameterList result{{}, {}, context->VARARGS(), {}};
- if (context->VARARGS()) {
- result.arguments_variable = context->IDENTIFIER()->getSymbol()->getText();
- }
- for (auto* parameter : context->parameter()) {
- parameter->accept(this);
- result.names.push_back(parameter->IDENTIFIER()->getSymbol()->getText());
- result.types.push_back(GetType(parameter->type()));
- }
- return std::move(result);
-}
-
-antlrcpp::Any AstGenerator::visitTypeList(
- TorqueParser::TypeListContext* context) {
- ParameterList result{{}, {}, false, {}};
- result.types = GetTypeVector(context);
- return std::move(result);
-}
-
-antlrcpp::Any AstGenerator::visitTypeListMaybeVarArgs(
- TorqueParser::TypeListMaybeVarArgsContext* context) {
- ParameterList result{{}, {}, context->VARARGS(), {}};
- result.types.reserve(context->type().size());
- for (auto* type : context->type()) {
- result.types.push_back(GetType(type));
- }
- return std::move(result);
-}
-
-antlrcpp::Any AstGenerator::visitModuleDeclaration(
- TorqueParser::ModuleDeclarationContext* context) {
- ModuleDeclaration* result = RegisterNode(new ExplicitModuleDeclaration{
- Pos(context), context->IDENTIFIER()->getSymbol()->getText(), {}});
- for (auto* declaration : context->declaration()) {
- result->declarations.push_back(
- declaration->accept(this).as<Declaration*>());
- }
- return implicit_cast<Declaration*>(result);
-}
-
-antlrcpp::Any AstGenerator::visitMacroDeclaration(
- TorqueParser::MacroDeclarationContext* context) {
- auto generic_parameters =
- GetIdentifierVector(context->optionalGenericTypeList()->IDENTIFIER());
- MacroDeclaration* macro = RegisterNode(new TorqueMacroDeclaration{
- Pos(context), context->IDENTIFIER()->getSymbol()->getText(),
- GetOptionalParameterList(context->parameterList()),
- GetOptionalType(context->optionalType()),
- GetOptionalLabelAndTypeList(context->optionalLabelList())});
- if (auto* op = context->STRING_LITERAL()) {
- macro->op = StringLiteralUnquote(op->getSymbol()->getText());
- }
- base::Optional<Statement*> body;
- if (context->helperBody())
- body = context->helperBody()->accept(this).as<Statement*>();
- Declaration* result = nullptr;
- if (generic_parameters.size() != 0) {
- result = RegisterNode(
- new GenericDeclaration{Pos(context), macro, generic_parameters, body});
- } else {
- if (!body) ReportError("A non-generic declaration needs a body.");
- result = RegisterNode(new StandardDeclaration{Pos(context), macro, *body});
- }
- return result;
-}
-
-antlrcpp::Any AstGenerator::visitBuiltinDeclaration(
- TorqueParser::BuiltinDeclarationContext* context) {
- auto generic_parameters =
- GetIdentifierVector(context->optionalGenericTypeList()->IDENTIFIER());
- base::Optional<Statement*> body;
- if (context->helperBody())
- body = context->helperBody()->accept(this).as<Statement*>();
-
- TorqueBuiltinDeclaration* builtin = RegisterNode(new TorqueBuiltinDeclaration{
- Pos(context), context->JAVASCRIPT() != nullptr,
- context->IDENTIFIER()->getSymbol()->getText(),
- std::move(context->parameterList()->accept(this).as<ParameterList>()),
- GetOptionalType(context->optionalType())});
-
- Declaration* result = nullptr;
- if (generic_parameters.size() != 0) {
- result = RegisterNode(new GenericDeclaration{Pos(context), builtin,
- generic_parameters, body});
- } else {
- if (!body) ReportError("A non-generic declaration needs a body.");
- result =
- RegisterNode(new StandardDeclaration{Pos(context), builtin, *body});
- }
- return result;
-}
-
-antlrcpp::Any AstGenerator::visitExternalMacro(
- TorqueParser::ExternalMacroContext* context) {
- auto generic_parameters =
- GetIdentifierVector(context->optionalGenericTypeList()->IDENTIFIER());
- MacroDeclaration* macro = RegisterNode(new ExternalMacroDeclaration{
- Pos(context),
- context->IDENTIFIER()->getSymbol()->getText(),
- {},
- std::move(
- context->typeListMaybeVarArgs()->accept(this).as<ParameterList>()),
- GetOptionalType(context->optionalType()),
- GetOptionalLabelAndTypeList(context->optionalLabelList())});
- if (auto* op = context->STRING_LITERAL())
- macro->op = StringLiteralUnquote(op->getSymbol()->getText());
- Declaration* result = nullptr;
- if (generic_parameters.size() != 0) {
- result = RegisterNode(new GenericDeclaration{Pos(context), macro,
- generic_parameters, nullptr});
- } else {
- result =
- RegisterNode(new StandardDeclaration{Pos(context), macro, nullptr});
- }
- return result;
-}
-
-antlrcpp::Any AstGenerator::visitExternalBuiltin(
- TorqueParser::ExternalBuiltinContext* context) {
- auto generic_parameters =
- GetIdentifierVector(context->optionalGenericTypeList()->IDENTIFIER());
- ExternalBuiltinDeclaration* builtin =
- RegisterNode(new ExternalBuiltinDeclaration{
- Pos(context), context->JAVASCRIPT() != nullptr,
- context->IDENTIFIER()->getSymbol()->getText(),
- std::move(context->typeList()->accept(this).as<ParameterList>()),
- GetOptionalType(context->optionalType())});
-
- Declaration* result = nullptr;
- if (generic_parameters.size() != 0) {
- result = RegisterNode(new GenericDeclaration{Pos(context), builtin,
- generic_parameters, nullptr});
- } else {
- result =
- RegisterNode(new StandardDeclaration{Pos(context), builtin, nullptr});
- }
- return result;
-}
-
-antlrcpp::Any AstGenerator::visitExternalRuntime(
- TorqueParser::ExternalRuntimeContext* context) {
- ExternalRuntimeDeclaration* runtime =
- RegisterNode(new ExternalRuntimeDeclaration{
- Pos(context), context->IDENTIFIER()->getSymbol()->getText(),
- std::move(context->typeListMaybeVarArgs()
- ->accept(this)
- .as<ParameterList>()),
- GetOptionalType(context->optionalType())});
- return implicit_cast<Declaration*>(
- RegisterNode(new StandardDeclaration{Pos(context), runtime, nullptr}));
-}
-
-antlrcpp::Any AstGenerator::visitConstDeclaration(
- TorqueParser::ConstDeclarationContext* context) {
- auto name = context->IDENTIFIER()->getSymbol()->getText();
- auto type = GetType(context->type());
- Expression* expression =
- context->expression()->accept(this).as<Expression*>();
- return implicit_cast<Declaration*>(
- RegisterNode(new ConstDeclaration{Pos(context), name, type, expression}));
-}
-
-antlrcpp::Any AstGenerator::visitGenericSpecialization(
- TorqueParser::GenericSpecializationContext* context) {
- auto name = context->IDENTIFIER()->getSymbol()->getText();
- auto specialization_parameters =
- GetTypeVector(context->genericSpecializationTypeList()->typeList());
- return implicit_cast<Declaration*>(RegisterNode(new SpecializationDeclaration{
- Pos(context), name, false, specialization_parameters,
- GetOptionalParameterList(context->parameterList()),
- GetOptionalType(context->optionalType()),
- GetOptionalLabelAndTypeList(context->optionalLabelList()),
- context->helperBody()->accept(this).as<Statement*>()}));
-}
-
-antlrcpp::Any AstGenerator::visitExternConstDeclaration(
- TorqueParser::ExternConstDeclarationContext* context) {
- return implicit_cast<Declaration*>(RegisterNode(new ExternConstDeclaration{
- Pos(context), context->IDENTIFIER()->getSymbol()->getText(),
- GetType(context->type()),
- StringLiteralUnquote(context->generatesDeclaration()
- ->STRING_LITERAL()
- ->getSymbol()
- ->getText())}));
-}
-
-antlrcpp::Any AstGenerator::visitTypeDeclaration(
- TorqueParser::TypeDeclarationContext* context) {
- TypeDeclaration* result = RegisterNode(new TypeDeclaration{
- Pos(context), context->IDENTIFIER()->getSymbol()->getText(), {}, {}});
- if (context->extendsDeclaration())
- result->extends =
- context->extendsDeclaration()->IDENTIFIER()->getSymbol()->getText();
- if (context->generatesDeclaration()) {
- result->generates = StringLiteralUnquote(context->generatesDeclaration()
- ->STRING_LITERAL()
- ->getSymbol()
- ->getText());
- }
- if (context->constexprDeclaration()) {
- result->constexpr_generates =
- StringLiteralUnquote(context->constexprDeclaration()
- ->STRING_LITERAL()
- ->getSymbol()
- ->getText());
- }
- return implicit_cast<Declaration*>(result);
-}
-
-antlrcpp::Any AstGenerator::visitTypeAliasDeclaration(
- TorqueParser::TypeAliasDeclarationContext* context) {
- TypeAliasDeclaration* result = RegisterNode(new TypeAliasDeclaration{
- Pos(context), context->IDENTIFIER()->getSymbol()->getText(),
- GetType(context->type())});
- return implicit_cast<Declaration*>(result);
-}
-
-antlrcpp::Any AstGenerator::visitVariableDeclaration(
- TorqueParser::VariableDeclarationContext* context) {
- bool is_const_qualified = context->CONST() != nullptr;
- return RegisterNode(
- new VarDeclarationStatement{Pos(context),
- is_const_qualified,
- context->IDENTIFIER()->getSymbol()->getText(),
- GetType(context->type()),
- {}});
-}
-
-antlrcpp::Any AstGenerator::visitVariableDeclarationWithInitialization(
- TorqueParser::VariableDeclarationWithInitializationContext* context) {
- VarDeclarationStatement* result =
- VarDeclarationStatement::cast(context->variableDeclaration()
- ->accept(this)
- .as<VarDeclarationStatement*>());
- result->pos = Pos(context);
- if (context->expression())
- result->initializer = context->expression()->accept(this).as<Expression*>();
- return implicit_cast<Statement*>(result);
-}
-
-antlrcpp::Any AstGenerator::visitHelperCall(
- TorqueParser::HelperCallContext* context) {
- antlr4::tree::TerminalNode* callee;
- bool is_operator = context->MIN() || context->MAX();
- if (context->MIN()) callee = context->MIN();
- if (context->MAX()) callee = context->MAX();
- if (context->IDENTIFIER()) callee = context->IDENTIFIER();
- std::vector<std::string> labels;
- for (auto label : context->optionalOtherwise()->IDENTIFIER()) {
- labels.push_back(label->getSymbol()->getText());
- }
- std::vector<TypeExpression*> templateArguments;
- if (context->genericSpecializationTypeList()) {
- templateArguments =
- GetTypeVector(context->genericSpecializationTypeList()->typeList());
- }
- CallExpression* result =
- RegisterNode(new CallExpression{Pos(context),
- callee->getSymbol()->getText(),
- is_operator,
- templateArguments,
- {},
- labels});
- for (auto* arg : context->argumentList()->argument()) {
- result->arguments.push_back(arg->accept(this).as<Expression*>());
- }
- return implicit_cast<Expression*>(result);
-}
-
-antlrcpp::Any AstGenerator::visitHelperCallStatement(
- TorqueParser::HelperCallStatementContext* context) {
- Statement* result;
- if (context->TAIL()) {
- result = RegisterNode(new TailCallStatement{
- Pos(context),
- CallExpression::cast(
- context->helperCall()->accept(this).as<Expression*>())});
- } else {
- result = RegisterNode(new ExpressionStatement{
- Pos(context), context->helperCall()->accept(this).as<Expression*>()});
- }
- return result;
-}
-
-antlrcpp::Any AstGenerator::visitStatementScope(
- TorqueParser::StatementScopeContext* context) {
- BlockStatement* result = RegisterNode(
- new BlockStatement{Pos(context), context->DEFERRED() != nullptr, {}});
- for (auto* child : context->statementList()->statement()) {
- result->statements.push_back(child->accept(this).as<Statement*>());
- }
- return implicit_cast<Statement*>(result);
-}
-
-antlrcpp::Any AstGenerator::visitExpressionStatement(
- TorqueParser::ExpressionStatementContext* context) {
- return implicit_cast<Statement*>(RegisterNode(new ExpressionStatement{
- Pos(context), context->assignment()->accept(this).as<Expression*>()}));
-}
-
-antlrcpp::Any AstGenerator::visitReturnStatement(
- TorqueParser::ReturnStatementContext* context) {
- if (context->expression() != nullptr) {
- return implicit_cast<Statement*>(RegisterNode(new ReturnStatement{
- Pos(context), context->expression()->accept(this).as<Expression*>()}));
- } else {
- return implicit_cast<Statement*>(
- RegisterNode(new ReturnStatement{Pos(context), {}}));
- }
-}
-
-antlrcpp::Any AstGenerator::visitBreakStatement(
- TorqueParser::BreakStatementContext* context) {
- return implicit_cast<Statement*>(
- RegisterNode(new BreakStatement{Pos(context)}));
-}
-
-antlrcpp::Any AstGenerator::visitContinueStatement(
- TorqueParser::ContinueStatementContext* context) {
- return implicit_cast<Statement*>(
- RegisterNode(new ContinueStatement{Pos(context)}));
-}
-
-antlrcpp::Any AstGenerator::visitGotoStatement(
- TorqueParser::GotoStatementContext* context) {
- GotoStatement* result = RegisterNode(new GotoStatement{Pos(context), {}, {}});
- if (context->labelReference())
- result->label =
- context->labelReference()->IDENTIFIER()->getSymbol()->getText();
- if (context->argumentList() != nullptr) {
- for (auto a : context->argumentList()->argument()) {
- result->arguments.push_back(a->accept(this).as<Expression*>());
- }
- }
- return implicit_cast<Statement*>(result);
-}
-
-antlrcpp::Any AstGenerator::visitIfStatement(
- TorqueParser::IfStatementContext* context) {
- IfStatement* result = RegisterNode(new IfStatement{
- Pos(context),
- std::move(context->expression()->accept(this).as<Expression*>()),
- context->CONSTEXPR() != nullptr,
- std::move(context->statementBlock(0)->accept(this).as<Statement*>()),
- {}});
- if (context->statementBlock(1))
- result->if_false =
- std::move(context->statementBlock(1)->accept(this).as<Statement*>());
- return implicit_cast<Statement*>(result);
-}
-
-antlrcpp::Any AstGenerator::visitWhileLoop(
- TorqueParser::WhileLoopContext* context) {
- return implicit_cast<Statement*>(RegisterNode(new WhileStatement{
- Pos(context), context->expression()->accept(this).as<Expression*>(),
- context->statementBlock()->accept(this).as<Statement*>()}));
-}
-
-antlrcpp::Any AstGenerator::visitForLoop(
- TorqueParser::ForLoopContext* context) {
- ForLoopStatement* result = RegisterNode(new ForLoopStatement{
- Pos(context),
- {},
- context->expression()->accept(this).as<Expression*>(),
- context->assignment()->accept(this).as<Expression*>(),
- context->statementBlock()->accept(this).as<Statement*>()});
- if (auto* init = context->forInitialization()
- ->variableDeclarationWithInitialization()) {
- result->var_declaration =
- VarDeclarationStatement::cast(init->accept(this).as<Statement*>());
- }
- return implicit_cast<Statement*>(result);
-}
-
-antlrcpp::Any AstGenerator::visitForOfLoop(
- TorqueParser::ForOfLoopContext* context) {
- ForOfLoopStatement* result = RegisterNode(new ForOfLoopStatement{
- Pos(context),
- context->variableDeclaration()
- ->accept(this)
- .as<VarDeclarationStatement*>(),
- context->expression()->accept(this).as<Expression*>(),
- {},
- {},
- context->statementBlock()->accept(this).as<Statement*>()});
- if (auto* range = context->forOfRange()->rangeSpecifier()) {
- if (auto* begin = range->begin) {
- result->begin = begin->accept(this).as<Expression*>();
- }
- if (auto* end = range->end) {
- result->end = end->accept(this).as<Expression*>();
- }
- }
- return implicit_cast<Statement*>(result);
-}
-
-antlrcpp::Any AstGenerator::visitTryLabelStatement(
- TorqueParser::TryLabelStatementContext* context) {
- TryLabelStatement* result = RegisterNode(new TryLabelStatement{
- Pos(context), context->statementBlock()->accept(this).as<Statement*>()});
- for (auto* handler : context->handlerWithStatement()) {
- handler->labelDeclaration()->accept(this);
- auto parameter_list = handler->labelDeclaration()->parameterList();
- ParameterList label_parameters = parameter_list == nullptr
- ? ParameterList()
- : handler->labelDeclaration()
- ->parameterList()
- ->accept(this)
- .as<ParameterList>();
- LabelBlock* label_block = RegisterNode(new LabelBlock{
- Pos(handler->statementBlock()),
- handler->labelDeclaration()->IDENTIFIER()->getSymbol()->getText(),
- label_parameters,
- handler->statementBlock()->accept(this).as<Statement*>()});
- result->label_blocks.push_back(label_block);
- }
- return implicit_cast<Statement*>(result);
-}
-
-antlrcpp::Any AstGenerator::visitFunctionPointerExpression(
- TorqueParser::FunctionPointerExpressionContext* context) {
- if (context->IDENTIFIER()) {
- std::vector<TypeExpression*> templateArguments;
- if (context->genericSpecializationTypeList()) {
- templateArguments =
- GetTypeVector(context->genericSpecializationTypeList()->typeList());
- }
- return implicit_cast<Expression*>(RegisterNode(new IdentifierExpression{
- Pos(context), context->IDENTIFIER()->getSymbol()->getText(),
- std::move(templateArguments)}));
- }
- return context->primaryExpression()->accept(this);
-}
-
-antlrcpp::Any AstGenerator::visitPrimaryExpression(
- TorqueParser::PrimaryExpressionContext* context) {
- if (auto* e = context->helperCall()) return e->accept(this);
- if (auto* e = context->DECIMAL_LITERAL())
- return implicit_cast<Expression*>(RegisterNode(
- new NumberLiteralExpression{Pos(context), e->getSymbol()->getText()}));
- if (auto* e = context->STRING_LITERAL())
- return implicit_cast<Expression*>(RegisterNode(
- new StringLiteralExpression{Pos(context), e->getSymbol()->getText()}));
- if (context->structExpression()) {
- return context->structExpression()->accept(this);
- }
- return context->expression()->accept(this);
-}
-
-antlrcpp::Any AstGenerator::visitStructExpression(
- TorqueParser::StructExpressionContext* context) {
- std::vector<Expression*> expressions;
- for (auto& e : context->expression()) {
- expressions.push_back(e->accept(this).as<Expression*>());
- }
- return implicit_cast<Expression*>(RegisterNode(new StructExpression{
- Pos(context), context->IDENTIFIER()->getSymbol()->getText(),
- expressions}));
-}
-
-antlrcpp::Any AstGenerator::visitAssignment(
- TorqueParser::AssignmentContext* context) {
- if (auto* e = context->incrementDecrement()) return e->accept(this);
- LocationExpression* location = LocationExpression::cast(
- context->locationExpression()->accept(this).as<Expression*>());
- if (auto* e = context->expression()) {
- AssignmentExpression* result = RegisterNode(new AssignmentExpression{
- Pos(context), location, {}, e->accept(this).as<Expression*>()});
- if (auto* op_node = context->ASSIGNMENT_OPERATOR()) {
- std::string op = op_node->getSymbol()->getText();
- result->op = op.substr(0, op.length() - 1);
- }
- return implicit_cast<Expression*>(result);
- }
- return implicit_cast<Expression*>(location);
-}
-
-antlrcpp::Any AstGenerator::visitIncrementDecrement(
- TorqueParser::IncrementDecrementContext* context) {
- bool postfix = context->op;
- return implicit_cast<Expression*>(
- RegisterNode(new IncrementDecrementExpression{
- Pos(context),
- LocationExpression::cast(
- context->locationExpression()->accept(this).as<Expression*>()),
- context->INCREMENT() ? IncrementDecrementOperator::kIncrement
- : IncrementDecrementOperator::kDecrement,
- postfix}));
-}
-
-antlrcpp::Any AstGenerator::visitLocationExpression(
- TorqueParser::LocationExpressionContext* context) {
- Expression* location = nullptr;
- if (auto* p = context->primaryExpression()) {
- location = p->accept(this).as<Expression*>();
- } else if (auto* l = context->locationExpression()) {
- location = l->accept(this).as<Expression*>();
- } else {
- return implicit_cast<Expression*>(RegisterNode(new IdentifierExpression{
- Pos(context), context->IDENTIFIER()->getSymbol()->getText(), {}}));
- }
-
- if (auto* e = context->expression()) {
- return implicit_cast<Expression*>(RegisterNode(new ElementAccessExpression{
- Pos(context), location, e->accept(this).as<Expression*>()}));
- }
-
- return implicit_cast<Expression*>(RegisterNode(new FieldAccessExpression{
- Pos(context), location, context->IDENTIFIER()->getSymbol()->getText()}));
-}
-
-antlrcpp::Any AstGenerator::visitUnaryExpression(
- TorqueParser::UnaryExpressionContext* context) {
- if (auto* e = context->assignmentExpression()) return e->accept(this);
- std::vector<Expression*> args;
- args.push_back(context->unaryExpression()->accept(this).as<Expression*>());
- return implicit_cast<Expression*>(RegisterNode(new CallExpression{
- Pos(context), context->op->getText(), true, {}, std::move(args), {}}));
-}
-
-antlrcpp::Any AstGenerator::visitMultiplicativeExpression(
- TorqueParser::MultiplicativeExpressionContext* context) {
- auto* right = context->unaryExpression();
- if (auto* left = context->multiplicativeExpression()) {
- return implicit_cast<Expression*>(
- RegisterNode(new CallExpression{Pos(context),
- context->op->getText(),
- true,
- {},
- {left->accept(this).as<Expression*>(),
- right->accept(this).as<Expression*>()},
- {}}));
- }
- return right->accept(this);
-}
-
-antlrcpp::Any AstGenerator::visitAdditiveExpression(
- TorqueParser::AdditiveExpressionContext* context) {
- auto* right = context->multiplicativeExpression();
- if (auto* left = context->additiveExpression()) {
- return implicit_cast<Expression*>(
- RegisterNode(new CallExpression{Pos(context),
- context->op->getText(),
- true,
- {},
- {left->accept(this).as<Expression*>(),
- right->accept(this).as<Expression*>()},
- {}}));
- }
- return right->accept(this);
-}
-
-antlrcpp::Any AstGenerator::visitShiftExpression(
- TorqueParser::ShiftExpressionContext* context) {
- auto* right = context->additiveExpression();
- if (auto* left = context->shiftExpression()) {
- return implicit_cast<Expression*>(
- RegisterNode(new CallExpression{Pos(context),
- context->op->getText(),
- true,
- {},
- {left->accept(this).as<Expression*>(),
- right->accept(this).as<Expression*>()},
- {}}));
- }
- return right->accept(this);
-}
-
-antlrcpp::Any AstGenerator::visitRelationalExpression(
- TorqueParser::RelationalExpressionContext* context) {
- auto* right = context->shiftExpression();
- if (auto* left = context->relationalExpression()) {
- return implicit_cast<Expression*>(
- RegisterNode(new CallExpression{Pos(context),
- context->op->getText(),
- true,
- {},
- {left->accept(this).as<Expression*>(),
- right->accept(this).as<Expression*>()},
- {}}));
- }
- return right->accept(this);
-}
-
-antlrcpp::Any AstGenerator::visitEqualityExpression(
- TorqueParser::EqualityExpressionContext* context) {
- auto* right = context->relationalExpression();
- if (auto* left = context->equalityExpression()) {
- return implicit_cast<Expression*>(
- RegisterNode(new CallExpression{Pos(context),
- context->op->getText(),
- true,
- {},
- {left->accept(this).as<Expression*>(),
- right->accept(this).as<Expression*>()},
- {}}));
- }
- return right->accept(this);
-}
-
-antlrcpp::Any AstGenerator::visitBitwiseExpression(
- TorqueParser::BitwiseExpressionContext* context) {
- auto* right = context->equalityExpression();
- if (auto* left = context->bitwiseExpression()) {
- return implicit_cast<Expression*>(
- RegisterNode(new CallExpression{Pos(context),
- context->op->getText(),
- true,
- {},
- {left->accept(this).as<Expression*>(),
- right->accept(this).as<Expression*>()},
- {}}));
- }
- return right->accept(this);
-}
-
-antlrcpp::Any AstGenerator::visitLogicalANDExpression(
- TorqueParser::LogicalANDExpressionContext* context) {
- auto* right = context->bitwiseExpression();
- if (auto* left = context->logicalANDExpression()) {
- return implicit_cast<Expression*>(RegisterNode(new LogicalAndExpression{
- Pos(context), left->accept(this).as<Expression*>(),
- right->accept(this).as<Expression*>()}));
- }
- return right->accept(this);
-}
-
-antlrcpp::Any AstGenerator::visitLogicalORExpression(
- TorqueParser::LogicalORExpressionContext* context) {
- auto* right = context->logicalANDExpression();
- if (auto* left = context->logicalORExpression()) {
- return implicit_cast<Expression*>(RegisterNode(new LogicalOrExpression{
- Pos(context), left->accept(this).as<Expression*>(),
- right->accept(this).as<Expression*>()}));
- }
- return right->accept(this);
-}
-
-antlrcpp::Any AstGenerator::visitConditionalExpression(
- TorqueParser::ConditionalExpressionContext* context) {
- if (auto* condition = context->conditionalExpression()) {
- return implicit_cast<Expression*>(RegisterNode(new ConditionalExpression{
- Pos(context), condition->accept(this).as<Expression*>(),
- context->logicalORExpression(0)->accept(this).as<Expression*>(),
- context->logicalORExpression(1)->accept(this).as<Expression*>()}));
- }
- return context->logicalORExpression(0)->accept(this);
-}
-
-antlrcpp::Any AstGenerator::visitDiagnosticStatement(
- TorqueParser::DiagnosticStatementContext* context) {
- if (context->ASSERT_TOKEN() || context->CHECK_TOKEN()) {
- size_t a = context->expression()->start->getStartIndex();
- size_t b = context->expression()->stop->getStopIndex();
- antlr4::misc::Interval interval(a, b);
- std::string source = source_file_context_->stream->getText(interval);
- return implicit_cast<Statement*>(RegisterNode(new AssertStatement{
- Pos(context), context->ASSERT_TOKEN() != nullptr,
- context->expression()->accept(this).as<Expression*>(), source}));
- } else if (context->UNREACHABLE_TOKEN()) {
- return implicit_cast<Statement*>(
- RegisterNode(new DebugStatement{Pos(context), "unreachable", true}));
- } else {
- DCHECK(context->DEBUG_TOKEN());
- return implicit_cast<Statement*>(
- RegisterNode(new DebugStatement{Pos(context), "debug", false}));
- }
-}
-
-antlrcpp::Any AstGenerator::visitStructDeclaration(
- TorqueParser::StructDeclarationContext* context) {
- StructDeclaration* struct_declaration = RegisterNode(new StructDeclaration{
- Pos(context), context->IDENTIFIER()->getSymbol()->getText()});
-
- for (auto* fieldDeclaration :
- context->fieldListDeclaration()->fieldDeclaration()) {
- FieldNameAndType field = {
- fieldDeclaration->IDENTIFIER()->getSymbol()->getText(),
- GetType(fieldDeclaration->type())};
- struct_declaration->fields.push_back(field);
- }
-
- return implicit_cast<Declaration*>(struct_declaration);
-}
-
-void AstGenerator::visitSourceFile(SourceFileContext* context) {
- source_file_context_ = context;
- current_source_file_ = SourceFileMap::Get().AddSource(context->name);
- for (auto* declaration : context->file->children) {
- ast_.declarations().push_back(declaration->accept(this).as<Declaration*>());
- }
- source_file_context_ = nullptr;
-}
-
-SourcePosition AstGenerator::Pos(antlr4::ParserRuleContext* context) {
- antlr4::misc::Interval i = context->getSourceInterval();
- auto token = source_file_context_->tokens->get(i.a);
- int line = static_cast<int>(token->getLine());
- int column = static_cast<int>(token->getCharPositionInLine());
- return SourcePosition{current_source_file_, line, column};
-}
-
-} // namespace torque
-} // namespace internal
-} // namespace v8