@grey-ts/transpiler 1.1.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +70 -18
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -44,6 +44,7 @@ class NodeHandler {
44
44
  }
45
45
  NodeHandler.register(ts.SyntaxKind.TypeAliasDeclaration, () => "");
46
46
  NodeHandler.register(ts.SyntaxKind.InterfaceDeclaration, () => "");
47
+ NodeHandler.register(ts.SyntaxKind.ModuleDeclaration, () => "");
47
48
  NodeHandler.register(ts.SyntaxKind.EndOfFileToken, () => "");
48
49
  NodeHandler.register(ts.SyntaxKind.EmptyStatement, () => "");
49
50
 
@@ -971,13 +972,26 @@ NodeHandler.register(ts8.SyntaxKind.AsExpression, (node) => {
971
972
  return NodeHandler.handle(node.expression);
972
973
  });
973
974
  NodeHandler.register(ts8.SyntaxKind.DeleteExpression, (node) => {
974
- if (!ts8.isPropertyAccessExpression(node.expression))
975
- throw `Cant handle delete expression for ${ts8.SyntaxKind[node.expression.kind]}`;
976
- const pnode = node.expression;
977
- const left = NodeHandler.handle(pnode.expression);
978
- const leftType = checker.getTypeAtLocation(pnode.expression);
979
- const right = replaceIdentifier(NodeHandler.handle(pnode.name), leftType, pnode.name.text);
980
- return `${left}.remove(${right})`;
975
+ if (ts8.isPropertyAccessExpression(node.expression)) {
976
+ const pnode = node.expression;
977
+ const left = NodeHandler.handle(pnode.expression);
978
+ const leftType = checker.getTypeAtLocation(pnode.expression);
979
+ const right = replaceIdentifier(NodeHandler.handle(pnode.name), leftType, pnode.name.text);
980
+ return `${left}.remove("${right}")`;
981
+ }
982
+ if (ts8.isElementAccessExpression(node.expression)) {
983
+ const pnode = node.expression;
984
+ const left = NodeHandler.handle(pnode.expression);
985
+ let right;
986
+ if (ts8.isStringLiteral(pnode.argumentExpression)) {
987
+ const leftType = checker.getTypeAtLocation(pnode.expression);
988
+ right = `"${replaceIdentifier(pnode.argumentExpression.text, leftType, pnode.argumentExpression.text)}"`;
989
+ } else {
990
+ right = NodeHandler.handle(pnode.argumentExpression);
991
+ }
992
+ return `${left}.remove(${right})`;
993
+ }
994
+ throw `Cant handle delete expression for ${ts8.SyntaxKind[node.expression.kind]}`;
981
995
  });
982
996
 
983
997
  // src/visitors/functions.ts
@@ -1166,11 +1180,13 @@ NodeHandler.register(ts12.SyntaxKind.ForStatement, (node) => {
1166
1180
  }
1167
1181
  return false;
1168
1182
  }
1183
+ const labelIf = ts12.isLabeledStatement(node.parent) ? ` if ${node.parent.label.text}Broke then break` : "";
1169
1184
  if (!hasContinue(node)) {
1170
1185
  return [
1171
1186
  `${initializer}`,
1172
1187
  `while ${condition}`,
1173
1188
  ` ${statement.trimStart()}`,
1189
+ ...labelIf ? [labelIf] : [],
1174
1190
  ` ${incrementor}`,
1175
1191
  `end while`
1176
1192
  ].join(`
@@ -1187,6 +1203,7 @@ NodeHandler.register(ts12.SyntaxKind.ForStatement, (node) => {
1187
1203
  ` end if`,
1188
1204
  ` ${incrementedStateVarName} = 0`,
1189
1205
  ` ${statement.trimStart()}`,
1206
+ ...labelIf ? [labelIf] : [],
1190
1207
  ` ${incrementor}`,
1191
1208
  ` ${incrementedStateVarName} = 1`,
1192
1209
  `end while`
@@ -1203,9 +1220,14 @@ NodeHandler.register(ts12.SyntaxKind.ForOfStatement, (node) => {
1203
1220
  }
1204
1221
  const varName = NodeHandler.handle(node.initializer.declarations[0].name);
1205
1222
  const objToLoop = NodeHandler.handle(node.expression);
1206
- return `for ${varName} in ${objToLoop}
1207
- ${NodeHandler.handle(node.statement)}
1208
- end for`;
1223
+ const labelIf = ts12.isLabeledStatement(node.parent) ? ` if ${node.parent.label.text}Broke then break` : "";
1224
+ return [
1225
+ `for ${varName} in ${objToLoop}`,
1226
+ `${NodeHandler.handle(node.statement)}`,
1227
+ ...labelIf ? [labelIf] : [],
1228
+ `end for`
1229
+ ].join(`
1230
+ `);
1209
1231
  });
1210
1232
  NodeHandler.register(ts12.SyntaxKind.ForInStatement, (node) => {
1211
1233
  if (!ts12.isVariableDeclarationList(node.initializer)) {
@@ -1216,9 +1238,14 @@ NodeHandler.register(ts12.SyntaxKind.ForInStatement, (node) => {
1216
1238
  }
1217
1239
  const varName = NodeHandler.handle(node.initializer.declarations[0].name);
1218
1240
  const objToLoop = NodeHandler.handle(node.expression);
1219
- return `for ${varName} in ${objToLoop}.indexes
1220
- ${NodeHandler.handle(node.statement)}
1221
- end for`;
1241
+ const labelIf = ts12.isLabeledStatement(node.parent) ? ` if ${node.parent.label.text}Broke then break` : "";
1242
+ return [
1243
+ `for ${varName} in ${objToLoop}.indexes`,
1244
+ `${NodeHandler.handle(node.statement)}`,
1245
+ ...labelIf ? [labelIf] : [],
1246
+ `end for`
1247
+ ].join(`
1248
+ `);
1222
1249
  });
1223
1250
  NodeHandler.register(ts12.SyntaxKind.IfStatement, (node) => {
1224
1251
  const condition = NodeHandler.handle(node.expression);
@@ -1248,20 +1275,24 @@ end if`;
1248
1275
  });
1249
1276
  NodeHandler.register(ts12.SyntaxKind.WhileStatement, (node, ctx) => {
1250
1277
  const expression = NodeHandler.handle(node.expression);
1278
+ const labelIf = ts12.isLabeledStatement(node.parent) ? ` if ${node.parent.label.text}Broke then break` : "";
1251
1279
  return [
1252
1280
  `while ${expression}`,
1253
1281
  ` ${NodeHandler.handle(node.statement).trimStart()}`,
1282
+ ...labelIf ? [labelIf] : [],
1254
1283
  `end while`
1255
1284
  ].join(`
1256
1285
  `);
1257
1286
  });
1258
1287
  NodeHandler.register(ts12.SyntaxKind.DoStatement, (node, ctx) => {
1259
1288
  const expression = NodeHandler.handle(node.expression);
1289
+ const labelIf = ts12.isLabeledStatement(node.parent) ? ` if ${node.parent.label.text}Broke then break` : "";
1260
1290
  return [
1261
1291
  `did_once = 0`,
1262
1292
  `while not did_once or ${expression}`,
1263
1293
  ` did_once = 1`,
1264
1294
  ` ${NodeHandler.handle(node.statement).trimStart()}`,
1295
+ ...labelIf ? [labelIf] : [],
1265
1296
  `end while`
1266
1297
  ].join(`
1267
1298
  `);
@@ -1270,6 +1301,12 @@ NodeHandler.register(ts12.SyntaxKind.ContinueStatement, (node) => {
1270
1301
  return "continue";
1271
1302
  });
1272
1303
  NodeHandler.register(ts12.SyntaxKind.BreakStatement, (node) => {
1304
+ if (node.label) {
1305
+ if (!ts12.isBlock(node.parent))
1306
+ throw "A break statement with a label must be in a block";
1307
+ return `${NodeHandler.handle(node.label)}Broke = 1
1308
+ break`;
1309
+ }
1273
1310
  return "break";
1274
1311
  });
1275
1312
  NodeHandler.register(ts12.SyntaxKind.ReturnStatement, (node) => {
@@ -1281,6 +1318,10 @@ NodeHandler.register(ts12.SyntaxKind.ReturnStatement, (node) => {
1281
1318
  }
1282
1319
  return `return ${NodeHandler.handle(node.expression)}`;
1283
1320
  });
1321
+ NodeHandler.register(ts12.SyntaxKind.LabeledStatement, (node) => {
1322
+ return `${NodeHandler.handle(node.label)}Broke = 0
1323
+ ${NodeHandler.handle(node.statement)}`;
1324
+ });
1284
1325
 
1285
1326
  // src/visitors/variables.ts
1286
1327
  import ts13 from "typescript";
@@ -1309,16 +1350,27 @@ NodeHandler.register(ts13.SyntaxKind.VariableStatement, (node, ctx) => {
1309
1350
  NodeHandler.register(ts13.SyntaxKind.VariableDeclaration, handleVariableDeclaration);
1310
1351
  NodeHandler.register(ts13.SyntaxKind.PropertyDeclaration, handleVariableDeclaration);
1311
1352
  NodeHandler.register(ts13.SyntaxKind.EnumDeclaration, (node) => {
1312
- const members = node.members.map((member, index) => {
1313
- const name = NodeHandler.handle(member.name);
1353
+ const members = [];
1354
+ function addMember(name, initializer) {
1355
+ members.push(`${name}: ${initializer}`);
1356
+ if (isNaN(+initializer))
1357
+ return;
1358
+ members.push(`${initializer}: ${name}`);
1359
+ }
1360
+ node.members.forEach((member, index) => {
1361
+ let name = NodeHandler.handle(member.name);
1362
+ if (!ts13.isStringLiteral(member.name))
1363
+ name = `"${name}"`;
1314
1364
  if (member.initializer) {
1315
- return `${name}: ${NodeHandler.handle(member.initializer)}`;
1365
+ addMember(name, NodeHandler.handle(member.initializer));
1366
+ return;
1316
1367
  }
1317
1368
  const type = checker.getTypeAtLocation(member);
1318
1369
  if ("value" in type) {
1319
- return `${name}: ${type.value}`;
1370
+ addMember(name, String(type.value));
1371
+ return;
1320
1372
  }
1321
- return `${name}: ${index}`;
1373
+ addMember(name, index.toString());
1322
1374
  });
1323
1375
  return `${node.name.text} = { ${members.join(", ")} }`;
1324
1376
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grey-ts/transpiler",
3
- "version": "1.1.2",
3
+ "version": "1.2.0",
4
4
  "description": "Transpiles TypeScript into GreyScript",
5
5
  "author": "Okka",
6
6
  "module": "src/index.ts",