// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package Compilation import "array" import OS "os" import Platform "platform" import Scanner "scanner" import Parser "parser" import AST "ast" func assert(b bool) { if !b { panic("assertion failed"); } } export type Flags struct { verbose bool; sixg bool; deps bool; columns bool; testmode bool; tokenchan bool; } export func Compile(src_file string, flags *Flags) (*AST.Program, int) { src, ok := Platform.ReadSourceFile(src_file); if !ok { print("cannot open ", src_file, "\n"); return nil, 1; } var scanner Scanner.Scanner; scanner.Open(src_file, src, flags.columns, flags.testmode); var tstream *<-chan *Scanner.Token; if flags.tokenchan { tstream = scanner.TokenStream(); } var parser Parser.Parser; parser.Open(flags.verbose, flags.sixg, flags.deps, &scanner, tstream); prog := parser.ParseProgram(); return prog, scanner.nerrors; } func FileExists(name string) bool { fd, err := OS.Open(name, OS.O_RDONLY, 0); if err == nil { fd.Close(); return true; } return false; } func AddDeps(globalset *map [string] bool, wset *array.Array, src_file string, flags *Flags) { dummy, found := globalset[src_file]; if !found { globalset[src_file] = true; prog, nerrors := Compile(src_file, flags); if nerrors > 0 { return; } nimports := prog.decls.Len(); if nimports > 0 { print(src_file, ".6:\t"); localset := new(map [string] bool); for i := 0; i < nimports; i++ { decl := prog.decls.At(i).(*AST.Decl); assert(decl.tok == Scanner.IMPORT && decl.val.tok == Scanner.STRING); src := decl.val.s; src = src[1 : len(src) - 1]; // strip "'s // ignore files when they are seen a 2nd time dummy, found := localset[src]; if !found { localset[src] = true; if FileExists(src + ".go") { wset.Push(src); print(" ", src, ".6"); } else if FileExists(Platform.GOROOT + "/pkg/" + src + ".6") || FileExists(Platform.GOROOT + "/pkg/" + src + ".a") { } else { // TODO should collect these and print later //print("missing file: ", src, "\n"); } } } print("\n\n"); } } } export func ComputeDeps(src_file string, flags *Flags) { globalset := new(map [string] bool); wset := array.New(0); wset.Push(src_file); for wset.Len() > 0 { AddDeps(globalset, wset, wset.Pop().(string), flags); } }