Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 24 additions & 16 deletions maldoca/js/ast/transforms/extract_prelude/pass_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -65,23 +65,25 @@ function bar() {

QuickJsBabel babel;

JsSourceRepr source_repr{kSource, std::nullopt};

BabelParseRequest parse_request;
parse_request.set_compute_scopes(true);

MALDOCA_ASSERT_OK_AND_ASSIGN(
JsAstRepr repr, ToJsAstRepr::FromJsSourceRepr(kSource, parse_request,
JsAstRepr repr, ToJsAstRepr::FromJsSourceRepr(source_repr, parse_request,
absl::InfiniteDuration(),
std::nullopt, babel));

JsirAnalysisConfig::DynamicConstantPropagation prelude =
ExtractPreludeByIndices(kSource, indices, *repr.ast);

MALDOCA_ASSERT_OK_AND_ASSIGN(
JsSourceRepr source_repr,
ToJsSourceRepr::FromJsAstRepr(*repr.ast, {}, absl::InfiniteDuration(),
JsSourceRepr printed_source_repr,
ToJsSourceRepr::FromJsAstRepr(repr, {}, absl::InfiniteDuration(),
babel));

EXPECT_EQ(source_repr.source, kExpectedSourceWithoutPrelude);
EXPECT_EQ(printed_source_repr.source, kExpectedSourceWithoutPrelude);

EXPECT_EQ(prelude.prelude_source(), kExpectedPrelude);
EXPECT_EQ(prelude.extracted_from_scope_uid(), 0);
Expand All @@ -103,23 +105,25 @@ function bar() {

QuickJsBabel babel;

JsSourceRepr source_repr{kSource, std::nullopt};

BabelParseRequest parse_request;
parse_request.set_compute_scopes(true);

MALDOCA_ASSERT_OK_AND_ASSIGN(
JsAstRepr repr, ToJsAstRepr::FromJsSourceRepr(kSource, parse_request,
JsAstRepr repr, ToJsAstRepr::FromJsSourceRepr(source_repr, parse_request,
absl::InfiniteDuration(),
std::nullopt, babel));

JsirAnalysisConfig::DynamicConstantPropagation prelude =
ExtractPreludeByAnnotations(kSource, *repr.ast);

MALDOCA_ASSERT_OK_AND_ASSIGN(
JsSourceRepr source_repr,
ToJsSourceRepr::FromJsAstRepr(*repr.ast, {}, absl::InfiniteDuration(),
JsSourceRepr printed_source_repr,
ToJsSourceRepr::FromJsAstRepr(repr, {}, absl::InfiniteDuration(),
babel));

EXPECT_EQ(source_repr.source, kExpectedSourceWithoutPrelude);
EXPECT_EQ(printed_source_repr.source, kExpectedSourceWithoutPrelude);

EXPECT_EQ(prelude.prelude_source(), kExpectedPrelude);
EXPECT_EQ(prelude.extracted_from_scope_uid(), 0);
Expand All @@ -141,23 +145,25 @@ function bar() {

QuickJsBabel babel;

JsSourceRepr source_repr{kSource, std::nullopt};

BabelParseRequest parse_request;
parse_request.set_compute_scopes(true);

MALDOCA_ASSERT_OK_AND_ASSIGN(
JsAstRepr repr, ToJsAstRepr::FromJsSourceRepr(kSource, parse_request,
JsAstRepr repr, ToJsAstRepr::FromJsSourceRepr(source_repr, parse_request,
absl::InfiniteDuration(),
std::nullopt, babel));

JsirAnalysisConfig::DynamicConstantPropagation prelude =
ExtractPreludeByIndicesAndAnnotations(kSource, indices, *repr.ast);

MALDOCA_ASSERT_OK_AND_ASSIGN(
JsSourceRepr source_repr,
ToJsSourceRepr::FromJsAstRepr(*repr.ast, {}, absl::InfiniteDuration(),
JsSourceRepr printed_source_repr,
ToJsSourceRepr::FromJsAstRepr(repr, {}, absl::InfiniteDuration(),
babel));

EXPECT_EQ(source_repr.source, kExpectedSourceWithoutPrelude);
EXPECT_EQ(printed_source_repr.source, kExpectedSourceWithoutPrelude);

EXPECT_EQ(prelude.prelude_source(), kExpectedPrelude);
EXPECT_EQ(prelude.extracted_from_scope_uid(), 0);
Expand All @@ -171,20 +177,22 @@ TEST(ExtractPreludePassTest, ReuseBabel) {

QuickJsBabel babel;

JsSourceRepr source_repr{kSource, std::nullopt};

BabelParseRequest parse_request;
parse_request.set_compute_scopes(true);

// Parse the source code once so that Babel increments the scope uid counter.
{
MALDOCA_ASSERT_OK_AND_ASSIGN(
JsAstRepr repr, ToJsAstRepr::FromJsSourceRepr(kSource, parse_request,
absl::InfiniteDuration(),
std::nullopt, babel));
JsAstRepr repr, ToJsAstRepr::FromJsSourceRepr(
source_repr, parse_request,
absl::InfiniteDuration(), std::nullopt, babel));
}

// This time the global scope uid is not 0.
MALDOCA_ASSERT_OK_AND_ASSIGN(
JsAstRepr repr, ToJsAstRepr::FromJsSourceRepr(kSource, parse_request,
JsAstRepr repr, ToJsAstRepr::FromJsSourceRepr(source_repr, parse_request,
absl::InfiniteDuration(),
std::nullopt, babel));

Expand Down
88 changes: 47 additions & 41 deletions maldoca/js/driver/conversion.cc
Original file line number Diff line number Diff line change
Expand Up @@ -42,78 +42,83 @@ namespace maldoca {
// -----------------------------------------------------------------------------

absl::StatusOr<JsAstStringRepr> ToJsAstStringRepr::FromJsSourceRepr(
absl::string_view source, BabelParseRequest parse_request,
const JsSourceRepr &source_repr, BabelParseRequest parse_request,
absl::Duration timeout, Babel &babel) {
MALDOCA_ASSIGN_OR_RETURN(BabelParseResult parse_result,
babel.Parse(source, parse_request, timeout));
return JsAstStringRepr{std::move(parse_result.ast_string)};
MALDOCA_ASSIGN_OR_RETURN(
BabelParseResult parse_result,
babel.Parse(source_repr.source, parse_request, timeout));
return JsAstStringRepr{std::move(parse_result.ast_string),
source_repr.source_map};
}

// -----------------------------------------------------------------------------
// AST string -> AST
// -----------------------------------------------------------------------------

absl::StatusOr<JsAstRepr> ToJsAstRepr::FromJsAstStringRepr(
const BabelAstString &ast_string,
const JsAstStringRepr &ast_string_repr,
std::optional<int> recursion_depth_limit) {
MALDOCA_ASSIGN_OR_RETURN(
std::unique_ptr<JsFile> ast,
GetFileAstFromAstString(ast_string, recursion_depth_limit));
return JsAstRepr{std::move(ast), ast_string.scopes()};
MALDOCA_ASSIGN_OR_RETURN(std::unique_ptr<JsFile> ast,
GetFileAstFromAstString(ast_string_repr.ast_string,
recursion_depth_limit));
return JsAstRepr{std::move(ast), ast_string_repr.ast_string.scopes(),
ast_string_repr.source_map};
}

// -----------------------------------------------------------------------------
// AST -> HIR
// -----------------------------------------------------------------------------

absl::StatusOr<JsHirRepr> ToJsHirRepr::FromJsAstRepr(
const JsFile &ast, const BabelScopes &scopes,
const JsAstRepr &ast_repr,
mlir::MLIRContext &mlir_context) {
MALDOCA_ASSIGN_OR_RETURN(mlir::OwningOpRef<JsirFileOp> op,
AstToJshirFile(ast, mlir_context));
return JsHirRepr{std::move(op), scopes};
AstToJshirFile(*ast_repr.ast, mlir_context));
return JsHirRepr{std::move(op), ast_repr.scopes, ast_repr.source_map};
}

// -----------------------------------------------------------------------------
// Source -> AST string -> AST
// -----------------------------------------------------------------------------

absl::StatusOr<JsAstRepr> ToJsAstRepr::FromJsSourceRepr(
absl::string_view source, BabelParseRequest parse_request,
const JsSourceRepr &source_repr, BabelParseRequest parse_request,
absl::Duration timeout, std::optional<int> recursion_depth_limit,
Babel &babel) {
MALDOCA_ASSIGN_OR_RETURN(JsAstStringRepr ast_string,
ToJsAstStringRepr::FromJsSourceRepr(
source, parse_request, timeout, babel));
return ToJsAstRepr::FromJsAstStringRepr(ast_string.ast_string,
recursion_depth_limit);
MALDOCA_ASSIGN_OR_RETURN(
JsAstStringRepr ast_string,
ToJsAstStringRepr::FromJsSourceRepr(source_repr,
parse_request, timeout, babel));
return ToJsAstRepr::FromJsAstStringRepr(ast_string, recursion_depth_limit);
}

// -----------------------------------------------------------------------------
// Source -> AST string -> AST -> HIR
// -----------------------------------------------------------------------------

absl::StatusOr<JsHirRepr> ToJsHirRepr::FromJsSourceRepr(
absl::string_view source, BabelParseRequest parse_request,
const JsSourceRepr &source_repr, BabelParseRequest parse_request,
absl::Duration timeout, std::optional<int> recursion_depth_limit,
Babel &babel, mlir::MLIRContext &mlir_context) {
MALDOCA_ASSIGN_OR_RETURN(JsAstRepr ast, ToJsAstRepr::FromJsSourceRepr(
source, parse_request, timeout,
recursion_depth_limit, babel));
return ToJsHirRepr::FromJsAstRepr(*ast.ast, ast.scopes, mlir_context);
MALDOCA_ASSIGN_OR_RETURN(
JsAstRepr ast,
ToJsAstRepr::FromJsSourceRepr(source_repr, parse_request, timeout,
recursion_depth_limit, babel));
return ToJsHirRepr::FromJsAstRepr(ast, mlir_context);
}

// -----------------------------------------------------------------------------
// AST string -> AST -> HIR
// -----------------------------------------------------------------------------

absl::StatusOr<JsHirRepr> ToJsHirRepr::FromJsAstStringRepr(
const BabelAstString &ast_string, std::optional<int> recursion_depth_limit,
const JsAstStringRepr &ast_string_repr,
std::optional<int> recursion_depth_limit,
mlir::MLIRContext &mlir_context) {
MALDOCA_ASSIGN_OR_RETURN(
JsAstRepr ast,
ToJsAstRepr::FromJsAstStringRepr(ast_string, recursion_depth_limit));
return ToJsHirRepr::FromJsAstRepr(*ast.ast, ast.scopes, mlir_context);
ToJsAstRepr::FromJsAstStringRepr(ast_string_repr, recursion_depth_limit));
return ToJsHirRepr::FromJsAstRepr(ast, mlir_context);
}

// =============================================================================
Expand All @@ -128,31 +133,33 @@ absl::StatusOr<JsAstRepr> ToJsAstRepr::FromJsHirRepr(
const JsHirRepr &hir_repr) {
MALDOCA_ASSIGN_OR_RETURN(std::unique_ptr<JsFile> ast,
JshirFileToAst(hir_repr.op.get()));
return JsAstRepr{std::move(ast), hir_repr.scopes};
return JsAstRepr{std::move(ast), hir_repr.scopes, hir_repr.source_map};
}

// -----------------------------------------------------------------------------
// AST -> AST string
// -----------------------------------------------------------------------------

absl::StatusOr<JsAstStringRepr> ToJsAstStringRepr::FromJsAstRepr(
const JsFile &ast, const BabelScopes &scopes) {
BabelAstString ast_string = GetAstStringFromFileAst(ast);
*ast_string.mutable_scopes() = scopes;
return JsAstStringRepr{std::move(ast_string)};
const JsAstRepr &ast_repr) {
BabelAstString ast_string = GetAstStringFromFileAst(*ast_repr.ast);
*ast_string.mutable_scopes() = ast_repr.scopes;
return JsAstStringRepr{std::move(ast_string), ast_repr.source_map};
}

// -----------------------------------------------------------------------------
// AST string -> Source
// -----------------------------------------------------------------------------

absl::StatusOr<JsSourceRepr> ToJsSourceRepr::FromJsAstStringRepr(
const BabelAstString &ast_string, BabelGenerateOptions generate_options,
absl::Duration timeout, Babel &babel) {
const JsAstStringRepr &ast_string_repr,
BabelGenerateOptions generate_options, absl::Duration timeout,
Babel &babel) {
MALDOCA_ASSIGN_OR_RETURN(
BabelGenerateResult generate_result,
babel.Generate(ast_string, generate_options, timeout));
return JsSourceRepr{std::move(generate_result.source_code)};
babel.Generate(ast_string_repr.ast_string, generate_options, timeout));
return JsSourceRepr{std::move(generate_result.source_code),
generate_result.source_map};
}

// -----------------------------------------------------------------------------
Expand All @@ -162,7 +169,7 @@ absl::StatusOr<JsSourceRepr> ToJsSourceRepr::FromJsAstStringRepr(
absl::StatusOr<JsAstStringRepr> ToJsAstStringRepr::FromJsHirRepr(
const JsHirRepr &hir_repr) {
MALDOCA_ASSIGN_OR_RETURN(JsAstRepr ast, ToJsAstRepr::FromJsHirRepr(hir_repr));
return ToJsAstStringRepr::FromJsAstRepr(*ast.ast, ast.scopes);
return ToJsAstStringRepr::FromJsAstRepr(ast);
}

// -----------------------------------------------------------------------------
Expand All @@ -174,7 +181,7 @@ absl::StatusOr<JsSourceRepr> ToJsSourceRepr::FromJsHirRepr(
absl::Duration timeout, Babel &babel) {
MALDOCA_ASSIGN_OR_RETURN(JsAstStringRepr ast_string,
ToJsAstStringRepr::FromJsHirRepr(hir_repr));
return ToJsSourceRepr::FromJsAstStringRepr(ast_string.ast_string,
return ToJsSourceRepr::FromJsAstStringRepr(ast_string,
generate_options, timeout, babel);
}

Expand All @@ -183,12 +190,11 @@ absl::StatusOr<JsSourceRepr> ToJsSourceRepr::FromJsHirRepr(
// -----------------------------------------------------------------------------

absl::StatusOr<JsSourceRepr> ToJsSourceRepr::FromJsAstRepr(
const JsFile &ast, BabelGenerateOptions generate_options,
const JsAstRepr &ast_repr, BabelGenerateOptions generate_options,
absl::Duration timeout, Babel &babel) {
BabelScopes dummy_scopes;
MALDOCA_ASSIGN_OR_RETURN(JsAstStringRepr ast_string,
ToJsAstStringRepr::FromJsAstRepr(ast, dummy_scopes));
return ToJsSourceRepr::FromJsAstStringRepr(ast_string.ast_string,
ToJsAstStringRepr::FromJsAstRepr(ast_repr));
return ToJsSourceRepr::FromJsAstStringRepr(ast_string,
generate_options, timeout, babel);
}

Expand Down
21 changes: 11 additions & 10 deletions maldoca/js/driver/conversion.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,12 @@ namespace maldoca {

struct ToJsSourceRepr {
static absl::StatusOr<JsSourceRepr> FromJsAstStringRepr(
const BabelAstString &ast_string, BabelGenerateOptions generate_options,
absl::Duration timeout, Babel &babel);
const JsAstStringRepr &ast_string_repr,
BabelGenerateOptions generate_options, absl::Duration timeout,
Babel &babel);

static absl::StatusOr<JsSourceRepr> FromJsAstRepr(
const JsFile &ast, BabelGenerateOptions generate_options,
const JsAstRepr &ast_repr, BabelGenerateOptions generate_options,
absl::Duration timeout, Babel &babel);

static absl::StatusOr<JsSourceRepr> FromJsHirRepr(
Expand All @@ -54,42 +55,42 @@ struct ToJsSourceRepr {

struct ToJsAstStringRepr {
static absl::StatusOr<JsAstStringRepr> FromJsSourceRepr(
absl::string_view source, BabelParseRequest parse_request,
const JsSourceRepr &source_repr, BabelParseRequest parse_request,
absl::Duration timeout, Babel &babel);

static absl::StatusOr<JsAstStringRepr> FromJsAstRepr(
const JsFile &ast, const BabelScopes &scopes);
const JsAstRepr &ast_repr);

static absl::StatusOr<JsAstStringRepr> FromJsHirRepr(
const JsHirRepr &hir_repr);
};

struct ToJsAstRepr {
static absl::StatusOr<JsAstRepr> FromJsSourceRepr(
absl::string_view source, BabelParseRequest parse_request,
const JsSourceRepr &source_repr, BabelParseRequest parse_request,
absl::Duration timeout, std::optional<int> recursion_depth_limit,
Babel &babel);

static absl::StatusOr<JsAstRepr> FromJsAstStringRepr(
const BabelAstString &ast_string,
const JsAstStringRepr &ast_string_repr,
std::optional<int> recursion_depth_limit);

static absl::StatusOr<JsAstRepr> FromJsHirRepr(const JsHirRepr &hir_repr);
};

struct ToJsHirRepr {
static absl::StatusOr<JsHirRepr> FromJsSourceRepr(
absl::string_view source, BabelParseRequest parse_request,
const JsSourceRepr &source_repr, BabelParseRequest parse_request,
absl::Duration timeout, std::optional<int> recursion_depth_limit,
Babel &babel, mlir::MLIRContext &mlir_context);

static absl::StatusOr<JsHirRepr> FromJsAstStringRepr(
const BabelAstString &ast_string,
const JsAstStringRepr &ast_string_repr,
std::optional<int> recursion_depth_limit,
mlir::MLIRContext &mlir_context);

static absl::StatusOr<JsHirRepr> FromJsAstRepr(
const maldoca::JsFile &ast, const BabelScopes &scopes,
const JsAstRepr &ast_repr,
mlir::MLIRContext &mlir_context);
};

Expand Down
Loading
Loading