Skip to content

Commit 87bb77c

Browse files
authored
Merge pull request AssemblyScript#23 from nearprotocol/number-types
Support more types for bindings generation
2 parents 38b020e + d1c0608 commit 87bb77c

13 files changed

+6740
-2356
lines changed

dist/asc_BASE_78558.js

Lines changed: 0 additions & 2 deletions
This file was deleted.

dist/asc_LOCAL_78558.js

Lines changed: 0 additions & 2 deletions
This file was deleted.

dist/asc_REMOTE_78558.js

Lines changed: 0 additions & 2 deletions
This file was deleted.

dist/assemblyscript.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/assemblyscript.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/definitions.ts

Lines changed: 53 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,14 @@ abstract class ExportsWalker {
156156
export class NEARBindingsBuilder extends ExportsWalker {
157157
private typeMapping: { [key: string]: string } = {
158158
"i32": "Integer",
159+
"u32": "Integer",
160+
"i64": "String",
161+
"u64": "String",
159162
"String": "String",
160163
"bool": "Boolean"
161164
};
162165

163-
private nonNullableTypes = ["i32", "bool"];
166+
private nonNullableTypes = ["i32", "u32", "i64", "u64", "bool"];
164167

165168
private sb: string[] = [];
166169
private generatedEncodeFunctions = new Set<string>();
@@ -265,22 +268,14 @@ export class NEARBindingsBuilder extends ExportsWalker {
265268
}
266269

267270
private generateHandlerMethods(valuePrefix: string, fields: any[]) : void {
268-
for (let fieldType in this.typeMapping) {
269-
let setterType = this.typeMapping[fieldType];
270-
let matchingFields = fields.filter(field => field.type.toString() == fieldType);
271-
if (matchingFields.length > 0) {
272-
this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {`);
273-
matchingFields.forEach(field => {
274-
this.sb.push(`if (name == "${field.name}") {
275-
${valuePrefix}${field.name} = value;
276-
return;
277-
}`);
278-
});
279-
this.sb.push(`
280-
super.set${setterType}(name, value);
281-
}`);
282-
}
271+
function fieldsWithTypes(types: string[]) {
272+
return fields.filter(field => types.indexOf(field.type.toString()) != -1);
283273
}
274+
275+
this.generateBasicSetterHandlers(valuePrefix, "Integer", "i64", fieldsWithTypes(["i32", "u32"]));
276+
this.generateBasicSetterHandlers(valuePrefix, "String", "String", fieldsWithTypes(["String", "i64", "u64"]));
277+
this.generateBasicSetterHandlers(valuePrefix, "Boolean", "bool", fieldsWithTypes(["bool"]));
278+
284279
this.sb.push("setNull(name: string): void {");
285280
fields.forEach((field) => {
286281
this.sb.push(`if (name == "${field.name}") {
@@ -314,6 +309,29 @@ export class NEARBindingsBuilder extends ExportsWalker {
314309
}`);
315310
}
316311

312+
private generateBasicSetterHandlers(valuePrefix: string, setterType: string, setterValueType: string, matchingFields: any[]) {
313+
if (matchingFields.length > 0) {
314+
this.sb.push(`set${setterType}(name: string, value: ${setterValueType}): void {`);
315+
matchingFields.forEach(field => {
316+
if (setterType == "String" && field.type != "String") {
317+
let className = field.type == "u64" ? "U64" : "I64";
318+
this.sb.push(`if (name == "${field.name}") {
319+
${valuePrefix}${field.name} = ${className}.parseInt(value);
320+
return;
321+
}`);
322+
} else {
323+
this.sb.push(`if (name == "${field.name}") {
324+
${valuePrefix}${field.name} = <${field.type}>value;
325+
return;
326+
}`);
327+
}
328+
});
329+
this.sb.push(`
330+
super.set${setterType}(name, value);
331+
}`);
332+
}
333+
}
334+
317335
private generatePushHandler(valuePrefix: string, fields: any[]) {
318336
fields.forEach((field) => {
319337
if (!(field.type.toString() in this.typeMapping)) {
@@ -328,10 +346,21 @@ export class NEARBindingsBuilder extends ExportsWalker {
328346
private generateArrayHandlerMethods(valuePrefix: string, fieldType: Type) : void {
329347
let setterType = this.typeMapping[fieldType.toString()];
330348
if (setterType) {
331-
this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {
332-
${valuePrefix}.push(value);
349+
let valueType = fieldType.toString();
350+
if (valueType == "u64" || valueType == "i64") {
351+
let className = valueType == "u64" ? "U64" : "I64";
352+
this.sb.push(`setString(name: string, value: string): void {
353+
${valuePrefix}.push(${className}.parseInt(value));
354+
}`);
355+
} else {
356+
if (valueType == "u32" || valueType == "i32") {
357+
valueType = "i64"
358+
}
359+
this.sb.push(`set${setterType}(name: string, value: ${valueType}): void {
360+
${valuePrefix}.push(<${fieldType}>value);
361+
}`);
333362
}
334-
setNull(name: string): void {
363+
this.sb.push(`setNull(name: string): void {
335364
${valuePrefix}.push(<${fieldType}>null);
336365
}
337366
pushArray(name: string): bool {
@@ -504,7 +533,11 @@ export class NEARBindingsBuilder extends ExportsWalker {
504533
} else {
505534
// Basic types
506535
if (this.nonNullableTypes.indexOf(fieldType.toString()) != -1) {
507-
this.sb.push(`encoder.set${setterType}(${fieldExpr}, ${sourceExpr});`);
536+
if (["i64", "u64"].indexOf(fieldType.toString()) != -1) {
537+
this.sb.push(`encoder.set${setterType}(${fieldExpr}, ${sourceExpr}.toString());`);
538+
} else {
539+
this.sb.push(`encoder.set${setterType}(${fieldExpr}, ${sourceExpr});`);
540+
}
508541
} else {
509542
this.sb.push(`if (${sourceExpr} != null) {
510543
encoder.set${setterType}(${fieldExpr}, ${sourceExpr});

tests/near-bindgen/main.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,14 @@ export function getStringArrayLength(arr: string[]): i32 {
3232
}
3333

3434
export function convertFoobars(foobars: Array<FooBar>): Array<ContainerClass> {
35+
/* TODO: Fix compiler bug https://github.com/AssemblyScript/assemblyscript/issues/539
3536
return foobars.map<ContainerClass>((it: FooBar, i: i32, arr: Array<FooBar>): ContainerClass => {
3637
return { foobar: it};
3738
});
39+
*/
40+
let result: ContainerClass[] = new Array(foobars.length);
41+
for (let i = 0; i < foobars.length; i++) {
42+
result[i] = { foobar: foobars[i] }
43+
}
44+
return result;
3845
}

tests/near-bindgen/main_near.ts.expected

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,13 @@ export class __near_ArgsParser_add extends ThrowingJSONHandler {
5959

6060
__near_param_x: i32;
6161
__near_param_y: i32;
62-
setInteger(name: string, value: i32): void {
62+
setInteger(name: string, value: i64): void {
6363
if (name == "x") {
64-
this.__near_param_x = value;
64+
this.__near_param_x = <i32>value;
6565
return;
6666
}
6767
if (name == "y") {
68-
this.__near_param_y = value;
68+
this.__near_param_y = <i32>value;
6969
return;
7070
}
7171

tests/near-bindgen/model.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
export class FooBar {
22
foo: i32 = 0;
3-
bar: i32 = 1;
3+
bar: u32 = 1;
4+
u64Val: u64 = 64;
5+
i64Val: i64 = -64;
46
flag: bool;
57
baz: string = "123";
68
//foobar: Uint8Array;
79
arr: Array<Array<string>>;
10+
u32Arr: u32[];
11+
i32Arr: i32[];
12+
// TODO: Fix u64 arrays
13+
//u64Arr: u64[];
814
}
915

1016
export class ContainerClass {

0 commit comments

Comments
 (0)