2008-10-24 15:08:01 -06:00
|
|
|
// 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
|
|
|
|
|
2008-10-26 22:32:30 -06:00
|
|
|
import OS "os"
|
|
|
|
import Platform "platform"
|
2008-10-24 15:08:01 -06:00
|
|
|
import Scanner "scanner"
|
|
|
|
import Parser "parser"
|
|
|
|
import AST "ast"
|
|
|
|
|
|
|
|
|
2008-10-26 22:32:30 -06:00
|
|
|
func assert(b bool) {
|
|
|
|
if !b {
|
|
|
|
panic("assertion failed");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-10-24 15:08:01 -06:00
|
|
|
|
|
|
|
export type Flags struct {
|
|
|
|
verbose bool;
|
|
|
|
sixg bool;
|
|
|
|
deps bool;
|
|
|
|
columns bool;
|
|
|
|
testmode bool;
|
|
|
|
tokenchan bool;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-10-26 22:32:30 -06:00
|
|
|
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;
|
|
|
|
}
|
2008-10-24 15:08:01 -06:00
|
|
|
|
|
|
|
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;
|
2008-10-26 22:32:30 -06:00
|
|
|
parser.Open(flags.verbose, flags.sixg, flags.deps, &scanner, tstream);
|
|
|
|
|
|
|
|
prog := parser.ParseProgram();
|
|
|
|
return prog, scanner.nerrors;
|
|
|
|
}
|
|
|
|
|
2008-10-24 15:08:01 -06:00
|
|
|
|
2008-10-26 22:32:30 -06:00
|
|
|
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 *AST.List, 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.Add(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 := AST.NewList();
|
|
|
|
wset.Add(src_file);
|
|
|
|
for wset.len() > 0 {
|
|
|
|
AddDeps(globalset, wset, wset.Pop().(string), flags);
|
|
|
|
}
|
2008-10-24 15:08:01 -06:00
|
|
|
}
|