Skip to content

Commit

Permalink
fix(protoc-gen-ng): properties are always generated in optional inter…
Browse files Browse the repository at this point in the history
…faces
  • Loading branch information
damirsaifut committed Nov 22, 2022
1 parent 79bba40 commit 53f0969
Show file tree
Hide file tree
Showing 8 changed files with 136 additions and 220 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import { Proto } from '../../../input/proto';
import { ProtoMessage } from '../../../input/proto-message';
import { ProtoMessageField } from '../../../input/proto-message-field';
import { camelizeSafe } from '../../../utils';
import { getDataType } from '../../misc/helpers';
import { Printer } from '../../misc/printer';
import { MessageField } from '../message-field';
import { OneOf } from '../oneof';

export abstract class AbstractMessageField implements MessageField {
protected attributeName: string;
protected dataType: string;

constructor(
protected proto: Proto,
protected message: ProtoMessage,
protected messageField: ProtoMessageField,
protected oneOf?: OneOf,
) {
this.attributeName = camelizeSafe(this.messageField.name);
this.dataType = getDataType(this.proto, this.messageField);
}

get postfixProp(): string {
return this.messageField.proto3Optional ? '?' : '';
}

get type(): string {
return this.messageField.proto3Optional ? `${this.dataType} | undefined` : this.dataType;
}

abstract printDeserializeBinaryFromReader(printer: Printer): void;

abstract printSerializeBinaryToWriter(printer: Printer): void;

printPrivateAttribute(printer: Printer): void {
printer.add(`private _${this.attributeName}${this.postfixProp}: ${this.dataType};`);
}

abstract printInitializer(printer: Printer): void;

abstract printDefaultValueSetter(printer: Printer): void;

printGetter(printer: Printer) {
printer.add(`get ${this.attributeName}(): ${this.type} { return this._${this.attributeName} }`);
}

printSetter(printer: Printer) {
printer.add(`set ${this.attributeName}(value${this.postfixProp}: ${this.dataType}) {
${this.oneOf ? this.oneOf.createFieldSetterAddon(this.messageField) : ''}
this._${this.attributeName} = value;
}`);
}

abstract printToObjectMapping(printer: Printer): void;

printAsObjectMapping(printer: Printer): void {
printer.add(`${this.attributeName}${this.postfixProp}: ${this.dataType};`);
}

abstract printToProtobufJSONMapping(printer: Printer): void;

abstract printAsJSONMapping(printer: Printer): void;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,26 @@ import { Proto } from '../../../input/proto';
import { ProtoMessage } from '../../../input/proto-message';
import { ProtoMessageField } from '../../../input/proto-message-field';
import { ProtoMessageFieldCardinality } from '../../../input/types';
import { camelizeSafe } from '../../../utils';
import { getDataType, isPacked } from '../../misc/helpers';
import { isPacked } from '../../misc/helpers';
import { Printer } from '../../misc/printer';
import { MessageField } from '../message-field';
import { OneOf } from '../oneof';
import { AbstractMessageField } from './abstract-message-field';

export class BooleanMessageField implements MessageField {
export class BooleanMessageField extends AbstractMessageField {

private attributeName: string;
private dataType: string;
private isArray: boolean;
private isPacked: boolean;

constructor(
private proto: Proto,
private message: ProtoMessage,
private messageField: ProtoMessageField,
private oneOf?: OneOf,
override proto: Proto,
override message: ProtoMessage,
override messageField: ProtoMessageField,
override oneOf?: OneOf,
) {
this.attributeName = camelizeSafe(this.messageField.name);
super(proto, message, messageField, oneOf);

this.isArray = this.messageField.label === ProtoMessageFieldCardinality.repeated;
this.isPacked = isPacked(this.proto, this.messageField);
this.dataType = getDataType(this.proto, this.messageField);
}

printDeserializeBinaryFromReader(printer: Printer) {
Expand Down Expand Up @@ -63,10 +60,6 @@ export class BooleanMessageField implements MessageField {
}
}

printPrivateAttribute(printer: Printer) {
printer.add(`private _${this.attributeName}?: ${this.dataType};`);
}

printInitializer(printer: Printer) {
if (this.isArray) {
printer.add(`this.${this.attributeName} = (_value.${this.attributeName} || []).slice();`);
Expand All @@ -85,17 +78,6 @@ export class BooleanMessageField implements MessageField {
}
}

printGetter(printer: Printer) {
printer.add(`get ${this.attributeName}(): ${this.dataType} | undefined { return this._${this.attributeName} }`);
}

printSetter(printer: Printer) {
printer.add(`set ${this.attributeName}(value: ${this.dataType} | undefined) {
${this.oneOf ? this.oneOf.createFieldSetterAddon(this.messageField) : ''}
this._${this.attributeName} = value;
}`);
}

printToObjectMapping(printer: Printer) {
if (this.isArray) {
printer.add(`${this.attributeName}: (this.${this.attributeName} || []).slice(),`);
Expand All @@ -104,10 +86,6 @@ export class BooleanMessageField implements MessageField {
}
}

printAsObjectMapping(printer: Printer) {
printer.add(`${this.attributeName}?: ${this.dataType};`);
}

printToProtobufJSONMapping(printer: Printer) {
if (this.isArray) {
printer.add(`${this.attributeName}: (this.${this.attributeName} || []).slice(),`);
Expand All @@ -119,7 +97,7 @@ export class BooleanMessageField implements MessageField {
}

printAsJSONMapping(printer: Printer) {
printer.add(`${this.attributeName}?: ${this.dataType}${this.messageField.proto3Optional ? ' | null' : ''};`);
printer.add(`${this.attributeName}: ${this.dataType}${this.messageField.proto3Optional ? ' | null' : ''};`);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,24 @@ import { Proto } from '../../../input/proto';
import { ProtoMessage } from '../../../input/proto-message';
import { ProtoMessageField } from '../../../input/proto-message-field';
import { ProtoMessageFieldCardinality } from '../../../input/types';
import { camelizeSafe } from '../../../utils';
import { ExternalDependencies } from '../../misc/dependencies';
import { getDataType } from '../../misc/helpers';
import { Printer } from '../../misc/printer';
import { MessageField } from '../message-field';
import { OneOf } from '../oneof';
import { AbstractMessageField } from './abstract-message-field';

export class BytesMessageField implements MessageField {
export class BytesMessageField extends AbstractMessageField {

private attributeName: string;
private dataType: string;
private isArray: boolean;

constructor(
private proto: Proto,
private message: ProtoMessage,
private messageField: ProtoMessageField,
private oneOf?: OneOf,
override proto: Proto,
override message: ProtoMessage,
override messageField: ProtoMessageField,
override oneOf?: OneOf,
) {
this.attributeName = camelizeSafe(this.messageField.name);
super(proto, message, messageField, oneOf);

this.isArray = this.messageField.label === ProtoMessageFieldCardinality.repeated;
this.dataType = getDataType(this.proto, this.messageField);
}

printDeserializeBinaryFromReader(printer: Printer) {
Expand All @@ -50,10 +46,6 @@ export class BytesMessageField implements MessageField {
}
}

printPrivateAttribute(printer: Printer) {
printer.add(`private _${this.attributeName}?: ${this.dataType};`);
}

printInitializer(printer: Printer) {
if (this.isArray) {
printer.add(`this.${this.attributeName} = (_value.${this.attributeName} || []).map(b => b ? b.subarray(0) : new Uint8Array());`);
Expand All @@ -72,17 +64,6 @@ export class BytesMessageField implements MessageField {
}
}

printGetter(printer: Printer) {
printer.add(`get ${this.attributeName}(): ${this.dataType} | undefined { return this._${this.attributeName} }`);
}

printSetter(printer: Printer) {
printer.add(`set ${this.attributeName}(value: ${this.dataType} | undefined) {
${this.oneOf ? this.oneOf.createFieldSetterAddon(this.messageField) : ''}
this._${this.attributeName} = value;
}`);
}

printToObjectMapping(printer: Printer) {
if (this.isArray) {
printer.add(`${this.attributeName}: (this.${this.attributeName} || []).map(b => b ? b.subarray(0) : new Uint8Array()),`);
Expand All @@ -91,10 +72,6 @@ export class BytesMessageField implements MessageField {
}
}

printAsObjectMapping(printer: Printer) {
printer.add(`${this.attributeName}?: ${this.dataType};`);
}

printToProtobufJSONMapping(printer: Printer) {
printer.addDeps(ExternalDependencies.uint8ArrayToBase64);

Expand All @@ -107,9 +84,9 @@ export class BytesMessageField implements MessageField {

printAsJSONMapping(printer: Printer) {
if (this.messageField.proto3Optional) {
printer.add(`${this.attributeName}?: string | null;`);
printer.add(`${this.attributeName}: string | null;`);
} else {
printer.add(`${this.attributeName}?: string${this.isArray ? '[]' : ''};`);
printer.add(`${this.attributeName}: string${this.isArray ? '[]' : ''};`);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,31 @@ import { Proto } from '../../../input/proto';
import { ProtoMessage } from '../../../input/proto-message';
import { ProtoMessageField } from '../../../input/proto-message-field';
import { ProtoMessageFieldCardinality } from '../../../input/types';
import { camelizeSafe } from '../../../utils';
import { getDataType, isPacked } from '../../misc/helpers';
import { Printer } from '../../misc/printer';
import { MessageField } from '../message-field';
import { OneOf } from '../oneof';
import { AbstractMessageField } from './abstract-message-field';

export class EnumMessageField implements MessageField {
export class EnumMessageField extends AbstractMessageField {

private attributeName: string;
private dataType: string;
private notRepeatedDataType: string;
private isArray: boolean;
private isPacked: boolean;

constructor(
private proto: Proto,
private message: ProtoMessage,
private messageField: ProtoMessageField,
private oneOf?: OneOf,
override proto: Proto,
override message: ProtoMessage,
override messageField: ProtoMessageField,
override oneOf?: OneOf,
) {
this.attributeName = camelizeSafe(this.messageField.name);
this.isArray = this.messageField.label === ProtoMessageFieldCardinality.repeated;
super(proto, message, messageField, oneOf);

this.isArray =
this.messageField.label === ProtoMessageFieldCardinality.repeated;
this.isPacked = isPacked(this.proto, this.messageField);
this.dataType = getDataType(this.proto, this.messageField);
this.notRepeatedDataType = getDataType(this.proto, this.messageField, { ignoreRepeating: true });
this.notRepeatedDataType = getDataType(this.proto, this.messageField, {
ignoreRepeating: true,
});
}

printDeserializeBinaryFromReader(printer: Printer) {
Expand Down Expand Up @@ -65,10 +65,6 @@ export class EnumMessageField implements MessageField {
}
}

printPrivateAttribute(printer: Printer) {
printer.add(`private _${this.attributeName}?: ${this.dataType};`);
}

printInitializer(printer: Printer) {
if (this.isArray) {
printer.add(`this.${this.attributeName} = (_value.${this.attributeName} || []).slice();`);
Expand All @@ -87,17 +83,6 @@ export class EnumMessageField implements MessageField {
}
}

printGetter(printer: Printer) {
printer.add(`get ${this.attributeName}(): ${this.dataType} | undefined { return this._${this.attributeName} }`);
}

printSetter(printer: Printer) {
printer.add(`set ${this.attributeName}(value: ${this.dataType} | undefined) {
${this.oneOf ? this.oneOf.createFieldSetterAddon(this.messageField) : ''}
this._${this.attributeName} = value;
}`);
}

printToObjectMapping(printer: Printer) {
if (this.isArray) {
printer.add(`${this.attributeName}: (this.${this.attributeName} || []).slice(),`);
Expand All @@ -106,10 +91,6 @@ export class EnumMessageField implements MessageField {
}
}

printAsObjectMapping(printer: Printer) {
printer.add(`${this.attributeName}?: ${this.dataType};`);
}

printToProtobufJSONMapping(printer: Printer) {
if (this.isArray) {
printer.add(`${this.attributeName}: (this.${this.attributeName} || []).map(v => ${this.notRepeatedDataType}[v]),`);
Expand All @@ -121,7 +102,7 @@ export class EnumMessageField implements MessageField {
}

printAsJSONMapping(printer: Printer) {
printer.add(`${this.attributeName}?: string${this.isArray ? '[]' : ''}${this.oneOf || this.messageField.proto3Optional ? ' | null' : ''};`);
printer.add(`${this.attributeName}: string${this.isArray ? '[]' : ''}${this.oneOf || this.messageField.proto3Optional ? ' | null' : ''};`);
}

}

0 comments on commit 53f0969

Please sign in to comment.