Skip to content

Commit 4440334

Browse files
authored
fix: some reserved keywords are overlooked (#369)
1 parent 5c88f98 commit 4440334

File tree

9 files changed

+31
-22
lines changed

9 files changed

+31
-22
lines changed

src/generators/csharp/CSharpRenderer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export abstract class CSharpRenderer extends AbstractRenderer<CSharpOptions> {
3030
*/
3131
nameType(name: string | undefined, model?: CommonModel): string {
3232
return this.options?.namingConvention?.type
33-
? this.options.namingConvention.type(name, { model: model || this.model, inputModel: this.inputModel, isReservedKeyword: isReservedCSharpKeyword(`${name}`) })
33+
? this.options.namingConvention.type(name, { model: model || this.model, inputModel: this.inputModel, reservedKeywordCallback: isReservedCSharpKeyword })
3434
: name || '';
3535
}
3636

@@ -42,7 +42,7 @@ export abstract class CSharpRenderer extends AbstractRenderer<CSharpOptions> {
4242
*/
4343
nameProperty(propertyName: string | undefined, property?: CommonModel): string {
4444
return this.options?.namingConvention?.property
45-
? this.options.namingConvention.property(propertyName, { model: this.model, inputModel: this.inputModel, property, isReservedKeyword: isReservedCSharpKeyword(`${propertyName}`) })
45+
? this.options.namingConvention.property(propertyName, { model: this.model, inputModel: this.inputModel, property, reservedKeywordCallback: isReservedCSharpKeyword })
4646
: propertyName || '';
4747
}
4848

src/generators/java/JavaRenderer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export abstract class JavaRenderer extends AbstractRenderer<JavaOptions, JavaGen
3030
*/
3131
nameType(name: string | undefined, model?: CommonModel): string {
3232
return this.options?.namingConvention?.type
33-
? this.options.namingConvention.type(name, { model: model || this.model, inputModel: this.inputModel, isReservedKeyword: isReservedJavaKeyword(`${name}`) })
33+
? this.options.namingConvention.type(name, { model: model || this.model, inputModel: this.inputModel, reservedKeywordCallback: isReservedJavaKeyword })
3434
: name || '';
3535
}
3636

@@ -42,7 +42,7 @@ export abstract class JavaRenderer extends AbstractRenderer<JavaOptions, JavaGen
4242
*/
4343
nameProperty(propertyName: string | undefined, property?: CommonModel): string {
4444
return this.options?.namingConvention?.property
45-
? this.options.namingConvention.property(propertyName, { model: this.model, inputModel: this.inputModel, property, isReservedKeyword: isReservedJavaKeyword(`${propertyName}`) })
45+
? this.options.namingConvention.property(propertyName, { model: this.model, inputModel: this.inputModel, property, reservedKeywordCallback: isReservedJavaKeyword })
4646
: propertyName || '';
4747
}
4848

src/generators/javascript/JavaScriptRenderer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export abstract class JavaScriptRenderer extends AbstractRenderer<JavaScriptOpti
3030
*/
3131
nameType(name: string | undefined, model?: CommonModel): string {
3232
return this.options?.namingConvention?.type
33-
? this.options.namingConvention.type(name, { model: model || this.model, inputModel: this.inputModel, isReservedKeyword: isReservedJavaScriptKeyword(`${name}`) })
33+
? this.options.namingConvention.type(name, { model: model || this.model, inputModel: this.inputModel, reservedKeywordCallback: isReservedJavaScriptKeyword })
3434
: name || '';
3535
}
3636

@@ -42,7 +42,7 @@ export abstract class JavaScriptRenderer extends AbstractRenderer<JavaScriptOpti
4242
*/
4343
nameProperty(propertyName: string | undefined, property?: CommonModel): string {
4444
return this.options?.namingConvention?.property
45-
? this.options.namingConvention.property(propertyName, { model: this.model, inputModel: this.inputModel, property, isReservedKeyword: isReservedJavaScriptKeyword(`${propertyName}`) })
45+
? this.options.namingConvention.property(propertyName, { model: this.model, inputModel: this.inputModel, property, reservedKeywordCallback: isReservedJavaScriptKeyword })
4646
: propertyName || '';
4747
}
4848

src/generators/typescript/TypeScriptRenderer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export abstract class TypeScriptRenderer extends AbstractRenderer<TypeScriptOpti
3232
*/
3333
nameType(name: string | undefined, model?: CommonModel): string {
3434
return this.options?.namingConvention?.type
35-
? this.options.namingConvention.type(name, { model: model || this.model, inputModel: this.inputModel, isReservedKeyword: isReservedTypeScriptKeyword(`${name}`)})
35+
? this.options.namingConvention.type(name, { model: model || this.model, inputModel: this.inputModel, reservedKeywordCallback: isReservedTypeScriptKeyword })
3636
: name || '';
3737
}
3838

@@ -44,7 +44,7 @@ export abstract class TypeScriptRenderer extends AbstractRenderer<TypeScriptOpti
4444
*/
4545
nameProperty(propertyName: string | undefined, property?: CommonModel): string {
4646
return this.options?.namingConvention?.property
47-
? this.options.namingConvention.property(propertyName, { model: this.model, inputModel: this.inputModel, property, isReservedKeyword: isReservedTypeScriptKeyword(`${propertyName}`) })
47+
? this.options.namingConvention.property(propertyName, { model: this.model, inputModel: this.inputModel, property, reservedKeywordCallback: isReservedTypeScriptKeyword })
4848
: propertyName || '';
4949
}
5050

src/helpers/NameHelpers.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ export function getUniquePropertyName(rootModel: CommonModel, propertyName: stri
2727
/**
2828
* The common naming convention context type.
2929
*/
30-
export type CommonTypeNamingConventionCtx = { model: CommonModel, inputModel: CommonInputModel, isReservedKeyword?: boolean};
31-
export type CommonPropertyNamingConventionCtx = { model: CommonModel, inputModel: CommonInputModel, property?: CommonModel, isReservedKeyword?: boolean};
30+
export type CommonTypeNamingConventionCtx = { model: CommonModel, inputModel: CommonInputModel, reservedKeywordCallback?: (name: string) => boolean};
31+
export type CommonPropertyNamingConventionCtx = { model: CommonModel, inputModel: CommonInputModel, property?: CommonModel, reservedKeywordCallback?: (name: string) => boolean};
3232

3333
/**
3434
* The common naming convention type shared between generators for different languages.
@@ -44,22 +44,24 @@ export type CommonNamingConvention = {
4444
export const CommonNamingConventionImplementation: CommonNamingConvention = {
4545
type: (name, ctx) => {
4646
if (!name) {return '';}
47-
if (ctx.isReservedKeyword) {
48-
name = `reserved_${name}`;
47+
let formattedName = FormatHelpers.toPascalCase(name);
48+
if (ctx.reservedKeywordCallback !== undefined && ctx.reservedKeywordCallback(formattedName)) {
49+
formattedName = FormatHelpers.toPascalCase(`reserved_${formattedName}`);
4950
}
50-
return FormatHelpers.toPascalCase(name);
51+
return formattedName;
5152
},
5253
property: (name, ctx) => {
5354
if (!name) {return '';}
54-
if (ctx.isReservedKeyword) {
55+
let formattedName = FormatHelpers.toCamelCase(name);
56+
if (ctx.reservedKeywordCallback !== undefined && ctx.reservedKeywordCallback(formattedName)) {
5557
// If name is considered reserved, make sure we rename it appropriately
5658
// and make sure no clashes occur.
57-
name = FormatHelpers.toCamelCase(`reserved_${name}`);
58-
if (Object.keys(ctx.model.properties || {}).includes(name)) {
59+
formattedName = FormatHelpers.toCamelCase(`reserved_${formattedName}`);
60+
if (Object.keys(ctx.model.properties || {}).includes(formattedName)) {
5961
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
60-
return CommonNamingConventionImplementation.property!(name, ctx);
62+
return CommonNamingConventionImplementation.property!(`reserved_${formattedName}`, ctx);
6163
}
6264
}
63-
return FormatHelpers.toCamelCase(name);
65+
return formattedName;
6466
}
6567
};

test/generators/java/JavaRenderer.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ describe('JavaRenderer', () => {
1717
});
1818
test('should render reserved type keyword correctly', () => {
1919
const name = renderer.nameType('enum');
20-
expect(name).toEqual('ReservedEnum');
20+
expect(name).toEqual('Enum');
2121
});
2222
});
2323

test/generators/javascript/JavaScriptRenderer.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ describe('JavaScriptRenderer', () => {
1717
});
1818
test('should render reserved type keyword correctly', () => {
1919
const name = renderer.nameType('enum');
20-
expect(name).toEqual('ReservedEnum');
20+
expect(name).toEqual('Enum');
2121
});
2222
});
2323

test/generators/typescript/TypeScriptRenderer.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ describe('TypeScriptRenderer', () => {
1717
});
1818
test('should render reserved type keyword correctly', () => {
1919
const name = renderer.nameType('enum');
20-
expect(name).toEqual('ReservedEnum');
20+
expect(name).toEqual('Enum');
2121
});
2222
});
2323

test/helpers/NameHelpers.spec.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ describe('NameHelpers', () => {
2020
});
2121

2222
describe('CommonNamingConventionImplementation', () => {
23-
const defaultCtx = {model: CommonModel.toCommonModel({}), inputModel: new CommonInputModel()};
23+
const isReservedKeyword = jest.fn().mockReturnValue(false);
24+
const defaultCtx = {model: CommonModel.toCommonModel({}), inputModel: new CommonInputModel(), reservedKeywordCallback: isReservedKeyword};
2425
describe('type', () => {
2526
test('should handle undefined', () => {
2627
const name = undefined;
@@ -44,6 +45,12 @@ describe('NameHelpers', () => {
4445
const formattedName = CommonNamingConventionImplementation!.property!(name, defaultCtx);
4546
expect(formattedName).toEqual('someNotPascalString');
4647
});
48+
test('Should return accurate reserved property name', () => {
49+
const name = '$ref';
50+
isReservedKeyword.mockReturnValueOnce(true);
51+
const formattedName = CommonNamingConventionImplementation!.property!(name, defaultCtx);
52+
expect(formattedName).toEqual('reservedRef');
53+
});
4754
});
4855
});
4956
});

0 commit comments

Comments
 (0)