Skip to content

Commit 2016098

Browse files
committed
Code generate a .go file for the prelude and the minified prelude
1 parent 357a198 commit 2016098

File tree

5 files changed

+2343
-43
lines changed

5 files changed

+2343
-43
lines changed

compiler/prelude/generate.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package prelude
2+
3+
//go:generate go run formatpreludejs.go
4+
//go:generate go run genprelude.go

compiler/prelude/genprelude.go

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@
33
package main
44

55
import (
6+
"bytes"
67
"fmt"
78
"go/build"
89
"io/ioutil"
910
"log"
1011
"os/exec"
1112
"path/filepath"
1213
"strings"
13-
14-
"github.com/gopherjs/gopherjs/compiler/prelude"
1514
)
1615

1716
const (
18-
fn = "prelude.go"
17+
fn = "prelude.go"
18+
minFn = "prelude_min.go"
1919
)
2020

2121
func main() {
@@ -32,24 +32,67 @@ func run() error {
3232

3333
preludeDir := filepath.Join(bpkg.Dir, "compiler", "prelude")
3434

35-
args := []string{
35+
files := []string{
36+
"prelude.js",
37+
"numeric.js",
38+
"types.js",
39+
"goroutines.js",
40+
"jsmapping.js",
41+
}
42+
43+
prelude := new(bytes.Buffer)
44+
45+
for _, f := range files {
46+
p := filepath.Join(preludeDir, f)
47+
byts, err := ioutil.ReadFile(p)
48+
if err != nil {
49+
return fmt.Errorf("failed to read from %v: %v", p, err)
50+
}
51+
if _, err := prelude.Write(byts); err != nil {
52+
return fmt.Errorf("failed to append prelude: %v", err)
53+
}
54+
}
55+
56+
args := append([]string{
3657
filepath.Join(bpkg.Dir, "node_modules", ".bin", "uglifyjs"),
3758
"--config-file",
3859
filepath.Join(preludeDir, "uglifyjs_options.json"),
39-
}
60+
}, files...)
61+
4062
cmd := exec.Command(args[0], args[1:]...)
41-
cmd.Stdin = strings.NewReader(prelude.Prelude)
4263

4364
out, err := cmd.CombinedOutput()
4465
if err != nil {
4566
return fmt.Errorf("failed to run %v: %v\n%s", strings.Join(args, " "), err, string(out))
4667
}
4768

48-
out = append([]byte("// Code generated by genmin. DO NOT EDIT.\n\n"), out...)
69+
err = writeOutput("prelude.go", ""+
70+
"// Prelude is the GopherJS JavaScript interop layer that is behind\n"+
71+
"// the github.com/gopherjs/gopherjs/js package\n"+
72+
"const Prelude = `"+escapeBacktick(prelude.Bytes())+"`")
4973

50-
if err := ioutil.WriteFile(fn, out, 0644); err != nil {
74+
if err != nil {
75+
return err
76+
}
77+
78+
err = writeOutput("prelude_min.go", ""+
79+
"// Minified is an uglifyjs-minified version of Prelude\n"+
80+
"const Minified = `"+escapeBacktick(out)+"`\n")
81+
82+
return err
83+
}
84+
85+
func writeOutput(fn string, s string) error {
86+
content := "// Code generated by genprelude. DO NOT EDIT.\n\n" +
87+
"package prelude\n" + s + "\n"
88+
89+
if err := ioutil.WriteFile(fn, []byte(content), 0644); err != nil {
5190
return fmt.Errorf("failed to write to %v: %v", fn, err)
5291
}
5392

5493
return nil
5594
}
95+
96+
func escapeBacktick(byts []byte) string {
97+
return strings.Replace(string(byts), "`", "\\u0060", -1)
98+
}

0 commit comments

Comments
 (0)