2008-07-15 16:37:14 -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-08-11 10:45:40 -06:00
|
|
|
import Platform "platform"
|
2008-07-29 20:02:49 -06:00
|
|
|
import Utils "utils"
|
2008-07-15 16:37:14 -06:00
|
|
|
import Globals "globals"
|
|
|
|
import Object "object"
|
|
|
|
import Type "type"
|
2008-07-15 20:59:00 -06:00
|
|
|
import Universe "universe"
|
2008-07-15 16:37:14 -06:00
|
|
|
import Scanner "scanner"
|
2008-07-18 18:18:29 -06:00
|
|
|
import AST "ast"
|
2008-07-15 16:37:14 -06:00
|
|
|
import Parser "parser"
|
2008-08-11 10:45:40 -06:00
|
|
|
import Importer "import"
|
|
|
|
import Exporter "export"
|
2008-07-30 14:01:28 -06:00
|
|
|
import Printer "printer"
|
2008-07-30 22:26:15 -06:00
|
|
|
import Verifier "verifier"
|
2008-07-15 16:37:14 -06:00
|
|
|
|
|
|
|
|
2008-08-11 10:45:40 -06:00
|
|
|
func ReadImport(comp* Globals.Compilation, filename string, update bool) (data string, ok bool) {
|
|
|
|
if filename == "" {
|
|
|
|
panic "illegal package file name";
|
|
|
|
}
|
|
|
|
|
|
|
|
// see if it just works
|
|
|
|
data, ok = Platform.ReadObjectFile(filename);
|
|
|
|
if ok {
|
|
|
|
return data, ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
if filename[0] == '/' {
|
|
|
|
// absolute path
|
|
|
|
panic `don't know how to handle absolute import file path "` + filename + `"`;
|
|
|
|
}
|
|
|
|
|
|
|
|
// relative path
|
|
|
|
// try relative to the $GOROOT/pkg directory
|
|
|
|
std_filename := Platform.GOROOT + "/pkg/" + filename;
|
|
|
|
data, ok = Platform.ReadObjectFile(std_filename);
|
|
|
|
if ok {
|
|
|
|
return data, ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
if !update {
|
|
|
|
return "", false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO BIG HACK - fix this!
|
|
|
|
// look for a src file
|
|
|
|
// see if it just works
|
|
|
|
data, ok = Platform.ReadSourceFile(filename);
|
|
|
|
if ok {
|
|
|
|
comp.env.Compile(comp.flags, comp.env, filename + Platform.src_file_ext);
|
|
|
|
data, ok = ReadImport(comp, filename, false);
|
|
|
|
if ok {
|
|
|
|
return data, ok;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return "", false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export func Import(comp *Globals.Compilation, pkg_file string) *Globals.Package {
|
|
|
|
data, ok := ReadImport(comp, pkg_file, comp.flags.update_packages)
|
|
|
|
var pkg *Globals.Package;
|
|
|
|
if ok {
|
|
|
|
pkg = Importer.Import(comp, data);
|
|
|
|
}
|
|
|
|
return pkg;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export func Export(comp *Globals.Compilation) string {
|
|
|
|
panic "UNIMPLEMENTED";
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export func Compile(flags *Globals.Flags, env* Globals.Environment, filename string) {
|
2008-08-07 20:32:22 -06:00
|
|
|
// setup compilation
|
|
|
|
comp := new(Globals.Compilation);
|
|
|
|
comp.flags = flags;
|
2008-08-11 10:45:40 -06:00
|
|
|
comp.env = env;
|
2008-08-07 20:32:22 -06:00
|
|
|
|
|
|
|
src, ok := sys.readfile(filename);
|
2008-07-15 20:59:00 -06:00
|
|
|
if !ok {
|
2008-08-07 20:32:22 -06:00
|
|
|
print "cannot open ", filename, "\n"
|
2008-07-15 20:59:00 -06:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2008-08-11 10:45:40 -06:00
|
|
|
if flags.verbosity > 0 {
|
|
|
|
print filename, "\n";
|
|
|
|
}
|
|
|
|
|
2008-07-17 19:02:10 -06:00
|
|
|
scanner := new(Scanner.Scanner);
|
2008-08-07 20:32:22 -06:00
|
|
|
scanner.Open(filename, src);
|
2008-08-06 19:57:37 -06:00
|
|
|
|
|
|
|
var tstream *chan *Scanner.Token;
|
2008-08-07 20:32:22 -06:00
|
|
|
if comp.flags.token_chan {
|
2008-08-06 19:57:37 -06:00
|
|
|
tstream = new(chan *Scanner.Token, 100);
|
|
|
|
go scanner.Server(tstream);
|
|
|
|
}
|
2008-07-15 20:59:00 -06:00
|
|
|
|
2008-07-17 19:02:10 -06:00
|
|
|
parser := new(Parser.Parser);
|
2008-08-06 19:57:37 -06:00
|
|
|
parser.Open(comp, scanner, tstream);
|
2008-07-17 19:02:10 -06:00
|
|
|
|
|
|
|
parser.ParseProgram();
|
|
|
|
if parser.S.nerrors > 0 {
|
|
|
|
return;
|
|
|
|
}
|
2008-07-15 20:59:00 -06:00
|
|
|
|
2008-08-07 20:32:22 -06:00
|
|
|
if !comp.flags.ast {
|
2008-07-30 22:26:15 -06:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Verifier.Verify(comp);
|
|
|
|
|
2008-08-07 20:32:22 -06:00
|
|
|
if comp.flags.print_interface {
|
2008-08-04 11:19:36 -06:00
|
|
|
Printer.PrintObject(comp, comp.pkg_list[0].obj, false);
|
2008-07-30 18:36:03 -06:00
|
|
|
}
|
2008-07-30 22:26:15 -06:00
|
|
|
|
2008-08-11 10:45:40 -06:00
|
|
|
Exporter.Export(comp, filename);
|
2008-07-15 16:37:14 -06:00
|
|
|
}
|