Skip to content

Commit c90e09a

Browse files
authored
Merge pull request AssemblyScript#21 from nearprotocol/string-array-input
Test string array input
2 parents 704e67f + 7538db5 commit c90e09a

File tree

9 files changed

+1522
-241
lines changed

9 files changed

+1522
-241
lines changed

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: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ export class NEARBindingsBuilder extends ExportsWalker {
167167
private generatedDecodeFunctions = new Set<string>();
168168
private exportedClasses: Class[] = [];
169169
private exportedFunctions: Function[] = [];
170-
private filesByImport = new Map<string, string>();
171170

172171
static build(program: Program): string {
173172
return new NEARBindingsBuilder(program).build();
@@ -406,21 +405,20 @@ export class NEARBindingsBuilder extends ExportsWalker {
406405
}
407406

408407
private tryUsingImport(type: Type, methodName: string): bool {
409-
let importedFile = this.filesByImport.get(type.classReference!.name);
410-
if (importedFile) {
411-
if (this.hasExport(importedFile, methodName)) {
412-
this.sb.push(`import { ${methodName} } from "${importedFile}";`);
413-
return true;
414-
}
408+
let sourcesWithExport = this.program.sources.filter(source =>
409+
this.getExports(source).filter(d => d.name.text == methodName).length > 0);
410+
411+
if (sourcesWithExport.length == 0) {
412+
return false;
415413
}
416-
return false;
417-
}
418414

419-
private hasExport(importedFile: string, name: string): bool {
420-
let importedSource = this.program.sources.filter(
421-
s => "./" + s.normalizedPath == importedFile + ".ts")[0];
415+
if (sourcesWithExport.length > 1) {
416+
console.log(`WARN: more than one file exporting ${methodName}: ${sourcesWithExport.map(s => s.normalizedPath)}`);
417+
}
422418

423-
return this.getExports(importedSource).filter(d => d.name.text == name).length > 0;
419+
let importPath = sourcesWithExport[0].normalizedPath.replace('.ts', '');
420+
this.sb.push(`import { ${methodName} } from "./${importPath}";`);
421+
return true;
424422
}
425423

426424
private generateHandler(type: Type) {
@@ -589,9 +587,6 @@ export class NEARBindingsBuilder extends ExportsWalker {
589587
.map(declaration => `${declaration.foreignName.text} as ${declaration.name.text}`)
590588
.join(",");
591589
this.sb.push(`import {${declarationsStr}} from "${statement.path.value}";`);
592-
statement.declarations.forEach(d => {
593-
this.filesByImport.set(d.name.text, statement.path.value);
594-
});
595590
}
596591
});
597592
}

tests/near-bindgen/main.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,9 @@ export function getFoobar(container: ContainerClass): AnotherContainerClass {
2424

2525
export function convertFoobars(foobars: Array<FooBar>): Array<ContainerClass> {
2626
return foobars.map<ContainerClass>((it: FooBar, i: i32, arr: Array<FooBar>): ContainerClass => { let container = new ContainerClass(); container.foobar = it; return container; });
27+
}
28+
29+
export function getStringArrayLength(arr: string[]): i32 {
30+
near.log("getStringArrayLength: " + near.str(arr.length));
31+
return arr.length;
2732
}

tests/near-bindgen/main_near.ts.expected

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import {
55
doNothing as wrapped_doNothing,
66
add as wrapped_add,
77
getFoobar as wrapped_getFoobar,
8-
convertFoobars as wrapped_convertFoobars
8+
convertFoobars as wrapped_convertFoobars,
9+
getStringArrayLength as wrapped_getStringArrayLength
910
} from "./main";
1011

1112
// Runtime functions
@@ -289,3 +290,61 @@ export function near_func_convertFoobars(): void {
289290
encoder.popObject();
290291
return_value(near.bufferWithSize(encoder.serialize()).buffer.data);
291292
}
293+
import { __near_decode_Array_String } from "./model_near";
294+
export class __near_ArgsParser_getStringArrayLength extends ThrowingJSONHandler {
295+
buffer: Uint8Array;
296+
decoder: JSONDecoder<__near_ArgsParser_getStringArrayLength>;
297+
handledRoot: boolean = false;
298+
299+
__near_param_arr: Array<String>;
300+
setNull(name: string): void {
301+
if (name == "arr") {
302+
this.__near_param_arr = <Array<String>>null;
303+
return;
304+
}
305+
306+
super.setNull(name);
307+
}
308+
309+
pushObject(name: string): bool {
310+
if (!this.handledRoot) {
311+
assert(name == null);
312+
this.handledRoot = true;
313+
return true;
314+
} else {
315+
assert(name != null);
316+
}
317+
318+
return super.pushObject(name);
319+
}
320+
321+
pushArray(name: string): bool {
322+
if (name == "arr") {
323+
this.__near_param_arr = <Array<String>>(
324+
__near_decode_Array_String(this.buffer, this.decoder.state)
325+
);
326+
return false;
327+
}
328+
329+
return super.pushArray(name);
330+
}
331+
}
332+
export function near_func_getStringArrayLength(): void {
333+
let json = new Uint8Array(input_read_len());
334+
input_read_into(json.buffer.data);
335+
let handler = new __near_ArgsParser_getStringArrayLength();
336+
handler.buffer = json;
337+
handler.decoder = new JSONDecoder<__near_ArgsParser_getStringArrayLength>(
338+
handler
339+
);
340+
handler.decoder.deserialize(json);
341+
let result = wrapped_getStringArrayLength(handler.__near_param_arr);
342+
343+
let encoder = new JSONEncoder();
344+
encoder.pushObject(null);
345+
346+
encoder.setInteger("result", result);
347+
348+
encoder.popObject();
349+
return_value(near.bufferWithSize(encoder.serialize()).buffer.data);
350+
}

tests/near-bindgen/near.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,11 @@ export namespace near {
1717
let arr: Array<T> = [value];
1818
return arr.toString();
1919
}
20-
}
20+
21+
export function log(msg: string): void {
22+
_near_log(<usize>msg);
23+
}
24+
}
25+
26+
@external("env", "log")
27+
declare function _near_log(msg_ptr: usize): void;

tests/near-bindgen/test.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,10 @@ async function loadModule(path) {
6363
Object.keys(module).forEach(methodName => {
6464
wrapped[methodName] = async function(inputJson) {
6565
setInputJson(inputJson);
66+
outputJson = null;
6667
await module[methodName].call(module);
67-
const outputJson = getOutputJson();
68-
return outputJson && outputJson.result;
68+
const resultJson = getOutputJson();
69+
return resultJson && resultJson.result;
6970
}
7071
});
7172
return wrapped;
@@ -81,6 +82,7 @@ async function loadModule(path) {
8182
assert.deepEqual(await module.convertFoobars({
8283
foobars: [{ arr: [["1", "2"], ["3"]] }] }),
8384
[{ foobar: { foo: 0, bar: 1, flag: false, baz: '123', arr: [["1", "2"], ["3"]] }}]);
85+
assert.equal(await module.getStringArrayLength({ arr: ["1", "2", "3"] }), 3);
8486
})().catch(e => {
8587
console.error('Error during test execution:', e);
8688
if (e.code == 'ERR_ASSERTION') {

tests/near-bindgen/test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
import * as main from "./main_near";
33
import * as model from "./model_near";
4+
import { near } from "./near";
45

56
@external("env", "log")
67
declare function log(str: string): void;
@@ -20,4 +21,8 @@ export function runTest(): void {
2021

2122
export function convertFoobars(): void {
2223
main.near_func_convertFoobars();
24+
}
25+
26+
export function getStringArrayLength(): void {
27+
main.near_func_getStringArrayLength();
2328
}

0 commit comments

Comments
 (0)