diff trunk/src/dil/doc/Doc.d @ 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 f8875ef9a66d
children 08e6174a2e1c
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.