Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wa-lang
wa
提交
27e5ab0a
wa
项目概览
wa-lang
/
wa
11 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
27e5ab0a
编写于
8月 14, 2022
作者:
chai2010
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
loader: 重构 vfs 加载
上级
e99ab37e
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
91 addition
and
31 deletion
+91
-31
api/api.go
api/api.go
+3
-3
internal/config/manifest.go
internal/config/manifest.go
+12
-0
internal/loader/api.go
internal/loader/api.go
+6
-0
internal/loader/loader.go
internal/loader/loader.go
+18
-28
internal/loader/vfs.go
internal/loader/vfs.go
+52
-0
未找到文件。
api/api.go
浏览文件 @
27e5ab0a
...
...
@@ -42,9 +42,9 @@ func LoadProgram(cfg *config.Config, appPath string) (*Program, error) {
// 基于 VFS 加载程序
// 入口 pkgPath 是包路径, 必须是 vfs.App 子包
func
LoadProgramVFS
(
vfs
config
.
PkgVFS
,
cfg
*
config
.
Config
,
pkgPath
string
)
(
*
Program
,
error
)
{
panic
(
"TODO"
)
func
LoadProgramVFS
(
vfs
*
config
.
PkgVFS
,
cfg
*
config
.
Config
,
pkgPath
string
)
(
*
Program
,
error
)
{
return
loader
.
LoadProgramVFS
(
vfs
,
cfg
,
pkgPath
)
}
// TODO: 解析 ast/语义/SSA 分阶段解析
// TODO: 解析 ast/语义/SSA 分阶段解析
, 放到 Program 中
// TODO: Program 编译到不同后端的函数
internal/config/manifest.go
浏览文件 @
27e5ab0a
...
...
@@ -54,6 +54,18 @@ func (p *Manifest) Clone() *Manifest {
return
&
v
}
// 简版 Manifest
func
SimpleManifest
(
mainPkg
,
appName
string
)
*
Manifest
{
p
:=
&
Manifest
{
MainPkg
:
mainPkg
,
Pkg
:
Manifest_package
{
Name
:
appName
,
Pkgpath
:
mainPkg
,
},
}
return
p
}
// 加载 WaModFile 文件
// 如果 vfs 为空则从本地文件系统读取
func
LoadManifest
(
vfs
fs
.
FS
,
appPath
string
)
(
p
*
Manifest
,
err
error
)
{
...
...
internal/loader/api.go
浏览文件 @
27e5ab0a
...
...
@@ -37,3 +37,9 @@ type Package struct {
func
LoadProgram
(
cfg
*
config
.
Config
,
appPath
string
)
(
*
Program
,
error
)
{
return
newLoader
(
cfg
)
.
LoadProgram
(
appPath
)
}
// 基于 VFS 加载程序
// 入口 pkgPath 是包路径, 必须是 vfs.App 子包
func
LoadProgramVFS
(
vfs
*
config
.
PkgVFS
,
cfg
*
config
.
Config
,
pkgPath
string
)
(
*
Program
,
error
)
{
return
newLoader
(
cfg
)
.
LoadProgramVFS
(
vfs
,
pkgPath
)
}
internal/loader/loader.go
浏览文件 @
27e5ab0a
// 版权 @2021 凹语言 作者。保留所有权利。
// TODO: 解析 ast/语义/SSA 分阶段解析
package
loader
import
(
"io/fs"
"os"
"path/filepath"
"sort"
"strings"
"testing/fstest"
"github.com/wa-lang/wa/internal/ast"
"github.com/wa-lang/wa/internal/config"
...
...
@@ -29,53 +25,47 @@ type _Loader struct {
}
func
newLoader
(
cfg
*
config
.
Config
)
*
_Loader
{
p
:=
&
_Loader
{
return
&
_Loader
{
cfg
:
*
cfg
.
Clone
(),
prog
:
&
Program
{
Pkgs
:
make
(
map
[
string
]
*
Package
),
},
}
return
p
}
// 加载程序
func
(
p
*
_Loader
)
LoadProgram
(
appPath
string
)
(
*
Program
,
error
)
{
logger
.
Tracef
(
&
config
.
EnableTrace_loader
,
"cfg: %+v"
,
p
.
cfg
)
logger
.
Tracef
(
&
config
.
EnableTrace_loader
,
"appPath: %s"
,
appPath
)
vfs
,
manifest
,
err
:=
loadProgramMeta
(
&
p
.
cfg
,
appPath
)
if
err
!=
nil
{
logger
.
Tracef
(
&
config
.
EnableTrace_loader
,
"err: %v"
,
err
)
return
nil
,
err
}
return
p
.
loadProgram
(
vfs
,
manifest
)
}
func
(
p
*
_Loader
)
LoadProgramVFS
(
vfs
*
config
.
PkgVFS
,
appPath
string
)
(
*
Program
,
error
)
{
manifest
,
err
:=
config
.
LoadManifest
(
nil
,
appPath
)
if
err
!=
nil
{
logger
.
Tracef
(
&
config
.
EnableTrace_loader
,
"err: %v"
,
err
)
return
nil
,
err
}
return
p
.
loadProgram
(
vfs
,
manifest
)
}
// 加载程序
func
(
p
*
_Loader
)
loadProgram
(
vfs
*
config
.
PkgVFS
,
manifest
*
config
.
Manifest
)
(
*
Program
,
error
)
{
logger
.
DumpFS
(
&
config
.
EnableTrace_loader
,
"vfs.app"
,
vfs
.
App
,
"."
)
logger
.
Tracef
(
&
config
.
EnableTrace_loader
,
"manifest: %s"
,
manifest
.
JSONString
())
p
.
vfs
=
*
vfs
p
.
prog
.
Cfg
=
&
p
.
cfg
p
.
prog
.
Manifest
=
manifest
p
.
prog
.
Fset
=
token
.
NewFileSet
()
if
p
.
vfs
.
App
==
nil
{
p
.
vfs
.
App
=
os
.
DirFS
(
filepath
.
Join
(
p
.
prog
.
Manifest
.
Root
,
"src"
))
}
logger
.
DumpFS
(
&
config
.
EnableTrace_loader
,
"p.vfs.App"
,
p
.
vfs
.
App
,
"."
)
if
p
.
vfs
.
Std
==
nil
{
if
p
.
cfg
.
WaRoot
!=
""
{
p
.
vfs
.
Std
=
os
.
DirFS
(
filepath
.
Join
(
p
.
cfg
.
WaRoot
,
"src"
))
}
else
{
p
.
vfs
.
Std
=
waroot
.
GetFS
()
}
}
if
p
.
vfs
.
Vendor
==
nil
{
p
.
vfs
.
Vendor
=
os
.
DirFS
(
filepath
.
Join
(
p
.
prog
.
Manifest
.
Root
,
"vendor"
))
if
p
.
vfs
.
Vendor
==
nil
{
p
.
vfs
.
Vendor
=
make
(
fstest
.
MapFS
)
// empty fs
}
}
// import "runtime"
logger
.
Trace
(
&
config
.
EnableTrace_loader
,
"import runtime"
)
if
_
,
err
:=
p
.
Import
(
"runtime"
);
err
!=
nil
{
...
...
internal/loader/vfs.go
0 → 100644
浏览文件 @
27e5ab0a
// 版权 @2021 凹语言 作者。保留所有权利。
package
loader
import
(
"os"
"path/filepath"
"testing/fstest"
"github.com/wa-lang/wa/internal/config"
"github.com/wa-lang/wa/internal/logger"
"github.com/wa-lang/wa/internal/waroot"
)
// 根据路径加载需要的 vfs 和 manifest
func
loadProgramMeta
(
cfg
*
config
.
Config
,
appPath
string
)
(
vfs
*
config
.
PkgVFS
,
manifest
*
config
.
Manifest
,
err
error
,
)
{
logger
.
Tracef
(
&
config
.
EnableTrace_loader
,
"cfg: %+v"
,
cfg
)
logger
.
Tracef
(
&
config
.
EnableTrace_loader
,
"appPath: %s"
,
appPath
)
manifest
,
err
=
config
.
LoadManifest
(
nil
,
appPath
)
if
err
!=
nil
{
logger
.
Tracef
(
&
config
.
EnableTrace_loader
,
"err: %v"
,
err
)
return
nil
,
nil
,
err
}
logger
.
Tracef
(
&
config
.
EnableTrace_loader
,
"manifest: %s"
,
manifest
.
JSONString
())
vfs
=
new
(
config
.
PkgVFS
)
if
vfs
.
App
==
nil
{
vfs
.
App
=
os
.
DirFS
(
filepath
.
Join
(
manifest
.
Root
,
"src"
))
}
if
vfs
.
Std
==
nil
{
if
cfg
.
WaRoot
!=
""
{
vfs
.
Std
=
os
.
DirFS
(
filepath
.
Join
(
cfg
.
WaRoot
,
"src"
))
}
else
{
vfs
.
Std
=
waroot
.
GetFS
()
}
}
if
vfs
.
Vendor
==
nil
{
vfs
.
Vendor
=
os
.
DirFS
(
filepath
.
Join
(
manifest
.
Root
,
"vendor"
))
if
vfs
.
Vendor
==
nil
{
vfs
.
Vendor
=
make
(
fstest
.
MapFS
)
// empty fs
}
}
return
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录