Merge pull request #181 from Nan-Zhang/support-integer

Support parsing int64 number in Blueprint file
diff --git a/microfactory/microfactory.go b/microfactory/microfactory.go
index 95c39c0..83c48b3 100644
--- a/microfactory/microfactory.go
+++ b/microfactory/microfactory.go
@@ -47,6 +47,7 @@
 	"flag"
 	"fmt"
 	"go/ast"
+	"go/build"
 	"go/parser"
 	"go/token"
 	"io"
@@ -199,6 +200,62 @@
 	return nil
 }
 
+// Roughly equivalent to go/build.Context.match
+func matchBuildTag(name string) bool {
+	if name == "" {
+		return false
+	}
+	if i := strings.Index(name, ","); i >= 0 {
+		ok1 := matchBuildTag(name[:i])
+		ok2 := matchBuildTag(name[i+1:])
+		return ok1 && ok2
+	}
+	if strings.HasPrefix(name, "!!") {
+		return false
+	}
+	if strings.HasPrefix(name, "!") {
+		return len(name) > 1 && !matchBuildTag(name[1:])
+	}
+
+	if name == runtime.GOOS || name == runtime.GOARCH || name == "gc" {
+		return true
+	}
+	for _, tag := range build.Default.BuildTags {
+		if tag == name {
+			return true
+		}
+	}
+	for _, tag := range build.Default.ReleaseTags {
+		if tag == name {
+			return true
+		}
+	}
+
+	return false
+}
+
+func parseBuildComment(comment string) (matches, ok bool) {
+	if !strings.HasPrefix(comment, "//") {
+		return false, false
+	}
+	for i, c := range comment {
+		if i < 2 || c == ' ' || c == '\t' {
+			continue
+		} else if c == '+' {
+			f := strings.Fields(comment[i:])
+			if f[0] == "+build" {
+				matches = false
+				for _, tok := range f[1:] {
+					matches = matches || matchBuildTag(tok)
+				}
+				return matches, true
+			}
+		}
+		break
+	}
+	return false, false
+}
+
 // findDeps is the recursive version of FindDeps. allPackages is the map of
 // all locally defined packages so that the same dependency of two different
 // packages is only resolved once.
@@ -217,7 +274,7 @@
 			return false
 		}
 		return true
-	}, parser.ImportsOnly)
+	}, parser.ImportsOnly|parser.ParseComments)
 	if err != nil {
 		return fmt.Errorf("Error parsing directory %q: %v", path, err)
 	}
@@ -236,6 +293,18 @@
 	localDeps := make(map[string]bool)
 
 	for filename, astFile := range foundPkg.Files {
+		ignore := false
+		for _, commentGroup := range astFile.Comments {
+			for _, comment := range commentGroup.List {
+				if matches, ok := parseBuildComment(comment.Text); ok && !matches {
+					ignore = true
+				}
+			}
+		}
+		if ignore {
+			continue
+		}
+
 		p.files = append(p.files, filename)
 
 		for _, importSpec := range astFile.Imports {