diff --git a/maldoca/js/ir/conversion/tests/yield_expression/BUILD b/maldoca/js/ir/conversion/tests/yield_expression/BUILD new file mode 100644 index 0000000..51e32be --- /dev/null +++ b/maldoca/js/ir/conversion/tests/yield_expression/BUILD @@ -0,0 +1,41 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:lit.bzl", "glob_lit_tests") + +package(default_applicable_licenses = ["//:license"]) + +licenses(["notice"]) + +filegroup( + name = "test_files", + srcs = [ + "ast.json", + "input.js", + "jshir.mlir", + "output.js", + ], + tags = ["ignore_srcs"], +) + +glob_lit_tests( + name = "all_tests", + data = [ + ":test_files", + "//maldoca/js/ir:lit_test_files", + ], + test_file_exts = [ + "lit", + ], +) diff --git a/maldoca/js/ir/conversion/tests/yield_expression/ast.json b/maldoca/js/ir/conversion/tests/yield_expression/ast.json new file mode 100644 index 0000000..31954c4 --- /dev/null +++ b/maldoca/js/ir/conversion/tests/yield_expression/ast.json @@ -0,0 +1,246 @@ +// AST: { +// AST-NEXT: "type": "File", +// AST-NEXT: "loc": { +// AST-NEXT: "start": { +// AST-NEXT: "line": 1, +// AST-NEXT: "column": 0 +// AST-NEXT: }, +// AST-NEXT: "end": { +// AST-NEXT: "line": 5, +// AST-NEXT: "column": 0 +// AST-NEXT: } +// AST-NEXT: }, +// AST-NEXT: "start": 0, +// AST-NEXT: "end": 48, +// AST-NEXT: "program": { +// AST-NEXT: "type": "Program", +// AST-NEXT: "loc": { +// AST-NEXT: "start": { +// AST-NEXT: "line": 1, +// AST-NEXT: "column": 0 +// AST-NEXT: }, +// AST-NEXT: "end": { +// AST-NEXT: "line": 5, +// AST-NEXT: "column": 0 +// AST-NEXT: } +// AST-NEXT: }, +// AST-NEXT: "start": 0, +// AST-NEXT: "end": 48, +// AST-NEXT: "scopeUid": 0, +// AST-NEXT: "interpreter": null, +// AST-NEXT: "sourceType": "script", +// AST-NEXT: "body": [ +// AST-NEXT: { +// AST-NEXT: "type": "FunctionDeclaration", +// AST-NEXT: "loc": { +// AST-NEXT: "start": { +// AST-NEXT: "line": 1, +// AST-NEXT: "column": 0 +// AST-NEXT: }, +// AST-NEXT: "end": { +// AST-NEXT: "line": 4, +// AST-NEXT: "column": 1 +// AST-NEXT: } +// AST-NEXT: }, +// AST-NEXT: "start": 0, +// AST-NEXT: "end": 47, +// AST-NEXT: "scopeUid": 1, +// AST-NEXT: "definedSymbols": [ +// AST-NEXT: { +// AST-NEXT: "name": "gen", +// AST-NEXT: "defScopeUid": 0 +// AST-NEXT: } +// AST-NEXT: ], +// AST-NEXT: "id": { +// AST-NEXT: "type": "Identifier", +// AST-NEXT: "loc": { +// AST-NEXT: "start": { +// AST-NEXT: "line": 1, +// AST-NEXT: "column": 10 +// AST-NEXT: }, +// AST-NEXT: "end": { +// AST-NEXT: "line": 1, +// AST-NEXT: "column": 13 +// AST-NEXT: }, +// AST-NEXT: "identifierName": "gen" +// AST-NEXT: }, +// AST-NEXT: "start": 10, +// AST-NEXT: "end": 13, +// AST-NEXT: "scopeUid": 1, +// AST-NEXT: "name": "gen" +// AST-NEXT: }, +// AST-NEXT: "params": [], +// AST-NEXT: "generator": true, +// AST-NEXT: "async": false, +// AST-NEXT: "body": { +// AST-NEXT: "type": "BlockStatement", +// AST-NEXT: "loc": { +// AST-NEXT: "start": { +// AST-NEXT: "line": 1, +// AST-NEXT: "column": 16 +// AST-NEXT: }, +// AST-NEXT: "end": { +// AST-NEXT: "line": 4, +// AST-NEXT: "column": 1 +// AST-NEXT: } +// AST-NEXT: }, +// AST-NEXT: "start": 16, +// AST-NEXT: "end": 47, +// AST-NEXT: "scopeUid": 1, +// AST-NEXT: "body": [ +// AST-NEXT: { +// AST-NEXT: "type": "ExpressionStatement", +// AST-NEXT: "loc": { +// AST-NEXT: "start": { +// AST-NEXT: "line": 2, +// AST-NEXT: "column": 2 +// AST-NEXT: }, +// AST-NEXT: "end": { +// AST-NEXT: "line": 2, +// AST-NEXT: "column": 10 +// AST-NEXT: } +// AST-NEXT: }, +// AST-NEXT: "start": 20, +// AST-NEXT: "end": 28, +// AST-NEXT: "scopeUid": 1, +// AST-NEXT: "expression": { +// AST-NEXT: "type": "YieldExpression", +// AST-NEXT: "loc": { +// AST-NEXT: "start": { +// AST-NEXT: "line": 2, +// AST-NEXT: "column": 2 +// AST-NEXT: }, +// AST-NEXT: "end": { +// AST-NEXT: "line": 2, +// AST-NEXT: "column": 9 +// AST-NEXT: } +// AST-NEXT: }, +// AST-NEXT: "start": 20, +// AST-NEXT: "end": 27, +// AST-NEXT: "scopeUid": 1, +// AST-NEXT: "argument": { +// AST-NEXT: "type": "NumericLiteral", +// AST-NEXT: "loc": { +// AST-NEXT: "start": { +// AST-NEXT: "line": 2, +// AST-NEXT: "column": 8 +// AST-NEXT: }, +// AST-NEXT: "end": { +// AST-NEXT: "line": 2, +// AST-NEXT: "column": 9 +// AST-NEXT: } +// AST-NEXT: }, +// AST-NEXT: "start": 26, +// AST-NEXT: "end": 27, +// AST-NEXT: "scopeUid": 1, +// AST-NEXT: "value": 1.0, +// AST-NEXT: "extra": { +// AST-NEXT: "raw": "1", +// AST-NEXT: "rawValue": 1.0 +// AST-NEXT: } +// AST-NEXT: }, +// AST-NEXT: "delegate": false +// AST-NEXT: } +// AST-NEXT: }, +// AST-NEXT: { +// AST-NEXT: "type": "ExpressionStatement", +// AST-NEXT: "loc": { +// AST-NEXT: "start": { +// AST-NEXT: "line": 3, +// AST-NEXT: "column": 2 +// AST-NEXT: }, +// AST-NEXT: "end": { +// AST-NEXT: "line": 3, +// AST-NEXT: "column": 16 +// AST-NEXT: } +// AST-NEXT: }, +// AST-NEXT: "start": 31, +// AST-NEXT: "end": 45, +// AST-NEXT: "scopeUid": 1, +// AST-NEXT: "expression": { +// AST-NEXT: "type": "YieldExpression", +// AST-NEXT: "loc": { +// AST-NEXT: "start": { +// AST-NEXT: "line": 3, +// AST-NEXT: "column": 2 +// AST-NEXT: }, +// AST-NEXT: "end": { +// AST-NEXT: "line": 3, +// AST-NEXT: "column": 15 +// AST-NEXT: } +// AST-NEXT: }, +// AST-NEXT: "start": 31, +// AST-NEXT: "end": 44, +// AST-NEXT: "scopeUid": 1, +// AST-NEXT: "argument": { +// AST-NEXT: "type": "ArrayExpression", +// AST-NEXT: "loc": { +// AST-NEXT: "start": { +// AST-NEXT: "line": 3, +// AST-NEXT: "column": 9 +// AST-NEXT: }, +// AST-NEXT: "end": { +// AST-NEXT: "line": 3, +// AST-NEXT: "column": 15 +// AST-NEXT: } +// AST-NEXT: }, +// AST-NEXT: "start": 38, +// AST-NEXT: "end": 44, +// AST-NEXT: "scopeUid": 1, +// AST-NEXT: "elements": [ +// AST-NEXT: { +// AST-NEXT: "type": "NumericLiteral", +// AST-NEXT: "loc": { +// AST-NEXT: "start": { +// AST-NEXT: "line": 3, +// AST-NEXT: "column": 10 +// AST-NEXT: }, +// AST-NEXT: "end": { +// AST-NEXT: "line": 3, +// AST-NEXT: "column": 11 +// AST-NEXT: } +// AST-NEXT: }, +// AST-NEXT: "start": 39, +// AST-NEXT: "end": 40, +// AST-NEXT: "scopeUid": 1, +// AST-NEXT: "value": 2.0, +// AST-NEXT: "extra": { +// AST-NEXT: "raw": "2", +// AST-NEXT: "rawValue": 2.0 +// AST-NEXT: } +// AST-NEXT: }, +// AST-NEXT: { +// AST-NEXT: "type": "NumericLiteral", +// AST-NEXT: "loc": { +// AST-NEXT: "start": { +// AST-NEXT: "line": 3, +// AST-NEXT: "column": 13 +// AST-NEXT: }, +// AST-NEXT: "end": { +// AST-NEXT: "line": 3, +// AST-NEXT: "column": 14 +// AST-NEXT: } +// AST-NEXT: }, +// AST-NEXT: "start": 42, +// AST-NEXT: "end": 43, +// AST-NEXT: "scopeUid": 1, +// AST-NEXT: "value": 3.0, +// AST-NEXT: "extra": { +// AST-NEXT: "raw": "3", +// AST-NEXT: "rawValue": 3.0 +// AST-NEXT: } +// AST-NEXT: } +// AST-NEXT: ] +// AST-NEXT: }, +// AST-NEXT: "delegate": true +// AST-NEXT: } +// AST-NEXT: } +// AST-NEXT: ], +// AST-NEXT: "directives": [] +// AST-NEXT: } +// AST-NEXT: } +// AST-NEXT: ], +// AST-NEXT: "directives": [] +// AST-NEXT: }, +// AST-NEXT: "comments": [] +// AST-NEXT: } diff --git a/maldoca/js/ir/conversion/tests/yield_expression/input.js b/maldoca/js/ir/conversion/tests/yield_expression/input.js new file mode 100644 index 0000000..423d686 --- /dev/null +++ b/maldoca/js/ir/conversion/tests/yield_expression/input.js @@ -0,0 +1,4 @@ +function* gen() { + yield 1; + yield* [2, 3]; +} diff --git a/maldoca/js/ir/conversion/tests/yield_expression/jshir.mlir b/maldoca/js/ir/conversion/tests/yield_expression/jshir.mlir new file mode 100644 index 0000000..62a3fbc --- /dev/null +++ b/maldoca/js/ir/conversion/tests/yield_expression/jshir.mlir @@ -0,0 +1,22 @@ +// JSHIR: "jsir.file"() <{comments = []}> ({ +// JSHIR-NEXT: "jsir.program"() <{source_type = "script"}> ({ +// JSHIR-NEXT: "jsir.function_declaration"() <{async = false, generator = true, id = #jsir, , "gen", 10, 13, 1, "gen">}> ({ +// JSHIR-NEXT: "jsir.exprs_region_end"() : () -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: "jshir.block_statement"() ({ +// JSHIR-NEXT: %0 = "jsir.numeric_literal"() <{extra = #jsir, value = 1.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %1 = "jsir.yield_expression"(%0) <{delegate = false}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%1) : (!jsir.any) -> () +// JSHIR-NEXT: %2 = "jsir.numeric_literal"() <{extra = #jsir, value = 2.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %3 = "jsir.numeric_literal"() <{extra = #jsir, value = 3.000000e+00 : f64}> : () -> !jsir.any +// JSHIR-NEXT: %4 = "jsir.array_expression"(%2, %3) : (!jsir.any, !jsir.any) -> !jsir.any +// JSHIR-NEXT: %5 = "jsir.yield_expression"(%4) <{delegate = true}> : (!jsir.any) -> !jsir.any +// JSHIR-NEXT: "jsir.expression_statement"(%5) : (!jsir.any) -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }, { +// JSHIR-NEXT: ^bb0: +// JSHIR-NEXT: }) : () -> () +// JSHIR-NEXT: }) : () -> () diff --git a/maldoca/js/ir/conversion/tests/yield_expression/output.js b/maldoca/js/ir/conversion/tests/yield_expression/output.js new file mode 100644 index 0000000..770ed83 --- /dev/null +++ b/maldoca/js/ir/conversion/tests/yield_expression/output.js @@ -0,0 +1,4 @@ +// SOURCE: function* gen() { +// SOURCE-NEXT: yield 1; +// SOURCE-NEXT: yield* [2, 3]; +// SOURCE-NEXT: } diff --git a/maldoca/js/ir/conversion/tests/yield_expression/run.lit b/maldoca/js/ir/conversion/tests/yield_expression/run.lit new file mode 100644 index 0000000..c7362e4 --- /dev/null +++ b/maldoca/js/ir/conversion/tests/yield_expression/run.lit @@ -0,0 +1,19 @@ +// RUN: INPUT=%s && \ +// RUN: jsir_gen --input_file "$(dirname "${INPUT}")"/input.js \ +// RUN: --passes "source2ast,ast2hir" \ +// RUN: | FileCheck --check-prefix JSHIR "$(dirname "${INPUT}")"/jshir.mlir + +// RUN: INPUT=%s && \ +// RUN: jsir_gen --input_file "$(dirname "${INPUT}")"/input.js \ +// RUN: --passes "source2ast,ast2hir,hir2ast,ast2source" \ +// RUN: | FileCheck --check-prefix SOURCE "$(dirname "${INPUT}")"/output.js + +// RUN: INPUT=%s && \ +// RUN: jsir_gen --input_file "$(dirname "${INPUT}")"/input.js \ +// RUN: --passes source2ast \ +// RUN: | FileCheck --check-prefix AST "$(dirname "${INPUT}")"/ast.json + +// RUN: INPUT=%s && \ +// RUN: jsir_gen --input_file "$(dirname "${INPUT}")"/input.js \ +// RUN: --passes source2ast,ast2hir,hir2ast \ +// RUN: | FileCheck --check-prefix AST "$(dirname "${INPUT}")"/ast.json