@@ -153,52 +153,49 @@ export class NEARBindingsBuilder extends ExportsWalker {
153
153
}
154
154
155
155
visitFunction ( element : Function ) : void {
156
- console . log ( "visitFunction: " + element . simpleName ) ;
157
- let signature = element . signature ;
156
+ this . generateArgsParser ( element ) ;
157
+ this . generateWrapperFunction ( element ) ;
158
+ }
158
159
160
+ private generateArgsParser ( element : Function ) {
161
+ let signature = element . signature ;
159
162
this . sb . push ( `export class __near_ArgsParser_${ element . simpleName } {
163
+ buffer: Uint8Array;
164
+ decoder: BSONDecoder<__near_ArgsParser_${ element . simpleName } >;
160
165
` ) ;
161
- let fields = [ ] ;
162
166
if ( signature . parameterNames ) {
163
- for ( let i = 0 ; i < signature . parameterNames . length ; i ++ ) {
164
- let paramName = signature . parameterNames [ i ] ;
165
- let paramType = signature . parameterTypes [ i ] ;
166
- fields . push ( {
167
- simpleName : paramName ,
168
- type : paramType
169
- } ) ;
170
- }
171
- }
172
- fields . forEach ( ( field ) => {
167
+ let fields = signature . parameterNames . map ( ( paramName , i ) => {
168
+ return { simpleName : paramName , type : signature . parameterTypes [ i ] } ;
169
+ } ) ;
170
+ fields . forEach ( ( field ) => {
173
171
this . sb . push ( `__near_param_${ field . simpleName } : ${ field . type } ;` ) ;
174
- } ) ;
175
- this . generateBSONHandlerMethods ( "this.__near_param_" , fields ) ;
176
- this . sb . push ( `}` ) ; // __near_ArgsParser
172
+ } ) ;
173
+ this . generateBSONHandlerMethods ( "this.__near_param_" , fields ) ;
174
+ } else {
175
+ this . generateBSONHandlerMethods ( "this.__near_param_" , [ ] ) ;
176
+ }
177
+ this . sb . push ( `}` ) ;
178
+ }
177
179
180
+ private generateWrapperFunction ( element : Function ) {
181
+ let signature = element . signature ;
178
182
let returnType = signature . returnType . toString ( ) ;
179
183
this . sb . push ( `export function near_func_${ element . simpleName } (): void {
180
184
let bson = new Uint8Array(input_read_len());
181
185
input_read_into(bson.buffer.data);
182
186
let handler = new __near_ArgsParser_${ element . simpleName } ();
183
- let decoder = new BSONDecoder<__near_ArgsParser_${ element . simpleName } >(handler);
184
- decoder.deserialize(bson);` ) ;
187
+ handler.buffer = bson;
188
+ handler.decoder = new BSONDecoder<__near_ArgsParser_${ element . simpleName } >(handler);
189
+ handler.decoder.deserialize(bson);` ) ;
185
190
if ( returnType != "void" ) {
186
191
this . sb . push ( `let result = ${ element . simpleName } (` ) ;
187
192
} else {
188
- this . sb . push ( `${ element . simpleName } (` )
193
+ this . sb . push ( `${ element . simpleName } (` ) ;
189
194
}
190
195
if ( signature . parameterNames ) {
191
- let i = 0 ;
192
- for ( let paramName of signature . parameterNames ) {
193
- this . sb . push ( `handler.__near_param_${ paramName } ` ) ;
194
- if ( i < signature . parameterNames . length ) {
195
- this . sb . push ( "," )
196
- }
197
- i ++ ;
198
- }
196
+ this . sb . push ( signature . parameterNames . map ( paramName => `handler.__near_param_${ paramName } ` ) . join ( "," ) ) ;
199
197
}
200
198
this . sb . push ( ");" ) ;
201
-
202
199
if ( returnType != "void" ) {
203
200
this . sb . push ( `
204
201
let encoder = new BSONEncoder();` ) ;
@@ -207,7 +204,6 @@ export class NEARBindingsBuilder extends ExportsWalker {
207
204
return_value(near.bufferWithSize(encoder.serialize()).buffer.data);
208
205
` ) ;
209
206
}
210
-
211
207
this . sb . push ( `}` ) ;
212
208
}
213
209
@@ -217,7 +213,9 @@ export class NEARBindingsBuilder extends ExportsWalker {
217
213
this . sb . push ( `set${ setterType } (name: string, value: ${ fieldType } ): void {` ) ;
218
214
fields . forEach ( ( field ) => {
219
215
if ( field . type . toString ( ) == fieldType ) {
220
- this . sb . push ( `if (name == "${ field . simpleName } ") { ${ valuePrefix } ${ field . simpleName } = value; return; }` ) ;
216
+ this . sb . push ( `if (name == "${ field . simpleName } ") {
217
+ ${ valuePrefix } ${ field . simpleName } = value; return;
218
+ }` ) ;
221
219
}
222
220
} ) ;
223
221
this . sb . push ( "}" ) ;
@@ -230,21 +228,34 @@ export class NEARBindingsBuilder extends ExportsWalker {
230
228
} ) ;
231
229
this . sb . push ( "}\n" ) ; // setNull
232
230
233
- // TODO: Suport nested objects/arrays
234
- // TODO: This needs some way to get current index in buffer (extract parser state into separte class?),
235
- // TODO: so that we can call method to parse object recursively
236
- // TODO: popObject() should also return false to exit nested parser?
237
231
this . sb . push ( `
238
- pushObject(name: string): bool { return false; }
232
+ pushObject(name: string): bool {` ) ;
233
+ fields . forEach ( ( field ) => {
234
+ if ( ! ( field . type . toString ( ) in this . typeMapping ) ) {
235
+ this . sb . push ( `if (name == "${ field . simpleName } ") {
236
+ ${ valuePrefix } ${ field . simpleName } = __near_decode_${ field . type } (this.buffer, this.decoder.readIndex);
237
+ return false;
238
+ }` ) ;
239
+ }
240
+ } ) ;
241
+ // TODO: Support arrays
242
+ this . sb . push ( `
243
+ return false;
244
+ }
239
245
popObject(): void {}
240
246
pushArray(name: string): bool { return false; }
241
247
popArray(): void {}
242
248
` ) ;
243
249
}
244
250
245
251
visitClass ( element : Class ) : void {
252
+ this . generateEncodeFunction ( element ) ;
253
+ this . generateHandler ( element ) ;
254
+ this . generateDecodeFunction ( element ) ;
255
+ }
256
+
257
+ private generateEncodeFunction ( element : Class ) {
246
258
let className = element . simpleName ;
247
- console . log ( "visitClass: " + className ) ;
248
259
this . sb . push ( `export function __near_encode_${ className } (
249
260
value: ${ className } ,
250
261
encoder: BSONEncoder): void {` ) ;
@@ -254,18 +265,27 @@ export class NEARBindingsBuilder extends ExportsWalker {
254
265
let sourceExpr = `value.${ fieldName } ` ;
255
266
this . generateFieldEncoder ( fieldType , fieldName , sourceExpr ) ;
256
267
} ) ;
257
- this . sb . push ( "}" ) ; // __near_encode
268
+ this . sb . push ( "}" ) ;
269
+ }
258
270
271
+ private generateHandler ( element : Class ) {
272
+ let className = element . simpleName ;
259
273
this . sb . push ( `export class __near_BSONHandler_${ className } {
274
+ buffer: Uint8Array;
275
+ decoder: BSONDecoder<__near_BSONHandler_${ className } >;
260
276
value: ${ className } = new ${ className } ();` ) ;
261
277
this . generateBSONHandlerMethods ( "this.value." , this . getFields ( element ) ) ;
262
- this . sb . push ( "}\n" ) ; // class __near_BSONHandler_
278
+ this . sb . push ( "}\n" ) ;
279
+ }
263
280
281
+ private generateDecodeFunction ( element : Class ) {
282
+ let className = element . simpleName ;
264
283
this . sb . push ( `export function __near_decode_${ className } (
265
284
buffer: Uint8Array, offset: i32): ${ className } {
266
285
let handler = new __near_BSONHandler_${ className } ();
267
- let decoder = new BSONDecoder<__near_BSONHandler_${ className } >(handler);
268
- decoder.deserialize(buffer, offset);
286
+ handler.buffer = buffer;
287
+ handler.decoder = new BSONDecoder<__near_BSONHandler_${ className } >(handler);
288
+ handler.decoder.deserialize(buffer, offset);
269
289
return handler.value;
270
290
}\n` ) ;
271
291
}
@@ -296,17 +316,11 @@ export class NEARBindingsBuilder extends ExportsWalker {
296
316
}
297
317
298
318
private getFields ( element : Class ) : any [ ] {
299
- var members = element . members ;
300
- var results = [ ] ;
301
- if ( members ) {
302
- for ( let member of members . values ( ) ) {
303
- if ( ! ( member instanceof Field ) ) {
304
- continue ;
305
- }
306
- results . push ( member ) ;
307
- }
319
+ if ( ! element . members ) {
320
+ return [ ] ;
308
321
}
309
- return results ;
322
+
323
+ return [ ...element . members . values ( ) ] . filter ( member => member instanceof Field ) ;
310
324
}
311
325
312
326
visitInterface ( element : Interface ) : void {
0 commit comments