]> Cypherpunks repositories - gostls13.git/commitdiff
structure field annotation strings
authorRuss Cox <rsc@golang.org>
Thu, 30 Oct 2008 22:13:09 +0000 (15:13 -0700)
committerRuss Cox <rsc@golang.org>
Thu, 30 Oct 2008 22:13:09 +0000 (15:13 -0700)
R=ken
OCL=18176
CL=18176

src/cmd/gc/dcl.c
src/cmd/gc/go.h
src/cmd/gc/go.y
src/cmd/gc/subr.c

index 649ecddc80768450f40fdb62107b8f46f86a6a22..f88d2ab942ac163e54b813e73d525926c0abe623 100644 (file)
@@ -450,10 +450,12 @@ stotype(Node *n, Type **t)
        Type *f;
        Iter save;
        char buf[100];
+       String *note;
 
        n = listfirst(&save, &n);
 
 loop:
+       note = nil;
        if(n == N) {
                *t = T;
                return t;
@@ -471,8 +473,20 @@ loop:
        if(n->type->etype == TARRAY && n->type->bound < 0)
                yyerror("type of a structure field cannot be an open array");
 
+       switch(n->val.ctype) {
+       case CTSTR:
+               note = n->val.u.sval;
+               break;
+       default:
+               yyerror("structure field annotation must be string");
+       case CTxxx:
+               note = nil;
+               break;
+       }
+
        f = typ(TFIELD);
        f->type = n->type;
+       f->note = note;
 
        if(n->left != N && n->left->op == ONAME) {
                f->nname = n->left;
index b670be685d6115a7ecf09d391570e8e10a15b162..a0afb434dd148cc1c8ac920d5fed2a03c8adebbe 100644 (file)
@@ -147,6 +147,7 @@ struct      Type
 
        // TFIELD
        Type*   down;           // also used in TMAP
+       String* note;                   // literal string annotation
 
        // TARRAY
        int32   bound;          // negative is dynamic array
index 35dbec66cf5b4104a4e82525deea7772a32a50c3..c49c47f21e7145ff3124b8b6aadc81501dc4710e 100644 (file)
@@ -72,6 +72,7 @@
 %type  <type>          non_name_type Anon_fn_type Bnon_fn_type
 %type  <type>          Anon_chan_type Bnon_chan_type
 %type  <type>          indcl fnlitdcl dotdotdot
+%type  <val>           oliteral
 
 %type  <val>           hidden_constant
 %type  <node>          hidden_dcl hidden_structdcl
@@ -1388,10 +1389,11 @@ structdcl:
                $$ = nod(ODCLFIELD, $1, N);
                $$ = nod(OLIST, $$, $3);
        }
-|      new_name type
+|      new_name type oliteral
        {
                $$ = nod(ODCLFIELD, $1, N);
                $$->type = $2;
+               $$->val = $3;
        }
 |      embed
 |      '*' embed
@@ -1761,6 +1763,12 @@ oexport:
                $$ = 1;
        }
 
+oliteral:
+       {
+               $$.ctype = CTxxx;
+       }
+|      LLITERAL
+
 /*
  * import syntax from header of
  * an output package
index 1a45d4ce53a7153323ae4394942034333be8a40f..d774a8d8349382cf6834ec63ec6a70d79d626d0b 100644 (file)
@@ -1078,9 +1078,12 @@ Tpretty(Fmt *fp, Type *t)
                if(t->sym == S || t->embedded) {
                        if(exporting)
                                fmtprint(fp, "? ");
-                       return fmtprint(fp, "%T", t->type);
-               }
-               return fmtprint(fp, "%hS %T", t->sym, t->type);
+                       fmtprint(fp, "%T", t->type);
+               } else
+                       fmtprint(fp, "%hS %T", t->sym, t->type);
+               if(t->note)
+                       fmtprint(fp, " \"%Z\"", t->note);
+               return 0;
 
        case TFORW:
                if(exporting)