@mistlog/typetype
Version:
A programming language designed for typescript type generation
81 lines (80 loc) • 3.77 kB
JavaScript
;
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;