]> Cypherpunks repositories - gostls13.git/commitdiff
more comment work.
authorRuss Cox <rsc@golang.org>
Tue, 6 Oct 2009 22:28:47 +0000 (15:28 -0700)
committerRuss Cox <rsc@golang.org>
Tue, 6 Oct 2009 22:28:47 +0000 (15:28 -0700)
got rid of regexps.
primary bug fix is that // inside /* */ do not get stripped anymore,
so that the text inside

/*
int a;
// int b;
int c;
*/

is

int a;
// int b;
int c;

before, the "int b;" line was being uncommented too.

R=gri
DELTA=65  (13 added, 42 deleted, 10 changed)
OCL=35334
CL=35404

src/pkg/go/doc/comment.go

index ea361f851fba916ef9fec84bddd4efccfbf5a22a..d83857c0c4d1542188f42a26e18575435bcaae78 100644 (file)
@@ -9,36 +9,12 @@ package doc
 import (
        "go/ast";
        "io";
-       "once";
-       "regexp";
        "strings";
        "template";     // for htmlEscape
 )
 
 // Comment extraction
 
-var (
-       comment_markers *regexp.Regexp;
-       trailing_whitespace *regexp.Regexp;
-       comment_junk *regexp.Regexp;
-)
-
-func makeRex(s string) *regexp.Regexp {
-       re, err := regexp.Compile(s);
-       if err != nil {
-               panic("MakeRegexp ", s, " ", err.String());
-       }
-       return re;
-}
-
-// TODO(rsc): Cannot use var initialization for regexps,
-// because Regexp constructor needs threads.
-func setupRegexps() {
-       comment_markers = makeRex("^/[/*] ?");
-       trailing_whitespace = makeRex("[ \t\r]+$");
-       comment_junk = makeRex("^[ \t]*(/\\*|\\*/)[ \t]*$");
-}
-
 // CommentText returns the text of comment,
 // with the comment markers - //, /*, and */ - removed.
 func CommentText(comment *ast.CommentGroup) string {
@@ -50,39 +26,34 @@ func CommentText(comment *ast.CommentGroup) string {
                comments[i] = string(c.Text);
        }
 
-       once.Do(setupRegexps);
        lines := make([]string, 0, 20);
        for _, c := range comments {
-               // split on newlines
-               cl := strings.Split(c, "\n", 0);
-
-               // walk lines, stripping comment markers
-               w := 0;
-               for _, l := range cl {
-                       // remove /* and */ lines
-                       if comment_junk.MatchString(l) {
-                               continue;
+               // Remove comment markers.
+               // The parser has given us exactly the comment text.
+               switch n := len(c); {
+               case n >= 4 && c[0:2] == "/*" && c[n-2:n] == "*/":
+                       c = c[2:n-2];
+               case n >= 2 && c[0:2] == "//":
+                       c = c[2:n];
+                       // Remove leading space after //, if there is one.
+                       if len(c) > 0 && c[0] == ' ' {
+                               c = c[1:len(c)];
                        }
+               }
 
-                       // strip trailing white space
-                       m := trailing_whitespace.ExecuteString(l);
-                       if len(m) > 0 {
-                               l = l[0 : m[1]];
-                       }
+               // Split on newlines.
+               cl := strings.Split(c, "\n", 0);
 
-                       // strip leading comment markers
-                       m = comment_markers.ExecuteString(l);
-                       if len(m) > 0 {
-                               l = l[m[1] : len(l)];
+               // Walk lines, stripping trailing white space and adding to list.
+               for _, l := range cl {
+                       // Strip trailing white space
+                       m := len(l);
+                       for m > 0 && (l[m-1] == ' ' || l[m-1] == '\n' || l[m-1] == '\t' || l[m-1] == '\r') {
+                               m--;
                        }
+                       l = l[0 : m];
 
-                       cl[w] = l;
-                       w++;
-               }
-               cl = cl[0:w];
-
-               // Add this comment to total list.
-               for _, l := range cl {
+                       // Add to list.
                        n := len(lines);
                        if n+1 >= cap(lines) {
                                newlines := make([]string, n, 2*cap(lines));