Skip to content
Merged

Dev #430

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ jobs:
- uses: denoland/setup-deno@v2
with:
deno-version: v2.x
- run: deno check .
- run: deno check
- run: deno test
- run: deno publish --dry-run
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ console.log(codeAsString);

```ts
/** generated by
* - https://jsr.io/@narumincho/js-ts-code-generator@0.7.0
* - https://jsr.io/@narumincho/js-ts-code-generator@0.8.0
* Do not edit!
*
* @module
Expand Down
61 changes: 34 additions & 27 deletions collect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -283,39 +283,46 @@ const collectInExpr = (

case "Lambda": {
const parameterNameSet = new Set(
expr.lambdaExpr.parameterList.map((parameter) => parameter.name),
expr.lambda.parameterList.map((parameter) => parameter.name),
);
const newTypeParameterSetList = typeParameterSetList.concat(
new Set(
expr.lambdaExpr.typeParameterList.map((e) => e.name),
expr.lambda.typeParameterList.map((e) => e.name),
),
);
const inParameter = collectList(
expr.lambda.parameterList,
(oneParameter) => {
const inParameter: UsedNameAndModulePathSet = {
usedNameSet: new Set([oneParameter.name]),
modulePathSet: new Set(),
};
return oneParameter.type
? concatCollectData(
inParameter,
collectInType(
oneParameter.type,
rootScopeIdentifierSet,
newTypeParameterSetList,
),
)
: inParameter;
},
);

return concatCollectData(
concatCollectData(
collectList(
expr.lambdaExpr.parameterList,
(oneParameter) =>
concatCollectData(
{
usedNameSet: new Set([oneParameter.name]),
modulePathSet: new Set(),
},
collectInType(
oneParameter.type,
rootScopeIdentifierSet,
newTypeParameterSetList,
),
),
),
collectInType(
expr.lambdaExpr.returnType,
rootScopeIdentifierSet,
newTypeParameterSetList,
),
),
expr.lambda.returnType
? concatCollectData(
inParameter,
collectInType(
expr.lambda.returnType,
rootScopeIdentifierSet,
newTypeParameterSetList,
),
)
: inParameter,
collectStatementList(
expr.lambdaExpr.statementList,
expr.lambda.statementList,
localVariableNameSetList,
newTypeParameterSetList,
rootScopeIdentifierSet,
Expand Down Expand Up @@ -796,10 +803,10 @@ const collectInType = (
return concatCollectData(
{
modulePathSet: new Set(),
usedNameSet: new Set([type_.typeNameAndTypeParameter.name]),
usedNameSet: new Set([type_.typeNameAndArguments.name]),
},
collectList(
type_.typeNameAndTypeParameter.arguments,
type_.typeNameAndArguments.arguments,
(parameter) =>
collectInType(
parameter,
Expand Down
10 changes: 5 additions & 5 deletions data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ export type Expr =
readonly type: "ObjectLiteral";
readonly memberList: ReadonlyArray<Member>;
}
| { readonly type: "Lambda"; readonly lambdaExpr: LambdaExpr }
| { readonly type: "Lambda"; readonly lambda: Lambda }
| { readonly type: "Variable"; readonly identifier: Identifier }
| { readonly type: "GlobalObjects"; readonly identifier: Identifier }
| {
Expand Down Expand Up @@ -219,7 +219,7 @@ export type Type =
| {
readonly type: "WithNamespace";
readonly namespace: NonEmptyArray<Identifier>;
readonly typeNameAndTypeParameter: TypeNameAndArguments;
readonly typeNameAndArguments: TypeNameAndArguments;
}
| { readonly type: "StringLiteral"; readonly string: string }
| { readonly type: "uniqueSymbol" };
Expand Down Expand Up @@ -518,7 +518,7 @@ export type KeyValue = {
/**
* ラムダ式
*/
export type LambdaExpr = {
export type Lambda = {
readonly isAsync: boolean;
/**
* パラメーターのリスト
Expand All @@ -531,7 +531,7 @@ export type LambdaExpr = {
/**
* 戻り値の型
*/
readonly returnType: Type;
readonly returnType: Type | undefined;
/**
* ラムダ式本体
*/
Expand Down Expand Up @@ -716,5 +716,5 @@ export type Parameter = {
/**
* パラメーターの型
*/
readonly type: Type;
readonly type: Type | undefined;
};
2 changes: 1 addition & 1 deletion deno.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@narumincho/js-ts-code-generator",
"version": "0.7.0",
"version": "0.8.0",
"license": "MIT",
"exports": {
".": "./mod.ts",
Expand Down
50 changes: 46 additions & 4 deletions expr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,12 @@ export const callMethod = (
*/
export const callThenMethod = (
expr: d.Expr,
thenLambda: d.LambdaExpr,
thenLambda: d.Lambda,
): d.Expr => ({
type: "Call",
callExpr: {
expr: get(expr, "then"),
parameterList: [{ type: "Lambda", lambdaExpr: thenLambda }],
parameterList: [{ type: "Lambda", lambda: thenLambda }],
},
});

Expand All @@ -48,12 +48,12 @@ export const callThenMethod = (
*/
export const callCatchMethod = (
expr: d.Expr,
thenLambda: d.LambdaExpr,
thenLambda: d.Lambda,
): d.Expr => ({
type: "Call",
callExpr: {
expr: get(expr, "catch"),
parameterList: [{ type: "Lambda", lambdaExpr: thenLambda }],
parameterList: [{ type: "Lambda", lambda: thenLambda }],
},
});

Expand Down Expand Up @@ -581,3 +581,45 @@ export const symbolToStringTag: d.Expr = get({
type: "GlobalObjects",
identifier: identifier.identifierFromString("Symbol"),
}, "toStringTag");

export const lambda = ({
isAsync = false,
typeParameterList = [],
parameterList,
returnType,
statementList,
}: LambdaInput): d.Expr => ({
type: "Lambda",
lambda: {
isAsync,
typeParameterList,
parameterList,
returnType,
statementList,
},
});

export type LambdaInput = {
/**
* @default {false}
*/
readonly isAsync?: boolean;
/**
* パラメーターのリスト
*/
readonly parameterList: ReadonlyArray<d.Parameter>;
/**
* 型パラメーターのリスト
*
* @default {[]}
*/
readonly typeParameterList?: ReadonlyArray<d.TypeParameter>;
/**
* 戻り値の型
*/
readonly returnType: d.Type | undefined;
/**
* ラムダ式本体
*/
readonly statementList: ReadonlyArray<d.Statement>;
};
6 changes: 3 additions & 3 deletions test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -883,7 +883,7 @@ Deno.test("output lambda type parameter", () => {
},
expr: {
type: "Lambda",
lambdaExpr: {
lambda: {
isAsync: false,
parameterList: [
{
Expand Down Expand Up @@ -1065,7 +1065,7 @@ Deno.test("read me code", () => {
codeType: "TypeScript",
}),
`/** generated by
* - https://jsr.io/@narumincho/js-ts-code-generator@0.7.0
* - https://jsr.io/@narumincho/js-ts-code-generator@0.8.0
* Do not edit!
*
* @module
Expand Down Expand Up @@ -1123,7 +1123,7 @@ Deno.test("import name", () => {
assertEquals(
codeAsString,
`/** generated by
* - https://jsr.io/@narumincho/js-ts-code-generator@0.7.0
* - https://jsr.io/@narumincho/js-ts-code-generator@0.8.0
* Do not edit!
*
* @module
Expand Down
24 changes: 14 additions & 10 deletions toString/expr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,30 +77,34 @@ export const exprToString = (

case "Lambda": {
const c: Context = addUsedName(context, {
variableNameSet: expr.lambdaExpr.parameterList.map((parameter) =>
variableNameSet: expr.lambda.parameterList.map((parameter) =>
parameter.name
),
typeNameSet: expr.lambdaExpr.typeParameterList.map((parameter) =>
typeNameSet: expr.lambda.typeParameterList.map((parameter) =>
parameter.name
),
});

return (
(expr.lambdaExpr.isAsync ? "async " : "") +
typeParameterListToString(expr.lambdaExpr.typeParameterList, context) +
(expr.lambda.isAsync ? "async " : "") +
typeParameterListToString(expr.lambda.typeParameterList, context) +
"(" +
expr.lambdaExpr.parameterList
expr.lambda.parameterList
.map(
(parameter) =>
parameter.name +
typeAnnotation(parameter.type, c),
parameter.type
? parameter.name +
typeAnnotation(parameter.type, c)
: parameter.name,
)
.join(", ") +
")" +
typeAnnotation(expr.lambdaExpr.returnType, c) +
(expr.lambda.returnType
? typeAnnotation(expr.lambda.returnType, c)
: "") +
" => " +
lambdaBodyToString(
expr.lambdaExpr.statementList,
expr.lambda.statementList,
indent,
c,
)
Expand Down Expand Up @@ -414,7 +418,7 @@ export const lambdaBodyToString = (
return exprToStringWithCombineStrength(
{
type: "Lambda",
lambdaExpr: {
lambda: {
isAsync: false,
typeParameterList: [],
parameterList: [],
Expand Down
4 changes: 2 additions & 2 deletions toString/type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,9 +100,9 @@ export const typeToString = (
return (
type_.namespace.join(".") +
"." +
type_.typeNameAndTypeParameter.name +
type_.typeNameAndArguments.name +
typeArgumentsListToString(
type_.typeNameAndTypeParameter.arguments,
type_.typeNameAndArguments.arguments,
context,
)
);
Expand Down
9 changes: 5 additions & 4 deletions type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,15 +137,16 @@ export const ReadonlySet = (elementType: Type): Type => ({
});

/**
* ファイルスコープ内の型を指定する (引数なし)
* ファイルスコープ内の型を指定する
*/
export const scopeInFile = (
name: Identifier,
argumentList: ReadonlyArray<Type> = [],
): Type => ({
type: "ScopeInFile",
typeNameAndArguments: {
name,
arguments: [],
arguments: argumentList,
},
});

Expand All @@ -161,7 +162,7 @@ export const union = (typeList: ReadonlyArray<Type>): Type => ({
* Object 型 `{ readonly a: string, readonly b: number }`
*/
export const object = (
memberList: ReadonlyArray<ObjectMember>,
memberList: ReadonlyArray<MemberInput>,
): Type => ({
type: "Object",
memberList: memberList.map((member): MemberType => ({
Expand All @@ -173,7 +174,7 @@ export const object = (
})),
});

export type ObjectMember = {
export type MemberInput = {
readonly name: PropertyName;
/**
* @default {true}
Expand Down