Changeset 823


Ignore:
Timestamp:
Aug 3, 2012 12:47:52 AM (12 years ago)
Author:
Anya Helene Bagge
Message:

Allow accessing fields by numbers (closes #116).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/magnolia-eclipse/src/org/magnolialang/magnolia/typechecker/Expressions.rsc

    r822 r823  
    202202
    203203tuple[AST,Env] chkInit(AST typ, AST body, f:Field(n, e), env) {
     204termPrintln("chkInit: ", n);
    204205        <ft, env> = getField(typ, body, n, env);
    205206        <e, et, env> = checkExpr(e, env);
     
    393394                try {
    394395                        info = lookupDef(t, env);
     396                        termPrintln("chkExpr DotOp: ", n);
     397                       
    395398                        <ft, env> = getField(t, info.body, n, env);
    396399                        return <DotOp(e, n), ft, env>;
     
    435438
    436439tuple[AST,Env] getField(AST t, Body(Struct(seq(ds))), AST n, Env env) {
    437         for(TypeField(VarDecl(m, fn, ft, fi)) <- ds) {
    438                 if(fn == n)
    439                         return <ft, addTokenRef(n, fn, env)>;
    440         }
    441         env = errorMark(env, "Unknown field \'<nameToStr(n)>\' in type \'<dispNameOf(t, env)>\'", locOf(n));
     440        if(leaf(kStr:/[0-9]+/) := n) {
     441                k = toInt(kStr);
     442                i = 1;
     443                for(TypeField(VarDecl(m, fn, ft, fi)) <- ds) {
     444                        if(i == k)
     445                                return <ft, addTokenRef(n, VarName(fn, ft), env)>;
     446                        i = i + 1;
     447                               
     448                }
     449                env = errorMark(env, "Unknown field #<k> in type \'<dispNameOf(t, env)>\'", locOf(n));
     450        }
     451        else {
     452                for(TypeField(VarDecl(m, fn, ft, fi)) <- ds) {
     453                        if(fn == n)
     454                                return <ft, addTokenRef(n, VarName(fn, ft), env)>;
     455                }
     456                env = errorMark(env, "Unknown field \'<nameToStr(n)>\' in type \'<dispNameOf(t, env)>\'", locOf(n));
     457        }
    442458        return <Unknown(), env>;
    443459}
Note: See TracChangeset for help on using the changeset viewer.