Skip to content

Commit 42e0f59

Browse files
authored
Merge pull request #1794 from Smit-create/i-1783
Allow importing enums
2 parents 99b48f6 + 3be64d2 commit 42e0f59

File tree

4 files changed

+35
-6
lines changed

4 files changed

+35
-6
lines changed

integration_tests/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,8 @@ RUN(NAME enum_04 LABELS cpython llvm c)
485485
RUN(NAME enum_05 LABELS llvm c
486486
EXTRAFILES enum_05b.c)
487487
RUN(NAME enum_06 LABELS cpython llvm c)
488+
RUN(NAME enum_07 IMPORT_PATH ..
489+
LABELS cpython llvm c)
488490
RUN(NAME union_01 LABELS cpython llvm c)
489491
RUN(NAME union_02 LABELS llvm c)
490492
RUN(NAME union_03 LABELS cpython llvm c)

integration_tests/enum_07.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from enum_07_module import Constants
2+
3+
def check():
4+
assert Constants.NUM_ELEMS.value == 4
5+
assert Constants.NUM_CHECK.value == 51
6+
7+
check()
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from enum import Enum
2+
from lpython import i32
3+
4+
class Constants(Enum):
5+
NUM_ELEMS: i32 = 4
6+
NUM_CHECK: i32 = 51

src/lpython/semantics/python_ast_to_asr.cpp

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,20 @@ ASR::symbol_t* import_from_module(Allocator &al, ASR::Module_t *m, SymbolTable *
467467
ASR::accessType::Public
468468
);
469469
return ASR::down_cast<ASR::symbol_t>(est);
470+
} else if (ASR::is_a<ASR::EnumType_t>(*t)) {
471+
ASR::EnumType_t *et = ASR::down_cast<ASR::EnumType_t>(t);
472+
Str name;
473+
name.from_str(al, new_sym_name);
474+
char *cname = name.c_str(al);
475+
ASR::asr_t *est = ASR::make_ExternalSymbol_t(
476+
al, et->base.base.loc,
477+
/* a_symtab */ current_scope,
478+
/* a_name */ cname,
479+
(ASR::symbol_t*)et,
480+
m->m_name, nullptr, 0, et->m_name,
481+
ASR::accessType::Public
482+
);
483+
return ASR::down_cast<ASR::symbol_t>(est);
470484
} else if (ASR::is_a<ASR::Variable_t>(*t)) {
471485
ASR::Variable_t *mv = ASR::down_cast<ASR::Variable_t>(t);
472486
// `mv` is the Variable in a module. Now we construct
@@ -5306,12 +5320,12 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
53065320
return ;
53075321
}
53085322

5309-
ASR::symbol_t *t = current_scope->resolve_symbol(value);
5310-
5311-
if (!t) {
5323+
ASR::symbol_t *org_sym = current_scope->resolve_symbol(value);
5324+
if (!org_sym) {
53125325
throw SemanticError("'" + value + "' is not defined in the scope",
53135326
x.base.base.loc);
53145327
}
5328+
ASR::symbol_t *t = ASRUtils::symbol_get_past_external(org_sym);
53155329
if (ASR::is_a<ASR::Variable_t>(*t)) {
53165330
ASR::Variable_t *var = ASR::down_cast<ASR::Variable_t>(t);
53175331
visit_AttributeUtil(var->m_type, x.m_attr, t, x.base.base.loc);
@@ -5324,7 +5338,7 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
53245338
x.base.base.loc);
53255339
}
53265340
ASR::Variable_t* enum_member_variable = ASR::down_cast<ASR::Variable_t>(enum_member);
5327-
ASR::expr_t* enum_type_var = ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, t));
5341+
ASR::expr_t* enum_type_var = ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, org_sym));
53285342
ASR::expr_t* enum_member_var = ASRUtils::EXPR(ASR::make_EnumStaticMember_t(al, x.base.base.loc, enum_type_var,
53295343
enum_member, enum_type->m_type,
53305344
ASRUtils::expr_value(enum_member_variable->m_symbolic_value)));
@@ -5342,12 +5356,12 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
53425356
}
53435357
if( ASR::is_a<ASR::Variable_t>(*struct_member) ) {
53445358
ASR::Variable_t* struct_member_variable = ASR::down_cast<ASR::Variable_t>(struct_member);
5345-
ASR::expr_t* struct_type_var = ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, t));
5359+
ASR::expr_t* struct_type_var = ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, org_sym));
53465360
tmp = ASR::make_StructStaticMember_t(al, x.base.base.loc,
53475361
struct_type_var, struct_member, struct_member_variable->m_type,
53485362
nullptr);
53495363
} else if( ASR::is_a<ASR::UnionType_t>(*struct_member) ) {
5350-
ASR::expr_t* struct_type_var = ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, t));
5364+
ASR::expr_t* struct_type_var = ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, org_sym));
53515365
ASR::ttype_t* union_type = ASRUtils::TYPE(ASR::make_Union_t(al, x.base.base.loc, struct_member, nullptr, 0));
53525366
tmp = ASR::make_StructStaticMember_t(al, x.base.base.loc, struct_type_var, struct_member, union_type, nullptr);
53535367
}

0 commit comments

Comments
 (0)