structure field annotation strings
R=ken
OCL=18176
CL=18176
diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c
index 649ecdd..f88d2ab 100644
--- a/src/cmd/gc/dcl.c
+++ b/src/cmd/gc/dcl.c
@@ -450,10 +450,12 @@
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 @@
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;
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index b670be6..a0afb43 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -147,6 +147,7 @@
// TFIELD
Type* down; // also used in TMAP
+ String* note; // literal string annotation
// TARRAY
int32 bound; // negative is dynamic array
diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y
index 35dbec6..c49c47f 100644
--- a/src/cmd/gc/go.y
+++ b/src/cmd/gc/go.y
@@ -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 @@
$$ = 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 @@
$$ = 1;
}
+oliteral:
+ {
+ $$.ctype = CTxxx;
+ }
+| LLITERAL
+
/*
* import syntax from header of
* an output package
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c
index 1a45d4c..d774a8d 100644
--- a/src/cmd/gc/subr.c
+++ b/src/cmd/gc/subr.c
@@ -1078,9 +1078,12 @@
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)