Skip to content

Commit

Permalink
Add support for dict methods with Const (#2567)
Browse files Browse the repository at this point in the history
* Implement attributes for `Const dict`

* Remove duplicate changes

* Improve checking for `Const` types

* Simplify type checking for `Const dict`.

* Add tests

* Update test

* Update fetching attribute name logic

Co-authored-by: Thirumalai Shaktivel <[email protected]>

* Update test references

* Update fetching `dict_type`

Co-authored-by: Thirumalai Shaktivel <[email protected]>

* Formatting changes

* Update test references

* Update error test references

* Tests: Update test references

* Tests: Add runtime tests and update test references

* Remove checks on the absent `Const` node

* Remove call to `get_contained_type()`

* Tests: Add tests and update references

* Style changes

* Tests: Update tests and add to CMakeLists

* Delete tests/reference/asr-test_const_dict-151acad.json

* Delete tests/reference/asr-test_const_dict-151acad.stdout

* Delete tests/reference/asr-test_const_dict-59445d7.json

* Delete tests/reference/asr-test_dict_const-69479e2.json

* Delete tests/reference/asr-test_dict_const-69479e2.stderr

* Delete tests/reference/asr-test_dict_const-69479e2.stdout

* Delete tests/reference/runtime-test_dict_const-62054df.json

* Delete tests/reference/runtime-test_dict_const-62054df.stderr

* Delete tests/reference/asr-test_const_dict-59445d7.stderr

* Tests: Update error references

* Undo formatting changes

* Remove extra newline

---------

Co-authored-by: Thirumalai Shaktivel <[email protected]>
  • Loading branch information
kmr-srbh and Thirumalai-Shaktivel authored May 1, 2024
1 parent 8451ad2 commit a74d529
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 0 deletions.
1 change: 1 addition & 0 deletions integration_tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -562,6 +562,7 @@ RUN(NAME test_tuple_03 LABELS cpython llvm llvm_jit c)
RUN(NAME test_tuple_04 LABELS cpython llvm llvm_jit c)
RUN(NAME test_tuple_concat LABELS cpython llvm llvm_jit)
RUN(NAME test_tuple_nested LABELS cpython llvm llvm_jit)
RUN(NAME test_const_dict LABELS cpython llvm llvm_jit)
RUN(NAME test_dict_01 LABELS cpython llvm llvm_jit c)
RUN(NAME test_dict_02 LABELS cpython llvm llvm_jit c NOFAST)
RUN(NAME test_dict_03 LABELS cpython llvm llvm_jit NOFAST)
Expand Down
24 changes: 24 additions & 0 deletions integration_tests/test_const_dict.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from lpython import i32, f64, Const

CONST_DICTIONARY_INTEGR: Const[dict[str, i32]] = {"a": 1, "b": 2, "c": 3}

print(CONST_DICTIONARY_INTEGR.get("a"))
assert CONST_DICTIONARY_INTEGR.get("a") == 1

print(CONST_DICTIONARY_INTEGR.keys())
assert len(CONST_DICTIONARY_INTEGR.keys()) == 3

print(CONST_DICTIONARY_INTEGR.values())
assert len(CONST_DICTIONARY_INTEGR.values()) == 3

CONST_DICTIONARY_FLOAT: Const[dict[str, f64]] = {"a": 1.0, "b": 2.0, "c": 3.0}

print(CONST_DICTIONARY_FLOAT.get("a"))
assert CONST_DICTIONARY_FLOAT.get("a") == 1.0

print(CONST_DICTIONARY_FLOAT.keys())
assert len(CONST_DICTIONARY_FLOAT.keys()) == 3

print(CONST_DICTIONARY_FLOAT.values())
assert len(CONST_DICTIONARY_FLOAT.values()) == 3

3 changes: 3 additions & 0 deletions src/lpython/semantics/python_attribute_eval.h
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,9 @@ struct AttributeHandler {

static ASR::asr_t* eval_dict_pop(ASR::expr_t *s, Allocator &al, const Location &loc,
Vec<ASR::expr_t*> &args, diag::Diagnostics &diag) {
if (ASRUtils::is_const(s)) {
throw SemanticError("cannot pop elements from a const dict", loc);
}
if (args.size() != 1) {
throw SemanticError("'pop' takes only one argument for now", loc);
}
Expand Down
9 changes: 9 additions & 0 deletions tests/errors/test_const_dict.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from lpython import i32, f64, dict, Const


def test_const_dict():
CONST_DICTIONARY: Const[dict[str, i32]] = {"a": 1, "b": 2, "c": 3}
print(CONST_DICTIONARY.pop("a"))


test_const_dict()
13 changes: 13 additions & 0 deletions tests/reference/asr-test_const_dict-59445d7.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"basename": "asr-test_const_dict-59445d7",
"cmd": "lpython --show-asr --no-color {infile} -o {outfile}",
"infile": "tests/errors/test_const_dict.py",
"infile_hash": "51130e98c759eb3cdbd50848e59879e4689d241c7a8674aa06a5b3c7",
"outfile": null,
"outfile_hash": null,
"stdout": null,
"stdout_hash": null,
"stderr": "asr-test_const_dict-59445d7.stderr",
"stderr_hash": "1d3729d80a7895dd01baaf0905c6cc9ebadd7f7ce623f4ae5970e2b8",
"returncode": 2
}
5 changes: 5 additions & 0 deletions tests/reference/asr-test_const_dict-59445d7.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
semantic error: cannot pop elements from a const dict
--> tests/errors/test_const_dict.py:6:11
|
6 | print(CONST_DICTIONARY.pop("a"))
| ^^^^^^^^^^^^^^^^^^^^^^^^^
4 changes: 4 additions & 0 deletions tests/tests.toml
Original file line number Diff line number Diff line change
Expand Up @@ -1109,6 +1109,10 @@ run = true
filename = "errors/test_dict16.py"
run = true

[[test]]
filename = "errors/test_const_dict.py"
asr = true

[[test]]
filename = "errors/test_zero_division.py"
asr = true
Expand Down

0 comments on commit a74d529

Please sign in to comment.