changeset 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 846044180d22
children 580d4ca9f1ff
files trunk/src/cmd/DDoc.d trunk/src/dil/Enums.d trunk/src/predefined.ddoc
diffstat 3 files changed, 135 insertions(+), 25 deletions(-) [+]
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;
   }
--- 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);
+  }
+}
--- 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 @@
 <h1>$(TITLE)</h1>
 $(BODY)
 <hr>
-<p class="footer">$(COPYRIGHT) Generated by $(LINK2 http://code.google.com/p/dil, dil) at $(DATETIME).</p>
+<p class="footer">$(COPYRIGHT) | Page generated by $(LINK2 http://code.google.com/p/dil, dil) on $(DATETIME).</p>
 </body>
 </html>
 
@@ -101,3 +101,8 @@
 DDOC_PSYMBOL = $(U $0)
 DDOC_KEYWORD = $(B $0)
 DDOC_PARAM = $(I $0)
+
+ATTRIBUTES = [$0]
+PROT = $0
+STC = $0
+LINKAGE = $0