Skip to content

Commit 5b1b232

Browse files
authored
Merge pull request #11 from narumincho/#9
#9
2 parents 012d29c + dd34ff8 commit 5b1b232

File tree

3 files changed

+138
-2
lines changed

3 files changed

+138
-2
lines changed

source/main.ts

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as typeExpr from "./typeExpr";
22
import * as scanType from "./scanType";
3+
import * as reservedWord from "./reservedWord";
34

45
/**
56
* 型を識別するためのID
@@ -502,13 +503,23 @@ const scanExpr = (expr: Expr, scanData: scanType.NodeJsCodeScanData): void => {
502503
return;
503504

504505
case ExprType.ObjectLiteral:
505-
for (const [, member] of expr.memberList) {
506+
for (const [propertyName, member] of expr.memberList) {
507+
reservedWord.checkUsingReservedWord(
508+
"object literal property name",
509+
"オブジェクトリテラルのプロパティ名",
510+
propertyName
511+
);
506512
scanExpr(member, scanData);
507513
}
508514
return;
509515

510516
case ExprType.LambdaWithReturn:
511517
for (const oneParameter of expr.parameter) {
518+
reservedWord.checkUsingReservedWord(
519+
"function parameter name",
520+
"関数のパラメーター名",
521+
oneParameter.name
522+
);
512523
typeExpr.scan(oneParameter.typeExpr, scanData);
513524
}
514525
typeExpr.scan(expr.returnType, scanData);
@@ -517,16 +528,31 @@ const scanExpr = (expr: Expr, scanData: scanType.NodeJsCodeScanData): void => {
517528

518529
case ExprType.LambdaReturnVoid:
519530
for (const oneParameter of expr.parameter) {
531+
reservedWord.checkUsingReservedWord(
532+
"function parameter name",
533+
"関数のパラメーター名",
534+
oneParameter.name
535+
);
520536
typeExpr.scan(oneParameter.typeExpr, scanData);
521537
}
522538
scanExpr(expr.body, scanData);
523539
return;
524540

525541
case ExprType.GlobalVariable:
542+
reservedWord.checkUsingReservedWord(
543+
"global variable name",
544+
"グローバル空間の変数名",
545+
expr.name
546+
);
526547
scanData.globalName.add(expr.name);
527548
return;
528549

529550
case ExprType.ImportedVariable:
551+
reservedWord.checkUsingReservedWord(
552+
"imported variable name",
553+
"インポートした変数名",
554+
expr.name
555+
);
530556
scanData.importedModulePath.add(expr.path);
531557
return;
532558
}
@@ -540,10 +566,20 @@ const scanNodeJsCode = (
540566
importedModulePath: new Set()
541567
};
542568
for (const exportTypeAlias of nodeJsCode.exportTypeAliasList) {
569+
reservedWord.checkUsingReservedWord(
570+
"export type name",
571+
"型の名前",
572+
exportTypeAlias.name
573+
);
543574
scanData.globalName.add(exportTypeAlias.name);
544575
typeExpr.scan(exportTypeAlias.typeExpr, scanData);
545576
}
546577
for (const exportVariable of nodeJsCode.exportVariableList) {
578+
reservedWord.checkUsingReservedWord(
579+
"export variable name",
580+
"変数名",
581+
exportVariable.name
582+
);
547583
scanData.globalName.add(exportVariable.name);
548584
typeExpr.scan(exportVariable.typeExpr, scanData);
549585
scanExpr(exportVariable.expr, scanData);
@@ -583,7 +619,7 @@ export const toNodeJsCodeAsTypeScript = (nodeJsCode: NodeJsCode): string => {
583619
const importedModuleNameMapAndNextIdentiferIndex = createImportedModuleName(
584620
scanData.importedModulePath,
585621
0,
586-
scanData.globalName
622+
new Set([...scanData.globalName, ...reservedWord.reservedWordSet])
587623
);
588624

589625
return (

source/reservedWord.ts

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/**
2+
* 予約語が使われているか調べる
3+
* @param nameInEnglish 調べている場所 エラーメッセージのためのヒント 英語
4+
* @param nameInJapanese 調べている場所 エラーメッセージのためのヒント 日本語
5+
* @param reservedWord 予約語かどうか調べるワード
6+
* @throws Error
7+
*/
8+
export const checkUsingReservedWord = (
9+
nameInEnglish: string,
10+
nameInJapanese: string,
11+
word: string
12+
): void => {
13+
if (reservedWordSet.has(word)) {
14+
throw new Error(
15+
`${nameInEnglish} is revered or names that cannot be used in context. word = ${word}
16+
${nameInJapanese}が予約語か文脈によって使えない名前になっています ワード = ${word}`
17+
);
18+
}
19+
};
20+
21+
export const reservedWordSet = new Set([
22+
"await",
23+
"break",
24+
"case",
25+
"catch",
26+
"class",
27+
"const",
28+
"continue",
29+
"debugger",
30+
"default",
31+
"delete",
32+
"do",
33+
"else",
34+
"export",
35+
"extends",
36+
"finally",
37+
"for",
38+
"function",
39+
"if",
40+
"import",
41+
"in",
42+
"instanceof",
43+
"new",
44+
"return",
45+
"super",
46+
"switch",
47+
"this",
48+
"throw",
49+
"try",
50+
"typeof",
51+
"var",
52+
"void",
53+
"while",
54+
"with",
55+
"yield",
56+
"let",
57+
"static",
58+
"enum",
59+
"implements",
60+
"package",
61+
"protected",
62+
"interface",
63+
"private",
64+
"public",
65+
"null",
66+
"true",
67+
"false",
68+
"any",
69+
"boolean",
70+
"constructor",
71+
"declare",
72+
"get",
73+
"module",
74+
"require",
75+
"number",
76+
"set",
77+
"string",
78+
"symbol",
79+
"type",
80+
"from",
81+
"of",
82+
"as",
83+
"unknown"
84+
]);

test/test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,20 @@ describe("test", () => {
7878
it("include import path", () => {
7979
expect(nodeJsTypeScriptCode).toMatch(importPath);
8080
});
81+
it("not include revered word", () => {
82+
const nodeJsCode = {
83+
exportTypeAliasList: [],
84+
exportVariableList: [
85+
{
86+
name: "new",
87+
document: "newという名前の変数",
88+
typeExpr: typeExpr.typeString,
89+
expr: main.stringLiteral("newData")
90+
}
91+
]
92+
};
93+
expect(() => {
94+
main.toNodeJsCodeAsTypeScript(nodeJsCode);
95+
}).toThrow();
96+
});
8197
});

0 commit comments

Comments
 (0)