@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
87 lines (73 loc) • 2.2 kB
JavaScript
import { group, makeWord } from "@helios-lang/compiler-utils"
import { Expr, ParametricExpr, TypeRefExpr } from "../expressions/index.js"
import {
DataField,
ImplDefinition,
StructStatement,
TypeParameters
} from "../statements/index.js"
import { ParseContext } from "./ParseContext.js"
import { parseImplDefinition, anyImplKeyword } from "./parseImplDefinition.js"
import { parseName } from "./parseName.js"
import { parseTypeParameters } from "./parseTypeParameters.js"
import { parseDataFields } from "./parseDataFields.js"
/**
* @import { Site, Word } from "@helios-lang/compiler-utils"
*/
/**
* @param {ParseContext} ctx
* @returns {StructStatement}
*/
export function parseStructStatement(ctx) {
const r = ctx.reader
const name = parseName(ctx)
const parameters = parseTypeParameters(ctx)
const selfTypeExpr = createSelfTypeExpr(name, parameters)
/**
* @type {DataField[]}
*/
let fields = []
let impl = new ImplDefinition(selfTypeExpr, [])
let m
if ((m = r.matches(group("{", { length: 1 })))) {
const fr = m.fields[0]
const dataReader = fr.readUntil(anyImplKeyword)
fields = parseDataFields(
ctx.atSite(m.site).withReader(dataReader),
true
)
impl = parseImplDefinition(
ctx.atSite(m.site).withReader(fr),
selfTypeExpr
)
} else {
r.endMatch()
}
return new StructStatement(ctx.currentSite, name, parameters, fields, impl)
}
/**
* @param {Word} name
* @param {TypeParameters} parameters
* @returns {Expr}
*/
export function createSelfTypeExpr(name, parameters) {
/**
* Type Ref Expr
* @type {Expr}
*/
let selfTypeExpr = new TypeRefExpr(name)
if (parameters.hasParameters()) {
selfTypeExpr = new ParametricExpr(
selfTypeExpr.site,
selfTypeExpr,
parameters.parameterNames.map(
(n) =>
// Type Ref Expr
new TypeRefExpr(
makeWord({ value: n, site: selfTypeExpr.site })
)
)
)
}
return selfTypeExpr
}