|
40 | 40 | from vsc.model.expr_rangelist_model import ExprRangelistModel
|
41 | 41 | from vsc.model.expr_unary_model import ExprUnaryModel
|
42 | 42 | from vsc.model.field_array_model import FieldArrayModel
|
| 43 | +from vsc.model.field_composite_model import FieldCompositeModel |
43 | 44 | from vsc.model.field_const_array_model import FieldConstArrayModel
|
44 | 45 | from vsc.model.field_scalar_model import FieldScalarModel
|
45 | 46 | from vsc.model.unary_expr_type import UnaryExprType
|
|
49 | 50 | from vsc.impl.expr_mode import get_expr_mode, expr_mode, is_expr_mode
|
50 | 51 | from vsc.model.expr_array_product_model import ExprArrayProductModel
|
51 | 52 | from vsc.visitors.model_pretty_printer import ModelPrettyPrinter
|
| 53 | +from vsc.visitors.expr2field_visitor import Expr2FieldVisitor |
| 54 | +from vsc.visitors.expr2fieldtype_visitor import Expr2FieldTypeVisitor |
52 | 55 | from vsc.model.expr_indexed_dynref_model import ExprIndexedDynRefModel
|
53 | 56 | from vsc.model.source_info import SourceInfo
|
54 | 57 |
|
@@ -172,6 +175,29 @@ def not_inside(self, rhs):
|
172 | 175 | else:
|
173 | 176 | raise Exception("Unsupported 'not_inside' argument of type " + str(type(rhs)))
|
174 | 177 |
|
| 178 | + def __getattr__(self, name): |
| 179 | + ret = None |
| 180 | + em = object.__getattribute__(self, "em") |
| 181 | + fm_t = Expr2FieldTypeVisitor().fieldtype(em) |
| 182 | + |
| 183 | + if fm_t is not None: |
| 184 | + if name in fm_t.field_id_m.keys(): |
| 185 | + idx = fm_t.field_id_m[name] |
| 186 | + ret = expr(ExprIndexedFieldRefModel(em, [idx])) |
| 187 | + else: |
| 188 | + raise Exception("Field %s not in type %s" % (name, fm_t.name)) |
| 189 | + else: |
| 190 | + fm = Expr2FieldVisitor().field(em) |
| 191 | + |
| 192 | + if name in fm.field_id_m.keys(): |
| 193 | + idx = fm.field_id_m[name] |
| 194 | + ret = expr(ExprIndexedFieldRefModel(em, [idx])) |
| 195 | + else: |
| 196 | + raise Exception("Composite %s does not contain a field \"%s\"" % ( |
| 197 | + fm.name, name)) |
| 198 | + |
| 199 | + return ret |
| 200 | + |
175 | 201 | def __getitem__(self, k):
|
176 | 202 | if is_expr_mode():
|
177 | 203 | if isinstance(k, slice):
|
|
0 commit comments