ts-budgie
Version:
Converts TypeScript code to Budgie.
40 lines (29 loc) • 1.53 kB
text/typescript
import { CommandNames } from "budgie";
import * as ts from "typescript";
import { BudgieLine } from "../../output/budgieLine";
import { Transformation } from "../../output/transformation";
import { createUnsupportedBudgieLine, createUnsupportedTypeBudgieLine } from "../../output/unsupported";
import { NodeVisitor } from "../visitor";
const invalidInitializerComplaint = "Enum members must each have a constant numeric or string value.";
const missingInitializerComplaint = "For now, enum members each require a value.";
export class EnumMemberVisitor extends NodeVisitor {
public visit(node: ts.EnumMember) {
return [Transformation.fromNode(node, this.sourceFile, [this.getTransformationContents(node)])];
}
private getTransformationContents(node: ts.EnumMember) {
if (!ts.isIdentifier(node.name)) {
return createUnsupportedTypeBudgieLine();
}
if (node.initializer === undefined) {
return createUnsupportedBudgieLine(missingInitializerComplaint);
}
if (typeof this.aliaser.getFriendlyTypeName(node.initializer) !== "string") {
return createUnsupportedBudgieLine(invalidInitializerComplaint);
}
const args: string[] = [node.name.text, node.initializer.getText(this.sourceFile)];
if (node.parent.members[node.parent.members.length - 1] !== node) {
args.push(",");
}
return new BudgieLine(CommandNames.EnumMember, ...args);
}
}