UNPKG

@mistlog/typetype

Version:

A programming language designed for typescript type generation

81 lines (80 loc) 3.77 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FunctionTypeParam = exports.FunctionTypeParamList = exports.FunctionType = void 0; const react_peg_1 = require("react-peg"); const common_1 = require("../common"); const basic_1 = require("../basic"); const expression_1 = require("../expression"); function FunctionType() { const action = ({ params, returnType, typeParams, isConstructor }) => { const type = { kind: "FunctionType", params, returnType }; if (typeParams) { type.typeParams = typeParams; } if (isConstructor) { type.isConstructor = true; } return type; }; return (react_peg_1.ReactPeg.createChunk("pattern", { action: action }, common_1.Text("type"), react_peg_1.ReactPeg.createChunk("opt", { label: "isConstructor" }, common_1.Text("new")), react_peg_1.ReactPeg.createChunk(common_1._, null), react_peg_1.ReactPeg.createChunk("opt", { label: "typeParams" }, react_peg_1.ReactPeg.createChunk("pattern", { action: ({ typeParams }) => typeParams }, common_1.Text("<"), react_peg_1.ReactPeg.createChunk(expression_1.ParamList, { label: "typeParams" }), react_peg_1.ReactPeg.createChunk("text", null, ">"))), react_peg_1.ReactPeg.createChunk("text", null, "("), react_peg_1.ReactPeg.createChunk(common_1._, null), react_peg_1.ReactPeg.createChunk(FunctionTypeParamList, { label: "params" }), common_1.Text(")"), common_1.Text("=>"), react_peg_1.ReactPeg.createChunk(expression_1.TypeExpression, { label: "returnType" }))); } exports.FunctionType = FunctionType; function FunctionTypeParamList() { const action = ({ head, tail }) => { return head ? [head, ...tail] : []; }; return (react_peg_1.ReactPeg.createChunk("pattern", { action: action }, react_peg_1.ReactPeg.createChunk("opt", { label: "head" }, react_peg_1.ReactPeg.createChunk(FunctionTypeParam, null)), react_peg_1.ReactPeg.createChunk("repeat", { type: "*", label: "tail" }, react_peg_1.ReactPeg.createChunk("pattern", { action: ({ param }) => param }, common_1.Text(","), react_peg_1.ReactPeg.createChunk(FunctionTypeParam, { label: "param" }))))); } exports.FunctionTypeParamList = FunctionTypeParamList; function FunctionTypeParam() { const action = ({ name, type, rest, optional }) => { const param = { kind: "FunctionTypeParam", name, type }; if (rest) { param.rest = true; } if (optional) { param.optional = true; } return param; }; return (react_peg_1.ReactPeg.createChunk("pattern", { action: action }, react_peg_1.ReactPeg.createChunk(common_1._, null), react_peg_1.ReactPeg.createChunk("opt", { label: "rest" }, react_peg_1.ReactPeg.createChunk("text", null, "...")), react_peg_1.ReactPeg.createChunk(basic_1.Identifier, { label: "name" }), react_peg_1.ReactPeg.createChunk("opt", { label: "optional" }, common_1.Text("?")), react_peg_1.ReactPeg.createChunk("opt", { label: "type" }, react_peg_1.ReactPeg.createChunk("pattern", { action: ({ expression }) => expression }, common_1.Text(":"), react_peg_1.ReactPeg.createChunk(expression_1.TypeExpression, { label: "expression" }))), react_peg_1.ReactPeg.createChunk(common_1._, null))); } exports.FunctionTypeParam = FunctionTypeParam;