@helios-lang/compiler
Version:
Helios is a Domain Specific Language that compiles to Plutus-Core (i.e. Cardano on-chain validator scripts). Helios is a non-Haskell alternative to Plutus. With this library you can compile Helios scripts and build Cardano transactions, all you need to bu
82 lines (70 loc) • 2.14 kB
JavaScript
import { ToIRContext } from "../codegen/index.js"
import { ModuleScope, Scope, builtinNamespaces } from "../scopes/index.js"
import { ModuleNamespace } from "../typecheck/index.js"
import { Statement } from "./Statement.js"
/**
* @import { Site, Word } from "@helios-lang/compiler-utils"
* @import { Definitions, TypeCheckContext } from "../index.js"
* @typedef {import("../typecheck/index.js").EvalEntity} EvalEntity
* @typedef {import("../typecheck/index.js").NamespaceMembers} NamespaceMembers
*/
/**
* `import <ModuleName>`
*/
export class ImportModuleStatement extends Statement {
/**
* @param {Site} site
* @param {Word} moduleName
*/
constructor(site, moduleName) {
super(site, moduleName)
}
/**
* @type {Word}
*/
get moduleName() {
return this.name
}
/**
* @param {TypeCheckContext} ctx
* @param {ModuleScope} scope
* @returns {EvalEntity | undefined}
*/
evalInternal(ctx, scope) {
if (this.name.value in builtinNamespaces) {
return scope.getBuiltinNamespace(this.name)
} else {
const importedScope = scope.getScope(this.name)
if (!importedScope) {
return undefined
}
/**
* @type {NamespaceMembers}
*/
const namespaceMembers = {}
for (let [name, entity] of importedScope.values) {
if (!(entity instanceof Scope)) {
namespaceMembers[name.value] = entity
}
}
return new ModuleNamespace(this.name.value, namespaceMembers)
}
}
/**
* @param {TypeCheckContext} ctx
* @param {ModuleScope} scope
*/
eval(ctx, scope) {
let v = this.evalInternal(ctx, scope)
if (v && !(this.name.value in builtinNamespaces)) {
scope.set(this.name, v)
}
}
/**
* @param {ToIRContext} _ctx
* @param {Definitions} _map
*/
toIR(_ctx, _map) {
// import statements only have a scoping function and don't do anything to the IR
}
}