DEADSOFTWARE

Добавлен ручной каст типов-записей
[dsw-obn.git] / src / oberon.c
index 0118ff9bfceded3989c464ed1a6f9fb59645a6be..6aa94d602fd9da13bb67174ecf2dc6632f9c2d4a 100644 (file)
@@ -1159,7 +1159,8 @@ oberon_make_record_selector(oberon_context_t * ctx, oberon_expr_t * expr, char *
 #define ISSELECTOR(x) \
        (((x) == LBRACE) \
        || ((x) == DOT) \
-       || ((x) == UPARROW))
+       || ((x) == UPARROW) \
+       || ((x) == LPAREN))
 
 static oberon_object_t *
 oberon_qualident(oberon_context_t * ctx, char ** xname, int check)
@@ -1194,6 +1195,18 @@ oberon_qualident(oberon_context_t * ctx, char ** xname, int check)
        return x;
 }
 
+static oberon_expr_t *
+oberno_make_record_cast(oberon_context_t * ctx, oberon_expr_t * expr, oberon_type_t * rec)
+{
+       if(expr -> result -> class != OBERON_TYPE_RECORD
+               || rec -> class != OBERON_TYPE_RECORD)
+       {
+               oberon_error(ctx, "must be record type");
+       }
+
+       return oberon_cast_expr(ctx, expr, rec);
+}
+
 static oberon_expr_t *
 oberon_designator(oberon_context_t * ctx)
 {
@@ -1258,6 +1271,16 @@ oberon_designator(oberon_context_t * ctx)
                                oberon_assert_token(ctx, UPARROW);
                                expr = oberno_make_dereferencing(ctx, expr);
                                break;
+                       case LPAREN:
+                               oberon_assert_token(ctx, LPAREN);
+                               oberon_object_t * objtype = oberon_qualident(ctx, NULL, 1);
+                               if(objtype -> class != OBERON_CLASS_TYPE)
+                               {
+                                       oberon_error(ctx, "must be type");
+                               }
+                               oberon_assert_token(ctx, RPAREN);
+                               expr = oberno_make_record_cast(ctx, expr, objtype -> type);
+                               break;
                        default:
                                oberon_error(ctx, "oberon_designator: wat");
                                break;