提交 14d79a0b 编写于 作者: 3 3dgen

Merge branch 'master' of https://gitee.com/wa-lang/wa

......@@ -11,6 +11,7 @@ import (
"wa-lang.org/wa/internal/format"
"wa-lang.org/wa/internal/loader"
"wa-lang.org/wa/internal/logger"
"wa-lang.org/wa/internal/wamime"
)
// 调试参数
......@@ -102,3 +103,8 @@ func FormatCode(filename, code string) (string, error) {
}
return string(data), nil
}
// 获取代码语法类型
func GetCodeSyntax(filename string, code []byte) string {
return wamime.GetCodeMime(filename, code)
}
......@@ -59,3 +59,28 @@ func ExampleRunCode_args() {
// 0 : aa
// 1 : bb
}
func ExampleRunCode_wz() {
const code = `
#syntax=wz
引于 "书"
【启】:
书·说:"你好,凹语言中文版!"
`
output, err := api.RunCode(api.DefaultConfig(), "hello.wa", code)
if err != nil {
if len(output) != 0 {
log.Println(string(output))
}
log.Fatal(err)
}
fmt.Print(string(output))
// Output:
// 你好,凹语言中文版!
}
......@@ -8,7 +8,7 @@ import (
"wa-lang.org/wa/api"
)
func _ExampleFormatCode() {
func ExampleFormatCode() {
s, err := api.FormatCode("hello.wa", "func add(a:i32, b:i32)=>i32 {return a+b}")
if err != nil {
panic(err)
......
......@@ -14,12 +14,25 @@ import (
func Fmt(path string) error {
if path == "" {
path, _ = os.Getwd()
path = "."
}
var waFileList []string
if strings.HasSuffix(path, "...") {
waFileList = getDirWaFileList(strings.TrimSuffix(path, "..."))
switch {
case strings.HasSuffix(path, ".wa"):
waFileList = append(waFileList, path)
case strings.HasSuffix(path, ".wz"):
waFileList = append(waFileList, path)
case strings.HasSuffix(path, "..."):
waFileList = getDirWaFileList(
strings.TrimSuffix(path, "..."),
true, ".wa", ".wz", // 包含子目录
)
default:
// 不包含子目录
waFileList = getDirWaFileList(
path, false, ".wa", ".wz",
)
}
var changedFileList []string
......@@ -51,8 +64,28 @@ func fmtFile(path string) (changed bool, err error) {
return true, nil
}
func getDirWaFileList(dir string) []string {
func getDirWaFileList(dir string, walkSubDir bool, extList ...string) []string {
var waFileList []string
if !walkSubDir {
files, err := os.ReadDir(".")
if err != nil {
return nil
}
for _, file := range files {
if file.IsDir() {
continue
}
for _, ext := range extList {
if strings.HasSuffix(file.Name(), ext) {
waFileList = append(waFileList, filepath.Join(dir, file.Name()))
}
}
}
sort.Strings(waFileList)
return waFileList
}
filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
......@@ -60,8 +93,11 @@ func getDirWaFileList(dir string) []string {
if info.IsDir() {
return nil
}
if strings.HasSuffix(path, ".wa") {
waFileList = append(waFileList, path)
for _, ext := range extList {
if strings.HasSuffix(path, ext) {
waFileList = append(waFileList, path)
return nil
}
}
return nil
})
......
......@@ -3,12 +3,12 @@
package appplay
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"wa-lang.org/wa/api"
"wa-lang.org/wa/internal/wamime"
)
func (p *WebServer) fmtHandler(w http.ResponseWriter, r *http.Request) {
......@@ -30,7 +30,7 @@ func (p *WebServer) fmtHandler(w http.ResponseWriter, r *http.Request) {
func (p *WebServer) fmtCode(code []byte) (*fmtResponse, error) {
filename := "prog.wa"
if bytes.Contains(code, []byte("【启】:")) {
if wamime.GetCodeMime(filename, code) == "wz" {
filename = "prog.wz"
}
......
......@@ -3,7 +3,6 @@
package appplay
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
......@@ -11,6 +10,7 @@ import (
"os"
"wa-lang.org/wa/api"
"wa-lang.org/wa/internal/wamime"
)
func (p *WebServer) runHandler(w http.ResponseWriter, r *http.Request) {
......@@ -43,7 +43,7 @@ func (p *WebServer) compileAndRun(req *Request) (*Response, error) {
defer os.RemoveAll(tmpDir)
filename := "prog.wa"
if bytes.Contains([]byte(req.Body), []byte("【启】:")) {
if wamime.GetCodeMime(filename, []byte(req.Body)) == "wz" {
filename = "prog.wz"
}
......
......@@ -3,8 +3,6 @@
package main
import (
"fmt"
"wa-lang.org/wa/api"
"wa-lang.org/wa/internal/backends/compiler_wat"
"wa-lang.org/wa/internal/config"
......@@ -65,8 +63,6 @@ func waBuildFile(cfg *config.Config, filename string, src interface{}) (wat []by
return nil, err
}
fmt.Println(prog.DebugString())
watOut, err := compiler_wat.New().Compile(prog, "main")
return []byte(watOut), err
}
......@@ -184,7 +184,7 @@ func GetFnMangleName(v interface{}) (internal string, external string) {
switch rt := recv.Type().(type) {
case *types.Named:
internal += GenSymbolName(rt.Obj().Name())
external += rt.Obj().Name()
external += GenSymbolName(rt.Obj().Name())
case *types.Pointer:
btype, ok := rt.Elem().(*types.Named)
......@@ -192,7 +192,7 @@ func GetFnMangleName(v interface{}) (internal string, external string) {
panic("Unreachable")
}
internal += GenSymbolName(btype.Obj().Name())
external += btype.Obj().Name()
external += GenSymbolName(btype.Obj().Name())
default:
panic("Unreachable")
......@@ -205,7 +205,7 @@ func GetFnMangleName(v interface{}) (internal string, external string) {
internal += "."
external += "."
internal += GenSymbolName(f.Name())
external += f.Name()
external += GenSymbolName(f.Name())
case *types.Func:
internal, external = GetPkgMangleName(f.Pkg().Path())
......@@ -216,7 +216,7 @@ func GetFnMangleName(v interface{}) (internal string, external string) {
switch rt := recv.Type().(type) {
case *types.Named:
internal += GenSymbolName(rt.Obj().Name())
external += rt.Obj().Name()
external += GenSymbolName(rt.Obj().Name())
case *types.Pointer:
btype, ok := rt.Elem().(*types.Named)
......@@ -224,7 +224,7 @@ func GetFnMangleName(v interface{}) (internal string, external string) {
panic("Unreachable")
}
internal += GenSymbolName(btype.Obj().Name())
external += btype.Obj().Name()
external += GenSymbolName(btype.Obj().Name())
default:
panic("Unreachable")
......@@ -233,7 +233,7 @@ func GetFnMangleName(v interface{}) (internal string, external string) {
internal += "."
external += "."
internal += GenSymbolName(f.Name())
external += f.Name()
external += GenSymbolName(f.Name())
}
return internal, external
......@@ -251,7 +251,7 @@ func GetPkgMangleName(pkg_path string) (string, string) {
symbol_name += GenSymbolName(p)
symbol_name += "$"
}
exp_name += pkg_path
exp_name += GenSymbolName(pkg_path)
symbol_name += GenSymbolName(pkg_path)
return symbol_name, exp_name
}
......
......@@ -27,6 +27,7 @@ import (
"wa-lang.org/wa/internal/parser"
"wa-lang.org/wa/internal/printer"
"wa-lang.org/wa/internal/token"
"wa-lang.org/wa/internal/wamime"
)
var config = printer.Config{Mode: printer.UseSpaces | printer.TabIndent, Tabwidth: 8}
......@@ -65,11 +66,15 @@ func File(vfs fs.FS, filename string, src interface{}) (text []byte, changed boo
if err != nil {
return nil, false, err
}
golden, err := SourceFile(text)
if !bytes.Equal(text, golden) {
return text, false, nil
// TODO: 支持中文格式化
if wamime.GetCodeMime(filename, text) == "wa" {
golden, err := SourceFile(text)
if bytes.Equal(text, golden) {
return text, false, nil
}
return golden, true, err
}
return golden, true, nil
return text, false, nil
}
// Node formats node in canonical gofmt style and writes the result to dst.
......
......@@ -20,6 +20,7 @@ import (
"wa-lang.org/wa/internal/ssa"
"wa-lang.org/wa/internal/token"
"wa-lang.org/wa/internal/types"
"wa-lang.org/wa/internal/wamime"
"wa-lang.org/wa/waroot"
)
......@@ -462,7 +463,7 @@ func (p *_Loader) ParseDir(pkgpath string) (filenames []string, files []*ast.Fil
for i, filename := range filenames {
var f *ast.File
if p.hasExt(filename, ".wz") {
if wamime.GetCodeMime(filename, datas[i]) == "wz" {
f, err = wzparser.ParseFile(nil, p.prog.Fset, filename, datas[i], wzparser.AllErrors|wzparser.ParseComments)
} else {
f, err = parser.ParseFile(nil, p.prog.Fset, filename, datas[i], parser.AllErrors|parser.ParseComments)
......
// 版权 @2023 凹语言 作者。保留所有权利。
package wamime
import (
"strings"
"wa-lang.org/wa/internal/scanner"
"wa-lang.org/wa/internal/token"
)
const mimePrefix = "#syntax=" // #syntax=wa, #syntax=wz
func GetCodeMime(filename string, code []byte) string {
var s scanner.Scanner
fset := token.NewFileSet()
file := fset.AddFile(filename, fset.Base(), len(code))
s.Init(file, code, nil, scanner.ScanComments)
// 解析 #syntax=xx
for {
_, tok, lit := s.Scan()
if tok != token.COMMENT {
break
}
if strings.HasPrefix(lit, mimePrefix) {
if mime := lit[len(mimePrefix):]; mime != "" {
return mime
}
return ""
}
}
// 根据文件名后缀解析
if i := strings.LastIndex(filename, "."); i > 0 {
if s := filename[i+1:]; s != "" {
return s
}
}
// 未知类型
return ""
}
// 版权 @2023 凹语言 作者。保留所有权利。
package wamime
import (
"testing"
)
func TestGetCodeMime(t *testing.T) {
for i, tx := range tests {
got := GetCodeMime(tx.filename, []byte(tx.code))
expect := tx.mime
if got != expect {
t.Fatalf("%d: expect =%q, got = %q", i, expect, got)
}
}
}
var tests = []struct {
filename string
code string
mime string
}{
{"-", "", ""},
{"prog.wa", "", "wa"},
{"prog.wz", "", "wz"},
{"x.wa", "#", "wa"},
{"", "#syntax=wx", "wx"},
{
"",
`// 版权 @2019 凹语言 作者。保留所有权利。
#syntax=wa
import "fmt"
import "runtime"
global year: i32 = 2023
func main {
println("你好,凹语言!", runtime.WAOS)
println(add(40, 2), year)
fmt.Println("1+1 =", 1+1)
}
func add(a: i32, b: i32) => i32 {
return a+b
}
`,
"wa",
},
{
"",
`// 版权 @2019 凹语言 作者。保留所有权利。
#syntax=wz
引于 "书"
【启】:
书·说:"你好,凹语言中文版!"
`,
"wz",
},
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册