Skip to content

devhxj/Jazor

Repository files navigation

Today's Verse

Jazor - C# to JavaScript Compiler with Module-Oriented Tooling

.NET License

⚠️ EXPERIMENTAL DEMO ⚠️
Jazor is still evolving. Public APIs, generated output shapes, and adjacent toolchains may change as the repository continues to stabilize.

Jazor is an experimental Roslyn-based C# to JavaScript compiler project. It focuses on semantic-preserving lowering into JavaScript AST and currently treats the compiler mainline as the repository's most stable reference area. The active Vue-side development boundary is Jazor.VueHost; Jazor.Vite, Bun, and the old split-host / analysis-host path are migration leftovers.

文档入口

项目状态

Jazor 当前以编译器主线和 Jazor.VueHost 为核心,Deno 是唯一的前端/运行时宿主路径。Jazor.Vite、Bun 以及旧的 split-host / analysis-host 路线都只是迁移残留。详见 工作流总览

  • Compiler 主线:接近稳定,是仓库最成熟的部分
  • Jazor.VueHost:当前的开发时边界,负责 .jazor 和前端智能感知
  • 🔄 Emit / Materialisation:持续承接,产物输出和打包管道
  • 🔄 SourceMap:局部活跃,支撑当前的 VueHost / Deno 物化链路

项目结构

Jazor/
├── src/
│   ├── Jazor.Compiler/              # C# to JavaScript compiler core
│   ├── Jazor.Analyzer/              # Static analyzer and whitelist validation
│   ├── Jazor.CLR/                   # CLR runtime support modules
│   ├── Jazor.Emit/                  # Emit and packaging pipeline
│   ├── Jazor.RazorVue/              # RazorVue integration surface
│   ├── Jazor.RazorVue.Analysis/     # RazorVue analysis and lowering
│   ├── Jazor.RazorVue.Vuetify/      # Vuetify component stubs
│   ├── Jazor.VueHost/               # Active `.jazor` development-time host
│   ├── Jazor.Razor/                 # Razor template support
│   ├── Jazor.Common/                # Shared utilities and types
│   ├── ECMAScript/                  # ECMAScript core types and attributes
│   ├── ECMAScript.WebIDL/           # WebIDL binding generator
│   ├── Jazor.CompilerTest/          # Compiler tests (MSTest)
│   └── Jazor.EmitTest/              # Emit pipeline tests (MSTest)
├── docs/                            # Repository-level documentation hub
└── README.md                        # This file

核心组件

  • Jazor.Compiler - C# 到 JavaScript 的编译器核心 → 详细文档
  • Jazor.Analyzer - 静态分析和白名单验证,确保编译时类型安全
  • Jazor.CLR - .NET 类型的运行时模块支持,提供 JavaScript 运行时实现
  • Jazor.Emit - 产物输出和打包管道,处理 host-facing 输出
  • Jazor.RazorVue - Vue 导向的 Razor 编译路径,支持 Blazor 风格的组件编写
  • Jazor.VueHost - .jazor 开发时边界和前端智能感知宿主 .jazor 以 Razor 作为源码语法,Vue 相关产物仅作为内部投影或桥接工件。Jazor.Vite、Bun 和旧的分析宿主路径都不再是当前架构方向;若迁移期间仍需独立分析进程,兼容入口是 Jazor.VueHost --analysis-stdio

详见 模块索引 了解所有模块。

核心能力

Jazor 支持将 C# 代码转换为 JavaScript,包括:

  • 变量声明和基础类型转换
  • 模式匹配和条件表达式
  • 可空类型处理
  • 异步编程(async/await)
  • 字符串插值
  • 对象和集合初始化

详见 编译器文档 了解支持的完整特性。

转换示例

// C# code
int x = 42;
string message = $"Value is {x}";
bool isPositive = x > 0;
// Converted JavaScript code
let x = 42;
let message = `Value is ${x}`;
let isPositive = x > 0;

使用方法

使用 ECMAScriptModule 特性

using ECMAScript;

[ECMAScriptModule]
public static class MyMathModule
{
    public static int Add(int a, int b) => a + b;
    public static string Greet(string name) => $"Hello, {name}!";
}

基本编译流程

using Jazor.Compiler;
using Microsoft.CodeAnalysis;

// 获取语义模型
var semanticModel = compilation.GetSemanticModel(syntaxTree);

// 转换为 JavaScript AST - 类级别
var converter = new AstConverter(classSymbol, semanticModel);
var module = converter.Convert();

// 转换为 JavaScript AST - 操作级别
var walker = new SemanticWalker();
var jsAst = walker.Visit(operation, new());

开发和构建

环境要求

  • .NET 10 SDK
  • PowerShell 7+(用于测试脚本)
  • Windows、Linux 或 macOS

构建步骤

# 克隆仓库
git clone https://github.com/devhxj/Jazor.git
cd Jazor

# 恢复依赖
dotnet restore

# 构建解决方案
dotnet build

# 运行所有测试
pwsh ./scripts/test-dotnet.ps1

# 运行编译器测试
pwsh ./scripts/test-dotnet.ps1 -Project compiler

# 运行单个测试类
dotnet test src/Jazor.CompilerTest/Jazor.CompilerTest.csproj --filter "SemanticWalkerPatternTest"

# 运行单个测试方法
dotnet test src/Jazor.CompilerTest/Jazor.CompilerTest.csproj --filter "SemanticWalkerPatternTest.Visit_IsPattern_Constant"

贡献

欢迎社区贡献。请在提交 Pull Request 前查阅仓库文档并遵循代码库中描述的约定。

开发流程

  1. Fork 项目仓库
  2. 创建功能分支
  3. 实现功能并添加测试
  4. 确保所有测试通过
  5. 提交 Pull Request

代码规范

  • 遵循 C# 编码约定
  • 在需要澄清的地方添加适当的注释和文档
  • 确保新功能有相应的单元测试
  • 遵循语义保持的设计原则

许可证

本项目采用 MIT 许可证。详见 LICENSE.txt 文件。

联系方式

致谢

感谢所有为 Jazor 项目做出贡献的开发者和社区成员。

特别感谢以下开源项目:

Packages

 
 
 

Contributors