diff --git a/tests/base.py b/tests/base.py index 630bfa1..0749d79 100644 --- a/tests/base.py +++ b/tests/base.py @@ -29,7 +29,7 @@ class Tester(ABC): def _list_tests(self) -> list[Path]: ... def run_all_tests(self) -> bool: - paths: list[Path] = self._list_tests() + paths: list[Path] = sorted(self._list_tests()) return self.run_tests(paths) def run_tests(self, tests: list[Path]) -> bool: @@ -40,7 +40,7 @@ class Tester(ABC): print(rule) for i, test in enumerate(tests): - print(f"Case {i+1}/{n}: {test.relative_to(self.CASES_DIR)}") + print(f"Case {i+1}/{n}: {test.resolve().relative_to(self.CASES_DIR)}") success: bool = self._run_test(test) if success: successes += 1 @@ -78,7 +78,7 @@ class Tester(ABC): def _exec_case(self, path: Path) -> CaseResult: ... def update_all_tests(self): - paths: list[Path] = self._list_tests() + paths: list[Path] = sorted(self._list_tests()) return self.update_tests(paths) def update_tests(self, tests: list[Path]): diff --git a/tests/cases/checker/01_simple_types.py.ref.json b/tests/cases/checker/01_simple_types.py.ref.json index c37fb01..3c4d0b9 100644 --- a/tests/cases/checker/01_simple_types.py.ref.json +++ b/tests/cases/checker/01_simple_types.py.ref.json @@ -1,3 +1,4 @@ { - "diagnostics": [] + "diagnostics": [], + "judgments": [] } \ No newline at end of file diff --git a/tests/cases/checker/02_simple_operations.py.ref.json b/tests/cases/checker/02_simple_operations.py.ref.json index c390e27..6952790 100644 --- a/tests/cases/checker/02_simple_operations.py.ref.json +++ b/tests/cases/checker/02_simple_operations.py.ref.json @@ -27,20 +27,165 @@ ] }, "message": "Undefined operation __add__ between BaseType(name='bool') and BaseType(name='bool')" + } + ], + "judgments": [ + { + "location": { + "from": "L1:9", + "to": "L1:10" + }, + "expr": { + "_type": "LiteralExpr", + "value": 3 + }, + "type": { + "name": "int" + } }, { - "type": "Error", "location": { - "start": [ - 11, - 0 - ], - "end": [ - 11, - 12 - ] + "from": "L2:9", + "to": "L2:10" }, - "message": "Cannot assign BaseType(name='int') to f of type BaseType(name='float')" + "expr": { + "_type": "LiteralExpr", + "value": 4 + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L4:4", + "to": "L4:5" + }, + "expr": { + "_type": "VariableExpr", + "name": "a" + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L4:8", + "to": "L4:9" + }, + "expr": { + "_type": "VariableExpr", + "name": "b" + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L4:4", + "to": "L4:9" + }, + "expr": { + "_type": "BinaryExpr", + "left": { + "_type": "VariableExpr", + "name": "a" + }, + "operator": "+", + "right": { + "_type": "VariableExpr", + "name": "b" + } + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L6:4", + "to": "L6:13" + }, + "expr": { + "_type": "LiteralExpr", + "value": "invalid" + }, + "type": { + "name": "str" + } + }, + { + "location": { + "from": "L8:4", + "to": "L8:8" + }, + "expr": { + "_type": "LiteralExpr", + "value": true + }, + "type": { + "name": "bool" + } + }, + { + "location": { + "from": "L9:4", + "to": "L9:5" + }, + "expr": { + "_type": "VariableExpr", + "name": "d" + }, + "type": { + "name": "bool" + } + }, + { + "location": { + "from": "L9:8", + "to": "L9:9" + }, + "expr": { + "_type": "VariableExpr", + "name": "d" + }, + "type": { + "name": "bool" + } + }, + { + "location": { + "from": "L9:4", + "to": "L9:9" + }, + "expr": { + "_type": "BinaryExpr", + "left": { + "_type": "VariableExpr", + "name": "d" + }, + "operator": "+", + "right": { + "_type": "VariableExpr", + "name": "d" + } + }, + "type": {} + }, + { + "location": { + "from": "L11:11", + "to": "L11:12" + }, + "expr": { + "_type": "VariableExpr", + "name": "a" + }, + "type": { + "name": "int" + } } ] } \ No newline at end of file diff --git a/tests/cases/checker/03_functions.py.ref.json b/tests/cases/checker/03_functions.py.ref.json index 40b33b5..cd0ce42 100644 --- a/tests/cases/checker/03_functions.py.ref.json +++ b/tests/cases/checker/03_functions.py.ref.json @@ -238,20 +238,6 @@ }, "message": "Wrong type for argument 'a', expected BaseType(name='int'), got BaseType(name='str')" }, - { - "type": "Error", - "location": { - "start": [ - 18, - 15 - ], - "end": [ - 18, - 16 - ] - }, - "message": "Wrong type for argument 'b', expected BaseType(name='float'), got BaseType(name='int')" - }, { "type": "Error", "location": { @@ -266,5 +252,1217 @@ }, "message": "Wrong type for argument 'c', expected BaseType(name='str'), got BaseType(name='bool')" } + ], + "judgments": [ + { + "location": { + "from": "L5:5", + "to": "L5:8" + }, + "expr": { + "_type": "VariableExpr", + "name": "foo" + }, + "type": { + "name": "foo", + "pos_args": [ + { + "pos": 0, + "name": "a", + "type": { + "name": "int" + }, + "required": true + } + ], + "args": [ + { + "pos": 1, + "name": "b", + "type": { + "name": "float" + }, + "required": true + } + ], + "kw_args": [ + { + "pos": 2, + "name": "c", + "type": { + "name": "str" + }, + "required": true + } + ], + "returns": { + "name": "bool" + } + } + }, + { + "location": { + "from": "L5:5", + "to": "L5:10" + }, + "expr": { + "_type": "CallExpr", + "callee": { + "_type": "VariableExpr", + "name": "foo" + }, + "arguments": [], + "keywords": {} + }, + "type": { + "name": "bool" + } + }, + { + "location": { + "from": "L6:5", + "to": "L6:8" + }, + "expr": { + "_type": "VariableExpr", + "name": "foo" + }, + "type": { + "name": "foo", + "pos_args": [ + { + "pos": 0, + "name": "a", + "type": { + "name": "int" + }, + "required": true + } + ], + "args": [ + { + "pos": 1, + "name": "b", + "type": { + "name": "float" + }, + "required": true + } + ], + "kw_args": [ + { + "pos": 2, + "name": "c", + "type": { + "name": "str" + }, + "required": true + } + ], + "returns": { + "name": "bool" + } + } + }, + { + "location": { + "from": "L6:9", + "to": "L6:10" + }, + "expr": { + "_type": "LiteralExpr", + "value": 1 + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L6:5", + "to": "L6:11" + }, + "expr": { + "_type": "CallExpr", + "callee": { + "_type": "VariableExpr", + "name": "foo" + }, + "arguments": [ + { + "_type": "LiteralExpr", + "value": 1 + } + ], + "keywords": {} + }, + "type": { + "name": "bool" + } + }, + { + "location": { + "from": "L7:5", + "to": "L7:8" + }, + "expr": { + "_type": "VariableExpr", + "name": "foo" + }, + "type": { + "name": "foo", + "pos_args": [ + { + "pos": 0, + "name": "a", + "type": { + "name": "int" + }, + "required": true + } + ], + "args": [ + { + "pos": 1, + "name": "b", + "type": { + "name": "float" + }, + "required": true + } + ], + "kw_args": [ + { + "pos": 2, + "name": "c", + "type": { + "name": "str" + }, + "required": true + } + ], + "returns": { + "name": "bool" + } + } + }, + { + "location": { + "from": "L7:9", + "to": "L7:10" + }, + "expr": { + "_type": "LiteralExpr", + "value": 1 + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L7:12", + "to": "L7:15" + }, + "expr": { + "_type": "LiteralExpr", + "value": 2.0 + }, + "type": { + "name": "float" + } + }, + { + "location": { + "from": "L7:5", + "to": "L7:16" + }, + "expr": { + "_type": "CallExpr", + "callee": { + "_type": "VariableExpr", + "name": "foo" + }, + "arguments": [ + { + "_type": "LiteralExpr", + "value": 1 + }, + { + "_type": "LiteralExpr", + "value": 2.0 + } + ], + "keywords": {} + }, + "type": { + "name": "bool" + } + }, + { + "location": { + "from": "L8:5", + "to": "L8:8" + }, + "expr": { + "_type": "VariableExpr", + "name": "foo" + }, + "type": { + "name": "foo", + "pos_args": [ + { + "pos": 0, + "name": "a", + "type": { + "name": "int" + }, + "required": true + } + ], + "args": [ + { + "pos": 1, + "name": "b", + "type": { + "name": "float" + }, + "required": true + } + ], + "kw_args": [ + { + "pos": 2, + "name": "c", + "type": { + "name": "str" + }, + "required": true + } + ], + "returns": { + "name": "bool" + } + } + }, + { + "location": { + "from": "L8:9", + "to": "L8:10" + }, + "expr": { + "_type": "LiteralExpr", + "value": 1 + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L8:14", + "to": "L8:17" + }, + "expr": { + "_type": "LiteralExpr", + "value": 2.0 + }, + "type": { + "name": "float" + } + }, + { + "location": { + "from": "L8:5", + "to": "L8:18" + }, + "expr": { + "_type": "CallExpr", + "callee": { + "_type": "VariableExpr", + "name": "foo" + }, + "arguments": [ + { + "_type": "LiteralExpr", + "value": 1 + } + ], + "keywords": { + "b": { + "_type": "LiteralExpr", + "value": 2.0 + } + } + }, + "type": { + "name": "bool" + } + }, + { + "location": { + "from": "L9:5", + "to": "L9:8" + }, + "expr": { + "_type": "VariableExpr", + "name": "foo" + }, + "type": { + "name": "foo", + "pos_args": [ + { + "pos": 0, + "name": "a", + "type": { + "name": "int" + }, + "required": true + } + ], + "args": [ + { + "pos": 1, + "name": "b", + "type": { + "name": "float" + }, + "required": true + } + ], + "kw_args": [ + { + "pos": 2, + "name": "c", + "type": { + "name": "str" + }, + "required": true + } + ], + "returns": { + "name": "bool" + } + } + }, + { + "location": { + "from": "L9:9", + "to": "L9:10" + }, + "expr": { + "_type": "LiteralExpr", + "value": 1 + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L9:12", + "to": "L9:15" + }, + "expr": { + "_type": "LiteralExpr", + "value": 2.0 + }, + "type": { + "name": "float" + } + }, + { + "location": { + "from": "L9:17", + "to": "L9:23" + }, + "expr": { + "_type": "LiteralExpr", + "value": "test" + }, + "type": { + "name": "str" + } + }, + { + "location": { + "from": "L9:5", + "to": "L9:24" + }, + "expr": { + "_type": "CallExpr", + "callee": { + "_type": "VariableExpr", + "name": "foo" + }, + "arguments": [ + { + "_type": "LiteralExpr", + "value": 1 + }, + { + "_type": "LiteralExpr", + "value": 2.0 + }, + { + "_type": "LiteralExpr", + "value": "test" + } + ], + "keywords": {} + }, + "type": { + "name": "bool" + } + }, + { + "location": { + "from": "L10:5", + "to": "L10:8" + }, + "expr": { + "_type": "VariableExpr", + "name": "foo" + }, + "type": { + "name": "foo", + "pos_args": [ + { + "pos": 0, + "name": "a", + "type": { + "name": "int" + }, + "required": true + } + ], + "args": [ + { + "pos": 1, + "name": "b", + "type": { + "name": "float" + }, + "required": true + } + ], + "kw_args": [ + { + "pos": 2, + "name": "c", + "type": { + "name": "str" + }, + "required": true + } + ], + "returns": { + "name": "bool" + } + } + }, + { + "location": { + "from": "L10:9", + "to": "L10:10" + }, + "expr": { + "_type": "LiteralExpr", + "value": 1 + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L10:12", + "to": "L10:15" + }, + "expr": { + "_type": "LiteralExpr", + "value": 2.0 + }, + "type": { + "name": "float" + } + }, + { + "location": { + "from": "L10:19", + "to": "L10:22" + }, + "expr": { + "_type": "LiteralExpr", + "value": 3.0 + }, + "type": { + "name": "float" + } + }, + { + "location": { + "from": "L10:5", + "to": "L10:23" + }, + "expr": { + "_type": "CallExpr", + "callee": { + "_type": "VariableExpr", + "name": "foo" + }, + "arguments": [ + { + "_type": "LiteralExpr", + "value": 1 + }, + { + "_type": "LiteralExpr", + "value": 2.0 + } + ], + "keywords": { + "b": { + "_type": "LiteralExpr", + "value": 3.0 + } + } + }, + "type": { + "name": "bool" + } + }, + { + "location": { + "from": "L11:5", + "to": "L11:8" + }, + "expr": { + "_type": "VariableExpr", + "name": "foo" + }, + "type": { + "name": "foo", + "pos_args": [ + { + "pos": 0, + "name": "a", + "type": { + "name": "int" + }, + "required": true + } + ], + "args": [ + { + "pos": 1, + "name": "b", + "type": { + "name": "float" + }, + "required": true + } + ], + "kw_args": [ + { + "pos": 2, + "name": "c", + "type": { + "name": "str" + }, + "required": true + } + ], + "returns": { + "name": "bool" + } + } + }, + { + "location": { + "from": "L11:11", + "to": "L11:12" + }, + "expr": { + "_type": "LiteralExpr", + "value": 1 + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L11:5", + "to": "L11:13" + }, + "expr": { + "_type": "CallExpr", + "callee": { + "_type": "VariableExpr", + "name": "foo" + }, + "arguments": [], + "keywords": { + "a": { + "_type": "LiteralExpr", + "value": 1 + } + } + }, + "type": { + "name": "bool" + } + }, + { + "location": { + "from": "L12:5", + "to": "L12:8" + }, + "expr": { + "_type": "VariableExpr", + "name": "foo" + }, + "type": { + "name": "foo", + "pos_args": [ + { + "pos": 0, + "name": "a", + "type": { + "name": "int" + }, + "required": true + } + ], + "args": [ + { + "pos": 1, + "name": "b", + "type": { + "name": "float" + }, + "required": true + } + ], + "kw_args": [ + { + "pos": 2, + "name": "c", + "type": { + "name": "str" + }, + "required": true + } + ], + "returns": { + "name": "bool" + } + } + }, + { + "location": { + "from": "L12:11", + "to": "L12:17" + }, + "expr": { + "_type": "LiteralExpr", + "value": "test" + }, + "type": { + "name": "str" + } + }, + { + "location": { + "from": "L12:5", + "to": "L12:18" + }, + "expr": { + "_type": "CallExpr", + "callee": { + "_type": "VariableExpr", + "name": "foo" + }, + "arguments": [], + "keywords": { + "g": { + "_type": "LiteralExpr", + "value": "test" + } + } + }, + "type": { + "name": "bool" + } + }, + { + "location": { + "from": "L14:6", + "to": "L14:9" + }, + "expr": { + "_type": "VariableExpr", + "name": "foo" + }, + "type": { + "name": "foo", + "pos_args": [ + { + "pos": 0, + "name": "a", + "type": { + "name": "int" + }, + "required": true + } + ], + "args": [ + { + "pos": 1, + "name": "b", + "type": { + "name": "float" + }, + "required": true + } + ], + "kw_args": [ + { + "pos": 2, + "name": "c", + "type": { + "name": "str" + }, + "required": true + } + ], + "returns": { + "name": "bool" + } + } + }, + { + "location": { + "from": "L14:10", + "to": "L14:11" + }, + "expr": { + "_type": "LiteralExpr", + "value": 1 + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L14:13", + "to": "L14:16" + }, + "expr": { + "_type": "LiteralExpr", + "value": 2.0 + }, + "type": { + "name": "float" + } + }, + { + "location": { + "from": "L14:20", + "to": "L14:26" + }, + "expr": { + "_type": "LiteralExpr", + "value": "test" + }, + "type": { + "name": "str" + } + }, + { + "location": { + "from": "L14:6", + "to": "L14:27" + }, + "expr": { + "_type": "CallExpr", + "callee": { + "_type": "VariableExpr", + "name": "foo" + }, + "arguments": [ + { + "_type": "LiteralExpr", + "value": 1 + }, + { + "_type": "LiteralExpr", + "value": 2.0 + } + ], + "keywords": { + "c": { + "_type": "LiteralExpr", + "value": "test" + } + } + }, + "type": { + "name": "bool" + } + }, + { + "location": { + "from": "L15:6", + "to": "L15:9" + }, + "expr": { + "_type": "VariableExpr", + "name": "foo" + }, + "type": { + "name": "foo", + "pos_args": [ + { + "pos": 0, + "name": "a", + "type": { + "name": "int" + }, + "required": true + } + ], + "args": [ + { + "pos": 1, + "name": "b", + "type": { + "name": "float" + }, + "required": true + } + ], + "kw_args": [ + { + "pos": 2, + "name": "c", + "type": { + "name": "str" + }, + "required": true + } + ], + "returns": { + "name": "bool" + } + } + }, + { + "location": { + "from": "L15:10", + "to": "L15:11" + }, + "expr": { + "_type": "LiteralExpr", + "value": 1 + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L15:15", + "to": "L15:18" + }, + "expr": { + "_type": "LiteralExpr", + "value": 2.0 + }, + "type": { + "name": "float" + } + }, + { + "location": { + "from": "L15:22", + "to": "L15:28" + }, + "expr": { + "_type": "LiteralExpr", + "value": "test" + }, + "type": { + "name": "str" + } + }, + { + "location": { + "from": "L15:6", + "to": "L15:29" + }, + "expr": { + "_type": "CallExpr", + "callee": { + "_type": "VariableExpr", + "name": "foo" + }, + "arguments": [ + { + "_type": "LiteralExpr", + "value": 1 + } + ], + "keywords": { + "b": { + "_type": "LiteralExpr", + "value": 2.0 + }, + "c": { + "_type": "LiteralExpr", + "value": "test" + } + } + }, + "type": { + "name": "bool" + } + }, + { + "location": { + "from": "L16:6", + "to": "L16:9" + }, + "expr": { + "_type": "VariableExpr", + "name": "foo" + }, + "type": { + "name": "foo", + "pos_args": [ + { + "pos": 0, + "name": "a", + "type": { + "name": "int" + }, + "required": true + } + ], + "args": [ + { + "pos": 1, + "name": "b", + "type": { + "name": "float" + }, + "required": true + } + ], + "kw_args": [ + { + "pos": 2, + "name": "c", + "type": { + "name": "str" + }, + "required": true + } + ], + "returns": { + "name": "bool" + } + } + }, + { + "location": { + "from": "L16:10", + "to": "L16:11" + }, + "expr": { + "_type": "LiteralExpr", + "value": 1 + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L16:15", + "to": "L16:21" + }, + "expr": { + "_type": "LiteralExpr", + "value": "test" + }, + "type": { + "name": "str" + } + }, + { + "location": { + "from": "L16:25", + "to": "L16:28" + }, + "expr": { + "_type": "LiteralExpr", + "value": 2.0 + }, + "type": { + "name": "float" + } + }, + { + "location": { + "from": "L16:6", + "to": "L16:29" + }, + "expr": { + "_type": "CallExpr", + "callee": { + "_type": "VariableExpr", + "name": "foo" + }, + "arguments": [ + { + "_type": "LiteralExpr", + "value": 1 + } + ], + "keywords": { + "c": { + "_type": "LiteralExpr", + "value": "test" + }, + "b": { + "_type": "LiteralExpr", + "value": 2.0 + } + } + }, + "type": { + "name": "bool" + } + }, + { + "location": { + "from": "L18:6", + "to": "L18:9" + }, + "expr": { + "_type": "VariableExpr", + "name": "foo" + }, + "type": { + "name": "foo", + "pos_args": [ + { + "pos": 0, + "name": "a", + "type": { + "name": "int" + }, + "required": true + } + ], + "args": [ + { + "pos": 1, + "name": "b", + "type": { + "name": "float" + }, + "required": true + } + ], + "kw_args": [ + { + "pos": 2, + "name": "c", + "type": { + "name": "str" + }, + "required": true + } + ], + "returns": { + "name": "bool" + } + } + }, + { + "location": { + "from": "L18:10", + "to": "L18:13" + }, + "expr": { + "_type": "LiteralExpr", + "value": "a" + }, + "type": { + "name": "str" + } + }, + { + "location": { + "from": "L18:15", + "to": "L18:16" + }, + "expr": { + "_type": "LiteralExpr", + "value": 3 + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L18:20", + "to": "L18:25" + }, + "expr": { + "_type": "LiteralExpr", + "value": false + }, + "type": { + "name": "bool" + } + }, + { + "location": { + "from": "L18:6", + "to": "L18:26" + }, + "expr": { + "_type": "CallExpr", + "callee": { + "_type": "VariableExpr", + "name": "foo" + }, + "arguments": [ + { + "_type": "LiteralExpr", + "value": "a" + }, + { + "_type": "LiteralExpr", + "value": 3 + } + ], + "keywords": { + "c": { + "_type": "LiteralExpr", + "value": false + } + } + }, + "type": { + "name": "bool" + } + } ] } \ No newline at end of file diff --git a/tests/cases/checker/04_custom_types.py.ref.json b/tests/cases/checker/04_custom_types.py.ref.json index c37fb01..1802082 100644 --- a/tests/cases/checker/04_custom_types.py.ref.json +++ b/tests/cases/checker/04_custom_types.py.ref.json @@ -1,3 +1,109 @@ { - "diagnostics": [] + "diagnostics": [], + "judgments": [ + { + "location": { + "from": "L4:18", + "to": "L4:37" + }, + "expr": { + "_type": "CastExpr", + "type": { + "_type": "BaseType", + "base": "Meter", + "param": null + }, + "expr": { + "_type": "LiteralExpr", + "value": 123.45 + } + }, + "type": { + "name": "Meter", + "type": { + "name": "float" + } + } + }, + { + "location": { + "from": "L5:15", + "to": "L5:32" + }, + "expr": { + "_type": "CastExpr", + "type": { + "_type": "BaseType", + "base": "Second", + "param": null + }, + "expr": { + "_type": "LiteralExpr", + "value": 6.7 + } + }, + "type": { + "name": "Second", + "type": { + "name": "float" + } + } + }, + { + "location": { + "from": "L6:8", + "to": "L6:16" + }, + "expr": { + "_type": "VariableExpr", + "name": "distance" + }, + "type": { + "name": "Meter", + "type": { + "name": "float" + } + } + }, + { + "location": { + "from": "L6:19", + "to": "L6:23" + }, + "expr": { + "_type": "VariableExpr", + "name": "time" + }, + "type": { + "name": "Second", + "type": { + "name": "float" + } + } + }, + { + "location": { + "from": "L6:8", + "to": "L6:23" + }, + "expr": { + "_type": "BinaryExpr", + "left": { + "_type": "VariableExpr", + "name": "distance" + }, + "operator": "/", + "right": { + "_type": "VariableExpr", + "name": "time" + } + }, + "type": { + "name": "MeterPerSecond", + "type": { + "name": "float" + } + } + } + ] } \ No newline at end of file diff --git a/tests/cases/checker/05_control_flow.py.ref.json b/tests/cases/checker/05_control_flow.py.ref.json index a68a7b9..8f031f2 100644 --- a/tests/cases/checker/05_control_flow.py.ref.json +++ b/tests/cases/checker/05_control_flow.py.ref.json @@ -42,5 +42,215 @@ }, "message": "Mixed return types: [BaseType(name='int'), BaseType(name='str')]" } + ], + "judgments": [ + { + "location": { + "from": "L2:11", + "to": "L2:12" + }, + "expr": { + "_type": "VariableExpr", + "name": "a" + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L2:15", + "to": "L2:16" + }, + "expr": { + "_type": "VariableExpr", + "name": "b" + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L5:7", + "to": "L5:8" + }, + "expr": { + "_type": "VariableExpr", + "name": "a" + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L5:11", + "to": "L5:12" + }, + "expr": { + "_type": "VariableExpr", + "name": "b" + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L6:15", + "to": "L6:16" + }, + "expr": { + "_type": "VariableExpr", + "name": "b" + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L6:19", + "to": "L6:20" + }, + "expr": { + "_type": "VariableExpr", + "name": "a" + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L8:15", + "to": "L8:16" + }, + "expr": { + "_type": "VariableExpr", + "name": "a" + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L8:19", + "to": "L8:20" + }, + "expr": { + "_type": "VariableExpr", + "name": "b" + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L15:7", + "to": "L15:8" + }, + "expr": { + "_type": "VariableExpr", + "name": "a" + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L15:11", + "to": "L15:13" + }, + "expr": { + "_type": "LiteralExpr", + "value": 10 + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L16:15", + "to": "L16:16" + }, + "expr": { + "_type": "VariableExpr", + "name": "a" + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L16:19", + "to": "L16:21" + }, + "expr": { + "_type": "LiteralExpr", + "value": 10 + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L22:7", + "to": "L22:8" + }, + "expr": { + "_type": "VariableExpr", + "name": "a" + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L22:11", + "to": "L22:12" + }, + "expr": { + "_type": "VariableExpr", + "name": "b" + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L23:15", + "to": "L23:16" + }, + "expr": { + "_type": "VariableExpr", + "name": "b" + }, + "type": { + "name": "int" + } + }, + { + "location": { + "from": "L23:19", + "to": "L23:20" + }, + "expr": { + "_type": "VariableExpr", + "name": "a" + }, + "type": { + "name": "int" + } + } ] } \ No newline at end of file diff --git a/tests/checker.py b/tests/checker.py index d0a7b3e..27a94cb 100644 --- a/tests/checker.py +++ b/tests/checker.py @@ -6,14 +6,17 @@ from pathlib import Path import midas.ast.python as p from midas.checker.checker import Checker from midas.checker.diagnostic import Diagnostic +from midas.checker.types import Type from midas.parser.python import PythonParser from midas.resolver.resolver import Resolver from tests.base import Tester +from tests.serializer.python import PythonAstJsonSerializer @dataclass class CaseResult: diagnostics: list[dict] = field(default_factory=list) + judgments: list = field(default_factory=list) def dumps(self) -> str: return json.dumps(asdict(self), indent=2) @@ -49,6 +52,7 @@ class CheckerTester(Tester): source_path=path, types_paths=types_paths, ) + diagnostics: list[Diagnostic] = checker.check(stmts) for diagnostic in diagnostics: result.diagnostics.append( @@ -68,6 +72,21 @@ class CheckerTester(Tester): } ) + judgements: list[tuple[p.Expr, Type]] = checker.judgements + serializer = PythonAstJsonSerializer() + for expr, type in judgements: + loc = expr.location + result.judgments.append( + { + "location": { + "from": f"L{loc.lineno}:{loc.col_offset}", + "to": f"L{loc.end_lineno}:{loc.end_col_offset}", + }, + "expr": expr.accept(serializer), + "type": asdict(type), + } + ) + return result