mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
compiler: Add error output to the compiler (#3935)
This commit is contained in:
@@ -1,80 +1,120 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
|
||||
"github.com/github/linguist/tools/grammars/compiler"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
var linguistRoot = flag.String("linguist", "", "path to Linguist installation")
|
||||
var protoOut = flag.String("proto", "", "dump Protobuf library")
|
||||
var jsonOut = flag.String("json", "", "dump JSON output")
|
||||
var addGrammar = flag.String("add", "", "add a new grammar source")
|
||||
var updateList = flag.Bool("update", false, "update grammars.yml instead of verifying its contents")
|
||||
var report = flag.String("report", "", "write report to file")
|
||||
func cwd() string {
|
||||
cwd, _ := os.Getwd()
|
||||
return cwd
|
||||
}
|
||||
|
||||
func fatal(err error) {
|
||||
fmt.Fprintf(os.Stderr, "FATAL: %s\n", err)
|
||||
os.Exit(1)
|
||||
func wrap(err error) error {
|
||||
return cli.NewExitError(err, 255)
|
||||
}
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
app := cli.NewApp()
|
||||
app.Name = "Linguist Grammars Compiler"
|
||||
app.Usage = "Compile user-submitted grammars and check them for errors"
|
||||
|
||||
if _, err := exec.LookPath("csonc"); err != nil {
|
||||
fatal(err)
|
||||
app.Flags = []cli.Flag{
|
||||
cli.StringFlag{
|
||||
Name: "linguist-path",
|
||||
Value: cwd(),
|
||||
Usage: "path to Linguist root",
|
||||
},
|
||||
}
|
||||
|
||||
if *linguistRoot == "" {
|
||||
cwd, err := os.Getwd()
|
||||
if err != nil {
|
||||
fatal(err)
|
||||
}
|
||||
*linguistRoot = cwd
|
||||
app.Commands = []cli.Command{
|
||||
{
|
||||
Name: "add",
|
||||
Usage: "add a new grammar source",
|
||||
Flags: []cli.Flag{
|
||||
cli.BoolFlag{
|
||||
Name: "force, f",
|
||||
Usage: "ignore compilation errors",
|
||||
},
|
||||
},
|
||||
Action: func(c *cli.Context) error {
|
||||
conv, err := compiler.NewConverter(c.String("linguist-path"))
|
||||
if err != nil {
|
||||
return wrap(err)
|
||||
}
|
||||
if err := conv.AddGrammar(c.Args().First()); err != nil {
|
||||
if !c.Bool("force") {
|
||||
return wrap(err)
|
||||
}
|
||||
}
|
||||
if err := conv.WriteGrammarList(); err != nil {
|
||||
return wrap(err)
|
||||
}
|
||||
return nil
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "update",
|
||||
Usage: "update grammars.yml with the contents of the grammars library",
|
||||
Flags: []cli.Flag{
|
||||
cli.BoolFlag{
|
||||
Name: "force, f",
|
||||
Usage: "write grammars.yml even if grammars fail to compile",
|
||||
},
|
||||
},
|
||||
Action: func(c *cli.Context) error {
|
||||
conv, err := compiler.NewConverter(c.String("linguist-path"))
|
||||
if err != nil {
|
||||
return wrap(err)
|
||||
}
|
||||
if err := conv.ConvertGrammars(true); err != nil {
|
||||
return wrap(err)
|
||||
}
|
||||
if err := conv.Report(); err != nil {
|
||||
if !c.Bool("force") {
|
||||
return wrap(err)
|
||||
}
|
||||
}
|
||||
if err := conv.WriteGrammarList(); err != nil {
|
||||
return wrap(err)
|
||||
}
|
||||
return nil
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "compile",
|
||||
Usage: "convert the grammars from the library",
|
||||
Flags: []cli.Flag{
|
||||
cli.StringFlag{Name: "proto-out, P"},
|
||||
cli.StringFlag{Name: "out, o"},
|
||||
},
|
||||
Action: func(c *cli.Context) error {
|
||||
conv, err := compiler.NewConverter(c.String("linguist-path"))
|
||||
if err != nil {
|
||||
return cli.NewExitError(err, 1)
|
||||
}
|
||||
if err := conv.ConvertGrammars(false); err != nil {
|
||||
return cli.NewExitError(err, 1)
|
||||
}
|
||||
if out := c.String("proto-out"); out != "" {
|
||||
if err := conv.WriteProto(out); err != nil {
|
||||
return cli.NewExitError(err, 1)
|
||||
}
|
||||
}
|
||||
if out := c.String("out"); out != "" {
|
||||
if err := conv.WriteJSON(out); err != nil {
|
||||
return cli.NewExitError(err, 1)
|
||||
}
|
||||
}
|
||||
if err := conv.Report(); err != nil {
|
||||
return wrap(err)
|
||||
}
|
||||
return nil
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
conv, err := compiler.NewConverter(*linguistRoot)
|
||||
if err != nil {
|
||||
fatal(err)
|
||||
}
|
||||
|
||||
if *addGrammar != "" {
|
||||
if err := conv.AddGrammar(*addGrammar); err != nil {
|
||||
fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
if err := conv.ConvertGrammars(*updateList); err != nil {
|
||||
fatal(err)
|
||||
}
|
||||
|
||||
if err := conv.WriteGrammarList(); err != nil {
|
||||
fatal(err)
|
||||
}
|
||||
|
||||
if *protoOut != "" {
|
||||
if err := conv.WriteProto(*protoOut); err != nil {
|
||||
fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
if *jsonOut != "" {
|
||||
if err := conv.WriteJSON(*jsonOut); err != nil {
|
||||
fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
if *report == "" {
|
||||
conv.Report(os.Stderr)
|
||||
} else {
|
||||
f, err := os.Create(*report)
|
||||
if err != nil {
|
||||
fatal(err)
|
||||
}
|
||||
conv.Report(f)
|
||||
f.Close()
|
||||
}
|
||||
app.Run(os.Args)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user