diff trunk/src/cmd/DDoc.d @ 775:e76c9fdb83a3

DDocEmitter emits declaration attributes now.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Mon, 18 Feb 2008 22:59:56 +0100
parents 6dbbb403fc58
children 580d4ca9f1ff
line wrap: on
line diff
--- 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;
   }