Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wa-lang
wa
提交
14d79a0b
wa
项目概览
wa-lang
/
wa
9 个月 前同步成功
通知
68
Star
655
Fork
45
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
wa
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
14d79a0b
编写于
6月 27, 2023
作者:
3
3dgen
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of
https://gitee.com/wa-lang/wa
上级
6cf3f999
a61c9d83
变更
12
隐藏空白更改
内联
并排
Showing
12 changed file
with
210 addition
and
27 deletion
+210
-27
api/api.go
api/api.go
+6
-0
api/api_nowasm_test.go
api/api_nowasm_test.go
+25
-0
api/api_test.go
api/api_test.go
+1
-1
internal/app/appfmt/appfmt.go
internal/app/appfmt/appfmt.go
+42
-6
internal/app/appplay/server_fmt.go
internal/app/appplay/server_fmt.go
+2
-2
internal/app/appplay/server_run.go
internal/app/appplay/server_run.go
+2
-2
internal/app/wawasm/base.go
internal/app/wawasm/base.go
+0
-4
internal/backends/compiler_wat/wir/util.go
internal/backends/compiler_wat/wir/util.go
+7
-7
internal/format/format.go
internal/format/format.go
+9
-4
internal/loader/loader.go
internal/loader/loader.go
+2
-1
internal/wamime/wamime.go
internal/wamime/wamime.go
+43
-0
internal/wamime/wamime_test.go
internal/wamime/wamime_test.go
+71
-0
未找到文件。
api/api.go
浏览文件 @
14d79a0b
...
...
@@ -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
)
}
api/api_nowasm_test.go
浏览文件 @
14d79a0b
...
...
@@ -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:
// 你好,凹语言中文版!
}
api/api_test.go
浏览文件 @
14d79a0b
...
...
@@ -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
)
...
...
internal/app/appfmt/appfmt.go
浏览文件 @
14d79a0b
...
...
@@ -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
})
...
...
internal/app/appplay/server_fmt.go
浏览文件 @
14d79a0b
...
...
@@ -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"
}
...
...
internal/app/appplay/server_run.go
浏览文件 @
14d79a0b
...
...
@@ -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"
}
...
...
internal/app/wawasm/base.go
浏览文件 @
14d79a0b
...
...
@@ -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
}
internal/backends/compiler_wat/wir/util.go
浏览文件 @
14d79a0b
...
...
@@ -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
}
...
...
internal/format/format.go
浏览文件 @
14d79a0b
...
...
@@ -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
,
tru
e
,
nil
return
text
,
fals
e
,
nil
}
// Node formats node in canonical gofmt style and writes the result to dst.
...
...
internal/loader/loader.go
浏览文件 @
14d79a0b
...
...
@@ -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
)
...
...
internal/wamime/wamime.go
0 → 100644
浏览文件 @
14d79a0b
// 版权 @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
""
}
internal/wamime/wamime_test.go
0 → 100644
浏览文件 @
14d79a0b
// 版权 @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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录