wa/api/api.go

111 lines
3.0 KiB
Go

// 版权 @2022 凹语言 作者。保留所有权利。
// 凹语言™ 功能 API 包。
package api
import (
"io/fs"
"wa-lang.org/wa/internal/backends/compiler_wat"
"wa-lang.org/wa/internal/config"
"wa-lang.org/wa/internal/format"
"wa-lang.org/wa/internal/loader"
"wa-lang.org/wa/internal/logger"
"wa-lang.org/wa/internal/wamime"
)
// 调试参数
var (
FlagDebugMode = &config.DebugMode
FlagEnableTrace_api = &config.EnableTrace_api
FlagEnableTrace_app = &config.EnableTrace_app
FlagEnableTrace_compiler = &config.EnableTrace_compiler
FlagEnableTrace_loader = &config.EnableTrace_loader
)
// 配置参数, 包含文件系统和 OS 等信息
type Config = config.Config
// 模块元信息, 主包路径
type Manifest = config.Manifest
// 模块元信息中的包信息
type Manifest_package = config.Manifest_package
// 程序对象, 包含全量的 AST 和 SSA 信息, 经过语义检查
type Program = loader.Program
// 包虚拟文件系统
type PkgVFS = config.PkgVFS
// 指针和整数大小
type StdSize = config.StdSizes
// 默认配置
func DefaultConfig() *Config {
return config.DefaultConfig()
}
// 加载 WaModFile 文件
// 如果 vfs 为空则从本地文件系统读取
func LoadManifest(vfs fs.FS, appPath string) (p *Manifest, err error) {
return config.LoadManifest(vfs, appPath)
}
// 加载程序
// 入口 appPath 是包对应目录的路径
func LoadProgram(cfg *config.Config, appPath string) (*Program, error) {
return loader.LoadProgram(cfg, appPath)
}
// 加载单文件程序
// 入口 appPath 是包对应目录的路径
func LoadProgramFile(cfg *config.Config, filename string, src interface{}) (*Program, error) {
return loader.LoadProgramFile(cfg, filename, src)
}
// 基于 VFS 加载程序
// 入口 pkgPath 是包路径, 必须是 vfs.App 子包
func LoadProgramVFS(vfs *config.PkgVFS, cfg *config.Config, pkgPath string) (*Program, error) {
return loader.LoadProgramVFS(vfs, cfg, pkgPath)
}
// 构建 wat 目标
func BuildFile(cfg *config.Config, filename string, src interface{}) (wat []byte, err error) {
prog, err := LoadProgramFile(cfg, filename, src)
if err != nil || prog == nil {
logger.Tracef(&config.EnableTrace_api, "LoadProgramVFS failed, err = %v", err)
return nil, err
}
watOut, err := compiler_wat.New().Compile(prog, "main")
return []byte(watOut), err
}
// 构建 wat 目标
func BuildVFS(cfg *config.Config, vfs *config.PkgVFS, appPkg string) (wat []byte, err error) {
prog, err := LoadProgramVFS(vfs, cfg, appPkg)
if err != nil || prog == nil {
logger.Tracef(&config.EnableTrace_api, "LoadProgramVFS failed, err = %v", err)
return nil, err
}
watOut, err := compiler_wat.New().Compile(prog, "main")
return []byte(watOut), err
}
// 格式化代码
func FormatCode(filename, code string) (string, error) {
data, _, err := format.File(nil, filename, code)
if err != nil {
return "", err
}
return string(data), nil
}
// 获取代码语法类型
func GetCodeSyntax(filename string, code []byte) string {
return wamime.GetCodeMime(filename, code)
}