changeset 714:140469ecb90e

Added code and applied fixes. Added getDDocText() and isLineComment(). Renamed getDocComments() to getDocTokens(). Fixed it as well. printSymbolTable() is called recursively now. Fixed genAnonymousID().
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Thu, 31 Jan 2008 01:10:30 +0100
parents 1bfae3480fdc
children b6c6baa41267
files trunk/src/dil/doc/Doc.d trunk/src/dil/lexer/IdTable.d trunk/src/dil/semantic/Pass1.d trunk/src/main.d
diffstat 4 files changed, 39 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/dil/doc/Doc.d	Wed Jan 30 23:23:58 2008 +0100
+++ b/trunk/src/dil/doc/Doc.d	Thu Jan 31 01:10:30 2008 +0100
@@ -23,12 +23,14 @@
   Note: this function works correctly only if
         the source text is syntactically correct.
 +/
-Token*[] getDocComments(Node node, bool function(Token*) isDocComment = &isDDocComment)
+Token*[] getDocTokens(Node node, bool function(Token*) isDocComment = &isDDocComment)
 {
   Token*[] comments;
+  auto isEnumMember = node.kind == NodeKind.EnumMemberDeclaration;
   // Get preceding comments.
   auto token = node.begin;
   // Scan backwards until we hit another declaration.
+Loop:
   while (1)
   {
     token = token.prev;
@@ -36,21 +38,18 @@
         token.kind == TOK.RBrace ||
         token.kind == TOK.Semicolon ||
         token.kind == TOK.HEAD ||
-        (node.kind == NodeKind.EnumMemberDeclaration && token.kind == TOK.Comma))
+        (isEnumMember && token.kind == TOK.Comma))
       break;
 
     if (token.kind == TOK.Comment)
-    {
-      // Check that this comment doesn't belong to the previous declaration.
-      if (node.kind == NodeKind.EnumMemberDeclaration && token.kind == TOK.Comma)
-        break;
+    { // Check that this comment doesn't belong to the previous declaration.
       switch (token.prev.kind)
       {
-      case TOK.Semicolon, TOK.RBrace:
-        break;
+      case TOK.Semicolon, TOK.RBrace, TOK.Comma:
+        break Loop;
       default:
         if (isDocComment(token))
-          comments ~= token;
+          comments = [token] ~ comments;
       }
     }
   }
@@ -58,7 +57,7 @@
   token = node.end.next;
   if (token.kind == TOK.Comment && isDocComment(token))
     comments ~= token;
-  else if (node.kind == NodeKind.EnumMemberDeclaration)
+  else if (isEnumMember)
   {
     token = node.end.nextNWS;
     if (token.kind == TOK.Comma)
@@ -71,12 +70,31 @@
   return comments;
 }
 
+bool isLineComment(Token* t)
+{
+  assert(t.kind == TOK.Comment);
+  return t.start[1] == '/';
+}
+
+/// Extracts the text body of the comment tokens.
+string getDDocText(Token*[] tokens)
+{
+  string result;
+  foreach (token; tokens)
+  {
+    auto n = isLineComment(token) ? 0 : 2; // 0 for "//", 2 for "+/" and "*/".
+    result ~= sanitize(token.srcText[3 .. $-n], token.start[1]);
+  }
+  return result;
+}
+
 bool isspace(char c)
 {
   return c == ' ' || c == '\t' || c == '\v' || c == '\f';
 }
 
 /// Sanitizes a DDoc comment string.
+/// Leading "commentChar"s are removed from the lines.
 /// The various newline types are converted to '\n'.
 /// Params:
 ///   comment = the string to be sanitized.
--- a/trunk/src/dil/lexer/IdTable.d	Wed Jan 30 23:23:58 2008 +0100
+++ b/trunk/src/dil/lexer/IdTable.d	Thu Jan 31 01:10:30 2008 +0100
@@ -129,15 +129,16 @@
   +/
 
   static uint anonCount;
-  Identifier* genAnonymousID(char[] str)
+  Identifier* genAnonymousID(char[] prefix)
   {
     ++anonCount;
     auto x = anonCount;
     // Convert count to a string and append it to str.
+    char[] num;
     do
-      str = cast(char)('0' + (x % 10)) ~ str;
+      num = cast(char)('0' + (x % 10)) ~ num;
     while (x /= 10)
-    return Identifier(str, TOK.Identifier);
+    return Identifier(prefix ~ num, TOK.Identifier);
   }
 
   Identifier* genAnonEnumID()
--- a/trunk/src/dil/semantic/Pass1.d	Wed Jan 30 23:23:58 2008 +0100
+++ b/trunk/src/dil/semantic/Pass1.d	Thu Jan 31 01:10:30 2008 +0100
@@ -201,7 +201,7 @@
     auto isAnonymous = d.name is null;
     if (isAnonymous)
       d.symbol.name = IdTable.genAnonEnumID();
-    insert(d.symbol, d.name);
+    insert(d.symbol, d.symbol.name);
     auto parentScopeSymbol = scop.symbol;
     enterScope(d.symbol);
     // Declare members.
--- a/trunk/src/main.d	Wed Jan 30 23:23:58 2008 +0100
+++ b/trunk/src/main.d	Thu Jan 31 01:10:30 2008 +0100
@@ -63,19 +63,21 @@
       auto pass1 = new SemanticPass1(mod);
       pass1.start();
 
-      void printSymbolTable(ScopeSymbol scopeSym)
+      void printSymbolTable(ScopeSymbol scopeSym, char[] indent)
       {
         foreach (member; scopeSym.members)
         {
-          auto tokens = getDocComments(member.node);
+          auto tokens = getDocTokens(member.node);
           char[] docText;
           foreach (token; tokens)
             docText ~= token.srcText;
-          Stdout.formatln("Id:{}, Symbol:{}, DocText:{}", member.name.str, member.classinfo.name, docText);
+          Stdout(indent).formatln("Id:{}, Symbol:{}, DocText:{}", member.name.str, member.classinfo.name, docText);
+          if (auto s = cast(ScopeSymbol)member)
+            printSymbolTable(s, indent ~ "→ ");
         }
       }
 
-      printSymbolTable(mod);
+      printSymbolTable(mod, "");
     }
 
     printErrors(infoMan);