From dee1ba048e5633e4475ccf8ec954a787958da354 Mon Sep 17 00:00:00 2001 From: chloe caruso Date: Sat, 1 Jun 2024 05:49:57 -0700 Subject: [PATCH] some stuff --- CHANGELOG.md | 1 + build.zig | 8 ++++---- doc/architecture.md | 7 +++++++ doc/{langref.md => language-reference.md} | 17 +++++++++++++++++ src/cli.zig | 6 ++++++ src/core/Transform.zig | 2 ++ src/langref/generate-langref.zig | 3 ++- .../{langref.template.html => template.html} | 0 8 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 doc/architecture.md rename doc/{langref.md => language-reference.md} (88%) create mode 100644 src/cli.zig rename src/langref/{langref.template.html => template.html} (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 514c61812b4ed12c22ec47afafb683c0dee69813..87933d5cf9da7b6feffdf8fc5791dcc371e034f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - feat(transform): parse string escapes properly - feat(link): print string escapes properly - feat: implement the `comptime` keyword (many comptime ops are not implemented) +- feat: add `@jsNew` to create JavaScript `new` expressions - fix(sema): properly coerce assignments - fix(transform): empty block generated in top level code tripped sema assertion - fix(link): emit parenthesis to preserve operator precedence diff --git a/build.zig b/build.zig index 46b94f428a76ba6f6f501ddb53c6974ed4abb41d..7a1a0d2ac5a7e0664b4a008fe2b16947f3fcc647 100644 --- a/build.zig +++ b/build.zig @@ -58,7 +58,7 @@ pub fn build(b: *std.Build) void { test_all.dependOn(run_step); } - // Language Server + // Language Reference Generator const langref_generator = b.addExecutable(.{ .name = "generate-langref", .root_source_file = b.path("src/langref/generate-langref.zig"), @@ -70,10 +70,10 @@ pub fn build(b: *std.Build) void { langref_generator.root_module.addImport("core", native_debug.core); const langref_run = b.addRunArtifact(langref_generator); langref_run.addFileArg(native_debug.compiler.getEmittedBin()); - langref_run.addFileArg(b.path("doc/langref.md")); - langref_run.addFileArg(b.path("src/langref/langref.template.html")); + langref_run.addFileArg(b.path("doc/language-reference.md")); + langref_run.addFileArg(b.path("src/langref/template.html")); const langref_out = langref_run.addOutputFileArg("language-reference.html"); - const install_langref = b.addInstallFile(langref_out, "doc/langref.html"); + const install_langref = b.addInstallFile(langref_out, "doc/README.html"); b.step("langref", "build language reference").dependOn(&install_langref.step); // const wasm_api = b.addExecutable(.{ diff --git a/doc/architecture.md b/doc/architecture.md new file mode 100644 index 0000000000000000000000000000000000000000..ab7b3b8b903e7351bfd972ba0ec3804ad29c9256 --- /dev/null +++ b/doc/architecture.md @@ -0,0 +1,7 @@ +# compiler architecture + +This document will outline the code structure of the language's SDK as well as the compilation pipeline architecture. The major components of the language are: + +- [**Core**][core] +- [**Standard Library**][std] +- [**Language Server**][lsp] diff --git a/doc/langref.md b/doc/language-reference.md similarity index 88% rename from doc/langref.md rename to doc/language-reference.md index 3fdc304cd29385bd30f3230c1fa1258a20903637..714941dd21ff3c80436be19f185c4a8e41baa17e 100644 --- a/doc/langref.md +++ b/doc/language-reference.md @@ -135,3 +135,20 @@ TODO ## String Literals TODO + +## JavaScript Interop + +A global variable handle can be retrived with `@js`. We've seen this in the hello world. The plan is to eventually replace this construct with something else, but implementing a function like this is extremely trivial for the compiler. + +Many JS-exclusive actions are exposed via built-in functions, such as using `@jsNew` for calling constructors. + +```lang:run +let date_constructor = @js("Date"); +let print = @js("console").log; + +fn currentYear() -> int { + @jsNew(date_constructor).getFullYear() +} + +print(currentYear()); +``` diff --git a/src/cli.zig b/src/cli.zig new file mode 100644 index 0000000000000000000000000000000000000000..ff8747b1c70dce597c04f50c31f357f33458fab7 --- /dev/null +++ b/src/cli.zig @@ -0,0 +1,6 @@ +//! This is the `lang` command line interface. It combines all components +//! of the software development kit into one. For development, it may +//! be more reasonable to hack on individual components, which each +//! expose their own CLIs + +pub fn main() !void {} diff --git a/src/core/Transform.zig b/src/core/Transform.zig index c113d21c54c2ea2994f576e37e7474e7af563075..e3e0023e263cfa1f8cfc7b38e6bae70132aea048 100644 --- a/src/core/Transform.zig +++ b/src/core/Transform.zig @@ -565,6 +565,7 @@ fn transformParamDecl(t: *Transform, decl: BlockContext, param: NodeIndex) Alloc pub const Builtin = enum { js, + js_new, import, fetch, compile_error, @@ -576,6 +577,7 @@ pub const Builtin = enum { .{ "fetch", .fetch }, .{ "import", .import }, .{ "js", .js }, + .{ "jsNew", .js_new }, .{ "typeOf", .type_of }, // sort-lines: end }); diff --git a/src/langref/generate-langref.zig b/src/langref/generate-langref.zig index fdc109d5bc328ed1ce185fd55f7af46a5229a6ee..9f1fb464a11adee6b6a4a1dba270359c64d402b7 100644 --- a/src/langref/generate-langref.zig +++ b/src/langref/generate-langref.zig @@ -9,7 +9,8 @@ const ArrayList = std.ArrayList; pub fn main() !void { comptime std.debug.assert(@import("builtin").mode == .Debug); - const gpa = std.heap.c_allocator; + var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + const gpa = arena.allocator(); var args = try std.process.argsWithAllocator(gpa); _ = args.next().?; diff --git a/src/langref/langref.template.html b/src/langref/template.html similarity index 100% rename from src/langref/langref.template.html rename to src/langref/template.html -- 2.54.0