# HG changeset patch # User Aziz K?ksal # Date 1203371996 -3600 # Node ID e76c9fdb83a3a213d293a78634bd1e3e17704ca6 # Parent 846044180d224cc91eac0f3bbc0fb8aa37409274 DDocEmitter emits declaration attributes now. diff -r 846044180d22 -r e76c9fdb83a3 trunk/src/cmd/DDoc.d --- a/trunk/src/cmd/DDoc.d Mon Feb 18 20:03:44 2008 +0100 +++ b/trunk/src/cmd/DDoc.d Mon Feb 18 22:59:56 2008 +0100 @@ -24,6 +24,7 @@ import dil.Information; import dil.Converter; import dil.SourceText; +import dil.Enums; import common; import tango.stdc.time : time_t, time, ctime; @@ -452,7 +453,7 @@ uint prevDeclOffset; - void DECL(void delegate() dg, bool writeSemicolon = true) + void DECL(void delegate() dg, Declaration d, bool writeSemicolon = true) { if (cmntIsDitto) { alias prevDeclOffset offs; @@ -461,7 +462,9 @@ text = ""; write("\n$(DDOC_DECL "); dg(); - write(";)"); + writeSemicolon && write(";"); + writeAttributes(d); + write(")"); // Insert text at offset. auto len = text.length; text = savedText[0..offs] ~ text ~ savedText[offs..$]; @@ -470,7 +473,9 @@ } write("\n$(DDOC_DECL "); dg(); - write(writeSemicolon ? ";)" : ")"); + writeSemicolon && write(";"); + writeAttributes(d); + write(")"); prevDeclOffset = text.length; } @@ -499,7 +504,7 @@ SYMBOL(d.name.str, d); writeTemplateParams(); writeInheritanceList(d.bases); - }); + }, d); DESC({ writeComment(); MEMBERS(is(T == ClassDeclaration) ? "CLASS" : "INTERFACE", { @@ -518,7 +523,7 @@ if (d.name) SYMBOL(d.name.str, d); writeTemplateParams(); - }); + }, d); DESC({ writeComment(); MEMBERS(is(T == StructDeclaration) ? "STRUCT" : "UNION", { @@ -535,7 +540,7 @@ { auto type = textSpan(vd.typeNode.baseType.begin, vd.typeNode.end); foreach (name; vd.names) - DECL({ write(prefix); write(escape(type), " "); SYMBOL(name.str, d); }); + DECL({ write(prefix); write(escape(type), " "); SYMBOL(name.str, d); }, d); } else if (auto fd = d.decl.Is!(FunctionDeclaration)) {} @@ -543,6 +548,37 @@ DESC({ writeComment(); }); } + void writeAttributes(Declaration d) + { + char[][] attributes; + + if (d.prot != Protection.None) + attributes ~= "$(PROT " ~ .toString(d.prot) ~ ")"; + + auto stc = d.stc; + stc &= ~StorageClass.Auto; // Ignore auto. + foreach (stcStr; .toStrings(stc)) + attributes ~= "$(STC " ~ stcStr ~ ")"; + + LinkageType ltype; + if (auto vd = d.Is!(VariablesDeclaration)) + ltype = vd.linkageType; + else if (auto fd = d.Is!(FunctionDeclaration)) + ltype = fd.linkageType; + + if (ltype != LinkageType.None) + attributes ~= "$(LINKAGE extern(" ~ .toString(ltype) ~ "))"; + + if (!attributes.length) + return; + + write(" $(ATTRIBUTES "); + write(attributes[0]); + foreach (attribute; attributes[1..$]) + write(", ", attribute); + write(")"); + } + alias Declaration D; override: @@ -572,7 +608,7 @@ DECL({ write("enum", d.name ? " " : ""); d.name && SYMBOL(d.name.str, d); - }); + }, d); DESC({ writeComment(); MEMBERS("ENUM", { scope s = new Scope(); super.visit(d); }); @@ -584,7 +620,7 @@ { if (!ddoc(d)) return d; - DECL({ SYMBOL(d.name.str, d); }, false); + DECL({ SYMBOL(d.name.str, d); }, d, false); DESC({ writeComment(); }); return d; } @@ -604,7 +640,7 @@ write("template "); SYMBOL(d.name.str, d); writeTemplateParams(); - }); + }, d); DESC({ writeComment(); MEMBERS("TEMPLATE", { @@ -643,7 +679,7 @@ { if (!ddoc(d)) return d; - DECL({ SYMBOL("this", d); writeParams(d.params); }); + DECL({ SYMBOL("this", d); writeParams(d.params); }, d); DESC({ writeComment(); }); return d; } @@ -652,7 +688,7 @@ { if (!ddoc(d)) return d; - DECL({ write("static "); SYMBOL("this", d); write("()"); }); + DECL({ write("static "); SYMBOL("this", d); write("()"); }, d); DESC({ writeComment(); }); return d; } @@ -661,7 +697,7 @@ { if (!ddoc(d)) return d; - DECL({ write("~"); SYMBOL("this", d); write("()"); }); + DECL({ write("~"); SYMBOL("this", d); write("()"); }, d); DESC({ writeComment(); }); return d; } @@ -670,7 +706,7 @@ { if (!ddoc(d)) return d; - DECL({ write("static ~"); SYMBOL("this", d); write("()"); }); + DECL({ write("static ~"); SYMBOL("this", d); write("()"); }, d); DESC({ writeComment(); }); return d; } @@ -685,7 +721,7 @@ SYMBOL(d.name.str, d); writeTemplateParams(); writeParams(d.params); - }); + }, d); DESC({ writeComment(); }); return d; } @@ -694,7 +730,7 @@ { if (!ddoc(d)) return d; - DECL({ SYMBOL("new", d); writeParams(d.params); }); + DECL({ SYMBOL("new", d); writeParams(d.params); }, d); DESC({ writeComment(); }); return d; } @@ -703,7 +739,7 @@ { if (!ddoc(d)) return d; - DECL({ SYMBOL("delete", d); writeParams(d.params); }); + DECL({ SYMBOL("delete", d); writeParams(d.params); }, d); DESC({ writeComment(); }); return d; } @@ -716,7 +752,7 @@ if (d.typeNode) type = textSpan(d.typeNode.baseType.begin, d.typeNode.end); foreach (name; d.names) - DECL({ write(escape(type), " "); SYMBOL(name.str, d); }); + DECL({ write(escape(type), " "); SYMBOL(name.str, d); }, d); DESC({ writeComment(); }); return d; } @@ -725,7 +761,7 @@ { if (!ddoc(d)) return d; - DECL({ SYMBOL("invariant", d); }); + DECL({ SYMBOL("invariant", d); }, d); DESC({ writeComment(); }); return d; } @@ -734,7 +770,7 @@ { if (!ddoc(d)) return d; - DECL({ SYMBOL("unittest", d); }); + DECL({ SYMBOL("unittest", d); }, d); DESC({ writeComment(); }); return d; } diff -r 846044180d22 -r e76c9fdb83a3 trunk/src/dil/Enums.d --- a/trunk/src/dil/Enums.d Mon Feb 18 20:03:44 2008 +0100 +++ b/trunk/src/dil/Enums.d Mon Feb 18 22:59:56 2008 +0100 @@ -4,6 +4,8 @@ +/ module dil.Enums; +import common; + enum StorageClass { None = 0, @@ -28,11 +30,11 @@ enum Protection { None, - Private = 1, - Protected = 1<<1, - Package = 1<<2, - Public = 1<<3, - Export = 1<<4 + Private/+ = 1+/, + Protected/+ = 1<<1+/, + Package/+ = 1<<2+/, + Public/+ = 1<<3+/, + Export/+ = 1<<4+/ } enum LinkageType @@ -45,3 +47,70 @@ Pascal, System } + +string toString(Protection prot) +{ + switch (prot) + { alias Protection P; + case P.None: return ""; + case P.Private: return "private"; + case P.Protected: return "protected"; + case P.Package: return "package"; + case P.Public: return "public"; + case P.Export: return "export"; + default: + assert(0); + } +} + +/// Returns the string of a storage class. Only one bit may be set. +string toString(StorageClass stc) +{ + switch (stc) + { alias StorageClass SC; + case SC.Abstract: return "abstract"; + case SC.Auto: return "auto"; + case SC.Const: return "const"; + case SC.Deprecated: return "deprecated"; + case SC.Extern: return "extern"; + case SC.Final: return "final"; + case SC.Invariant: return "invariant"; + case SC.Override: return "override"; + case SC.Scope: return "scope"; + case SC.Static: return "static"; + case SC.Synchronized: return "synchronized"; + case SC.In: return "in"; + case SC.Out: return "out"; + case SC.Ref: return "ref"; + case SC.Lazy: return "lazy"; + case SC.Variadic: return "variadic"; + default: + assert(0); + } +} + +/// Returns the string . Any number of bits may be set. +string[] toStrings(StorageClass stc) +{ + string[] result; + for (auto i = StorageClass.max; i; i >>= 1) + if (stc & i) + result ~= toString(i); + return result; +} + +string toString(LinkageType ltype) +{ + switch (ltype) + { alias LinkageType LT; + case LT.None: return ""; + case LT.C: return "C"; + case LT.Cpp: return "Cpp"; + case LT.D: return "D"; + case LT.Windows: return "Windows"; + case LT.Pascal: return "Pascal"; + case LT.System: return "System"; + default: + assert(0); + } +} diff -r 846044180d22 -r e76c9fdb83a3 trunk/src/predefined.ddoc --- a/trunk/src/predefined.ddoc Mon Feb 18 20:03:44 2008 +0100 +++ b/trunk/src/predefined.ddoc Mon Feb 18 22:59:56 2008 +0100 @@ -7,7 +7,7 @@

$(TITLE)

$(BODY)
- + @@ -101,3 +101,8 @@ DDOC_PSYMBOL = $(U $0) DDOC_KEYWORD = $(B $0) DDOC_PARAM = $(I $0) + +ATTRIBUTES = [$0] +PROT = $0 +STC = $0 +LINKAGE = $0