tstosc
Version:
A transpiler that convert TypeScript to SuperCollider's SCLang.
64 lines (58 loc) • 4.04 kB
JavaScript
;
var ts = require('typescript');
var name_decl_def_hoist_cjs = require('../name_decl_def_hoist.cjs');
var stmt_conv_cjs = require('./stmt_conv.cjs');
var context_cjs = require('../context.cjs');
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
var ts__default = /*#__PURE__*/_interopDefault(ts);
function convertTSCodeBlockToSC(block, generator_context = context_cjs.default_generator_context) {
const { indent_level, is_standalone_statement, statement_label } = generator_context;
const generator_context_new = generator_context.clearedStatementLabel();
const name_decl_def_hoist = name_decl_def_hoist_cjs.generateVarConstDeclarationAndDefinition(
block,
generator_context_new
).indent(is_standalone_statement ? indent_level : 0);
const sep = name_decl_def_hoist.length > 0 ? "\n" : "";
const stmts_without_decl_def = block.statements.filter(
(s) => !ts__default.default.isDeclarationStatement(s)
);
const is_early_return = generator_context_new.with_early_return || !generator_context_new.is_generating_method && hasEarlyReturnIn(block.statements);
const stmts_in_sc = [
...stmts_without_decl_def.map(
(s) => stmt_conv_cjs.convertTSStatementToSC(s, generator_context_new.withEarlyReturn(is_early_return))
)
].filter((s) => s.trim().length > 0).join("\n");
let result = `${name_decl_def_hoist}${sep}${stmts_in_sc}`;
if (statement_label != "") {
result = `block { |tstosc__label__${statement_label}|
${result.indent(1)}
} ;`;
}
return result;
}
function hasEarlyReturnIn(stmts, at_outest_level = true) {
function hasEarlyReturnInBlockOrOfStatement(s, at_outest_level2 = true) {
return ts__default.default.isBlock(s) ? hasEarlyReturnIn(s.statements, at_outest_level2) : ts__default.default.isReturnStatement(s);
}
const early_return_alike__index = stmts.findIndex(
(s, index) => (
// If is flow-control, need to check all types of them:
// `if` statement.
ts__default.default.isIfStatement(s) && // If `then` part only contains one return statement, or a block.
(hasEarlyReturnInBlockOrOfStatement(s.thenStatement, index == stmts.length - 1) || s.elseStatement != void 0 && hasEarlyReturnInBlockOrOfStatement(s.elseStatement, index == stmts.length - 1)) || (ts__default.default.isForStatement(s) || ts__default.default.isWhileStatement(s)) && hasEarlyReturnInBlockOrOfStatement(s.statement, index == stmts.length - 1) || ts__default.default.isSwitchStatement(s) && s.caseBlock.clauses.some((c) => c.statements.some((n) => ts__default.default.isReturnStatement(n))) || ts__default.default.isTryStatement(s) && (hasEarlyReturnIn(s.tryBlock.statements, index == stmts.length - 1) || s.catchClause != void 0 && hasEarlyReturnIn(s.catchClause.block.statements, index == stmts.length - 1) || s.finallyBlock != void 0 && hasEarlyReturnIn(s.finallyBlock.statements, index == stmts.length - 1)) || ts__default.default.isReturnStatement(s)
)
);
return at_outest_level ? early_return_alike__index >= 0 && early_return_alike__index < stmts.length - 1 : early_return_alike__index >= 0;
}
function convertTSCodeBlockWithEarlyReturnToSC(stmts, generator_context = context_cjs.default_generator_context) {
return "block { |return_with|\n".indent(generator_context.indent_level) + stmts.map(
(s) => stmt_conv_cjs.convertTSStatementToSC(s, generator_context.indent().isStandalongStatement().withEarlyReturn())
).filter((s) => s.length > 0).join(" ;\n") + "\n" + "} ;".indent(generator_context.indent_level);
}
function isTSFlowControlStatement(stmt) {
return ts__default.default.isIfStatement(stmt) || ts__default.default.isSwitchStatement(stmt) || ts__default.default.isIterationStatement(stmt, true) || ts__default.default.isTryStatement(stmt);
}
exports.convertTSCodeBlockToSC = convertTSCodeBlockToSC;
exports.convertTSCodeBlockWithEarlyReturnToSC = convertTSCodeBlockWithEarlyReturnToSC;
exports.hasEarlyReturnIn = hasEarlyReturnIn;
exports.isTSFlowControlStatement = isTSFlowControlStatement;