From 3fe2f24f629bb3104e0ec37f20ef9a7cbae415ae Mon Sep 17 00:00:00 2001 From: Victor Chernishev Date: Fri, 22 Nov 2024 15:22:49 +0000 Subject: [PATCH 1/5] rebased to new panda plugin-api (from master) support all old tests and types trying to add CI refactoring (ts types standartization) refactoring (remove utilites from factory) CI fix and (rebasing on new api fixes) and add tests file structure moved node_modules dependencies from libarkts to arkoala-arkts + changed paths and scripts + improved CI renamed enums in src/api/static/enums.ts changes in package.json's CI change (install node modules (arkoala-arkts)) add dump method for arkts nodes in ts (using in tests for comparison) CI fix (reduced artifact files amount) add NodeFlags and add translations of flags (removed from global) move method throwError from global to utilities fix CI (removed job - install node modules (arkoala-arkts/libarkts)) add let support to VariableDeclaration and fixed some bugs add proper update for Program in arkts CI fix (changed package.json's and paths for panda sdk) new create in libarkts for ExpressionStatement new dump in libarkts (add dump scriptFunctionFlags, now tests failing) new create methods in arkts and ts updates rewrite first steps to compile and execute src/index.ts from demo_playground add new tests test commit add ETSUndefinedType, add UndefinedLiteral, enums rename _GetKind replaced with provided _AstNodeTypesConst fix bug with ProceedToState error message, add tool for issue generation add support some scriptFunctionFlags for current tests, add superExpression delete node.h from native refactoring (separated playground from native, .meson files rewrite, some minor changes) add test for parenthesized expression, add test for variable decl and test lambda function return delete native/subprojects move nativePtrDecoder to utilities finally something working with imports separate testing for arkts and ts api, partly add import syntax support for ts and arkts api's refactoring (separating ts-api and arkts-api) rewriting and calling imported functions and variables refactoring add more tests for arkts api refactoring (magic numbers in new tests replaced with enum values) delete tests duplicates, changed webpack configs beginning of works with new arkts plugin-api, fixed .gitignore issue (some test files were ignored) wip/ npm fails Signed-off-by: naumovdmitrii --- .gitignore | 1 + .gitlab-ci.yml | 3 +- arkoala-arkts/libarkts/.gitignore | 17 +- arkoala-arkts/libarkts/.gitlab-ci.yml | 21 +- arkoala-arkts/libarkts/.mocha.json | 2 +- arkoala-arkts/libarkts/README.md | 2 +- arkoala-arkts/libarkts/arktsconfig.json | 4 +- arkoala-arkts/libarkts/compatible/.gitignore | 1 + .../libarkts/compatible/arkts-tsconfig.json | 38 +- .../compatible/src/AbstractVisitor.ts | 2 +- .../compatible/src/analysis-visitor.ts | 19 +- .../src/builder-lambda-transformer.ts | 2 +- .../compatible/src/example-transformer.ts | 33 +- .../compatible/src/function-transformer.ts | 16 +- .../compatible/src/memo-transformer.ts | 109 +- .../libarkts/compatible/src/print-visitor.ts | 56 +- .../compatible/src/transformation-context.ts | 15 +- arkoala-arkts/libarkts/compatible/src/util.ts | 49 +- .../compatible/typescript-tsconfig.json | 18 - .../compatible/typescript.webpack.config.js | 38 - ...ts.webpack.config.js => webpack.config.js} | 82 +- arkoala-arkts/libarkts/es2panda-tsconfig.json | 7 +- arkoala-arkts/libarkts/input/f.sts | 3 + arkoala-arkts/libarkts/input/tsconfig.json | 13 - arkoala-arkts/libarkts/input/variable.sts | 1 + arkoala-arkts/libarkts/native/.gitignore | 4 +- arkoala-arkts/libarkts/native/meson.build | 109 +- .../libarkts/native/meson_options.txt | 8 + .../libarkts/native/src/es2panda_lib.cc | 563 +++++------ arkoala-arkts/libarkts/native/src/node.h | 123 --- .../native/subprojects/node/meson.build | 30 - .../native/subprojects/node/meson_options.txt | 6 - arkoala-arkts/libarkts/package.json | 49 +- arkoala-arkts/libarkts/playground/meson.build | 31 + .../libarkts/playground/meson_options.txt | 4 + .../{native => playground}/src/playground.cc | 19 +- arkoala-arkts/libarkts/src/NativeModule.ts | 197 ---- .../libarkts/src/api/factory/utilities.ts | 50 - .../src/api/layers/arkts/utilities.ts | 157 --- .../libarkts/src/api/static/global.ts | 148 --- .../src/arkts-api/factory/nodeFactory.ts | 54 + .../src/{api/layers/ts => arkts-api}/index.ts | 6 +- .../src/{api => arkts-api}/static/enums.ts | 321 ++++-- .../libarkts/src/arkts-api/static/global.ts | 46 + .../{api/layers/arkts => arkts-api}/types.ts | 935 +++++++++++++----- .../utilities/nativePtrDecoder.ts} | 2 +- .../src/arkts-api/utilities/private.ts | 186 ++++ .../utilities/public.ts} | 89 +- arkoala-arkts/libarkts/src/es2panda.ts | 52 +- arkoala-arkts/libarkts/src/nativeModule.ts | 202 ++++ .../{api => ts-api}/factory/nodeFactory.ts | 668 +++++++++---- .../src/{api => ts-api}/factory/nodeTests.ts | 66 +- .../libarkts/src/{api => ts-api}/index.ts | 19 +- .../arkts/index.ts => ts-api/static/enums.ts} | 5 +- .../src/{api/layers/ts => ts-api}/types.ts | 554 ++++++----- .../utilities/private.ts} | 240 +++-- .../libarkts/src/ts-api/utilities/public.ts | 66 ++ .../src/{api => ts-api}/visitor/visitor.ts | 37 +- arkoala-arkts/libarkts/src/utils.ts | 22 + .../expressions/call-expression.test.ts | 53 + .../test/arkts-api/functions/create.test.ts | 212 ++++ .../test/arkts-api/general/basic.test.ts | 33 + .../arkts-api/import-export/import.test.ts | 209 ++++ .../test/es2panda/function-rewrite.test.ts | 45 - .../es2panda/literal-declarations.test.ts | 121 --- .../es2panda/simple-transformations.test.ts | 54 - arkoala-arkts/libarkts/test/test-util.ts | 126 +-- .../ts-api/classes/heritage/extends.test.ts | 59 ++ .../libarkts/test/ts-api/cross/cross.test.ts | 42 + .../ts-api/demo-playground/classes.test.ts | 40 + .../test/ts-api/demo-playground/main.sts | 75 ++ .../demo-playground/memo-rewrites.test.ts | 45 + .../create-function-declaration.test.ts | 33 +- .../update-function-declaration.test.ts | 105 +- .../lambda-function/builder-lambda.test.ts} | 115 +-- .../lambda-param-memoization.test.ts | 6 +- .../general}/abc-gen.test.ts | 66 +- .../general}/basic.test.ts | 14 +- .../general}/import.test.ts | 4 +- .../test/ts-api/import-export/import.test.ts | 48 + .../keyword-super/in-constructor.test.ts | 94 ++ .../ts-api/variables/create-variable.test.ts | 249 +++++ .../analysis-visitor.test.ts | 23 +- .../builder-lambda-rewrite.test.ts | 105 ++ .../function-rewrite.test.ts | 51 + .../memo-rewrite.test.ts | 8 +- .../print-visitor.test.ts | 6 +- arkoala-arkts/libarkts/test/tsconfig.json | 5 - .../utilities.ts => tools/issue_gen.mjs} | 72 +- ...da.webpack.config.js => webpack.config.js} | 8 +- arkoala-arkts/package.json | 13 +- interop/src/cpp/dynamic-loader.h | 7 +- 92 files changed, 4842 insertions(+), 2924 deletions(-) create mode 100644 arkoala-arkts/libarkts/compatible/.gitignore delete mode 100644 arkoala-arkts/libarkts/compatible/typescript-tsconfig.json delete mode 100644 arkoala-arkts/libarkts/compatible/typescript.webpack.config.js rename arkoala-arkts/libarkts/compatible/{arkts.webpack.config.js => webpack.config.js} (63%) create mode 100644 arkoala-arkts/libarkts/input/f.sts delete mode 100644 arkoala-arkts/libarkts/input/tsconfig.json create mode 100644 arkoala-arkts/libarkts/input/variable.sts delete mode 100644 arkoala-arkts/libarkts/native/src/node.h delete mode 100644 arkoala-arkts/libarkts/native/subprojects/node/meson.build delete mode 100644 arkoala-arkts/libarkts/native/subprojects/node/meson_options.txt create mode 100644 arkoala-arkts/libarkts/playground/meson.build create mode 100644 arkoala-arkts/libarkts/playground/meson_options.txt rename arkoala-arkts/libarkts/{native => playground}/src/playground.cc (90%) delete mode 100644 arkoala-arkts/libarkts/src/NativeModule.ts delete mode 100644 arkoala-arkts/libarkts/src/api/factory/utilities.ts delete mode 100644 arkoala-arkts/libarkts/src/api/layers/arkts/utilities.ts delete mode 100644 arkoala-arkts/libarkts/src/api/static/global.ts create mode 100644 arkoala-arkts/libarkts/src/arkts-api/factory/nodeFactory.ts rename arkoala-arkts/libarkts/src/{api/layers/ts => arkts-api}/index.ts (78%) rename arkoala-arkts/libarkts/src/{api => arkts-api}/static/enums.ts (65%) create mode 100644 arkoala-arkts/libarkts/src/arkts-api/static/global.ts rename arkoala-arkts/libarkts/src/{api/layers/arkts => arkts-api}/types.ts (41%) rename arkoala-arkts/libarkts/src/{node/Platform.ts => arkts-api/utilities/nativePtrDecoder.ts} (95%) create mode 100644 arkoala-arkts/libarkts/src/arkts-api/utilities/private.ts rename arkoala-arkts/libarkts/src/{api/utilities/utilitiesPublic.ts => arkts-api/utilities/public.ts} (42%) create mode 100644 arkoala-arkts/libarkts/src/nativeModule.ts rename arkoala-arkts/libarkts/src/{api => ts-api}/factory/nodeFactory.ts (65%) rename arkoala-arkts/libarkts/src/{api => ts-api}/factory/nodeTests.ts (61%) rename arkoala-arkts/libarkts/src/{api => ts-api}/index.ts (67%) rename arkoala-arkts/libarkts/src/{api/layers/arkts/index.ts => ts-api/static/enums.ts} (81%) rename arkoala-arkts/libarkts/src/{api/layers/ts => ts-api}/types.ts (65%) rename arkoala-arkts/libarkts/src/{api/layers/ts/utilities.ts => ts-api/utilities/private.ts} (36%) create mode 100644 arkoala-arkts/libarkts/src/ts-api/utilities/public.ts rename arkoala-arkts/libarkts/src/{api => ts-api}/visitor/visitor.ts (84%) create mode 100644 arkoala-arkts/libarkts/src/utils.ts create mode 100644 arkoala-arkts/libarkts/test/arkts-api/expressions/call-expression.test.ts create mode 100644 arkoala-arkts/libarkts/test/arkts-api/functions/create.test.ts create mode 100644 arkoala-arkts/libarkts/test/arkts-api/general/basic.test.ts create mode 100644 arkoala-arkts/libarkts/test/arkts-api/import-export/import.test.ts delete mode 100644 arkoala-arkts/libarkts/test/es2panda/function-rewrite.test.ts delete mode 100644 arkoala-arkts/libarkts/test/es2panda/literal-declarations.test.ts delete mode 100644 arkoala-arkts/libarkts/test/es2panda/simple-transformations.test.ts create mode 100644 arkoala-arkts/libarkts/test/ts-api/classes/heritage/extends.test.ts create mode 100644 arkoala-arkts/libarkts/test/ts-api/cross/cross.test.ts create mode 100644 arkoala-arkts/libarkts/test/ts-api/demo-playground/classes.test.ts create mode 100644 arkoala-arkts/libarkts/test/ts-api/demo-playground/main.sts create mode 100644 arkoala-arkts/libarkts/test/ts-api/demo-playground/memo-rewrites.test.ts rename arkoala-arkts/libarkts/test/{es2panda => ts-api/functions/function-declaration}/create-function-declaration.test.ts (94%) rename arkoala-arkts/libarkts/test/{es2panda => ts-api/functions/function-declaration}/update-function-declaration.test.ts (78%) rename arkoala-arkts/libarkts/test/{es2panda/builder-lambda-rewrite.test.ts => ts-api/functions/lambda-function/builder-lambda.test.ts} (52%) rename arkoala-arkts/libarkts/test/{es2panda => ts-api/functions/lambda-function}/lambda-param-memoization.test.ts (97%) rename arkoala-arkts/libarkts/test/{es2panda => ts-api/general}/abc-gen.test.ts (62%) rename arkoala-arkts/libarkts/test/{es2panda => ts-api/general}/basic.test.ts (95%) rename arkoala-arkts/libarkts/test/{es2panda => ts-api/general}/import.test.ts (95%) create mode 100644 arkoala-arkts/libarkts/test/ts-api/import-export/import.test.ts create mode 100644 arkoala-arkts/libarkts/test/ts-api/keyword-super/in-constructor.test.ts create mode 100644 arkoala-arkts/libarkts/test/ts-api/variables/create-variable.test.ts rename arkoala-arkts/libarkts/test/{es2panda => ts-api/visitors-and-transformers}/analysis-visitor.test.ts (46%) create mode 100644 arkoala-arkts/libarkts/test/ts-api/visitors-and-transformers/builder-lambda-rewrite.test.ts create mode 100644 arkoala-arkts/libarkts/test/ts-api/visitors-and-transformers/function-rewrite.test.ts rename arkoala-arkts/libarkts/test/{es2panda => ts-api/visitors-and-transformers}/memo-rewrite.test.ts (80%) rename arkoala-arkts/libarkts/test/{es2panda => ts-api/visitors-and-transformers}/print-visitor.test.ts (93%) rename arkoala-arkts/libarkts/{src/api/utilities/utilities.ts => tools/issue_gen.mjs} (47%) rename arkoala-arkts/libarkts/{es2panda.webpack.config.js => webpack.config.js} (80%) diff --git a/.gitignore b/.gitignore index 3df284284..963497a80 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ dist arkoala/tools/peer-generator/arkoala **/package-lock.json .vscode +**.code-workspace .idea **/target **/cjpm.lock diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 01902ea52..4901f0f6e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,7 +4,6 @@ stages: - install-deps - prebuild - build-compiler - - build-plugin-api - build - test - idlize @@ -27,4 +26,6 @@ include: - arkoala/ets-plugin/.gitlab-ci.yml - arkoala/tools/peer-generator/.gitlab-ci.yml - arkoala-arkts/.gitlab-ci.yml + - arkoala-arkts/user/.gitlab-ci.yml + - arkoala-arkts/libarkts/.gitlab-ci.yml - interop/.gitlab-ci.yml diff --git a/arkoala-arkts/libarkts/.gitignore b/arkoala-arkts/libarkts/.gitignore index d37d63bfd..4e8da0800 100644 --- a/arkoala-arkts/libarkts/.gitignore +++ b/arkoala-arkts/libarkts/.gitignore @@ -1,8 +1,9 @@ -prebuilt -build* -native/build-* -native/*.ini -lib -!test/es2panda/* -!test/golden/* -!compatible/src/* +./prebuilt +./build* +./native/build-* +./native/*.ini +./generated/** +**.abc + +!test/es2panda/** +!compatible/src/** diff --git a/arkoala-arkts/libarkts/.gitlab-ci.yml b/arkoala-arkts/libarkts/.gitlab-ci.yml index baadfeb5d..0bafba90a 100644 --- a/arkoala-arkts/libarkts/.gitlab-ci.yml +++ b/arkoala-arkts/libarkts/.gitlab-ci.yml @@ -19,23 +19,32 @@ build plugin-api: - !reference [.setup, script] - cd arkoala-arkts/libarkts script: - - npm i && npm run compile + - npm i + - npm run compile artifacts: - expire_in: 2 days + expire_in: 1 days paths: - - arkoala-arkts/libarkts/compatible/build - - arkoala-arkts/libarkts/compatible/build_arkts - arkoala-arkts/libarkts/native/build_es2panda + - arkoala-arkts/libarkts/node_modules + needs: + - install node modules (arkoala) + - install node modules (arkoala-arkts) + - install node modules (incremental) + - install node modules (interop) test plugin-api: stage: test - allow_failure: true interruptible: true extends: .linux-vm-shell-task before_script: - !reference [.setup, script] - cd arkoala-arkts/libarkts script: - - npm i && npm run test + - npm run test + - npm run test:all needs: + - install node modules (arkoala) + - install node modules (arkoala-arkts) + - install node modules (incremental) + - install node modules (interop) - build plugin-api diff --git a/arkoala-arkts/libarkts/.mocha.json b/arkoala-arkts/libarkts/.mocha.json index 0068e6466..faa829cc4 100644 --- a/arkoala-arkts/libarkts/.mocha.json +++ b/arkoala-arkts/libarkts/.mocha.json @@ -1,6 +1,6 @@ { "ui": "tdd", - "spec": "./test/es2panda/**/*.test.ts", + "spec": "./test/**/*.test.ts", "extension": ["ts"], "require": ["../../incremental/test-utils/scripts/register"], "timeout": 10000 diff --git a/arkoala-arkts/libarkts/README.md b/arkoala-arkts/libarkts/README.md index d37da203e..6c874ff34 100644 --- a/arkoala-arkts/libarkts/README.md +++ b/arkoala-arkts/libarkts/README.md @@ -33,4 +33,4 @@ npm run run node build/api/es2panda.js --help ``` -Runs __ArkTS__ compiler for sources contained in compilable, invoking plugins specified in __arktsconfig.json__ +Runs __ArkTS__ compiler for __./input/main.sts__ invoking plugins specified in __arktsconfig.json__ diff --git a/arkoala-arkts/libarkts/arktsconfig.json b/arkoala-arkts/libarkts/arktsconfig.json index 45fa27795..b74b92a0e 100644 --- a/arkoala-arkts/libarkts/arktsconfig.json +++ b/arkoala-arkts/libarkts/arktsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "baseUrl": "./node_modules/@koalaui/plugin-api-panda-sdk/@panda/sdk", + "baseUrl": "node_modules/@panda/sdk", "paths": { "std": [ "./ets/stdlib/std" @@ -11,7 +11,7 @@ }, "plugins": [ { - "transform": "./compatible/build_arkts/example-transformer.js" + "transform": "./compatible/build/arkts/compatible/src/example-transformer.js" } ] } diff --git a/arkoala-arkts/libarkts/compatible/.gitignore b/arkoala-arkts/libarkts/compatible/.gitignore new file mode 100644 index 000000000..4de766de8 --- /dev/null +++ b/arkoala-arkts/libarkts/compatible/.gitignore @@ -0,0 +1 @@ +./build* diff --git a/arkoala-arkts/libarkts/compatible/arkts-tsconfig.json b/arkoala-arkts/libarkts/compatible/arkts-tsconfig.json index d448e43e4..97ccfcb4b 100644 --- a/arkoala-arkts/libarkts/compatible/arkts-tsconfig.json +++ b/arkoala-arkts/libarkts/compatible/arkts-tsconfig.json @@ -1,18 +1,20 @@ -{ - "extends": "@koalaui/build-common/tsconfig.json", - "compilerOptions": { - "rootDir": "../", - "baseUrl": "../", - "outDir": "build/arkts", - "paths": { - "api": [ - "src/arkts/index.ts" - ] - } - }, - "include": [ - "../src/**/*.ts", - "../test/**/*.ts", - "../compatible/**/*.ts" - ] -} +{ + "extends": "@koalaui/build-common/tsconfig.json", + "compilerOptions": { + "rootDir": "..", + "baseUrl": ".", + "outDir": "./build/arkts", + "paths": { + "api": [ + "src/arkts/index.ts" + ] + }, + "module": "CommonJS" + }, + "include": [ + "./src/**/*.ts", + ], + "exclude": [ + "../src/es2panda.ts" + ] +} diff --git a/arkoala-arkts/libarkts/compatible/src/AbstractVisitor.ts b/arkoala-arkts/libarkts/compatible/src/AbstractVisitor.ts index 0fdac256a..27c84097b 100644 --- a/arkoala-arkts/libarkts/compatible/src/AbstractVisitor.ts +++ b/arkoala-arkts/libarkts/compatible/src/AbstractVisitor.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import * as ts from "../../src/api" +import * as ts from "@koalaui/libarkts" export abstract class AbstractVisitor { constructor( diff --git a/arkoala-arkts/libarkts/compatible/src/analysis-visitor.ts b/arkoala-arkts/libarkts/compatible/src/analysis-visitor.ts index f7c1f48a3..7d8b92b1a 100644 --- a/arkoala-arkts/libarkts/compatible/src/analysis-visitor.ts +++ b/arkoala-arkts/libarkts/compatible/src/analysis-visitor.ts @@ -12,8 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* -import * as ts from "../../src/api" + +import * as ts from "@koalaui/libarkts" import { AbstractVisitor } from "./AbstractVisitor"; import { Rewrite } from './transformation-context'; @@ -32,7 +32,6 @@ import { // isMemoEntry, // skipParenthesizedExpression, } from "./util" -// import { ImportExport } from './import-export'; function parseComment(comment: string): FunctionKind { let kind = FunctionKind.REGULAR @@ -77,7 +76,7 @@ export class AnalysisVisitor extends AbstractVisitor { return FunctionKind.REGULAR } if (!ts.isIdentifier(node)) { - ts.throwError('node expected to be Identifier') + throw new Error('node expected to be Identifier') } const kind = parseComment(node.text) this.traceAnnotation(traceAnnotation, kind, node) @@ -231,14 +230,11 @@ export class AnalysisVisitor extends AbstractVisitor { this.processFunctionExpression(node) } else if (ts.isParameter(node)) { this.processParameter(node) - } - // else if (arkts.isVariableDeclaration(node)) { - // this.processVariableDeclaration(node) - // } - else if (ts.isVariableDeclarationList(node)) { + } else if (ts.isVariableDeclaration(node)) { + this.processVariableDeclaration(node) + } else if (ts.isVariableDeclarationList(node)) { this.processVariableDeclarationList(node) - } - else if (ts.isPropertyDeclaration(node)) { + } else if (ts.isPropertyDeclaration(node)) { this.processPropertyDeclaration(node) } else if (ts.isPropertySignature(node)) { this.processPropertySignature(node) @@ -255,4 +251,3 @@ export class AnalysisVisitor extends AbstractVisitor { return this.visitEachChild(node) } } -*/ \ No newline at end of file diff --git a/arkoala-arkts/libarkts/compatible/src/builder-lambda-transformer.ts b/arkoala-arkts/libarkts/compatible/src/builder-lambda-transformer.ts index 9aaac429c..0f547470c 100644 --- a/arkoala-arkts/libarkts/compatible/src/builder-lambda-transformer.ts +++ b/arkoala-arkts/libarkts/compatible/src/builder-lambda-transformer.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import * as ts from "../../src/api" +import * as ts from "@koalaui/libarkts" import { AbstractVisitor } from "./AbstractVisitor"; export class BuilderLambdaTransformer extends AbstractVisitor { diff --git a/arkoala-arkts/libarkts/compatible/src/example-transformer.ts b/arkoala-arkts/libarkts/compatible/src/example-transformer.ts index 16984619c..91a669e24 100644 --- a/arkoala-arkts/libarkts/compatible/src/example-transformer.ts +++ b/arkoala-arkts/libarkts/compatible/src/example-transformer.ts @@ -1,17 +1,16 @@ -import * as ts from "../../src/api" -import { BuilderLambdaTransformer } from "./builder-lambda-transformer" - -export interface TransformerOptions { - trace?: boolean, -} - -// TODO: remove question marks -export default function exampleTransformer(program?: ts.Program, userPluginOptions?: TransformerOptions) { - return (ctx?: ts.TransformationContext) => { - return (node: ts.SourceFile) => { - const builderLambdaTransformer = (ctx !== undefined) ? new BuilderLambdaTransformer(ctx) : new BuilderLambdaTransformer() - const transformed = builderLambdaTransformer.visitor(node) - return transformed - } - } -} +import * as ts from "@koalaui/libarkts" +import { BuilderLambdaTransformer } from "./builder-lambda-transformer" + +export interface TransformerOptions { + trace?: boolean, +} + +export default function exampleTransformer(program?: ts.Program, userPluginOptions?: TransformerOptions) { + return (ctx?: ts.TransformationContext) => { + return (node: ts.SourceFile) => { + const builderLambdaTransformer = (ctx !== undefined) ? new BuilderLambdaTransformer(ctx) : new BuilderLambdaTransformer() + const transformed = builderLambdaTransformer.visitor(node) + return transformed + } + } +} diff --git a/arkoala-arkts/libarkts/compatible/src/function-transformer.ts b/arkoala-arkts/libarkts/compatible/src/function-transformer.ts index eaad17604..b6b77810b 100644 --- a/arkoala-arkts/libarkts/compatible/src/function-transformer.ts +++ b/arkoala-arkts/libarkts/compatible/src/function-transformer.ts @@ -12,9 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* -import global from "../../src/api/static/global" -import * as ts from "../../src/api" + +import * as ts from "@koalaui/libarkts" import { AbstractVisitor } from "./AbstractVisitor"; const ANNOTATION = "_REWRITE_" @@ -30,16 +29,15 @@ function isAnnotatedMethodDeclaration(node: ts.Node): boolean { function transformCallExpression(node: ts.CallExpression): ts.Node { const decl = ts.getDecl(node.expression) if (decl === undefined) { - global.throwError('memo function not found') + throw new Error('memo function for call not found') } if (!ts.isIdentifier(node.expression)) { - global.throwError('expression should be Identifier') + throw new Error('expression should be Identifier') } return ts.factory.updateCallExpression( node, - ts.factory.updateIdentifier( - node.expression, + ts.factory.createIdentifier( node.expression.text.slice(ANNOTATION.length) ), undefined, @@ -64,8 +62,7 @@ function transformMethodDeclaration(node: ts.MethodDeclaration): ts.Node { node, undefined, undefined, - ts.factory.updateIdentifier( - node.name, + ts.factory.createIdentifier( node.name.text.slice(ANNOTATION.length) ), undefined, @@ -98,4 +95,3 @@ export class FunctionTransformer extends AbstractVisitor { return node } } -*/ \ No newline at end of file diff --git a/arkoala-arkts/libarkts/compatible/src/memo-transformer.ts b/arkoala-arkts/libarkts/compatible/src/memo-transformer.ts index b32004b4f..01a245171 100644 --- a/arkoala-arkts/libarkts/compatible/src/memo-transformer.ts +++ b/arkoala-arkts/libarkts/compatible/src/memo-transformer.ts @@ -12,112 +12,110 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* -import * as arkts from "../../src/arkts" + +import * as ts from "@koalaui/libarkts" import { AbstractVisitor } from "./AbstractVisitor"; const ANNOTATION = "_MEMO_" -function isAnnotatedCallExpression(node: arkts.Node): boolean { - return arkts.isCallExpression(node) && arkts.isIdentifier(node.expression) && node.expression.text.startsWith(ANNOTATION) +function isAnnotatedCallExpression(node: ts.Node): boolean { + return ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text.startsWith(ANNOTATION) } -function isAnnotatedMethodDeclaration(node: arkts.Node): boolean { - return arkts.isMethodDeclaration(node) && node.name.text.startsWith(ANNOTATION) +function isAnnotatedMethodDeclaration(node: ts.Node): boolean { + return ts.isMethodDeclaration(node) && node.name.text.startsWith(ANNOTATION) } -function transformCallExpression(node: arkts.CallExpression): arkts.Node { - const decl = arkts.getDecl(node.expression) +function transformCallExpression(node: ts.CallExpression): ts.Node { + const decl = ts.getDecl(node.expression) if (decl === undefined) { - arkts.throwError('memo function not found') + throw new Error('memo function not found') } - if (!arkts.isIdentifier(node.expression)) { - arkts.throwError('expression should be Identifier') + if (!ts.isIdentifier(node.expression)) { + throw new Error('expression should be Identifier') } - return arkts.factory.updateCallExpression( + return ts.factory.updateCallExpression( node, - arkts.factory.updateIdentifier( - node.expression, + ts.factory.createIdentifier( node.expression.text.slice(ANNOTATION.length) ), undefined, [ - arkts.factory.createIdentifier("__memo_context"), - arkts.factory.createIdentifier("__memo_id"), + ts.factory.createIdentifier("__memo_context"), + ts.factory.createIdentifier("__memo_id"), ...node.arguments ] ) } -function transformMethodDeclaration(node: arkts.MethodDeclaration): arkts.Node { +function transformMethodDeclaration(node: ts.MethodDeclaration): ts.Node { const memoContextParam = - arkts.factory.createParameterDeclaration( + ts.factory.createParameterDeclaration( undefined, undefined, - arkts.factory.createIdentifier("__memo_context"), + ts.factory.createIdentifier("__memo_context"), undefined, - arkts.factory.createTypeReferenceNode( - arkts.factory.createIdentifier("__memo_context_type") + ts.factory.createTypeReferenceNode( + ts.factory.createIdentifier("__memo_context_type") ), undefined ) const memoIdParam = - arkts.factory.createParameterDeclaration( + ts.factory.createParameterDeclaration( undefined, undefined, - arkts.factory.createIdentifier("__memo_id"), + ts.factory.createIdentifier("__memo_id"), undefined, - arkts.factory.createTypeReferenceNode( - arkts.factory.createIdentifier("__memo_id_type") + ts.factory.createTypeReferenceNode( + ts.factory.createIdentifier("__memo_id_type") ), undefined ) const bodyStatements = [ - arkts.factory.createIfStatement( - arkts.factory.createPropertyAccessExpression( - arkts.factory.createIdentifier("__memo_scope"), - arkts.factory.createIdentifier("unchanged") + ts.factory.createIfStatement( + ts.factory.createPropertyAccessExpression( + ts.factory.createIdentifier("__memo_scope"), + ts.factory.createIdentifier("unchanged") ), - arkts.factory.createReturnStatement( - arkts.factory.createPropertyAccessExpression( - arkts.factory.createIdentifier("__memo_scope"), - arkts.factory.createIdentifier("cached") + ts.factory.createReturnStatement( + ts.factory.createPropertyAccessExpression( + ts.factory.createIdentifier("__memo_scope"), + ts.factory.createIdentifier("cached") ) ), undefined ), - arkts.factory.createExpressionStatement( - arkts.factory.createCallExpression( - arkts.factory.createIdentifier("content"), + ts.factory.createExpressionStatement( + ts.factory.createCallExpression( + ts.factory.createIdentifier("content"), undefined, [ - arkts.factory.createIdentifier("__memo_context"), - arkts.factory.createBinaryExpression( - arkts.factory.createIdentifier("__memo_id"), - arkts.factory.createToken(arkts.SyntaxKind.PlusToken), - arkts.factory.createStringLiteral("key_id_main.ts") + ts.factory.createIdentifier("__memo_context"), + ts.factory.createBinaryExpression( + ts.factory.createIdentifier("__memo_id"), + ts.factory.createToken(ts.SyntaxKind.PlusToken), + ts.factory.createStringLiteral("key_id_main.ts") ) ] )), ...(node.body?.statements ?? []), - arkts.factory.createReturnStatement( - arkts.factory.createCallExpression( - arkts.factory.createPropertyAccessExpression( - arkts.factory.createIdentifier("__memo_scope"), - arkts.factory.createIdentifier("recache") + ts.factory.createReturnStatement( + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression( + ts.factory.createIdentifier("__memo_scope"), + ts.factory.createIdentifier("recache") ), undefined, undefined ) ), ] - return arkts.factory.updateMethodDeclaration( + return ts.factory.updateMethodDeclaration( node, undefined, undefined, - arkts.factory.updateIdentifier( - node.name, + ts.factory.createIdentifier( node.name.text.slice(ANNOTATION.length) ), undefined, @@ -129,7 +127,7 @@ function transformMethodDeclaration(node: arkts.MethodDeclaration): arkts.Node { ], undefined, node.body ? - arkts.factory.updateBlock( + ts.factory.updateBlock( node.body, bodyStatements ) : undefined @@ -138,21 +136,20 @@ function transformMethodDeclaration(node: arkts.MethodDeclaration): arkts.Node { export class MemoTransformer extends AbstractVisitor { constructor( - ctx?: arkts.TransformationContext + ctx?: ts.TransformationContext ) { super(ctx) } - visitor(beforeChildren: arkts.Node): arkts.Node { - const node: arkts.Node = this.visitEachChild(beforeChildren) + visitor(beforeChildren: ts.Node): ts.Node { + const node: ts.Node = this.visitEachChild(beforeChildren) - if (isAnnotatedMethodDeclaration(node) && arkts.isMethodDeclaration(node)) { + if (isAnnotatedMethodDeclaration(node) && ts.isMethodDeclaration(node)) { return transformMethodDeclaration(node) - } else if (isAnnotatedCallExpression(node) && arkts.isCallExpression(node) && arkts.isIdentifier(node.expression)) { + } else if (isAnnotatedCallExpression(node) && ts.isCallExpression(node) && ts.isIdentifier(node.expression)) { return transformCallExpression(node) } return node } } -*/ \ No newline at end of file diff --git a/arkoala-arkts/libarkts/compatible/src/print-visitor.ts b/arkoala-arkts/libarkts/compatible/src/print-visitor.ts index e28b65221..8e8244460 100644 --- a/arkoala-arkts/libarkts/compatible/src/print-visitor.ts +++ b/arkoala-arkts/libarkts/compatible/src/print-visitor.ts @@ -1,29 +1,27 @@ -import * as ts from "../../src/api" -import { AbstractVisitor } from "./AbstractVisitor"; - -export class PrintVisitor extends AbstractVisitor { - constructor( - ctx?: ts.TransformationContext - ) { - super(ctx) - } - - private result = "" - - private print(s: string) { - this.result += " ".repeat(4 * this.indentation) + s + '\n' - } - - visitor(beforeChildren: ts.Node): ts.Node { - this.print(beforeChildren.constructor.name + " (mods: [" + beforeChildren.modifiers + "])") - const node = this.visitEachChild(beforeChildren) - - return node - } - - astToString(node: ts.Node): string { - this.result = "" - this.visitor(node) - return this.result.trim() - } -} +import * as ts from "@koalaui/libarkts" +import { AbstractVisitor } from "./AbstractVisitor"; + +export class PrintVisitor extends AbstractVisitor { + constructor( + ctx?: ts.TransformationContext + ) { + super(ctx) + } + + private result = "" + + private print(s: string) { + this.result += " ".repeat(4 * this.indentation) + s + '\n' + } + + visitor(node: ts.Node): ts.Node { + this.print(`${node.constructor.name} ${node.node?.peer} mods: [${node.modifiers}]`) + return this.visitEachChild(node) + } + + astToString(node: ts.Node): string { + this.result = "" + this.visitor(node) + return this.result.trim() + } +} diff --git a/arkoala-arkts/libarkts/compatible/src/transformation-context.ts b/arkoala-arkts/libarkts/compatible/src/transformation-context.ts index ab4764808..681e3d124 100644 --- a/arkoala-arkts/libarkts/compatible/src/transformation-context.ts +++ b/arkoala-arkts/libarkts/compatible/src/transformation-context.ts @@ -12,8 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* -import * as arkts from "../../src/arkts" + +import * as ts from "@koalaui/libarkts" import { CallTable, EntryTable, FunctionKind, FunctionTable, TransformerOptions, VariableTable } from "./util" export class Rewrite { @@ -23,14 +23,13 @@ export class Rewrite { public entryTable: EntryTable // public positionalIdTracker: PositionalIdTracker - constructor(sourceFile: arkts.SourceFile, public pluginOptions: TransformerOptions) { - this.functionTable = new Map() - this.callTable = new Map() - this.variableTable = new Map() - this.entryTable = new Set() + constructor(sourceFile: ts.SourceFile, public pluginOptions: TransformerOptions) { + this.functionTable = new Map() + this.callTable = new Map() + this.variableTable = new Map() + this.entryTable = new Set() // this.positionalIdTracker = new PositionalIdTracker(sourceFile, pluginOptions.stableForTest ?? false) } public importTypesFrom: string | undefined = undefined } -*/ \ No newline at end of file diff --git a/arkoala-arkts/libarkts/compatible/src/util.ts b/arkoala-arkts/libarkts/compatible/src/util.ts index c8622f4b2..3bbd8f639 100644 --- a/arkoala-arkts/libarkts/compatible/src/util.ts +++ b/arkoala-arkts/libarkts/compatible/src/util.ts @@ -12,9 +12,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* -import * as arkts from "../../src/arkts" -import * as fs from "fs" + +import * as ts from "@koalaui/libarkts" +import * as fs from 'fs' export enum FunctionKind { REGULAR, @@ -22,38 +22,38 @@ export enum FunctionKind { MEMO_INTRINSIC, } -export type FunctionTable = Map -export type CallTable = Map -export type EntryTable = Set -export type VariableTable = Map +export type FunctionTable = Map +export type CallTable = Map +export type EntryTable = Set +export type VariableTable = Map -export function isNamedDeclaration(node: arkts.Node): node is arkts.NamedDeclaration { +export function isNamedDeclaration(node: ts.Node): node is ts.NamedDeclaration { return ("name" in node ) } -export function asString(node: arkts.Node | undefined): string { +export function asString(node: ts.Node | undefined): string { if (node === undefined) { return "undefined node" } - if (arkts.isIdentifier(node)) { + if (ts.isIdentifier(node)) { return node.text } if (isNamedDeclaration(node)) { if (node.name === undefined) { - return `${arkts.SyntaxKind[node.kind]}(undefined name)` + return `${ts.SyntaxKind[node.kind]}(undefined name)` } else { - return `${arkts.SyntaxKind[node.kind]}(${asString(node.name)})` + return `${ts.SyntaxKind[node.kind]}(${asString(node.name)})` } } else { - return `${arkts.SyntaxKind[node.kind]}` + return `${ts.SyntaxKind[node.kind]}` } } -export function isFunctionOrMethod(node: arkts.Node): node is arkts.FunctionLikeDeclaration { - return arkts.isFunctionDeclaration(node) || - arkts.isMethodDeclaration(node) || - arkts.isFunctionExpression(node) || - arkts.isArrowFunction(node) +export function isFunctionOrMethod(node: ts.Node): node is ts.FunctionLikeDeclaration { + return ts.isFunctionDeclaration(node) || + ts.isMethodDeclaration(node) || + ts.isFunctionExpression(node) || + ts.isArrowFunction(node) } export interface TransformerOptions { @@ -96,7 +96,7 @@ export class Tracer { fs.mkdirSync(dirs, { recursive: true }); } - dumpFileName(sourceFile: arkts.SourceFile, transformed: arkts.FunctionLikeDeclarationBase): string | undefined { + dumpFileName(sourceFile: ts.SourceFile, transformed: ts.FunctionLikeDeclarationBase): string | undefined { if (!this.options.keepTransformed) { return undefined } @@ -109,12 +109,12 @@ export class Tracer { const sourceBaseName = baseName(sourceFile.fileName) if (!transformed.name) return - if (!arkts.isIdentifier(transformed.name)) return + if (!ts.isIdentifier(transformed.name)) return const fileName = `${transformed.name.text}_${sourceBaseName}` return `${outDir}/${fileName}_dump` } - keepTransformedFunction(transformed: arkts.FunctionLikeDeclarationBase, sourceFile: arkts.SourceFile) { + keepTransformedFunction(transformed: ts.FunctionLikeDeclarationBase, sourceFile: ts.SourceFile) { const fileName = this.dumpFileName(sourceFile, transformed) if (!fileName) return @@ -152,13 +152,12 @@ export enum RuntimeNames { ANNOTATION_STABLE = "_memo:stable", // assume this should not be tracked } -export function findFunctionDeclaration(node: arkts.Node): arkts.FunctionDeclaration | undefined { - while (node.kind !== arkts.SyntaxKind.SourceFile) { - if (arkts.isFunctionDeclaration(node)) { +export function findFunctionDeclaration(node: ts.Node): ts.FunctionDeclaration | undefined { + while (node.kind !== ts.SyntaxKind.SourceFile) { + if (ts.isFunctionDeclaration(node)) { return node } node = node.parent } return undefined } -*/ \ No newline at end of file diff --git a/arkoala-arkts/libarkts/compatible/typescript-tsconfig.json b/arkoala-arkts/libarkts/compatible/typescript-tsconfig.json deleted file mode 100644 index 4034257f1..000000000 --- a/arkoala-arkts/libarkts/compatible/typescript-tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": "@koalaui/build-common/tsconfig.json", - "compilerOptions": { - "baseUrl": "../../", - "outDir": "build/typescript", - "paths": { - "api": [ - "node_modules/typescript/lib/typescript.d.ts" - ] - }, - "module": "CommonJS", - "moduleResolution": "node" - }, - "include": [ - "src/**/*" - ] -} - diff --git a/arkoala-arkts/libarkts/compatible/typescript.webpack.config.js b/arkoala-arkts/libarkts/compatible/typescript.webpack.config.js deleted file mode 100644 index e5e12c3f1..000000000 --- a/arkoala-arkts/libarkts/compatible/typescript.webpack.config.js +++ /dev/null @@ -1,38 +0,0 @@ -const path = require("path") -const minimize = !process.env.WEBPACK_NO_MINIMIZE - -const makeConfig = () => ({ - target: "node", - entry: `./src/example-transformer.ts`, - output: { - filename: "example-transformer.js", - library: { - type: 'commonjs-module', - }, - path: path.resolve(__dirname, "./build_typescript") - }, - resolve: { - alias: { - api: "typescript" - }, - extensions: ['.ts', '...'] - }, - module: { - rules: [ - { - test: /\.ts$/, - use: [{ - loader: 'ts-loader', - options: { - configFile: "typescript-tsconfig.json" - } - }] - } - ] - }, - mode: minimize ? "production" : "development" -}) - -module.exports = env => { - return makeConfig() -} diff --git a/arkoala-arkts/libarkts/compatible/arkts.webpack.config.js b/arkoala-arkts/libarkts/compatible/webpack.config.js similarity index 63% rename from arkoala-arkts/libarkts/compatible/arkts.webpack.config.js rename to arkoala-arkts/libarkts/compatible/webpack.config.js index 2d7b5d99d..1130d0e91 100644 --- a/arkoala-arkts/libarkts/compatible/arkts.webpack.config.js +++ b/arkoala-arkts/libarkts/compatible/webpack.config.js @@ -1,38 +1,44 @@ -const path = require("path") -const minimize = !process.env.WEBPACK_NO_MINIMIZE - -const makeConfig = () => ({ - target: "node", - entry: `./src/example-transformer.ts`, - output: { - filename: "example-transformer.js", - library: { - type: 'commonjs-module', - }, - path: path.resolve(__dirname, "./build_arkts") - }, - resolve: { - alias: { - api: "typescript" - }, - extensions: ['.ts', '...'] - }, - module: { - rules: [ - { - test: /\.ts$/, - use: [{ - loader: 'ts-loader', - options: { - configFile: "arkts-tsconfig.json" - } - }] - } - ] - }, - mode: minimize ? "production" : "development" -}) - -module.exports = env => { - return makeConfig() -} +const path = require("path") +const minimize = !process.env.WEBPACK_NO_MINIMIZE + +const makeConfig = () => ({ + target: "node", + entry: `./src/example-transformer.ts`, + output: { + filename: "example-transformer.js", + // library: { + // type: 'commonjs-module', + // }, + path: path.resolve(__dirname, "./build_arkts") + }, + resolve: { + // alias: { + // api: "typescript" + // }, + extensions: ['.ts', '...'], + modules: [ + path.resolve(__dirname, "../node_modules"), + ] + }, + module: { + rules: [ + { + use: [{ + loader: 'ts-loader', + options: { + configFile: "arkts-tsconfig.json" + } + }] + }, + // { + // test: /\.node$/, + // loader: "node-loader" + // } + ] + }, + mode: minimize ? "production" : "development" +}) + +module.exports = env => { + return makeConfig() +} diff --git a/arkoala-arkts/libarkts/es2panda-tsconfig.json b/arkoala-arkts/libarkts/es2panda-tsconfig.json index 6ae3be937..e72996d30 100644 --- a/arkoala-arkts/libarkts/es2panda-tsconfig.json +++ b/arkoala-arkts/libarkts/es2panda-tsconfig.json @@ -12,8 +12,9 @@ "module": "CommonJS" }, "include": [ - "src/**/*.ts", - "test/**/*.ts", - "compatible/**/*.ts" + "./src/**/*.ts", + ], + "exclude": [ + "./input/**/*" ] } \ No newline at end of file diff --git a/arkoala-arkts/libarkts/input/f.sts b/arkoala-arkts/libarkts/input/f.sts new file mode 100644 index 000000000..369304938 --- /dev/null +++ b/arkoala-arkts/libarkts/input/f.sts @@ -0,0 +1,3 @@ +export function f() { + console.log("Hello, world!") +} diff --git a/arkoala-arkts/libarkts/input/tsconfig.json b/arkoala-arkts/libarkts/input/tsconfig.json deleted file mode 100644 index b80001e93..000000000 --- a/arkoala-arkts/libarkts/input/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "include": [ - "./**/*.ts" - ], - "compilerOptions": { - "outDir": "../build/tsc", - "plugins": [ - { - "transform": "../compatible/build_arkts/example-transformer.js", - } - ] - } -} diff --git a/arkoala-arkts/libarkts/input/variable.sts b/arkoala-arkts/libarkts/input/variable.sts new file mode 100644 index 000000000..2322ed6f0 --- /dev/null +++ b/arkoala-arkts/libarkts/input/variable.sts @@ -0,0 +1 @@ +export const X: double = 1.2345; diff --git a/arkoala-arkts/libarkts/native/.gitignore b/arkoala-arkts/libarkts/native/.gitignore index 8ef7ae46c..9442d2bf7 100644 --- a/arkoala-arkts/libarkts/native/.gitignore +++ b/arkoala-arkts/libarkts/native/.gitignore @@ -1,3 +1 @@ -prebuilt -build-* -*.abc +build_* diff --git a/arkoala-arkts/libarkts/native/meson.build b/arkoala-arkts/libarkts/native/meson.build index 76a002823..20f220b0a 100644 --- a/arkoala-arkts/libarkts/native/meson.build +++ b/arkoala-arkts/libarkts/native/meson.build @@ -1,96 +1,57 @@ -project('Es2panda interop', 'cpp', - version: '0.1', - default_options: ['cpp_std=c++17', 'buildtype=debug'], +project( + 'es2panda_interop', + 'cpp', + version: '1.0', + default_options: [ + 'cpp_std=c++17', + 'buildtype=debug', + ], ) -source_dir = meson.current_source_dir() -interop_src = '../../../interop/src/cpp' -es2panda_header = '../node_modules/@koalaui/plugin-api-panda-sdk/@panda/sdk/ohos_arm64/include/tools/es2panda/public' -es2panda_gen = '../node_modules/@koalaui/plugin-api-panda-sdk/@panda/sdk/ohos_arm64/include/tools/es2panda/' -is_msvc = meson.get_compiler('cpp').get_id() == 'msvc' - -implementation = './src/es2panda_lib.cc' - -os = target_machine.system() - sources = [ - implementation, - interop_src / 'common-interop.cc', - interop_src / 'interop-logging.cc' + './src/es2panda_lib.cc', + get_option('interop_src_dir') / 'common-interop.cc', + get_option('interop_src_dir') / 'interop-logging.cc', + get_option('interop_src_dir') / 'napi/convertors-napi.cc', ] -include_dirs = [ - es2panda_header, - es2panda_gen + +cflags = [ + '-DINTEROP_LIBRARY_NAME=' + get_option('lib_name'), + '-DKOALA_USE_NODE_VM', + '-DKOALA_NAPI', ] -library_use_name = 'Es2panda' -cflags = ['-DINTEROP_LIBRARY_NAME=' + library_use_name] -ldflags = [] -deps = [] -if os == 'windows' +if (target_machine.system() == 'windows') cflags += ['-DKOALA_WINDOWS'] - if is_msvc + if (meson.get_compiler('cpp').get_id() == 'msvc') # apply node.exe symbol loading hook sources += [ - interop_src / 'napi/win-dynamic-node.cc' + get_option('interop_src_dir') / 'napi/win-dynamic-node.cc' ] endif -endif - -if os == 'linux' +else cflags += ['-DKOALA_LINUX'] endif -include_dirs += [ - interop_src, - interop_src / 'types', -] - -sources += [ - interop_src / 'napi/convertors-napi.cc', -] - -node_addon_api = '../node_modules/node-addon-api' -node_api_headers = '../node_modules/node-api-headers' - -include_dirs += [ - interop_src / 'napi', - node_api_headers / 'include', - node_addon_api, -] -cflags += [ - '-DKOALA_USE_NODE_VM', - '-DKOALA_NAPI' -] - -module_prefix = '' -module_suffix = 'node' - shared_library( - library_use_name, + get_option('lib_name'), sources, override_options: [ 'b_lundef=false', ], install: true, - name_prefix: module_prefix, - name_suffix: module_suffix, - include_directories: include_dirs, - install_dir: source_dir / '..' / 'build', + name_prefix: '', + name_suffix: 'node', + include_directories: [ + get_option('panda_sdk_dir') / 'ohos_arm64/include/tools/es2panda/public', + get_option('panda_sdk_dir') / 'ohos_arm64/include/tools/es2panda', + get_option('interop_src_dir'), + get_option('interop_src_dir') / 'types', + get_option('interop_src_dir') / 'napi', + get_option('node_modules_dir') / 'node-api-headers/include', + get_option('node_modules_dir') / 'node-addon-api', + ], cpp_args: cflags, - link_args: ldflags, - dependencies: deps -) - -playground_exec_name = 'playground_exec' - -sources = [ - './src/playground.cc' -] - -executable( - playground_exec_name, - sources, - include_directories: include_dirs, - cpp_args: cflags + link_args: [], + dependencies: [] ) diff --git a/arkoala-arkts/libarkts/native/meson_options.txt b/arkoala-arkts/libarkts/native/meson_options.txt index e69de29bb..e31a92eff 100644 --- a/arkoala-arkts/libarkts/native/meson_options.txt +++ b/arkoala-arkts/libarkts/native/meson_options.txt @@ -0,0 +1,8 @@ +option('node_modules_dir', type : 'string', value : '../node_modules/', + description : 'path to node_modules') +option('panda_sdk_dir', type : 'string', value : '../node_modules/@panda/sdk/', + description : 'path to panda sdk') +option('interop_src_dir', type : 'string', value : '../../../interop/src/cpp/', + description : 'path to interop') +option('lib_name', type : 'string', value : 'es2panda', + description : 'name of shared library') diff --git a/arkoala-arkts/libarkts/native/src/es2panda_lib.cc b/arkoala-arkts/libarkts/native/src/es2panda_lib.cc index da206a1f7..d1d376c2e 100644 --- a/arkoala-arkts/libarkts/native/src/es2panda_lib.cc +++ b/arkoala-arkts/libarkts/native/src/es2panda_lib.cc @@ -27,20 +27,26 @@ using std::string, std::cout, std::endl, std::vector; static es2panda_Impl *impl = nullptr; #ifdef KOALA_WINDOWS -#include -#define PLUGIN_DIR "windows_host_tools" -#define LIB_PREFIX "" -#define LIB_SUFFIX ".dll" + #include + #define PLUGIN_DIR "windows_host_tools" + #define LIB_PREFIX "" + #define LIB_SUFFIX ".dll" #endif #ifdef KOALA_LINUX -#include -#define PLUGIN_DIR "linux_host_tools" -#define LIB_PREFIX "lib" -#define LIB_SUFFIX ".so" + #include + + #ifdef __x86_64__ + #define PLUGIN_DIR "linux_host_tools" + #else + #define PLUGIN_DIR "linux_arm64_host_tools" + #endif + + #define LIB_PREFIX "lib" + #define LIB_SUFFIX ".so" #endif -const char* libpath = "./node_modules/@koalaui/plugin-api-panda-sdk/@panda/sdk/" PLUGIN_DIR "/lib/" LIB_PREFIX "es2panda-public" LIB_SUFFIX; +const char* libpath = "node_modules/@panda/sdk/" PLUGIN_DIR "/lib/" LIB_PREFIX "es2panda-public" LIB_SUFFIX; es2panda_Impl *GetImpl() { if (impl) { @@ -48,7 +54,7 @@ es2panda_Impl *GetImpl() { } auto library = loadLibrary(libpath); if (!library) { - throw std::runtime_error("No library"); + throw std::runtime_error("No library (es2panda_lib.cc)"); } auto symbol = findSymbol(library, "es2panda_GetImpl"); if (!symbol) { @@ -119,6 +125,12 @@ KNativePointer impl_CreateContextFromString(KNativePointer configPtr, KStringPtr } KOALA_INTEROP_3(CreateContextFromString, KNativePointer, KNativePointer, KStringPtr, KStringPtr) +KNativePointer impl_CreateContextFromFile(KNativePointer configPtr, KStringPtr filenamePtr) { + auto config = reinterpret_cast(configPtr); + return GetImpl()->CreateContextFromFile(config, getStringCopy(filenamePtr)); +} +KOALA_INTEROP_2(CreateContextFromFile, KNativePointer, KNativePointer, KStringPtr) + KNativePointer impl_DestroyContext(KNativePointer contextPtr) { auto context = reinterpret_cast(contextPtr); GetImpl()->DestroyContext(context); @@ -204,6 +216,14 @@ KNativePointer impl_CreateETSPrimitiveType(KNativePointer contextPtr, KInt type) } KOALA_INTEROP_2(CreateETSPrimitiveType, KNativePointer, KNativePointer, KInt) +KInt impl_ETSPrimitiveTypeGetPrimitiveTypeConst(KNativePointer contextPtr, KNativePointer nodePtr) { + auto context = reinterpret_cast(contextPtr); + auto node = reinterpret_cast(nodePtr); + + return GetImpl()->ETSPrimitiveTypeGetPrimitiveTypeConst(context, node); +} +KOALA_INTEROP_2(ETSPrimitiveTypeGetPrimitiveTypeConst, KInt, KNativePointer, KNativePointer) + KNativePointer impl_CreateETSFunctionTypeIr(KNativePointer contextPtr, KNativePointer signaturePtr, KInt funcFlagsT) { auto context = reinterpret_cast(contextPtr); auto signature = reinterpret_cast(signaturePtr); @@ -300,154 +320,6 @@ KNativePointer impl_ETSParserCreateExpression(KNativePointer contextPtr, KString } KOALA_INTEROP_3(ETSParserCreateExpression, KNativePointer, KNativePointer, KStringPtr, KInt) - -/* - TODO: AstNodeKind should be provided by es2panda - */ -enum AstNodeKind { - Identifier = 1, - StringLiteral = 2, - BlockStatement = 3, - MethodDefinition = 4, - ClassDeclaration = 5, - FunctionDeclaration = 6, - ClassProperty = 7, - TSTypeParameterDeclaration = 8, - ETSFunctionType = 9, - CallExpression = 10, - ExpressionStatement = 11, - MemberExpression = 12, - ArrowFunctionExpression = 13, - ReturnStatement = 14, - ETSParameterExpression = 15, - NumberLiteral = 16, - VariableDeclaration = 17, - ClassStaticBlock = 18, - Program = 19, - BinaryExpression = 20, - FunctionExpression = 21, - ScriptFunction = 22, - VariableDeclarator = 23, - TSTypeParameter = 24, - ETSPrimitiveType = 25, - AssignmentExpression = 26, - ETSTypeReference = 27, - TSUnionType = 28, - ETSUnionType = 29, - ClassDefinition = 30, - ETSTypeReferencePart = 31, - IfStatement = 32, -}; - -static KInt GetKind(es2panda_Context* context, es2panda_AstNode* node) { - if (GetImpl()->IsIdentifier(node)) { - return AstNodeKind::Identifier; - } - if (GetImpl()->IsStringLiteral(node)) { - return AstNodeKind::StringLiteral; - } - if (GetImpl()->IsBlockStatement(node)) { - return AstNodeKind::BlockStatement; - } - if (GetImpl()->IsMethodDefinition(node)) { - return AstNodeKind::MethodDefinition; - } - if (GetImpl()->IsClassDeclaration(node)) { - return AstNodeKind::ClassDeclaration; - } - if (GetImpl()->IsFunctionDeclaration(node)) { - return AstNodeKind::FunctionDeclaration; - } - if (GetImpl()->IsClassProperty(node)) { - return AstNodeKind::ClassProperty; - } - if (GetImpl()->IsTSTypeParameterDeclaration(node)) { - return AstNodeKind::TSTypeParameterDeclaration; - } - if (GetImpl()->IsETSFunctionType(node)) { - return AstNodeKind::ETSFunctionType; - } - if (GetImpl()->IsCallExpression(node)) { - return AstNodeKind::CallExpression; - } - if (GetImpl()->IsExpressionStatement(node)) { - return AstNodeKind::ExpressionStatement; - } - if (GetImpl()->IsMemberExpression(node)) { - return AstNodeKind::MemberExpression; - } - if (GetImpl()->IsArrowFunctionExpression(node)) { - return AstNodeKind::ArrowFunctionExpression; - } - if (GetImpl()->IsReturnStatement(node)) { - return AstNodeKind::ReturnStatement; - } - if (GetImpl()->IsETSParameterExpression(node)) { - return AstNodeKind::ETSParameterExpression; - } - if (GetImpl()->IsNumberLiteral(node)) { - return AstNodeKind::NumberLiteral; - } - if (GetImpl()->IsVariableDeclaration(node)) { - return AstNodeKind::VariableDeclaration; - } - if (GetImpl()->IsClassStaticBlock(node)) { - return AstNodeKind::ClassStaticBlock; - } - if (GetImpl()->IsBinaryExpression(node)) { - return AstNodeKind::BinaryExpression; - } - if (GetImpl()->IsFunctionExpression(node)) { - return AstNodeKind::FunctionExpression; - } - if (GetImpl()->IsScriptFunction(node)) { - return AstNodeKind::ScriptFunction; - } - if (GetImpl()->IsVariableDeclarator(node)) { - return AstNodeKind::VariableDeclarator; - } - if (GetImpl()->IsTSTypeParameter(node)) { - return AstNodeKind::TSTypeParameter; - } - if (GetImpl()->IsETSPrimitiveType(node)) { - return AstNodeKind::ETSPrimitiveType; - } - if (GetImpl()->IsAssignmentExpression(node)) { - return AstNodeKind::AssignmentExpression; - } - if (GetImpl()->IsETSTypeReference(node)) { - return AstNodeKind::ETSTypeReference; - } - if (GetImpl()->IsTSUnionType(node)) { - return AstNodeKind::TSUnionType; - } - if (GetImpl()->IsETSUnionType(node)) { - return AstNodeKind::ETSUnionType; - } - if (GetImpl()->IsClassDefinition(node)) { - return AstNodeKind::ClassDefinition; - } - if (GetImpl()->IsETSTypeReferencePart(node)) { - return AstNodeKind::ETSTypeReferencePart; - } - if (GetImpl()->IsIfStatement(node)) { - return AstNodeKind::IfStatement; - } - - if (GetImpl()->AstNodeIsProgramConst(context, node)) { - return AstNodeKind::Program; - } - return 0; -} - -KInt impl_GetKind(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetKind(context, node); -} -KOALA_INTEROP_2(GetKind, KInt, KNativePointer, KNativePointer) - KBoolean impl_IsProgram(KNativePointer contextPtr, KNativePointer nodePtr) { auto context = reinterpret_cast(contextPtr); auto node = reinterpret_cast(nodePtr); @@ -479,15 +351,13 @@ KNativePointer impl_VariableDeclarationDeclaratorsConst(KNativePointer contextPt } KOALA_INTEROP_2(VariableDeclarationDeclaratorsConst, KNativePointer, KNativePointer, KNativePointer) -KNativePointer impl_BlockStatementUpdateStatements(KNativePointer contextPtr, KNativePointer nodePtr, KNativePointerArray statementListPtr, KInt statementListLen, KNativePointer returnTypeLenPtr) { +KInt impl_VariableDeclarationKindConst(KNativePointer contextPtr, KNativePointer nodePtr) { auto context = reinterpret_cast(contextPtr); auto node = reinterpret_cast(nodePtr); - auto statementList = reinterpret_cast(statementListPtr); - size_t n; - auto statements = GetImpl()->BlockStatementUpdateStatements(context, node, statementList, statementListLen, &n); - return new vector(statements, statements + n); + + return GetImpl()->VariableDeclarationKindConst(context, node); } -KOALA_INTEROP_5(BlockStatementUpdateStatements, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt, KNativePointer) +KOALA_INTEROP_2(VariableDeclarationKindConst, KInt, KNativePointer, KNativePointer) KNativePointer impl_ClassDeclarationDefinition(KNativePointer contextPtr, KNativePointer nodePtr) { auto context = reinterpret_cast(contextPtr); @@ -528,6 +398,16 @@ KBoolean impl_FunctionDeclarationIsAnonymousConst(KNativePointer contextPtr, KNa } KOALA_INTEROP_2(FunctionDeclarationIsAnonymousConst, KBoolean, KNativePointer, KNativePointer) +KNativePointer impl_ScriptFunctionAddFlag(KNativePointer contextPtr, KNativePointer nodePtr, KInt flagsT) { + auto context = reinterpret_cast(contextPtr); + auto node = reinterpret_cast(nodePtr); + auto flags = static_cast(flagsT); + + GetImpl()->ScriptFunctionAddFlag(context, node, flags); + return node; +} +KOALA_INTEROP_3(ScriptFunctionAddFlag, KNativePointer, KNativePointer, KNativePointer, KInt) + KNativePointer impl_ScriptFunctionParams(KNativePointer contextPtr, KNativePointer nodePtr) { auto context = reinterpret_cast(contextPtr); auto node = reinterpret_cast(nodePtr); @@ -567,29 +447,39 @@ KBoolean impl_ScriptFunctionDeclareConst(KNativePointer contextPtr, KNativePoint } KOALA_INTEROP_2(ScriptFunctionDeclareConst, KBoolean, KNativePointer, KNativePointer) -KNativePointer impl_CreateFunctionDeclaration(KNativePointer contextPtr, KNativePointer funcPtr, KBoolean isAnonK) { +KNativePointer impl_CreateFunctionDeclaration( + KNativePointer contextPtr, + KNativePointer funcPtr, + KNativePointerArray annotationsPtr, + KInt annotationsLen, + KBoolean isAnonK +) { auto context = reinterpret_cast(contextPtr); auto func = reinterpret_cast(funcPtr); + auto annotations = reinterpret_cast(annotationsPtr); auto isAnon = static_cast(isAnonK); - return GetImpl()->CreateFunctionDeclaration(context, func, isAnon); + return GetImpl()->CreateFunctionDeclaration(context, func, annotations, annotationsLen, isAnon); } -KOALA_INTEROP_3(CreateFunctionDeclaration, KNativePointer, KNativePointer, KNativePointer, KBoolean) +KOALA_INTEROP_5(CreateFunctionDeclaration, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt, KBoolean) KNativePointer impl_UpdateFunctionDeclaration( KNativePointer contextPtr, KNativePointer nodePtr, KNativePointer funcPtr, + KNativePointerArray annotationsPtr, + KInt annotationsLen, KBoolean isAnonK ) { auto context = reinterpret_cast(contextPtr); auto node = reinterpret_cast(nodePtr); auto func = reinterpret_cast(funcPtr); + auto annotations = reinterpret_cast(annotationsPtr); auto isAnon = static_cast(isAnonK); - return GetImpl()->UpdateFunctionDeclaration(context, node, func, isAnon); + return GetImpl()->UpdateFunctionDeclaration(context, node, func, annotations, annotationsLen, isAnon); } -KOALA_INTEROP_4(UpdateFunctionDeclaration, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KBoolean) +KOALA_INTEROP_6(UpdateFunctionDeclaration, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt, KBoolean) // TODO: add param initializer KNativePointer impl_CreateETSParameterExpression(KNativePointer contextPtr, KNativePointer identifierPtr, KNativePointer initializerPtr) { @@ -865,6 +755,17 @@ KNativePointer impl_MemberExpressionProperty( } KOALA_INTEROP_2(MemberExpressionProperty, KNativePointer, KNativePointer, KNativePointer) +KInt impl_MemberExpressionKindConst( + KNativePointer contextPtr, + KNativePointer nodePtr +) { + auto context = reinterpret_cast(contextPtr); + auto node = reinterpret_cast(nodePtr); + + return GetImpl()->MemberExpressionKindConst(context, node); +} +KOALA_INTEROP_2(MemberExpressionKindConst, KInt, KNativePointer, KNativePointer) + KNativePointer impl_CreateCallExpression( KNativePointer contextPtr, KNativePointer calleePtr, @@ -1059,92 +960,6 @@ KNativePointer impl_CreateBlockStatement( } KOALA_INTEROP_3(CreateBlockStatement, KNativePointer, KNativePointer, KNativePointerArray, KInt) -// TODO: rewrite everything here -/* ------------------------------------------------------------------------------------------------------------------------------ -*/ - -es2panda_AstNode * __parentNode; -es2panda_Context * __context; - -static void changeParent(es2panda_AstNode *child) -{ - GetImpl()->AstNodeSetParent(__context, child, __parentNode); -} - -static void SetRightParent(es2panda_AstNode *node, void *arg) -{ - es2panda_Context *ctx = static_cast(arg); - __context = ctx; - __parentNode = node; - GetImpl()->AstNodeIterateConst(ctx, node, changeParent); -} - -KNativePointer impl_AstNodeUpdateAll(KNativePointer contextPtr, KNativePointer programPtr) { - auto context = reinterpret_cast(contextPtr); - auto program = reinterpret_cast(programPtr); - - GetImpl()->AstNodeForEach(program, SetRightParent, context); - - return program; -} -KOALA_INTEROP_2(AstNodeUpdateAll, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_AstNodeUpdateChildren(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - // auto lambda = [node, impl, context](es2panda_AstNode *child){ impl->AstNodeSetParent(context, child, node); }; - // void(decltype(lambda)::*ptr)(es2panda_AstNode*)const = &decltype(lambda)::operator(); - - // impl->AstNodeIterateConst(context, node, [node, impl, context](es2panda_AstNode *child){ impl->AstNodeSetParent(context, child, node); }); - // GetImpl()->AstNodeIterateConst(context, node, &decltype(lambda)::operator()); - - __parentNode = node; - GetImpl()->AstNodeIterateConst(context, node, changeParent); - - return node; -} -KOALA_INTEROP_2(AstNodeUpdateChildren, KNativePointer, KNativePointer, KNativePointer) - - -std::string __result; -std::size_t __depth; - -static void appendModifiers(es2panda_AstNode *node) { - __depth += 2; - std::size_t kind = GetKind(__context, node); - __result += std::string(__depth, '_'); - __result += "kind: " + std::to_string(kind); - __result += ", mod: " + std::to_string(static_cast(GetImpl()->AstNodeModifiers(__context, node))); - // if (kind == 22) { - // __result += ", script_function_flags: " + std::to_string(GetImpl()->ScriptFunctionFlagsConst(__context, node)); - // } - __result += "\n"; - GetImpl()->AstNodeIterateConst(__context, node, appendModifiers); - __depth -= 2; -} - -KNativePointer impl_AstNodeDumpModifiers( - KNativePointer contextPtr, - KNativePointer nodePtr -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - __context = context; - __result = ""; - __depth = 0; - GetImpl()->AstNodeIterateConst(context, node, appendModifiers); - - return new std::string(__result); -} -KOALA_INTEROP_2(AstNodeDumpModifiers, KNativePointer, KNativePointer, KNativePointer) -/* ------------------------------------------------------------------------------------------------------------------------------ -*/ - - KNativePointer impl_CreateAstDumper( KNativePointer contextPtr, KNativePointer nodePtr, @@ -1273,20 +1088,6 @@ KNativePointer impl_ScriptFunctionSetSignature( } KOALA_INTEROP_3(ScriptFunctionSetSignature, KNativePointer, KNativePointer, KNativePointer, KNativePointer) -KNativePointer impl_ScriptFunctionSetIrSignature( - KNativePointer contextPtr, - KNativePointer astPtr, - KNativePointer signaturePtr -) { - auto context = reinterpret_cast(contextPtr); - auto ast = reinterpret_cast(astPtr); - auto signature = reinterpret_cast(signaturePtr); - - GetImpl()->ScriptFunctionSetIrSignature(context, ast, signature); - return ast; -} -KOALA_INTEROP_3(ScriptFunctionSetIrSignature, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - KNativePointer impl_ScriptFunctionSetBody( KNativePointer contextPtr, KNativePointer astPtr, @@ -1417,24 +1218,16 @@ KBoolean impl_IdentifierIsPrivateIdentConst(KNativePointer contextPtr, KNativePo } KOALA_INTEROP_2(IdentifierIsPrivateIdentConst, KBoolean, KNativePointer, KNativePointer) -KNativePointer impl_IdentifierSetReference(KNativePointer contextPtr, KNativePointer nodePtr, KBoolean isReferenceK) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - auto isReference = static_cast(isReferenceK); - - GetImpl()->IdentifierSetReference(context, node, isReference); - return node; -} -KOALA_INTEROP_3(IdentifierSetReference, KNativePointer, KNativePointer, KNativePointer, KBoolean) - -KNativePointer impl_ScriptFunctionUpdateIrSignature(KNativePointer contextPtr, KNativePointer nodePtr, KNativePointer signaturePtr) { +KInt impl_IdentifierIdentifierFlags(KNativePointer contextPtr, KNativePointer nodePtr) { auto context = reinterpret_cast(contextPtr); auto node = reinterpret_cast(nodePtr); - auto signature = reinterpret_cast(signaturePtr); - return GetImpl()->ScriptFunctionUpdateIrSignature(context, node, signature); + return + (GetImpl()->IdentifierIsOptionalConst(context, node) ? (1 << 0) : 0) | + (GetImpl()->IdentifierIsReferenceConst(context, node, Es2pandaScriptExtension::SCRIPT_EXTENSION_TS) ? (1 << 1) : 0) | + (GetImpl()->IdentifierIsTdzConst(context, node) ? (1 << 2) : 0); } -KOALA_INTEROP_3(ScriptFunctionUpdateIrSignature, KNativePointer, KNativePointer, KNativePointer, KNativePointer) +KOALA_INTEROP_2(IdentifierIdentifierFlags, KInt, KNativePointer, KNativePointer) KNativePointer impl_CreateFunctionExpression(KNativePointer contextPtr, KNativePointer funcPtr) { auto context = reinterpret_cast(contextPtr); @@ -1524,6 +1317,14 @@ KNativePointer impl_AstNodeVariableConst(KNativePointer contextPtr, KNativePoint } KOALA_INTEROP_2(AstNodeVariableConst, KNativePointer, KNativePointer, KNativePointer) +KInt impl_AstNodeTypeConst(KNativePointer contextPtr, KNativePointer nodePtr) { + auto context = reinterpret_cast(contextPtr); + auto node = reinterpret_cast(nodePtr); + + return GetImpl()->AstNodeTypeConst(context, node); +} +KOALA_INTEROP_2(AstNodeTypeConst, KInt, KNativePointer, KNativePointer) + KNativePointer impl_VariableDeclaration(KNativePointer contextPtr, KNativePointer variablePtr) { auto context = reinterpret_cast(contextPtr); auto variable = reinterpret_cast(variablePtr); @@ -1587,6 +1388,15 @@ KNativePointer impl_VarBinderSetContext(KNativePointer contextPtr) { } KOALA_INTEROP_1(VarBinderSetContext, KNativePointer, KNativePointer) +KNativePointer impl_VarBinderSetGenStdLib(KNativePointer contextPtr, KBoolean genStdLibT) { + auto context = reinterpret_cast(contextPtr); + auto genStdLib = static_cast(genStdLibT); + + GetImpl()->VarBinderSetGenStdLib(context, genStdLib); + return nullptr; +} +KOALA_INTEROP_2(VarBinderSetGenStdLib, KNativePointer, KNativePointer, KBoolean) + KNativePointer impl_CreateClassDeclaration(KNativePointer contextPtr, KNativePointer defPtr) { auto context = reinterpret_cast(contextPtr); auto def = reinterpret_cast(defPtr); @@ -1618,16 +1428,19 @@ KNativePointer impl_ClassDefinitionSetTypeParams( } KOALA_INTEROP_3(ClassDefinitionSetTypeParams, KNativePointer, KNativePointer, KNativePointer, KNativePointer) -KNativePointer impl_ClassDefinitionLanguageConst( +KNativePointer impl_ClassDefinitionSetSuper( KNativePointer contextPtr, - KNativePointer nodePtr + KNativePointer astPtr, + KNativePointer superClassPtr ) { auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); + auto ast = reinterpret_cast(astPtr); + auto superClass = reinterpret_cast(superClassPtr); - return GetImpl()->ClassDefinitionLanguageConst(context, node); + GetImpl()->ClassDefinitionSetSuper(context, ast, superClass); + return ast; } -KOALA_INTEROP_2(ClassDefinitionLanguageConst, KNativePointer, KNativePointer, KNativePointer) +KOALA_INTEROP_3(ClassDefinitionSetSuper, KNativePointer, KNativePointer, KNativePointer, KNativePointer) KNativePointer impl_ClassDefinitionIdent( KNativePointer contextPtr, @@ -1646,8 +1459,7 @@ KNativePointer impl_CreateClassDefinition1( KNativePointerArray bodyPtr, KInt bodyLenT, KInt modifiersT, - KInt flagsT, - KNativePointer langT + KInt flagsT ) { auto context = reinterpret_cast(contextPtr); auto ident = reinterpret_cast(identPtr); @@ -1655,11 +1467,10 @@ KNativePointer impl_CreateClassDefinition1( auto bodyLen = static_cast(bodyLenT); auto modifiers = Es2pandaClassDefinitionModifiers(modifiersT); auto flags = Es2pandaModifierFlags(flagsT); - auto lang = reinterpret_cast(langT); - return GetImpl()->CreateClassDefinition1(context, ident, body, bodyLen, modifiers, flags, lang); + return GetImpl()->CreateClassDefinition1(context, ident, body, bodyLen, modifiers, flags); } -KOALA_INTEROP_7(CreateClassDefinition1, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt, KInt, KInt, KNativePointer) +KOALA_INTEROP_6(CreateClassDefinition1, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt, KInt, KInt) KNativePointer impl_UpdateClassDefinition1( KNativePointer contextPtr, @@ -1668,8 +1479,7 @@ KNativePointer impl_UpdateClassDefinition1( KNativePointerArray bodyPtr, KInt bodyLenT, KInt modifiersT, - KInt flagsT, - KNativePointer langT + KInt flagsT ) { auto context = reinterpret_cast(contextPtr); auto original = reinterpret_cast(originalPtr); @@ -1678,8 +1488,165 @@ KNativePointer impl_UpdateClassDefinition1( auto bodyLen = static_cast(bodyLenT); auto modifiers = Es2pandaClassDefinitionModifiers(modifiersT); auto flags = Es2pandaModifierFlags(flagsT); - auto lang = reinterpret_cast(langT); - return GetImpl()->UpdateClassDefinition1(context, original, ident, body, bodyLen, modifiers, flags, lang); + return GetImpl()->UpdateClassDefinition1(context, original, ident, body, bodyLen, modifiers, flags); +} +KOALA_INTEROP_7(UpdateClassDefinition1, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt, KInt, KInt) + +KNativePointer impl_CreateSuperExpression(KNativePointer contextPtr) { + auto context = reinterpret_cast(contextPtr); + + return GetImpl()->CreateSuperExpression(context); +} +KOALA_INTEROP_1(CreateSuperExpression, KNativePointer, KNativePointer) + +KNativePointer impl_UpdateSuperExpression(KNativePointer contextPtr, KNativePointer originalPtr) { + auto context = reinterpret_cast(contextPtr); + auto original = reinterpret_cast(originalPtr); + + return GetImpl()->UpdateSuperExpression(context, original); +} +KOALA_INTEROP_2(UpdateSuperExpression, KNativePointer, KNativePointer, KNativePointer) + +KNativePointer impl_CreateETSImportDeclaration( + KNativePointer contextPtr, + KNativePointer sourcePtr, + KNativePointerArray specifiersPtr, + KInt specifiersLen, + KInt importKindT +) { + auto context = reinterpret_cast(contextPtr); + auto source = reinterpret_cast(sourcePtr); + auto specifiers = reinterpret_cast(specifiersPtr); + auto importKind = static_cast(importKindT); + + return GetImpl()->CreateETSImportDeclaration(context, source, specifiers, specifiersLen, importKind); +} +KOALA_INTEROP_5(CreateETSImportDeclaration, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt, KInt) + +KNativePointer impl_ETSImportDeclarationSourceConst( + KNativePointer contextPtr, + KNativePointer nodePtr +) { + auto context = reinterpret_cast(contextPtr); + auto node = reinterpret_cast(nodePtr); + + return GetImpl()->ETSImportDeclarationSourceConst(context, node); +} +KOALA_INTEROP_2(ETSImportDeclarationSourceConst, KNativePointer, KNativePointer, KNativePointer) + +KNativePointer impl_ETSImportDeclarationResolvedSource( + KNativePointer contextPtr, + KNativePointer nodePtr +) { + auto context = reinterpret_cast(contextPtr); + auto node = reinterpret_cast(nodePtr); + + return GetImpl()->ETSImportDeclarationResolvedSource(context, node); +} +KOALA_INTEROP_2(ETSImportDeclarationResolvedSource, KNativePointer, KNativePointer, KNativePointer) + +KBoolean impl_ETSImportDeclarationHasDeclConst( + KNativePointer contextPtr, + KNativePointer nodePtr +) { + auto context = reinterpret_cast(contextPtr); + auto node = reinterpret_cast(nodePtr); + + return GetImpl()->ETSImportDeclarationHasDeclConst(context, node); } -KOALA_INTEROP_8(UpdateClassDefinition1, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt, KInt, KInt, KNativePointer) +KOALA_INTEROP_2(ETSImportDeclarationHasDeclConst, KBoolean, KNativePointer, KNativePointer) + +KNativePointer impl_CreateImportSource( + KNativePointer contextPtr, + KNativePointer sourcePtr, + KNativePointer resolvedSourcePtr, + KBoolean hasDeclT +) { + auto context = reinterpret_cast(contextPtr); + auto source = reinterpret_cast(sourcePtr); + auto resolvedSource = reinterpret_cast(resolvedSourcePtr); + auto hasDecl = static_cast(hasDeclT); + + return GetImpl()->CreateImportSource(context, source, resolvedSource, hasDecl); +} +KOALA_INTEROP_4(CreateImportSource, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KBoolean) + +KNativePointer impl_CreateImportSpecifier( + KNativePointer contextPtr, + KNativePointer importedPtr, + KNativePointer localPtr +) { + auto context = reinterpret_cast(contextPtr); + auto imported = reinterpret_cast(importedPtr); + auto local = reinterpret_cast(localPtr); + + return GetImpl()->CreateImportSpecifier(context, imported, local); +} +KOALA_INTEROP_3(CreateImportSpecifier, KNativePointer, KNativePointer, KNativePointer, KNativePointer) + + +/* +TODO: NOT FROM API (shouldn't be there) +----------------------------------------------------------------------------------------------------------------------------- +*/ + +es2panda_AstNode * __parentNode; +es2panda_Context * __context; + +static void changeParent(es2panda_AstNode *child) +{ + GetImpl()->AstNodeSetParent(__context, child, __parentNode); +} + +static void SetRightParent(es2panda_AstNode *node, void *arg) +{ + es2panda_Context *ctx = static_cast(arg); + __context = ctx; + __parentNode = node; + + GetImpl()->AstNodeIterateConst(ctx, node, changeParent); +} + +KNativePointer impl_AstNodeUpdateAll(KNativePointer contextPtr, KNativePointer programPtr) { + auto context = reinterpret_cast(contextPtr); + auto program = reinterpret_cast(programPtr); + + GetImpl()->AstNodeForEach(program, SetRightParent, context); + return program; +} +KOALA_INTEROP_2(AstNodeUpdateAll, KNativePointer, KNativePointer, KNativePointer) + +KNativePointer impl_AstNodeUpdateChildren(KNativePointer contextPtr, KNativePointer nodePtr) { + auto context = reinterpret_cast(contextPtr); + auto node = reinterpret_cast(nodePtr); + __parentNode = node; + + GetImpl()->AstNodeIterateConst(context, node, changeParent); + return node; +} +KOALA_INTEROP_2(AstNodeUpdateChildren, KNativePointer, KNativePointer, KNativePointer) + +std::vector __children; + +static void visitChild(es2panda_AstNode *node) { + __children.emplace_back(node); +} + +KNativePointer impl_AstNodeChildren( + KNativePointer contextPtr, + KNativePointer nodePtr +) { + auto context = reinterpret_cast(contextPtr); + auto node = reinterpret_cast(nodePtr); + __context = context; + __children.clear(); + + GetImpl()->AstNodeIterateConst(context, node, visitChild); + return new std::vector(__children); +} +KOALA_INTEROP_2(AstNodeChildren, KNativePointer, KNativePointer, KNativePointer) + +/* +----------------------------------------------------------------------------------------------------------------------------- +*/ diff --git a/arkoala-arkts/libarkts/native/src/node.h b/arkoala-arkts/libarkts/native/src/node.h deleted file mode 100644 index 660aef5ff..000000000 --- a/arkoala-arkts/libarkts/native/src/node.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 2022-2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include - -#ifndef _ARK_TS_NODE_H_ -#define _ARK_TS_NODE_H_ - -class Node { - public: - virtual ~Node() {} - - virtual int kind() { - return 0; - } -}; - -class Identifier : public Node { - public: - std::string name; - - Identifier(std::string&& name) : name(std::move(name)) {} - virtual int kind() { - return 2; - } -}; - -class Block : public Node { - public: - std::vector statements = {}; - - Block(std::vector&& statements) : statements(std::move(statements)) {} - virtual int kind() { - return 3; - } - - Block() {} -}; - -class FunctionDeclaration : public Node { - public: - Identifier* identifier; - Block* block; - - FunctionDeclaration(Identifier* identifier, Block* block) : identifier(identifier), block(block) {} - virtual int kind() { - return 4; - } -}; - -class PropertyAccessExpression: public Node { - public: - Identifier* expression; - Identifier* name; - - PropertyAccessExpression(Identifier* expression, Identifier* name) : expression(expression), name(name) {} - virtual int kind() { - return 5; - } -}; - -class StringLiteral : public Node { - public: - std::string text; - - StringLiteral(std::string&& text) : text(std::move(text)) {} - - virtual int kind() { - return 6; - } -}; - -class CallExpression : public Node { - public: - PropertyAccessExpression* propertyAccessExpression; - std::vector arguments; - - CallExpression(PropertyAccessExpression* propertyAccessExpression, std::vector&& arguments) - : propertyAccessExpression(propertyAccessExpression), arguments(std::move(arguments)) {} - - virtual int kind() { - return 7; - } -}; - -class ExpressionStatement : public Node { - public: - CallExpression* call; - - ExpressionStatement(CallExpression* call) : call(call) {} - - virtual int kind() { - return 8; - } -}; - -class SourceFile : public Node { - public: - std::vector children; - - SourceFile(std::vector&& children) : children(std::move(children)) {} - - virtual int kind() { - return 9; - } -}; - -#endif // _ARK_TS_NODE_H_ \ No newline at end of file diff --git a/arkoala-arkts/libarkts/native/subprojects/node/meson.build b/arkoala-arkts/libarkts/native/subprojects/node/meson.build deleted file mode 100644 index a3b3401b1..000000000 --- a/arkoala-arkts/libarkts/native/subprojects/node/meson.build +++ /dev/null @@ -1,30 +0,0 @@ -project('node', 'cpp', - version: '18.1.0-28-b02', - default_options: ['cpp_std=c++17']) - -oses = { 'emscripten': 'wasm', 'darwin': 'macos' } # rename meson default names to covienient ones -archs = { 'x86_64': 'x64', 'aarch64': 'arm64', 'wasm32': 'wasm' } - -os = target_machine.system() -os = oses.get(os, os) - -arch = target_machine.cpu() -arch = archs.get(arch, arch) - -buildtype = '@0@-@1@-@2@'.format(get_option('build_type'), os, arch) - -fs = import('fs') - -node_addon_api = run_command('node', '-p', 'require.resolve("node-addon-api/package.json").slice(0, -12)', check: true).stdout().strip() -node_api_headers = run_command('node', '-p', 'require.resolve("node-api-headers/package.json").slice(0, -12)', check: true).stdout().strip() - -node_include_dirs = [ - node_api_headers / 'include', - node_addon_api, -] - -summary({ - 'Node addon API': node_addon_api, - 'Node API headers': node_api_headers, - 'Build type': buildtype, -}) diff --git a/arkoala-arkts/libarkts/native/subprojects/node/meson_options.txt b/arkoala-arkts/libarkts/native/subprojects/node/meson_options.txt deleted file mode 100644 index c9c2de160..000000000 --- a/arkoala-arkts/libarkts/native/subprojects/node/meson_options.txt +++ /dev/null @@ -1,6 +0,0 @@ -option('node_dir', type : 'string', value : '', - description : 'Path to NodeJS headers/libs prebuilt') -option('version', type: 'string', value: '', - description: 'NodeJS prebuilt package version to link with') -option('build_type', type : 'combo', choices : ['debug', 'release'], value: 'release', - description: 'NodeJS prebuilt package build variant to link with') \ No newline at end of file diff --git a/arkoala-arkts/libarkts/package.json b/arkoala-arkts/libarkts/package.json index c910549a1..bd7e99366 100644 --- a/arkoala-arkts/libarkts/package.json +++ b/arkoala-arkts/libarkts/package.json @@ -1,36 +1,35 @@ { - "name": "libarkts", + "name": "@koalaui/libarkts", + "private": true, + "main": "./build/es2panda.js", + "types": "./build/src/ts-api/index.d.ts", "dependencies": { - "node-api-headers": "0.0.5", - "node-addon-api": "8.0.0", - "commander": "^11.1.0" - }, - "devDependencies": { - "@koalaui/plugin-api-panda-sdk": "1.0.5", "@types/chai": "^4.3.1", "@types/mocha": "^9.1.0", - "chai": "^4.3.6", + "commander": "10.0.1", "mocha": "^9.2.2", + "node-addon-api": "8.0.0", + "node-api-headers": "0.0.5", + "node-loader": "^2.1.0", + "ts-loader": "^9.2.8", "tsconfig-paths-webpack-plugin": "^4.1.0", - "typescript": "4.9.5", - "webpack-cli": "^5.1.4", - "ts-loader": "^9.2.8" + "typescript": "4.9.5" }, "scripts": { - "clean": "rimraf build node_modules && npm run clean:native && npm run clean:compatible", - "clean:native": "rimraf native/build_es2panda", - "clean:compatible": "rimraf compatible/build compatible/build_typescript compatible/build_arkts", + "clean": "rimraf ./build && npm run clean:native && npm run clean:compatible", + "clean:native": "rimraf ./native/build", + "clean:compatible": "rimraf ./compatible/build", + "clean:generated": "rimraf ./generated/*", + "compile:playground": "cd playground && meson setup build && cd build && meson compile", + "run:playground": "npm run compile:playground && cd playground && ./build/playground.out", "compile:koala:interop": "cd ../../interop && npm run compile", - "compile:native": "cd native && meson setup build_es2panda && cd build_es2panda && meson compile", - "compile": "npm run compile:koala:interop && npm run compile:native", - "test": "npm run compile && backend=es2panda TS_NODE_PROJECT=./test/tsconfig.json mocha -r tsconfig-paths/register --config .mocha.json --reporter-option maxDiffSize=0", - "test:all": "STATE_CHECKED=1 TEST_BIN=1 npm run test", - "compatible": "cd compatible && npx webpack --config arkts.webpack.config.js", - "webpack": "npm run compile && npm run compatible && npx webpack --config es2panda.webpack.config.js", - "run:dev": "npm run run && backend=es2panda node build/api/es2panda.js", - "run": "npm run webpack && node build/api/es2panda.js --file ./input/main.sts --arktsconfig ./arktsconfig.json", - "run:typescript": "npm run compatible && cd input && memo-tsc -p ./tsconfig.json", - "run:debug": "npm run compile:native && cd native && ./build_es2panda/playground_exec", - "run:abc": "./node_modules/@koalaui/plugin-api-panda-sdk/@panda/sdk/linux_host_tools/bin/ark --load-runtimes=ets --boot-panda-files=./node_modules/@koalaui/plugin-api-panda-sdk/@panda/sdk/ets/etsstdlib.abc ./native/main.abc ETSGLOBAL::main" + "compile:native": "npm run compile:koala:interop && cd native && meson setup build && cd build && meson compile", + "run": "npm run pack:es2panda && node build/api/es2panda.js --file ./input/main.sts --arktsconfig ./arktsconfig.json", + "run:abc": "node_modules/@panda/sdk/linux_host_tools/bin/ark --load-runtimes=ets --boot-panda-files=node_modules/@panda/sdk/ets/etsstdlib.abc ./generated/main.abc ETSGLOBAL::main", + "run:dev": "npm run run && node build/api/es2panda.js", + "pack:compatible": "npx memo-tsc -p ./compatible/arkts-tsconfig.json", + "pack:es2panda": "npm run compile:native && npm run pack:compatible && npx webpack --config webpack.config.js", + "test": "npm run compile:native && TS_NODE_PROJECT=./test/tsconfig.json mocha -r tsconfig-paths/register --config .mocha.json --reporter-option maxDiffSize=0", + "test:all": "STATE_CHECKED=1 TEST_BIN=1 npm run test" } } diff --git a/arkoala-arkts/libarkts/playground/meson.build b/arkoala-arkts/libarkts/playground/meson.build new file mode 100644 index 000000000..e70cb0ad8 --- /dev/null +++ b/arkoala-arkts/libarkts/playground/meson.build @@ -0,0 +1,31 @@ +project('playground', 'cpp', + version: '1.0', + default_options: [ + 'cpp_std=c++17', + 'buildtype=debug', + ], +) + +cflags = [ + '-DKOALA_USE_NODE_VM', + '-DKOALA_NAPI' +] + +if target_machine.system() == 'windows' + cflags += ['-DKOALA_WINDOWS'] +else + cflags += ['-DKOALA_LINUX'] +endif + +executable( + 'playground.out', + [ + './src/playground.cc', + ], + include_directories: [ + get_option('panda_sdk_dir') / 'ohos_arm64/include/tools/es2panda/public', + get_option('panda_sdk_dir') / 'ohos_arm64/include/tools/es2panda', + get_option('interop_src_dir'), + ], + cpp_args: cflags +) diff --git a/arkoala-arkts/libarkts/playground/meson_options.txt b/arkoala-arkts/libarkts/playground/meson_options.txt new file mode 100644 index 000000000..98f27a075 --- /dev/null +++ b/arkoala-arkts/libarkts/playground/meson_options.txt @@ -0,0 +1,4 @@ +option('panda_sdk_dir', type : 'string', value : '../node_modules/@panda/sdk/', + description : 'path to panda sdk') +option('interop_src_dir', type : 'string', value : '../../../interop/src/cpp/', + description : 'path to interop_src') diff --git a/arkoala-arkts/libarkts/native/src/playground.cc b/arkoala-arkts/libarkts/playground/src/playground.cc similarity index 90% rename from arkoala-arkts/libarkts/native/src/playground.cc rename to arkoala-arkts/libarkts/playground/src/playground.cc index 49e0785e3..2b05c0e94 100644 --- a/arkoala-arkts/libarkts/native/src/playground.cc +++ b/arkoala-arkts/libarkts/playground/src/playground.cc @@ -3,7 +3,13 @@ #include "dynamic-loader.h" #include "es2panda_lib.h" -const char* libpath = "../node_modules/@koalaui/plugin-api-panda-sdk/@panda/sdk/linux_host_tools/lib/libes2panda-public.so"; +#ifdef __x86_64__ + #define PLUGIN_DIR "linux_host_tools" +#else + #define PLUGIN_DIR "linux_arm64_host_tools" +#endif + +const char* libpath = "../node_modules/@panda/sdk/" PLUGIN_DIR "/lib/libes2panda-public.so"; static es2panda_Impl *impl = nullptr; @@ -23,7 +29,12 @@ es2panda_Impl *GetImpl() { return impl; } -static const char* source = ""; +static const char* source = +"" +; + +void test(es2panda_Context* context) { +} int main() { const char* args[] = { @@ -39,8 +50,6 @@ int main() { auto config = GetImpl()->CreateConfig(4, args); auto context = GetImpl()->CreateContextFromString(config, source, args[3]); - // playground - GetImpl()->ProceedToState(context, ES2PANDA_STATE_PARSED); if(GetImpl()->ContextState(context) == ES2PANDA_STATE_ERROR) { @@ -51,6 +60,8 @@ int main() { std::cout << "PROCEED TO PARSE SUCCESS" << std::endl; } + test(context); + GetImpl()->ProceedToState(context, ES2PANDA_STATE_SCOPE_INITED); if(GetImpl()->ContextState(context) == ES2PANDA_STATE_ERROR) { diff --git a/arkoala-arkts/libarkts/src/NativeModule.ts b/arkoala-arkts/libarkts/src/NativeModule.ts deleted file mode 100644 index 174909f1c..000000000 --- a/arkoala-arkts/libarkts/src/NativeModule.ts +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (c) 2022-2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { KBoolean, KInt, KNativePointer } from "@koalaui/interop" -import * as path from "path" - -export type KNativePointerArray = BigUint64Array - -export interface NativeModule { - _ContextState(context: KNativePointer): KInt - _ContextErrorMessage(context: KNativePointer): KNativePointer - _ETSParserCreateExpression(context: KNativePointer, sourceCode: String, flags: KInt): KNativePointer - _AstNodeDumpModifiers(context: KNativePointer, node: KNativePointer): KNativePointer - _CreateAstDumper(context: KNativePointer, node: KNativePointer, source: String): KNativePointer - _AstDumperModifierToString(context: KNativePointer, dumper: KNativePointer, flags: KInt): KNativePointer - - _CreateConfig(argc: number, argv: string[]): KNativePointer - _DestroyConfig(config: KNativePointer): void - _CreateContextFromString(config: KNativePointer, source: String, filename: String): KNativePointer - _DestroyContext(context: KNativePointer): void - _ProceedToState(context: KNativePointer, state: number): void - _ContextProgram(context: KNativePointer): KNativePointer - _ProgramAst(program: KNativePointer): KNativePointer - _CheckerStartChecker(context: KNativePointer): KBoolean - _VarBinderIdentifierAnalysis(context: KNativePointer): void - _VarBinderInitTopScope(context: KNativePointer): void - - _StringLength(ptr: KNativePointer): KInt - _StringData(ptr: KNativePointer, buffer: KNativePointer, length: KInt): void - _GetStringFinalizer(): KNativePointer - _InvokeFinalizer(ptr: KNativePointer, finalizer: KNativePointer): void - _GetPtrVectorSize(ptr: KNativePointer): KInt - _GetPtrVectorElement(ptr: KNativePointer, index: KInt): KNativePointer - - _SourceFileGetChildren(node: KNativePointer): KNativePointer - _BlockGetStatements(node: KNativePointer): KNativePointer - _FunctionDeclarationIsAnonymousConst(context: KNativePointer, node: KNativePointer): KBoolean - _ExpressionStatementGetExpression(context: KNativePointer, node: KNativePointer): KNativePointer - _CallExpressionArguments(context: KNativePointer, node: KNativePointer, returnLen: KNativePointer): KNativePointer - _CallExpressionCallee(context: KNativePointer, node: KNativePointer): KNativePointer - _IdentifierGetText(node: KNativePointer): KNativePointer - _IdentifierIsPrivateIdentConst(context: KNativePointer, node: KNativePointer): KBoolean - _PropertyAccessExpressionGetExpression(node: KNativePointer): KNativePointer - _PropertyAccessExpressionGetName(node: KNativePointer): KNativePointer - - _FunctionDeclarationFunction(context: KNativePointer, node: KNativePointer): KNativePointer - _ScriptFunctionSignature(context: KNativePointer, node: KNativePointer): KNativePointer - _ScriptFunctionParams(context: KNativePointer, node: KNativePointer): KNativePointer - _ScriptFunctionId(context: KNativePointer, node: KNativePointer): KNativePointer - _ScriptFunctionBody(context: KNativePointer, node: KNativePointer): KNativePointer - _ScriptFunctionSetIdent(context: KNativePointer, ast: KNativePointer, id: KNativePointer): KNativePointer - _ScriptFunctionIrSignature(context: KNativePointer, ast: KNativePointer): KNativePointer - _ScriptFunctionUpdateIrSignature(context: KNativePointer, ast: KNativePointer, signature: KNativePointer): KNativePointer - _ScriptFunctionSetSignature(context: KNativePointer, ast: KNativePointer, signature: KNativePointer): KNativePointer - _ScriptFunctionSetIrSignature(context: KNativePointer, ast: KNativePointer, signature: KNativePointer): KNativePointer - _ScriptFunctionSetBody(context: KNativePointer, ast: KNativePointer, body: KNativePointer): KNativePointer - _ScriptFunctionSetScope(context: KNativePointer, ast: KNativePointer, scope: KNativePointer): KNativePointer - _ScriptFunctionDeclareConst(context: KNativePointer, node: KNativePointer): KBoolean - _ScriptFunctionFlagsConst(context: KNativePointer, node: KNativePointer): KInt - _ScriptFunctionTypeParams(context: KNativePointer, node: KNativePointer): KNativePointer - _ScriptFunctionReturnTypeAnnotation(context: KNativePointer, node: KNativePointer): KNativePointer - _UpdateBlockStatement(context: KNativePointer, original: KNativePointer, statementList: KNativePointerArray, statementListLen: KInt): KNativePointer - _BlockStatementSetScope(context: KNativePointer, node: KNativePointer, scope: KNativePointerArray): void - _CreateIdentifier1(context: KNativePointer, name: String): KNativePointer - _CreateIdentifier2(context: KNativePointer, name: String, type_annotation: KNativePointer): KNativePointer - _IdentifierSetReference(context: KNativePointer, node: KNativePointer, isRef: KBoolean): void - _IdentifierSetName(context: KNativePointer, node: KNativePointer, name: String): void - _CreateFunctionDeclaration(context: KNativePointer, func: KNativePointer, isAnon: KBoolean): KNativePointer - _UpdateFunctionDeclaration(context: KNativePointer, node: KNativePointer, func: KNativePointer, isAnon: KBoolean): KNativePointer - _CreateReturnStatement1(context: KNativePointer, argument: KNativePointer): KNativePointer - _ReturnStatementArgument(context: KNativePointer, node: KNativePointer): KNativePointer - _CreateIfStatement(context: KNativePointer, test: KNativePointer, consequent: KNativePointer, alternate: KNativePointer): KNativePointer - _CreateBinaryExpression(context: KNativePointer, left: KNativePointer, right: KNativePointer, operatorType: KInt): KNativePointer - _CreateAssignmentExpression(context: KNativePointer, left: KNativePointer, right: KNativePointer, assignmentOperator: KInt): KNativePointer - _CreateMethodDefinition(context: KNativePointer, kind: KInt, key: KNativePointer, value: KNativePointer, modifiers: KInt, isComputed: KBoolean): KNativePointer - _CreateClassProperty(context: KNativePointer, key: KNativePointer, value: KNativePointer, typeAnnotation: KNativePointer, modifiers: KInt, isComputed: KBoolean): KNativePointer - - _CreateFunctionSignature(context: KNativePointer, typeParams: KNativePointer, params: KNativePointerArray, paramsLen: KInt, returnTypeAnnotation: KNativePointer): KNativePointer - _CreateScriptFunction(context: KNativePointer, databody: KNativePointer, datasignature: KNativePointer, datafuncFlags: KInt, dataflags: KInt, datadeclare: KBoolean): KNativePointer - _UpdateScriptFunction(context: KNativePointer, original: KNativePointer, databody: KNativePointer, datasignature: KNativePointer, datafuncFlags: KInt, dataflags: KInt, datadeclare: KBoolean): KNativePointer - _CreateBlockStatement(context: KNativePointer, statementList: KNativePointerArray, statementListLen: KInt): KNativePointer - _AstNodeScopeConst(context: KNativePointer, ast: KNativePointer): KNativePointer - _AstNodeParent(context: KNativePointer, ast: KNativePointer): KNativePointer - _AstNodeSetParent(context: KNativePointer, ast: KNativePointer, parent: KNativePointer): KNativePointer - _AstNodeClone(context: KNativePointer, ast: KNativePointer, parent: KNativePointer): KNativePointer - _AstNodeModifiers(context: KNativePointer, ast: KNativePointer): KInt - _AstNodeAddModifier(context: KNativePointer, ast: KNativePointer, flags: KInt): void - _AstNodeClearModifier(context: KNativePointer, ast: KNativePointer, flags: KInt): void - _AstNodeVariableConst(context: KNativePointer, ast: KNativePointer): KNativePointer - _FunctionSignatureTypeParams(context: KNativePointer, ast: KNativePointer): KNativePointer - _FunctionSignatureReturnType(context: KNativePointer, ast: KNativePointer): KNativePointer - _FunctionSignatureParamsConst(context: KNativePointer, ast: KNativePointer, returnTypeLen: KNativePointer): KNativePointer - _UpdateIdentifier1(context: KNativePointer, ast: KNativePointer, name: string): KNativePointer - _UpdateIdentifier2(context: KNativePointer, ast: KNativePointer, name: string, typeAnnotation: KNativePointer): KNativePointer - _UpdateMethodDefinition(context: KNativePointer, node: KNativePointer, kind: KInt, key: KNativePointer, value: KNativePointer, modifiers: KInt, isComputed: KBoolean): KNativePointer - _MethodDefinitionFunction(context: KNativePointer, node: KNativePointer): KNativePointer - _MethodDefinitionKindConst(context: KNativePointer, node: KNativePointer): KInt - - _CreateMemberExpression(context: KNativePointer, object: KNativePointer, property: KNativePointer, kind: KInt, computed: KBoolean, optional: KBoolean): KNativePointer - _UpdateMemberExpression(context: KNativePointer, node: KNativePointer, object: KNativePointer, property: KNativePointer, kind: KInt, computed: KBoolean, optional: KBoolean): KNativePointer - _MemberExpressionObject(context: KNativePointer, node: KNativePointer): KNativePointer - _MemberExpressionProperty(context: KNativePointer, node: KNativePointer): KNativePointer - _CreateCallExpression(context: KNativePointer, callee: KNativePointer, args: KNativePointerArray, argsLen: KInt, typeParams: KNativePointer, optional: KBoolean, trailingComma: KBoolean): KNativePointer - _UpdateCallExpression(node: KNativePointer, context: KNativePointer, callee: KNativePointer, args: KNativePointerArray, argsLen: KInt, typeParams: KNativePointer, optional: KBoolean, trailingComma: KBoolean): KNativePointer - _CreateArrowFunctionExpression(context: KNativePointer, node: KNativePointer): KNativePointer - _FunctionExpressionFunction(context: KNativePointer, node: KNativePointer): KNativePointer - _ArrowFunctionExpressionFunction(context: KNativePointer, node: KNativePointer): KNativePointer - _ArrowFunctionExpressionCreateTypeAnnotation(context: KNativePointer, node: KNativePointer): KNativePointer - _CreateFunctionExpression(context: KNativePointer, node: KNativePointer): KNativePointer - _UpdateFunctionExpression(context: KNativePointer, original: KNativePointer, node: KNativePointer): KNativePointer - - _CreateExpressionStatement(context: KNativePointer, expr: KNativePointer): KNativePointer - _UpdateExpressionStatement(context: KNativePointer, node: KNativePointer, expr: KNativePointer): KNativePointer - _CreateETSParameterExpression(context: KNativePointer, identifier: KNativePointer, initializer: KNativePointer): KNativePointer - _CreateETSPrimitiveType(context: KNativePointer, type: KInt): KNativePointer - _CreateETSTypeReference(context: KNativePointer, part: KNativePointer): KNativePointer - _CreateETSTypeReferencePart(context: KNativePointer, name: KNativePointer, typeParams: KNativePointer, prev: KNativePointer): KNativePointer - _CreateETSTypeReferencePart1(context: KNativePointer, name: KNativePointer): KNativePointer - _IsIdentifier(node: KNativePointer): KBoolean - _IdentifierName(context: KNativePointer, node: KNativePointer): KNativePointer - _ETSParameterExpressionIdent(context: KNativePointer, node: KNativePointer): KNativePointer - _CreateTSTypeParameterDeclaration(context: KNativePointer, params: KNativePointerArray, paramsLen: KInt, requiredParams: KInt): KNativePointer - _TSTypeParameterDeclarationParamsConst(context: KNativePointer, node: KNativePointer, returnTypeLen: KNativePointer): KNativePointer - _CreateTSTypeParameter(context: KNativePointer, name: KNativePointer, constraint: KNativePointer, defaultType: KNativePointer): KNativePointer - _TSTypeParameterName(context: KNativePointer, node: KNativePointer): KNativePointer - - _CreateTSUnionType(context: KNativePointer, types: KNativePointerArray, typesLen: KInt): KNativePointer - _TSUnionTypeTypesConst(context: KNativePointer, node: KNativePointer, returnTypeLen: KNativePointer): KNativePointer - _CreateETSUnionTypeIr(context: KNativePointer, types: KNativePointerArray, typesLen: KInt): KNativePointer - _ETSUnionTypeIrTypesConst(context: KNativePointer, node: KNativePointer, returnTypeLen: KNativePointer): KNativePointer - - _CreateVariableDeclaration(context: KNativePointer, kind: KInt, declarators: KNativePointerArray, declaratorsLen: KInt, declare: KBoolean): KNativePointer - _UpdateVariableDeclaration(context: KNativePointer, original: KNativePointer, kind: KInt, declarators: KNativePointerArray, declaratorsLen: KInt, declare: KBoolean): KNativePointer - _CreateVariableDeclarator(context: KNativePointer, flag: KInt, ident: KNativePointer): KNativePointer - _VariableDeclarationDeclaratorsConst(context: KNativePointer, node: KNativePointer): KNativePointer - _VariableDeclaratorId(context: KNativePointer, node: KNativePointer): KNativePointer - _VariableDeclaratorSetInit(context: KNativePointer, node: KNativePointer, init: KNativePointer): void - - _CreateStringLiteral(context: KNativePointer, string: string): KNativePointer - _CreateNumberLiteral(context: KNativePointer, string: string): KNativePointer - _NumberLiteralStrConst(context: KNativePointer, node: KNativePointer): KNativePointer - _StringLiteralStrConst(context: KNativePointer, node: KNativePointer): KNativePointer - - _GetKind(context: KNativePointer, node: KNativePointer): KInt - - _BlockStatementStatements(context: KNativePointer, node: KNativePointer): KNativePointer - _BlockStatementSetStatements(context: KNativePointer, node: KNativePointer, statements: KNativePointerArray, statementsLen: KInt): void - _BlockStatementUpdateStatements(context: KNativePointer, original: KNativePointer, statementList: KNativePointerArray, statementListLen: KInt, returnType: KNativePointer): KNativePointer - _ClassDeclarationDefinition(context: KNativePointer, node: KNativePointer): KNativePointer - _ClassDefinitionBody(context: KNativePointer, node: KNativePointer): KNativePointer - _ClassDefinitionLanguageConst(context: KNativePointer, node: KNativePointer): KNativePointer - _ClassDefinitionIdent(context: KNativePointer, node: KNativePointer): KNativePointer - _ClassDefinitionTypeParamsConst(context: KNativePointer, node: KNativePointer): KNativePointer - _CreateClassDeclaration(context: KNativePointer, def: KNativePointer): KNativePointer - _UpdateClassDeclaration(context: KNativePointer, original: KNativePointer, def: KNativePointer): KNativePointer - _CreateClassDefinition1(context: KNativePointer, ident: KNativePointer, body: KNativePointerArray, bodyLen: KInt, modifiers: KInt, flags: KInt, lang: KNativePointer): KNativePointer - _ClassDefinitionSetTypeParams(context: KNativePointer, ast: KNativePointer, typeParams: KNativePointer): void - _UpdateClassDefinition1(context: KNativePointer, original: KNativePointer, ident: KNativePointer, body: KNativePointerArray, bodyLen: KInt, modifiers: KInt, flags: KInt, lang: KNativePointer): KNativePointer - _CreateETSFunctionTypeIr(context: KNativePointer, signature: KNativePointer, funcFlags: KInt): KNativePointer - - _IsProgram(context: KNativePointer, node: KNativePointer): KBoolean - _AstNodeDumpJsonConst(context: KNativePointer, node: KNativePointer): KNativePointer - _AstNodeDumpEtsSrcConst(context: KNativePointer, node: KNativePointer): KNativePointer - _AstNodeUpdateChildren(context: KNativePointer, node: KNativePointer): void - _AstNodeUpdateAll(context: KNativePointer, node: KNativePointer): void - _AstNodeSetOriginalNode(context: KNativePointer, ast: KNativePointer, originalNode: KNativePointer): void - _AstNodeOriginalNodeConst(context: KNativePointer, ast: KNativePointer): KNativePointer - - _VarBinderSetProgram(context: KNativePointer): void - _VarBinderSetContext(context: KNativePointer): void - - _VariableDeclaration(context: KNativePointer, variable: KNativePointer): KNativePointer - _DeclNode(context: KNativePointer, decl: KNativePointer): KNativePointer - - _ScopeSetParent(context: KNativePointer, ast: KNativePointer, scope: KNativePointer): void -} - -const backend = process.env.backend ?? 'es2panda' - -const libarkts = 'libarkts' -const filename = __filename -const occurrence = filename.indexOf(libarkts) -const root = filename.slice(0, occurrence + libarkts.length) -const importPath = path.join(root, 'native', `build_${backend}`, 'Es2panda.node') -export const nativeModule: NativeModule = require(/* webpackIgnore: true */ importPath) diff --git a/arkoala-arkts/libarkts/src/api/factory/utilities.ts b/arkoala-arkts/libarkts/src/api/factory/utilities.ts deleted file mode 100644 index 8d62af9c0..000000000 --- a/arkoala-arkts/libarkts/src/api/factory/utilities.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2022-2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import global from "../static/global" -import * as ts from "../layers/ts/types" -import * as arkts from "../layers/arkts/types" - -import { nativeModule } from "../../NativeModule" -import { KNativePointer, KInt, KBoolean } from "@koalaui/interop" -import { - TokenSyntaxKind, - Es2pandaModifierFlags, - Es2pandaScriptFunctionFlags, -} from "../static/enums" -import { - passNodeArray, -} from "../layers/ts/utilities" - -// export function updateAllChildren(peer: KNativePointer) { -// nativeModule._AstNodeUpdateAll(global.context, peer) -// } - -// TODO: support unrequired params (with ?) -export function passTypeParams(params: readonly ts.TypeParameterDeclaration[] | undefined): arkts.TSTypeParameterDeclaration | undefined { - if (params === undefined) { - return undefined - } - return arkts.TSTypeParameterDeclaration.create( - passNodeArray(params) - ) -} - -// export function identifierUpdateTypeAnnotation(node: arkts.Identifier, type: arkts.TypeNode | undefined): arkts.Identifier { -// const peer = withString(node.text, (_text: string) => { -// return nativeModule._UpdateIdentifier2(global.context, node.peer, _text, type?.peer ?? arkts.NULLPTR) -// }) -// return new arkts.Identifier(node.text, type?.node) -// } diff --git a/arkoala-arkts/libarkts/src/api/layers/arkts/utilities.ts b/arkoala-arkts/libarkts/src/api/layers/arkts/utilities.ts deleted file mode 100644 index 52ab99579..000000000 --- a/arkoala-arkts/libarkts/src/api/layers/arkts/utilities.ts +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) 2022-2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as arkts from "./types" -import global from "../../static/global" - -import { KNativePointer, withString, fromPtrArray, withStringResult, withStringArray } from "@koalaui/interop" -import { nativeModule } from "../../../NativeModule" -import { NativePtrDecoder } from "../../../node/Platform" -import { - es2pandaKind, - Es2pandaScriptFunctionFlags, -} from "../../static/enums" - -export function classByPeer(peer: KNativePointer): { new (peer: KNativePointer): arkts.Node } { - const kinds = - new Map([ - // [es2pandaKind.UnsupportedNode, ets.UnsupportedNode], - - [es2pandaKind.Program, arkts.Program], - [es2pandaKind.Identifier, arkts.Identifier], - [es2pandaKind.StringLiteral, arkts.StringLiteral], - [es2pandaKind.NumberLiteral, arkts.NumberLiteral], - [es2pandaKind.ExpressionStatement, arkts.ExpressionStatement], - [es2pandaKind.FunctionDeclaration, arkts.FunctionDeclaration], - [es2pandaKind.ScriptFunction, arkts.ScriptFunction], - [es2pandaKind.Block, arkts.Block], - [es2pandaKind.ReturnStatement, arkts.ReturnStatement], - [es2pandaKind.ETSParameterExpression, arkts.ETSParameterExpression], - [es2pandaKind.ETSTypeReference, arkts.ETSTypeReference], - [es2pandaKind.TSTypeParameterDeclaration, arkts.TSTypeParameterDeclaration], - [es2pandaKind.ETSPrimitiveType, arkts.ETSPrimitiveType], - [es2pandaKind.CallExpression, arkts.CallExpression], - [es2pandaKind.MemberExpression, arkts.MemberExpression], - [es2pandaKind.TSTypeParameter, arkts.TSTypeParameter], - [es2pandaKind.IfStatement, arkts.IfStatement], - [es2pandaKind.BinaryExpression, arkts.BinaryExpression], - [es2pandaKind.ETSUnionType, arkts.ETSUnionType], - [es2pandaKind.ArrowFunctionExpression, arkts.ArrowFunctionExpression], - [es2pandaKind.ClassDeclaration, arkts.ClassDeclaration], - [es2pandaKind.ClassDefinition, arkts.ClassDefinition], - [es2pandaKind.MethodDefinition, arkts.MethodDefinition], - [es2pandaKind.ClassProperty, arkts.ClassProperty], - [es2pandaKind.AssignmentExpression, arkts.AssignmentExpression], - ]) - - const kind = nativeModule._GetKind(global.context, peer) - return kinds.get(kind) ?? global.throwError(`UNSUPPORTED NODE (arkts): ${es2pandaKind[kind]}`) -} - -export function unpackNonNullableNode(peer: KNativePointer): T { - if (peer === arkts.NULLPTR) { - global.throwError('peer is NULLPTR (maybe you should use unpackNode)') - } - return (new (classByPeer(peer))(peer)) as T -} - -export function unpackNode(peer: KNativePointer): T | undefined { - if (peer === arkts.NULLPTR) { - return undefined - } - return (new (classByPeer(peer))(peer)) as T -} - -export function passNode(node: arkts.Node | undefined): KNativePointer { - return node?.peer ?? arkts.NULLPTR -} - -// meaning unpackNonNullableNodeArray -export function unpackNodeArray(nodesPtr: KNativePointer): readonly T[] { - if (nodesPtr === arkts.NULLPTR) { - global.throwError('nodesPtr is NULLPTR (maybe you should use unpackNodeArray)') - } - const array = (new NativePtrDecoder).decode(nodesPtr) - - return fromPtrArray(array, (peer: KNativePointer) => { - return unpackNonNullableNode(peer) - }) -} - -export function passNodeArray(nodes: readonly arkts.Node[] | undefined): BigUint64Array { - return new BigUint64Array((nodes === undefined) ? [] : nodes.map(node => BigInt(node.peer))) -} - -export function unpackObject(type: { new (peer: KNativePointer): T }, peer: KNativePointer): T | undefined { - if (peer === arkts.NULLPTR) { - return undefined - } - return new type(peer) -} - -export function unpackString(peer: KNativePointer): string { - return withStringResult(peer) ?? global.throwError(`failed to unpack (peer shouldn't be NULLPTR)`) -} - -export function passString(str: string | undefined): string { - if (str === undefined) { - return "" - } - return withString(str, (_str: string) => _str) -} - -export function passStringArray(strs: string[]): string[] { - return withStringArray(strs, (_strs: string[]) => _strs) -} - -export function scriptFunctionHasBody(peer: KNativePointer): boolean { - const flags = nativeModule._ScriptFunctionFlagsConst(global.context, peer) - return true - && ((flags & Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_EXTERNAL) === 0) - && ((flags & Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_EXTERNAL_OVERLOAD) === 0) -} - -// TODO: update scopes and other data -export function updateNode(node: T, original: T): T { - if (node.peer === arkts.NULLPTR) { - global.throwError('updateNode called on NULLPTR') - } - nativeModule._AstNodeSetOriginalNode(global.context, node.peer, original.peer) - nativeModule._AstNodeSetParent(global.context, node.peer, nativeModule._AstNodeParent(global.context, original.peer)) - nativeModule._AstNodeUpdateChildren(global.context, node.peer) - node.modifiers = original.modifiers - // new flags may change children - node.updateChildren() - // switch (classByPeer(peer)) { - // case arkts.ClassDeclaration: { - // // TODO: update Language - // break - // } - // } - return node -} - -// export function updateNodeModifiers(node: T, modifiers: ReadonlyArray | undefined): T { -// // node.modifiers = modifiers -// return node -// } - -// export function updateModifiers(peer: KNativePointer, modifiers: ReadonlyArray | undefined): KNativePointer { -// if (modifiers === undefined) { -// return peer -// } -// setModifierFlags(peer, packModifiers(modifiers)) -// return peer -// } diff --git a/arkoala-arkts/libarkts/src/api/static/global.ts b/arkoala-arkts/libarkts/src/api/static/global.ts deleted file mode 100644 index f5d4a0b11..000000000 --- a/arkoala-arkts/libarkts/src/api/static/global.ts +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (c) 2022-2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { KNativePointer } from "@koalaui/interop" -import { - SyntaxKind, - TokenSyntaxKind, - Es2pandaScriptFunctionFlags, - Es2pandaTokenType, - Es2pandaModifierFlags, -} from "./enums" -import * as arkts from "../layers/ts/types" - -// TODO: -// type ModifierKinds = arkts.ModifierSyntaxKind | SyntaxKind.UnknownKeyword | SyntaxKind.ConstructorKeyword - -export default class global { - static throwError(error: string): never { - throw new Error(error) - } - - private static _config?: KNativePointer - public static set config(config: KNativePointer) { - if (global._config !== undefined) { - throw new Error('Global.config already initialized') - } - global._config = config - } - public static get config(): KNativePointer { - return global._config ?? global.throwError('Global.config not initialized') - } - - public static isInitializedConfig(): boolean { - return (global._config !== undefined) - } - - private static _context?: KNativePointer - public static set context(context: KNativePointer) { - global._context = context - } - public static get context(): KNativePointer { - return global._context ?? global.throwError('Global.context not initialized') - } - - public static isInitializedContext(): boolean { - return (global._context !== undefined) - } - - private static _tokenKinds?: Map - - public static get tokenKinds(): Map { - if (this._tokenKinds === undefined) { - this._tokenKinds = - new Map([ - [SyntaxKind.PlusToken, Es2pandaTokenType.TOKEN_TYPE_PUNCTUATOR_PLUS], - ]) - } - return this._tokenKinds - } - - private static _scriptFunctionFlags?: Map - - public static get scriptFunctionFlags(): Map { - if (this._scriptFunctionFlags === undefined) { - this._scriptFunctionFlags = - new Map([ - [SyntaxKind.StaticKeyword, Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_STATIC_BLOCK], - [SyntaxKind.AsyncKeyword, Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_ASYNC], - [SyntaxKind.PublicKeyword, Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_NONE], - ]) - } - return this._scriptFunctionFlags - } - - private static _modifierFlags?: Map - - public static get modifierFlags(): Map { - if (this._modifierFlags === undefined) { - this._modifierFlags = - new Map([ - // [SyntaxKind.UnknownKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_NONE], - // [SyntaxKind.ConstructorKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_CONSTRUCTOR], - - [SyntaxKind.AbstractKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_ABSTRACT], - // TODO: unsupported - // [SyntaxKind.AccessorKeyword, Es2pandaModifierFlags.], - [SyntaxKind.AsyncKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_ASYNC], - [SyntaxKind.ConstKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_CONST], - [SyntaxKind.DeclareKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_DECLARE], - [SyntaxKind.DefaultKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_DEFAULT_EXPORT], - [SyntaxKind.ExportKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_EXPORT], - [SyntaxKind.InKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_IN], - [SyntaxKind.PrivateKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_PRIVATE], - [SyntaxKind.ProtectedKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_PROTECTED], - [SyntaxKind.PublicKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC], - [SyntaxKind.OutKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_OUT], - [SyntaxKind.OverrideKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_OVERRIDE], - [SyntaxKind.ReadonlyKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_READONLY], - [SyntaxKind.StaticKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC], - ]) - } - return this._modifierFlags - } - - private static _translateModifiers?: Map - - public static get translateModifiers(): Map { - if (this._translateModifiers === undefined) { - this._translateModifiers = - new Map([ - // [Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, SyntaxKind.UnknownKeyword], - // [Es2pandaModifierFlags.MODIFIER_FLAGS_CONSTRUCTOR, SyntaxKind.ConstructorKeyword], - - [Es2pandaModifierFlags.MODIFIER_FLAGS_ABSTRACT, SyntaxKind.AbstractKeyword], - // TODO: unsupported - // [Es2pandaModifierFlags. , SyntaxKind.AccessorKeyword], - [Es2pandaModifierFlags.MODIFIER_FLAGS_ASYNC, SyntaxKind.AsyncKeyword], - [Es2pandaModifierFlags.MODIFIER_FLAGS_CONST, SyntaxKind.ConstKeyword], - [Es2pandaModifierFlags.MODIFIER_FLAGS_DECLARE, SyntaxKind.DeclareKeyword], - // TODO: choose one - // [Es2pandaModifierFlags.MODIFIER_FLAGS_DEFAULT_EXPORT, SyntaxKind.DefaultClause], - // [Es2pandaModifierFlags.MODIFIER_FLAGS_DEFAULT_EXPORT, SyntaxKind.DefaultKeyword], - [Es2pandaModifierFlags.MODIFIER_FLAGS_EXPORT, SyntaxKind.ExportKeyword], - [Es2pandaModifierFlags.MODIFIER_FLAGS_IN, SyntaxKind.InKeyword], - [Es2pandaModifierFlags.MODIFIER_FLAGS_PRIVATE, SyntaxKind.PrivateKeyword], - [Es2pandaModifierFlags.MODIFIER_FLAGS_PROTECTED, SyntaxKind.ProtectedKeyword], - [Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC, SyntaxKind.PublicKeyword], - [Es2pandaModifierFlags.MODIFIER_FLAGS_OUT, SyntaxKind.OutKeyword], - [Es2pandaModifierFlags.MODIFIER_FLAGS_OVERRIDE, SyntaxKind.OverrideKeyword], - [Es2pandaModifierFlags.MODIFIER_FLAGS_READONLY, SyntaxKind.ReadonlyKeyword], - [Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC, SyntaxKind.StaticKeyword], - ]) - } - return this._translateModifiers - } -} diff --git a/arkoala-arkts/libarkts/src/arkts-api/factory/nodeFactory.ts b/arkoala-arkts/libarkts/src/arkts-api/factory/nodeFactory.ts new file mode 100644 index 000000000..b06af611c --- /dev/null +++ b/arkoala-arkts/libarkts/src/arkts-api/factory/nodeFactory.ts @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2022-2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as arkts from "../types" +import { updateNodeByNode } from "../utilities/private" + +function compose( + create: (...args: ARGS) => T, + update: (node: T, original: T) => T = updateNodeByNode +): (node: T, ...args: ARGS) => T { + return (node: T, ...args: ARGS) => update(node, create(...args)); +} + +export const factory = { + /** + * @see TS_INTERFACE + * @arg text: string + */ + createIdentifier: arkts.Identifier.create, + updateIdentifier: compose(arkts.Identifier.create), + + /** + * @see TS_INTERFACE + * @arg expression: Expression, + * @arg typeArguments: readonly TypeNode[] | undefined, + * @arg argumentsArray: readonly Expression[] | undefined, + */ + createCallExpression: arkts.CallExpression.create, + updateCallExpression: compose(arkts.CallExpression.create), + + /** + * TODO: + */ + createExpressionStatement: arkts.ExpressionStatement.create, + updateExpressionStatement: compose(arkts.ExpressionStatement.create), + + /** + * TODO: + */ + createMemberExpression: arkts.MemberExpression.create, + updateMemberExpression: compose(arkts.MemberExpression.create), +} diff --git a/arkoala-arkts/libarkts/src/api/layers/ts/index.ts b/arkoala-arkts/libarkts/src/arkts-api/index.ts similarity index 78% rename from arkoala-arkts/libarkts/src/api/layers/ts/index.ts rename to arkoala-arkts/libarkts/src/arkts-api/index.ts index f7237d2d9..e6cdcc914 100644 --- a/arkoala-arkts/libarkts/src/api/layers/ts/index.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/index.ts @@ -14,4 +14,8 @@ */ export * from "./types" -export * from "./utilities" +// TODO: remove private export +export * from "./utilities/private" +export * from "./utilities/public" +export * from "./static/enums" +export * from "./factory/nodeFactory" diff --git a/arkoala-arkts/libarkts/src/api/static/enums.ts b/arkoala-arkts/libarkts/src/arkts-api/static/enums.ts similarity index 65% rename from arkoala-arkts/libarkts/src/api/static/enums.ts rename to arkoala-arkts/libarkts/src/arkts-api/static/enums.ts index a43d1f347..9fd82dcb0 100644 --- a/arkoala-arkts/libarkts/src/api/static/enums.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/static/enums.ts @@ -13,11 +13,44 @@ * limitations under the License. */ -export { SyntaxKind } from "@koalaui/ets-tsc" - -export { TokenSyntaxKind } from "@koalaui/ets-tsc" +export enum Es2pandaModifierFlags { + MODIFIER_FLAGS_NONE = 0, + MODIFIER_FLAGS_STATIC = 1 << 0, + MODIFIER_FLAGS_ASYNC = 1 << 1, + MODIFIER_FLAGS_PUBLIC = 1 << 2, + MODIFIER_FLAGS_PROTECTED = 1 << 3, + MODIFIER_FLAGS_PRIVATE = 1 << 4, + MODIFIER_FLAGS_DECLARE = 1 << 5, + MODIFIER_FLAGS_READONLY = 1 << 6, + MODIFIER_FLAGS_OPTIONAL = 1 << 7, + MODIFIER_FLAGS_DEFINITE = 1 << 8, + MODIFIER_FLAGS_ABSTRACT = 1 << 9, + MODIFIER_FLAGS_CONST = 1 << 10, + MODIFIER_FLAGS_FINAL = 1 << 11, + MODIFIER_FLAGS_NATIVE = 1 << 12, + MODIFIER_FLAGS_OVERRIDE = 1 << 13, + MODIFIER_FLAGS_CONSTRUCTOR = 1 << 14, + MODIFIER_FLAGS_SYNCHRONIZED = 1 << 15, + MODIFIER_FLAGS_FUNCTIONAL = 1 << 16, + MODIFIER_FLAGS_IN = 1 << 17, + MODIFIER_FLAGS_OUT = 1 << 18, + MODIFIER_FLAGS_INTERNAL = 1 << 19, + MODIFIER_FLAGS_EXPORT = 1 << 20, + MODIFIER_FLAGS_GETTER = 1 << 21, + MODIFIER_FLAGS_SETTER = 1 << 22, + MODIFIER_FLAGS_DEFAULT_EXPORT = 1 << 23, + MODIFIER_FLAGS_EXPORT_TYPE = 1 << 24, + MODIFIER_FLAGS_SUPER_OWNER = 1 << 25, + MODIFIER_FLAGS_ACCESS = MODIFIER_FLAGS_PUBLIC | MODIFIER_FLAGS_PROTECTED | MODIFIER_FLAGS_PRIVATE | MODIFIER_FLAGS_INTERNAL, + MODIFIER_FLAGS_ALL = MODIFIER_FLAGS_STATIC | MODIFIER_FLAGS_ASYNC | MODIFIER_FLAGS_ACCESS | MODIFIER_FLAGS_DECLARE | MODIFIER_FLAGS_READONLY | MODIFIER_FLAGS_ABSTRACT, + MODIFIER_FLAGS_ALLOWED_IN_CTOR_PARAMETER = MODIFIER_FLAGS_ACCESS | MODIFIER_FLAGS_READONLY, + MODIFIER_FLAGS_INTERNAL_PROTECTED = MODIFIER_FLAGS_INTERNAL | MODIFIER_FLAGS_PROTECTED, + MODIFIER_FLAGS_ACCESSOR_MODIFIERS = MODIFIER_FLAGS_ABSTRACT | MODIFIER_FLAGS_FINAL, + MODIFIER_FLAGS_GETTER_SETTER = MODIFIER_FLAGS_GETTER | MODIFIER_FLAGS_SETTER, + MODIFIER_FLAGS_EXPORTED = MODIFIER_FLAGS_EXPORT | MODIFIER_FLAGS_DEFAULT_EXPORT | MODIFIER_FLAGS_EXPORT_TYPE, +}; -export enum ContextState { +export enum Es2pandaContextState { ES2PANDA_STATE_NEW = 0, ES2PANDA_STATE_PARSED = 1, ES2PANDA_STATE_SCOPE_INITED = 2, @@ -29,41 +62,172 @@ export enum ContextState { ES2PANDA_STATE_ERROR = 7, }; -export enum es2pandaKind { - UnsupportedNode = 0, - - Identifier = 1, - StringLiteral = 2, - Block = 3, - MethodDefinition = 4, - ClassDeclaration = 5, - FunctionDeclaration = 6, - ClassProperty = 7, - TSTypeParameterDeclaration = 8, - ETSFunctionType = 9, - CallExpression = 10, - ExpressionStatement = 11, - MemberExpression = 12, - ArrowFunctionExpression = 13, - ReturnStatement = 14, - ETSParameterExpression = 15, - NumberLiteral = 16, - VariableDeclaration = 17, - ClassStaticBlock = 18, - Program = 19, - BinaryExpression = 20, - FunctionExpression = 21, - ScriptFunction = 22, - VariableDeclarator = 23, - TSTypeParameter = 24, - ETSPrimitiveType = 25, - AssignmentExpression = 26, - ETSTypeReference = 27, - TSUnionType = 28, - ETSUnionType = 29, - ClassDefinition = 30, - ETSTypeReferencePart = 31, - IfStatement = 32, +export enum Es2pandaAstNodeType { + AST_NODE_TYPE_ARROW_FUNCTION_EXPRESSION, + AST_NODE_TYPE_ANNOTATION_DECLARATION, + AST_NODE_TYPE_ANNOTATION_USAGE, + AST_NODE_TYPE_ASSERT_STATEMENT, + AST_NODE_TYPE_AWAIT_EXPRESSION, + AST_NODE_TYPE_BIGINT_LITERAL, + AST_NODE_TYPE_BINARY_EXPRESSION, + AST_NODE_TYPE_BLOCK_STATEMENT, + AST_NODE_TYPE_BOOLEAN_LITERAL, + AST_NODE_TYPE_BREAK_STATEMENT, + AST_NODE_TYPE_CALL_EXPRESSION, + AST_NODE_TYPE_CATCH_CLAUSE, + AST_NODE_TYPE_CHAIN_EXPRESSION, + AST_NODE_TYPE_CHAR_LITERAL, + AST_NODE_TYPE_CLASS_DEFINITION, + AST_NODE_TYPE_CLASS_DECLARATION, + AST_NODE_TYPE_CLASS_EXPRESSION, + AST_NODE_TYPE_CLASS_PROPERTY, + AST_NODE_TYPE_CLASS_STATIC_BLOCK, + AST_NODE_TYPE_CONDITIONAL_EXPRESSION, + AST_NODE_TYPE_CONTINUE_STATEMENT, + AST_NODE_TYPE_DEBUGGER_STATEMENT, + AST_NODE_TYPE_DECORATOR, + AST_NODE_TYPE_DIRECT_EVAL, + AST_NODE_TYPE_DO_WHILE_STATEMENT, + AST_NODE_TYPE_EMPTY_STATEMENT, + AST_NODE_TYPE_EXPORT_ALL_DECLARATION, + AST_NODE_TYPE_EXPORT_DEFAULT_DECLARATION, + AST_NODE_TYPE_EXPORT_NAMED_DECLARATION, + AST_NODE_TYPE_EXPORT_SPECIFIER, + AST_NODE_TYPE_EXPRESSION_STATEMENT, + AST_NODE_TYPE_FOR_IN_STATEMENT, + AST_NODE_TYPE_FOR_OF_STATEMENT, + AST_NODE_TYPE_FOR_UPDATE_STATEMENT, + AST_NODE_TYPE_FUNCTION_DECLARATION, + AST_NODE_TYPE_FUNCTION_EXPRESSION, + AST_NODE_TYPE_IDENTIFIER, + AST_NODE_TYPE_DUMMYNODE, + AST_NODE_TYPE_IF_STATEMENT, + AST_NODE_TYPE_IMPORT_DECLARATION, + AST_NODE_TYPE_IMPORT_EXPRESSION, + AST_NODE_TYPE_IMPORT_DEFAULT_SPECIFIER, + AST_NODE_TYPE_IMPORT_NAMESPACE_SPECIFIER, + AST_NODE_TYPE_IMPORT_SPECIFIER, + AST_NODE_TYPE_LABELLED_STATEMENT, + AST_NODE_TYPE_MEMBER_EXPRESSION, + AST_NODE_TYPE_META_PROPERTY_EXPRESSION, + AST_NODE_TYPE_METHOD_DEFINITION, + AST_NODE_TYPE_NAMED_TYPE, + AST_NODE_TYPE_NAMESPACE_DECLARATION, + AST_NODE_TYPE_NAMESPACE_DEFINITION, + AST_NODE_TYPE_NEW_EXPRESSION, + AST_NODE_TYPE_NULL_LITERAL, + AST_NODE_TYPE_UNDEFINED_LITERAL, + AST_NODE_TYPE_NUMBER_LITERAL, + AST_NODE_TYPE_OMITTED_EXPRESSION, + AST_NODE_TYPE_PREFIX_ASSERTION_EXPRESSION, + AST_NODE_TYPE_PROPERTY, + AST_NODE_TYPE_REGEXP_LITERAL, + AST_NODE_TYPE_REEXPORT_STATEMENT, + AST_NODE_TYPE_RETURN_STATEMENT, + AST_NODE_TYPE_SCRIPT_FUNCTION, + AST_NODE_TYPE_SEQUENCE_EXPRESSION, + AST_NODE_TYPE_STRING_LITERAL, + AST_NODE_TYPE_ETS_NULL_TYPE, + AST_NODE_TYPE_ETS_UNDEFINED_TYPE, + AST_NODE_TYPE_ETS_NEVER_TYPE, + AST_NODE_TYPE_ETS_STRING_LITERAL_TYPE, + AST_NODE_TYPE_ETS_FUNCTION_TYPE, + AST_NODE_TYPE_ETS_WILDCARD_TYPE, + AST_NODE_TYPE_ETS_PRIMITIVE_TYPE, + AST_NODE_TYPE_ETS_PACKAGE_DECLARATION, + AST_NODE_TYPE_ETS_CLASS_LITERAL, + AST_NODE_TYPE_ETS_TYPE_REFERENCE, + AST_NODE_TYPE_ETS_TYPE_REFERENCE_PART, + AST_NODE_TYPE_ETS_UNION_TYPE, + AST_NODE_TYPE_ETS_LAUNCH_EXPRESSION, + AST_NODE_TYPE_ETS_NEW_ARRAY_INSTANCE_EXPRESSION, + AST_NODE_TYPE_ETS_NEW_MULTI_DIM_ARRAY_INSTANCE_EXPRESSION, + AST_NODE_TYPE_ETS_NEW_CLASS_INSTANCE_EXPRESSION, + AST_NODE_TYPE_ETS_IMPORT_DECLARATION, + AST_NODE_TYPE_ETS_PARAMETER_EXPRESSION, + AST_NODE_TYPE_ETS_TUPLE, + AST_NODE_TYPE_ETS_SCRIPT, + AST_NODE_TYPE_SUPER_EXPRESSION, + AST_NODE_TYPE_STRUCT_DECLARATION, + AST_NODE_TYPE_SWITCH_CASE_STATEMENT, + AST_NODE_TYPE_SWITCH_STATEMENT, + AST_NODE_TYPE_TS_ENUM_DECLARATION, + AST_NODE_TYPE_TS_ENUM_MEMBER, + AST_NODE_TYPE_TS_EXTERNAL_MODULE_REFERENCE, + AST_NODE_TYPE_TS_NUMBER_KEYWORD, + AST_NODE_TYPE_TS_ANY_KEYWORD, + AST_NODE_TYPE_TS_STRING_KEYWORD, + AST_NODE_TYPE_TS_BOOLEAN_KEYWORD, + AST_NODE_TYPE_TS_VOID_KEYWORD, + AST_NODE_TYPE_TS_UNDEFINED_KEYWORD, + AST_NODE_TYPE_TS_UNKNOWN_KEYWORD, + AST_NODE_TYPE_TS_OBJECT_KEYWORD, + AST_NODE_TYPE_TS_BIGINT_KEYWORD, + AST_NODE_TYPE_TS_NEVER_KEYWORD, + AST_NODE_TYPE_TS_NON_NULL_EXPRESSION, + AST_NODE_TYPE_TS_NULL_KEYWORD, + AST_NODE_TYPE_TS_ARRAY_TYPE, + AST_NODE_TYPE_TS_UNION_TYPE, + AST_NODE_TYPE_TS_TYPE_LITERAL, + AST_NODE_TYPE_TS_PROPERTY_SIGNATURE, + AST_NODE_TYPE_TS_METHOD_SIGNATURE, + AST_NODE_TYPE_TS_SIGNATURE_DECLARATION, + AST_NODE_TYPE_TS_PARENT_TYPE, + AST_NODE_TYPE_TS_LITERAL_TYPE, + AST_NODE_TYPE_TS_INFER_TYPE, + AST_NODE_TYPE_TS_CONDITIONAL_TYPE, + AST_NODE_TYPE_TS_IMPORT_TYPE, + AST_NODE_TYPE_TS_INTERSECTION_TYPE, + AST_NODE_TYPE_TS_MAPPED_TYPE, + AST_NODE_TYPE_TS_MODULE_BLOCK, + AST_NODE_TYPE_TS_THIS_TYPE, + AST_NODE_TYPE_TS_TYPE_OPERATOR, + AST_NODE_TYPE_TS_TYPE_PARAMETER, + AST_NODE_TYPE_TS_TYPE_PARAMETER_DECLARATION, + AST_NODE_TYPE_TS_TYPE_PARAMETER_INSTANTIATION, + AST_NODE_TYPE_TS_TYPE_PREDICATE, + AST_NODE_TYPE_TS_PARAMETER_PROPERTY, + AST_NODE_TYPE_TS_MODULE_DECLARATION, + AST_NODE_TYPE_TS_IMPORT_EQUALS_DECLARATION, + AST_NODE_TYPE_TS_FUNCTION_TYPE, + AST_NODE_TYPE_TS_CONSTRUCTOR_TYPE, + AST_NODE_TYPE_TS_TYPE_ALIAS_DECLARATION, + AST_NODE_TYPE_TS_TYPE_REFERENCE, + AST_NODE_TYPE_TS_QUALIFIED_NAME, + AST_NODE_TYPE_TS_INDEXED_ACCESS_TYPE, + AST_NODE_TYPE_TS_INTERFACE_DECLARATION, + AST_NODE_TYPE_TS_INTERFACE_BODY, + AST_NODE_TYPE_TS_INTERFACE_HERITAGE, + AST_NODE_TYPE_TS_TUPLE_TYPE, + AST_NODE_TYPE_TS_NAMED_TUPLE_MEMBER, + AST_NODE_TYPE_TS_INDEX_SIGNATURE, + AST_NODE_TYPE_TS_TYPE_QUERY, + AST_NODE_TYPE_TS_AS_EXPRESSION, + AST_NODE_TYPE_TS_CLASS_IMPLEMENTS, + AST_NODE_TYPE_TS_TYPE_ASSERTION, + AST_NODE_TYPE_TAGGED_TEMPLATE_EXPRESSION, + AST_NODE_TYPE_TEMPLATE_ELEMENT, + AST_NODE_TYPE_TEMPLATE_LITERAL, + AST_NODE_TYPE_THIS_EXPRESSION, + AST_NODE_TYPE_TYPEOF_EXPRESSION, + AST_NODE_TYPE_THROW_STATEMENT, + AST_NODE_TYPE_TRY_STATEMENT, + AST_NODE_TYPE_UNARY_EXPRESSION, + AST_NODE_TYPE_UPDATE_EXPRESSION, + AST_NODE_TYPE_VARIABLE_DECLARATION, + AST_NODE_TYPE_VARIABLE_DECLARATOR, + AST_NODE_TYPE_WHILE_STATEMENT, + AST_NODE_TYPE_YIELD_EXPRESSION, + AST_NODE_TYPE_OPAQUE_TYPE_NODE, + AST_NODE_TYPE_BLOCK_EXPRESSION, + AST_NODE_TYPE_ARRAY_EXPRESSION, + AST_NODE_TYPE_ARRAY_PATTERN, + AST_NODE_TYPE_ASSIGNMENT_EXPRESSION, + AST_NODE_TYPE_ASSIGNMENT_PATTERN, + AST_NODE_TYPE_OBJECT_EXPRESSION, + AST_NODE_TYPE_OBJECT_PATTERN, + AST_NODE_TYPE_SPREAD_ELEMENT, + AST_NODE_TYPE_REST_ELEMENT, }; export enum Es2pandaTokenType { @@ -265,52 +429,15 @@ export enum Es2pandaMethodDefinitionKind { }; export enum Es2pandaPrimitiveType { - PRIMITIVE_TYPE_BYTE = 1, - PRIMITIVE_TYPE_INT = 2, - PRIMITIVE_TYPE_LONG = 3, - PRIMITIVE_TYPE_SHORT = 4, - PRIMITIVE_TYPE_FLOAT = 5, - PRIMITIVE_TYPE_DOUBLE = 6, - PRIMITIVE_TYPE_BOOLEAN = 7, - PRIMITIVE_TYPE_CHAR = 8, - PRIMITIVE_TYPE_VOID = 9, -}; - -export enum Es2pandaModifierFlags { - MODIFIER_FLAGS_NONE = 0, - MODIFIER_FLAGS_STATIC = 1 << 0, - MODIFIER_FLAGS_ASYNC = 1 << 1, - MODIFIER_FLAGS_PUBLIC = 1 << 2, - MODIFIER_FLAGS_PROTECTED = 1 << 3, - MODIFIER_FLAGS_PRIVATE = 1 << 4, - MODIFIER_FLAGS_DECLARE = 1 << 5, - MODIFIER_FLAGS_READONLY = 1 << 6, - MODIFIER_FLAGS_OPTIONAL = 1 << 7, - MODIFIER_FLAGS_DEFINITE = 1 << 8, - MODIFIER_FLAGS_ABSTRACT = 1 << 9, - MODIFIER_FLAGS_CONST = 1 << 10, - MODIFIER_FLAGS_FINAL = 1 << 11, - MODIFIER_FLAGS_NATIVE = 1 << 12, - MODIFIER_FLAGS_OVERRIDE = 1 << 13, - MODIFIER_FLAGS_CONSTRUCTOR = 1 << 14, - MODIFIER_FLAGS_SYNCHRONIZED = 1 << 15, - MODIFIER_FLAGS_FUNCTIONAL = 1 << 16, - MODIFIER_FLAGS_IN = 1 << 17, - MODIFIER_FLAGS_OUT = 1 << 18, - MODIFIER_FLAGS_INTERNAL = 1 << 19, - MODIFIER_FLAGS_EXPORT = 1 << 20, - MODIFIER_FLAGS_GETTER = 1 << 21, - MODIFIER_FLAGS_SETTER = 1 << 22, - MODIFIER_FLAGS_DEFAULT_EXPORT = 1 << 23, - MODIFIER_FLAGS_EXPORT_TYPE = 1 << 24, - MODIFIER_FLAGS_SUPER_OWNER = 1 << 25, - MODIFIER_FLAGS_ACCESS = MODIFIER_FLAGS_PUBLIC | MODIFIER_FLAGS_PROTECTED | MODIFIER_FLAGS_PRIVATE | MODIFIER_FLAGS_INTERNAL, - MODIFIER_FLAGS_ALL = MODIFIER_FLAGS_STATIC | MODIFIER_FLAGS_ASYNC | MODIFIER_FLAGS_ACCESS | MODIFIER_FLAGS_DECLARE | MODIFIER_FLAGS_READONLY | MODIFIER_FLAGS_ABSTRACT, - MODIFIER_FLAGS_ALLOWED_IN_CTOR_PARAMETER = MODIFIER_FLAGS_ACCESS | MODIFIER_FLAGS_READONLY, - MODIFIER_FLAGS_INTERNAL_PROTECTED = MODIFIER_FLAGS_INTERNAL | MODIFIER_FLAGS_PROTECTED, - MODIFIER_FLAGS_ACCESSOR_MODIFIERS = MODIFIER_FLAGS_ABSTRACT | MODIFIER_FLAGS_FINAL, - MODIFIER_FLAGS_GETTER_SETTER = MODIFIER_FLAGS_GETTER | MODIFIER_FLAGS_SETTER, - MODIFIER_FLAGS_EXPORTED = MODIFIER_FLAGS_EXPORT | MODIFIER_FLAGS_DEFAULT_EXPORT | MODIFIER_FLAGS_EXPORT_TYPE, + PRIMITIVE_TYPE_BYTE = 0, + PRIMITIVE_TYPE_INT = 1, + PRIMITIVE_TYPE_LONG = 2, + PRIMITIVE_TYPE_SHORT = 3, + PRIMITIVE_TYPE_FLOAT = 4, + PRIMITIVE_TYPE_DOUBLE = 5, + PRIMITIVE_TYPE_BOOLEAN = 6, + PRIMITIVE_TYPE_CHAR = 7, + PRIMITIVE_TYPE_VOID = 8, }; export enum Es2pandaScriptFunctionFlags { @@ -365,7 +492,7 @@ export enum Es2pandaClassDefinitionModifiers { CLASS_DEFINITION_MODIFIERS_DECLARATION_ID_REQUIRED = CLASS_DEFINITION_MODIFIERS_DECLARATION | CLASS_DEFINITION_MODIFIERS_ID_REQUIRED, }; -export const enum TokenFlags { +export const enum Es2pandaTokenFlags { None = 0, /** @internal */ PrecedingLineBreak = 1 << 0, @@ -416,9 +543,29 @@ export const enum Es2pandaVariableDeclarationKind { VAR } -export const enum VariableDeclaratorFlag { +export const enum Es2pandaVariableDeclaratorFlag { LET, CONST, VAR, UNKNOWN, } + +export const enum Es2pandaImportKinds { + VALUE, + TYPE +} + +export const enum Es2pandaIdentifierFlags { + NONE = 0, + OPTIONAL = 1 << 0, + REFERENCE = 1 << 1, + TDZ = 1 << 2, +} + +export const enum Es2pandaScriptExtension { + SCRIPT_EXTENSION_JS, + SCRIPT_EXTENSION_TS, + SCRIPT_EXTENSION_AS, + SCRIPT_EXTENSION_ETS, + SCRIPT_EXTENSION_INVALID, +} diff --git a/arkoala-arkts/libarkts/src/arkts-api/static/global.ts b/arkoala-arkts/libarkts/src/arkts-api/static/global.ts new file mode 100644 index 000000000..18f16585d --- /dev/null +++ b/arkoala-arkts/libarkts/src/arkts-api/static/global.ts @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2022-2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { throwError } from "../../utils" +import { KNativePointer } from "@koalaui/interop" + +export default class global { + private static _config?: KNativePointer + public static set config(config: KNativePointer) { + if (global._config !== undefined) { + throwError('Global.config already initialized') + } + global._config = config + } + public static get config(): KNativePointer { + return global._config ?? throwError('Global.config not initialized') + } + + public static isInitializedConfig(): boolean { + return global._config !== undefined + } + + private static _context?: KNativePointer + public static set context(context: KNativePointer) { + global._context = context + } + public static get context(): KNativePointer { + return global._context ?? throwError('Global.context not initialized') + } + + public static isInitializedContext(): boolean { + return global._context !== undefined + } +} diff --git a/arkoala-arkts/libarkts/src/api/layers/arkts/types.ts b/arkoala-arkts/libarkts/src/arkts-api/types.ts similarity index 41% rename from arkoala-arkts/libarkts/src/api/layers/arkts/types.ts rename to arkoala-arkts/libarkts/src/arkts-api/types.ts index 630cbb379..cc9fcff2d 100644 --- a/arkoala-arkts/libarkts/src/api/layers/arkts/types.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/types.ts @@ -13,175 +13,172 @@ * limitations under the License. */ -import global from "../../static/global" +import global from "./static/global" +import { throwError } from "../utils" -import { nativeModule } from "../../../NativeModule" +import { nativeModule } from "../nativeModule" import { KInt, KNativePointer as KPtr } from "@koalaui/interop" import { Es2pandaPrimitiveType, Es2pandaModifierFlags, Es2pandaScriptFunctionFlags, - es2pandaKind, - ContextState, + Es2pandaAstNodeType, + Es2pandaContextState, Es2pandaTokenType, Es2pandaMethodDefinitionKind, -} from "../../static/enums" + Es2pandaVariableDeclarationKind, + Es2pandaVariableDeclaratorFlag, + Es2pandaImportKinds, + Es2pandaMemberExpressionKind, + Es2pandaIdentifierFlags, +} from "./static/enums" import { unpackNonNullableNode, unpackNode, passNode, - unpackNodeArray, passNodeArray, - - unpackObject, - passString, unpackString, - passStringArray, -} from "./utilities" + updatePeerByNode, + resolveSource, +} from "./utilities/private" import { proceedToState, -} from "../../utilities/utilitiesPublic" +} from "./utilities/public" export const NULLPTR: KPtr = BigInt(0) export const NULLPTR_ARRAY = new BigUint64Array([NULLPTR]) -export const ALL_FLAGS: KInt = Object.values(Es2pandaModifierFlags).filter( - (value: any) => { return (typeof value) === 'number' } - ).reduce( - (prev: KInt, next: KInt): KInt => (prev | next), - 0 as KInt - ) +export const ALL_FLAGS: KInt = + Object.values(Es2pandaModifierFlags).filter( + (value: any) => { return (typeof value) === 'number' } + ).reduce( + (prev: KInt, next: KInt): KInt => (prev | next), + 0 as KInt + ) -function assertValidPeer(peer: KPtr, expectedKind: es2pandaKind): void { +function assertValidPeer(peer: KPtr, expectedKind: Es2pandaAstNodeType): void { if (peer === NULLPTR) { - global.throwError(`invalid peer: NULLPTR`) + throwError(`invalid peer: NULLPTR`) } - const peerKind = nativeModule._GetKind(global.context, peer) - if (peerKind !== expectedKind) { - global.throwError(`invalid kind of peer: ${peerKind} expected: ${expectedKind}`) + const peerType = nativeModule._AstNodeTypeConst(global.context, peer) + if (peerType !== expectedKind) { + throwError(`actual type of peer: ${peerType} expected: ${expectedKind}`) } } export abstract class ArktsObject { - constructor(peer: KPtr) { + protected constructor(peer: KPtr) { this.peer = peer } - // pointer associated with native object readonly peer: KPtr } export abstract class Node extends ArktsObject { - constructor(peer: KPtr) { + protected constructor(peer: KPtr) { if (peer === NULLPTR) { throw new Error('trying to create new Node on NULLPTR') } super(peer) - this.kind = nativeModule._GetKind(global.context, this.peer) + this.type = nativeModule._AstNodeTypeConst(global.context, this.peer) this.updateChildren() } - readonly kind: es2pandaKind + readonly type: Es2pandaAstNodeType - // TODO: update scopes and other data - updateNode(original: this): this { - if (typeof this !== typeof original) { - throw new Error('updateNode called on different type') - } - nativeModule._AstNodeSetOriginalNode(global.context, this.peer, original.peer) - nativeModule._AstNodeSetParent(global.context, this.peer, nativeModule._AstNodeParent(global.context, original.peer)) - nativeModule._AstNodeUpdateChildren(global.context, this.peer) - this.modifiers = original.modifiers - // new flags may change children - this.updateChildren() - // switch (classByPeer(peer)) { - // case arkts.ClassDeclaration: { - // // TODO: update Language - // break - // } - // } - - // TODO: rewrite - return this + public get originalPeer(): KPtr { + return nativeModule._AstNodeOriginalNodeConst(global.context, this.peer) + } + + public set originalPeer(peer: KPtr) { + nativeModule._AstNodeSetOriginalNode(global.context, this.peer, peer) } - updateChildren(): void { + public getChildren(): readonly Node[] { + return unpackNodeArray(nativeModule._AstNodeChildren(global.context, this.peer)) + } + + public getSubtree(): readonly Node[] { + return this.getChildren().reduce( + (prev: readonly Node[], curr: Node): readonly Node[] => { + return prev.concat(curr.getSubtree()) + }, + [this] + ) + } + + public updateChildren(): void { if (this.peer === NULLPTR) { - global.throwError('updateChildren called on NULLPTR') + throwError('updateChildren called on NULLPTR') } nativeModule._AstNodeUpdateChildren(global.context, this.peer) } - updateModifiers(modifierFlags: KInt | undefined): this { + public updateModifiers(modifierFlags: KInt | undefined): this { nativeModule._AstNodeClearModifier(global.context, this.peer, ALL_FLAGS) nativeModule._AstNodeAddModifier(global.context, this.peer, modifierFlags ?? Es2pandaModifierFlags.MODIFIER_FLAGS_NONE) return this } - dumpJson(): string { + public dump(indentation: number = 0): string { + const children = this.getChildren().map( + (child: Node): string => child.dump(indentation + 1) + ) + const msg: string = + `${indentation}_` + + Es2pandaAstNodeType[this.type] + + ` ` + + this.dumpMessage() + return "> " + " ".repeat(4 * indentation) + msg + "\n" + children.join("") + } + + protected dumpMessage(): string { + return `` + } + + public dumpJson(): string { return unpackString(nativeModule._AstNodeDumpJsonConst(global.context, this.peer)) } - dumpSrc(): string { + public dumpSrc(): string { return unpackString(nativeModule._AstNodeDumpEtsSrcConst(global.context, this.peer)) } - dumpModifiers(): string { + public dumpModifiers(): string { return unpackString(nativeModule._AstNodeDumpModifiers(global.context, this.peer)) } - get parent(): Node { + public get parent(): Node { const _parent = nativeModule._AstNodeParent(global.context, this.peer) if (_parent === NULLPTR) { - global.throwError('BAD ACCESS: PARENT IS NULLPTR') + throwError('BAD ACCESS: PARENT IS NULLPTR') } return unpackNonNullableNode(_parent) } - set parent(node: Node) { + public set parent(node: Node) { nativeModule._AstNodeSetParent(global.context, this.peer, node.peer) } - get modifiers(): KInt { + public get modifiers(): KInt { return nativeModule._AstNodeModifiers(global.context, this.peer) } - set modifiers(flags: KInt | undefined) { + public set modifiers(flags: KInt | undefined) { nativeModule._AstNodeClearModifier(global.context, this.peer, ALL_FLAGS) nativeModule._AstNodeAddModifier(global.context, this.peer, flags ?? Es2pandaModifierFlags.MODIFIER_FLAGS_NONE) } } -// export abstract class Node extends EtsNode { -// constructor(peer: KPtr) { -// super(peer) -// this.kind = nativeModule._GetKind(global.context, this.peer) -// updateChildren(this.peer) -// } - -// readonly kind: es2pandaKind -// } - -// export abstract class CompatibleNode extends EtsNode { -// constructor(peer: KPtr, related: arkts.Node) { -// super(peer) -// this.kind = nativeModule._GetKind(global.context, this.peer) -// updateChildren(this.peer) -// this.related = related -// } - -// readonly kind: es2pandaKind -// readonly related: arkts.Node -// } - -export abstract class UnsupportedNode extends Node { +export class UnsupportedNode extends Node { constructor(peer: KPtr) { super(peer) - throw new Error('trying to create UnsupportedNode') + console.log(`WARNING: UNSUPPORTED NODE (arkts): ${Es2pandaAstNodeType[this.type]}`) + // throwError(`UNSUPPORTED NODE (arkts): ${es2panda_Kind[this.kind]}`) } } @@ -197,24 +194,35 @@ export class Context extends ArktsObject { } } -export class Program extends Node { +export class EtsScript extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.Program) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_ETS_SCRIPT) + if (!nativeModule._IsProgram(global.context, peer)) { + throwError('peer expected to be Program') + } super(peer) } + // TODO: rewrite this maybe static create( - source: string - ): Program { + source: string, + state: Es2pandaContextState = Es2pandaContextState.ES2PANDA_STATE_PARSED, + ): EtsScript { if (!global.isInitializedConfig()) { global.config = nativeModule._CreateConfig(4, passStringArray(["", "--arktsconfig", "./arktsconfig.json", "./input/main.sts"])) } global.context = nativeModule._CreateContextFromString(global.config, passString(source), passString("./input/main.sts")) + proceedToState(state) + return new EtsScript(nativeModule._ProgramAst(nativeModule._ContextProgram(global.context))) + } - // TODO: rewrite this maybe - proceedToState(ContextState.ES2PANDA_STATE_PARSED) - - return new Program(nativeModule._ProgramAst(nativeModule._ContextProgram(global.context))) + // TODO: should create new node + static update( + node: EtsScript, + statements: Node[], + ): EtsScript { + nativeModule._BlockStatementSetStatements(global.context, node.peer, passNodeArray(statements), statements.length) + return node } get statements(): readonly Node[] { @@ -228,13 +236,20 @@ export class Program extends Node { export class ExpressionStatement extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.ExpressionStatement) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_EXPRESSION_STATEMENT) super(peer) this.expression = unpackNonNullableNode(nativeModule._ExpressionStatementGetExpression(global.context, this.peer)) } - static create(expression: Node): ExpressionStatement { - return new ExpressionStatement(nativeModule._CreateExpressionStatement(global.context, expression.peer)) + static create( + expression: Node, + ): ExpressionStatement { + return new ExpressionStatement( + nativeModule._CreateExpressionStatement( + global.context, + expression.peer + ) + ) } readonly expression: Node @@ -242,7 +257,7 @@ export class ExpressionStatement extends Node { export class CallExpression extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.CallExpression) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_CALL_EXPRESSION) super(peer) this.expression = unpackNonNullableNode(nativeModule._CallExpressionCallee(global.context, this.peer)) this.arguments = unpackNodeArray(nativeModule._CallExpressionArguments(global.context, this.peer, NULLPTR)) @@ -272,21 +287,25 @@ export class CallExpression extends Node { export class AssignmentExpression extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.AssignmentExpression) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_ASSIGNMENT_EXPRESSION) super(peer) } static create( + node: undefined | AssignmentExpression, left: Node, assignmentOperator: Es2pandaTokenType, right: Node ): AssignmentExpression { return new AssignmentExpression( - nativeModule._CreateAssignmentExpression( - global.context, - passNode(left), - passNode(right), - assignmentOperator + updatePeerByNode( + nativeModule._CreateAssignmentExpression( + global.context, + passNode(left), + passNode(right), + assignmentOperator + ), + node ) ) } @@ -294,16 +313,17 @@ export class AssignmentExpression extends Node { export class MemberExpression extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.MemberExpression) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_MEMBER_EXPRESSION) super(peer) this.object = unpackNonNullableNode(nativeModule._MemberExpressionObject(global.context, this.peer)) this.property = unpackNonNullableNode(nativeModule._MemberExpressionProperty(global.context, this.peer)) + this.kind = nativeModule._MemberExpressionKindConst(global.context, this.peer) } static create( object: Node, property: Node, - kind: KInt, + kind: Es2pandaMemberExpressionKind, computed: boolean, optional: boolean ): MemberExpression { @@ -319,27 +339,36 @@ export class MemberExpression extends Node { ) } + protected override dumpMessage(): string { + return ` ` + } + readonly object: Node readonly property: Node + readonly kind: Es2pandaMemberExpressionKind } export class BinaryExpression extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.BinaryExpression) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_BINARY_EXPRESSION) super(peer) } static create( + node: undefined | BinaryExpression, left: Node, operatorType: Es2pandaTokenType, right: Node ): BinaryExpression { return new BinaryExpression( - nativeModule._CreateBinaryExpression( - global.context, - passNode(left), - passNode(right), - operatorType + updatePeerByNode( + nativeModule._CreateBinaryExpression( + global.context, + passNode(left), + passNode(right), + operatorType + ), + node ) ) } @@ -347,34 +376,50 @@ export class BinaryExpression extends Node { export class ETSPrimitiveType extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.ETSPrimitiveType) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_ETS_PRIMITIVE_TYPE) super(peer) + this.primitiveType = nativeModule._ETSPrimitiveTypeGetPrimitiveTypeConst(global.context, this.peer) } static create( - type: Es2pandaPrimitiveType + node: undefined | ETSPrimitiveType, + type: Es2pandaPrimitiveType, ): ETSPrimitiveType { return new ETSPrimitiveType( - nativeModule._CreateETSPrimitiveType(global.context, type) + updatePeerByNode( + nativeModule._CreateETSPrimitiveType( + global.context, + type + ), + node + ) ) } - // readonly type: Es2pandaPrimitiveType + protected override dumpMessage(): string { + return ` ` + } + + readonly primitiveType: Es2pandaPrimitiveType } export class ETSTypeReference extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.ETSTypeReference) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_ETS_TYPE_REFERENCE) super(peer) } static create( - typeName: Identifier + node: undefined | ETSTypeReference, + typeName: Identifier, ): ETSTypeReference { return new ETSTypeReference( - nativeModule._CreateETSTypeReference( - global.context, - ETSTypeReferencePart.create(typeName).peer + updatePeerByNode( + nativeModule._CreateETSTypeReference( + global.context, + ETSTypeReferencePart.create(undefined, typeName).peer + ), + node ) ) } @@ -385,20 +430,26 @@ export class ETSTypeReference extends Node { export class ETSTypeReferencePart extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.ETSTypeReferencePart) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_ETS_TYPE_REFERENCE_PART) super(peer) } // TODO: support type params and prev - static create(typeName: Identifier) { - typeName.setReference(true) + static create( + node: undefined | ETSTypeReferencePart, + typeName: Identifier, + ) { + // typeName.setReference(true) // TODO: support type params and prev return new ETSTypeReferencePart( - nativeModule._CreateETSTypeReferencePart( - global.context, - typeName.peer, - NULLPTR, - NULLPTR + updatePeerByNode( + nativeModule._CreateETSTypeReferencePart( + global.context, + typeName.peer, + NULLPTR, + NULLPTR + ), + node ) ) } @@ -408,19 +459,23 @@ export class ETSTypeReferencePart extends Node { export class TSUnionType extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.TSUnionType) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_TS_UNION_TYPE) super(peer) this.types = unpackNodeArray(nativeModule._TSUnionTypeTypesConst(global.context, this.peer, NULLPTR)) } static create( - types: Node[] + node: undefined | TSUnionType, + types: Node[], ): TSUnionType { return new TSUnionType( - nativeModule._CreateTSUnionType( - global.context, - passNodeArray(types), - types.length + updatePeerByNode( + nativeModule._CreateTSUnionType( + global.context, + passNodeArray(types), + types.length + ), + node ) ) } @@ -430,19 +485,23 @@ export class TSUnionType extends Node { export class ETSUnionType extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.ETSUnionType) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_ETS_UNION_TYPE) super(peer) this.types = unpackNodeArray(nativeModule._ETSUnionTypeIrTypesConst(global.context, this.peer, NULLPTR)) } static create( - types: Node[] + node: undefined | ETSUnionType, + types: Node[], ): ETSUnionType { return new ETSUnionType( - nativeModule._CreateETSUnionTypeIr( - global.context, - passNodeArray(types), - types.length + updatePeerByNode( + nativeModule._CreateETSUnionTypeIr( + global.context, + passNodeArray(types), + types.length + ), + node ) ) } @@ -450,21 +509,25 @@ export class ETSUnionType extends Node { readonly types: readonly Node[] } -export class FunctionTypeNode extends Node { +export class ETSFunctionType extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.ETSFunctionType) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_ETS_FUNCTION_TYPE) super(peer) } static create( + node: undefined | ETSFunctionType, signature: FunctionSignature, scriptFunctionFlags: Es2pandaScriptFunctionFlags - ): FunctionTypeNode { - return new FunctionTypeNode( - nativeModule._CreateETSFunctionTypeIr( - global.context, - signature.peer, - scriptFunctionFlags + ): ETSFunctionType { + return new ETSFunctionType( + updatePeerByNode( + nativeModule._CreateETSFunctionTypeIr( + global.context, + signature.peer, + scriptFunctionFlags + ), + node ) ) } @@ -472,20 +535,29 @@ export class FunctionTypeNode extends Node { export class Identifier extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.Identifier) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_IDENTIFIER) super(peer) - this.isPrivate = nativeModule._IdentifierIsPrivateIdentConst(global.context, this.peer) } - static create(name: string, typeAnnotation?: Node): Identifier { + static create( + name: string, + typeAnnotation?: Node + ): Identifier { if (typeAnnotation === undefined) { - return new Identifier(nativeModule._CreateIdentifier1(global.context, passString(name))) + return new Identifier( + nativeModule._CreateIdentifier1(global.context, passString(name)) + ) } else { - return new Identifier(nativeModule._CreateIdentifier2(global.context, passString(name), typeAnnotation.peer)) + return new Identifier( + nativeModule._CreateIdentifier2(global.context, passString(name), typeAnnotation.peer) + ) } } - // TODO: return (string | undefined) maybe + protected override dumpMessage(): string { + return ` ` + } + get name(): string { return unpackString(nativeModule._IdentifierName(global.context, this.peer)) } @@ -494,28 +566,36 @@ export class Identifier extends Node { nativeModule._IdentifierSetName(global.context, this.peer, passString(name)) } - readonly isPrivate: boolean - - setReference(isRef: boolean): void { - nativeModule._IdentifierSetReference(global.context, this.peer, isRef) + get isPrivate(): boolean { + return nativeModule._IdentifierIsPrivateIdentConst(global.context, this.peer) } - // TODO: - // typeAnnotation() - // isOptional() - // setOptional() - // setTsVariables() + get identifierFlags(): Es2pandaIdentifierFlags { + return nativeModule._IdentifierIdentifierFlags(global.context, this.peer) + } } export class StringLiteral extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.StringLiteral) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_STRING_LITERAL) super(peer) this.str = unpackString(nativeModule._StringLiteralStrConst(global.context, this.peer)) } - static create(str: string): StringLiteral { - return new StringLiteral(nativeModule._CreateStringLiteral(global.context, passString(str))) + static create( + node: undefined | StringLiteral, + str: string, + ): StringLiteral { + return new StringLiteral( + updatePeerByNode( + nativeModule._CreateStringLiteral(global.context, passString(str)), + node + ) + ) + } + + protected override dumpMessage(): string { + return ` ` } readonly str: string @@ -523,13 +603,25 @@ export class StringLiteral extends Node { export class NumberLiteral extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.NumberLiteral) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_NUMBER_LITERAL) super(peer) this.str = unpackString(nativeModule._NumberLiteralStrConst(global.context, this.peer)) } - static create(str: string): NumberLiteral { - return new NumberLiteral(nativeModule._CreateNumberLiteral(global.context, passString(str))) + static create( + node: undefined | NumberLiteral, + str: string, + ): NumberLiteral { + return new NumberLiteral( + updatePeerByNode( + nativeModule._CreateNumberLiteral(global.context, passString(str)), + node + ) + ) + } + + protected override dumpMessage(): string { + return ` ` } readonly str: string @@ -538,9 +630,13 @@ export class NumberLiteral extends Node { export class FunctionSignature extends ArktsObject { constructor(peer: KPtr) { super(peer) - this.typeParamsDecl = unpackNode(nativeModule._FunctionSignatureTypeParams(global.context, this.peer)) - this.parameters = unpackNodeArray(nativeModule._FunctionSignatureParamsConst(global.context, this.peer, NULLPTR)) - this.returnTypeAnnotation = unpackNode(nativeModule._FunctionSignatureReturnType(global.context, this.peer)) + // TODO: + // there is some weird behavior with FunctionSignature, so properties unavailable now + // in class constructor (typeParamsDecl maybe NULLPTR in ScriptFunction, but not NULLPTR in its signature) + + // this.typeParamsDecl = unpackNode(nativeModule._FunctionSignatureTypeParams(global.context, this.peer)) + // this.parameters = unpackNodeArray(nativeModule._FunctionSignatureParamsConst(global.context, this.peer, NULLPTR)) + // this.returnTypeAnnotation = unpackNode(nativeModule._FunctionSignatureReturnType(global.context, this.peer)) } static create( @@ -559,23 +655,27 @@ export class FunctionSignature extends ArktsObject { ) } - readonly typeParamsDecl?: TSTypeParameterDeclaration - readonly parameters: readonly Node[] - readonly returnTypeAnnotation?: Node + // readonly typeParamsDecl?: TSTypeParameterDeclaration + // readonly parameters: readonly Node[] + // readonly returnTypeAnnotation?: Node } export class ScriptFunction extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.ScriptFunction) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_SCRIPT_FUNCTION) super(peer) this.parameters = unpackNodeArray(nativeModule._ScriptFunctionParams(global.context, this.peer)) + this.typeParamsDecl = unpackNode(nativeModule._ScriptFunctionTypeParams(global.context, this.peer)) this.body = unpackNode(nativeModule._ScriptFunctionBody(global.context, this.peer)) - this.signature = unpackObject(FunctionSignature, nativeModule._ScriptFunctionSignature(global.context, this.peer)) + // this.signature = unpackNonNullableObject(FunctionSignature, nativeModule._ScriptFunctionSignature(global.context, this.peer)) this.declare = nativeModule._ScriptFunctionDeclareConst(global.context, this.peer) this.ident = unpackNode(nativeModule._ScriptFunctionId(global.context, this.peer)) + + this.scriptFunctionFlags = this._correctScriptFunctionFlags() } static create( + node: undefined | ScriptFunction, body: Node | undefined, signature: FunctionSignature, functionFlags: Es2pandaScriptFunctionFlags, @@ -583,13 +683,16 @@ export class ScriptFunction extends Node { declare: boolean, ident: Identifier | undefined ): ScriptFunction { - const peer = nativeModule._CreateScriptFunction( - global.context, - passNode(body), - signature.peer, - functionFlags, - modifierFlags, - declare + const peer = updatePeerByNode( + nativeModule._CreateScriptFunction( + global.context, + passNode(body), + signature.peer, + functionFlags, + modifierFlags, + declare + ), + node ) if (ident !== undefined) { nativeModule._ScriptFunctionSetIdent(global.context, peer, ident.peer) @@ -597,27 +700,69 @@ export class ScriptFunction extends Node { return new ScriptFunction(peer) } + protected override dumpMessage(): string { + const scriptFunctionFlags = nativeModule._ScriptFunctionFlagsConst(global.context, this.peer) + return ` ` + } + + private _correctScriptFunctionFlags(): KInt { + let flags: KInt = nativeModule._ScriptFunctionFlagsConst(global.context, this.peer) + if (this._hasReturn()) { + flags |= Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_HAS_RETURN + nativeModule._ScriptFunctionAddFlag(global.context, this.peer, Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_HAS_RETURN) + } + if (this._isAsync()) { + flags |= Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_ASYNC + nativeModule._ScriptFunctionAddFlag(global.context, this.peer, Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_ASYNC) + } + return flags + } + + private _hasReturn(): boolean { + if (this.body === undefined) { + return false + } + let hasReturn: boolean = false + // TODO: goes through whole subtree, optimizable (unnecessary now) + this.body.getSubtree().forEach( + (node: Node) => { + hasReturn = hasReturn || (node.type === Es2pandaAstNodeType.AST_NODE_TYPE_RETURN_STATEMENT) + } + ) + return hasReturn + } + + private _isAsync(): boolean { + return (this.modifiers & Es2pandaModifierFlags.MODIFIER_FLAGS_ASYNC) !== 0 + } + readonly parameters: readonly ETSParameterExpression[] - readonly body?: Node - readonly signature?: FunctionSignature + readonly typeParamsDecl?: TSTypeParameterDeclaration + readonly body?: BlockStatement + // readonly signature: FunctionSignature + readonly scriptFunctionFlags: KInt readonly declare: boolean readonly ident?: Identifier } export class ArrowFunctionExpression extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.ArrowFunctionExpression) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_ARROW_FUNCTION_EXPRESSION) super(peer) this.scriptFunction = unpackNonNullableNode(nativeModule._ArrowFunctionExpressionFunction(global.context, this.peer)) } static create( - func: ScriptFunction + node: undefined | ArrowFunctionExpression, + func: ScriptFunction, ): ArrowFunctionExpression { return new ArrowFunctionExpression( - nativeModule._CreateArrowFunctionExpression( - global.context, - passNode(func) + updatePeerByNode( + nativeModule._CreateArrowFunctionExpression( + global.context, + passNode(func) + ), + node ) ) } @@ -627,56 +772,67 @@ export class ArrowFunctionExpression extends Node { export class FunctionDeclaration extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.FunctionDeclaration) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_FUNCTION_DECLARATION) super(peer) this.scriptFunction = unpackNonNullableNode(nativeModule._FunctionDeclarationFunction(global.context, this.peer)) this.parameters = unpackNodeArray(nativeModule._ScriptFunctionParams(global.context, this.scriptFunction.peer)) this.name = unpackNode(nativeModule._ScriptFunctionId(global.context, this.scriptFunction.peer)) this.body = unpackNode(nativeModule._ScriptFunctionBody(global.context, this.scriptFunction.peer)) this.typeParamsDecl = unpackNode(nativeModule._ScriptFunctionTypeParams(global.context, this.scriptFunction.peer)) - this.type = unpackNode(nativeModule._ScriptFunctionReturnTypeAnnotation(global.context, this.scriptFunction.peer)) + this.returnType = unpackNode(nativeModule._ScriptFunctionReturnTypeAnnotation(global.context, this.scriptFunction.peer)) this.isAnon = nativeModule._FunctionDeclarationIsAnonymousConst(global.context, this.peer) } static create( + node: undefined | FunctionDeclaration, scriptFunction: ScriptFunction, isAnon: boolean ): FunctionDeclaration { - const node = new FunctionDeclaration( - nativeModule._CreateFunctionDeclaration( - global.context, - scriptFunction.peer, - isAnon + const res = new FunctionDeclaration( + updatePeerByNode( + nativeModule._CreateFunctionDeclaration( + global.context, + scriptFunction.peer, + // TODO: support annotations + NULLPTR_ARRAY, + 0, + isAnon + ), + node ) ) // TODO: maybe wrong - node.modifiers = scriptFunction.modifiers - return node + res.modifiers = scriptFunction.modifiers + return res } readonly scriptFunction: ScriptFunction readonly parameters: readonly Node[] readonly name?: Identifier - readonly body?: Block + readonly body?: BlockStatement readonly typeParamsDecl?: TSTypeParameterDeclaration - readonly type?: Node + readonly returnType?: Node readonly isAnon: boolean } export class FunctionExpression extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.FunctionExpression) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_FUNCTION_EXPRESSION) super(peer) this.scriptFunction = unpackNonNullableNode(nativeModule._FunctionExpressionFunction(global.context, this.peer)) } static create( - expression: ScriptFunction + node: undefined | FunctionExpression, + expression: ScriptFunction, ): FunctionExpression { return new FunctionExpression( - nativeModule._CreateFunctionExpression( - global.context, - passNode(expression) + updatePeerByNode( + nativeModule._CreateFunctionExpression( + global.context, + passNode(expression) + ), + node ) ) } @@ -684,21 +840,25 @@ export class FunctionExpression extends Node { readonly scriptFunction: ScriptFunction } -export class Block extends Node { +export class BlockStatement extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.Block) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_BLOCK_STATEMENT) super(peer) this.statements = unpackNodeArray(nativeModule._BlockStatementStatements(global.context, this.peer)) } static create( - statements: Node[] - ): Block { - return new Block( - nativeModule._CreateBlockStatement( - global.context, - passNodeArray(statements), - statements.length + node: undefined | BlockStatement, + statements: Node[], + ): BlockStatement { + return new BlockStatement( + updatePeerByNode( + nativeModule._CreateBlockStatement( + global.context, + passNodeArray(statements), + statements.length + ), + node ) ) } @@ -708,19 +868,23 @@ export class Block extends Node { export class ETSParameterExpression extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.ETSParameterExpression) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_ETS_PARAMETER_EXPRESSION) super(peer) } static create( + node: undefined | ETSParameterExpression, identifier: Identifier, initializer: Node | undefined ): ETSParameterExpression { return new ETSParameterExpression( - nativeModule._CreateETSParameterExpression( - global.context, - passNode(identifier), - passNode(initializer) + updatePeerByNode( + nativeModule._CreateETSParameterExpression( + global.context, + passNode(identifier), + passNode(initializer) + ), + node ) ) } @@ -728,22 +892,26 @@ export class ETSParameterExpression extends Node { export class TSTypeParameterDeclaration extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.TSTypeParameterDeclaration) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_TS_TYPE_PARAMETER_DECLARATION) super(peer) this.parameters = unpackNodeArray(nativeModule._TSTypeParameterDeclarationParamsConst(global.context, this.peer, NULLPTR)) } // TODO: think about valid type of parameters static create( + node: undefined | TSTypeParameterDeclaration, parameters: Node[], ): TSTypeParameterDeclaration { return new TSTypeParameterDeclaration( - nativeModule._CreateTSTypeParameterDeclaration( - global.context, - passNodeArray(parameters), - parameters.length, - // TODO: fix - parameters.length + updatePeerByNode( + nativeModule._CreateTSTypeParameterDeclaration( + global.context, + passNodeArray(parameters), + parameters.length, + // TODO: fix + parameters.length + ), + node ) ) } @@ -753,12 +921,13 @@ export class TSTypeParameterDeclaration extends Node { export class TSTypeParameter extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.TSTypeParameter) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_TS_TYPE_PARAMETER) super(peer) this.name = unpackNonNullableNode(nativeModule._TSTypeParameterName(global.context, this.peer)) } static create( + node: undefined | TSTypeParameter, name: Identifier, constraint: Node | undefined, defaultType: Node | undefined, @@ -772,7 +941,9 @@ export class TSTypeParameter extends Node { ) nativeModule._AstNodeClearModifier(global.context, peer, ALL_FLAGS) nativeModule._AstNodeAddModifier(global.context, peer, modifierFlags) - return new TSTypeParameter(peer) + return new TSTypeParameter( + updatePeerByNode(peer, node) + ) } readonly name: Identifier @@ -780,7 +951,7 @@ export class TSTypeParameter extends Node { export class ReturnStatement extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.ReturnStatement) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_RETURN_STATEMENT) super(peer) this.argument = unpackNode( nativeModule._ReturnStatementArgument(global.context, this.peer) @@ -788,12 +959,16 @@ export class ReturnStatement extends Node { } static create( - argument: Node + node: undefined | ReturnStatement, + argument: Node, ): ReturnStatement { return new ReturnStatement( - nativeModule._CreateReturnStatement1( - global.context, - passNode(argument) + updatePeerByNode( + nativeModule._CreateReturnStatement1( + global.context, + passNode(argument) + ), + node ) ) } @@ -803,21 +978,25 @@ export class ReturnStatement extends Node { export class IfStatement extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.IfStatement) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_IF_STATEMENT) super(peer) } static create( + node: undefined | IfStatement, test: Node, consequent: Node, alternate?: Node ): IfStatement { return new IfStatement( - nativeModule._CreateIfStatement( - global.context, - passNode(test), - passNode(consequent), - passNode(alternate) + updatePeerByNode( + nativeModule._CreateIfStatement( + global.context, + passNode(test), + passNode(consequent), + passNode(alternate) + ), + node ) ) } @@ -825,18 +1004,22 @@ export class IfStatement extends Node { export class ClassDeclaration extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.ClassDeclaration) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_CLASS_DECLARATION) super(peer) this.definition = unpackNonNullableNode(nativeModule._ClassDeclarationDefinition(global.context, this.peer)) } static create( - definition: ClassDefinition + node: undefined | ClassDeclaration, + definition: ClassDefinition, ): ClassDeclaration { return new ClassDeclaration( - nativeModule._CreateClassDeclaration( - global.context, - passNode(definition) + updatePeerByNode( + nativeModule._CreateClassDeclaration( + global.context, + passNode(definition) + ), + node ) ) } @@ -846,7 +1029,7 @@ export class ClassDeclaration extends Node { export class ClassDefinition extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.ClassDefinition) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_CLASS_DEFINITION) super(peer) this.name = unpackNonNullableNode(nativeModule._ClassDefinitionIdent(global.context, this.peer)) this.members = unpackNodeArray(nativeModule._ClassDefinitionBody(global.context, this.peer)) @@ -854,23 +1037,26 @@ export class ClassDefinition extends Node { } static create( + node: undefined | ClassDefinition, name: Identifier | undefined, members: Node[], modifiers: KInt, classFlags: KInt, - lang: undefined + typeParamsDecl: TSTypeParameterDeclaration | undefined, + superClass?: Node, ): ClassDefinition { + const peer = nativeModule._CreateClassDefinition1( + global.context, + passNode(name), + passNodeArray(members), + members.length, + classFlags, + modifiers + ) + nativeModule._ClassDefinitionSetTypeParams(global.context, peer, passNode(typeParamsDecl)) + nativeModule._ClassDefinitionSetSuper(global.context, peer, passNode(superClass)) return new ClassDefinition( - nativeModule._CreateClassDefinition1( - global.context, - passNode(name), - passNodeArray(members), - members.length, - classFlags, - modifiers, - // TODO: fix lang - NULLPTR - ) + updatePeerByNode(peer, node) ) } @@ -879,15 +1065,35 @@ export class ClassDefinition extends Node { readonly typeParamsDecl?: TSTypeParameterDeclaration } +export class ClassStaticBlock extends Node { + constructor(peer: KPtr) { + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_CLASS_STATIC_BLOCK) + super(peer) + } + + // TODO: + // static create( + // value: Node + // ): ClassStaticBlock { + // return new ClassStaticBlock( + // nativeModule._CreateClassStaticBlock( + // global.context, + // passNode(value) + // ) + // ) + // } +} + export class MethodDefinition extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.MethodDefinition) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_METHOD_DEFINITION) super(peer) this.scriptFunction = unpackNonNullableNode(nativeModule._MethodDefinitionFunction(global.context, this.peer)) this.name = unpackNonNullableNode(nativeModule._ScriptFunctionId(global.context, this.scriptFunction.peer)) } static create( + node: undefined | MethodDefinition, kind: Es2pandaMethodDefinitionKind, key: Node, value: Node, @@ -895,13 +1101,16 @@ export class MethodDefinition extends Node { isComputed: boolean ): MethodDefinition { return new MethodDefinition( - nativeModule._CreateMethodDefinition( - global.context, - kind, - passNode(key), - passNode(value), - modifiers, - isComputed + updatePeerByNode( + nativeModule._CreateMethodDefinition( + global.context, + kind, + passNode(key), + passNode(value), + modifiers, + isComputed + ), + node ) ) } @@ -912,11 +1121,12 @@ export class MethodDefinition extends Node { export class ClassProperty extends Node { constructor(peer: KPtr) { - assertValidPeer(peer, es2pandaKind.ClassProperty) + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_CLASS_PROPERTY) super(peer) } static create( + node: undefined | ClassProperty, key: Node, value: Node, typeAnnotation: Node, @@ -924,14 +1134,197 @@ export class ClassProperty extends Node { isComputed: boolean ): ClassProperty { return new ClassProperty( - nativeModule._CreateClassProperty( + updatePeerByNode( + nativeModule._CreateClassProperty( + global.context, + passNode(key), + passNode(value), + passNode(typeAnnotation), + modifiers, + isComputed + ), + node + ) + ) + } +} + +export class VariableDeclaration extends Node { + constructor(peer: KPtr) { + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_VARIABLE_DECLARATION) + super(peer) + this.declarationKind = nativeModule._VariableDeclarationKindConst(global.context, this.peer) + this.declarators = unpackNodeArray(nativeModule._VariableDeclarationDeclaratorsConst(global.context, this.peer)) + } + + static create( + node: undefined | VariableDeclaration, + modifiers: KInt, + kind: Es2pandaVariableDeclarationKind, + declarators: readonly VariableDeclarator[], + declare: boolean, + ): VariableDeclaration { + const peer = updatePeerByNode( + nativeModule._CreateVariableDeclaration( + global.context, + kind, + passNodeArray(declarators), + declarators.length, + declare + ), + node + ) + nativeModule._AstNodeClearModifier(global.context, peer, ALL_FLAGS) + nativeModule._AstNodeAddModifier(global.context, peer, modifiers) + return new VariableDeclaration(peer) + } + + readonly declarationKind: Es2pandaVariableDeclarationKind + readonly declarators: readonly VariableDeclarator[] +} + +export class VariableDeclarator extends Node { + constructor(peer: KPtr) { + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_VARIABLE_DECLARATOR) + super(peer) + this.name = unpackNonNullableNode(nativeModule._VariableDeclaratorId(global.context, this.peer)) + } + + static create( + node: undefined | VariableDeclarator, + flag: Es2pandaVariableDeclaratorFlag, + name: Identifier, + initializer: Node | undefined + ): VariableDeclarator { + const peer = updatePeerByNode( + nativeModule._CreateVariableDeclarator( global.context, - passNode(key), - passNode(value), - passNode(typeAnnotation), - modifiers, - isComputed + flag, + passNode(name) + ), + node + ) + if (initializer !== undefined) { + nativeModule._VariableDeclaratorSetInit(global.context, peer, initializer.peer) + } + return new VariableDeclarator(peer) + } + + readonly name: Identifier +} + +export class ETSUndefinedType extends Node { + constructor(peer: KPtr) { + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_ETS_UNDEFINED_TYPE) + super(peer) + } +} + +export class SuperExpression extends Node { + constructor(peer: KPtr) { + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_SUPER_EXPRESSION) + super(peer) + } + + static create( + node: undefined | SuperExpression, + ): SuperExpression { + return new SuperExpression( + updatePeerByNode( + nativeModule._CreateSuperExpression( + global.context, + ), + node + ) + ) + } +} + +export class ImportSource extends ArktsObject { + constructor(peer: KPtr) { + super(peer) + } + + static create( + source: StringLiteral, + hasDecl: boolean, + ): ImportSource { + return new ImportSource( + nativeModule._CreateImportSource( + global.context, + source.peer, + resolveSource(source).peer, + hasDecl ) ) } } + +export class EtsImportDeclaration extends Node { + constructor(peer: KPtr) { + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_ETS_IMPORT_DECLARATION) + super(peer) + this.importSource = unpackNonNullableNode(nativeModule._ETSImportDeclarationSourceConst(global.context, this.peer)) + this.resolvedSource = unpackNonNullableNode(nativeModule._ETSImportDeclarationResolvedSource(global.context, this.peer)) + this.hasDecl = nativeModule._ETSImportDeclarationHasDeclConst(global.context, this.peer) + } + + static create( + node: undefined | EtsImportDeclaration, + source: StringLiteral, + specifiers: readonly ImportSpecifier[], + importKind: Es2pandaImportKinds, + hasDecl: boolean, + ): EtsImportDeclaration { + return new EtsImportDeclaration( + updatePeerByNode( + nativeModule._CreateETSImportDeclaration( + global.context, + ImportSource.create( + source, + hasDecl, + ).peer, + passNodeArray(specifiers), + specifiers.length, + importKind + ), + node + ) + ) + } + + readonly importSource: StringLiteral + readonly resolvedSource: StringLiteral + readonly hasDecl: boolean +} + +export class ImportSpecifier extends Node { + constructor(peer: KPtr) { + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_IMPORT_SPECIFIER) + super(peer) + } + + static create( + node: undefined | ImportSpecifier, + imported: Identifier, + local: Identifier, + ): ImportSpecifier { + return new ImportSpecifier( + updatePeerByNode( + nativeModule._CreateImportSpecifier( + global.context, + passNode(imported), + passNode(local), + ), + node + ) + ) + } +} + +export class UndefinedLiteral extends Node { + constructor(peer: KPtr) { + assertValidPeer(peer, Es2pandaAstNodeType.AST_NODE_TYPE_UNDEFINED_LITERAL) + super(peer) + } +} diff --git a/arkoala-arkts/libarkts/src/node/Platform.ts b/arkoala-arkts/libarkts/src/arkts-api/utilities/nativePtrDecoder.ts similarity index 95% rename from arkoala-arkts/libarkts/src/node/Platform.ts rename to arkoala-arkts/libarkts/src/arkts-api/utilities/nativePtrDecoder.ts index 5cef4ade1..e03bccc31 100644 --- a/arkoala-arkts/libarkts/src/node/Platform.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/utilities/nativePtrDecoder.ts @@ -15,7 +15,7 @@ import { int32 } from "@koalaui/common" import { Access, NativeStringBase, nullptr, pointer as NativePtr, withByteArray, providePlatformDefinedData, ArrayDecoder, CallbackRegistry, Wrapper, pointer } from "@koalaui/interop" -import { nativeModule } from "../NativeModule" +import { nativeModule } from "../../nativeModule" class NativeString extends NativeStringBase { constructor(ptr: NativePtr) { diff --git a/arkoala-arkts/libarkts/src/arkts-api/utilities/private.ts b/arkoala-arkts/libarkts/src/arkts-api/utilities/private.ts new file mode 100644 index 000000000..e851fa595 --- /dev/null +++ b/arkoala-arkts/libarkts/src/arkts-api/utilities/private.ts @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2022-2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as arkts from ".." +import * as fs from "fs" +import global from "../static/global" +import { throwError } from "../../utils" + +import { KNativePointer, withString, withStringResult, withStringArray, KInt } from "@koalaui/interop" +import { nativeModule } from "../../nativeModule" +import { NativePtrDecoder } from "./nativePtrDecoder" +import { + Es2pandaAstNodeType, + Es2pandaScriptFunctionFlags, +} from "../static/enums" + +export function classByPeer(peer: KNativePointer): { new (peer: KNativePointer): arkts.Node } { + const types = new Map([ + [Es2pandaAstNodeType.AST_NODE_TYPE_ETS_SCRIPT, arkts.EtsScript], + [Es2pandaAstNodeType.AST_NODE_TYPE_IDENTIFIER, arkts.Identifier], + [Es2pandaAstNodeType.AST_NODE_TYPE_STRING_LITERAL, arkts.StringLiteral], + [Es2pandaAstNodeType.AST_NODE_TYPE_NUMBER_LITERAL, arkts.NumberLiteral], + [Es2pandaAstNodeType.AST_NODE_TYPE_EXPRESSION_STATEMENT, arkts.ExpressionStatement], + [Es2pandaAstNodeType.AST_NODE_TYPE_FUNCTION_DECLARATION, arkts.FunctionDeclaration], + [Es2pandaAstNodeType.AST_NODE_TYPE_SCRIPT_FUNCTION, arkts.ScriptFunction], + [Es2pandaAstNodeType.AST_NODE_TYPE_BLOCK_STATEMENT, arkts.BlockStatement], + [Es2pandaAstNodeType.AST_NODE_TYPE_RETURN_STATEMENT, arkts.ReturnStatement], + [Es2pandaAstNodeType.AST_NODE_TYPE_ETS_PARAMETER_EXPRESSION, arkts.ETSParameterExpression], + [Es2pandaAstNodeType.AST_NODE_TYPE_ETS_TYPE_REFERENCE, arkts.ETSTypeReference], + [Es2pandaAstNodeType.AST_NODE_TYPE_ETS_TYPE_REFERENCE_PART, arkts.ETSTypeReferencePart], + [Es2pandaAstNodeType.AST_NODE_TYPE_TS_TYPE_PARAMETER_DECLARATION, arkts.TSTypeParameterDeclaration], + [Es2pandaAstNodeType.AST_NODE_TYPE_ETS_PRIMITIVE_TYPE, arkts.ETSPrimitiveType], + [Es2pandaAstNodeType.AST_NODE_TYPE_CALL_EXPRESSION, arkts.CallExpression], + [Es2pandaAstNodeType.AST_NODE_TYPE_MEMBER_EXPRESSION, arkts.MemberExpression], + [Es2pandaAstNodeType.AST_NODE_TYPE_TS_TYPE_PARAMETER, arkts.TSTypeParameter], + [Es2pandaAstNodeType.AST_NODE_TYPE_IF_STATEMENT, arkts.IfStatement], + [Es2pandaAstNodeType.AST_NODE_TYPE_BINARY_EXPRESSION, arkts.BinaryExpression], + [Es2pandaAstNodeType.AST_NODE_TYPE_ETS_UNION_TYPE, arkts.ETSUnionType], + [Es2pandaAstNodeType.AST_NODE_TYPE_ARROW_FUNCTION_EXPRESSION, arkts.ArrowFunctionExpression], + [Es2pandaAstNodeType.AST_NODE_TYPE_CLASS_DECLARATION, arkts.ClassDeclaration], + [Es2pandaAstNodeType.AST_NODE_TYPE_CLASS_DEFINITION, arkts.ClassDefinition], + [Es2pandaAstNodeType.AST_NODE_TYPE_METHOD_DEFINITION, arkts.MethodDefinition], + [Es2pandaAstNodeType.AST_NODE_TYPE_CLASS_PROPERTY, arkts.ClassProperty], + [Es2pandaAstNodeType.AST_NODE_TYPE_ASSIGNMENT_EXPRESSION, arkts.AssignmentExpression], + [Es2pandaAstNodeType.AST_NODE_TYPE_VARIABLE_DECLARATION, arkts.VariableDeclaration], + [Es2pandaAstNodeType.AST_NODE_TYPE_VARIABLE_DECLARATOR, arkts.VariableDeclarator], + [Es2pandaAstNodeType.AST_NODE_TYPE_FUNCTION_EXPRESSION, arkts.FunctionExpression], + [Es2pandaAstNodeType.AST_NODE_TYPE_ETS_FUNCTION_TYPE, arkts.ETSFunctionType], + [Es2pandaAstNodeType.AST_NODE_TYPE_CLASS_STATIC_BLOCK, arkts.ClassStaticBlock], + [Es2pandaAstNodeType.AST_NODE_TYPE_ETS_UNDEFINED_TYPE, arkts.ETSUndefinedType], + [Es2pandaAstNodeType.AST_NODE_TYPE_UNDEFINED_LITERAL, arkts.UndefinedLiteral], + [Es2pandaAstNodeType.AST_NODE_TYPE_SUPER_EXPRESSION, arkts.SuperExpression], + [Es2pandaAstNodeType.AST_NODE_TYPE_ETS_IMPORT_DECLARATION, arkts.EtsImportDeclaration], + [Es2pandaAstNodeType.AST_NODE_TYPE_IMPORT_SPECIFIER, arkts.ImportSpecifier], + ]) + + if (peer === arkts.NULLPTR) { + throwError('classByPeer: peer is NULLPTR') + } + const type = nativeModule._AstNodeTypeConst(global.context, peer) + return types.get(type) ?? arkts.UnsupportedNode +} + +export function unpackNonNullableNode(peer: KNativePointer): T { + if (peer === arkts.NULLPTR) { + throwError('peer is NULLPTR (maybe you should use unpackNode)') + } + return (new (classByPeer(peer))(peer)) as T +} + +export function unpackNode(peer: KNativePointer): T | undefined { + if (peer === arkts.NULLPTR) { + return undefined + } + return (new (classByPeer(peer))(peer)) as T +} + +export function passNode(node: arkts.Node | undefined): KNativePointer { + return node?.peer ?? arkts.NULLPTR +} + +// meaning unpackNonNullableNodeArray +export function unpackNodeArray(nodesPtr: KNativePointer): readonly T[] { + if (nodesPtr === arkts.NULLPTR) { + throwError('nodesPtr is NULLPTR (maybe you should use unpackNodeArray)') + } + return (new NativePtrDecoder).decode(nodesPtr).map((peer: KNativePointer) => unpackNonNullableNode(peer)) +} + +export function passNodeArray(nodes: readonly arkts.Node[] | undefined): BigUint64Array { + return new BigUint64Array( + nodes === undefined + ? [] + : nodes.map(node => BigInt(node.peer)) + ) +} + +export function unpackNonNullableObject(type: { new (peer: KNativePointer): T }, peer: KNativePointer): T { + if (peer === arkts.NULLPTR) { + throwError('peer is NULLPTR (maybe you should use unpackObject)') + } + return new type(peer) +} + +export function unpackObject(type: { new (peer: KNativePointer): T }, peer: KNativePointer): T | undefined { + if (peer === arkts.NULLPTR) { + return undefined + } + return new type(peer) +} + +export function unpackString(peer: KNativePointer): string { + return withStringResult(peer) ?? throwError(`failed to unpack (peer shouldn't be NULLPTR)`) +} + +export function passString(str: string | undefined): string { + if (str === undefined) { + return "" + } + return withString(str, (it: string) => it) +} + +export function passStringArray(strings: string[]): string[] { + return withStringArray(strings, (it: string[]) => it) +} + +export function passNodeWithNewModifiers(node: T, modifiers: KInt): T { + return (unpackNonNullableNode(node.peer) as T).updateModifiers(modifiers) +} + +export function scriptFunctionHasBody(peer: KNativePointer): boolean { + const flags = nativeModule._ScriptFunctionFlagsConst(global.context, peer) + return (flags & Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_EXTERNAL) === 0 + && (flags & Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_EXTERNAL_OVERLOAD) === 0 +} + +// TODO: remove this +// TODO: update scopes and other data +export function updatePeerByNode(peer: KNativePointer, original: T | undefined): KNativePointer { + if (peer === arkts.NULLPTR) { + throwError('updatePeerByNode called on NULLPTR') + } + if (original === undefined) { + return peer + } + nativeModule._AstNodeSetOriginalNode(global.context, peer, original.peer) + nativeModule._AstNodeSetParent(global.context, peer, nativeModule._AstNodeParent(global.context, original.peer)) + nativeModule._AstNodeUpdateChildren(global.context, peer) + nativeModule._AstNodeClearModifier(global.context, peer, arkts.ALL_FLAGS) + nativeModule._AstNodeAddModifier(global.context, peer, original.modifiers) + nativeModule._AstNodeUpdateChildren(global.context, peer) + return peer +} + +// TODO: update scopes and other data +export function updateNodeByNode(node: T, original: arkts.Node): T { + if (original.peer === arkts.NULLPTR) { + throwError('update called on NULLPTR') + } + nativeModule._AstNodeSetOriginalNode(global.context, node.peer, original.peer) + nativeModule._AstNodeSetParent(global.context, node.peer, nativeModule._AstNodeParent(global.context, original.peer)) + nativeModule._AstNodeUpdateChildren(global.context, node.peer) + nativeModule._AstNodeClearModifier(global.context, node.peer, arkts.ALL_FLAGS) + nativeModule._AstNodeAddModifier(global.context, node.peer, original.modifiers) + nativeModule._AstNodeUpdateChildren(global.context, node.peer) + return node +} + +export function resolveSource(source: arkts.StringLiteral): arkts.StringLiteral { + return arkts.StringLiteral.create( + undefined, + fs.readFileSync(`../../../input/${source.str}.sts`).toString() + ) +} diff --git a/arkoala-arkts/libarkts/src/api/utilities/utilitiesPublic.ts b/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts similarity index 42% rename from arkoala-arkts/libarkts/src/api/utilities/utilitiesPublic.ts rename to arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts index 745a8d9cc..4c670db6c 100644 --- a/arkoala-arkts/libarkts/src/api/utilities/utilitiesPublic.ts +++ b/arkoala-arkts/libarkts/src/arkts-api/utilities/public.ts @@ -14,12 +14,24 @@ */ import global from "../static/global" -import { nativeModule } from "../../NativeModule" +import { throwError } from "../../utils" +import * as arkts from "../../arkts-api" +import { nativeModule } from "../../nativeModule" import { KNativePointer, withString, withStringArray, withStringResult } from "@koalaui/interop" import { - ContextState, + Es2pandaContextState, } from "../static/enums" +export function getAstFromContext(): KNativePointer { + return nativeModule._ProgramAst(nativeModule._ContextProgram(global.context)) +} + +export function createAstDumper(peer: KNativePointer, source: string): KNativePointer { + return withString(source, (_source: string) => { + return nativeModule._CreateAstDumper(global.context, peer, _source) + }) +} + export function createConfig(input: string[]): KNativePointer { return withStringArray(input, (stringArray: string[]) => { return nativeModule._CreateConfig(input.length, stringArray) @@ -34,19 +46,22 @@ export function createContextFromString(config: KNativePointer, source: string, }) } -export function proceedToState(state: ContextState): void { +export function proceedToState(state: Es2pandaContextState): void { if (state <= nativeModule._ContextState(global.context)) { return } - nativeModule._ProceedToState(global.context, state) - if (nativeModule._ContextState(global.context) === ContextState.ES2PANDA_STATE_ERROR) { - // TODO: maybe shoudn't do it here - nativeModule._DestroyContext(global.context) - const errorMessage = withStringResult(nativeModule._ContextErrorMessage(global.context)) - if (errorMessage === undefined) { - global.throwError(`COULDN'T GET: _ContextErrorMessage`) + try { + nativeModule._ProceedToState(global.context, state) + if (nativeModule._ContextState(global.context) === Es2pandaContextState.ES2PANDA_STATE_ERROR) { + const errorMessage = withStringResult(nativeModule._ContextErrorMessage(global.context)) + if (errorMessage === undefined) { + throwError(`COULDN'T GET ContextErrorMessage`) + } + throwError("FAILED PROCEED TO: " + Es2pandaContextState[state] + "\n" + errorMessage) } - global.throwError("FAILED PROCEED TO: " + ContextState[state] + "\n" + errorMessage) + } catch (e) { + nativeModule._DestroyContext(global.context) + throw e } } @@ -54,27 +69,33 @@ export function startChecker(): boolean { return nativeModule._CheckerStartChecker(global.context) } -// export function getDecl(node: arkts.Node): arkts.Node | undefined { -// let decl = node.peer -// decl = nativeModule._AstNodeVariableConst(global.context, decl) -// if (decl === arkts.NULLPTR) { -// return undefined -// } -// decl = nativeModule._VariableDeclaration(global.context, decl) -// if (decl === arkts.NULLPTR) { -// return undefined -// } -// decl = nativeModule._DeclNode(global.context, decl) -// if (decl === arkts.NULLPTR) { -// return undefined -// } -// return nodeByPeer(decl) -// } +export function getDecl(node: arkts.Node): arkts.Node | undefined { + if (node === undefined) { + throwError('there is no arkts pair of ts node (unable to getDecl)') + } + let decl: KNativePointer = node.peer + decl = nativeModule._AstNodeVariableConst(global.context, decl) + if (decl === arkts.NULLPTR) { + return undefined + } + decl = nativeModule._VariableDeclaration(global.context, decl) + if (decl === arkts.NULLPTR) { + return undefined + } + decl = nativeModule._DeclNode(global.context, decl) + if (decl === arkts.NULLPTR) { + return undefined + } + return arkts.unpackNonNullableNode(decl) +} -// export function getOriginalNode(node: arkts.Node): arkts.Node { -// const peer = nativeModule._AstNodeOriginalNodeConst(global.context, node.peer) -// if (peer === arkts.NULLPTR) { -// return node -// } -// return nodeByPeer(peer) -// } +export function getOriginalNode(node: arkts.Node): arkts.Node { + if (node === undefined) { + // TODO: fix this + throwError('there is no arkts pair of ts node (unable to getOriginalNode)') + } + if (node.originalPeer === arkts.NULLPTR) { + return node + } + return arkts.unpackNonNullableNode(node.originalPeer) +} diff --git a/arkoala-arkts/libarkts/src/es2panda.ts b/arkoala-arkts/libarkts/src/es2panda.ts index 7c46fb7da..b5aac6a84 100644 --- a/arkoala-arkts/libarkts/src/es2panda.ts +++ b/arkoala-arkts/libarkts/src/es2panda.ts @@ -1,16 +1,18 @@ import { Command } from "commander" import * as fs from "fs" import * as path from "path" -import * as arkts from "./api" -import global from "./api/global" -import { - generateBin, - runAbc, -} from "../test/test-util" +import * as arkts from "./arkts-api" +import * as ts from "./ts-api" +import global from "./arkts-api/static/global" +import { webpackUnoptimizableImport } from "./utils" +// import { +// contextToAbc, +// runAbc, +// } from "../test/test-util" function parseCommandLineArgs() { const commander = new Command() - .option('--file, ', 'Path to file to be compiled', './input/main.ets') + .option('--file, ', 'Path to file to be compiled', './input/main.sts') .option('--arktsconfig, ', 'Path to arkts configuration file', './arktsconfig.json') .parse(process.argv) .opts() @@ -27,7 +29,7 @@ function parseCommandLineArgs() { return { filePath, configPath } } -function es2panda(configPath: string, filePath: string, transform: (ast: arkts.Node) => arkts.Node) { +function es2panda(configPath: string, filePath: string, transform: (ast: ts.Node) => ts.Node) { const source = fs.readFileSync(filePath).toString() global.config = arkts.createConfig([ '_', @@ -36,42 +38,40 @@ function es2panda(configPath: string, filePath: string, transform: (ast: arkts.N filePath ]) global.context = arkts.createContextFromString(global.config, source, filePath) - arkts.proceedToState(arkts.ContextState.ES2PANDA_STATE_PARSED) - const program = arkts.contextProgram() - const ast = arkts.programAst(program) + arkts.proceedToState(arkts.Es2pandaContextState.ES2PANDA_STATE_PARSED) + const ast = ts.unpackNode(arkts.unpackNode(arkts.getAstFromContext())) as ts.SourceFile transform(ast) // TODO: this should be called after executing all plugins - generateBin() - runAbc() + // contextToAbc() + // runAbc(`./generated/main.abc`) } -function plugins(configPath: string): Promise<((ast: arkts.Node) => arkts.Node)[]> { +function plugins(configPath: string): Promise<((ast: ts.Node) => ts.Node)[]> { const config = JSON.parse(fs.readFileSync(configPath).toString()) const plugins = config['compilerOptions']['plugins'] return Promise.all(plugins.map(async (jsonPlugin: any) => { - const pluginPath = jsonPlugin['transform'] + const pluginPath = path.resolve(jsonPlugin['transform']) // TODO: read and pass plugin options const options = {} - - function webpackUnoptimizableImport(path: string): { default: any } { - return require(/* webpackIgnore: true */ path) - } // TODO: fix this require - const module = require('../compatible/src/example-transformer.ts') + // const module = require(/* webpackIgnore: true */ '../compatible/src/example-transformer.ts') // const module = require(pluginPath) - // const module = webpackUnoptimizableImport(pluginPath) + const module = webpackUnoptimizableImport(pluginPath) return module.default()() })) } const { filePath, configPath } = parseCommandLineArgs() -plugins(configPath).then(plugins => { - es2panda(configPath, filePath, (ast: arkts.Node) => { - return plugins.reduce((ast, plugin) => plugin(ast), ast) - }) -}) +plugins(configPath).then(plugins => + es2panda(configPath, filePath, (ast: ts.Node) => + plugins.reduce( + (ast, plugin) => plugin(ast), + ast + ) + ) +) diff --git a/arkoala-arkts/libarkts/src/nativeModule.ts b/arkoala-arkts/libarkts/src/nativeModule.ts new file mode 100644 index 000000000..0ba0c3051 --- /dev/null +++ b/arkoala-arkts/libarkts/src/nativeModule.ts @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2022-2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { KNativePointer as KPtr, KInt, KBoolean, KNativePointer } from "@koalaui/interop" + +// TODO: this type should be in interop +export type KPtrArray = BigUint64Array + +export interface NativeModule { + _ContextState(context: KPtr): KInt + _ContextErrorMessage(context: KPtr): KPtr + _AstNodeChildren(context: KPtr, node: KPtr): KPtr + _ETSParserCreateExpression(context: KPtr, sourceCode: String, flags: KInt): KPtr + _AstNodeDumpModifiers(context: KPtr, node: KPtr): KPtr + _CreateAstDumper(context: KPtr, node: KPtr, source: String): KPtr + _AstDumperModifierToString(context: KPtr, dumper: KPtr, flags: KInt): KPtr + + _CreateConfig(argc: number, argv: string[]): KPtr + _DestroyConfig(config: KPtr): void + _CreateContextFromString(config: KPtr, source: String, filename: String): KPtr + _CreateContextFromFile(config: KPtr, filename: String): KPtr + _DestroyContext(context: KPtr): void + _ProceedToState(context: KPtr, state: number): void + _ContextProgram(context: KPtr): KPtr + _ProgramAst(program: KPtr): KPtr + _CheckerStartChecker(context: KPtr): KBoolean + _VarBinderIdentifierAnalysis(context: KPtr): void + _VarBinderInitTopScope(context: KPtr): void + _VarBinderSetGenStdLib(context: KPtr, genStdLibT: KBoolean): void + + _StringLength(ptr: KPtr): KInt + _StringData(ptr: KPtr, buffer: KPtr, length: KInt): void + _GetStringFinalizer(): KPtr + _InvokeFinalizer(ptr: KPtr, finalizer: KPtr): void + _GetPtrVectorSize(ptr: KPtr): KInt + _GetPtrVectorElement(ptr: KPtr, index: KInt): KPtr + + _SourceFileGetChildren(node: KPtr): KPtr + _BlockGetStatements(node: KPtr): KPtr + _FunctionDeclarationIsAnonymousConst(context: KPtr, node: KPtr): KBoolean + _ExpressionStatementGetExpression(context: KPtr, node: KPtr): KPtr + _CallExpressionArguments(context: KPtr, node: KPtr, returnLen: KPtr): KPtr + _CallExpressionCallee(context: KPtr, node: KPtr): KPtr + _IdentifierGetText(node: KPtr): KPtr + _IdentifierIsPrivateIdentConst(context: KPtr, node: KPtr): KBoolean + _PropertyAccessExpressionGetExpression(node: KPtr): KPtr + _PropertyAccessExpressionGetName(node: KPtr): KPtr + + _FunctionDeclarationFunction(context: KPtr, node: KPtr): KPtr + _ScriptFunctionSignature(context: KPtr, node: KPtr): KPtr + _ScriptFunctionParams(context: KPtr, node: KPtr): KPtr + _ScriptFunctionId(context: KPtr, node: KPtr): KPtr + _ScriptFunctionBody(context: KPtr, node: KPtr): KPtr + _ScriptFunctionSetIdent(context: KPtr, ast: KPtr, id: KPtr): KPtr + _ScriptFunctionIrSignature(context: KPtr, ast: KPtr): KPtr + _ScriptFunctionSetSignature(context: KPtr, ast: KPtr, signature: KPtr): KPtr + _ScriptFunctionSetBody(context: KPtr, ast: KPtr, body: KPtr): KPtr + _ScriptFunctionSetScope(context: KPtr, ast: KPtr, scope: KPtr): KPtr + _ScriptFunctionDeclareConst(context: KPtr, node: KPtr): KBoolean + _ScriptFunctionFlagsConst(context: KPtr, node: KPtr): KInt + _ScriptFunctionTypeParams(context: KPtr, node: KPtr): KPtr + _ScriptFunctionReturnTypeAnnotation(context: KPtr, node: KPtr): KPtr + _ScriptFunctionAddFlag(context: KPtr, node: KPtr, flags: KInt): void + _UpdateBlockStatement(context: KPtr, original: KPtr, statementList: KPtrArray, statementListLen: KInt): KPtr + _BlockStatementSetScope(context: KPtr, node: KPtr, scope: KPtrArray): void + _CreateIdentifier1(context: KPtr, name: String): KPtr + _CreateIdentifier2(context: KPtr, name: String, type_annotation: KPtr): KPtr + _IdentifierSetName(context: KPtr, node: KPtr, name: String): void + _IdentifierIdentifierFlags(context: KPtr, node: KPtr): KInt + _CreateFunctionDeclaration(context: KPtr, func: KPtr, annotations: KPtrArray, annotationsLen: KInt, isAnon: KBoolean): KPtr + _UpdateFunctionDeclaration(context: KPtr, node: KPtr, annotations: KPtrArray, annotationsLen: KInt, func: KPtr, isAnon: KBoolean): KPtr + _CreateReturnStatement1(context: KPtr, argument: KPtr): KPtr + _ReturnStatementArgument(context: KPtr, node: KPtr): KPtr + _CreateIfStatement(context: KPtr, test: KPtr, consequent: KPtr, alternate: KPtr): KPtr + _CreateBinaryExpression(context: KPtr, left: KPtr, right: KPtr, operatorType: KInt): KPtr + _CreateAssignmentExpression(context: KPtr, left: KPtr, right: KPtr, assignmentOperator: KInt): KPtr + _CreateMethodDefinition(context: KPtr, kind: KInt, key: KPtr, value: KPtr, modifiers: KInt, isComputed: KBoolean): KPtr + _CreateClassProperty(context: KPtr, key: KPtr, value: KPtr, typeAnnotation: KPtr, modifiers: KInt, isComputed: KBoolean): KPtr + _CreateETSImportDeclaration(context: KPtr, source: KPtr, specifiers: KPtrArray, specifiersLen: KInt, importKind: KInt): KNativePointer + _ETSImportDeclarationSourceConst(context: KPtr, node: KPtr): KPtr + _ETSImportDeclarationResolvedSource(context: KPtr, node: KPtr): KPtr + _ETSImportDeclarationHasDeclConst(context: KPtr, node: KPtr): KBoolean + _CreateImportSource(context: KPtr, source: KPtr, resolvedSource: KPtr, hasDecl: KBoolean): KNativePointer + _CreateImportSpecifier(context: KPtr, imported: KPtr, local: KPtr): KNativePointer + + _CreateFunctionSignature(context: KPtr, typeParams: KPtr, params: KPtrArray, paramsLen: KInt, returnTypeAnnotation: KPtr): KPtr + _CreateScriptFunction(context: KPtr, databody: KPtr, datasignature: KPtr, datafuncFlags: KInt, dataflags: KInt, datadeclare: KBoolean): KPtr + _UpdateScriptFunction(context: KPtr, original: KPtr, databody: KPtr, datasignature: KPtr, datafuncFlags: KInt, dataflags: KInt, datadeclare: KBoolean): KPtr + _CreateBlockStatement(context: KPtr, statementList: KPtrArray, statementListLen: KInt): KPtr + _AstNodeScopeConst(context: KPtr, ast: KPtr): KPtr + _AstNodeParent(context: KPtr, ast: KPtr): KPtr + _AstNodeSetParent(context: KPtr, ast: KPtr, parent: KPtr): KPtr + _AstNodeClone(context: KPtr, ast: KPtr, parent: KPtr): KPtr + _AstNodeModifiers(context: KPtr, ast: KPtr): KInt + _AstNodeAddModifier(context: KPtr, ast: KPtr, flags: KInt): void + _AstNodeClearModifier(context: KPtr, ast: KPtr, flags: KInt): void + _AstNodeVariableConst(context: KPtr, ast: KPtr): KPtr + _AstNodeTypeConst(context: KPtr, ast: KPtr): KInt + _FunctionSignatureTypeParams(context: KPtr, ast: KPtr): KPtr + _FunctionSignatureReturnType(context: KPtr, ast: KPtr): KPtr + _FunctionSignatureParamsConst(context: KPtr, ast: KPtr, returnTypeLen: KPtr): KPtr + _UpdateIdentifier1(context: KPtr, ast: KPtr, name: string): KPtr + _UpdateIdentifier2(context: KPtr, ast: KPtr, name: string, typeAnnotation: KPtr): KPtr + _UpdateMethodDefinition(context: KPtr, node: KPtr, kind: KInt, key: KPtr, value: KPtr, modifiers: KInt, isComputed: KBoolean): KPtr + _MethodDefinitionFunction(context: KPtr, node: KPtr): KPtr + _MethodDefinitionKindConst(context: KPtr, node: KPtr): KInt + + _CreateMemberExpression(context: KPtr, object: KPtr, property: KPtr, kind: KInt, computed: KBoolean, optional: KBoolean): KPtr + _UpdateMemberExpression(context: KPtr, node: KPtr, object: KPtr, property: KPtr, kind: KInt, computed: KBoolean, optional: KBoolean): KPtr + _MemberExpressionObject(context: KPtr, node: KPtr): KPtr + _MemberExpressionProperty(context: KPtr, node: KPtr): KPtr + _MemberExpressionKindConst(context: KPtr, node: KPtr): KInt + _CreateCallExpression(context: KPtr, callee: KPtr, args: KPtrArray, argsLen: KInt, typeParams: KPtr, optional: KBoolean, trailingComma: KBoolean): KPtr + _UpdateCallExpression(node: KPtr, context: KPtr, callee: KPtr, args: KPtrArray, argsLen: KInt, typeParams: KPtr, optional: KBoolean, trailingComma: KBoolean): KPtr + _CreateArrowFunctionExpression(context: KPtr, node: KPtr): KPtr + _FunctionExpressionFunction(context: KPtr, node: KPtr): KPtr + _ArrowFunctionExpressionFunction(context: KPtr, node: KPtr): KPtr + _ArrowFunctionExpressionCreateTypeAnnotation(context: KPtr, node: KPtr): KPtr + _CreateFunctionExpression(context: KPtr, node: KPtr): KPtr + _UpdateFunctionExpression(context: KPtr, original: KPtr, node: KPtr): KPtr + + _CreateExpressionStatement(context: KPtr, expr: KPtr): KPtr + _UpdateExpressionStatement(context: KPtr, node: KPtr, expr: KPtr): KPtr + _CreateETSParameterExpression(context: KPtr, identifier: KPtr, initializer: KPtr): KPtr + _CreateETSPrimitiveType(context: KPtr, type: KInt): KPtr + _ETSPrimitiveTypeGetPrimitiveTypeConst(context: KPtr, node: KNativePointer): KInt + _CreateETSTypeReference(context: KPtr, part: KPtr): KPtr + _CreateETSTypeReferencePart(context: KPtr, name: KPtr, typeParams: KPtr, prev: KPtr): KPtr + _CreateETSTypeReferencePart1(context: KPtr, name: KPtr): KPtr + _IsIdentifier(node: KPtr): KBoolean + _IdentifierName(context: KPtr, node: KPtr): KPtr + _ETSParameterExpressionIdent(context: KPtr, node: KPtr): KPtr + _CreateTSTypeParameterDeclaration(context: KPtr, params: KPtrArray, paramsLen: KInt, requiredParams: KInt): KPtr + _TSTypeParameterDeclarationParamsConst(context: KPtr, node: KPtr, returnTypeLen: KPtr): KPtr + _CreateTSTypeParameter(context: KPtr, name: KPtr, constraint: KPtr, defaultType: KPtr): KPtr + _TSTypeParameterName(context: KPtr, node: KPtr): KPtr + + _CreateTSUnionType(context: KPtr, types: KPtrArray, typesLen: KInt): KPtr + _TSUnionTypeTypesConst(context: KPtr, node: KPtr, returnTypeLen: KPtr): KPtr + _CreateETSUnionTypeIr(context: KPtr, types: KPtrArray, typesLen: KInt): KPtr + _ETSUnionTypeIrTypesConst(context: KPtr, node: KPtr, returnTypeLen: KPtr): KPtr + + _CreateVariableDeclaration(context: KPtr, kind: KInt, declarators: KPtrArray, declaratorsLen: KInt, declare: KBoolean): KPtr + _UpdateVariableDeclaration(context: KPtr, original: KPtr, kind: KInt, declarators: KPtrArray, declaratorsLen: KInt, declare: KBoolean): KPtr + _CreateVariableDeclarator(context: KPtr, flag: KInt, ident: KPtr): KPtr + _VariableDeclarationDeclaratorsConst(context: KPtr, node: KPtr): KPtr + _VariableDeclarationKindConst(context: KPtr, node: KPtr): KInt + _VariableDeclaratorId(context: KPtr, node: KPtr): KPtr + _VariableDeclaratorSetInit(context: KPtr, node: KPtr, init: KPtr): void + + _CreateStringLiteral(context: KPtr, string: string): KPtr + _CreateNumberLiteral(context: KPtr, string: string): KPtr + _NumberLiteralStrConst(context: KPtr, node: KPtr): KPtr + _StringLiteralStrConst(context: KPtr, node: KPtr): KPtr + + _BlockStatementStatements(context: KPtr, node: KPtr): KPtr + _BlockStatementSetStatements(context: KPtr, node: KPtr, statements: KPtrArray, statementsLen: KInt): void + _ClassDeclarationDefinition(context: KPtr, node: KPtr): KPtr + _ClassDefinitionBody(context: KPtr, node: KPtr): KPtr + _ClassDefinitionIdent(context: KPtr, node: KPtr): KPtr + _ClassDefinitionTypeParamsConst(context: KPtr, node: KPtr): KPtr + _CreateClassDeclaration(context: KPtr, def: KPtr): KPtr + _UpdateClassDeclaration(context: KPtr, original: KPtr, def: KPtr): KPtr + _CreateClassDefinition1(context: KPtr, ident: KPtr, body: KPtrArray, bodyLen: KInt, modifiers: KInt, flags: KInt): KPtr + _ClassDefinitionSetTypeParams(context: KPtr, ast: KPtr, typeParams: KPtr): void + _ClassDefinitionSetSuper(context: KPtr, ast: KPtr, superClass: KPtr): void + _UpdateClassDefinition1(context: KPtr, original: KPtr, ident: KPtr, body: KPtrArray, bodyLen: KInt, modifiers: KInt, flags: KInt): KPtr + _CreateETSFunctionTypeIr(context: KPtr, signature: KPtr, funcFlags: KInt): KPtr + _CreateSuperExpression(context: KPtr): KPtr + _UpdateSuperExpression(context: KPtr, original: KPtr): KPtr + + _IsProgram(context: KPtr, node: KPtr): KBoolean + _AstNodeDumpJsonConst(context: KPtr, node: KPtr): KPtr + _AstNodeDumpEtsSrcConst(context: KPtr, node: KPtr): KPtr + _AstNodeUpdateChildren(context: KPtr, node: KPtr): void + _AstNodeUpdateAll(context: KPtr, node: KPtr): void + _AstNodeSetOriginalNode(context: KPtr, ast: KPtr, originalNode: KPtr): void + _AstNodeOriginalNodeConst(context: KPtr, ast: KPtr): KPtr + + _VarBinderSetProgram(context: KPtr): void + _VarBinderSetContext(context: KPtr): void + + _VariableDeclaration(context: KPtr, variable: KPtr): KPtr + _DeclNode(context: KPtr, decl: KPtr): KPtr + + _ScopeSetParent(context: KPtr, ast: KPtr, scope: KPtr): void +} + +console.log(process.cwd()) +export const nativeModule: NativeModule = require("../native/build/es2panda.node") diff --git a/arkoala-arkts/libarkts/src/api/factory/nodeFactory.ts b/arkoala-arkts/libarkts/src/ts-api/factory/nodeFactory.ts similarity index 65% rename from arkoala-arkts/libarkts/src/api/factory/nodeFactory.ts rename to arkoala-arkts/libarkts/src/ts-api/factory/nodeFactory.ts index 0a4a2041a..77b325828 100644 --- a/arkoala-arkts/libarkts/src/api/factory/nodeFactory.ts +++ b/arkoala-arkts/libarkts/src/ts-api/factory/nodeFactory.ts @@ -1,7 +1,6 @@ -import global from "../static/global" +import { throwError } from "../../utils" import * as ts from "@koalaui/ets-tsc" -import * as arkts from "../layers/arkts" -import { nativeModule } from "src/NativeModule" +import * as arkts from "../../arkts-api" import { passNode, @@ -10,18 +9,15 @@ import { passModifiersToScriptFunction, passModifiers, passIdentifier, -} from "../layers/ts/utilities" -import { - passString, - updateNode, - // updateModifiers, - // passTypeParams, -} from "../layers/arkts/utilities" -import { passTypeParams, -} from "./utilities" + passVariableDeclarationKind, +} from "../utilities/private" import { SyntaxKind, + NodeFlags, +} from "../static/enums" +import { + Es2pandaContextState, Es2pandaPrimitiveType, Es2pandaMethodDefinitionKind, Es2pandaModifierFlags, @@ -29,8 +25,8 @@ import { Es2pandaMemberExpressionKind, Es2pandaClassDefinitionModifiers, Es2pandaVariableDeclarationKind, - VariableDeclaratorFlag, -} from "../static/enums" + Es2pandaVariableDeclaratorFlag, +} from "../../arkts-api/static/enums" import { // ts types: Modifier, @@ -63,11 +59,16 @@ import { TypeParameterDeclaration, NumericLiteral, ClassDeclaration, - // VariableDeclaration, - // VariableDeclarationList, - // VariableStatement, + VariableDeclaration, + VariableDeclarationList, + VariableStatement, UnionTypeNode, -} from "../layers/ts/types" + SuperExpression, + ParenthesizedExpression, + ImportDeclaration, + ImportClause, + ImportSpecifier, +} from "../types" // TODO: add flags and base export function createNodeFactory() { @@ -111,14 +112,20 @@ export function createNodeFactory() { updateTypeParameterDeclaration, createClassDeclaration, updateClassDeclaration, - // createVariableDeclarationList, - // updateVariableDeclarationList, - // createVariableStatement, - // updateVariableStatement, - // createVariableDeclaration, - // updateVariableDeclaration, + createVariableDeclarationList, + updateVariableDeclarationList, + createVariableStatement, + updateVariableStatement, + createVariableDeclaration, + updateVariableDeclaration, createUnionTypeNode, updateUnionTypeNode, + createSuper, + updateSuper, + createParenthesizedExpression, + updateParenthesizedExpression, + // createImportDeclaration, + createImportSpecifier, } // @api @@ -127,8 +134,8 @@ export function createNodeFactory() { // endOfFileToken: EndOfFileToken, // flags: NodeFlags, // ): SourceFile; - function createSourceFile(source: string): SourceFile { - const node = arkts.Program.create(source) + function createSourceFile(source: string, state: Es2pandaContextState = Es2pandaContextState.ES2PANDA_STATE_PARSED): SourceFile { + const node = arkts.EtsScript.create(source, state) return new SourceFile(node) } @@ -147,8 +154,12 @@ export function createNodeFactory() { node: SourceFile, statements: readonly Statement[] ): SourceFile { - node.node.statements = passNodeArray(statements) - return new SourceFile(node.node) + return new SourceFile( + arkts.EtsScript.update( + node.node, + passNodeArray(statements) + ) + ) } // @api @@ -160,7 +171,7 @@ export function createNodeFactory() { typeAnnotation?: TypeNode | undefined ): Identifier { return new Identifier( - arkts.Identifier.create( + arkts.factory.createIdentifier( text, passNode(typeAnnotation) ) @@ -175,8 +186,12 @@ export function createNodeFactory() { function createStringLiteral( str: string ): StringLiteral { - const node = arkts.StringLiteral.create(str) - return new StringLiteral(node) + return new StringLiteral( + arkts.StringLiteral.create( + undefined, + str + ) + ) } // @api @@ -187,10 +202,14 @@ export function createNodeFactory() { function createNumericLiteral( str: string ): NumericLiteral { - const node = arkts.NumberLiteral.create(str) - return new NumericLiteral(node) + return new NumericLiteral( + arkts.NumberLiteral.create( + undefined, + str + ) + ) } -/* + // @api // createVariableDeclarationList( // declarations: readonly VariableDeclaration[], @@ -198,12 +217,17 @@ export function createNodeFactory() { // ): VariableDeclarationList function createVariableDeclarationList( declarations: readonly VariableDeclaration[], - flags = Es2pandaVariableDeclarationKind.CONST + flags: NodeFlags = NodeFlags.None ): VariableDeclarationList { - const peer = withNodeArray(declarations, _declarators => { - return nativeModule._CreateVariableDeclaration(global.context, flags, _declarators, _declarators.length, false) - }) - return new VariableDeclarationList(updateChildren(peer)) + return new VariableDeclarationList( + arkts.VariableDeclaration.create( + undefined, + passModifiers([]), + passVariableDeclarationKind(flags), + passNodeArray(declarations), + false + ) + ) } // @api @@ -215,8 +239,15 @@ export function createNodeFactory() { node: VariableDeclarationList, declarations: readonly VariableDeclaration[] ): VariableDeclarationList { - const updated = createVariableDeclarationList(declarations) - return new VariableDeclarationList(updateNode(updated.peer, node.peer)) + return new VariableDeclarationList( + arkts.VariableDeclaration.create( + node.node, + passModifiers([]), + passVariableDeclarationKind(node.flags), + passNodeArray(declarations), + false + ) + ) } // @api @@ -228,13 +259,16 @@ export function createNodeFactory() { modifiers: readonly Modifier[] | undefined, declarationList: VariableDeclarationList | readonly VariableDeclaration[] ): VariableStatement { - const peer = withNodeArray((declarationList instanceof VariableDeclarationList) ? declarationList.declarations : declarationList, _declarators => { - // TODO: fix (const only now) - return nativeModule._CreateVariableDeclaration(global.context, Es2pandaVariableDeclarationKind.CONST, _declarators, _declarators.length, false) - }) - // TODO: fix flags - // setModifierFlags(peer, Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC | Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC | Es2pandaModifierFlags.MODIFIER_FLAGS_CONST) - return new VariableStatement(updateChildren(updateModifiers(peer, modifiers))) + const node: arkts.VariableDeclaration = (declarationList instanceof VariableDeclarationList) ? declarationList.node : createVariableDeclarationList(declarationList, undefined).node + return new VariableStatement( + arkts.VariableDeclaration.create( + undefined, + passModifiers(modifiers), + node.declarationKind, + node.declarators, + false + ) + ) } // @api @@ -248,8 +282,15 @@ export function createNodeFactory() { modifiers: readonly Modifier[] | undefined, declarationList: VariableDeclarationList ): VariableStatement { - const updated = createVariableStatement(modifiers, declarationList) - return new VariableStatement(updateNode(updated.peer, updateModifiers(node.peer, modifiers))) + return new VariableStatement( + arkts.VariableDeclaration.create( + node.node, + passModifiers(modifiers), + declarationList.node.declarationKind, + declarationList.node.declarators, + false + ) + ) } // @api @@ -260,23 +301,20 @@ export function createNodeFactory() { // initializer: Expression | undefined // ): VariableDeclaration function createVariableDeclaration( - name: Identifier, + name: string | Identifier, exclamationToken: undefined, type: TypeNode | undefined, initializer: Expression | undefined ): VariableDeclaration { - const ident = identifierUpdateTypeAnnotation(name, type) - updateChildren(ident.peer) - // TODO: fix (const only now) - const peer = nativeModule._CreateVariableDeclarator( - global.context, - VariableDeclaratorFlag.CONST, - ident.peer + return new VariableDeclaration( + arkts.VariableDeclarator.create( + undefined, + // TODO: maybe incorrect + Es2pandaVariableDeclaratorFlag.UNKNOWN, + passIdentifier(name, type), + passNode(initializer) + ) ) - if (initializer !== undefined) { - nativeModule._VariableDeclaratorSetInit(global.context, peer, initializer.peer) - } - return new VariableDeclaration(updateChildren(peer)) } // @api @@ -294,10 +332,16 @@ export function createNodeFactory() { type: TypeNode | undefined, initializer: Expression | undefined ): VariableDeclaration { - const updated = createVariableDeclaration(name, exclamationToken, type, initializer) - return new VariableDeclaration(updateNode(updated.peer, node.peer)) + return new VariableDeclaration( + arkts.VariableDeclarator.create( + node.node, + // TODO: maybe incorrect + Es2pandaVariableDeclaratorFlag.UNKNOWN, + passIdentifier(name, type), + passNode(initializer) + ) + ) } -*/ // @api // createFunctionDeclaration( @@ -320,14 +364,16 @@ export function createNodeFactory() { ): FunctionDeclaration { return new FunctionDeclaration( arkts.FunctionDeclaration.create( + undefined, arkts.ScriptFunction.create( + undefined, body?.node, arkts.FunctionSignature.create( passTypeParams(typeParameters), passNodeArray(parameters), type?.node ), - passModifiersToScriptFunction(modifiers), + 0, passModifiers(modifiers) | Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC | Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC, body === undefined, passIdentifier(name) @@ -359,15 +405,23 @@ export function createNodeFactory() { body: Block | undefined ): FunctionDeclaration { return new FunctionDeclaration( - createFunctionDeclaration( - modifiers, - undefined, - name, - typeParameters, - parameters, - type, - body - ).node.updateNode(node.node) + arkts.FunctionDeclaration.create( + node.node, + arkts.ScriptFunction.create( + node.node.scriptFunction, + body?.node, + arkts.FunctionSignature.create( + passTypeParams(typeParameters), + passNodeArray(parameters), + type?.node + ), + 0, + passModifiers(modifiers) | Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC | Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC, + body === undefined, + passIdentifier(name) + ), + false + ) ) } @@ -390,7 +444,8 @@ export function createNodeFactory() { ): ParameterDeclaration { return new ParameterDeclaration( arkts.ETSParameterExpression.create( - arkts.Identifier.create( + undefined, + arkts.factory.createIdentifier( (name instanceof Identifier) ? name.node.name : name, type?.node ), @@ -419,14 +474,14 @@ export function createNodeFactory() { initializer?: Expression ): ParameterDeclaration { return new ParameterDeclaration( - createParameterDeclaration( - modifiers, - dotDotDotToken, - name, - questionToken, - type, - initializer - ).node.updateNode(node.node) + arkts.ETSParameterExpression.create( + node.node, + arkts.factory.createIdentifier( + (name instanceof Identifier) ? name.node.name : name, + type?.node + ), + initializer?.node + ) ) } @@ -445,6 +500,7 @@ export function createNodeFactory() { ): TypeParameterDeclaration { return new TypeParameterDeclaration( arkts.TSTypeParameter.create( + undefined, passIdentifier(name), constraint?.node, defaultType?.node, @@ -469,12 +525,13 @@ export function createNodeFactory() { defaultType?: TypeNode ): TypeParameterDeclaration { return new TypeParameterDeclaration( - createTypeParameterDeclaration( - modifiers, - name, - constraint, - defaultType - ).node.updateNode(node.node) + arkts.TSTypeParameter.create( + node.node, + passIdentifier(name), + constraint?.node, + defaultType?.node, + passModifiers(modifiers) + ) ) } @@ -487,6 +544,7 @@ export function createNodeFactory() { ): UnionTypeNode { return new UnionTypeNode( arkts.ETSUnionType.create( + undefined, passNodeArray(types) ) ) @@ -502,10 +560,12 @@ export function createNodeFactory() { types: readonly TypeNode[] ): UnionTypeNode { return new UnionTypeNode( - createUnionTypeNode( - types - ).node.updateNode(node.node) + arkts.ETSUnionType.create( + node.node, + passNodeArray(types) + ) ) + } // @api @@ -518,7 +578,10 @@ export function createNodeFactory() { typeArguments?: undefined ): TypeReferenceNode { return new TypeReferenceNode( - arkts.ETSTypeReference.create(typeName.node) + arkts.ETSTypeReference.create( + undefined, + typeName.node + ) ) } @@ -533,30 +596,14 @@ export function createNodeFactory() { typeName: Identifier, typeArguments?: undefined ): TypeReferenceNode { - const updated = createTypeReferenceNode(typeName, typeArguments) - return new TypeReferenceNode(updateNode(updated.node, node.node)) - } - - // @internal - function createKeywordTypeNodeFromString( - keyword: string - ): KeywordTypeNode { - return new KeywordTypeNode( + return new TypeReferenceNode( arkts.ETSTypeReference.create( - arkts.Identifier.create(keyword) + node.node, + typeName.node ) ) } - // @internal - function createKeywordTypeNodeFromKind( - kind: number - ): KeywordTypeNode { - return new KeywordTypeNode( - arkts.ETSPrimitiveType.create(kind) - ) - } - // @api // createKeywordTypeNode( // kind: TKind @@ -564,13 +611,37 @@ export function createNodeFactory() { function createKeywordTypeNode( TKind: ts.KeywordTypeSyntaxKind ): KeywordTypeNode { + function createKeywordTypeNodeFromString( + keyword: string + ): KeywordTypeNode { + return new KeywordTypeNode( + arkts.ETSTypeReference.create( + undefined, + arkts.factory.createIdentifier( + keyword + ) + ) + ) + } + + function createKeywordTypeNodeFromKind( + kind: number + ): KeywordTypeNode { + return new KeywordTypeNode( + arkts.ETSPrimitiveType.create( + undefined, + kind + ) + ) + } + const keywords = new Map([ [ts.SyntaxKind.NumberKeyword, createKeywordTypeNodeFromString("number")], [ts.SyntaxKind.StringKeyword, createKeywordTypeNodeFromString("string")], [ts.SyntaxKind.AnyKeyword, createKeywordTypeNodeFromString("any")], [ts.SyntaxKind.VoidKeyword, createKeywordTypeNodeFromKind(8)], ]) - return keywords.get(TKind) ?? global.throwError('unsupported keyword') + return keywords.get(TKind) ?? throwError('unsupported keyword') } // @api @@ -583,7 +654,10 @@ export function createNodeFactory() { multiline?: boolean ): Block { return new Block( - arkts.Block.create(passNodeArray(statements)) + arkts.BlockStatement.create( + undefined, + passNodeArray(statements) + ) ) } @@ -596,8 +670,12 @@ export function createNodeFactory() { node: Block, statements: readonly Statement[] ): Block { - const updated = createBlock(statements) - return new Block(updateNode(updated.node, node.node)) + return new Block( + arkts.BlockStatement.create( + node.node, + passNodeArray(statements) + ) + ) } // @api @@ -608,7 +686,9 @@ export function createNodeFactory() { expression: Expression ): ExpressionStatement { return new ExpressionStatement( - arkts.ExpressionStatement.create(expression.node) + arkts.factory.createExpressionStatement( + expression.node + ) ) } @@ -621,8 +701,12 @@ export function createNodeFactory() { node: ExpressionStatement, expression: Expression ): ExpressionStatement { - const updated = createExpressionStatement(expression) - return new ExpressionStatement(updateNode(updated.node, node.node)) + return new ExpressionStatement( + arkts.factory.updateExpressionStatement( + node.node, + expression.node + ) + ) } // @api @@ -633,7 +717,10 @@ export function createNodeFactory() { expression: Expression ): ReturnStatement { return new ReturnStatement( - arkts.ReturnStatement.create(expression.node) + arkts.ReturnStatement.create( + undefined, + expression.node + ) ) } @@ -646,8 +733,12 @@ export function createNodeFactory() { node: ReturnStatement, expression: Expression ): ReturnStatement { - const updated = createReturnStatement(expression) - return new ReturnStatement(updateNode(updated.node, node.node)) + return new ReturnStatement( + arkts.ReturnStatement.create( + node.node, + expression.node + ) + ) } // @api @@ -660,7 +751,7 @@ export function createNodeFactory() { name: string | Identifier ): PropertyAccessExpression { return new PropertyAccessExpression( - arkts.MemberExpression.create( + arkts.factory.createMemberExpression( expression.node, passIdentifier(name), Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, @@ -681,8 +772,16 @@ export function createNodeFactory() { expression: Expression, name: Identifier ): PropertyAccessExpression { - const updated = createPropertyAccessExpression(expression, name) - return new PropertyAccessExpression(updateNode(updated.node, node.node)) + return new PropertyAccessExpression( + arkts.factory.updateMemberExpression( + node.node, + expression.node, + passIdentifier(name), + Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ) + ) } // @api @@ -697,13 +796,10 @@ export function createNodeFactory() { argumentsArray: readonly Expression[] | undefined ): CallExpression { return new CallExpression( - arkts.CallExpression.create( + arkts.factory.createCallExpression( expression.node, (typeArguments !== undefined) ? - arkts.TSTypeParameterDeclaration.create( - passNodeArray(typeArguments) - ) : - undefined, + arkts.TSTypeParameterDeclaration.create(undefined, passNodeArray(typeArguments)) : undefined, passNodeArray(argumentsArray) ) ) @@ -722,8 +818,15 @@ export function createNodeFactory() { typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[] | undefined ): CallExpression { - const updated = createCallExpression(expression, typeArguments, argumentsArray) - return new CallExpression(updateNode(updated.node, node.node)) + return new CallExpression( + arkts.factory.updateCallExpression( + node.node, + expression.node, + (typeArguments !== undefined) ? + arkts.TSTypeParameterDeclaration.create(undefined, passNodeArray(typeArguments)) : undefined, + passNodeArray(argumentsArray) + ) + ) } // @api @@ -739,6 +842,7 @@ export function createNodeFactory() { ): IfStatement { return new IfStatement( arkts.IfStatement.create( + undefined, passNode(expression), passNode(thenStatement), passNode(elseStatement), @@ -758,8 +862,14 @@ export function createNodeFactory() { thenStatement: Statement, elseStatement?: undefined ): IfStatement { - const updated = createIfStatement(expression, thenStatement, elseStatement) - return new IfStatement(updateNode(updated.node, node.node)) + return new IfStatement( + arkts.IfStatement.create( + node.node, + passNode(expression), + passNode(thenStatement), + passNode(elseStatement), + ) + ) } // TODO: rewrite maybe @@ -786,6 +896,7 @@ export function createNodeFactory() { ): BinaryExpression { return new BinaryExpression( arkts.BinaryExpression.create( + undefined, passNode(left), passToken(operator), passNode(right), @@ -806,8 +917,14 @@ export function createNodeFactory() { operator: BinaryOperatorToken, right: Expression ): BinaryExpression { - const updated = createBinaryExpression(left, operator, right) - return new BinaryExpression(updateNode(updated.node, node.node)) + return new BinaryExpression( + arkts.BinaryExpression.create( + node.node, + passNode(left), + passToken(operator), + passNode(right), + ) + ) } // @api @@ -824,12 +941,14 @@ export function createNodeFactory() { typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, - equalsGreaterThanToken: undefined, + equalsGreaterThanToken: Token | undefined, body: Block ) { return new ArrowFunction( arkts.ArrowFunctionExpression.create( + undefined, arkts.ScriptFunction.create( + undefined, passNode(body), arkts.FunctionSignature.create( passTypeParams(typeParameters), @@ -861,11 +980,27 @@ export function createNodeFactory() { typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: undefined, - equalsGreaterThanToken: undefined, + equalsGreaterThanToken: Token | undefined, body: Block, ): ArrowFunction { - const updated = createArrowFunction(modifiers, typeParameters, parameters, type, equalsGreaterThanToken, body) - return new ArrowFunction(updateNode(updated.node, node.node)) + return new ArrowFunction( + arkts.ArrowFunctionExpression.create( + node.node, + arkts.ScriptFunction.create( + node.node.scriptFunction, + passNode(body), + arkts.FunctionSignature.create( + passTypeParams(typeParameters), + passNodeArray(parameters), + passNode(type) + ), + passModifiersToScriptFunction(modifiers) | Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_ARROW, + passModifiers(modifiers) | Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, + false, + undefined + ) + ) + ) } // @api @@ -880,17 +1015,21 @@ export function createNodeFactory() { modifiers: readonly Modifier[] | undefined, name: string | Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, - heritageClauses: undefined, + heritageClauses: readonly TypeParameterDeclaration[] | undefined, members: readonly ClassElement[] - ) { + ): ClassDeclaration { return new ClassDeclaration( arkts.ClassDeclaration.create( + undefined, arkts.ClassDefinition.create( + undefined, passIdentifier(name), passNodeArray(members), - passModifiers(modifiers) | Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC | Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC, + // passModifiers(modifiers) | es2panda_ModifierFlags.MODIFIER_FLAGS_PUBLIC | es2panda_ModifierFlags.MODIFIER_FLAGS_STATIC, + Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, // TODO: pass through modifiers Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_NONE, + passTypeParams(typeParameters), undefined ) ) @@ -910,45 +1049,24 @@ export function createNodeFactory() { node: ClassDeclaration, modifiers: readonly Modifier[] | undefined, name: Identifier | undefined, - typeParameters: undefined, + typeParameters: readonly TypeParameterDeclaration[] | undefined, heritageClauses: undefined, members: readonly ClassElement[] - ) { - // TODO: rewrite like this (impossible now because of Language param) - - const _classDefinition = nativeModule._ClassDeclarationDefinition( - global.context, - node.node.peer - ) - const _lang = nativeModule._ClassDefinitionLanguageConst( - global.context, - _classDefinition - ) - const _members = arkts.passNodeArray(passNodeArray(members)) - const _newClassDefinition = - arkts.unpackNonNullableNode( - nativeModule._UpdateClassDefinition1( - global.context, - _classDefinition, - // TODO: maybe this is wrong - arkts.passNode(passIdentifier(name)), - _members, - _members.length, - Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_NONE, + ): ClassDeclaration { + return new ClassDeclaration( + arkts.ClassDeclaration.create( + node.node, + arkts.ClassDefinition.create( + node.node.definition, + passIdentifier(name), + passNodeArray(members), + // passModifiers(modifiers) | es2panda_ModifierFlags.MODIFIER_FLAGS_PUBLIC | es2panda_ModifierFlags.MODIFIER_FLAGS_STATIC, Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, - _lang + // TODO: pass through modifiers + Es2pandaClassDefinitionModifiers.CLASS_DEFINITION_MODIFIERS_NONE, + passTypeParams(typeParameters) ) ) - nativeModule._ClassDefinitionSetTypeParams(global.context, _newClassDefinition.peer, arkts.passNode(passTypeParams(typeParameters))) - _newClassDefinition.modifiers = passModifiers(modifiers) - return new ClassDeclaration( - arkts.unpackNonNullableNode( - nativeModule._UpdateClassDeclaration( - global.context, - node.node.peer, - _newClassDefinition.updateNode(arkts.unpackNonNullableNode(_classDefinition)).peer - ) - ).updateModifiers(Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC | Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC) as arkts.ClassDeclaration ) } @@ -964,7 +1082,8 @@ export function createNodeFactory() { type: TypeNode ): FunctionTypeNode { return new FunctionTypeNode( - arkts.FunctionTypeNode.create( + arkts.ETSFunctionType.create( + undefined, arkts.FunctionSignature.create( passTypeParams(typeParameters), passNodeArray(parameters), @@ -989,11 +1108,15 @@ export function createNodeFactory() { type: TypeNode ): FunctionTypeNode { return new FunctionTypeNode( - createFunctionTypeNode( - typeParameters, - parameters, - type - ).node.updateNode(node.node) + arkts.ETSFunctionType.create( + node.node, + arkts.FunctionSignature.create( + passTypeParams(typeParameters), + passNodeArray(parameters), + passNode(type) + ), + Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_NONE + ) ) } @@ -1022,17 +1145,20 @@ export function createNodeFactory() { const _name = passIdentifier(name) return new MethodDeclaration( arkts.MethodDefinition.create( + undefined, Es2pandaMethodDefinitionKind.METHOD_DEFINITION_KIND_METHOD, _name, arkts.FunctionExpression.create( + undefined, arkts.ScriptFunction.create( + undefined, passNode(body), arkts.FunctionSignature.create( passTypeParams(typeParameters), passNodeArray(parameters), passNode(type) ), - passModifiersToScriptFunction(modifiers) | Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_METHOD, + 0, passModifiers(modifiers) | Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC || Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC, false, _name @@ -1067,17 +1193,32 @@ export function createNodeFactory() { type: undefined, body: Block | undefined ): MethodDeclaration { + const _name = passIdentifier(name) return new MethodDeclaration( - createMethodDeclaration( - modifiers, - asteriskToken, - name, - questionToken, - typeParameters, - parameters, - type, - body - ).node.updateNode(node.node) + arkts.MethodDefinition.create( + node.node, + Es2pandaMethodDefinitionKind.METHOD_DEFINITION_KIND_METHOD, + _name, + arkts.FunctionExpression.create( + // TODO: maybe fix + undefined, + arkts.ScriptFunction.create( + node.node.scriptFunction, + passNode(body), + arkts.FunctionSignature.create( + passTypeParams(typeParameters), + passNodeArray(parameters), + passNode(type) + ), + 0, + passModifiers(modifiers) | Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC || Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC, + false, + _name + ) + ), + passModifiers(modifiers), + false + ) ) } @@ -1092,13 +1233,18 @@ export function createNodeFactory() { parameters: readonly ParameterDeclaration[], body: Block | undefined ): ConstructorDeclaration { - const _name = arkts.Identifier.create("constructor") + const _name = arkts.factory.createIdentifier( + "constructor" + ) return new ConstructorDeclaration( arkts.MethodDefinition.create( + undefined, Es2pandaMethodDefinitionKind.METHOD_DEFINITION_KIND_CONSTRUCTOR, _name, arkts.FunctionExpression.create( + undefined, arkts.ScriptFunction.create( + undefined, passNode(body), arkts.FunctionSignature.create( undefined, @@ -1131,8 +1277,134 @@ export function createNodeFactory() { parameters: readonly ParameterDeclaration[], body: Block | undefined ): ConstructorDeclaration { - const updated = createConstructorDeclaration(modifiers, parameters, body) - return new ConstructorDeclaration(updateNode(updated.node, node.node)) + const _name = arkts.factory.updateIdentifier( + node.node.name, + "constructor" + ) + return new ConstructorDeclaration( + arkts.MethodDefinition.create( + node.node, + Es2pandaMethodDefinitionKind.METHOD_DEFINITION_KIND_CONSTRUCTOR, + _name, + arkts.FunctionExpression.create( + // TODO: maybe fix + undefined, + arkts.ScriptFunction.create( + node.node.scriptFunction, + passNode(body), + arkts.FunctionSignature.create( + undefined, + passNodeArray(parameters), + // TODO: change to void maybe + undefined + ), + passModifiersToScriptFunction(modifiers) | Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_CONSTRUCTOR, + passModifiers(modifiers) | Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC | Es2pandaModifierFlags.MODIFIER_FLAGS_CONSTRUCTOR, + false, + _name + ) + ), + passModifiers(modifiers) | Es2pandaModifierFlags.MODIFIER_FLAGS_CONSTRUCTOR, + false + ) + ) + + } + + // @api + // tsc: createSuper( + // ): SuperExpression; + function createSuper( + ): SuperExpression { + return new SuperExpression( + arkts.SuperExpression.create( + undefined, + ) + ) + } + + // @api + // tsc: updateSuper( + // node: SuperExpression + // ): SuperExpression; + function updateSuper( + node: SuperExpression + ): SuperExpression { + return new SuperExpression( + arkts.SuperExpression.create( + node.node, + ) + ) + } + + // @api + // tsc: createParenthesizedExpression( + // expression: Expression + // ): ParenthesizedExpression; + function createParenthesizedExpression( + expression: Expression + ): ParenthesizedExpression { + return expression + // TODO: + // return new ParenthesizedExpression( + // expression + // ) + } + + // @api + // tsc: updateParenthesizedExpression( + // node: ParenthesizedExpression, + // expression: Expression + // ): ParenthesizedExpression; + function updateParenthesizedExpression( + node: ParenthesizedExpression, + expression: Expression + ): ParenthesizedExpression { + return expression + // TODO: + // return new ParenthesizedExpression( + // expression + // ) + } + + // // @api + // // createImportDeclaration( + // // decorators: readonly Decorator[] | undefined, + // // modifiers: readonly Modifier[] | undefined, + // // importClause: ImportClause | undefined, + // // moduleSpecifier: Expression, + // // assertClause?: AssertClause + // // ): ImportDeclaration; + // function createImportDeclaration( + // decorators: undefined, + // modifiers: readonly Modifier[] | undefined, + // importClause: ImportClause | undefined, + // moduleSpecifier: StringLiteral, + // assertClause?: undefined + // ): ImportDeclaration { + // return new ImportDeclaration( + // arkts.EtsImportDeclaration.create( + // undefined, + // arkts.ImportSource.create(moduleSpecifier.node), + + // ) + // ) + // } + + // @api + // createImportSpecifier( + // isTypeOnly: boolean, + // propertyName: Identifier | undefined, + // name: Identifier + // ): ImportSpecifier; + function createImportSpecifier( + isTypeOnly: boolean, + propertyName: Identifier | undefined, + name: Identifier + ): ImportSpecifier { + return new ImportSpecifier( + name.node + ) } } diff --git a/arkoala-arkts/libarkts/src/api/factory/nodeTests.ts b/arkoala-arkts/libarkts/src/ts-api/factory/nodeTests.ts similarity index 61% rename from arkoala-arkts/libarkts/src/api/factory/nodeTests.ts rename to arkoala-arkts/libarkts/src/ts-api/factory/nodeTests.ts index fb4274b56..eed8a6703 100644 --- a/arkoala-arkts/libarkts/src/api/factory/nodeTests.ts +++ b/arkoala-arkts/libarkts/src/ts-api/factory/nodeTests.ts @@ -28,15 +28,15 @@ import { ClassElement, MethodDeclaration, FunctionExpression, - // VariableDeclaration, - // VariableDeclarationList, - // PropertyDeclaration, - // PropertySignature, - // MethodSignature, - // GetAccessorDeclaration, - // SetAccessorDeclaration, - // VariableStatement, -} from "../layers/ts/types" + VariableDeclaration, + VariableDeclarationList, + PropertyDeclaration, + PropertySignature, + MethodSignature, + GetAccessorDeclaration, + SetAccessorDeclaration, + VariableStatement, +} from "../types" export function isIdentifier(node: Node): node is Identifier { return node.kind === SyntaxKind.Identifier @@ -86,38 +86,38 @@ export function isParameter(node: Node): node is ParameterDeclaration { return node.kind === SyntaxKind.Parameter } -// export function isVariableDeclaration(node: Node): node is VariableDeclaration { -// return node.kind === SyntaxKind.VariableDeclaration -// } +export function isVariableDeclaration(node: Node): node is VariableDeclaration { + return node.kind === SyntaxKind.VariableDeclaration +} -// export function isVariableDeclarationList(node: Node): node is VariableDeclarationList { -// return node.kind === SyntaxKind.VariableDeclarationList -// } +export function isVariableDeclarationList(node: Node): node is VariableDeclarationList { + return node.kind === SyntaxKind.VariableDeclarationList +} -// export function isPropertyDeclaration(node: Node): node is PropertyDeclaration { -// return node.kind === SyntaxKind.PropertyDeclaration -// } +export function isPropertyDeclaration(node: Node): node is PropertyDeclaration { + return node.kind === SyntaxKind.PropertyDeclaration +} -// export function isPropertySignature(node: Node): node is PropertySignature { -// return node.kind === SyntaxKind.PropertySignature -// } +export function isPropertySignature(node: Node): node is PropertySignature { + return node.kind === SyntaxKind.PropertySignature +} export function isFunctionTypeNode(node: Node): node is FunctionTypeNode { return node.kind === SyntaxKind.FunctionType } -// export function isMethodSignature(node: Node): node is MethodSignature { -// return node.kind === SyntaxKind.MethodSignature -// } +export function isMethodSignature(node: Node): node is MethodSignature { + return node.kind === SyntaxKind.MethodSignature +} -// export function isGetAccessorDeclaration(node: Node): node is GetAccessorDeclaration { -// return node.kind === SyntaxKind.GetAccessor -// } +export function isGetAccessorDeclaration(node: Node): node is GetAccessorDeclaration { + return node.kind === SyntaxKind.GetAccessor +} -// export function isSetAccessorDeclaration(node: Node): node is SetAccessorDeclaration { -// return node.kind === SyntaxKind.SetAccessor -// } +export function isSetAccessorDeclaration(node: Node): node is SetAccessorDeclaration { + return node.kind === SyntaxKind.SetAccessor +} -// export function isVariableStatement(node: Node): node is VariableStatement { -// return node.kind === SyntaxKind.VariableStatement -// } +export function isVariableStatement(node: Node): node is VariableStatement { + return node.kind === SyntaxKind.VariableStatement +} diff --git a/arkoala-arkts/libarkts/src/api/index.ts b/arkoala-arkts/libarkts/src/ts-api/index.ts similarity index 67% rename from arkoala-arkts/libarkts/src/api/index.ts rename to arkoala-arkts/libarkts/src/ts-api/index.ts index 4b90c66f0..24a7d7f2b 100644 --- a/arkoala-arkts/libarkts/src/api/index.ts +++ b/arkoala-arkts/libarkts/src/ts-api/index.ts @@ -13,18 +13,23 @@ * limitations under the License. */ -export * from "./layers/ts/types" -export * from "./utilities/utilitiesPublic" -// TODO: remove this export -export * from "./utilities/utilities" +// TODO: remove private export +export * from "./utilities/private" +export * from "./utilities/public" +export * from "./types" export * from "./factory/nodeFactory" export * from "./factory/nodeTests" -export * from "./static/global" export { visitEachChild, } from "./visitor/visitor" export { SyntaxKind, - ContextState, - Es2pandaPrimitiveType, + NodeFlags, } from "./static/enums" + +// from ArkTS api +export * from "../arkts-api/static/global" +export { + Es2pandaContextState as ContextState, + Es2pandaPrimitiveType as Es2pandaPrimitiveType, +} from "../arkts-api/static/enums" diff --git a/arkoala-arkts/libarkts/src/api/layers/arkts/index.ts b/arkoala-arkts/libarkts/src/ts-api/static/enums.ts similarity index 81% rename from arkoala-arkts/libarkts/src/api/layers/arkts/index.ts rename to arkoala-arkts/libarkts/src/ts-api/static/enums.ts index f7237d2d9..78dc895df 100644 --- a/arkoala-arkts/libarkts/src/api/layers/arkts/index.ts +++ b/arkoala-arkts/libarkts/src/ts-api/static/enums.ts @@ -13,5 +13,6 @@ * limitations under the License. */ -export * from "./types" -export * from "./utilities" +export { SyntaxKind } from "@koalaui/ets-tsc" +export { TokenSyntaxKind } from "@koalaui/ets-tsc" +export { NodeFlags } from "@koalaui/ets-tsc" diff --git a/arkoala-arkts/libarkts/src/api/layers/ts/types.ts b/arkoala-arkts/libarkts/src/ts-api/types.ts similarity index 65% rename from arkoala-arkts/libarkts/src/api/layers/ts/types.ts rename to arkoala-arkts/libarkts/src/ts-api/types.ts index ded166dfe..46ae232f2 100644 --- a/arkoala-arkts/libarkts/src/api/layers/ts/types.ts +++ b/arkoala-arkts/libarkts/src/ts-api/types.ts @@ -1,7 +1,7 @@ -import global from "../../static/global" import * as ts from "@koalaui/ets-tsc" -import * as arkts from "../arkts/types" +import * as arkts from "../arkts-api/types" +import { throwError } from "../utils" import { todo, @@ -13,10 +13,11 @@ import { passModifiers, unpackModifiers, -} from "./utilities" + unpackVariableDeclarationKind, +} from "./utilities/private" import { SyntaxKind, -} from "../../static/enums" +} from "./static/enums" // TODO: write implementation export interface TransformationContext {} @@ -37,24 +38,24 @@ export abstract class Node(cbNode: (node: ts.Node) => T | undefined, cbNodeArray?: ((nodes: ts.NodeArray) => T | undefined) | undefined): T | undefined { throw new Error("Method not implemented.") } getSourceFile(): ts.SourceFile { throw new Error("Method not implemented.") } getChildCount(sourceFile?: ts.SourceFile | undefined): number { throw new Error("Method not implemented.") } getChildAt(index: number, sourceFile?: ts.SourceFile | undefined): ts.Node { throw new Error("Method not implemented.") } getChildren(sourceFile?: ts.SourceFile | undefined): ts.Node[] { throw new Error("Method not implemented.") } + getStart(sourceFile?: ts.SourceFile | undefined, includeJsDocComment?: boolean | undefined): number { throw new Error("Method not implemented.") } getFullStart(): number { throw new Error("Method not implemented.") } getEnd(): number { throw new Error("Method not implemented.") } @@ -80,7 +83,6 @@ export abstract class Node(cbNode: (node: ts.Node) => T | undefined, cbNodeArray?: ((nodes: ts.NodeArray) => T | undefined) | undefined): T | undefined { throw new Error("Method not implemented.") } get symbol(): ts.Symbol { return todo() } get flags(): ts.NodeFlags { return todo() } @@ -93,6 +95,8 @@ export type BinaryOperator = | ts.SyntaxKind.PlusToken | ts.SyntaxKind.MinusToken + | ts.SyntaxKind.AsteriskToken + export type BinaryOperatorToken = Token; // TODO: rethink maybe (temporary solution) @@ -130,7 +134,7 @@ export class Modifier extends Node { } public toString(): string { - return `${global.modifierFlags.get(this.kind)}` + return `${this.kind}` } kind: ModifierSyntaxKind @@ -139,17 +143,15 @@ export class Modifier extends Node { export abstract class Expression extends Node implements ts.Expression { // TODO: support minimal interface _expressionBrand: any - kind: any } -// export class FunctionDeclaration extends Node implements ts.FunctionDeclaration, FunctionLikeDeclarationBase { -export class FunctionDeclaration extends Node implements ts.FunctionDeclaration { +export class FunctionDeclaration extends Node implements ts.FunctionDeclaration, FunctionLikeDeclarationBase { constructor(node: arkts.FunctionDeclaration) { super(node) this.name = unpackNode(node.name) this.body = unpackNode(node.body) this.typeParameters = unpackNodeArray(node.typeParamsDecl?.parameters) - this.type = unpackNode(node.type) + this.type = unpackNode(node.returnType) this.parameters = unpackNodeArray(node.parameters) } @@ -160,31 +162,21 @@ export class FunctionDeclaration extends Node impleme readonly parameters: NodeArray readonly kind: ts.SyntaxKind.FunctionDeclaration = ts.SyntaxKind.FunctionDeclaration - // TODO: support minimal interface - asteriskToken?: ts.AsteriskToken | undefined + // brands _functionLikeDeclarationBrand: any _declarationBrand: any _statementBrand: any - questionToken?: ts.QuestionToken | undefined - exclamationToken?: ts.ExclamationToken | undefined - locals?: ts.SymbolTable | undefined - skipCheck?: boolean | undefined - decorators?: undefined } -// export class FunctionExpression extends Node implements ts.FunctionExpression, FunctionLikeDeclarationBase { -export class FunctionExpression extends Node implements ts.FunctionExpression { +export class FunctionExpression extends Node implements ts.FunctionExpression, FunctionLikeDeclarationBase { constructor(node: arkts.FunctionExpression) { super(node) this.name = unpackNode(node.scriptFunction.ident) if (node.scriptFunction.body === undefined) { - global.throwError('body expected to be not undefined') + throwError('body expected to be not undefined') } this.body = unpackNode(node.scriptFunction.body) - if (node.scriptFunction.signature === undefined) { - global.throwError('node.scriptFunction.signature not expected to be undefined') - } - this.parameters = unpackNodeArray(node.scriptFunction.signature.parameters) + this.parameters = unpackNodeArray(node.scriptFunction.parameters) } readonly name?: Identifier @@ -192,22 +184,14 @@ export class FunctionExpression extends Node implement readonly parameters: NodeArray readonly kind: ts.SyntaxKind.FunctionExpression = ts.SyntaxKind.FunctionExpression - // TODO: support minimal interface + // brands _primaryExpressionBrand: any _memberExpressionBrand: any _leftHandSideExpressionBrand: any _updateExpressionBrand: any _unaryExpressionBrand: any _expressionBrand: any - locals?: ts.SymbolTable | undefined - skipCheck?: boolean | undefined - decorators?: undefined _functionLikeDeclarationBrand: any - asteriskToken?: ts.AsteriskToken | undefined - questionToken?: ts.QuestionToken | undefined - exclamationToken?: ts.ExclamationToken | undefined - typeParameters?: NodeArray | undefined - type?: TypeNode | undefined _declarationBrand: any } @@ -220,13 +204,10 @@ export class Identifier extends Node implements ts.Identifier, readonly text: string readonly kind: ts.SyntaxKind.Identifier = ts.SyntaxKind.Identifier - // TODO: support minimal interface + // TODO: get escapedText(): ts.__String { return todo() } - originalKeywordKind?: ts.SyntaxKind | undefined - isInJSDocNamespace?: boolean | undefined - locals?: ts.SymbolTable | undefined - skipCheck?: boolean | undefined - decorators?: undefined + + // brands _primaryExpressionBrand: any _memberExpressionBrand: any _leftHandSideExpressionBrand: any @@ -241,15 +222,17 @@ export class PrivateIdentifier extends Node implements ts.Priv super(node) this.text = node.name if (!node.isPrivate) { - global.throwError('identifier expected to be private') + throwError('identifier expected to be private') } } readonly text: string readonly kind: ts.SyntaxKind.PrivateIdentifier = ts.SyntaxKind.PrivateIdentifier - // TODO: support minimal interface + // TODO: get escapedText(): ts.__String { return todo() } + + // brands _primaryExpressionBrand: any _memberExpressionBrand: any _leftHandSideExpressionBrand: any @@ -259,28 +242,26 @@ export class PrivateIdentifier extends Node implements ts.Priv _declarationBrand: any } -// TODO: should be interface, not abstract class export abstract class Statement extends Node implements ts.Statement { + // brands _statementBrand: any - kind: any } -export class Block extends Node implements ts.Block { - constructor(node: arkts.Block) { +export class Block extends Node implements ts.Block { + constructor(node: arkts.BlockStatement) { super(node) - this.statements = unpackNodeArray(node.statements) } readonly statements: NodeArray readonly kind: ts.SyntaxKind.Block = ts.SyntaxKind.Block - // TODO: support minimal interface + // brands _statementBrand: any } -export class SourceFile extends Node implements ts.SourceFile { - constructor(node: arkts.Program) { +export class SourceFile extends Node implements ts.SourceFile { + constructor(node: arkts.EtsScript) { super(node) this.statements = unpackNodeArray(this.node.statements) @@ -289,8 +270,7 @@ export class SourceFile extends Node implements ts.SourceFile { readonly statements: NodeArray readonly kind: ts.SyntaxKind.SourceFile = ts.SyntaxKind.SourceFile - // TODO: support minimal interface - moduleName: string | undefined + // TODO: getLineAndCharacterOfPosition(pos: number): ts.LineAndCharacter { throw new Error("Method not implemented.") } getLineEndOfPosition(pos: number): number { throw new Error("Method not implemented.") } getLineStarts(): readonly number[] { throw new Error("Method not implemented.") } @@ -307,20 +287,17 @@ export class SourceFile extends Node implements ts.SourceFile { get isDeclarationFile(): boolean { return todo() } get hasNoDefaultLib(): boolean { return todo() } get languageVersion(): ts.ScriptTarget { return todo() } + + // brands _declarationBrand: any - impliedNodeFormat?: ts.ModuleKind.CommonJS | ts.ModuleKind.ESNext | undefined - locals?: ts.SymbolTable | undefined - skipCheck?: boolean | undefined - decorators?: undefined } export abstract class LeftHandSideExpression extends Node implements ts.LeftHandSideExpression, Expression { - // TODO: support minimal interface + // brands _leftHandSideExpressionBrand: any _updateExpressionBrand: any _unaryExpressionBrand: any _expressionBrand: any - kind: any } export class ExpressionStatement extends Node implements ts.ExpressionStatement, Statement { @@ -332,7 +309,7 @@ export class ExpressionStatement extends Node impleme readonly expression: Expression readonly kind: ts.SyntaxKind.ExpressionStatement = ts.SyntaxKind.ExpressionStatement - // TODO: support minimal interface + // brands _statementBrand: any } @@ -347,7 +324,7 @@ export class CallExpression extends Node implements ts.Cal readonly arguments: NodeArray readonly kind: ts.SyntaxKind.CallExpression = ts.SyntaxKind.CallExpression - // TODO: support minimal interface + // brands _leftHandSideExpressionBrand: any _updateExpressionBrand: any _unaryExpressionBrand: any @@ -366,7 +343,7 @@ export class PropertyAccessExpression extends Node imple readonly name: Identifier readonly kind: ts.SyntaxKind.PropertyAccessExpression = ts.SyntaxKind.PropertyAccessExpression - // TODO: support minimal interface + // brands _memberExpressionBrand: any _leftHandSideExpressionBrand: any _updateExpressionBrand: any @@ -385,7 +362,7 @@ export class StringLiteral extends Node implements ts.Strin readonly text: string readonly kind: ts.SyntaxKind.StringLiteral = ts.SyntaxKind.StringLiteral - // TODO: support minimal interface + // brands _literalExpressionBrand: any _primaryExpressionBrand: any _memberExpressionBrand: any @@ -409,18 +386,15 @@ export class ClassDeclaration extends Node implements ts readonly typeParameters?: NodeArray readonly kind: ts.SyntaxKind.ClassDeclaration = ts.SyntaxKind.ClassDeclaration - // TODO: support minimal interface + // brands _declarationBrand: any _statementBrand: any } export abstract class ClassElement extends Node implements ts.ClassElement { - readonly name?: PropertyName - - // TODO: support minimal interface + // brands _declarationBrand: any _classElementBrand: any - kind: any } export type MemberName = Identifier | PrivateIdentifier; @@ -438,72 +412,47 @@ export type DeclarationName = // | BindingPattern // | EntityNameExpression; -export interface Declaration extends Node { - _declarationBrand: any -} - +export interface Declaration extends Node {} export abstract class NamedDeclaration extends Node implements ts.NamedDeclaration, Declaration { - name?: DeclarationName + readonly name?: DeclarationName; + + // brands _declarationBrand: any } -/* -export type SignatureDeclaration = ts.CallSignatureDeclaration | ts.ConstructSignatureDeclaration | MethodSignature | ts.IndexSignatureDeclaration | FunctionTypeNode | ts.ConstructorTypeNode | ts.JSDocFunctionType | FunctionDeclaration | MethodDeclaration | ConstructorDeclaration | ts.AccessorDeclaration | FunctionExpression | ArrowFunction; -export interface SignatureDeclarationBase extends NamedDeclaration { - readonly kind: SignatureDeclaration["kind"]; - readonly name?: PropertyName; - readonly typeParameters?: NodeArray | undefined; - readonly parameters: NodeArray; - readonly type?: TypeNode | undefined; -} // constructor(peer: KNativePointer) { - // super(peer) - - // this._scriptFunction = nativeModule._MethodDefinitionFunction(global.context, peer) - // this.name = util.nodeByPeer(nativeModule._ScriptFunctionId(global.context, this._scriptFunction)) as Identifier - // this.parameters = util.unpack(nativeModule._ScriptFunctionParams(global.context, this._scriptFunction)) as NodeArray - // if (util.scriptFunctionHasBody(this._scriptFunction)) { - // this.body = util.nodeByPeer(nativeModule._ScriptFunctionBody(global.context, this._scriptFunction)) as Block - // } - // } +export type SignatureDeclaration = ts.CallSignatureDeclaration | ts.ConstructSignatureDeclaration | MethodSignature | ts.IndexSignatureDeclaration | FunctionTypeNode | ts.ConstructorTypeNode | ts.JSDocFunctionType | FunctionDeclaration | MethodDeclaration | ConstructorDeclaration | ts.AccessorDeclaration | FunctionExpression | ArrowFunction; +export interface SignatureDeclarationBase extends NamedDeclaration {} export type VariableLikeDeclaration = ts.VariableDeclaration | ParameterDeclaration | ts.BindingElement | PropertyDeclaration | ts.PropertyAssignment | PropertySignature | ts.JsxAttribute | ts.ShorthandPropertyAssignment | ts.EnumMember | ts.JSDocPropertyTag | ts.JSDocParameterTag; export interface FunctionLikeDeclarationBase extends SignatureDeclarationBase { + // brands _functionLikeDeclarationBrand: any; - readonly asteriskToken?: ts.AsteriskToken | undefined; - readonly questionToken?: ts.QuestionToken | undefined; - readonly exclamationToken?: ts.ExclamationToken | undefined; - readonly body?: Block | Expression | undefined; } // TODO: support // export type FunctionLikeDeclaration = FunctionDeclaration | MethodDeclaration | ts.GetAccessorDeclaration | ts.SetAccessorDeclaration | ConstructorDeclaration | FunctionExpression | ArrowFunction; export type FunctionLikeDeclaration = FunctionDeclaration | MethodDeclaration | ConstructorDeclaration | FunctionExpression | ArrowFunction; -export class MethodSignature extends NodeBase implements ts.MethodSignature, SignatureDeclarationBase { - constructor(peer: KNativePointer) { - super(peer) +export class MethodSignature extends Node implements ts.MethodSignature, SignatureDeclarationBase { + constructor(node: arkts.Node) { + super(node) } - // TODO: support minimal interface - get parent(): any { return todo() } - // name: PropertyName + // readonly name: PropertyName + // readonly parameters: NodeArray + readonly kind: ts.SyntaxKind.MethodSignature = ts.SyntaxKind.MethodSignature + + // TODO: name: any - typeParameters?: NodeArray | undefined - // parameters: NodeArray parameters: any - type?: TypeNode | undefined + + // brands _declarationBrand: any - locals?: ts.SymbolTable | undefined - skipCheck?: boolean | undefined - decorators?: undefined _typeElementBrand: any - questionToken?: ts.QuestionToken | undefined - kind: ts.SyntaxKind.MethodSignature = ts.SyntaxKind.MethodSignature } -*/ // export class MethodDeclaration extends Node implements ts.MethodDeclaration, FunctionLikeDeclarationBase, ClassElement { export class MethodDeclaration extends Node implements ts.MethodDeclaration, ClassElement { @@ -521,8 +470,7 @@ export class MethodDeclaration extends Node implements t readonly body?: Block | undefined readonly kind: ts.SyntaxKind.MethodDeclaration = ts.SyntaxKind.MethodDeclaration - // TODO: support minimal interface - get parent(): any { return todo() } + // brands _functionLikeDeclarationBrand: any _classElementBrand: any _objectLiteralBrand: any @@ -545,99 +493,87 @@ export class ConstructorDeclaration extends Node impleme readonly body?: Block readonly kind: ts.SyntaxKind.Constructor = ts.SyntaxKind.Constructor - // TODO: support minimal interface - get parent(): any { return todo() } + // brands _functionLikeDeclarationBrand: any _classElementBrand: any _objectLiteralBrand: any _declarationBrand: any } -/* -export class PropertySignature extends NodeBase implements ts.TypeElement { - constructor(peer: KNativePointer) { - super(peer) + +// TODO: specify arkts.Node type +export class PropertySignature extends Node implements ts.TypeElement { + constructor(node: arkts.Node) { + super(node) } - // TODO: support minimal interface + readonly name?: PropertyName + readonly kind: ts.SyntaxKind.PropertySignature = ts.SyntaxKind.PropertySignature + + // brands _typeElementBrand: any - name?: PropertyName | undefined - questionToken?: ts.QuestionToken | undefined _declarationBrand: any - locals?: ts.SymbolTable | undefined - skipCheck?: boolean | undefined - decorators?: undefined - kind: ts.SyntaxKind.PropertySignature = ts.SyntaxKind.PropertySignature } -export class PropertyDeclaration extends NodeBase implements ts.PropertyDeclaration, ClassElement { - constructor(peer: KNativePointer) { - super(peer) +// TODO: specify arkts.Node type +export class PropertyDeclaration extends Node implements ts.PropertyDeclaration, ClassElement { + constructor(node: arkts.Node) { + super(node) } - // TODO: support minimal interface - get parent(): any { return todo() } - get name(): PropertyName { return todo() } + readonly kind: ts.SyntaxKind.PropertyDeclaration = ts.SyntaxKind.PropertyDeclaration + + // TODO: + name: any + + // brands _classElementBrand: any _declarationBrand: any - kind: ts.SyntaxKind.PropertyDeclaration = ts.SyntaxKind.PropertyDeclaration } -export class GetAccessorDeclaration extends NodeBase implements ts.GetAccessorDeclaration, FunctionLikeDeclarationBase, ClassElement { - constructor(peer: KNativePointer) { - super(peer) +// TODO: specify arkts.Node type +export class GetAccessorDeclaration extends Node implements ts.GetAccessorDeclaration, FunctionLikeDeclarationBase, ClassElement { + constructor(node: arkts.Node) { + super(node) } - // TODO: support minimal interface - get parent(): any { return todo() } - // name: PropertyName + // readonly name: PropertyName + // readonly parameters: NodeArray + readonly kind: ts.SyntaxKind.GetAccessor = ts.SyntaxKind.GetAccessor + + // TODO: name: any - body?: Block | undefined - _functionLikeDeclarationBrand: any - asteriskToken?: ts.AsteriskToken | undefined - questionToken?: ts.QuestionToken | undefined - exclamationToken?: ts.ExclamationToken | undefined - typeParameters?: NodeArray | undefined - // parameters: NodeArray parameters: any - type?: TypeNode | undefined + + // brands + _functionLikeDeclarationBrand: any _declarationBrand: any - locals?: ts.SymbolTable | undefined - skipCheck?: boolean | undefined - decorators?: undefined _classElementBrand: any _typeElementBrand: any _objectLiteralBrand: any - kind: ts.SyntaxKind.GetAccessor = ts.SyntaxKind.GetAccessor } -export class SetAccessorDeclaration extends NodeBase implements ts.SetAccessorDeclaration, FunctionLikeDeclarationBase, ClassElement { - constructor(peer: KNativePointer) { - super(peer) +// TODO: specify arkts.Node type +export class SetAccessorDeclaration extends Node implements ts.SetAccessorDeclaration, FunctionLikeDeclarationBase, ClassElement { + constructor(node: arkts.Node) { + super(node) } - // TODO: support minimal interface - get parent(): any { return todo() } - // name: PropertyName + // readonly name: PropertyName + // readonly parameters: NodeArray + readonly kind: ts.SyntaxKind.SetAccessor = ts.SyntaxKind.SetAccessor + + // TODO: name: any - body?: Block | undefined - _functionLikeDeclarationBrand: any - asteriskToken?: ts.AsteriskToken | undefined - questionToken?: ts.QuestionToken | undefined - exclamationToken?: ts.ExclamationToken | undefined - typeParameters?: NodeArray | undefined - // parameters: NodeArray parameters: any - type?: TypeNode | undefined + + // brands + _functionLikeDeclarationBrand: any _declarationBrand: any - locals?: ts.SymbolTable | undefined - skipCheck?: boolean | undefined - decorators?: undefined _classElementBrand: any _typeElementBrand: any _objectLiteralBrand: any - kind: ts.SyntaxKind.SetAccessor = ts.SyntaxKind.SetAccessor } -*/ + export class ParameterDeclaration extends Node implements ts.ParameterDeclaration, NamedDeclaration { constructor(node: arkts.ETSParameterExpression) { super(node) @@ -645,58 +581,52 @@ export class ParameterDeclaration extends Node imp readonly kind: ts.SyntaxKind.Parameter = ts.SyntaxKind.Parameter - // TODO: support minimal interface - get name(): Identifier { return todo() } + // TODO: + name: any + + // brands _declarationBrand: any - dotDotDotToken?: ts.DotDotDotToken | undefined - questionToken?: ts.QuestionToken | undefined - type?: ts.TypeNode | undefined - initializer?: ts.Expression | undefined - locals?: ts.SymbolTable | undefined - skipCheck?: boolean | undefined - decorators?: undefined -} -/* -export type BindingName = Identifier | ts.BindingPattern; +} -// ets: VariableDeclaratorId -export class VariableDeclaration extends NodeBase implements ts.VariableDeclaration, NamedDeclaration { - constructor(peer: KNativePointer) { - super(peer) +export type BindingName = Identifier | ts.BindingPattern; - this.name = util.nodeByPeer(nativeModule._VariableDeclaratorId(global.context, this.peer)) as Identifier +export class VariableStatement extends Node implements ts.VariableStatement { + constructor(node: arkts.VariableDeclaration) { + super(node) + this.declarationList = new VariableDeclarationList(node) } - name: Identifier + readonly declarationList: VariableDeclarationList + readonly kind: ts.SyntaxKind.VariableStatement = ts.SyntaxKind.VariableStatement - // TODO: support minimal interface - get parent(): any { return todo() } - exclamationToken?: ts.ExclamationToken | undefined - type?: ts.TypeNode | undefined - initializer?: ts.Expression | undefined - _declarationBrand: any - locals?: ts.SymbolTable | undefined - skipCheck?: boolean | undefined - decorators?: undefined - kind: ts.SyntaxKind.VariableDeclaration = ts.SyntaxKind.VariableDeclaration + // brands + _statementBrand: any } -export class VariableDeclarationList extends NodeBase implements ts.VariableDeclarationList { - constructor(peer: KNativePointer) { - super(peer) - - this.declarations = util.unpack(nativeModule._VariableDeclarationDeclaratorsConst(global.context, this.peer)) as NodeArray +export class VariableDeclarationList extends Node implements ts.VariableDeclarationList { + constructor(node: arkts.VariableDeclaration) { + super(node) + this.declarations = unpackNodeArray(node.declarators) } - // TODO: support minimal interface - get parent(): any { return todo() } readonly declarations: NodeArray - locals?: ts.SymbolTable | undefined - skipCheck?: boolean | undefined - decorators?: undefined - kind: ts.SyntaxKind.VariableDeclarationList = ts.SyntaxKind.VariableDeclarationList + get flags(): ts.NodeFlags { return unpackVariableDeclarationKind(this.node.declarationKind) } + readonly kind: ts.SyntaxKind.VariableDeclarationList = ts.SyntaxKind.VariableDeclarationList +} + +export class VariableDeclaration extends Node implements ts.VariableDeclaration, NamedDeclaration { + constructor(node: arkts.VariableDeclarator) { + super(node) + this.name = unpackNode(node.name) + } + + readonly name: Identifier + readonly kind: ts.SyntaxKind.VariableDeclaration = ts.SyntaxKind.VariableDeclaration + + // brands + _declarationBrand: any } -*/ + export class TypeParameterDeclaration extends Node implements ts.TypeParameterDeclaration { constructor(node: arkts.TSTypeParameter) { super(node) @@ -706,21 +636,13 @@ export class TypeParameterDeclaration extends Node implem readonly name: Identifier readonly kind: ts.SyntaxKind.TypeParameter = ts.SyntaxKind.TypeParameter - // TODO: support minimal interface - constraint?: ts.TypeNode | undefined - default?: ts.TypeNode | undefined - expression?: ts.Expression | undefined + // brands _declarationBrand: any - locals?: ts.SymbolTable | undefined - skipCheck?: boolean | undefined - decorators?: undefined } -// TODO: should be interface, not abstract class export abstract class TypeNode extends Node implements ts.TypeNode { - // TODO: support minimal interface + // brands _typeNodeBrand: any - kind: any } export class KeywordTypeNode extends Node implements ts.KeywordTypeNode, TypeNode { @@ -730,7 +652,7 @@ export class KeywordTypeNode extends Node implements ts.TypeRefere readonly kind: ts.SyntaxKind.TypeReference = ts.SyntaxKind.TypeReference - // TODO: support minimal interface - _typeNodeBrand: any + // TODO: typeName: any + + // brands + _typeNodeBrand: any } -// export class FunctionTypeNode extends Node implements ts.FunctionTypeNode, TypeNode, SignatureDeclarationBase { -export class FunctionTypeNode extends Node implements ts.FunctionTypeNode, TypeNode { +export class FunctionTypeNode extends Node implements ts.FunctionTypeNode, TypeNode, SignatureDeclarationBase { constructor(node: arkts.Node) { super(node) } + readonly name?: DeclarationName readonly kind: ts.SyntaxKind.FunctionType = ts.SyntaxKind.FunctionType // TODO: support minimal interface - readonly name?: PropertyName; - get parameters(): NodeArray { return todo() } + parameters: any type: any + + // brands _typeNodeBrand: any _declarationBrand: any } @@ -771,11 +696,8 @@ export class UnionTypeNode extends Node implements ts.UnionT readonly types: NodeArray readonly kind: ts.SyntaxKind.UnionType = ts.SyntaxKind.UnionType - // TODO: support minimal interface + // brands _typeNodeBrand: any - locals?: ts.SymbolTable | undefined - skipCheck?: boolean | undefined - decorators?: undefined } export class ReturnStatement extends Node implements ts.ReturnStatement, Statement { @@ -787,7 +709,7 @@ export class ReturnStatement extends Node implements ts.R readonly expression: Expression | undefined readonly kind: ts.SyntaxKind.ReturnStatement = ts.SyntaxKind.ReturnStatement - // TODO: support minimal interface + // brands _statementBrand: any } @@ -798,9 +720,11 @@ export class IfStatement extends Node implements ts.IfStateme readonly kind: ts.SyntaxKind.IfStatement = ts.SyntaxKind.IfStatement - // TODO: support minimal interface + // TODO: thenStatement: any expression: any + + // brands _statementBrand: any } @@ -811,50 +735,55 @@ export class BinaryExpression extends Node implements ts readonly kind: ts.SyntaxKind.BinaryExpression = ts.SyntaxKind.BinaryExpression - // TODO: support minimal interface + // TODO: left: any right: any operatorToken: any + + // brands _expressionBrand: any _declarationBrand: any } -/* -export class AssignmentExpression extends NodeBase implements ts.AssignmentExpression { - constructor(peer: KNativePointer) { - super(peer) + +export class AssignmentExpression extends Node implements ts.AssignmentExpression { + constructor(node: arkts.AssignmentExpression) { + super(node) } - // TODO: support minimal interface + readonly kind: ts.SyntaxKind.BinaryExpression = ts.SyntaxKind.BinaryExpression + + // TODO: right: any + left: any + operatorToken: any + + // brands _expressionBrand: any _declarationBrand: any - readonly left: any - readonly operatorToken: any - kind: ts.SyntaxKind.BinaryExpression = ts.SyntaxKind.BinaryExpression } -*/ + export class ArrowFunction extends Node implements ts.ArrowFunction { constructor(node: arkts.ArrowFunctionExpression) { super(node) if (node.scriptFunction.body === undefined) { - global.throwError('node.scriptFunction.body not expected to be undefined') + throwError('node.scriptFunction.body not expected to be undefined') } this.body = unpackNode(node.scriptFunction.body) this.parameters = unpackNodeArray(node.scriptFunction.parameters) } + get name(): never { return throwError(`name doesn't exist for ArrowFunction`) } readonly body: Block readonly parameters: NodeArray readonly kind: ts.SyntaxKind.ArrowFunction = ts.SyntaxKind.ArrowFunction - // TODO: support minimal interface + // TODO: equalsGreaterThanToken: any + + // brands _expressionBrand: any _functionLikeDeclarationBrand: any _declarationBrand: any - get name(): never { - return global.throwError(`name doesn't exist for ArrowFunction`) - } } export class NumericLiteral extends Node implements ts.NumericLiteral, Declaration { @@ -865,8 +794,9 @@ export class NumericLiteral extends Node implements ts.Nume } readonly text: string + readonly kind: ts.SyntaxKind.NumericLiteral = ts.SyntaxKind.NumericLiteral - // TODO: support minimal interface + // brands _literalExpressionBrand: any _declarationBrand: any _primaryExpressionBrand: any @@ -875,31 +805,123 @@ export class NumericLiteral extends Node implements ts.Nume _updateExpressionBrand: any _unaryExpressionBrand: any _expressionBrand: any - readonly kind: ts.SyntaxKind.NumericLiteral = ts.SyntaxKind.NumericLiteral } -/* -// ets: VariableDeclaration -export class VariableStatement extends NodeBase implements ts.VariableStatement { - constructor(peer: KNativePointer) { - super(peer) - this.declarationList = factory.createVariableDeclarationList(util.unpack(nativeModule._VariableDeclarationDeclaratorsConst(global.context, this.peer)) as NodeArray) +export class SuperExpression extends Node implements ts.SuperExpression { + constructor(node: arkts.SuperExpression) { + super(node) } - // TODO: support minimal interface - readonly declarationList: VariableDeclarationList; + readonly kind: ts.SyntaxKind.SuperKeyword = ts.SyntaxKind.SuperKeyword + + // brands + _primaryExpressionBrand: any + _memberExpressionBrand: any + _leftHandSideExpressionBrand: any + _updateExpressionBrand: any + _unaryExpressionBrand: any + _expressionBrand: any +} + +export class HeritageClause extends Node implements ts.HeritageClause { + constructor(node: arkts.SuperExpression) { + super(node) + } + + readonly kind: ts.SyntaxKind.HeritageClause = ts.SyntaxKind.HeritageClause + // token: ts.SyntaxKind.ExtendsKeyword | ts.SyntaxKind.ImplementsKeyword + // types: ts.NodeArray + + // TODO: + token: any + types: any +} + + +// TODO: there is no ParenthesizedExpression in ArkTS, +// so for temporary solution we're just gonna ignore this type of nodes +// and replace it with Expression underneath +export type ParenthesizedExpression = Expression +// export class ParenthesizedExpression extends Node implements ts.ParenthesizedExpression { +// constructor(expression: Expression) { +// super(undefined) +// this.expression = expression +// } + +// readonly expression: Expression +// readonly kind: ts.SyntaxKind.ParenthesizedExpression = ts.SyntaxKind.ParenthesizedExpression + +// // brands +// _primaryExpressionBrand: any +// _memberExpressionBrand: any +// _leftHandSideExpressionBrand: any +// _updateExpressionBrand: any +// _unaryExpressionBrand: any +// _expressionBrand: any +// } + +// TODO: +export class ImportDeclaration extends Node implements ts.ImportDeclaration { + constructor(node: arkts.UnsupportedNode) { + super(node) + } + + readonly kind: ts.SyntaxKind.ImportDeclaration = ts.SyntaxKind.ImportDeclaration + + // TODO: + moduleSpecifier: any + + // brands _statementBrand: any - locals?: ts.SymbolTable | undefined - skipCheck?: boolean | undefined - decorators?: undefined - readonly kind: ts.SyntaxKind.VariableStatement = ts.SyntaxKind.VariableStatement } -*/ + +// TODO: +export class ImportClause extends Node implements ts.ImportClause { + constructor(node: arkts.UnsupportedNode) { + super(node) + } + + readonly kind: ts.SyntaxKind.ImportClause = ts.SyntaxKind.ImportClause + + // TODO: + isTypeOnly: any + + // brands + _declarationBrand: any +} + +// TODO: +export class NamedImports extends Node implements ts.NamedImports { + constructor(node: arkts.UnsupportedNode) { + super(node) + } + + readonly kind: ts.SyntaxKind.NamedImports = ts.SyntaxKind.NamedImports + + // TODO: + elements: any +} + +export class ImportSpecifier extends Node implements ts.ImportSpecifier { + constructor(node: arkts.Identifier) { + super(node) + this.name = unpackNode(this.node) + } + + readonly name: Identifier + readonly kind: ts.SyntaxKind.ImportSpecifier = ts.SyntaxKind.ImportSpecifier + + // TODO: + isTypeOnly: any + + // brands + _declarationBrand: any +} export class UnsupportedNode extends Node implements ts.Node { constructor(node: arkts.Node) { super(node) } - kind: ts.SyntaxKind = SyntaxKind.Unknown + readonly kind: ts.SyntaxKind = SyntaxKind.Unknown } diff --git a/arkoala-arkts/libarkts/src/api/layers/ts/utilities.ts b/arkoala-arkts/libarkts/src/ts-api/utilities/private.ts similarity index 36% rename from arkoala-arkts/libarkts/src/api/layers/ts/utilities.ts rename to arkoala-arkts/libarkts/src/ts-api/utilities/private.ts index 4a7fea601..d37bced87 100644 --- a/arkoala-arkts/libarkts/src/api/layers/ts/utilities.ts +++ b/arkoala-arkts/libarkts/src/ts-api/utilities/private.ts @@ -13,26 +13,36 @@ * limitations under the License. */ -import * as ts from "./types" -import * as arkts from "../arkts/types" -import global from "../../static/global" +import global from "../../arkts-api/static/global" +import { throwError } from "../../utils" +import { nativeModule } from "../../nativeModule" +import { KNativePointer, withString } from "@koalaui/interop" + +import * as ts from "../" +import * as arkts from "../../arkts-api" import { KInt } from "@koalaui/interop" import { - es2pandaKind, + SyntaxKind, + TokenSyntaxKind, + NodeFlags, +} from "../static/enums" +import { + Es2pandaAstNodeType, Es2pandaModifierFlags, Es2pandaScriptFunctionFlags, - TokenSyntaxKind, -} from "../../static/enums" + Es2pandaTokenType, + Es2pandaVariableDeclarationKind, +} from "../../arkts-api/static/enums" export function todo(): any { - global.throwError("Not yet implemented") + throwError("Not yet implemented") } type kindTypes = | { new (node: arkts.Node): ts.Node } | { new (node: arkts.Identifier): ts.Identifier } - | { new (node: arkts.Program): ts.SourceFile } + | { new (node: arkts.EtsScript): ts.SourceFile } | { new (node: arkts.StringLiteral): ts.StringLiteral } | { new (node: arkts.NumberLiteral): ts.NumericLiteral } | { new (node: arkts.ExpressionStatement): ts.ExpressionStatement } @@ -40,7 +50,7 @@ type kindTypes = | { new (node: arkts.ReturnStatement): ts.ReturnStatement } | { new (node: arkts.ETSParameterExpression): ts.ParameterDeclaration } | { new (node: arkts.CallExpression): ts.CallExpression } - | { new (node: arkts.Block): ts.Block } + | { new (node: arkts.BlockStatement): ts.Block } | { new (node: arkts.TSTypeParameter): ts.TypeParameterDeclaration} | { new (node: arkts.MemberExpression): ts.PropertyAccessExpression} | { new (node: arkts.IfStatement): ts.IfStatement} @@ -51,35 +61,42 @@ type kindTypes = | { new (node: arkts.ArrowFunctionExpression): ts.ArrowFunction } | { new (node: arkts.ClassDeclaration): ts.ClassDeclaration } | { new (node: arkts.MethodDefinition): ts.MethodDeclaration } + | { new (node: arkts.VariableDeclarator): ts.VariableDeclaration } + | { new (node: arkts.VariableDeclaration): ts.VariableStatement } export function classByEtsNode(node: arkts.Node) { - const kinds = - new Map([ - // [es2pandaKind.UnsupportedNode, ets.UnsupportedNode], - - [es2pandaKind.Program, ts.SourceFile], - [es2pandaKind.Identifier, ts.Identifier], - [es2pandaKind.StringLiteral, ts.StringLiteral], - [es2pandaKind.NumberLiteral, ts.NumericLiteral], - [es2pandaKind.ExpressionStatement, ts.ExpressionStatement], - [es2pandaKind.FunctionDeclaration, ts.FunctionDeclaration], - [es2pandaKind.ReturnStatement, ts.ReturnStatement], - [es2pandaKind.ETSParameterExpression, ts.ParameterDeclaration], - [es2pandaKind.CallExpression, ts.CallExpression], - [es2pandaKind.Block, ts.Block], - [es2pandaKind.ETSTypeReference, ts.TypeReferenceNode], - [es2pandaKind.TSTypeParameter, ts.TypeParameterDeclaration], - [es2pandaKind.MemberExpression, ts.PropertyAccessExpression], - [es2pandaKind.IfStatement, ts.IfStatement], - [es2pandaKind.ETSPrimitiveType, ts.KeywordTypeNode], - [es2pandaKind.BinaryExpression, ts.BinaryExpression], - [es2pandaKind.ETSUnionType, ts.UnionTypeNode], - [es2pandaKind.ArrowFunctionExpression, ts.ArrowFunction], - [es2pandaKind.ClassDeclaration, ts.ClassDeclaration], - [es2pandaKind.MethodDefinition, ts.MethodDeclaration], + const types = + new Map([ + [Es2pandaAstNodeType.AST_NODE_TYPE_ETS_SCRIPT, ts.SourceFile], + [Es2pandaAstNodeType.AST_NODE_TYPE_IDENTIFIER, ts.Identifier], + [Es2pandaAstNodeType.AST_NODE_TYPE_STRING_LITERAL, ts.StringLiteral], + [Es2pandaAstNodeType.AST_NODE_TYPE_NUMBER_LITERAL, ts.NumericLiteral], + [Es2pandaAstNodeType.AST_NODE_TYPE_EXPRESSION_STATEMENT, ts.ExpressionStatement], + [Es2pandaAstNodeType.AST_NODE_TYPE_FUNCTION_DECLARATION, ts.FunctionDeclaration], + [Es2pandaAstNodeType.AST_NODE_TYPE_RETURN_STATEMENT, ts.ReturnStatement], + [Es2pandaAstNodeType.AST_NODE_TYPE_ETS_PARAMETER_EXPRESSION, ts.ParameterDeclaration], + [Es2pandaAstNodeType.AST_NODE_TYPE_CALL_EXPRESSION, ts.CallExpression], + [Es2pandaAstNodeType.AST_NODE_TYPE_BLOCK_STATEMENT, ts.Block], + [Es2pandaAstNodeType.AST_NODE_TYPE_ETS_TYPE_REFERENCE, ts.TypeReferenceNode], + [Es2pandaAstNodeType.AST_NODE_TYPE_TS_TYPE_PARAMETER, ts.TypeParameterDeclaration], + [Es2pandaAstNodeType.AST_NODE_TYPE_MEMBER_EXPRESSION, ts.PropertyAccessExpression], + [Es2pandaAstNodeType.AST_NODE_TYPE_IF_STATEMENT, ts.IfStatement], + [Es2pandaAstNodeType.AST_NODE_TYPE_ETS_PRIMITIVE_TYPE, ts.KeywordTypeNode], + [Es2pandaAstNodeType.AST_NODE_TYPE_BINARY_EXPRESSION, ts.BinaryExpression], + [Es2pandaAstNodeType.AST_NODE_TYPE_ETS_UNION_TYPE, ts.UnionTypeNode], + [Es2pandaAstNodeType.AST_NODE_TYPE_ARROW_FUNCTION_EXPRESSION, ts.ArrowFunction], + [Es2pandaAstNodeType.AST_NODE_TYPE_CLASS_DECLARATION, ts.ClassDeclaration], + [Es2pandaAstNodeType.AST_NODE_TYPE_METHOD_DEFINITION, ts.MethodDeclaration], + [Es2pandaAstNodeType.AST_NODE_TYPE_VARIABLE_DECLARATION, ts.VariableStatement], + [Es2pandaAstNodeType.AST_NODE_TYPE_VARIABLE_DECLARATOR, ts.VariableDeclaration], + [Es2pandaAstNodeType.AST_NODE_TYPE_SUPER_EXPRESSION, ts.SuperExpression], + + [Es2pandaAstNodeType.AST_NODE_TYPE_CLASS_STATIC_BLOCK, ts.UnsupportedNode], + [Es2pandaAstNodeType.AST_NODE_TYPE_CLASS_PROPERTY, ts.UnsupportedNode], + [Es2pandaAstNodeType.AST_NODE_TYPE_ETS_IMPORT_DECLARATION, ts.UnsupportedNode], ]) - return kinds.get(node.kind) ?? global.throwError(`UNSUPPORTED NODE (ts): ${es2pandaKind[node.kind]}`) + return types.get(node.type) ?? throwError(`UNSUPPORTED NODE (ts): ${Es2pandaAstNodeType[node.type]}`) } // TODO: add checks for casts in functions below @@ -99,7 +116,7 @@ export function passNode(node: ts.Node | undefined): T if (node === undefined) { return undefined } - return (node.node as T) ?? global.throwError('trying to pass non-compatible node') + return (node.node as T) ?? throwError('trying to pass non-compatible node') } export function unpackNodeArray >(nodes: readonly U[]): ts.NodeArray @@ -114,29 +131,105 @@ export function passNodeArray(nodes: readonly ts.Node[] return nodes?.map((node: ts.Node) => passNode(node)) } -function* bits(flags: KInt) { - let bit: KInt = 1 - while (flags >= bit) { - if ((flags & bit) > 0) { - yield bit - } - bit <<= 1 +export function passIdentifier(node: ts.Identifier | string, typeAnnotation?: ts.TypeNode): arkts.Identifier +export function passIdentifier(node: ts.Identifier | string | undefined, typeAnnotation?: ts.TypeNode): arkts.Identifier | undefined +export function passIdentifier(node: ts.Identifier | string | undefined, typeAnnotation?: ts.TypeNode): arkts.Identifier | undefined { + if (node === undefined) { + return undefined + } + if (node instanceof ts.Identifier) { + if (typeAnnotation === undefined) { + return node.node + } + return arkts.Identifier.create( + node.node.name, + passNode(typeAnnotation) + ) + } + return arkts.Identifier.create( + node, + passNode(typeAnnotation) + ) +} + +// TODO: support unrequired params (with ?) +export function passTypeParams(params: readonly ts.TypeParameterDeclaration[] | undefined): arkts.TSTypeParameterDeclaration | undefined { + if (params === undefined) { + return undefined } + return arkts.TSTypeParameterDeclaration.create( + undefined, + passNodeArray(params) + ) } -// TODO: rewrite export function unpackModifiers(modifiers: KInt | undefined): ts.NodeArray { + const translation = new Map([ + // [Es2pandaModifierFlags.MODIFIER_FLAGS_NONE, SyntaxKind.UnknownKeyword], + // [Es2pandaModifierFlags.MODIFIER_FLAGS_CONSTRUCTOR, SyntaxKind.ConstructorKeyword], + + [Es2pandaModifierFlags.MODIFIER_FLAGS_ABSTRACT, SyntaxKind.AbstractKeyword], + // TODO: unsupported + // [Es2pandaModifierFlags. , SyntaxKind.AccessorKeyword], + [Es2pandaModifierFlags.MODIFIER_FLAGS_ASYNC, SyntaxKind.AsyncKeyword], + [Es2pandaModifierFlags.MODIFIER_FLAGS_CONST, SyntaxKind.ConstKeyword], + [Es2pandaModifierFlags.MODIFIER_FLAGS_DECLARE, SyntaxKind.DeclareKeyword], + // TODO: choose one + // [Es2pandaModifierFlags.MODIFIER_FLAGS_DEFAULT_EXPORT, SyntaxKind.DefaultClause], + // [Es2pandaModifierFlags.MODIFIER_FLAGS_DEFAULT_EXPORT, SyntaxKind.DefaultKeyword], + [Es2pandaModifierFlags.MODIFIER_FLAGS_EXPORT, SyntaxKind.ExportKeyword], + [Es2pandaModifierFlags.MODIFIER_FLAGS_IN, SyntaxKind.InKeyword], + [Es2pandaModifierFlags.MODIFIER_FLAGS_PRIVATE, SyntaxKind.PrivateKeyword], + [Es2pandaModifierFlags.MODIFIER_FLAGS_PROTECTED, SyntaxKind.ProtectedKeyword], + [Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC, SyntaxKind.PublicKeyword], + [Es2pandaModifierFlags.MODIFIER_FLAGS_OUT, SyntaxKind.OutKeyword], + [Es2pandaModifierFlags.MODIFIER_FLAGS_OVERRIDE, SyntaxKind.OverrideKeyword], + [Es2pandaModifierFlags.MODIFIER_FLAGS_READONLY, SyntaxKind.ReadonlyKeyword], + [Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC, SyntaxKind.StaticKeyword], + ]) + + const bits = function*(flags: KInt) { + let bit: KInt = 1 + while (flags >= bit) { + if ((flags & bit) > 0) { + yield bit + } + bit <<= 1 + } + } if (modifiers === undefined) { return [] as ReadonlyArray as ts.NodeArray } let mods: ts.Modifier[] = [] for (const bit of bits(modifiers)) { - mods.push(new ts.Modifier(global.translateModifiers.get(bit) ?? global.throwError(`Unsupported modifier: ${bit}`))) + mods.push(new ts.Modifier(translation.get(bit) ?? throwError(`Unsupported modifier: ${bit}`))) } return mods as ReadonlyArray as ts.NodeArray } export function passModifiers(modifiers: ReadonlyArray | undefined): KInt { + const translation = new Map([ + // [SyntaxKind.UnknownKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_NONE], + // [SyntaxKind.ConstructorKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_CONSTRUCTOR], + + [SyntaxKind.AbstractKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_ABSTRACT], + // TODO: unsupported + // [SyntaxKind.AccessorKeyword, Es2pandaModifierFlags.], + [SyntaxKind.AsyncKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_ASYNC], + [SyntaxKind.ConstKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_CONST], + [SyntaxKind.DeclareKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_DECLARE], + [SyntaxKind.DefaultKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_DEFAULT_EXPORT], + [SyntaxKind.ExportKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_EXPORT], + [SyntaxKind.InKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_IN], + [SyntaxKind.PrivateKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_PRIVATE], + [SyntaxKind.ProtectedKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_PROTECTED], + [SyntaxKind.PublicKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC], + [SyntaxKind.OutKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_OUT], + [SyntaxKind.OverrideKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_OVERRIDE], + [SyntaxKind.ReadonlyKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_READONLY], + [SyntaxKind.StaticKeyword, Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC], + ]) + if (modifiers === undefined) { return Es2pandaModifierFlags.MODIFIER_FLAGS_NONE } @@ -146,7 +239,7 @@ export function passModifiers(modifiers: ReadonlyArray(token: ts.Token): KInt { - return global.tokenKinds.get(token.kind) ?? global.throwError('unsupported token') -} + const translation = new Map([ + [SyntaxKind.PlusToken, Es2pandaTokenType.TOKEN_TYPE_PUNCTUATOR_PLUS], + [SyntaxKind.MinusToken, Es2pandaTokenType.TOKEN_TYPE_PUNCTUATOR_MINUS], + [SyntaxKind.AsteriskToken, Es2pandaTokenType.TOKEN_TYPE_PUNCTUATOR_MULTIPLY], + ]) -function passScriptFuncModifier(modifierToken: ts.Modifier): Es2pandaScriptFunctionFlags { - return global.scriptFunctionFlags.get(modifierToken.kind) ?? global.throwError(`Unsupported ScriptFunction flag: ${modifierToken.kind}`) + return translation.get(token.kind) ?? throwError('unsupported token') } export function passModifiersToScriptFunction(modifiers: readonly ts.Modifier[] | undefined): KInt { + const translation = new Map([ + [SyntaxKind.StaticKeyword, Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_STATIC_BLOCK], + [SyntaxKind.AsyncKeyword, Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_ASYNC], + [SyntaxKind.PublicKeyword, Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_NONE], + ]) + return modifiers?.reduce( - (prev, curr) => prev | passScriptFuncModifier(curr), + (prev, curr) => prev | (translation.get(curr.kind) ?? throwError(`Unsupported ScriptFunction flag: ${curr.kind}`)), Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_NONE ) ?? Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_NONE } -// export function passModifier(modifierToken: arkts.Modifier): Es2pandaModifierFlags { -// return global.modifierFlags.get(modifierToken.kind) ?? global.throwError(`Unsupported Modifier flag: ${modifierToken.kind}`) -// } +export function passVariableDeclarationKind(flags: NodeFlags): Es2pandaVariableDeclarationKind { + const translation = new Map([ + [NodeFlags.Const, Es2pandaVariableDeclarationKind.CONST], + [NodeFlags.Let, Es2pandaVariableDeclarationKind.LET], + [NodeFlags.None, Es2pandaVariableDeclarationKind.VAR], + ]) -// export function passModifiers(modifiers: readonly arkts.Modifier[] | undefined): KInt { -// return modifiers?.reduce( -// (prev, curr) => prev | passModifier(curr), -// Es2pandaModifierFlags.MODIFIER_FLAGS_NONE -// ) ?? Es2pandaModifierFlags.MODIFIER_FLAGS_NONE -// } + return translation.get(flags) ?? throwError('unsupported VariableDeclarationKind') +} + +export function unpackVariableDeclarationKind(kind: Es2pandaVariableDeclarationKind): NodeFlags { + const translation = new Map([ + [Es2pandaVariableDeclarationKind.CONST, NodeFlags.Const], + [Es2pandaVariableDeclarationKind.LET, NodeFlags.Let], + [Es2pandaVariableDeclarationKind.VAR, NodeFlags.None], + ]) + + return translation.get(kind) ?? throwError('unsupported VariableDeclarationKind') +} diff --git a/arkoala-arkts/libarkts/src/ts-api/utilities/public.ts b/arkoala-arkts/libarkts/src/ts-api/utilities/public.ts new file mode 100644 index 000000000..7ffe8302f --- /dev/null +++ b/arkoala-arkts/libarkts/src/ts-api/utilities/public.ts @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2022-2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import global from "../../arkts-api/static/global" +import { throwError } from "../../utils" +import * as ts from "../." +import * as arkts from "../../arkts-api" +import { nativeModule } from "../../nativeModule" +import { KNativePointer, withString, withStringArray, withStringResult } from "@koalaui/interop" + +import { createConfig } from "../../arkts-api/utilities/public" +export { createConfig } + +import { createContextFromString } from "../../arkts-api/utilities/public" +export { createContextFromString } + +import { proceedToState } from "../../arkts-api/utilities/public" +export { proceedToState } + +import { startChecker } from "../../arkts-api/utilities/public" +export { startChecker } + +// TODO: like in arkts utils +export function getDecl(node: ts.Node): ts.Node | undefined { + if (node.node === undefined) { + throwError('there is no arkts pair of ts node (unable to getDecl)') + } + let decl: KNativePointer = node.node.peer + decl = nativeModule._AstNodeVariableConst(global.context, decl) + if (decl === arkts.NULLPTR) { + return undefined + } + decl = nativeModule._VariableDeclaration(global.context, decl) + if (decl === arkts.NULLPTR) { + return undefined + } + decl = nativeModule._DeclNode(global.context, decl) + if (decl === arkts.NULLPTR) { + return undefined + } + return ts.unpackNode(arkts.unpackNonNullableNode(decl)) +} + +// TODO: like in arkts utils +export function getOriginalNode(node: ts.Node): ts.Node { + if (node.node === undefined) { + // TODO: fix this + throwError('there is no arkts pair of ts node (unable to getOriginalNode)') + } + if (node.node.originalPeer === arkts.NULLPTR) { + return node + } + return ts.unpackNode(arkts.unpackNonNullableNode(node.node.originalPeer)) +} diff --git a/arkoala-arkts/libarkts/src/api/visitor/visitor.ts b/arkoala-arkts/libarkts/src/ts-api/visitor/visitor.ts similarity index 84% rename from arkoala-arkts/libarkts/src/api/visitor/visitor.ts rename to arkoala-arkts/libarkts/src/ts-api/visitor/visitor.ts index 9940cbd74..7790966af 100644 --- a/arkoala-arkts/libarkts/src/api/visitor/visitor.ts +++ b/arkoala-arkts/libarkts/src/ts-api/visitor/visitor.ts @@ -1,6 +1,7 @@ -import global from "../static/global" +import global from "../../arkts-api/static/global" +import { throwError } from "../../utils" -import * as ts from "../layers/ts" +import * as ts from "../." import { factory } from "../factory/nodeFactory" import { SyntaxKind } from "../static/enums" @@ -34,8 +35,8 @@ type HasChildren = | ts.ClassDeclaration | ts.MethodDeclaration | ts.Block - // | ts.VariableStatement - // | ts.VariableDeclarationList + | ts.VariableStatement + | ts.VariableDeclarationList type VisitEachChildTable = { [TNode in HasChildren as TNode["kind"]]: VisitEachChildFunction } @@ -109,19 +110,19 @@ const visitEachChildTable: VisitEachChildTable = { nodesVisitor(node.statements, visitor), ) }, - // [SyntaxKind.VariableStatement]: function (node: ts.VariableStatement, visitor: Visitor) { - // return factory.updateVariableStatement( - // node, - // undefined, - // nodeVisitor(node.declarationList, visitor), - // ) - // }, - // [SyntaxKind.VariableDeclarationList]: function (node: ts.VariableDeclarationList, visitor: Visitor) { - // return factory.updateVariableDeclarationList( - // node, - // nodesVisitor(node.declarations, visitor), - // ) - // }, + [SyntaxKind.VariableStatement]: function (node: ts.VariableStatement, visitor: Visitor) { + return factory.updateVariableStatement( + node, + undefined, + nodeVisitor(node.declarationList, visitor), + ) + }, + [SyntaxKind.VariableDeclarationList]: function (node: ts.VariableDeclarationList, visitor: Visitor) { + return factory.updateVariableDeclarationList( + node, + nodesVisitor(node.declarations, visitor), + ) + }, } function nodeHasChildren(node: ts.Node): node is HasChildren { @@ -134,7 +135,7 @@ export function visitEachChild( ): T { const visitFunc = (visitEachChildTable as Record | undefined>)[node.kind]; if (nodeHasChildren(node) && visitFunc === undefined) { - global.throwError('Unsupported node kind: ' + node.kind) + throwError('Unsupported node kind: ' + node.kind) } return (visitFunc === undefined) ? node : visitFunc(node, visitor); } diff --git a/arkoala-arkts/libarkts/src/utils.ts b/arkoala-arkts/libarkts/src/utils.ts new file mode 100644 index 000000000..e13114bb7 --- /dev/null +++ b/arkoala-arkts/libarkts/src/utils.ts @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2022-2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export function throwError(error: string): never { + throw new Error(error) +} + +export function webpackUnoptimizableImport(path: string): any { + return require(/* webpackIgnore: true */ path) +} \ No newline at end of file diff --git a/arkoala-arkts/libarkts/test/arkts-api/expressions/call-expression.test.ts b/arkoala-arkts/libarkts/test/arkts-api/expressions/call-expression.test.ts new file mode 100644 index 000000000..412fd5a3d --- /dev/null +++ b/arkoala-arkts/libarkts/test/arkts-api/expressions/call-expression.test.ts @@ -0,0 +1,53 @@ +import * as util from "../../test-util" +import * as arkts from "../../../src/arkts-api" +import { factory } from "../../../src/arkts-api/factory/nodeFactory" + +suite(util.getSuiteTitle(__filename), () => { + test("sample-1", function() { + const sample_in = + ` + function _() {}; + ` + + const sample_out = + ` + function _() {}; + console.log('out') + ` + + let script = arkts.EtsScript.create(sample_in) + + script = arkts.EtsScript.update( + script, + [ + script.statements[0], + factory.createExpressionStatement( + factory.createCallExpression( + factory.createMemberExpression( + factory.createIdentifier( + 'console' + ), + arkts.Identifier.create( + 'log' + ), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + undefined, + [ + arkts.StringLiteral.create(undefined, + 'out' + ) + ] + ) + ) + ] + ) + + util.ARKTS_TEST_ASSERTION( + script, + sample_out + ) + }) +}) diff --git a/arkoala-arkts/libarkts/test/arkts-api/functions/create.test.ts b/arkoala-arkts/libarkts/test/arkts-api/functions/create.test.ts new file mode 100644 index 000000000..8b4be488f --- /dev/null +++ b/arkoala-arkts/libarkts/test/arkts-api/functions/create.test.ts @@ -0,0 +1,212 @@ +import * as util from "../../test-util" +import * as arkts from "../../../src/arkts-api" +import { factory } from "../../../src/arkts-api/factory/nodeFactory" + +suite(util.getSuiteTitle(__filename), () => { + test("sample-1", function() { + const sample_in = + ` + function _() {}; + ` + + const sample_out = + ` + function _() {}; + function foo() { + console.log("AAA") + } + foo() + ` + + let script = arkts.EtsScript.create(sample_in) + + script = arkts.EtsScript.update( + script, + [ + script.statements[0], + arkts.FunctionDeclaration.create(undefined, + arkts.ScriptFunction.create(undefined, + arkts.BlockStatement.create(undefined, + [ + factory.createExpressionStatement( + factory.createCallExpression( + factory.createMemberExpression( + factory.createIdentifier( + 'console' + ), + factory.createIdentifier( + 'log' + ), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + undefined, + [ + arkts.StringLiteral.create(undefined, + 'AAA' + ) + ] + ) + ) + ] + ), + arkts.FunctionSignature.create(undefined, + [], + undefined + ), + arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_NONE, + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC | arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC, + false, + factory.createIdentifier( + 'foo' + ) + ), + false + ), + factory.createExpressionStatement( + factory.createCallExpression( + factory.createIdentifier( + 'foo' + ), + undefined, + [] + ) + ) + ] + ) + + util.ARKTS_TEST_ASSERTION( + script, + sample_out + ) + }) + + test("sample-2", function() { + const sample_in = + ` + function _() {}; + ` + + const sample_out = + ` + function _() {}; + function foo(x: int, y: string = "bbb") { + console.log(x) + console.log(y) + } + foo(0) + ` + + let script = arkts.EtsScript.create(sample_in) + + script = arkts.EtsScript.update( + script, + [ + script.statements[0], + arkts.FunctionDeclaration.create(undefined, + arkts.ScriptFunction.create(undefined, + arkts.BlockStatement.create(undefined, + [ + factory.createExpressionStatement( + factory.createCallExpression( + factory.createMemberExpression( + factory.createIdentifier( + 'console' + ), + factory.createIdentifier( + 'log' + ), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + undefined, + [ + factory.createIdentifier( + 'x' + ) + ] + ) + ), + factory.createExpressionStatement( + factory.createCallExpression( + factory.createMemberExpression( + factory.createIdentifier( + 'console' + ), + factory.createIdentifier( + 'log' + ), + arkts.Es2pandaMemberExpressionKind.MEMBER_EXPRESSION_KIND_PROPERTY_ACCESS, + false, + false + ), + undefined, + [ + factory.createIdentifier( + 'y' + ) + ] + ) + ) + ] + ), + arkts.FunctionSignature.create(undefined, + [ + arkts.ETSParameterExpression.create(undefined, + factory.createIdentifier( + 'x', + arkts.ETSPrimitiveType.create(undefined, + arkts.Es2pandaPrimitiveType.PRIMITIVE_TYPE_INT + ) + ), + undefined + ), + arkts.ETSParameterExpression.create(undefined, + factory.createIdentifier( + 'y', + arkts.ETSTypeReference.create(undefined, + factory.createIdentifier( + 'string' + ) + ) + ), + arkts.StringLiteral.create(undefined, + 'bbb' + ) + ) + ], + undefined + ), + arkts.Es2pandaScriptFunctionFlags.SCRIPT_FUNCTION_FLAGS_NONE, + arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_PUBLIC | arkts.Es2pandaModifierFlags.MODIFIER_FLAGS_STATIC, + false, + factory.createIdentifier( + 'foo' + ) + ), + false + ), + factory.createExpressionStatement( + factory.createCallExpression( + factory.createIdentifier( + 'foo' + ), + undefined, + [ + arkts.NumberLiteral.create(undefined, + '0' + ) + ] + ) + ) + ] + ) + + util.ARKTS_TEST_ASSERTION( + script, + sample_out + ) + }) +}) diff --git a/arkoala-arkts/libarkts/test/arkts-api/general/basic.test.ts b/arkoala-arkts/libarkts/test/arkts-api/general/basic.test.ts new file mode 100644 index 000000000..fbed1255a --- /dev/null +++ b/arkoala-arkts/libarkts/test/arkts-api/general/basic.test.ts @@ -0,0 +1,33 @@ +import * as util from "../../test-util" +import * as arkts from "../../../src/arkts-api" +import * as ts from "../../../src/ts-api" +import { factory } from "../../../src/arkts-api/factory/nodeFactory" + +suite(util.getSuiteTitle(__filename), () => { + test("sample-1", function() { + const sample_in = + ` + ` + + let script = arkts.EtsScript.create(sample_in) + + script = arkts.EtsScript.update( + script, + [ + factory.createExpressionStatement( + factory.createIdentifier( + 'abc' + ) + ) + ] + ) + + util.ARKTS_TEST_ASSERTION( + script, + ` + abc + `, + ts.ContextState.ES2PANDA_STATE_PARSED + ) + }) +}) diff --git a/arkoala-arkts/libarkts/test/arkts-api/import-export/import.test.ts b/arkoala-arkts/libarkts/test/arkts-api/import-export/import.test.ts new file mode 100644 index 000000000..3c2c13dd3 --- /dev/null +++ b/arkoala-arkts/libarkts/test/arkts-api/import-export/import.test.ts @@ -0,0 +1,209 @@ +import * as util from "../../test-util" +import * as arkts from "../../../src/arkts-api" +import * as ts from "../../../src/ts-api" +import { factory } from "../../../src/arkts-api/factory/nodeFactory" + +suite(util.getSuiteTitle(__filename), () => { + test("sample-1", function() { + const sample_in = + ` + ` + + let script = arkts.EtsScript.create(sample_in) + + script = arkts.EtsScript.update( + script, + [ + arkts.EtsImportDeclaration.create( + undefined, + arkts.StringLiteral.create( + undefined, + './variable' + ), + [ + arkts.ImportSpecifier.create( + undefined, + factory.createIdentifier( + 'X' + ), + factory.createIdentifier( + 'X' + ) + ) + ], + arkts.Es2pandaImportKinds.VALUE, + true + ) + ] + ) + + util.ARKTS_TEST_ASSERTION( + script, + ` + import { X } from "./variable" + `, + ts.ContextState.ES2PANDA_STATE_PARSED + ) + }) + + test("sample-2-rewrite", function() { + const sample_in = + ` + import { Y } from "./variable" + ` + + let script = arkts.EtsScript.create(sample_in) + const importDeclaration = script.statements[0] as arkts.EtsImportDeclaration + + script = arkts.EtsScript.update( + script, + [ + arkts.EtsImportDeclaration.create( + importDeclaration, + importDeclaration.importSource, + [ + arkts.ImportSpecifier.create( + undefined, + factory.createIdentifier( + 'X' + ), + factory.createIdentifier( + 'X' + ) + ) + ], + arkts.Es2pandaImportKinds.VALUE, + importDeclaration.hasDecl + ) + ] + ) + + util.ARKTS_TEST_ASSERTION( + script, + ` + import { X } from "./variable" + `, + ts.ContextState.ES2PANDA_STATE_PARSED + ) + }) + + test("rewrite-imported-variable", function() { + const sample_in = + ` + import { Y } from "./variable" + + function main() { + console.log(X) + } + ` + + let script = arkts.EtsScript.create(sample_in) + const importDeclaration = script.statements[0] as arkts.EtsImportDeclaration + + script = arkts.EtsScript.update( + script, + [ + arkts.EtsImportDeclaration.create( + importDeclaration, + importDeclaration.importSource, + [ + arkts.ImportSpecifier.create( + undefined, + factory.createIdentifier( + 'X' + ), + factory.createIdentifier( + 'X' + ) + ) + ], + arkts.Es2pandaImportKinds.VALUE, + importDeclaration.hasDecl + ), + script.statements[1] + ] + ) + + util.ARKTS_TEST_ASSERTION( + script, + ` + import { X } from "./variable" + + function main() { + console.log(X) + } + `, + ts.ContextState.ES2PANDA_STATE_PARSED + ) + + // util.cleanGenerated() + // util.fileToAbc(`./input/variable.sts`, true) + // util.contextToAbc() + // util.runAbc(`./generated/main.abc`, ['./generated/variable.abc']) + }) + + test("rewrite-imported-function", function() { + const sample_in = + ` + import { f } from "./f" + function main() {} + ` + + let script = arkts.EtsScript.create(sample_in) + const functionDeclaration: arkts.FunctionDeclaration = script.statements[1] as arkts.FunctionDeclaration + const scriptFunction: arkts.ScriptFunction = functionDeclaration.scriptFunction + + script = arkts.EtsScript.update( + script, + [ + script.statements[0], + arkts.FunctionDeclaration.create( + functionDeclaration, + arkts.ScriptFunction.create( + scriptFunction, + arkts.BlockStatement.create( + undefined, + [ + factory.createExpressionStatement( + arkts.CallExpression.create( + factory.createIdentifier( + 'f' + ), + undefined, + [] + ) + ) + ] + ), + arkts.FunctionSignature.create( + undefined, + [], + undefined + ), + scriptFunction.scriptFunctionFlags, + scriptFunction.modifiers, + scriptFunction.declare, + scriptFunction.ident + ), + false + ) + ] + ) + + util.ARKTS_TEST_ASSERTION( + script, + ` + import { f } from "./f" + function main() { + f() + } + `, + ts.ContextState.ES2PANDA_STATE_PARSED + ) + + // util.cleanGenerated() + // util.fileToAbc(`./input/f.sts`, true) + // util.contextToAbc() + // util.runAbc(`./generated/main.abc`, ['./generated/f.abc']) + }) +}) diff --git a/arkoala-arkts/libarkts/test/es2panda/function-rewrite.test.ts b/arkoala-arkts/libarkts/test/es2panda/function-rewrite.test.ts deleted file mode 100644 index a69aa515e..000000000 --- a/arkoala-arkts/libarkts/test/es2panda/function-rewrite.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import * as util from "../test-util" -import * as ts from "../../src/api" -// import { FunctionTransformer } from "../../compatible/src/function-transformer" - -// TODO: update scopes (transforming after check) -suite.skip(util.getSuiteTitle(__filename), () => { - test("function-transformer-sample-1", function() { - const sample_in = - ` - const x: string = "A" - - function _REWRITE_foo() { - console.log("FUNC CALLED: " + x) - } - - _REWRITE_foo() - ` - - // util.getDefaultSetup(sample_in) - - // arkts.proceedToState(arkts.ContextState.ES2PANDA_STATE_CHECKED) - - // let sourceFile = arkts.nodeByPeer(util.AstProvider.provideAst()) - - // sourceFile = new FunctionTransformer().visitor(sourceFile) - - // util.assertAstEqualsAfter( - // sourceFile, - // arkts.ContextState.ES2PANDA_STATE_CHECKED, - // ` - // const x: string = "A" - - // function foo(x: string) { - // console.log("FUNC CALLED: " + x) - // } - - // foo("SAMPLE") - // ` - // ) - - // util.nativeModule._VarBinderInitTopScope(arkts.Global.context) - // util.nativeModule._VarBinderIdentifierAnalysis(arkts.Global.context) - // arkts.proceedToState(arkts.ContextState.ES2PANDA_STATE_BIN_GENERATED) - }) -}) diff --git a/arkoala-arkts/libarkts/test/es2panda/literal-declarations.test.ts b/arkoala-arkts/libarkts/test/es2panda/literal-declarations.test.ts deleted file mode 100644 index 8ad947830..000000000 --- a/arkoala-arkts/libarkts/test/es2panda/literal-declarations.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -/* -import * as util from "../test-util" -import * as arkts from "../../src/arkts" -import { factory } from "../../src/arkts" - -suite(util.getSuiteTitle(__filename), () => { - // TODO: change 0 -> 777 (waiting fix) - test("const-number", function() { - const sample_in = - ` - function f() {} - ` - - util.getDefaultSetup(sample_in) - - let sourceFile = arkts.nodeByPeer(util.AstProvider.provideAst()) - util.assert(arkts.isSourceFile(sourceFile)) - - const varDecl = factory.createVariableStatement( - undefined, - factory.createVariableDeclarationList( - [factory.createVariableDeclaration( - factory.createIdentifier("x"), - undefined, - factory.createKeywordTypeNode(arkts.SyntaxKind.NumberKeyword), - factory.createNumericLiteral("0") - )] - ) - ) - - const f = sourceFile.statements[0] - util.assert(arkts.isFunctionDeclaration(f)) - - sourceFile = factory.updateSourceFile( - sourceFile, - [ - factory.updateFunctionDeclaration( - f, - f.modifiers, - undefined, - f.name, - f.typeParameters, - f.parameters, - f.type, - factory.createBlock([ - varDecl - ]) - ) - ] - ) - - util.assertEqualsAfter( - sourceFile, - ` - function f() { - const x: number = 0 - } - ` - ) - }) - - test("declaration-list", function() { - // const x: number = 0, y: string = "a", z = 0 - - const sample_in = `const x = 1` - - util.getDefaultSetup(sample_in) - - let sourceFile = arkts.nodeByPeer(util.AstProvider.provideAst()) - util.assert(arkts.isSourceFile(sourceFile)) - - const varStatement = sourceFile.statements[0] - util.assert(arkts.isVariableStatement(varStatement)) - - sourceFile = arkts.factory.updateSourceFile( - sourceFile, - [ - factory.updateVariableStatement( - varStatement, - [ - // TODO: not ok maybe (not my fault) - factory.createToken(arkts.SyntaxKind.PublicKeyword), - factory.createToken(arkts.SyntaxKind.StaticKeyword), - factory.createToken(arkts.SyntaxKind.ConstKeyword), - ], - factory.createVariableDeclarationList( - [ - factory.createVariableDeclaration( - factory.createIdentifier("x"), - undefined, - factory.createKeywordTypeNode(arkts.SyntaxKind.NumberKeyword), - factory.createNumericLiteral("0") - ), - factory.createVariableDeclaration( - factory.createIdentifier("y"), - undefined, - factory.createKeywordTypeNode(arkts.SyntaxKind.StringKeyword), - factory.createStringLiteral("a") - ), - factory.createVariableDeclaration( - factory.createIdentifier("z"), - undefined, - undefined, - factory.createNumericLiteral("0") - ) - ], - undefined - ) - ) - ] - ) - - util.assertEqualsAfter( - sourceFile, - ` - const x: number = 0, y: string = "a", z = 0 - ` - ) - }) -}) -*/ \ No newline at end of file diff --git a/arkoala-arkts/libarkts/test/es2panda/simple-transformations.test.ts b/arkoala-arkts/libarkts/test/es2panda/simple-transformations.test.ts deleted file mode 100644 index 3f0e79fba..000000000 --- a/arkoala-arkts/libarkts/test/es2panda/simple-transformations.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* -import * as util from "../test-util" -import * as ts from "../../src/api" - -suite(util.getSuiteTitle(__filename), () => { - test("sample-1", function() { - const sample_in = - ` - class A {} - - let x: AB - - console.log("ok") - ` - - let sourceFile = ts.factory.createSourceFile(sample_in) - util.assert(ts.isSourceFile(sourceFile)) - - const varDecl = sourceFile.statements[1] - util.assert(ts.isVariableStatement(varDecl)) - - const declList = varDecl.declarationList - util.assert(ts.isVariableDeclarationList(declList)) - - const x = declList.declarations[0] - util.assert(ts.isVariableDeclaration(x)) - - sourceFile = ts.factory.updateSourceFile( - sourceFile, - [ - sourceFile.statements[0], - ts.factory.updateVariableStatement( - varDecl, - undefined, - // declList - ts.factory.createVariableDeclarationList( - [ts.factory.createVariableDeclaration( - ts.factory.createIdentifier("x"), - undefined, - ts.factory.createTypeReferenceNode( - ts.factory.createIdentifier("A") - ), - undefined - )] - ) - ), - sourceFile.statements[2] - ] - ) - - util.assertEqualsBinaryOuptut('ok', this) - }) -}) -*/ \ No newline at end of file diff --git a/arkoala-arkts/libarkts/test/test-util.ts b/arkoala-arkts/libarkts/test/test-util.ts index 7a132c42b..349284244 100644 --- a/arkoala-arkts/libarkts/test/test-util.ts +++ b/arkoala-arkts/libarkts/test/test-util.ts @@ -13,24 +13,22 @@ * limitations under the License. */ -import global from "../src/api/static/global" -import * as arkts from "../src/api" +import global from "../src/arkts-api/static/global" +import * as ts from "../src/ts-api" +import * as arkts from "../src/arkts-api" -import * as path from "path" -import { KNativePointer } from "@koalaui/interop" -import { nativeModule } from "../src/NativeModule" -import { NativePtrDecoder } from "../src/node/Platform" +import * as pth from "path" +import { nativeModule } from "../src/nativeModule" import { assert } from "chai" -// import { PrintVisitor } from "../compatible/src/print-visitor" -import { exec } from "child_process" +import { exec, execSync } from "child_process" -export { nativeModule } from "../src/NativeModule" +export { nativeModule } from "../src/nativeModule" export { assert } from "chai" -class defaultTransformationContext implements arkts.TransformationContext { +class defaultTransformationContext implements ts.TransformationContext { } -export function getDefaultTransformationContext(): arkts.TransformationContext { +export function getDefaultTransformationContext(): ts.TransformationContext { return new defaultTransformationContext() } @@ -54,12 +52,8 @@ export function alignText(text: string): string { return lines.map(str => str.slice((shift === -1) ? 0 : shift)).join('\n').trim() } -// export function printVisitorOutput(node: arkts.Node): string { -// return (new PrintVisitor(getDefaultTransformationContext())).astToString(node) -// } - export function getSuiteTitle(fileName: string) { - return path.basename(fileName).split('.')[0] + return pth.basename(fileName).split('.')[0] } export function assertEqualsSource(sourceResult: string, sourceExpect: string, message?: string) { @@ -70,65 +64,62 @@ export function assertEqualsSource(sourceResult: string, sourceExpect: string, m ) } -export function assertEqualsAfter(node: arkts.SourceFile, source: string, state?: arkts.ContextState) { - const finalState: arkts.ContextState = (() => { +export function TS_TEST_ASSERTION(node: ts.SourceFile, source: string, state?: ts.ContextState) { + ARKTS_TEST_ASSERTION(node.node, source, state) +} + +export function ARKTS_TEST_ASSERTION(node: arkts.EtsScript, source: string, state?: ts.ContextState) { + const finalState: ts.ContextState = (() => { if (state !== undefined) { return state } if (process.env.STATE_CHECKED !== undefined) { - return arkts.ContextState.ES2PANDA_STATE_CHECKED + return ts.ContextState.ES2PANDA_STATE_CHECKED } - return arkts.ContextState.ES2PANDA_STATE_PARSED + return ts.ContextState.ES2PANDA_STATE_PARSED })() - arkts.proceedToState(finalState) - const ast = node.node.dumpJson() - const src = node.node.dumpSrc() - const mods = node.node.dumpModifiers() - + const ast = node.dumpJson() + const src = node.dumpSrc() + const dump = node.dump() nativeModule._DestroyContext(global.context) - const sourceFile = arkts.factory.createSourceFile(source) - arkts.proceedToState(finalState) - const root = sourceFile.node + try { - assert.equal(ast, root.dumpJson(), 'Error on JSON comparison') - assertEqualsSource(src, root.dumpSrc(), 'Error on SOURCE comparison') - assert.equal(mods, root.dumpModifiers(), 'Error on MODIFIERS comparison') + const script = arkts.EtsScript.create(source, finalState) + assert.equal(dump, script.dump(), 'Error on DUMP comparison') + assertEqualsSource(src, script.dumpSrc(), 'Error on SOURCE comparison') + assert.equal(ast, script.dumpJson(), 'Error on JSON comparison') } finally { nativeModule._DestroyContext(global.context) } } -// export function dumpFirst() { -// return arkts.dumpJson(getStatement(0)) -// } - -export function addMemoParamsToFunctionDeclaration(func: arkts.FunctionDeclaration): arkts.FunctionDeclaration { - return arkts.factory.updateFunctionDeclaration( +export function addMemoParamsToFunctionDeclaration(func: ts.FunctionDeclaration): ts.FunctionDeclaration { + return ts.factory.updateFunctionDeclaration( func, undefined, undefined, func.name, undefined, [ - arkts.factory.createParameterDeclaration( + ts.factory.createParameterDeclaration( undefined, undefined, - arkts.factory.createIdentifier("__memo_context"), + ts.factory.createIdentifier("__memo_context"), undefined, - arkts.factory.createTypeReferenceNode( - arkts.factory.createIdentifier("__memo_context_type") + ts.factory.createTypeReferenceNode( + ts.factory.createIdentifier("__memo_context_type") ), undefined ), - arkts.factory.createParameterDeclaration( + ts.factory.createParameterDeclaration( undefined, undefined, - arkts.factory.createIdentifier("__memo_id"), + ts.factory.createIdentifier("__memo_id"), undefined, - arkts.factory.createTypeReferenceNode( - arkts.factory.createIdentifier("__memo_id_type") + ts.factory.createTypeReferenceNode( + ts.factory.createIdentifier("__memo_id_type") ), undefined ), @@ -139,19 +130,37 @@ export function addMemoParamsToFunctionDeclaration(func: arkts.FunctionDeclarati ) } -export function generateBin(): void { - arkts.proceedToState(arkts.ContextState.ES2PANDA_STATE_BIN_GENERATED) - exec('rm ./native/main.abc') - exec('mv ./main.abc ./native/main.abc') +export function cleanGenerated(): void { + exec('npm run clean:generated') +} + +export function fileToAbc(path: string, isModule?: boolean): void { + const file = pth.basename(path).split('.')[0] + + execSync(`./node_modules/@panda/sdk/linux_host_tools/bin/es2panda ${path} --arktsconfig ./arktsconfig.json ${isModule ? '--ets-module' : ''}`) + execSync('mkdir -p ./generated') + execSync(`mv ./${file}.abc ./generated/${file}.abc`) +} + +export function contextToAbc(): void { + arkts.proceedToState(ts.ContextState.ES2PANDA_STATE_BIN_GENERATED) + // TODO: get name of file + execSync('mkdir -p ./generated') + execSync('mv ./main.abc ./generated/main.abc') +} + + +export function disasmAbc(path: string): void { + const file = pth.basename(path).split('.')[0] + execSync(`node_modules/@panda/sdk/linux_host_tools/bin/ark_disasm --debug ${path} ./generated/${file}_asm.txt`) } -export function runAbc(): void { - exec( - 'npm run run:abc', +export function runAbc(path: string = './generated/main.abc', modules?: readonly string[]): void { + const modulesStr: string = (modules === undefined) ? '' : (':' + modules.join(':')) + exec(`node_modules/@panda/sdk/linux_host_tools/bin/ark --load-runtimes=ets --boot-panda-files=node_modules/@panda/sdk/ets/etsstdlib.abc${modulesStr} ${path} ETSGLOBAL::main`, (error: any, stdout: string, stderr: string) => { - if (error) { - console.log('failed to run abc') - return; + if (error !== null) { + assert(false, `failed to run abc: ${error}`) } console.log(`stdout: ${stdout}`); console.log(`stderr: ${stderr}`); @@ -164,13 +173,12 @@ export function assertEqualsBinaryOuptut(output: string, ctx: Mocha.Context): vo ctx.skip() } try { - generateBin() + contextToAbc() exec( 'npm run run:abc', (error: any, stdout: string, stderr: string) => { - if (error) { - console.log('failed to run abc') - return; + if (error !== null) { + assert(false, `failed to run abc: ${error}`) } const lines = stdout.trim().split('\n') assert(lines.length >= 2) diff --git a/arkoala-arkts/libarkts/test/ts-api/classes/heritage/extends.test.ts b/arkoala-arkts/libarkts/test/ts-api/classes/heritage/extends.test.ts new file mode 100644 index 000000000..d8c110c00 --- /dev/null +++ b/arkoala-arkts/libarkts/test/ts-api/classes/heritage/extends.test.ts @@ -0,0 +1,59 @@ +import * as util from "../../../test-util" +import * as ts from "../../../../src/ts-api" +import { factory } from "../../../../src/ts-api" + +// TODO: +suite.skip(util.getSuiteTitle(__filename), () => { + test("sample-1", function() { + const sample_in = + ` + abstract class A {}; + abstract class C {}; + interface D {}; + class B extends A implements C, D {}; + ` + + let sourceFile = factory.createSourceFile(sample_in) + util.assert(ts.isSourceFile(sourceFile)) + + // sourceFile = factory.updateSourceFile( + // sourceFile, + // [ + // factory.createClassDeclaration( + // [ + // factory.createToken(ts.SyntaxKind.AbstractKeyword) + // ], + // factory.createIdentifier("A"), + // undefined, + // undefined, + // [] + // ), + // factory.createClassDeclaration( + // undefined, + // factory.createIdentifier("B"), + // undefined, + // [ + // factory.createHeritageClause( + // ts.SyntaxKind.ExtendsKeyword, + // [ + // factory.createExpressionWithTypeArguments( + // factory.createIdentifier("A"), + // undefined + // ) + // ] + // ) + // ], + // [] + // ) + // ] + // ) + + util.TS_TEST_ASSERTION( + sourceFile, + ` + abstract class A {}; + class B extends A {}; + ` + ) + }) +}) diff --git a/arkoala-arkts/libarkts/test/ts-api/cross/cross.test.ts b/arkoala-arkts/libarkts/test/ts-api/cross/cross.test.ts new file mode 100644 index 000000000..c6b257575 --- /dev/null +++ b/arkoala-arkts/libarkts/test/ts-api/cross/cross.test.ts @@ -0,0 +1,42 @@ +import * as util from "../../test-util" +import * as ts from "../../../src/ts-api" + +suite.skip(util.getSuiteTitle(__filename), () => { + test("imported-function-call", function() { + const sample_in = + ` + import { X } from "./variable" + + export function main() { + console.log(X) + } + ` + + let sourceFile = ts.factory.createSourceFile(sample_in) + util.assert(ts.isSourceFile(sourceFile)) + + util.cleanGenerated() + util.fileToAbc(`./input/variable.sts`, true) + util.contextToAbc() + util.runAbc(`./generated/main.abc`, ['./generated/variable.abc']) + }) + + test("rewrite-imported-function-call", function() { + const sample_in = + ` + import { X } from "./variable" + + export function main() { + console.log(Y) + } + ` + + let sourceFile = ts.factory.createSourceFile(sample_in) + util.assert(ts.isSourceFile(sourceFile)) + + util.cleanGenerated() + util.fileToAbc(`./input/variable.sts`, true) + util.contextToAbc() + util.runAbc(`./generated/main.abc`, ['./generated/variable.abc']) + }) +}) diff --git a/arkoala-arkts/libarkts/test/ts-api/demo-playground/classes.test.ts b/arkoala-arkts/libarkts/test/ts-api/demo-playground/classes.test.ts new file mode 100644 index 000000000..5a1ccf9da --- /dev/null +++ b/arkoala-arkts/libarkts/test/ts-api/demo-playground/classes.test.ts @@ -0,0 +1,40 @@ +import * as util from "../../test-util" +import * as ts from "../../../src/ts-api" +import { MemoTransformer } from "../../../compatible/src/memo-transformer" + +suite(util.getSuiteTitle(__filename), () => { + test.skip("stinger-node-class", function() { + const sample_in = + ` + // import { uint32 } from "@koalaui/common" + // import { CONTEXT_ROOT_SCOPE, IncrementalNode, NodeAttach, ReadonlyTreeNode, + // contextLocalValue, memoRoot, mutableState, updateStateManager, + // } from "@koalaui/runtime" + + // type uint32 = int + + abstract class IncrementalNode { + constructor(kind: int) {} + }; + + class StringerNode extends IncrementalNode { + constructor(kind: int = 1) { + super(kind) + } + data: string | undefined = undefined + } + ` + + const sourceFile = ts.factory.createSourceFile(sample_in, ts.ContextState.ES2PANDA_STATE_CHECKED) + util.assert(ts.isSourceFile(sourceFile)) + + const result = (new MemoTransformer()).visitor(sourceFile) + util.assert(ts.isSourceFile(result)) + + util.assertEqualsSource( + result.node.dumpSrc(), + ` + ` + ) + }) +}) diff --git a/arkoala-arkts/libarkts/test/ts-api/demo-playground/main.sts b/arkoala-arkts/libarkts/test/ts-api/demo-playground/main.sts new file mode 100644 index 000000000..464b0be3c --- /dev/null +++ b/arkoala-arkts/libarkts/test/ts-api/demo-playground/main.sts @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2022-2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { uint32 } from "@koalaui/common" +import { CONTEXT_ROOT_SCOPE, IncrementalNode, NodeAttach, ReadonlyTreeNode, + contextLocalValue, memoRoot, mutableState, updateStateManager, +} from "@koalaui/runtime" + +class StringerNode extends IncrementalNode { + constructor(kind: uint32 = 1) { + super(kind) + } + data: string | undefined = undefined +} + +/** @memo */ +function Stringer( + arg: string, + /** @memo */ + content?: () => void +): void { + NodeAttach(() => new StringerNode(), (node: StringerNode): void => { + node.data = arg + console.log("I am recomputing with arg: ", arg) + content?.() + }) +} + +const state = mutableState(17) + +/** @memo */ +function demo(node: StringerNode): void { + Stringer("First", () => { + console.log("Content of the first") + Stringer(`Second ${state.value}`, () => { + console.log("Content of the second") + Stringer("Third") + }) + Stringer("Fourth", () => { + console.log("Content of the 4th") + Stringer("5th") + }) + }) + + // This is to dump the complete managed incremental scope tree + const scope = contextLocalValue(CONTEXT_ROOT_SCOPE) + console.log(scope?.toHierarchy()) +} + +// memoRoot is the entry point here. +// It initializes the incremental runtime and computes the first frame. +// Have a look at its implementation. +const root = memoRoot(new StringerNode(0), demo) +console.log(root.value.toHierarchy()) // dump ui subtree + +updateStateManager() // Compute next frame. +console.log(root.value.toHierarchy()) + +state.value = 19 + +updateStateManager() // Compute the next frame. +console.log(root.value.toHierarchy()) +console.log("-----END-----") diff --git a/arkoala-arkts/libarkts/test/ts-api/demo-playground/memo-rewrites.test.ts b/arkoala-arkts/libarkts/test/ts-api/demo-playground/memo-rewrites.test.ts new file mode 100644 index 000000000..1041cfb03 --- /dev/null +++ b/arkoala-arkts/libarkts/test/ts-api/demo-playground/memo-rewrites.test.ts @@ -0,0 +1,45 @@ +import * as util from "../../test-util" +import * as ts from "../../../src/ts-api" +import { MemoTransformer } from "../../../compatible/src/memo-transformer" + +suite(util.getSuiteTitle(__filename), () => { + test.skip("function-stinger", function() { + const sample_in = + ` + /** @memo */ + function _MEMO_Stringer( + arg: string, + /** @memo */ + _MEMO_content: () => void + ): void { + _MEMO_content() + } + ` + + const sourceFile = ts.factory.createSourceFile(sample_in, ts.ContextState.ES2PANDA_STATE_CHECKED) + util.assert(ts.isSourceFile(sourceFile)) + + const result = (new MemoTransformer()).visitor(sourceFile) + util.assert(ts.isSourceFile(result)) + + util.assertEqualsSource( + result.node.dumpSrc(), + ` + abstract class ETSGLOBAL { + public static _$init$_() {} + + public static Stringer(__memo_context: __memo_context_type, __memo_id: __memo_id_type, arg: string, _MEMO_content: (()=> void)) { + if (__memo_scope.unchanged) { + return __memo_scope.cached; + } + content(__memo_context, ((__memo_id) + ("key_id_main.ts"))); + content(__memo_context, __memo_id); + return __memo_scope.recache(); + } + + + } + ` + ) + }) +}) diff --git a/arkoala-arkts/libarkts/test/es2panda/create-function-declaration.test.ts b/arkoala-arkts/libarkts/test/ts-api/functions/function-declaration/create-function-declaration.test.ts similarity index 94% rename from arkoala-arkts/libarkts/test/es2panda/create-function-declaration.test.ts rename to arkoala-arkts/libarkts/test/ts-api/functions/function-declaration/create-function-declaration.test.ts index 79d3e2ba5..06766042b 100644 --- a/arkoala-arkts/libarkts/test/es2panda/create-function-declaration.test.ts +++ b/arkoala-arkts/libarkts/test/ts-api/functions/function-declaration/create-function-declaration.test.ts @@ -1,6 +1,6 @@ -import * as util from "../test-util" -import * as ts from "../../src/api" -import { factory } from "../../src/api" +import * as util from "../../../test-util" +import * as ts from "../../../../src/ts-api" +import { factory } from "../../../../src/ts-api" suite(util.getSuiteTitle(__filename), () => { test("empty-function", function() { @@ -33,7 +33,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` function test_func() {} @@ -78,7 +78,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` function test_func(x: number) {} @@ -127,7 +127,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` function test_func(x: string) {} @@ -166,7 +166,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` async function test_func() {} @@ -175,12 +175,7 @@ suite(util.getSuiteTitle(__filename), () => { ) }) - test("empty-method-with-public-static-modifiers", function() { - // class A { - // static test_func() { - // } - // } - + test.skip("empty-method-with-public-static-modifiers", function() { const sample_in = ` class A { @@ -236,7 +231,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` class A { @@ -293,7 +288,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` function test_func(): void {} @@ -349,8 +344,6 @@ suite(util.getSuiteTitle(__filename), () => { ) ) - // console.log(funcDecl.node.dumpJson()) - sourceFile = factory.updateSourceFile( sourceFile, [ @@ -359,7 +352,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` function foo(x: number = 0, y: string = "abc"): number | string { @@ -374,7 +367,6 @@ suite(util.getSuiteTitle(__filename), () => { test("sample-2", function() { const sample_in = ` - // console.log("OK") ` let sourceFile = ts.factory.createSourceFile(sample_in) @@ -422,13 +414,12 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` function foo(x: number = 0, y: string = "abc"): number { return x } - // console.log("OK") `, ts.ContextState.ES2PANDA_STATE_PARSED ) diff --git a/arkoala-arkts/libarkts/test/es2panda/update-function-declaration.test.ts b/arkoala-arkts/libarkts/test/ts-api/functions/function-declaration/update-function-declaration.test.ts similarity index 78% rename from arkoala-arkts/libarkts/test/es2panda/update-function-declaration.test.ts rename to arkoala-arkts/libarkts/test/ts-api/functions/function-declaration/update-function-declaration.test.ts index 46eba9d13..6bd340853 100644 --- a/arkoala-arkts/libarkts/test/es2panda/update-function-declaration.test.ts +++ b/arkoala-arkts/libarkts/test/ts-api/functions/function-declaration/update-function-declaration.test.ts @@ -1,5 +1,5 @@ -import * as util from "../test-util" -import * as ts from "../../src/api" +import * as util from "../../../test-util" +import * as ts from "../../../../src/ts-api" suite(util.getSuiteTitle(__filename), () => { // adding y: string to signature @@ -49,7 +49,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` function new_test_func(x: number, y: string) {} @@ -86,7 +86,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` function foo(__memo_context: __memo_context_type, __memo_id: __memo_id_type, x: number) {} @@ -142,7 +142,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` function foo(x: string) { @@ -204,7 +204,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` function foo() { @@ -271,7 +271,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` function foo() { @@ -344,7 +344,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` function foo() { @@ -448,7 +448,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` function foo(__memo_context: __memo_context_type, __memo_id: __memo_id_type) { @@ -462,4 +462,91 @@ suite(util.getSuiteTitle(__filename), () => { ts.ContextState.ES2PANDA_STATE_PARSED, ) }) + + test("return-lambda", function() { + const sample_in = + ` + function foo() {} + ` + + let sourceFile = ts.factory.createSourceFile(sample_in) + util.assert(ts.isSourceFile(sourceFile)) + + let testFunc = sourceFile.statements[0] + util.assert(ts.isFunctionDeclaration(testFunc)) + + testFunc = ts.factory.updateFunctionDeclaration( + testFunc, + undefined, + undefined, + ts.factory.createIdentifier("foo"), + undefined, + [ + ts.factory.createParameterDeclaration( + undefined, + undefined, + ts.factory.createIdentifier("x"), + undefined, + ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), + undefined + ) + ], + undefined, + ts.factory.createBlock( + [ + ts.factory.createReturnStatement( + ts.factory.createCallExpression( + ts.factory.createParenthesizedExpression( + ts.factory.createArrowFunction( + undefined, + undefined, + [ + ts.factory.createParameterDeclaration( + undefined, + undefined, + ts.factory.createIdentifier("val"), + undefined, + ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), + ts.factory.createIdentifier("x") + ) + ], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createBlock( + [ + ts.factory.createExpressionStatement( + ts.factory.createIdentifier("val") + ) + ], + false + ) + ) + ), + undefined, + [] + ) + ) + ], + true + ) + ) + util.assert(ts.isFunctionDeclaration(testFunc)) + + sourceFile = ts.factory.updateSourceFile( + sourceFile, + [ + testFunc + ] + ) + + util.TS_TEST_ASSERTION( + sourceFile, + ` + function foo(x: string) { + return ((val: string = x) => { val })() + } + `, + ts.ContextState.ES2PANDA_STATE_PARSED, + ) + }) }) diff --git a/arkoala-arkts/libarkts/test/es2panda/builder-lambda-rewrite.test.ts b/arkoala-arkts/libarkts/test/ts-api/functions/lambda-function/builder-lambda.test.ts similarity index 52% rename from arkoala-arkts/libarkts/test/es2panda/builder-lambda-rewrite.test.ts rename to arkoala-arkts/libarkts/test/ts-api/functions/lambda-function/builder-lambda.test.ts index f6eb521c5..0801e3cc7 100644 --- a/arkoala-arkts/libarkts/test/es2panda/builder-lambda-rewrite.test.ts +++ b/arkoala-arkts/libarkts/test/ts-api/functions/lambda-function/builder-lambda.test.ts @@ -1,9 +1,7 @@ -import * as util from "../test-util" -import * as ts from "../../src/api" -import { factory } from "../../src/api" -import { BuilderLambdaTransformer } from "../../compatible/src/builder-lambda-transformer" +import * as util from "../../../test-util" +import * as ts from "../../../../src/ts-api" -suite(util.getSuiteTitle(__filename), () => { +suite.skip(util.getSuiteTitle(__filename), () => { test("adding-lambda-param-to-signature", function() { // _Foo((instance: string) => { // // empty @@ -18,7 +16,7 @@ suite(util.getSuiteTitle(__filename), () => { } ` - let sourceFile = factory.createSourceFile(sample_in) + let sourceFile = ts.factory.createSourceFile(sample_in) util.assert(ts.isSourceFile(sourceFile)) const newName = "_Foo" @@ -67,7 +65,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` _Foo(((instance: string) => {}), "label") @@ -86,7 +84,7 @@ suite(util.getSuiteTitle(__filename), () => { Foo(instance.bar().qux(), "label1", "label2") ` - let sourceFile = factory.createSourceFile(sample_in) + let sourceFile = ts.factory.createSourceFile(sample_in) util.assert(ts.isSourceFile(sourceFile)) const newName = "_Foo" @@ -140,7 +138,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` _Foo(((instance: string) => { @@ -150,103 +148,4 @@ suite(util.getSuiteTitle(__filename), () => { ts.ContextState.ES2PANDA_STATE_PARSED, ) }) - - test("builder-lambda-transformer-sample-1", function() { - // foo((instance: string) => { - // return instance; - // }, "label"); - - const sample_in = - ` - _BuilderLambdaCall_foo("label") - ` - - let sourceFile = factory.createSourceFile(sample_in) - util.assert(ts.isSourceFile(sourceFile)) - - const builderLambdaTransformer = new BuilderLambdaTransformer() - - const result = builderLambdaTransformer.visitor(sourceFile) - util.assert(ts.isSourceFile(result)) - - util.assertEqualsAfter( - result, - ` - foo(((instance: string) => { - return instance; - }), "label") - `, - ts.ContextState.ES2PANDA_STATE_PARSED, - ) - }) - - test("builder-lambda-transformer-sample-2", function() { - // foo((instance: string) => { - // return instance.bar().qux(); - // }, "label1", "label2"); - - const sample_in = - ` - _BuilderLambdaCall_foo("label1", "label2").bar().qux() - ` - - let sourceFile = factory.createSourceFile(sample_in) - util.assert(ts.isSourceFile(sourceFile)) - - const builderLambdaTransformer = new BuilderLambdaTransformer() - - const result = builderLambdaTransformer.visitor(sourceFile) - util.assert(ts.isSourceFile(result)) - - util.assertEqualsAfter( - result, - ` - foo(((instance: string) => { - return instance.bar().qux(); - }), "label1", "label2") - `, - ts.ContextState.ES2PANDA_STATE_PARSED, - ) - }) - - // TODO: update nodes properly (now failing to generate bin) - test("builder-lambda-transformer-sample-3", function() { - // function Foo(builder: (instance: string) => string, arg1: string): void { - // console.log(arg1 + builder("ABC")) - // } - // Foo((instance: string) => { - // return instance.charAt(1) - // }, "> second_char_of_ABC: ") - - const sample_in = - ` - function Foo(builder: (instance: string) => string, arg1: string): void { - console.log(arg1 + builder("ABC")) - } - - _BuilderLambdaCall_Foo("> second_char_of_ABC: ").charAt(1) - ` - - let sourceFile = factory.createSourceFile(sample_in) - util.assert(ts.isSourceFile(sourceFile)) - - const builderLambdaTransformer = new BuilderLambdaTransformer() - - const result = builderLambdaTransformer.visitor(sourceFile) - util.assert(ts.isSourceFile(result)) - - util.assertEqualsAfter( - result, - ` - function Foo(builder: ((instance: string)=> string), arg1: string): void { - console.log(((arg1) + (builder("ABC")))); - } - - Foo(((instance: string) => { - return instance.charAt(1); - }), "> second_char_of_ABC: ") - `, - ts.ContextState.ES2PANDA_STATE_PARSED, - ) - }) }) diff --git a/arkoala-arkts/libarkts/test/es2panda/lambda-param-memoization.test.ts b/arkoala-arkts/libarkts/test/ts-api/functions/lambda-function/lambda-param-memoization.test.ts similarity index 97% rename from arkoala-arkts/libarkts/test/es2panda/lambda-param-memoization.test.ts rename to arkoala-arkts/libarkts/test/ts-api/functions/lambda-function/lambda-param-memoization.test.ts index 7d0dabf7a..32d566ba0 100644 --- a/arkoala-arkts/libarkts/test/es2panda/lambda-param-memoization.test.ts +++ b/arkoala-arkts/libarkts/test/ts-api/functions/lambda-function/lambda-param-memoization.test.ts @@ -1,5 +1,5 @@ -import * as util from "../test-util" -import * as ts from "../../src/api" +import * as util from "../../../test-util" +import * as ts from "../../../../src/ts-api" suite(util.getSuiteTitle(__filename), () => { // full memo rewrite @@ -137,7 +137,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` function foo(__memo_context: __memo_context_type, __memo_id: __memo_id_type, content: ((__memo_context: __memo_context_type, __memo_id: __memo_id_type)=> void)) { diff --git a/arkoala-arkts/libarkts/test/es2panda/abc-gen.test.ts b/arkoala-arkts/libarkts/test/ts-api/general/abc-gen.test.ts similarity index 62% rename from arkoala-arkts/libarkts/test/es2panda/abc-gen.test.ts rename to arkoala-arkts/libarkts/test/ts-api/general/abc-gen.test.ts index b4b78d084..8b13ee28a 100644 --- a/arkoala-arkts/libarkts/test/es2panda/abc-gen.test.ts +++ b/arkoala-arkts/libarkts/test/ts-api/general/abc-gen.test.ts @@ -1,7 +1,7 @@ -import * as util from "../test-util" -import * as ts from "../../src/api" +import * as util from "../../test-util" +import * as ts from "../../../src/ts-api" -// tests for abc generation +// tests for abc generation (now failing on CI) suite(util.getSuiteTitle(__filename), () => { test("updating-expression-statement", function() { const sample_in = @@ -112,4 +112,64 @@ suite(util.getSuiteTitle(__filename), () => { util.assertEqualsBinaryOuptut('', this) }) + + test("changing-variable-annotation", function() { + const sample_in = + ` + class A {} + + let x: AB + + console.log("ok") + ` + + let sourceFile = ts.factory.createSourceFile(sample_in) + util.assert(ts.isSourceFile(sourceFile)) + + const varDecl = sourceFile.statements[1] + util.assert(ts.isVariableStatement(varDecl)) + + const declList = varDecl.declarationList + util.assert(ts.isVariableDeclarationList(declList)) + + const x = declList.declarations[0] + util.assert(ts.isVariableDeclaration(x)) + + sourceFile = ts.factory.updateSourceFile( + sourceFile, + [ + sourceFile.statements[0], + ts.factory.updateVariableStatement( + varDecl, + undefined, + // declList + ts.factory.createVariableDeclarationList( + [ts.factory.createVariableDeclaration( + ts.factory.createIdentifier("x"), + undefined, + ts.factory.createTypeReferenceNode( + ts.factory.createIdentifier("A") + ), + undefined + )], + undefined + ) + ), + sourceFile.statements[2] + ] + ) + + util.assertEqualsBinaryOuptut('ok', this) + }) + + test.skip("function-expression", function() { + const sample_in = + ` + const foo = function() { console.log("abc"); }; + foo(); + ` + + ts.factory.createSourceFile(sample_in) + util.assertEqualsBinaryOuptut('abc', this) + }) }) diff --git a/arkoala-arkts/libarkts/test/es2panda/basic.test.ts b/arkoala-arkts/libarkts/test/ts-api/general/basic.test.ts similarity index 95% rename from arkoala-arkts/libarkts/test/es2panda/basic.test.ts rename to arkoala-arkts/libarkts/test/ts-api/general/basic.test.ts index 7fbfae8af..ceb3c9038 100644 --- a/arkoala-arkts/libarkts/test/es2panda/basic.test.ts +++ b/arkoala-arkts/libarkts/test/ts-api/general/basic.test.ts @@ -1,6 +1,6 @@ -import * as util from "../test-util" -import * as ts from "../../src/api" -import { factory } from "../../src/api" +import * as util from "../../test-util" +import * as ts from "../../../src/ts-api" +import { factory } from "../../../src/ts-api" suite(util.getSuiteTitle(__filename), () => { test("sample-1", function() { @@ -20,7 +20,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` abc @@ -55,7 +55,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` function test() {} @@ -103,7 +103,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` function test(x: string): number { @@ -163,7 +163,7 @@ suite(util.getSuiteTitle(__filename), () => { ] ) - util.assertEqualsAfter( + util.TS_TEST_ASSERTION( sourceFile, ` function test(x: T): string { diff --git a/arkoala-arkts/libarkts/test/es2panda/import.test.ts b/arkoala-arkts/libarkts/test/ts-api/general/import.test.ts similarity index 95% rename from arkoala-arkts/libarkts/test/es2panda/import.test.ts rename to arkoala-arkts/libarkts/test/ts-api/general/import.test.ts index 42979123b..dd29b9a77 100644 --- a/arkoala-arkts/libarkts/test/es2panda/import.test.ts +++ b/arkoala-arkts/libarkts/test/ts-api/general/import.test.ts @@ -1,5 +1,5 @@ -import * as util from "../test-util" -import * as ts from "../../src/api" +import * as util from "../../test-util" +import * as ts from "../../../src/ts-api" suite.skip(util.getSuiteTitle(__filename), () => { // TODO: doesn't running now, but compiles (config gets only one file) diff --git a/arkoala-arkts/libarkts/test/ts-api/import-export/import.test.ts b/arkoala-arkts/libarkts/test/ts-api/import-export/import.test.ts new file mode 100644 index 000000000..08ef9fc15 --- /dev/null +++ b/arkoala-arkts/libarkts/test/ts-api/import-export/import.test.ts @@ -0,0 +1,48 @@ +import * as util from "../../test-util" +import * as ts from "../../../src/ts-api" +import { factory } from "../../../src/ts-api" + +// TODO: +suite.skip(util.getSuiteTitle(__filename), () => { + test("sample-1", function() { + const sample_in = + ` + import { X } from "./variable" + ` + + let sourceFile = factory.createSourceFile(sample_in) + util.assert(ts.isSourceFile(sourceFile)) + + // sourceFile = factory.updateSourceFile( + // sourceFile, + // [ + // factory.createImportDeclaration( + // undefined, + // factory.createImportClause( + // false, + // undefined, + // factory.createNamedImports( + // [ + // factory.createImportSpecifier( + // false, + // undefined, + // factory.createIdentifier("X") + // ) + // ] + // ) + // ), + // factory.createStringLiteral("./variable"), + // undefined + // ) + // ] + // ) + + // util.assertEqualsAfter( + // sourceFile, + // ` + // import { X } from "./variable" + // `, + // ts.ContextState.ES2PANDA_STATE_PARSED + // ) + }) +}) diff --git a/arkoala-arkts/libarkts/test/ts-api/keyword-super/in-constructor.test.ts b/arkoala-arkts/libarkts/test/ts-api/keyword-super/in-constructor.test.ts new file mode 100644 index 000000000..d735fbd23 --- /dev/null +++ b/arkoala-arkts/libarkts/test/ts-api/keyword-super/in-constructor.test.ts @@ -0,0 +1,94 @@ +import * as util from "../../test-util" +import * as ts from "../../../src/ts-api" +import { factory } from "../../../src/ts-api" + +// TODO: +suite.skip(util.getSuiteTitle(__filename), () => { + test("sample-1", function() { + const sample_in = + ` + ` + + let sourceFile = factory.createSourceFile(sample_in) + util.assert(ts.isSourceFile(sourceFile)) + + // sourceFile = factory.updateSourceFile( + // sourceFile, + // [ + // factory.createClassDeclaration( + // [factory.createToken(ts.SyntaxKind.AbstractKeyword)], + // factory.createIdentifier("A"), + // undefined, + // undefined, + // [factory.createConstructorDeclaration( + // undefined, + // [factory.createParameterDeclaration( + // undefined, + // undefined, + // factory.createIdentifier("x"), + // undefined, + // factory.createTypeReferenceNode( + // factory.createIdentifier("int"), + // undefined + // ), + // undefined + // )], + // factory.createBlock( + // [], + // false + // ) + // )] + // ), + // factory.createClassDeclaration( + // undefined, + // factory.createIdentifier("B"), + // undefined, + // [factory.createHeritageClause( + // ts.SyntaxKind.ExtendsKeyword, + // [factory.createExpressionWithTypeArguments( + // factory.createIdentifier("A"), + // undefined + // )] + // )], + // [factory.createConstructorDeclaration( + // undefined, + // [factory.createParameterDeclaration( + // undefined, + // undefined, + // factory.createIdentifier("x"), + // undefined, + // factory.createTypeReferenceNode( + // factory.createIdentifier("int"), + // undefined + // ), + // undefined + // )], + // factory.createBlock( + // [factory.createExpressionStatement(factory.createCallExpression( + // factory.createSuper(), + // undefined, + // [factory.createIdentifier("x")] + // ))], + // true + // ) + // )] + // ) + // ] + // ) + + util.TS_TEST_ASSERTION( + sourceFile, + ` + abstract class A { + constructor(x: int) {} + }; + + class B extends A { + constructor(x: int) { + super(x) + } + } + ` + ) + }) +}) diff --git a/arkoala-arkts/libarkts/test/ts-api/variables/create-variable.test.ts b/arkoala-arkts/libarkts/test/ts-api/variables/create-variable.test.ts new file mode 100644 index 000000000..7b715a88a --- /dev/null +++ b/arkoala-arkts/libarkts/test/ts-api/variables/create-variable.test.ts @@ -0,0 +1,249 @@ +import * as util from "../../test-util" +import * as ts from "../../../src/ts-api" +import { factory } from "../../../src/ts-api" + +suite(util.getSuiteTitle(__filename), () => { + test("const-number", function() { + const sample_in = + ` + function f() {} + ` + + let sourceFile = factory.createSourceFile(sample_in) + util.assert(ts.isSourceFile(sourceFile)) + + const varDecl = factory.createVariableStatement( + undefined, + factory.createVariableDeclarationList( + [ + factory.createVariableDeclaration( + factory.createIdentifier("x"), + undefined, + factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword), + factory.createNumericLiteral("0") + ) + ], + ts.NodeFlags.Const + ) + ) + + const f = sourceFile.statements[0] + util.assert(ts.isFunctionDeclaration(f)) + + sourceFile = factory.updateSourceFile( + sourceFile, + [ + factory.updateFunctionDeclaration( + f, + f.modifiers, + undefined, + f.name, + f.typeParameters, + f.parameters, + f.type, + factory.createBlock([ + varDecl + ]) + ) + ] + ) + + util.TS_TEST_ASSERTION( + sourceFile, + ` + function f() { + const x: number = 0 + } + ` + ) + }) + + test("declaration-list", function() { + // const x: number = 0, y: string = "a", z = 0 + + const sample_in = `const x = 1` + + let sourceFile = factory.createSourceFile(sample_in) + util.assert(ts.isSourceFile(sourceFile)) + + const varStatement = sourceFile.statements[0] + util.assert(ts.isVariableStatement(varStatement)) + + sourceFile = ts.factory.updateSourceFile( + sourceFile, + [ + factory.updateVariableStatement( + varStatement, + [ + // TODO: not ok maybe (problem with ModifierFlags) + factory.createToken(ts.SyntaxKind.PublicKeyword), + factory.createToken(ts.SyntaxKind.StaticKeyword), + factory.createToken(ts.SyntaxKind.ConstKeyword), + ], + factory.createVariableDeclarationList( + [ + factory.createVariableDeclaration( + factory.createIdentifier("x"), + undefined, + factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword), + factory.createNumericLiteral("0") + ), + factory.createVariableDeclaration( + factory.createIdentifier("y"), + undefined, + factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), + factory.createStringLiteral("a") + ), + factory.createVariableDeclaration( + factory.createIdentifier("z"), + undefined, + undefined, + factory.createNumericLiteral("0") + ) + ], + ts.NodeFlags.Const + ) + ) + ] + ) + + util.TS_TEST_ASSERTION( + sourceFile, + ` + const x: number = 0, y: string = "a", z = 0 + ` + ) + }) + + test("let-vars", function() { + const sample_in = + ` + const x = 0 + ` + + let sourceFile = factory.createSourceFile(sample_in) + util.assert(ts.isSourceFile(sourceFile)) + + const varStatement = sourceFile.statements[0] + util.assert(ts.isVariableStatement(varStatement)) + + sourceFile = factory.updateSourceFile( + sourceFile, + [ + factory.updateVariableStatement( + varStatement, + [ + // TODO: not ok maybe (problem with ModifierFlags) + factory.createToken(ts.SyntaxKind.PublicKeyword), + factory.createToken(ts.SyntaxKind.StaticKeyword), + ], + factory.createVariableDeclarationList( + [ + factory.createVariableDeclaration( + factory.createIdentifier("x"), + undefined, + factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword), + factory.createNumericLiteral("0") + ), + factory.createVariableDeclaration( + factory.createIdentifier("y"), + undefined, + factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), + factory.createStringLiteral("a") + ), + factory.createVariableDeclaration( + factory.createIdentifier("z"), + undefined, + undefined, + factory.createNumericLiteral("0") + ) + ], + ts.NodeFlags.Let + ) + ) + ] + ) + + util.TS_TEST_ASSERTION( + sourceFile, + ` + let x: number = 0, y: string = "a", z = 0 + ` + ) + }) + + test("parenthesized-expression", function() { + const sample_in = + ` + ` + + let sourceFile = factory.createSourceFile(sample_in) + util.assert(ts.isSourceFile(sourceFile)) + + sourceFile = factory.updateSourceFile( + sourceFile, + [ + factory.createVariableStatement( + [ + // TODO: not ok maybe (problem with ModifierFlags) + factory.createToken(ts.SyntaxKind.PublicKeyword), + factory.createToken(ts.SyntaxKind.StaticKeyword), + factory.createToken(ts.SyntaxKind.ConstKeyword), + ], + factory.createVariableDeclarationList( + [ + factory.createVariableDeclaration( + factory.createIdentifier("x"), + undefined, + factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword), + factory.createBinaryExpression( + factory.createParenthesizedExpression( + factory.createBinaryExpression( + factory.createNumericLiteral("0"), + factory.createToken(ts.SyntaxKind.PlusToken), + factory.createNumericLiteral("0") + ) + ), + factory.createToken(ts.SyntaxKind.AsteriskToken), + factory.createNumericLiteral("0") + ) + ) + ], + ts.NodeFlags.Const + ) + ) + ] + ) + + util.TS_TEST_ASSERTION( + sourceFile, + ` + const x: number = (0 + 0) * 0 + ` + ) + }) + + test.skip("question-mark", function() { + const sample_in = + ` + function foo(x?: number | undefined) { + console.log(x); + } + foo() + ` + + let sourceFile = factory.createSourceFile(sample_in) + util.assert(ts.isSourceFile(sourceFile)) + + util.TS_TEST_ASSERTION( + sourceFile, + ` + function foo(x?: number | undefined) { + console.log(x); + } + foo() + `, + ts.ContextState.ES2PANDA_STATE_PARSED + ) + }) +}) diff --git a/arkoala-arkts/libarkts/test/es2panda/analysis-visitor.test.ts b/arkoala-arkts/libarkts/test/ts-api/visitors-and-transformers/analysis-visitor.test.ts similarity index 46% rename from arkoala-arkts/libarkts/test/es2panda/analysis-visitor.test.ts rename to arkoala-arkts/libarkts/test/ts-api/visitors-and-transformers/analysis-visitor.test.ts index e1df89b02..bb66b9f8a 100644 --- a/arkoala-arkts/libarkts/test/es2panda/analysis-visitor.test.ts +++ b/arkoala-arkts/libarkts/test/ts-api/visitors-and-transformers/analysis-visitor.test.ts @@ -1,9 +1,8 @@ -/* -import * as util from "../test-util" -import * as arkts from "../../src/arkts" -import { AnalysisVisitor } from "../../compatible/src/analysis-visitor" -import { Tracer } from "../../compatible/src/util" -import { Rewrite } from "../../compatible/src/transformation-context" +import * as util from "../../test-util" +import * as ts from "../../../src/ts-api" +import { AnalysisVisitor } from "../../../compatible/src/analysis-visitor" +import { Tracer } from "../../../compatible/src/util" +import { Rewrite } from "../../../compatible/src/transformation-context" suite(util.getSuiteTitle(__filename), () => { test("sample-1", function() { @@ -16,23 +15,21 @@ suite(util.getSuiteTitle(__filename), () => { _memo_foo() ` - util.getDefaultSetup(sample_in) + let sourceFile = ts.factory.createSourceFile(sample_in) + util.assert(ts.isSourceFile(sourceFile)) - // arkts.proceedToState(arkts.ContextState.ES2PANDA_STATE_CHECKED) - - let sourceFile = arkts.nodeByPeer(util.AstProvider.provideAst()) - util.assert(arkts.isSourceFile(sourceFile)) + // ts.proceedToState(ts.ContextState.ES2PANDA_STATE_CHECKED) const options = {} const tracer = new Tracer(options) const rewrite = new Rewrite(sourceFile, options) - sourceFile = new AnalysisVisitor(tracer, rewrite).visitor(sourceFile) + const result = new AnalysisVisitor(tracer, rewrite).visitor(sourceFile) + util.assert(ts.isSourceFile(result)) util.assert(rewrite.functionTable.size === 1) util.assert(rewrite.callTable.size === 1) util.assert(rewrite.variableTable.size === 1) }) }) -*/ \ No newline at end of file diff --git a/arkoala-arkts/libarkts/test/ts-api/visitors-and-transformers/builder-lambda-rewrite.test.ts b/arkoala-arkts/libarkts/test/ts-api/visitors-and-transformers/builder-lambda-rewrite.test.ts new file mode 100644 index 000000000..945f0bd1a --- /dev/null +++ b/arkoala-arkts/libarkts/test/ts-api/visitors-and-transformers/builder-lambda-rewrite.test.ts @@ -0,0 +1,105 @@ +import * as util from "../../test-util" +import * as ts from "../../../src/ts-api" +import { factory } from "../../../src/ts-api" +import { BuilderLambdaTransformer } from "../../../compatible/src/builder-lambda-transformer" + +suite.skip(util.getSuiteTitle(__filename), () => { + test("builder-lambda-transformer-sample-1", function() { + // foo((instance: string) => { + // return instance; + // }, "label"); + + const sample_in = + ` + _BuilderLambdaCall_foo("label") + ` + + let sourceFile = factory.createSourceFile(sample_in) + util.assert(ts.isSourceFile(sourceFile)) + + const builderLambdaTransformer = new BuilderLambdaTransformer() + + const result = builderLambdaTransformer.visitor(sourceFile) + util.assert(ts.isSourceFile(result)) + + util.TS_TEST_ASSERTION( + result, + ` + foo(((instance: string) => { + return instance; + }), "label") + `, + ts.ContextState.ES2PANDA_STATE_PARSED, + ) + }) + + test("builder-lambda-transformer-sample-2", function() { + // foo((instance: string) => { + // return instance.bar().qux(); + // }, "label1", "label2"); + + const sample_in = + ` + _BuilderLambdaCall_foo("label1", "label2").bar().qux() + ` + + let sourceFile = factory.createSourceFile(sample_in) + util.assert(ts.isSourceFile(sourceFile)) + + const builderLambdaTransformer = new BuilderLambdaTransformer() + + const result = builderLambdaTransformer.visitor(sourceFile) + util.assert(ts.isSourceFile(result)) + + util.TS_TEST_ASSERTION( + result, + ` + foo(((instance: string) => { + return instance.bar().qux(); + }), "label1", "label2") + `, + ts.ContextState.ES2PANDA_STATE_PARSED, + ) + }) + + // TODO: update nodes properly (now failing to generate bin) + test("builder-lambda-transformer-sample-3", function() { + // function Foo(builder: (instance: string) => string, arg1: string): void { + // console.log(arg1 + builder("ABC")) + // } + // Foo((instance: string) => { + // return instance.charAt(1) + // }, "> second_char_of_ABC: ") + + const sample_in = + ` + function Foo(builder: (instance: string) => string, arg1: string): void { + console.log(arg1 + builder("ABC")) + } + + _BuilderLambdaCall_Foo("> second_char_of_ABC: ").charAt(1) + ` + + let sourceFile = factory.createSourceFile(sample_in) + util.assert(ts.isSourceFile(sourceFile)) + + const builderLambdaTransformer = new BuilderLambdaTransformer() + + const result = builderLambdaTransformer.visitor(sourceFile) + util.assert(ts.isSourceFile(result)) + + util.TS_TEST_ASSERTION( + result, + ` + function Foo(builder: ((instance: string)=> string), arg1: string): void { + console.log(((arg1) + (builder("ABC")))); + } + + Foo(((instance: string) => { + return instance.charAt(1); + }), "> second_char_of_ABC: ") + `, + ts.ContextState.ES2PANDA_STATE_PARSED, + ) + }) +}) diff --git a/arkoala-arkts/libarkts/test/ts-api/visitors-and-transformers/function-rewrite.test.ts b/arkoala-arkts/libarkts/test/ts-api/visitors-and-transformers/function-rewrite.test.ts new file mode 100644 index 000000000..5a893911c --- /dev/null +++ b/arkoala-arkts/libarkts/test/ts-api/visitors-and-transformers/function-rewrite.test.ts @@ -0,0 +1,51 @@ +import * as util from "../../test-util" +import * as ts from "../../../src/ts-api" +import global from "src/arkts-api/static/global" +import { FunctionTransformer } from "../../../compatible/src/function-transformer" +import { PrintVisitor } from "../../../compatible/src/print-visitor" + +suite.skip(util.getSuiteTitle(__filename), () => { + test("function-transformer-sample-1", function() { + const sample_in = + ` + const x: string = "A" + + function _REWRITE_foo() { + console.log("FUNC CALLED: " + x) + } + + _REWRITE_foo() + ` + + const sourceFile = ts.factory.createSourceFile(sample_in, ts.ContextState.ES2PANDA_STATE_CHECKED) + util.assert(ts.isSourceFile(sourceFile)) + + // util.nativeModule._VarBinderSetContext(global.context) + // util.nativeModule._VarBinderSetProgram(global.context) + // util.nativeModule._VarBinderSetGenStdLib(global.context, false) + // util.nativeModule._VarBinderInitTopScope(global.context) + // util.nativeModule._VarBinderIdentifierAnalysis(global.context) + + const result = (new FunctionTransformer()).visitor(sourceFile) + util.assert(ts.isSourceFile(result)) + + util.TS_TEST_ASSERTION( + sourceFile, + ` + const x: string = "A" + + function foo(x: string) { + console.log("FUNC CALLED: " + x) + } + + foo("SAMPLE") + `, + ts.ContextState.ES2PANDA_STATE_CHECKED, + ) + + // TODO: + util.nativeModule._VarBinderInitTopScope(global.context) + util.nativeModule._VarBinderIdentifierAnalysis(global.context) + ts.proceedToState(ts.ContextState.ES2PANDA_STATE_BIN_GENERATED) + }) +}) diff --git a/arkoala-arkts/libarkts/test/es2panda/memo-rewrite.test.ts b/arkoala-arkts/libarkts/test/ts-api/visitors-and-transformers/memo-rewrite.test.ts similarity index 80% rename from arkoala-arkts/libarkts/test/es2panda/memo-rewrite.test.ts rename to arkoala-arkts/libarkts/test/ts-api/visitors-and-transformers/memo-rewrite.test.ts index ba23e21cd..96a76f4fa 100644 --- a/arkoala-arkts/libarkts/test/es2panda/memo-rewrite.test.ts +++ b/arkoala-arkts/libarkts/test/ts-api/visitors-and-transformers/memo-rewrite.test.ts @@ -1,7 +1,6 @@ -/* -import * as util from "../test-util" -import * as arkts from "../../src/arkts" -import { MemoTransformer } from "../../compatible/src/memo-transformer" +import * as util from "../../test-util" +import * as ts from "../../../src/ts-api" +import { MemoTransformer } from "../../../compatible/src/memo-transformer" suite(util.getSuiteTitle(__filename), () => { test("memo-transformer-sample-1", function() { @@ -26,4 +25,3 @@ suite(util.getSuiteTitle(__filename), () => { // console.log(arkts.dumpSrcNode(sourceFile)) }) }) -*/ \ No newline at end of file diff --git a/arkoala-arkts/libarkts/test/es2panda/print-visitor.test.ts b/arkoala-arkts/libarkts/test/ts-api/visitors-and-transformers/print-visitor.test.ts similarity index 93% rename from arkoala-arkts/libarkts/test/es2panda/print-visitor.test.ts rename to arkoala-arkts/libarkts/test/ts-api/visitors-and-transformers/print-visitor.test.ts index d817e6aeb..f391b4358 100644 --- a/arkoala-arkts/libarkts/test/es2panda/print-visitor.test.ts +++ b/arkoala-arkts/libarkts/test/ts-api/visitors-and-transformers/print-visitor.test.ts @@ -1,6 +1,6 @@ -import * as ts from "../../src/api" -import * as util from "../test-util" -import { PrintVisitor } from "../../compatible/src/print-visitor" +import * as ts from "../../../src/ts-api" +import * as util from "../../test-util" +import { PrintVisitor } from "../../../compatible/src/print-visitor" suite.skip(util.getSuiteTitle(__filename), () => { test("sample-1", function() { diff --git a/arkoala-arkts/libarkts/test/tsconfig.json b/arkoala-arkts/libarkts/test/tsconfig.json index 7a261faad..abc41fa14 100644 --- a/arkoala-arkts/libarkts/test/tsconfig.json +++ b/arkoala-arkts/libarkts/test/tsconfig.json @@ -4,11 +4,6 @@ "rootDir": "../", "baseUrl": "../", "outDir": "build/test", - "paths": { - "api": [ - "src/arkts/index.ts" - ] - }, "module": "CommonJS" }, "include": [ diff --git a/arkoala-arkts/libarkts/src/api/utilities/utilities.ts b/arkoala-arkts/libarkts/tools/issue_gen.mjs similarity index 47% rename from arkoala-arkts/libarkts/src/api/utilities/utilities.ts rename to arkoala-arkts/libarkts/tools/issue_gen.mjs index 9d512d7fc..86c18af19 100644 --- a/arkoala-arkts/libarkts/src/api/utilities/utilities.ts +++ b/arkoala-arkts/libarkts/tools/issue_gen.mjs @@ -13,24 +13,54 @@ * limitations under the License. */ -import { nativeModule } from "../../NativeModule" -import { KNativePointer, withString } from "@koalaui/interop" -import global from "../static/global" - -export function todo(): any { - global.throwError("Not yet implemented") -} - -export function contextProgram(): KNativePointer { - return nativeModule._ContextProgram(global.context) -} - -// export function programAst(program: KNativePointer) { -// return nodeByPeer(nativeModule._ProgramAst(program)) -// } - -export function createAstDumper(peer: KNativePointer, source: string): KNativePointer { - return withString(source, (_source: string) => { - return nativeModule._CreateAstDumper(global.context, peer, _source) - }) -} +import * as fs from 'fs' +import * as path from 'path' + +process.chdir(path.resolve('./')) + +const issue_src = fs.readFileSync('../playground/src/playground.cc', { encoding: 'utf8', flag: 'r' }) + +const component_src = +` +### Component + +Plugin API + +` + +const revision_src = +` +### Revision + +"@panda/sdk": "1.5.0-dev.9184" + +` + +const reproduction_src = +` +### Reproduction + +\`\`\` +${issue_src} +\`\`\` + +` + +// TODO: +const log = `` + +const log_src = +` +### Log + +\`\`\` +${log} +\`\`\` +` + +console.log( + component_src + + revision_src + + reproduction_src + + log_src +) diff --git a/arkoala-arkts/libarkts/es2panda.webpack.config.js b/arkoala-arkts/libarkts/webpack.config.js similarity index 80% rename from arkoala-arkts/libarkts/es2panda.webpack.config.js rename to arkoala-arkts/libarkts/webpack.config.js index 5dda6871f..d5840ecc8 100644 --- a/arkoala-arkts/libarkts/es2panda.webpack.config.js +++ b/arkoala-arkts/libarkts/webpack.config.js @@ -6,7 +6,7 @@ const makeConfig = () => ({ entry: `./src/es2panda.ts`, output: { filename: "es2panda.js", - path: path.resolve(__dirname, "build/api") + path: path.resolve(__dirname, "build") }, resolve: { extensions: ['.ts', '...'], @@ -15,6 +15,7 @@ const makeConfig = () => ({ rules: [ { test: /\.ts$/, + // exclude: /node_modules/, use: [{ loader: 'ts-loader', options: { @@ -24,6 +25,7 @@ const makeConfig = () => ({ }, { test: /\.node$/, + // exclude: /node_modules/, loader: "node-loader" } ], @@ -39,6 +41,4 @@ const makeConfig = () => ({ } }) -module.exports = env => { - return makeConfig() -} +module.exports = _ => makeConfig() diff --git a/arkoala-arkts/package.json b/arkoala-arkts/package.json index 58938cd52..c5cba0344 100644 --- a/arkoala-arkts/package.json +++ b/arkoala-arkts/package.json @@ -5,6 +5,7 @@ "./arkui", "./loader", "./har", + "./libarkts", "../arkoala/arkui-common", "../arkoala/ets-plugin", "../incremental/build-common", @@ -13,10 +14,16 @@ "../incremental/runtime", "../interop" ], - "devDependencies": { + "dependencies": { "@koalaui/ets-tsc": "4.9.5-r4", "@koalaui/memo-tsc": "4.9.5", "@koalaui/fast-arktsc": "next", + "@panda/sdk": "1.5.0-dev.9184", + "@types/chai": "^4.3.1", + "@types/mocha": "^9.1.0", + "typescript": "4.9.5" + }, + "devDependencies": { "bin-links": "^4.0.4", "chai": "^4.3.6", "chalk": "^4.1.2", @@ -25,11 +32,9 @@ "rimraf": "^6.0.1", "ts-node": "^10.7.0", "tslib": "^2.3.1", - "typescript": "4.9.5", "webpack": "^5.93.0", "webpack-cli": "^5.1.4", - "copy-webpack-plugin": "^10.2.4", - "ts-loader": "^9.2.8" + "copy-webpack-plugin": "^10.2.4" }, "scripts": { "panda:sdk:install": "npm run panda:sdk:install --prefix ../incremental/tools/panda", diff --git a/interop/src/cpp/dynamic-loader.h b/interop/src/cpp/dynamic-loader.h index c7ade0fa4..f1585b3f4 100644 --- a/interop/src/cpp/dynamic-loader.h +++ b/interop/src/cpp/dynamic-loader.h @@ -44,7 +44,12 @@ inline std::string libName(const char* lib) { #include inline void* loadLibrary(const std::string& libPath) { - return dlopen(libPath.c_str(), RTLD_LOCAL | RTLD_NOW); + void* handle = dlopen(libPath.c_str(), RTLD_LOCAL | RTLD_NOW); + if (!handle) { + fprintf(stderr, "failed to load library: %s\n", dlerror()); + exit(EXIT_FAILURE); + } + return handle; } inline const char* libraryError() { -- Gitee From ea4b030f19392b9dc4e840571b27dfdc5d8c2821 Mon Sep 17 00:00:00 2001 From: chernishevvictor Date: Thu, 26 Dec 2024 21:39:49 +0300 Subject: [PATCH 2/5] add stuff for testing generated api --- .../PLUGIN_API_NativeModule.node | Bin 0 -> 1300616 bytes .../generated-api/src/generated/plugin_api.ts | 37 ++++++++++++++++++ .../src/generated/plugin_api_Native.ts | 25 ++++++++++++ .../libarkts/generated-api/src/index.ts | 15 +++++++ .../libarkts/generated-api/tsconfig.json | 16 ++++++++ arkoala-arkts/libarkts/package.json | 7 +++- 6 files changed, 98 insertions(+), 2 deletions(-) create mode 100755 arkoala-arkts/libarkts/generated-api/PLUGIN_API_NativeModule.node create mode 100644 arkoala-arkts/libarkts/generated-api/src/generated/plugin_api.ts create mode 100644 arkoala-arkts/libarkts/generated-api/src/generated/plugin_api_Native.ts create mode 100644 arkoala-arkts/libarkts/generated-api/src/index.ts create mode 100644 arkoala-arkts/libarkts/generated-api/tsconfig.json diff --git a/arkoala-arkts/libarkts/generated-api/PLUGIN_API_NativeModule.node b/arkoala-arkts/libarkts/generated-api/PLUGIN_API_NativeModule.node new file mode 100755 index 0000000000000000000000000000000000000000..dce3fd79f175f0b33aac3883e1fc869d63b2de65 GIT binary patch literal 1300616 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�TZ&|f|#ivG^%?4VyKSqRZjZf?-u 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ɇs-Rv?#URO8D5Fru*C}$CI&)i&qSMpm8y_N>?|{xR5GsFez?>$rKJ=kWE!uTaW~on*>jw9;0A$^aPX4 z><=4wnwfnh54~TQ6#sz{Jlfrb^MhJjkrJ}!=t}lig-VkkQM+@sU03LJiAj_~FDd0# z15as(jP)NF_$SeKIgnd0i^_N` zs8pS2piiLO%12ekJwa%@ft~=`GWQDVpW&Ft_p8VnHT9$_-l(RMU9TGMW!hgui2f6k zF@@;DKH+(~z8}KCD|UYcC*sA!>`c;SMPOcP5(EXNSn{tlpx>fF8L${a1+iyoPcEVM z_f3)kIbG7uov*8sq<4#GKifdl(&r)r9gIF$p!fu$Es`IaoT&tmg6E#0s}&eK_QVmv z-iezeA4A`bJ_(l!feM*!GSGBnk|e(|Nxp)~5}sj&dREs{pMm}nW3vQ9FAr|id(~t% z02RT9a0FIFpuJWUidpB_v_Mz;v*?^$xXNjiQec~b-U#S8c(hO0cOhHVqo9R)SYE@!pTwrAyu!quqQM+JLDca!=WA-tVjUv&Et`2rtrAcrd$TJPgn3YCU zN&7b&_z$SRPGUDL$PSkqXc9X}Z{BL4KL>T@U?`6|2A!}Rs?5_eYe^9&O|m2s3ltVp zF*T%AQ0s06o;06I?z0W_IAr-)3|xfOF^ZI=xNN`_v_84tq_`J2N*D(My1-xm420={ zEg5WChz~5+HCskl$In@$EB@c0+&C;Tu*DPZ;WdRb3lVXkZ$C?qjcl2BHXuHUP2T*` z%ayI;>xi_t&>%|PJX8Tz-tM5olhRR`wj3OD(2v=i{MP;Ssrzen#-HIPZ4)xd#u2!*jhrKX0bTL-hC> z9vMHRZ||oE#pB92PTx2v*FWhSN9OWEY`GL&E0e=+4IE-CDW(=j=1K~zH5P5NIj|N7 z{^ICb98QZWl;OqH%Ah!4SsW3Jf`LUT7+92ofki18Sd@Z+MJX6ql!9_)Q&6tx7$C@@ zC|o(;q6bCc%BCn>*r5lMqHski3Rje(aAi|;t!#?I6{RR#{L`69WT#+T+4SIuTe%c* zE0-c}4WWoz*&Qe&dl99huv@tlb}N^{Ze{cO@$^Dx*(^@`3)SV|j8y-jy26}yz@S%> zOxnL{=G^5M?2P-W@Qcmz43=h4hks7$BrqM7^~ky@ZVYhxCeY^t-n_q?Z)i ze@HLkgaJZ&MgFfsdPP_o^&iqpS~k>#FQk{$@NEt0 zC0%^_A-yEusf6^Bl&2rkOY)scNUsP7EgB@GS46$pkX}-uQw`}Qsndq^640rI^pdn` zLwbn_A1tJojL|nA(kr4W!Om|iq*p`@9MUVI1_|jU)9SxAq*nyT$NnusdPUTm3h9+O zU`Ve_MIoj7589Q<3iF!?%9V*&f|>TSW+nKGeu82Z(9z%N>4IWqzPYGg(ttM+)hm;k zGi$S6%EIFyZCJ8`2qM4s*MhYm!TDP>h8tkDOo)0Veb9ecuS|FV4iwfaQ*8qLJqG`u zQt__`{9Xfp4e*4pUYTl;uwI#ig!RfCB&=7a8aS+1R)1l=GT%g4ujpxntB)c!<|&1% zkMe^36vNd=+2HcDq5I=FEB2JiLuj#A5Q=xvFg9`7_KbXvHy_5X(o|Tv=#(JEpO4@O zaUp$TUqL=7JQ19Y*r76l@apvQCG)G$t{RFBQF6<4BGuxDq@!I$PT;u74B8dR=Gxz9 ztlpETK3k8gS{&nOgZ-YO{)AENZ2Ht;kO+#S{O(N%#r00u*(Z@x9YQN-9-~OfINWEQ zSlH*{P~A)b;9-N-9aFjW>dZ|zC5@2dht&+{@eq*aV21;-0uRH*%mgfh#jhLZn%Hm; zlOaVsL_kt_p`tH|>Qvee6HwJk3T|2k{{(Ivc`IX1@;=FUK}-H%?ho3G*$r&ixMU-RMHIsL<)o z9-LoC>~IR=1Cwk`xmp3kDvoX8>NL0ho@WNl>jM{nZQedGp_a;QiTwS1Y zjv<&|TouBf$(~)PhEs?`(B5tviZ4f0+e0{MdK00kAvA~vO&H$H?LNmN(`@Ny;$s^oq9Dj1}M6{M05hq-oKr^x; z_Q&95W`}d(7=VuNCyD7;52gaH8|V#tSTjJ8x6LJ7;+OWHPhJzj>Y%oI4^^OdHP=xw2Y$L$t0BJYs961;GJr?; z=$gK?gU+M$8OUKUc{Lv_Vgq9TuA{uA@|HM`%I?gd{+>BpV)0hpwvS`OKihrZDwVNX zmE5f=a4H=^D!b{l`9h&LPd3C`4tqf&vO9Tkk&DmpdNq@x*1LsjI>d!KZfDWlDJ7_F zx`fZ6gb^53Wk_0aOb#7HSX)_dlJx7R_?9`tiXZD6^Kz9=AK1%P(hT6`n!)?=Z^X-0 zP!I0qD(MFDa*bfG@$K+(m6i9Ydbvh;MD*|FD%b|{aux0w+{-nBu+am0xkfM@W!i@f z8$LhMf=W61gvy4O1l)9AQ^9R*9_V}goL0-Sm8a$6*sr?Id)`0eb z2l4oo)PuO$N^{>nH(RMh)g`*huad7XZdrOzP3l#PwX3hBx!9yh?++Y-N`=i^ljsI` z6}zP69Y(NDnyoP-jX`(-oD%Ooq(&cBQK*03ElzK*tFN%a0It3fXw!qb`bN}S>FS%w zMZPIlUpi7Zh^MZs7~e`yT@f?`dFsjxkael%s1NBGfF_ADZw8>Td7eqq2VNNll}aB` zm+ope(B}i5<>d#UCL~;-AXf`mN0i#kYp0WKX9h299r{O+(!k+BJJEHiPrDX zEl53hh3EpLbKGW9+=Lny{e^A`fkzmQHFF(h-g(TVxe;_I#)1qNMIgAaTHdR|hs=!? zgsiY#7uTTVo41$Sc+M*mLk#xm^<;%+Rg)}M2)K>Ks<70EcbbFX0O&$(Bi{W_i$_Y7ry~v~q`WgyojR6H+ zg$46F4d_&S-z3X1lO?TRr=+RdX@oa?gp1*6GVvwYRL)l!-u*Nrv2HY}QoL1Ya=gnx zQ(Uy9XMSMdNkU45_lpLa;#nf2KI>h&hR1Oz4|hgkZG=c+#XS@_7{_eSz^UhCMO+TqN$Yl*y#4seh}UR;KBXgA#Qtl2O65THKt82H(>Lr>Dufxtr&Pww|CLXv zRBU*#Dnr48a4D9&7` z<{2mm->_$(WbfZIP-xemXQ1SMqn?41doa&Hsllmw21@GwJOjn8rpB=8J#Z`u_<+fn z+hU+ELVBl!h><#f#H2Z0M@$)n-#6L+f(i`BWtoMzM$;@GMzTrh?1{$?TRP7`Bu2%RT>(kbrY;J(81gUgKm_h zwSCrPq;NMm4sK)5z%GDWFZ$EKE^}fA@6TmUn*JtT=7c%=aha0=+MiRJls}kL+C2Eu zsE`|42uG;2E>+QFm#X1N*`FJgZH=>sRJ4(Q4!cUxy_e2naJJ3w*cs|;_!(x$rymmF zpY&kIC-#zJKPb=fNs;4IgdLyQ9jjmOCo+PH!_}XW0~ZP7;dwQM*_(d$|Q#-mmHe1$e}6gTl64@rc82Z$|UEdOmbdw$$2T0{gH69 z5RQB7Ll#>2{24BQ6}@V%b|16{bS856NcgV|Ct?q%7hbn_S$)0ExA6#L@7ww86@Ad} zaarQzlWGXII_rQ*<0+e`04pXFo0jgb+ul3i`0C^W}a~fHFxAohi|` zup#{zwrPO_K{D#iH^f97zf0l9F2O$vJGV$uie2ATYW5;k3VT!n1c5HFji^c&nH;ft z?4Gx(nbj1}Cwms%ur_X%k5GfNk02Vbn(SmFTpO&i-C+l@+2)j~f+G}(6JApp&XhW= zX7E14IS3b(yhjrPZ93ly_o*p+z1W{fg;*bO_CzQUEJr8T(@BC12;kxwYB&gqGYs`~ z6GZ`CQ5b{=qn_z1tek5uD^nAD5#5h#QiGU+h?%ToxFNJ@hO-M7|MqZou7TH+ z4c|sDL>mla%6Tu|W+33q$uaj1RkT_a_u_ya=-#U4&_^$CEZTA&grn$t zJ6r%qD%ALU)r6OD(Q*s0o`IW(owe9Icb|rDaGRR@l9~!XFF0i47{E(vm@^vDuF-oV z_ma(f*zIt-+^yyvLhk))E^VA5Hq$juW2+jz4?D+OmHMEAcifDhA;ZMi(nnniN1P`+ zs}VwwLLNDH;YLcjz8%qiIOhWnSnIF^5diqFmzSyGdl8HdHxMi5GY%q4Ve*6e&xvn$ zt8w<>ZHUtnabAn}s(ctAK{gyxiP1;;FgDKXp)#~!4?3tDEmF>Z*=2BvTTHqUckUyX z*Kt4*+;;EY8+M#uWS8}(iQM2EjDzleTb~CS%*3K(F{yrVWf?^%Mid8be0Lcv2)nu1 zEEN04_mojsq&_Z}DEk6#-W!H!0FQ;E0Ke~wGBpXEMug0C?hco!@M~(=ZZ+a0-3&Tr zBW_cD4t}y+gIj|hb0yd!;PGo&WA7Cug>UY zbnSJtK{Bov@0GJ2gVKRrhbO^>Vas_h_RuG|XK{!|yQI+R#bC+Z2M=Jz`-mz7Z|?5b zZ#|st{0$kF?}b{VoD&pl2e@#=q4W~EQIUL!;i9d&of9A)T`E}t`JtRO)f8Pf|KyE)HU4P|B@bjXjT$fH^YJdh6ZxFGXewnV zWS;-3FullpO0LHa`y{WzH;dDGlc3^>mS?>*uE!CccggEG;(HyFN3e>~gXc+_fz>@U z9kS~&`xXC|-c6(}O2u_B!TC|3XyP_Fa$3I45q# zG~2S9F}nq4)2y6LvvM}g%Gos0@?0FHxj0I5aTZVTp2spbD?*;bSu{Uqk*{$!xgKYe z>oL0&s~hnyhg^zt$a6S{Je#vg2gs&LKZ_>)Z1PUdB8TH#ayZVS`JVA9ayZT*g+|oA z{``h*HVmAeC$gi)LwR`WBcK5OAfhZ>`i&z|)px2)c-!Jo5S}>8g%2D#%Tvw~3GU^v zH(J+6b-vfx^PWySl?|7*g)^XktTUj0ti#({Z^}Q`dGr3U&T06^N^1x5k97w0k97uf zeUl$Kfyhh(vUVIpM;GP4=hL z;Gc{({?sIRHBADFApTdA;1FWqj={;&@g_o{^y{>bX&QVXLczl;PpBC^q!*?Q7LIt? zat-w+xxw3k0+(t3!JzmWP{06B&f*l*!VlV>6>)Li0FxM$=_CYH$ER-7b@(yrSPK-Z z{5q27_TLTscU;HWCrI*95Ge;KUL3iTsJz4-CS|{rj zO#!$xx}*?ry3yH_vn1>PE&b4)LHy92LH*F30sPQm_CUka_@N6Y{A>NtWy1Xb&kx=C zKk-AC32*$XdaS-Mg62$esepmUE`brZPr=GE%NbV(CBIrtI)-V6M-1W%^XC#(yj6{S zip)xMFdf%fSneaL7#AA!;oCBMicG6>!9WA}p$q@^=Z7x*m&OlW0BQWtg)#g0LwDX@ zKXj3RZ<`;w$j`UU4_$~i@oqf}-#vzA;lfu`#-|VCPel)tQ5T0+vEm!CPdWBt-Z#=p z3(T8zD0m3242!D?h|@0YA_1H&IAG)u+w5iQiG_PW=+{2sC3{W*)*RrWE9LhE`0hk- zT;7SmTL^Y#m=|G4fjH))jZ)1E?$y=&${2I05H8(OFme)RxLv&_yCu%4IM+KI&F40Q z@(5d>xOX{?K@d7$Ezj#TT)-PVBl)?PsMP|Htzj)_O_{BSe_{BSe`NhjL|F89n zcm7@c;+;3=7cW672aKyHN#0moJvr$4j1e#82ylr2@wgyP$19FNW@g&C&*`bUf-J%Ry7pfj@=Y=tq}VO)f*JNclBWk zipQ|?6I#~(7ALjg&ftgsr(ibw&HmzO%bu98Mjj^@%Z2r-271G^=ft^pBaG;q?6Q1v zdCP!c$2J4@<=|GLhJ96G^KJZYY$>%W>~dH!>>^!`EgH-Hh?@P-zf=c zu+G2_mt4iJ4K{me1L0LmF)M@ugRILBFc;@ajPN8r1<_uTyLkUG!Bo^oS}#6kc2s zQjc@+t!fFbKG>vY!WkPscwY`4oe9Zj@8Y_^CQ;)yn14{?DUJmFWN64fepT;=y6P(%r*h`CKF|2yPsJAR|er(git=#y?$ zeL1dLu2#ExRCSr!MI-PM_uH!EF;#F##be#N)Jb1kEc%z(pmQ8eDdkW z6$AxpA=<2({D^A_-e!Ns$t+hCu_Vqjav;J_V?WINi9bE_4mx=1@~KU`Dqp->d)U(p#9xy zDt$7rzo(=bz~3`Gu)k-N>zDRcQ_T{YnpXWf;z+uI{5_qw$=_2n%2W0Cl*@Db_xBWR z1NnOj_YCgu=?v!YDMbz9ZYia`eeRZm|LwcgRH!h3tD|!&u8uPF->O?prOgiyI{qbH z_I-oN2}!r@6w;CE_=HLK$y~DX%sqjVLv$5S^6tw7+9yigbs*2wYd}I`m4&aS-#(I65Zxsax{f6IYQKy8Li@GF9EoJZ<2l-+Zo{_ zbRH|~5Zy(^8m^?t{fw?y(hV!(?Ki&v}Fyn zJLp{5IO?S5;>gpOC=)j4KFep?padv)1!m3*%GiU5I$>QvZmFyBK-)t~R7cysoD)v0p|zK0@~_dK9``fl9zIu={SF|!RTM7ZC;ll*Lj z2;VW#7ei?d^9z&zk4cksWt2e2KB&u2y2Qc3fi~c^miYj zuu|Il2ZD`XqUB?{q*fF_+wR83dq&gS+l%^NP;*|MT}bG$3mw7RLYrLCp8t0mO5 zX-$1Yd|p%2<~@5VDk>^3ZtmK?xv4AOxxIaB?dFDfMaAZA&7Dp0&gSj$uG-Bt4b6De z%;{|1-oB+~UH#@AJ34Nc3|u4&k?{@i67)~*k2 zXsB(Ew{*5PZ*E!Mvbn9fvpK%KqrIUezO=ogeOX&`S666fb7xC?JhY;_eKWzi&O$+Jns>AS$vNH4ZQEP7xA5=v+qZ6uhn97=G{;-cZQs&@3bkxmwH?JYw}omp zG&HR}tFC4ls>QWgdKN0PblC=iEZf$y`O=n7d?Sj4x?1AM6sp~^v!gQ}s9tRsf$LHH zvX1tycxY9}=H|BZnme~QU);vETGg_rrhQjKTSq*!y?uLpJ1TcM5cwsXhc{bLJ#I`3 z3TbQU>SAP_-J9bboRpf^(z(8+tD|jKOHF(CjzA4UO-+QjNg8=pTgT>08{)vXgDADE zxvi~c&(2Pu6k1Ykxg_-OCUj|QN9XS5&Mmd;(MvUJH#DtZgWjCm*|MW!R|~qowFLy< z+)~>xyQ!usj=VJ?dJ2Yh@y^hd?Jc{TPzah$b#2(bwY@ps-Py8sCv{MB+tSXh%R0K- z<3b(bql$S!{%P8^y=8ap@~&hqTHaMtQ!$q~s0n=^Z))#|H+8gvo0fNhoqYO9yS;)# z=k6qGZfH2S{nGZ1-R<=)m+kK8+`=qewWfLJ_W6c;Dk@huU)n+xy104sr8Vm+D%$~W z+ST0F-O|*w9t>YGH_&BGZQHxzwGEX`HR~#8amwbd%i1?LZSDZq?uj=wQ4z>f*>qkD z^;;7f*;1Q?6$7K8qN%24d1cM6(9(ttO>5RJuW8z_aa~OlS|nfA*Q}^nU$bUeP1Cxi z>o=f#H}7d~if`-e*bS6hnwmR1n=fl3vbVLgZ;fvYwdj%Cw7z9CTDpNaFVuiOZ{AYV z#%zF2=w^2CskX9(x+LC=2DWcqd+{ZxGL4@VogF)TQgVY%cht|{*|8H91x0sJFBxhR z%^$;j9-QUoy6}D2rMVSTr%Q`cgbf{jf_2R#!`ekAZr`!9t;ql%-v9>YZiVwzqA8AP9~+5|1l7Ivc<=4ZF9;H*Z@8b|<0oCT9v@sGP$r zp$lK$y<=xx7iIvGuj}hIkt@x(t!;1ZsG&^rxJ5b>m}G6|_O08ANzj0GyBeArXn@Y1 zE2%m$nha<9bTe-#d59&c4_mrrizimm%-Z%^nnXzE)ouatX~yZ~xe9WMCoZBXkt3}b zNfHY+%c{TyoOtdomL9eJGZW3OEJP~iVv6qChDrF+rg%qF>-M+|IWx?ti)vfff)zTq zZ)vIR;+X~&H?wS#06K5!`r4&ut*U8SUbAc!Mh%T8&5Row)^xYE8Bw~vreW=>^J<#T zs$H|ZcFoGBwd*KpL(|e#tEde!3M!V8bUeSK6O$-fhmLD#nk#}vet2>iy(cpmxKSoL z&=I{&QZdqXG_X8cy>xv& z)k#`Tf}^H=b6ZCjq%KR5BnesDNn(YCJyJ+Ljb=r-_K=)x zZfof1?%doW%2+5xXQ?Kg7h^C!V|-V9%Yp>~71#qU8owy9_qDciS$lk2OMLrguslt< zH5j9pc~he9_GImpnSI65Wi=sIhDjQ2-^^0V$gL0>*c#ssHMo{4y#?wf>0rJP^P4X9 z0Ks?Aq_BlCt_I_EY*|i9GUp7TpSN_-B7n3zUIq9}2N?-5Gz+>+MHR#l>x)p)F&BaF zDw`nn=55Ci-U>yVRHUwWb9=n@;#C*Vsv&7jlf;1RTiG11*%8{++SDCy{eR58>v9{} zku8iz>0gc+e{&`TlA@#zjUzy^)PhA4GyqE7ed3D>5CA2(L4rnsRC9j#+0R;;JNK=s zz>8(sF+CP9U|sgkotKp>Ghdfn+MCDx*&ejS45BDn9`<*$Ufp9QE*GCOWp{8qIQ&o+ zKc7LFji~5g8(zp?ssGqu8EF+3XZZg~r@EO>MV2c1z)pPyJ0O0^gJ%h<1pn>4%1=|g zlwuSQnak~~jhbtD=d9>NPnJm_Q{OGAZU2*nK)w)wM z)aI|sZfb-J(LHcvi|)=G-UZ?~@dNvR9`T3pz+hT#5M!jC7EQGa7G#I@WeZs7_1@Pn z5QDqiaU0HOw}@1)H<3!Oc#Oos>x}6tdt04)OOR9u2;v9?udDUs^PDGw4ki^2eB!}+ zMxQ}Xpe(ODC@$jki`*%HIvyOr@|4x>McFUC6TVzr{P%R4NgHkwB42v@PL`h#3GIYP zC`3UP>*&c14|n(lj(s@xc(L$J2M(UfE@BJHM~g6Qvw&h;_R5X~E~)Q*Iw;5Qhl5XW z++`Ith~@HPqa{}F5GGiPdAqurbT(IIHJ_%Unz={b;i0B6(VE=;Uc}Z4uW?Ovwk##Q z$M*KmKEO|6=n9q8#nXdUGU^v*N_dr3G^Wl6cUfcjth<+g_s_O7>de!I_KevOg zB9dzic!qx$DX!VtVIeC7b6fX&VE;xNAQTt6wovyFor4~Z&O!etSb$P~q9=bO(S@D= zgVpT5BW4^9+`Im1U;Pi~Fac_zg^zx7_`W#&0EfxKHF>jsg@u5FXh&kJggj`1pDSM7 zUFbx>I`^XZtK#gadT^&9u6x+%QBUG@5*yo zOs{lHR20;mQ19V!g8h<$y+#C8PBzp~#Tf-QQQyJf?sV~KU|EyfK{>XG5R*K5Wuqy-|e*-Fz{#t*cS3bJh_-V zlc#HrWdZgeAB&KIZltdS-i&@{U#`~9TRvP}-7J>#wVL*7b;HfTo(!&+aCCuOZ6Mvd zyW(->niEc|2UH~#PtL(30%Mq`D@bhDML%MtRFm?{!MpObD1r1Mc5ORiV&Hc8_b?#a zTv-T}^T&AhU}z-@Q!z2?%-^UTfla`>xByuVjhIB-4!3$CCtiMQCvnfPq+_}6vwSxV zy!a4(wOboL&m}#d7%5O$7_6x(2WuCpdri_;{KY}ik^XVVEd}~`Gc~Nb68#D%FC4ZE zmJXlpq$VxCgvh|-z*V<-PJyU0#$lkk9GT;uIcPAl05gi8i=(o4c!-cdbXVtW*#FoY z7bPHvEeK2icpd_On>091`Ayb={fQE#Ic0wMN>hXUpBo8soCSft^h26gWU__>3G z_g3YcdfWTQ0{&{$jSFTT6Zc$%m-6<|ALR?AVE9h<$Z)%iviuKX6&%NI81z3<){AE4nXc zbC)!ki>bfLS5c)9E-Md5Z@HL2olh+%*0)>6;aw7-nTV+v00FA!8cvH(<;nT+xL+Ri zPs-kK*!u-%0K3P`LlhXtT5Mbca9$p=*mHxS3)v>mhQh z;I-OBeWg9>X6yzwFbWtCcaX->0iIcMYcyUr7@IWGEM6}l~b22WEi=X@0<5I8hHd>BUy2g>G&E%KvAU024=HM2| z1qM?MpirZ8X|k;l(GBv>x7XGDZ=K0(#yn@b$=Ooa-vYBruq`=+2q5s^@FDanhfWWE z8B6f+6bHAv>r$-M?d7F-yAGZ0SI*J`!W)lzRb(_%@q4PFxibf{x1Lj{i1tGMoXJ9X zVmsoAIrmSsjz8=$!<()+VzDj|#Aos#--uFhxQ;*Mwr<(6wROS5l>0H9_k})eF zu}(PeJrfWW4%mairGKyE`6UA=$P0F)B&@4+gLX%*)t)wCyUlU~D+s}fqA9_pPR~yc zVCxxAkw`&?o)6ZN0G(%1E3BQJ*i0Yq~XLBC3H&##%aydZI0zp9GPFK|zY9sgMWz!1))&A5!DozO*2(WFr zHQ5s;+Qa5>i`BJ!W%|x9wgQpawqF6KR`;^Om4k{+efM`rFQ1;CzaYuFhWf6NH9_2^E3{gV~)?NX- zp0alO)!BM+hokLZ*vqR5pE!H|-cd;74n`A1*r2(PVan1W0ATY2r)h}t*S*)`+a%s} zP_xc=z^VnL(LkrCZ6nTp8)Hn~PU958ab6>f2geVDr@KIzQ%sLcp7CUj!^b~*x`loP zA9%h7OHkNX4&ag0_x;(L;oBP6AKn(&27-d&_?L22^oED;&9B#Q2;b`c&6Ce$);rQ~ z;79|Z6?&S*zr|L_tU*8YPs;|^OlW`NGeN~)!d4?A&^fr@0KB@Scj$9&eXt{cXVjEO znK48~c9S^0Ti2;9V}3NR@d?svxF?`h{)UOBSw0%rp5YWJ#;Y z_If%FsYF3rM(zZ^1UOs#rBt87@f^tSMO53np7pP%2%B&~dSC?KU#)Hx=^OIj^KJOE#Gq= z6d|`SrAQBpznu4nz;i@7Wq7PZwznZF;V-C^Jv?QBC7v#}tf>n6jt8VpY58e;9zfk) zXxJHo2hfibd*US`z`%`Y-DD)3Ext8vNkh7<(H8ECExcT;!IDPy55B~eyM(Eh#=GrR zV4@R122=~0cU4~8UXpKzj2gUP7oEOis0398l3xKzAbbxwu;7dh-Z>ellca^~McO~* zN5xLW(R>brwiDVAucnG;haVnKK7XdvLPYL54l4zzT1yPx3gOECRKH~uq+hu@g&%*6 z^NqsEYN2ZV$^ATBk#Ql&TmSXLDLCOj{wP-ahyVEFfBwgmvAz2#LshcPXnOwepZGY~ zUJ}}iKW#}yM>?Py(-pH_`Hu43#1!@G9aA-54X(vTB71=3?o0hzANv^*5u6bT4IUDYv#v8}c+r z5~zZD8JWdhRCDangh4D<5ye=rh|O!D3Qs$|FTrQo+~Z>2na_|`*U9+QP&9H% zI;tNchdd^)>n|N~-EF?o&4aa8$AUVedM_cU{=fyy&wI_6LdJMlZ2e0bC}|{9r{W-} zMx}v+0aw(%Gm`)v06x~`{EVDU6>HHTraZ#BM6T4yf{MiHCal4byo|KW3jQB{(a)=|JQh5hTz?MONEB=0uP7Pb_wED$F?DnFZ=e^X z7;8A6%Ohmjghx0yVy_~n_Sa%KaQSaFL5lOmPKCb)t1Q9{$wl~g=?b(O5V03^ zL~Kh1*DGJa<(@%P5XUL87z3^B&FEv{L^B3e(aa#$U zqt}liLc<0f{*B$#@+2;D^rpkJ?!FK0oNzs^G!07{ybY70`bmT^iT)p4s%ch9wHPkE zQD5@c!Dqv}Im+{!o7?J(7CFIOMZ68qI1@3jONPuIKo@w2dc*W&4U3WY$;VRjG_U~vuoG(q{~2V!d=3MfVF%v>fNWF<)=RKlbO)>%1Y#N(%E zOh6X+GsR++e$DS?g~g%R2g?kq_{}-k>LObQFQrtLc6~inA{sQ~n%BbC8LubT6_mx56>Fgy@OE7-?&eDZKPU_YvaJf#lVJ2) zPhb#lDJ@@ogu+u09tZd(;)vgGF3%P&%+>;0*y;7g?FrYb={OnQU9xz!lTpWRSgJwV z82>tARW#(^zp+EzKqVRPuMT4LbWcjp;{Clx#>#2X817)GP!s|} zsIi&f`of$af2&kvIaC!Xk4m7ulB0*^{cK zA%l@^muP(sANyR9i?~mP!AYo1CB<$NU9_9Sl+CVZh-=dJcHOVQqKU(tN_4Ewc=h@ z1Q&so4W_wQaqUF^8Js7odOqt-QL!bz<&q=`mG0jANj3O-Z454nai5$5e~dIw?+jjE z&o9doVog7kj9d5~@-H7hIG{-NR<1-IAG8=@yi%(YdnvyB$Kf-{ioca&GpB6TfO!!k zQ$zd?v55d?MYwW~ua`Y1k$wrg`JU_|fGhr*c_t*S;KgDJx_qFy z$cR+v(;yh0lAS5<&$U2TS74&zF_qR1DujkZ*kc?P)bQaB?rf$tU!8*jRVlo4a?)O# z(Yl^f52KX9ZEme*7)2@LfAGPt8sHv01eqf)!@nbhQLcxuL+Gju_oZ71ef&vOR z)g1njMlzyx1Rg_|5(WCxT?yh-*D|<}(u_iCPU@A9dnmSk-$8u`DOJ#l!jO{EQY<1gt2&#qe4`5gus66zFf5ivFzF$gjn&Syb zR$qe6V}R|}()fB?h))c}S*(h+2?{P;%&nBEmk`?e6`>OS)EkoWfGZ6L@B0TJ_KpXL zQHzfSNT0?G9r0SkStFN_b@Cuq+}yKvOIo(L5AA!1J*q1I#^T!Gt`x-^aYR_Z(1*9; zN>cBJklVAdl%;AEkM~F;ps+IG7eqhc_()Nq0Tf0S!?KzEK3=VUyS<66x7OT|EY%yI zv*e&e88Qg8uKFIuOX9ogTG`$-s{ZaX^6udXMcM6P|EKrk@&Ij*#IYG|UN2Ti1tB2W z>mxZV(H%wE@WtU|fmns7PGu2U4T1aqh=MZx>i^3;+)$5f(%YW)Y&@ksPC|59LMb?u1R1MJ_ilD}=T$UE)6s(_MDkxc_7 z2A(#!Li4pNNEBEBQUrz-O&h(^$0Q?=rkG!|2UBpYAZq`z)9~6ILzrir01%Ln%y8TH zKb_;ahZX3MKEEzL3|?1pgNVHYwk|tU%|gjzOa8KPe~a#`D1!+y3A32&twFcq0ZaGH z9J)o^Jju1*L%#SdCWMI92`v~}mqM4oOFGtJ>p6aXHTk`CiCDFb&5pT>{P&C|Hdmh2TeXV|YS|7<=6brgrF4rjmuA#AAN3}Bv zCr@C!F1N_aM5&G|}M#=Y8o=?g!7~KZq!saw-0XHhxv~0vU%& z-#vxU;jl;)1}YhdZPL9+YTP4xd&;ULYjs1PB_>Zlns*F50;>NFfFZ?XwmFIq>^2A$ zy4hc+=tzOIvPzWcjBkA28$2WW?rhJY)ihad)hB5qk#$fzqNU@JgxUtU6Yn(=eY9~M ze$6w^lcy{?*y?gaV?B{xb|m)&8YFB9(lgGx5YO@%;9V%3KB_t?>Jt_4DOR*vQ{nSS zXgRX;=%U!4zVw0>jlbX2Ypwg&a1K-)aS6?grSXl14ZKK>ZOr`~Ik4c!&(L^&k50V#dJP5H+A_UM3Ij5%y<3WpgV5;n$fowCP| zfKdv8O*q1m{Z?Qn1@5hpTOpqHUB@M<<9&IEEalpb^set|%ADXN)HC^cq zfWP#<{@c6NV)jRH9N;g8v*KKXZEQqq7sabtfWuUis5E6)2z?S}&`vmZ5>`>VVYx3+ zNl!|I=|wR?QYwz07AT6LH{^6A;YKqS3XIn5?>ihF6}#_m1EiCe;{~&<sPXQE{zBcid$UWvRX?{mnOSaEAPUt z)=G^b>)a#n{bN65pCs!bTdWd~u8h`hCH58UaQI)=(%R|S$np<#X2{#C1LOFOc%(V8ce=COCjhTzCH0_z{NQUeaW9~i%jKFy zk}4UI0nDTuh{`Khn_Udyjs=D+goBPDgA9Z)6}o=_grJTL2VM_DBTj-`@6&*qr)AV5 zZ^Y8+&!DOxQ{K=-g!o_oP>b;4@ga@Vxw?S=k01a`d;Rt5OhRy%Q&Fopy;~qKm$*1} zFZ*kMT6kKghESF0kXG)fSTrL|DC$dFQP7(?L!`%4H9fyFy_2*UyJnMYbVEXu>`Nc7 zxT@u+k!#^%4o2YC%C<8)P(gFIRz1;DwZ*rJOnr+Q@ai|Uz#*=-c5e8+)T2}VG{BX* z4~l&3^eR#p9N`BP;c*F$Ph)d?l$UFF+CYd(_%CV0anoJCfa}U}x`Is%1{NpB^0}SR zt3#N>*687=KSKMB!KbLQiYHvr7M$(~ZP9i2S-*Z2y3px5Kf{hnQv*4@W-lWoo#7cU zBSCW)Qo-8)b0h7qDDEC~t-;1&|2Azci93oA(lLd~wlutS0|^CVAJI!!L`eAtZFQP3 z7EK{gCT)V7Kkk#eZ0&XzoL&y^HP}=s)Qq(6g~*k5=L<$^uXZ0>=np)7sz>4`Y{%9I%yhyd0y`gIC zumBVo5kJt&0O9u+x&+_} zP7(1szWy_o#k`eBh%(&_Us?F}JSbug)E#6czfezL{Fs&EcB_TSBKQ^sgy$#KHw(f4 zJz`2m|Ms@~8iaITNI~dF88yHdWw)!DI>`VA$2y#H!rq>S0?)?lHMw@H47by2r|6aj z151>K)ZBy>3y(6~S+}7@7+SB74H@vl!`o|BG`x&#_$$}dsJrtCb=JQ26E1z(jY}xI zdxLAvy`TYHf_4e!K`A(Cw<}U#0ZqBBiu2_i^DdcOjFBUdwUnl;OQh7JPC2eiS8&w* zx?RWN9suFBV zQZ)_b;4OKqRs_^N1)*q|`ko9^%uA0BWdrFyTR>^L*M&;+T`73BaL6KErZ+_h{?UAQ zQ~gnlvcp)K+Kh9S3Q#1bofZUB*f8vDvRP=`eW&)t0U+-d9+E>ugOzuFfL|2;CLo?> zAly_N6^WWPk&IHB;uQOHfYtyXm~dhCTqYDKK`TynwsUY=kH#ZAMY)0ymAsu71;~uj z6)fs^i^w0xSGhC8#%jNFxMe8&{1WIgh_Ie|mK(anxIW#DG(>KJsB_@^qQ@`LYXlGh z6d1b3fw6^|QqgQ2?FS265Bex3*o6<(MD5-Fp6kJ=`RUWs0Rf=FsSKymCX6kz#RG?a zS+R6MXcGtnBrr(-#m9ltj1Hj;4WQK;WF5#og9B;bpDWqcn7dnZvq7BNtBR znEwKcuGfgnKzj0_KOOtoEjpPNK})xBE+v%-d=(gfz+ucP{mC^-Pde&RZgVt!B-2Fo5^P}-;wf6(wNg?A9@Y*H1JVqBxmvM zMRT8@emEU`Qr3C&de9EFm?Z%ZVyBgMtWA)(`OWxjuOJJp2l267lXs83+rD}@UDLXRGP3dSwI8T4G!8M+x;zy)+xdpn~x>;%L@jPEID&s}-r_t%^S{gg}GzS-&SAK@+d1Y?u z6+H)6g_eZ`$zmBI5kA9XBi`svDITec6&@3)yNzN)zC_r!Kg?FQ?BuE=9x%QD<4wsb z6q*g!lL`?u6>%*g+*dO7DfTVfI?gl(lf}y^!!3AKQ1055&mEzx3uBwg#G*dkoNKIy zN;>!sq|uE?w2tJ4J|;6rozhKyQeFVEHxWM|jonn~;ytp*$4rIPuR1vIqg6IMc^RzI zJMRDLdm!zuQB(|iueNu^L()~;_JWN|YVkR1OM~oi>lCra5hKM`+2kSL?ZmV0zeYO* zy#VwT&?`vH!sI+l!4TXMpejds;dDNL#{&KW-iiSqx$>0!NgpDsPpAtJggIi6Zf)uu z{vsFu44FmNV=zQLf_5Zu#yu%cO8ijASUG&4LAcoiHBg6>8_u$w!FD-Qc7;fNeGjJt z40KfG{H+9QFDe>$8B$5@6%`jPjWYHHJjY7`aoY9%wj&&=e#I!9-&-3h z!)&dvZ4}zG2Hnm(DwsxL2&9V@vVhohX=)fF-@!WO%h!JmMJZuBLwRO!`Ts5`+($%M zZI*9+P+E-mB;mlCM3u4$k7>P0y@+*@Z@*%MSZN{S^lq@{w zDqxG^)%D-i96cUxv>9s&jYMYRz^H)}xuU zGjD*F!m0oDL;8Iu)15k80@P#s`3OVd?&gngqxQ7EXbBG!(#uJl=!falqp#K0HGRQX zo=HnDn$j)P9NZM{4L`3$Vt#qmfePrcU`@N5DiaU0F2=p#PZ&jIq!xiNZNc$SHYPVR zY=CV*ar#2MnhzCJw>k^XH+8e#vCq;n`4sdBe!369xcLe1tn6990C~QMlI|^eGdm!Z zi8`vW<-E)f!q~f+DDm26ynp7VA>I`{S z0%`z=8gd_WTY{2-V)r%R1@~+Z7Sdord~z4(LC4BdzEz`&n;U$#$ji$hXPjk@g_VWc zQeyea+LVcdFvI9G{Go86{%H;guMQ^f<>W$Yf8CcDfll$Y)96(AHZJjFTgHK6h3EyH z@m`l5+m;||sMhtpZPjK$X4p>6I$v5J7Nt9fC(K}Q3n!oRR6Kl;*gE$=yGLOiM49OT zgT;ou&1BS@i+Nix+ieci8~8;!R!lkewW{ZB9Dw}uDds>p9aS@g z`U6}yn%tKjcNhy75hGxP6A#6uPJCmJ2{jrXUI~X;*9O1t=Zy>DSMV8iJM_2o=_@vP z@I6?h4p%>7i_CxNtR#&`qdb-04f!C!5WnM*s_<`zmR*Q+A$(DY5G^zAq=1U~i4K<3 z*qZ=Il6}pvAF1$|jm5vyr&xZTaN_Ty#Tdnq#T5bOl0;hR~dg->+m3G;XIhR zled4spu-N6R1e7Q$!Wi)JmsS+rf%doWU(oNP{e-ZsdL=B*b?&$GMnh_?$iUM+@}XR z^ZG6e;L{NB`wRgOP8P;>yEY;U=jsDILw5Ets~qo9z?emTuAKobgj-x-HuuH?W@zTp zd&YdCgv!)eUHld2lZ%4KHtb9==FvUtPd1CGiI&V3bTDLK zrNm16LFK>f{qz%ClNOjg$e}2K4$Ym4q^yBEFfFEeH$U;t{8>o(uD_9S2gy#9k}1A{~Q@8t^2@;R#(mN$=>aU}P@z zy^{sR`@Ujl2=*2mevl^H(bnc%tu%HnV8kVch#8LApQ!3{K}%AO6(pOp`P3%U(y2*n z(W_S0$fGJs)wdZJBjwYyzCTvOD?>DQ;t6GVZ0HMwpWPbjl6Y@s6&n>ZtS7~WJ zwx-D(W<@>B(FSnvFnNbOJNy8>ci2*QQ|0g@gHm9E@{gWgK+0~ko!B<<3jE9QoxCCG zARXxtasw}jRON;C7Ffib0=-}p>(GEbS*83^a)yO;?axcThud>hdsyq)%8&bf%J5Ke z1)=D5MoZ>q^t=0Ua$NLmoa*aw3u?f0@lgi=h@NRNSTB)2M6T%JNgC?y3OLH{?_T&* zso9g^VAQGI7py24-Ctd-mS=a&d`4THW0Raphbzj1zSJI4Qf&(&Sc@J-ernY5)_yWIQ|L`dEUAN_q1*&8lvEl0foYxA-*9S$zy{FwO2TscQu|4LN_fb32lN@ zeBtLptvI4zZ2vA%RYo7lC+kJQegSU>qcSVWSO+5`5{r~C+Sd$Ra-SYLnid?cCQC#! zSdY$~fzCNsOJ<&pY9ey}TGl|erlq`KOQs%Jf%kTO=xAx2RH@1RBc8!^esN&oobMbTOt(q*0>*?yJ=Ksv3b9gH7H7xk2Y*QAlK zw3tKRaxrmJGJg!&6L@V3y+CC|{!D`#uQzJc*-8f{sRF&+Tu0~K$5y;RFL=o(Z0oAa z3u$wyil?c~Qsf)~CPXNwlNPH^aD=QYcAI-oxGkO$KLkDF3}73gtWZirGde~mmEbn5 z{dC+wtZItRTmneaJ0aZgXXj*&`Gd3Ips7yJsV71InOm2R66}vkB-~H}OP#-c10@c7 zg-we4?xA@k_8+9oyn@fc&EplSIGsB{q?F6x-M(1=s=KiiFRyoVv%LSb0Bj3wq(aNT zHIFXqGR5YZY*CcGL4&Nyx!3$g^r}t1_rD6*(Bt%zmU=xUK&-K-LzHP|;TylxmNr$s zbOAEO!xKUh*Pn=rgDImneTmdQ#^s%Q;!rr@85CisU9OhID{vcxfFX}yOVFt7qo8JUc!g z1)}N}>QU}tc)t5!DAm5F98(aijO95R)3$^UpN{5T@bqoV20!nzGpcFj);*>Pl71AK? zl{RYPh{wSxD(#%HVI9eI>Gtg$b)@iQ=QC>s@2YV8G)gBiY)tN__mT?+`FDfJwVYTT z3@oxZ=H0HSJe^M~FkM2zFe+<;&SYfrq?R)PbH~L=aXPkYHEiBO01@XN_6#@ZR3t%XC;bV`DuZe z#J(UkXui(s5?wNY6&Iz9eudGd>CXCixVI-0Bf4_O94eE_*kPh-us|S5~6;PdOWH?-VH`@1r?)$K~D9 zt;6Aw@F)`wAF+usl0s9Umz7pQzAo7 zUnXlAS&Ka}ubfZxJW25hN?alGs~Tc}>=20GzeAUjr)Gjmr8y&j`1RSX0!KG*vyO+g zSw?ftGP*{G1drFUtOkFUizQV+s<|Cs9Lfk2;LI@N#0K6gc4S*dZ_*OG7LWZ)d?o8J;cWg5pJqbzJ ze&b4`Z1Yph>0YfViv;n)T@ehgox1jVnaU=_?@W+dw>_2NG=~Ds5lWWO9D_m?$wc<- z-`FK>$R8$I0z6Ekp2b5GVns8LtBwX2h5#B|L>_mpzWOK_#1+jRlVz%G2*DSSgY|hd z@f$!Laa0ELTGZmHAbCE4^CB$YC$5BGX!-s@c0zCm`Fs&!dSSnO^+=lnL)rk`C5*6| zAa5hZ`EIa6hQ~lyD5_%k+FClpW@gnMczh**IGvcU;ZYBaPxQB=m^{l$?XL}~sNq#M zewD;!@a*FrAMN-!Jcaxj&si91eeeJ*`mcF1`~k(|r%^^D(qZw6CuK<<7V0FVle^-v z%Uau@YU3%W|0}Wy83OT6Bnbu3>(4PUTIv_=?R9EX6a0=H)sEZw3xDkH5Q$59Cei;;Stt&WN;NfCPIQ$sev zPihr(#Vqxqng0rhL=~hqPjG%ZLIK@czuW!l9ROd)21 z=x$gs=kv;pSW&0kZ@D42A0Lo&mJwXxpuCay%|RZ!N877Mflu+5hQLQpUsE=^foFz< zC$kA9Q2H>*JX02EPPSZK*kbYW?KS|)7ahLQz%umM&sLYMz){nUU=6K42U1chqU74U z)x#fVIB?VaL}qN)9o`jQ`vg^yA{)xPMrZt3lSXKDpR^LV9rNFBuDYb+*w>ftC>*&? z(O&6>Q}oK|{^{L?BqY&n>jgp_8M~_`zM96BN59)}s5%BLTvl_KXC*1g66@KI4s2BF zi^(sa*e3jE->#fbi0RTo8`7^XHC92AG6~bg* z#Tf;HaM9DQz7p4!hWQ$tM3UiU8tGBV+Je4r4G_5Aaiw-pKca<1 z{V2CXAXkbW<9dudUxMh!29;bmJ#h**`^jN5_U!QC+m^gDo1{ysGEN+s+KN=8Do*pQ z>pW~yScME^4AMDb=5lTBI#gFd)3o{=C$`Yj3P01{c( zibhwu%^X@I3YgJ}`PnjEfPx^_SAjrFr)6BW(K+@ww)S>CYd)Zb_MN}Sg=aEg;cSJN z9>>dbydx3voymu2Nw!VNG%5?jY}jm?V9Ju-;Y2J=Vtbner7eMG<9DR>i6a$Da!h-n zM9(gzfiTZXaR_ENC@Y-*ld}2(c=fjubg9b)X$~|`d&|}59kr$MrId8EI|~Vb&!7!O z;mXSs%cw5fKd^dnj}?xtit&twwPRPdJy#|oPF4!xq9M%y?P!qY7_&i2?}QucsAei+ z)4S(@?YghAMy~rnnb1n{THF|?#3;1Se7Z! z!c1qmvk@<1cVF@bWPoh$X%H%kS6VhR-&8t;K@K;Ut}EVRit_bmZEKc(E~9z4AX(kd zlm(-pq1Yz0ixOg6Wa1FYIYkEC8B{F=G1OR7=At8+MsXI80(N{BTZ#Z=i;{K;iqLQ? zc@77gY^&80DD?SxIddYWOQDhl1E0ozoEo)6#z5d+r$1^%3(}e*t4)xf)d~@`iNz1} zb=JweH6^9*?#Sk**fMs{TgO&tB~S55gBPc9BkUol+!SKaiDxiC!l~*Ut~0SOQ977qhPWcn|gW+naAfDYGQ{|4SA_9XNc+EEq=EYiQ(eh1!ELLovz)e zb}T*QCY}A)tTFs&7@)wllv3z$OKl9%1KRNAiZwGngENpE4n}53bf!SAW%~uRu`>-l z&xZ^l6170smd2-gUhnINuj@+q@p^$lhUZII{t*@KxOY%kE)n5+12eyCaB$;q(WN*~ zanb4tq>G15RH2Nl`6~!zX{!Pt?`;3DTuo+#NZWY4tquB#GMI_m*^?j?qNCgrJPUp$ zjW`>pci{IjR->K<~)T0`^uIFxaIkelb$-+)GqCu=+!`dzB~k__$%BY=bLo|;b1p6 zN7CuBS~mir@~oq4^C_oLTDe&3dai-$o?VP0c{8+j(vq;{@0wkXMhGUZ(PP%#aj+~Y z*tR-P8xhWUOV_?ms!Z$$v5_+p73DEB29{!u?tU>GB17_p;SS?zrvB1k$3>PO!y~JqYfqcayrcF^acuJ;f9#S264eUYvWl4<^QBE@g=|qzq z?R)M52)q<@BQk_~ez1#sfU2})Ak~G z!q7l$H3)4J>n2aSrJsbz;5V)PZU_mqPaa|dxf{IZ>F>XHyHA;;Kxz@-#!7gd<=tZb zmD1E)b&DZ2iOmk||CT#9EEjYhivo7ap48!e0fl`n8c*Kf`wNk=3*G2PU+7~@`Z&O| zr)v+53sdQP4qS!`F!ClrSUJ=07W3t-0<#+Imgz~D zEBQ+_C;`cI{uw;UczULkPtwHX+O@BTIjdqm`+yN5UhFNkXc3-vXUL#;e7x+RNF&s! zG5xcZS|ZpwwjP;`uwxWDc=Y*~-UXX5n(XUeO|-95$TCDL!9 z_p|^^&Y8js_*QM;dr<&)8)kd0=#O!CmEs7x*Kl4mif?Xe}{Lm-DUISL)BB!D)kPX>oj?3~aQzf!J!O zudCJU^78DmGpR7sj*$W0e>k~TqvRGpPWU#}a*E=O%?AsVY~u6igY%t245qE6y%7q(U~mQuR_G)huQ8tUr{xH>CDk7pLkAGS;Z<&_fmg8Zsf6S)*$Gww-qn@6Bv${!WL<7wE!=AQYPw_#Y ze?gC(&3JWljMAxPNY8YT#RmFyaeE2TufPgrOSGVT(0$}HI$o)6(hum7i17A^on(|P zW#4N~qU#c8Y$wDZZcB63>>$(7oT7=U=6cbTNxLmayhI*k+FD4#Vj8=}a9Hs3Bw;`o z#;UDB+mhCL&f7DycODnO3m%G~Q8c9E@%Yh4-R2+f_@N+jT<2Q;NxqjH>Q|Sm^;b+C z?+?%3C0j`IQX5)O6oYX&B-)E^9^zqm)=eLM9E-gTR6^1doldL8sMw~>1ldMflP|~z zdap{Kyg5e1Q#zbRtrm8`*XQ=pv49v&=bF4VF-NZ#t4f-??~!+};SJg<=&rP!tHzCi z2y=U=5tb}-W3wo^Lv0JYUBo}|homVLPB$p|x#{r5g7u`3mB``ZSXK}gXK>snXr|aW zt`HPnG||d*M}J%v-IrN+tO6&U|7~{m5#qK?Mv43^=`CS96?R5nxzTe=#N|mds8Jsr z+lj!j2Xtzbh__hLKWTO{6%4i0&Nayw+O<{8tncublxK-GeEj)z#qxOO3|l=!Ih8lY zIP=etuBOmmY9wM+AT?Toza3AmE@l&+V?&5)8x{c9&W&WEQEfvVsJhIwgQp zG~a}1PY=>lmJic6;KT^t14nYQnSK%YTz-HAzNA%s{P4CcKVRPxh4}Hu?TrngAaCax zUqI0r`Av;A5dBU%7Lq+clC_+>T|n`Q#PcfO)>B^(dn}6so^zIz{mSPPl3O{QqMqkUa#%}A4eg4bai~0 zRA_O798d0% zq|F;(~QfItacrBbe`oCD*rVe!gT4m-*Oqci$z`k&OuvG3TQCc|oF~{KqPx`^zVfZf~&QfcpZDl`*3VGJwKarz2x2c77B8ks z)KCNB@9bOztx#NS%%&QH4+A^v9WOAVlL0)sp`f5{$W=023~R!3q<3;}A07?VY9Jmu zK@7P7b9@G-MmFjS((hLu1$hb*EThGkr6HEGd+eNn;2EZ**A8?&l>%$pf z_5&7RYgYqHmB_m4E0@2%`An)Po0J^9)MVHmtTDewW)H3)sa&JYn??0m5X$w;a=5y3 zlw|?Nc($af$}ap+8n*lNH1*%(w&0l!{eGZX(~9@LqCIAGde)zBiQ+i9@;XV*ul!JQ zS`68>LeLg*4Kh5 z7NqLKH+zb{ozdw1U?}x=xravo{=;-}VQN--?hDsG>8fwIGRRTa6;Pln(R)bVN9iA+ z+t6{yu!2(s(}7uvaAlx~Eg6G;M-hWfL!nC?psy&!(+~=))-n)5PMs&i1&!B{3shN! zsO_=rn-+Gl%1zVX-sh6;zUE*sRPtA=*7ZrEQ`ui2=rj6?6Wz+XYLn(AkY5 z)g}+|nM3q$IJ?%Xc6kMpk|;`(5l&3TUstG|;|Jc)moVNGBoR8*+x(WRhrr8|R0YWY zetHzbfXdx`LWWO_#T*$I*KaHB2m`Vr!_$%|LM<+;vgq>Zp+#(?_awltYLGF zVN#{Z{JXV`a6}?&{uvixsXKw+B&X(dC6i!&n!_2;-uwcvsp1vQ1Z@F>B?n4kwWJ*w zn_naLm|)E~{57>4&^yxXOwSCy3-sSU^gOI0vK#MFPawC9qKx0*p^ptQKucE2q;Y;* zIkz2`_ommRS;h`1sA6q9XJ|u`1hF81F5bz(ggMM3LTI> zqu139yt+=v-N=M>^K#J}4lM#lX2(+5Ls%^t6ty1hdm{=Z^@z7RuZ}V9-&uN5tL2fBAOWJB$?dST^_-p$@1vM2Dv9+@Zw-v_*}0xfi%a`V;Z zQZ%MV&Y?L9vCH|Z1wQ&g^n=6hDTrv&8~jZB$-^?3X~OpQxXYz9MHB4-KaFRETdz+O zwsVJm(WWA`Hi%9D33UQK2*R1{V~*vG>V-D+1idkcoh5z`g-+X2uk@GzJHrr~Lx0BgwI!&e;wRls5ALe2a_! z)4^lTf8*Vp@z)SSG*jJae`)SRnFxONY>+ifWeQi>iM`LpmT;w#lJQBrfATrzUOh=6I>nllV+Z zAo5p1EhKy6ncQq{(G=1A8kZkQ)8WB@X*XzXX6Tw)+FwS#p(psX zi36U}w8RtxOLam)+~B$v7zkdh=Gf{O_RI37+AJ|~3H)`Awb{ArcK0>)h5@xGQbfM$ z9x%IfL;f01VM7cbd6w|n{Q1*10y)IGzo^Le#h*#2=A>EMiTD?YB`eAaou87lgr4Zb z{!j16<>-C?-B=kO*Vr6%XS#t~i-9RE!z8rdP457ioZjKsd8vm$3t9lTM|!+6+tvBB zb!K79FTgGI;&r_Ge146?AjN5(Q6REuF*Ig|GEWYnCxlwj1#&|~2UVzN zBo}RvF#l!7duIYR;PY$?PC1wvr6Mcjo^ElRn(}vtfSQ=V1ECO*&bae|eY)@{-Iu}% zg|qW{J-Gso+ji1iv43dwsQ8#CD1s)7J$<;_s6QaOJuP5`{xT0_q*Gn4c%W1I*FfVe zeVN4pM}zXy`~GneC1mu};b}EJXOhzf=$xEG9Ul|`c{q#Z)Yu?CLu95pyD_dGweu7h z96z#~;i=I`5h``P!Z4tXV#ysWUyxtBuG6IA=q;|{U^u>mx}Z(&bEDxc{NxY+{v-M_mbwLe{Q*;N8NDJ33g~Y+&t+JwoO!uicu30zq4FifK=q_fNa;k z-`a$MlKvUd0w|zLAdc_LE5IXBx)Afrs5cO|p-n-`Mz;i2tzn6D)&aIk*CIZGic$40 zVD}~oRt0sTI~9Lg2nAFw&DkoR;3!gS0M@re`Z@=IwU;;X8~}lZnPMSs_tdwJKtb;Y zjG$DeZi)<30+=Ntkm+jea2DPx@>}IJgQZE|;WAH6f*UNnp5AgP5)LUQsur52VzHd) zTSh`a)RV=vBMcBu^{CDdqI-EC{2dY0uX)Tx)Z^=fsXb^FPQt~TITR_KHbDdPeQ!5+$mja-%<$`p2*DPLe zw-{65N>er#nC`d?)6wddeKMgbx^6w-eu8`uEEkO1F`Vi32)Qcqq-!s@HJ2f+17*d* zS(XOSf2}BcY}4h8FB}cVBf4jpW&@sq`kv$~hv$&zOIg?b(^Ei&H6&T$PgQ(RWR}B$ zHlWF&RX_e1m+%Mz`&3|7dem`+rK(b1li#tw?ajsdx6T1h{BK@i$;0b1x17XAhXCTm zLY2qYfZ-|*_(#bO{xca%rOU^7EcL4plXRj6vs_}OG^&%T6Q86hzGIm2pTlvft?`ZW z+gwO3ePMATgXz-tkNUmj*+ll9u_(U&th~F~tp7Xd7At2x9CHk}x&s>A-x8C5KhuUF z^`r!RRE}@L=pI;Ptiv<(bk-monr9C^OFo=KKjVtsF8e(lFD}-=TVNHRZU>6a*Q@yz zMkK_>jBEmjy>d{KiGcgj{b)W}Prq<;9n(h-zKo#_Cm*7TpgQg}4Y54Gkt8*Bm7Jy^ zH!v~KA->m=TQ2iVvXq~xWsT<26n=B4;UvZp{APHRvE&1rdo1*pc))9jRK6-Q#{qfs zusVT3n+9haWT6HOxxyQnAjkNf! z`vv)$dicj^s*K<)KJ`(hUT{#uA48bM5lEO7Z{(9w9J947Q*f75WAVyLUx-#5c~uWa z2-p2!f*IklW|y8NTh)8Rz>>JTk>t1pe-pb;wM@h19jI)1+1#XRsj&! zJ{}bz5&;bPet4aTFjCI$ff+5P2r-4`q+YH7eLoblOG4P8P zeMX%SSLUvL7*=Z;BCO>Mu5=w^1mqlwzCvUM$OC@&d@W^}{cqidu_4J)09BI)Ur^Xw zP84KG8WNQZO@*rfX|--u!b%}ct4P}>J1h2FBjl3bOK?jVWj(~+|*r-%BL5`5Ycjik(XUcGM zzP;NkYX#3@b#JVt5ZIQ!q5h=NjVr8Oq$`hVn9sqIDraz4CnhVN5(zP!(|X=?`W$CUr)ukJszt742l0Rz{>mCO zS6Z1hzV>#+g?(1wBtcc}U}rnJ_v4kOP{Hpe9L}~2;9mer zzFp2E`-d>hHFh7Ydsi0=JcDkqrgPkpeMX$o-4FAcV8}66hzf>YcGibc#vnG-!w$l^3$f#)lk#@Lg>xOxJHTh-N|(0RmM?P1#Ws2IhJKz3UF z!nmTcEPo@W@Edy1iiyw*_OGW1Y_-v+D<)W7AFgf@ZrGEl67oXahS?)~S|0UBXlyq4 zRI;7;8My;!5jXeLl|2Gp&|YoNR=H@xfCz`$Tlym6`$>r@*=yi zzMUc_y8XS}DXy{!W@ciZqqG}RAq|cxL(T$R*g(LE{h%fjVr_;ZHR;a4^(_-lTo?N6 z%>P7-%8%#C0gOy#Z|BJk=ZjJ!zi}}XAUSw%K_x>e>pgt#sH?`{=H8#*8g2)Yz7EdA zo%?wWgYy7qTFcOey#F0#%BWHSC>fFMsO}_&_y|}T{pF-4BO*s|z?=(l=bDs_jB*1+ z&UmXn4i~9tj1JIgz(iSG$AFy5uv)iI9f1|{NFJ>r2N?o<1{wjFnQR22e!pL?kvK+4 zD_bdpf?uoG&M4WY>>uq!zLcI81p9?xq|WPbJ{QOF49S`kHsF{$P8NTlr%Li9>i?Sh zjKwL+1ck%tUzf9`(iWg#eW`@diN+2-#4vlFqa+1DJONfcW(HSvs?YJE>CE2Ly5D}^dEtg{3YGXcL; zeloJF{18)L%)c`9&kmFt4hQ*(rEt!LrwdYisn--{hfcT=9Pw zcSmv}E(`!vrfzOjeARqN;0O**rRviGyoUq8pW@By=&`0OIZSJm`H*AEl6)n zELyK%!!NvB9jkCrE-j%=tKTF+H1gU$ZZPBEZvox#ms?mmv|pI<%pRj>kg5cqb$6Or zJH0p-j1vI$N!APNs=zm=twDgxFR@Owbw{mli`D#yNd)p&EzG%5X@DMv=n2NK60!td zfq&)!E_nzK@dSIv<`4+(5Mf4bZuDIxzvp5SGY+1CKBf2XJ6yp`plSSz@)UU89&ZI} zq50Y-&q+NdyGc4F6F1UB;D?~gBq;=*P3+}N-o-}olTURmI9}Fhe!eypRw@j$kS|e@ z9p+K`REWOFvqTXPCs;ZKOWW~=n61zv1<0y!$V42aa+OiZ&bg56(<(}WKf^Xo=Qo?A zZ>tUQvq{LM@F%2C93A~MGk$R1KL$k*6{sf|lX{3Fw7VmYe(mUnR&fHv zl$Yx{2B=nOcZiIelSy|@RkQR!6vzFHYbH}|HTbrDb(8wsUvZ7)H*FrjS1T?skeq~_ zpO?ZNefbVUHkaIW__R?J1eXs-G*WQ9nGa7i0+Ao#a*f2`*S9W(9Z`evLB!ZZ``ZaH6cm{CSjqpm9OvQ>#h-9AFH|iQW>`)xKcs4V4K{e1YK$czrydiL;Sx5 zhLPkw4-eV*-9>CDZ)dC#{!m~(+j`j$?d-!8kPXb8dGU0QXrGUkw;OCg__PxeePo{< zb^L7x`x<|UcGNFbP-OBA7G>(fAW;Zr;xa|Wn3=6)pAa)kPkB_Fvf9BK)klxNx?NAH z50u>luu#^>XDF{{OB8pkmh;IqIL+vAv{V#gwHEXckeY8!f`;AbAS+_luw)2ALKd!y zi4t@f&|3t9;uUd$*IQiOfEFVQkyipV(;&mAc)DR#;5VcV#KXWrA_U5}b#At(Ks&U~ ziZr*fkaz}Ez?jiW2y5=(m<^7dfZ;j$X)8AfeSn@l3p0vEQ>eRPg-;9WK~@z;e+3oB zE%V~fgqAx$SQpl{;{*|&<8~yC+Ke&_ZRD#t0Iljm;<75^*!LsN%c>fZ%QRcs2FI(A zX^ntqUg;xiMU2GSZEBQ6M^W*r1TqcEn6u5AH+6uei7v5t!>4yZ|5^>ckLW z%5n_{gTZmpJ9VNh3MN1{xDKRK?72#5r0Y|-PItkXbVUjENBj%1C{}RypaPo{viTUkRvOegHEqPFEY8 z)x_)b;YhftzGEBrvxWEh{m`1gy_IwD5BQOd(E=Pzr?$*2KSEQ)W!_#1bd#p6fo?vb z%S=q3_&sOhj+tiMjYJ^9KeulA!|8*${@;M&AGJCiX1>d zK4ITjNyuQqTOugu{D6QE2T^S&0nTTVNf$#Dj*&m?P&nbIkt1JRqY!dB2Y_2`P~c44 z3oRjKvCdAYe)3&IbcszYqg22i-cClHYQKdChap&1EGIW9RR%{PZT{5aiwd+buQ z%IP$cp%5)Y<2es^sQh_Fvh~?A$1(cw$>jcGE`c8Op&`J1w1{)5W8Z<0d6~`w9qXj! zq{Y*&nIwTdw6QaQSofNYU}acne4Tft-9_|L{Pme!)vd>;{fO@3AkH9PYhXD@@52Q| zF9|`Bu2Bisr_*t8%vb{k zolho!Gx`2-BrZA6IKip(G&X{t-5Sd^tEtdR(YzE05`^YoqYa7AZTnE&BK<6Cm>f(z zQp*!<4|Ui=f2N&a038-*h-OI(0dzbZ|Dx5G{nP#!K*O+q2F5&!IEZoE`EVV34>wz%fHD^a2%^72H>0&45En>nI(+xEK6?czbZeAspgC^(&9C@|P0TyFkZ0 zH2z#2Ct0l)JGjk|+BiM2rZRE^Z=T6Ip!YB)Lzug+Q^*7TX|~-r>L;!*$C7G(Wuo|K zoHTf5)EKTAwL4EBQG4E}uG1wM@X&u=JvZA!_avMejL}<{t{Ue#>+6gojUM<(EMvBd z>evI$dYDujYph?ByI^o3Uc5@z4aN|Iq5?IYHaadQ%g-Y!cR2=sY zP`YeI`=hjHpG=4a1eC_ZxL>pJ)5sGJOUzUjCpcl>H(7&zPfH;}^G%fbXI4RDibR#%H6SXkwjySzRK_EGHLw9(x zR8`R&=bnP<4Qv1@Ew1vj;(}-dRgNKOli~34Ki$G4AY=oP9YO;~{rnnqlId>{CG4PP z6s#@2wp=dgouKioWIonRX`)T7%O`*^9vAGYFMx{IAGO$ zMIx~Tem8M9pkIr*>+_iwD~J-+TjQ!BU6){dU2IL9ubcmkksXv=S+e2!Yi*nvi0^WD zrg^-qz;o4v9$fk;;D{AJ-1 zsYvg<(vYixcZK{q4}mO5K8TAD4G}9VWgQv6gUXD<5WJKH`;3Qxd42)&EVL1A9{oIv)WD~A zW6|m*TIyaojg^&=8j~jNx7|h&+;0jipr`>^CNIXz5aJh-d zjgn!rF#B@umvQkmZf#82VF=a>fEJ1WM?z3yhNA2 zenAdIcw(&&cL+Xzr(n^;#=_yOyho^96-e1T?*b&>ZZ2P6Q%GtZ25?Zl>pJryX43Wc zRG9yKq?vegf2zZHuuJ4&qvqNc#nhDTI~v)t84}7}oV?;&+zMIBE4a!aC!l75J(XP4 z`-i;X;163X4)RWQzR@+Ut*MVjsO9l>VJ-uICDW!Iuz_|}Ajr}XVk0|X(4a8I9fT?1 zC5q~^yjRh0QBx2M>b#PkgzcAWMfsq(7|f*r+^|rPGHN}Ac=V-cWi?#%eS_alWqbyz z#;62YL!wrg46{u)yS>0}Ry#5`=E!TpT3vJ_7HPWIlY?)DY|6!I?pW z6AvUnB*QoQiHMmf^Ofm(Y+c~i718Q==OrO}q-eXQZn3;%VVfx-X?e1qGYWUm7eEL6 zCk>X_g?%=kF0Lj^^yXv8#CYNc{(GdmaSHU6Fqwza4~@IK)8b7owz=4PmEh-v!`3<9 zTz2=xE#w6>iSL*IM9NTd8IljN64J6(G1=_h=|)UookyG3i%J~@A~n&s6!YlY%MS4$ z?hMh+28gL)Ukb6P9l$SY#?(*$)tB=tfK7i(ct*FH!Ss^ zPKj!Fw6xYJun)(c{SdYrZX7C#I&{4XPD`%r&&no@6J@@#CU|VLs^+3afJV!q5dz5N zIySSXZ^ zo9DEBT07D;eZN>}@rmq)*lW{VKv?B8=;_z5FR?{@ActkTYFGOUhnFc=U1`D?+#|~> zks};`RPkU5l<^$i+W~LAo14iRACgy=Gq}~VBgl619LmY26m}^g4;27c%sDYzZ%5*w-9#G?VBp^1iCI;7^R_os=Q*0I4 zm|+}G)}QCzMia0}lXf^AE-Hj?ALk2PRPUo%_r0C~5uxa~x$O9ThI>Hg`F^3>2nwfg ztdzV*J^>YO=)!R)t>K^(gtO4EioatzmR^)^Q<+I zMmpj({mCLW)XV8()5bpA^zT7&v0UzAFZodehi%ErqQE?Xifx0~XNS%W zQeJqD)f(;1M|O6+4sJ=#ycECw)d@-$!0`;_NG-U)|Le zLoNrDOs)GjoS0;0vKUp-XORLF0}eKRuOs9Pwh99`!&7tnm77o9H`<3QE_pku#HvJMeZ0p{f6? zsxT_4(bHu{y~UG!a=<>I)dz=aPVmE%9{gRrD(~)AUto+;!n^_{hSpMijEAs#IQ7V- z0I8=0;x21f6E@#ep9B)iPf2F2uqL%0rOK&Ti1E*^l<$PE2EwiNF5l1mMvQEo~Q(uYmCuFUW6zMwu*2(i2CG=)~3;kpraDFqHF{}C|C=@&$L zF>lK~hEuRmlv4MylMM%aCnxDF+D29T)-FgNP$U*PK;2w*83Q(w-GZ;+94in47&MtB ziYsRgq~P$qp1{mWIu^k&&4W#m2{$t*PVOMq0UnV3P`=kkZU#skTGBs-S9p3T)_I%f zD*eK`@QnOiFz@JFYaK5Ob&3NVE9;OI2lH&Jt|>}9sd6hRQFxAeZyzPlOW`OeJ8Bae z&=8+h!-aNUh&$_q!Xo#!_{-Bq^@(7KWVAA15~T4*-gPk4jL6HDQpp}1?q5y@=cA5* z)se4gShe2f#~)23bUc&8&(*6$+eO7#(|DU;I4LSvhS}os5)G9zy!ITdT$FDD%&;Ni zdJy3N3<1+=3$>{^8Xc3F=+&aMj|x%Ka|H3$&*X_;o6vzR{ZK>PU|~@~inHvt2eri) z%wYZ9Z3djn_>}MZ#qp66g3*!}dN+6uk)Ij8I_8vN z;_rKuc;Ojx6@&PSL{0{U0$SZJJ0QIchkY=7@DHZjACm0TKaB{A3jTJctS*B;p6wj# zjAI&l>U#qWk#1o+^*BZUB7F+)2br#7*c;;s#F62I;=$>$EabD+(b5+vaeZGLekg_l z^`Q6*Rq(E2``~zR==$sUU?$CGSjI|9J8sb%cZ2R=pp>zT839o)aRj4fQQ__!B>`?= zM)1O%Cd6N=mzb9^NY7yV?Hdmd!6_+yO9vrSAZSX8-_VZhY-0Ai$9gSf)g0 z{Zao{4B2xqx2W_!p+__h-Bc{$!hdEldlgSNsva7F`{7_*9FB`4!xhZ!J!Iksb_@gj zu(g_(%-dp{K&nStAaO=`v;o6Yj4#F&6iswE0^P4bW@1!b-B)Pp+$p18W^bj%cg+TB z<8Ro$;I9Z@iJ2tbYuwg3lTdnG3hp-l6^EFleJ@a*62)*#!K!%^{6$;}W8dZ728?~D z!X!in`Fy@#Jij?>74BK&No_wiuci!o*>I38hux>OwYHRrH&{A1e zKEopppR7KP*7F|<&ELTgT+Kq8OsOF@DhdfSNs=qC?`Dzaz;^=|8 zfKfD^zw1NzM{9ha?+7T@ih~NA0+98r7lf(gu*6m%(-wN#Yqu{8p zrwCU;&iejHa%_)n!jIGATOOPs#ZC=#FZw5OM}Lb(9f0NNcv~HkQq%+fqR=uI65~j-A;5i(#MHg_zr{aFdedJDab^bW;q^|2fu)3gtfGOJ`!vU zE@R9bk5eJ{yP3aDgEBm)SOl^n^bOn^#nqY_I2%H$@8x4H|3x83exP3E>Wvv z+YVG_#oE#<2M5&%_n!XcH7ERl5CCtniFp=;1qQ|MfF1^GVTjNsIWwpQ=`9VEPlfAf z08T)R{9ZKt%8?#=%Y~LExL!ftZwV=wr>~gLC_Q8*fqAysSbqf*B&$p}ylS+*tDqNd3neJ_HQ0cDOM(OYW<9^eNP8%Y1_TXqhn*%*BlMHSCqasq zNjK>GFRqT21_l`=k_SHjgae1w5SzK%V(87&k`0+M8=yu3%O~^#21*j%ej4`9O0BKq z2~_*0=D+*G9%jHs?Mb}Vxw|Ycp%@6qNGHL-8j0R63jnk%_Jux~6 zsQ2(j-X(4*3t{ zRSn2<*?mpAmn*5WE>bRq{|~J3gJu_CsMy`61Q$%K=WRG`$1a)U6>JK$>a`be#Hm^e zp1Sj3f)R*sb9>~pwY*!a3+5dPp{QJSB2E;cYN5mhEvBHH!x;SX@(`%P)I$UAzMs_Y z;Ll?%4}1saD+(|%Y+Bo>q_IFuJQH6$t_Cd8@$`y~-Iai$xoXJ ziF)*i#a{9I#ctyNI z*Y{Ve+a#~dIfLlnIhzqvSY7_}ocj3ayBwoYmVLTedI6DH{4CKkz4hRkQdf2wKarRy z$Do#*cX!w5xPtLZT5cl{_tpFgv3j{$&#-}rxQCIIBuu%0O1pA)B%a#GcV$JjkKBI&W zfeX)NUQZg%vYu53RG8}FC2i_m9}ObivEmb{Ztdm(zw{}>qep&F8=1~EZjJMi;-~d1 z)9AtJcg_^v$2v06R0d6h2Z}xZn7vJVf<-3CY`t>mj%?)Ou_6H#gy%QC8-cV zP)aEsPwGZ}HQjpP!K<%6vUW}u?v-VjK#mL_Dh-%Fm(d{m3HuzxYB*Ck4`~sJzd)}kqzax>_Lf|fJ!;{N>>OQr(XRl zrc%Ls!m_fflN3U2>`!hat?X>Tmd#{uUvXY=wpHYEa6p&KNgmlKb|Afv<2{D}LhxB3 z3`w32K8B&E!=q~Wfys6^+0EiA+nUu{+6G)*tT(H#GAAg`YC(ZzIrRS7^UA<)$enCx zN~mf=w-xhwgwy+jU|_lhaLBu|_uV*W6@N&&39G0T zmAC+@!^VF^BO)f0@KMoBjD3U0&c6y-Ux)`mJQ?1TvJDhN67~Ghq^u4*uk*SvE|ESD zN*jQKXFa%ZJNPh(+Ot?2hD9q9U|N71h(D&IKYuNT07&~kp>9qryB}rUuReW2CNHQ4 z*Dxo%dK3f^S);HrYlmow|40=LlA0(gLsj$@@5Ck?HTVo@rxj|xIOih8@E#_a* z@E#ijPZNC9y~`^kRMF#|bTCJWgvjFo#DA?BUtALdU&|Ega%J#H7va=-6KT^|?3C{p&lXav{HNSCaYL za%h|m)53~ymTWj;NYwBXg#Zw;d>KgvV-13GcIJSCiZ6iZCM{NWE`2O`zbq*oJl7m-QORoant^Ii0nIEbt2 zJgTGO;QXhbz*{oc@&72z$TF(2tKjD=r@r#ENXR*yC-^+u0v#vGGS}-ar05HFHWeAB z`IWRu>d%JuXu*?IK?u4=H5POgdYEc6dPf$IyfD*8is3r@1b1u*mv@0?Q_fUbib#c) zDIzp8kbP%-laD~40}dZfm{Q(n);sWeutUOP!;^*|?lk>y_j&6I?*{sY9X#<5LMJ@V zvUJd!K`&fWU9eQYNU^YQd>AJf!@^ppSUB5o>~YrczeEi?ch%P$lzwe6;HhF8y2$Z0 z93e29T&YXkfG;eE-%BGP;9d#8jSK0SI^1J`6L$-Mel0-Q255o>a0d_H=$j@-16yyIWeNY~-0A0r zbBwsSaewWy0s0$x`%E(?ZkD}v_za(ifdNiVC-5LB47D;)SsGTSYYPHAuE{AD%3@HX z%Wx+m#QYIkVMF`8kU2F4FG*(4q(|0`oRY$pzKlTBm6akL3(%Srriw^YXw_iR3B+iG zf!B#_R)V5TJ&1BP1%HBojJknV2^G6$GBd5z?gZ7}81u#w+v1E^OGia}T{VWB&7FM# z=6cniCwCJ)Mn2O5Eghtibc;+6OJ6tsOe*&+OfW6YUx?)K3p^!ow9D1{E9lkze|{3L zKo8d;;VSr&5+;Fefl+K2i_k||d9k;_GcgE`MeLvdR6ISLRvj8zLu2TW=e9&`o6b-* z(>&cpH%->x<5iLMmW^VmoI~Sr^nI4xl;phi0cx*1y7W_W<>TOnD=Un}^xN$9S9}_9`q?}| zU=F+f)()83+v4{HCX8cdqJI!?Q=O#quBON+4E?ozH(7e1h8@D9b}Ta8fC@;n5z*ty zVUbARMlgerAeE#!4VEkfV?oE%M>GX{EmlZA0?m`aZ#9 z!ULyG4vY;o_zL(ZPAy1IulK2kIRUB$nnb5bqsJs5{$-@qv&7IhRw%FQ_2x73Aob)82`6d%{Wp z()prhK)#eS;T{4TZnc^f#8ED;ukt{a17|o!n>_(5Li2pWlG%q!csXvn+g7Rj2BFDk zj1G!>6vGrwsmF*K{HRD*86%3kK! z>?}zGlS!jniklVwqvL}a%?KZ*w=UWndPZ*N9lCo8DrRn?-V^w>WTOR!bc96pjk_;G z55mxR1Ki1URAshB8(cR-=EKuhT8!sNK# z#J0I!C|q3Am+9$%;s7zQhPIl5po&IJ1J}tBi@Qw=0+(6 z>d$+31V=R+T$S!to0rKG9w7L}P<(%SF-Oh-!V}D%P!zrS4skhz;$)8Qa;}j-jl8GO zd(AGO)ZYaS@%>>F^ydf|-*ls~vFhPks+CCvmrS*^U21Qir}Ka@U`3uTEH>dA(Y30F zktFBYWA+A)JIm$VI*9WT{nUX1fPHzOq{^Tp?Eq|&Nce2tHa#3wrzJ!FMpKN73n9Bp ze}X8<7g~-;)ilTwStE=wxn>P;ZGFdIBwV*VRV;h@zv#} z&i-(IVDq3R)jeYCS~J=Wmg41_d?o}aOd?jcCJDG91PTw5@H`O3QO@+o`6J3`zu04ygnMiWVqTJ3@3@Qt-?L--#&1NO?q z*?@;xaNPOQnYkPu!6Dx5ijt`9kQb@8T|&EfM8z6iwR{G}>?byHcRmY4;?kReD>^~e zN0eNj)1*|?o!>rk^~}Mp)=-oj`kz)J=p0IrLDjNR%U5f6BUhNGr%>LZ$nXQ|TNiA^{@eU*9M)p~j5HgR`8tK>PYk}y0$0!Bs8EK34&K3U%zs~Y%`PW_9eCZZ9aoF9+- zXHbqh;Vq!D`c=r5Zi(}03SlP`r~`3At&!2p_V}2yq8G=rFn#}CA-!^f(!X@6rE(wBHUS-Q87Z> zp4h96jK=q4bUA>d*}FtaEI!nrHmV3kKh&4Dd~{ObiwY0`DOeyt10W^N2mkhW zPA+#t6}VU}d%~k8iKVLU&6~@~%#%Wc!jO*}^!Q*hO8_VoRU=|$9|EOPO|MD}Hk6MM zf^A}ens~j*7vdK}1iC2^4hf9-@+Un|gf^^s z+942!os}LdDL4xJh}$09K1X?GO!=cs|6U9O)U%lUWfGj7EzthcnZ?SSdC9oSlusiMiQ@LNlI2 za^^9%0=cb}Z6q#dvhZt=%hDRThfCo1V>I4{5oeDuzt1lg2&nn6sB`jQJ3ExP^9JYG zJRgdKC~h9(b_{&`cbNN%Z|4LOl~6ekesfqbi+zRTuDv5E8rYkg@e1E)UoQSrT;w8Z8NfiGs*^!fFPlB|O~ur0ByKB+Uk z>aouB0~8V5wNeHfrIM|C~ffwhW8x%#1OrR)m_ ze|rlj?q(d?zoJtm>E-=--sHpb6J7Wb9#)u_`tmzNkGXVSh9xmqlD|tZ9;(btLLZvA zZ*NJ5BdP{D)1Zqn(O6A&&@@r@>U3@vK~6ZJ~YBZ-r2JJ$yuSS$=j&`>ma4YH^YEGS|9^*n5Z=p_OyJ7+tXGS5^frNX; zCyMW|5<8SN3>KF+LTqVs7HR@(DuT8agesQ^n9xhs38yeWdRq)=VNye2EnODu4qZ!&kZ z+kQ4eVo72<(4Qh@an<@~(k_n}J{Z^#nn!+REkw+y=JHhM(IH<5oz|dEYgZfE z7?CpmFBCe6lU1Qmf~SMChsYwTS*}up*Z*87#IXk|anKf0eQj&_ zgxi$?g+n68$REn+1RWbinLUo90jQ_y3{tqUm|w9NoE3Q>=}TP?5e@y8rkQeDjt{Xk zCTBT}BX(uxTULWqV3G%&h%Gd*=A~K7&jX2X`tJHj+E+?k%^vY#rLfO>^=0w@ZBaQ0 z_{yh;NJ&vyP+ieoU{)<@&%v!Hk$MalW39Oc;*gw!0k}~<#&2p}SpQK7j0pTmj_0s@WcIAwye!R!rInqaQg#{7W z(Gi)CC<$wd((!Pqx!fCElT2|GbeO-WiFNrc0!<;`f~O8O^#;?M3n-{x*iP&dq_$7Y zN>;gn7*xs2|MZ>y7iViNN#=b? z<8PQ_R-X=QkN*LGf8}HSR`4N`6161L<|)ve?loG&2BFzxjHA}$t!@v_m--0&NpGJ& z*{!<=qB~Jr{Ob{ySi7|3m(70+qw%0kQ!4fP(?F?XgPC&5P1g>R5Kr8E1-P1}y7q2! z7Hr7)@lVC99T9UnrKxMAH~Ixp@0Znp!=wc=or%Y#+?T7{3V@cf_b8SnsLu=x@nZCc zVE3UoJRz%su7Llent*64=w}J(0GT5p8QjK)0~ZiyPCFA3ZIGjTjsg-2a^}?Lh-D-| zXFSX9a_auctI;fJ9wK;b*%8GpZD~HptS&lkw3fZeG9|S+{84Lz-y9tsbTO~SX_t`B zG;$-cqFBwmCj-?$s6&uWaebgHbDC?O58V%MkT6c-5dBCwsL<=Nb?A=}g!sc?c|e6n zt_m=fgqC@+M&3FfWLsZm_dK*FKLZ+qB!Eeh_{;11EPQIiIlmgFGj zm;#UEPfAwp1CxUXXAD?$2Sdc~mY|jB15+N1j5Y{rKp0A*!zTLxb(!pc)$VC11he!C z15u%Vs>wy~uge8Ww((9fu@q~K3(jvpmvi@EdM<9yBX6YRM=q?Ag z@+FB!h)kVh($hd%?q}oA7G{cucPETp8KSu<(mq zcRs*xdwD&-)_H(zA3}HUMv~o)u~^6g{OP;!qt?ylCAcWXkN~QB*G0iqZ%?!WhOTt_ zh~K!Vi4wMqfv%8BTu&FR%>@Z@kI6Fd&Tm#Yw|Fw`!lgD%AFALhZ-E@+<4UqM!p5nU?5rL@ zA(S+kloeGzKaOUcx>b$g3rpMC&EBr1R#Klx@28Ywi*XP`pi0lNxSZ{FIxTqif23W=YSqKNy6 z3*jl#=|iyuUFJ{YyJZU<0CiI3EtxgJD(w zPP`4eZzPDjiI`%eaz@sCx*vwr$KM^wG#?3&J=QVIEqP@v`bb_w?15kij|IO3@R9s$ z^`V-FT?&hqmte1PWhRF$t5qI$x5odFwru5tiRuZ*)jMn!R@IgHuN%Ec4C03REE$~*vgG3JJd&QSqoRDeyA&RNA`e!zU0B^c+b>T-5d4ZnPO{d#>@ z?#Dn4U;q7@p?5<=45>4M(62Br4P1+ydoj>=&Id{*rC z;A+`I5OOyfKqg^%Q2KDI{Ney4j4F*&ZP(lhE}?@cIJI~yA{YD{boLW)L0G*Goy_Xv z1Ql6?RfY&-AwY~D&&gw^ev5j6p~}Hv5^-ZP?=lwqIbU2gpN=Y8j^#%&?GFceBH9z0#PT1 zS-ZJ&B4liFa$@U_THfK*KuC}`l)LwCc~~`GgaUGH5iy>uZ^Lf$xO2*|3%io#GVo;* zdE(pNg2DOtb}gyHrH$b+9X$h`j1Gr_E?POsIBKDw-YAx&ZhXSl3s=n*P*iK>9hv$D ze~0Pss;d-Uhtvu?-d2AlPUM6YD z+#w-!iS@Hmt9;-?-tp}#`t6G6yjEbX9etx+U=)|9#+s)hK9+dJEx1XZbdHNbOPnbv zYd@usOh$#e>C5Z!P!Zt+46@6$Ls1DcEUI6$wh;<+*W!ZtBFTrriX=m$RgQzjK;(5d z8(d9>RCdCx?x3OGm5OkGF=V?PRiy+JAdDjIcwqjNc(Q?&ByCQwd0*&IwkZb2bHaxa z+!aV8=qQ0uE>|1J*FJYz1gxA~#-l{oF3U!`ggzk1dhqxd_gAk@K`T;sGy3?TS4WlC2}>mzRzG^l-%g=Dwi>v9P!&~WC?`W+-+0&Eia#Ykx4Xnx`qcvC zxLXxa7!Gs1A*4nehH2j29clW&+Q6M1ssPE4!t|9xet{H8Iuct4gLC1T3h8l$K|_y) zshqUUvDwr9x9n4r+c_d-dC`XfwSJ5Od{Ffi8q(S_CSRPQ%5s&7A6P_g?e=P(X4O;B z7qDO-N}II?SLf5a;C#|=dx4N)TIoubb)J&KD$b9v8lny&>98*JvM9?9O5W!fAw;W-)2LyI zov#?FX?WFi9I;91=GwV@3wsD1hW*eZSo#viO;%jgzbNRTri+SkeTwlPC~cZ>Ps^7y z_`5~iTvmXwItFXET!|y{qz!TRP<<_c37;{&Ch8ht<}t)O!a0OX%}Fq(Y)uY4+MsGf=#0tchdc8uOKDH(7L+FRyx?FhF7YT~oy;Bwqr zD>kWQ-eXtm)vM0lUboL$MC-dOj1lYfH;9+jOymV-!`tI6WiW=zEz_y1C7+;TsrxY! zLSSsHKAfF){|Y#L?+in0e(CCxKS5SQzm1F+;FJNX%cF~+Do>aS(_PQ4;fZwch04-c z1SxM$NY-gKb3e=3>Eh^04TMHxQ0PyW?QKlvz5y$5#Sr*4ro(B_-( zP)DJO{Ho03e;|Tl84BF9J+3}yfHg$GXMoU!i`BD?tr!#+g&4i%`^gASKsY$nubq=a zq;vYX)Q6*Ay46AF!<+q1#6~U7HNy=Q6B`n|3~^<0!;ix!?I5>4uAzYoN}RtQ;F&K+ zH{eK=B8{c=e5SJ~te~Rcr5(;D-Na@$bz0Y&A=dZ&`)CKzh13O9Qxu9*^r$|s{{(} z6wC?efI5ct7e^x?*t(UR<=;A?(g5)$H>?j*#?ohkz;kw4M}R30DE=4T4<}} zF~COv3#w$@8SH+UgH|rW)BmO&MRu=Wjpkmx#dlmFQHWTLFonu}uD>Tdeen#S%UM#7UVuR#(@6xx}C(p^*_Fwii- ztK**SEwLk1qa2$^TN1R9J)8W;V;i@QmQI3x!Kq{z18kbPAG4>?Qp%x~zsj?VG7oT> zPML-SQV6$$G)>gXnXF`5hzHe%iE64RNnr3ttw1&BuO=7$OXuJW`>zw5b zpo5az3lpi49ATVP2RP*`nhi3-|E!2lz4qGQ(a2fpd*aj(rg>~;}zZ)~DDOeB$HD;5& z8;F2%5CKyXSx)uaBL_uO@>>pl!xI~pQxBDiZl|pTxVk>Pb)9#vTZ;x8(S;#Y65HZfvQWIW^*~D zAz}yZHav;gL5o$Y7h+_%9x(t`i}BNXu0m3fF?%r>jX=J)?9u~QxKWaGOlpe*p;%WD z=Z4a8!MKm%?YAz#vS$adosblu-@2*mxN#Nh=4$S)hYgA|?xQES!3V(K^|dQ3#0VKPck6QAd3;oY0{m<0PH&6Q~BD%)X=+n8CNu9=HqR}ClHsr>19j4{-ZQ21(am%$ zg2EeB$7qXg1NVp6C#!2RmXiD|@KbeZ{`T%#Ed<`i3~;PvgDU^@NKWYdG27e~E!(uKQ|M{a0AoW5xPm-%UAV@Qo2Z%*5QK6tC zXPL3MKelpN-efFO#Z{KYW$-Whc9F3PH4wGTcC zGgX?b`xDM@K-tntsyZM68F4UIb-Vpn)iHj=)N8q9^!u3D{Dy>l@xt5=$@Xv*sNR(e z-~%FDPzXe_9adxjfzv!gU9edA<_Pk_ZbtSGZYr0m?q145c41sNVbt-|9h9c=#rS$U zz;FgFUEuxqSI-B-`4TxfkzuRMgjvX@eaS_AwZ8RneTVs%*T8DVn_#!PMXYV%^`qp8 zg?j~>$B%W=Qg&i#NzcF}=F|VAK1+j1mt5-Oi>O#sd4IUVcQu#}smfdn%R`q9i>b6A zI>R*)nehRM*oGaj@{h#NH4WEU^0Sd)5h7nxSA^1%qm2^p(2{U=h>qRr^r(9C+iAC`?Eu_=h;bE+qtd=GjVemUz1ZRr11EqM zafL#BkjrQ+375fWK;|ydwHchg+7d~f#Dj|Prb#@S-`B)G9mrs96MIur0E=zG|G-?+ zhgb7?aJQ^b`#In+5eRa9>cjh^p&B-ScZPg5l-8z=|7iizmKSK%bW4kt&6~v%yhhVID;CpGO!5UbI2jwVqh{Li-sC|0kMo7fp%-)bL8q8v z@*}6;t&5Kh<|202=<R z4tRpkHkS|x#W3Q`OH{`lXko@juY;)sftnU9|8EaE@2Ug9p9pd!M^NMxm|*0fj{Lwq zz{(>`sa0DHl7UI3TOTvZ$-~*rBO;T{60=z!Nav@bE^%%MDH6I<85h5dJsPKTK3Q_? zil}U4d6h-~_xURD^$=g+20a;pbIQa8a36h;TqvUzh;~t*(fXl6S(P3}e%bF|D(R7+Ht!vrKkG7=3RATU-8`CKRfFLWI8Qb@u8Wp-{R}aOE^=_76GpNN zCJtY#$4MMhRX`fsM~mRfL>kB>Gu%Q#`sAdyk38tf2~-8~&dUC_-#x5;?RI{W>4-a9 z;(Jh%IG@3%5=%v4^1Fy#lgI{CC)Dru7EQVw7s_&AQ9*orS(RW0dRE$wv}v&S7fBs= zZ&S5W7vM4RNPgV?YvjlwjS!)&v}=*9eC*>ub$L;&X|V-|Gx6cePA2{>z+n8v>`dHk z^p;F%WRw7GFg>!?H)c_grUith8&Vo`^7+dZ6N0r=m8)v;za)mqa~=8yk;52bOY5e& z7GkrcxK^M`;Jdk(0v(`vs`xM}+t3QUGg-%1fgT8Ckb=6%XIR81cR!sB#K)F}lb7_q z_#%eT_#ju+FE1x^kbWT6-Vryj4db3E#?1bBOe78d5AhkG}7RNtwkJMk}fbdLotV;EQS8SGG)yW zD#W6jqiN!TC;O?QQNY@5+zUx5M%o97`0ew2F>0Y&YF0$LI(po4H*XG(_I^UNYvU4; z>0w>h+2K!zn2ePoGl^q*(0vP+4_@iv>HBWK*I%2vW0eo6_>q$J|L4!ze{eaTVT{zU zxeZgR+VuFkP&A?SMHuvRW>Sx6%bE=)x(*W zU8+5&@F;mp0F+nO5v0;?!H3h7H^7rW zuH6T<32x(2nJv9zQ^=}AcK63qBwL@VJ$MXMm-`uzBmhu{`CaSN_)ZCSxExiJ_mjw& zB{NZh7o8)u3r~<7lwL~rp~}n&2;=6n=^Zs}yQOohlPl|+G=%cEzMYJx(%(X$wx%MY z#%bto4OU2cB(j=CG<=pc(V<~#4fRnV*a;zTf#0Aew0GD8ENgJPF76svid?Q??P_ix zUM|O*uXT8YevyYRL;FS2B!Xc99D3qyC*^^mr()jklQhIycMHqDDVJ2_DRGLe{$rP8 zhtW4EC)jr7rmyNHzriPIl<1bVnuma@Azp9Lpq!2-Y@@GdGMvEW>ZOz z)$?eXtFVR&ONQ=Q*7gX{e|rq+tql%0rq6_L=wF!r>#k_x6Cy~?Om^W&2%fW1UpAik z-L#+S>U>F!9myy6kl%WTLi3WR`EOcNMxUS(e`3&VH3?d@PmXcIDtZ^Z{uh5px(KPz+~0I68dSIzH)r=$)d~Mp-oX zebz5L7e}D701GmKcH|`p4Ye5=C)5t6kS&1ut2cA%u2@mX`s@{YXONXxa}yGVBD%Yd zC%A2`DRj2}n&22oM3iz%GGN=vHP^Sp2c(+7)`Ts>TE$#IKfPs!2^=C2asQp7qegNq z$B$;LVtKgM%r`tH?LYpswb0ZdJF+PX9 z{-D~^OV7ZHBok8Siyt>)+ia+Uy}KmkH_k?fVWfKP;&$N<6IZB6BeE*M#-x~*69oP& z9Sa_@cYYs~-QencG|=cvkJmYZYVhn_u0DFMzPCJ-i9`B24S}R?!c$}2wv|>P21)@H zAs7^LVzNHcT{8cKPo=qt&x^see23A{R*c?S(N>vnf` z+YQ?15C0u@*!TgY)01t7D1dubWu>MkKS{a-*0#=Vu00xENQwk`xHEaQgle6H-^M5y z4+p)JJ(GA5JS`*R*W6R}+N?Ng?+llQaCDy!QFJ3bS>=km)#VGvHUrcBm=KzZ~og(ItUY^aQO95N*s=SS7yZXkuS5kgBvd0%R_n%JGnd-bg)f;>s4Kbcq+PWf=Nav!EbNx@LN9Fiqa4??`Cb zf&Rf+zJO_-fhiuzg!W}bf_oEoCjaE>Fil-|CqT2L07#fz#u%TPQ|Lh(Jd<3l!T^rm zCHK>b_va&YyV7_WZZRipsWHQ;k8 zk`mpY0jDx?){kW>49eH2A|Z#T!2@V^F*OU_MNNvrF={v4BGSqo*?#sWSP~lbJwSv) zF}W0R5t>~2R6<9#QSAlk_GE$iYBZEb7CqAC;BIA~iPj+;dg!(T4024m!O zm-0@An*T+!#iwk|${7f6x7Tq{c> zf7HwPpePhvJ!n1Fs~lZmXJeyp@{p3OSxVAOKG`8d3MUt6SjjAZ{-nHwa}`<6JNY_- zNQ2?W@yG#(!Bn>U0%g$D4;FxJr5b5xU&C^8L1wek_yG~Iypqm5X4FK`_Qr?DwGk!5 z`EvNBwzuT@HJXwWmgM_sHofY_&gLj)cXVkQv1ok(H^|Kl`86!_N(P!Io*>Te8YuP? zT#f)0q)iFx(85Rcx|bZyRMsyh z#W&%LYz`QwE*zcgbB~jSs414+;1Ec8Yh4*_eGugXk?{~{%-0UFj{h5 zV3T&JFUQBR9N0uKS?j|mAJDHu?W6$eynv9u*j0R`lj*)m{g{lQ=%HDW$0Y9jhQ|*m z@zCAEtkI-1C z2vpru)gzmQ;%;maOVr^N9nTrSFM`_r{?GA8v15;0Zks>@hk^Y)D3%0E5OpG=OvGfE=qn+_(;UkeL#@9?kB;DN zNX)3(E*26sX5xgfYU2{(p{$+4GQ1j6JG8{`}f!cyOW;ymx(RYD*O+kXS zwjlCn^F4IfZDg2vZ`n{Z!T}S$Z%Qki_bs@t&6xeG!OfRE*x=c9R9nd@LV~F#wU@Qu zuL)LK*MN9PDem)SX?7c%C4H0b^UVNUuukfWkUihsh#~A)gBkR$K|OGW2}a_)@+XWM zf*+&4C%yw;pNbfKTcSAPKP&kxm+`*F8<~}dPq9=I_S$+UX}k~+4#7~8i9;V_yg?gg zv}Jq_Ij0(`3^3YT<|IBud$nI8i*Knb)cv9#0rL@q^ctaOse9BEQ^3|m%h|y8-gi!9 zadr{V{^Mpo9v@R+4dg3rb3nA@OKXxJ=ubjafYKF!*CU~B44!Ke`*I~7uM~yi64oSbxi3q&r-&E7tH-hbWt8#DQ5t`fN%#CSQeA6;6rOoLV%sR!E-gT^L^1?{-cQ3+b`2 zU#ztZCnIrD3h%`ox|F|b4ffDKARU%9O1Pacxj;?R%? zJzqvAu`-<4Wg$r!{*}LvY-5WNZ~AzqA5Ip5&3E6KZBr zTX=kbb^ZHW$DPCdjx-&j4G0WSGC>b8)V=}-Rk49ibbz8Lg3(PD%IsFYxZR^Jq-JeM)7sg)Kh z23g%{uoR8bqV-;AC9K18+u&8Jhu<#-&k!W zh}7X3M`GjNA+3PRzaXU0j~7dVPOfAk3hy}9jJ0C0D42TJ3}T?Ys}8%rR^l?5M#IBe zNl}DGwWKI<3+T+cVmLwd&d}*rdSIJ|{3?{}O`B|8k4<9!xpj}Rtl2_&)-TY+$cJ_h z_7$bGx_a_F#@j(M4n^P#^iXqzvk+c2xIeXVVltmbivC2|8kQ%3qSx*MNJWls?-Wg!J))?#kq9Ilf>Q=0S_VuOnBqi(6$#bQKb+6!(?5NO z3ygn!{TeR+%~(f=@jG^>mxC*$Pvi^jm#3DxC~q>flXN>_2K9XS>Q#078EKH2e5Wi% zQ_JfUqO2}6_y{=A&f0{4OWPi-VG4lb04E6aW1)Dfo4q2-z}KrSq$7m z^Tq8ZWD;Z+15mBNXA__Q2&7|n$oXf{!?apU+8?AK9l3M|{#2s4y1B(M3aLD^EqbBi1M_IUU0iN#Z&bPC7EB-k+A{A7*x`) zM_mr9%j@P3-r#IYjd4m1!h*0yXO3LQ0cDFRF`Azyiy7QJSi0~t)03?v_36bLf(izk0qDB@aW)iUX#Pf5yUpoLS+zQ~dNo@DcM1BrYAGRaZvBxBj`fnXOPNU%@!& zXb-GZ!O0p*hTvE#T8o=yfx1 zY+pEIejAMW&=yK)P{>2KhCm;;4~Lu0`x>Hz4M}bvN2?wZV%^>=F+U7id(hB-IjO1d z>w<2Fq?E^}6}#P0v3Dwk5iOD?pp2X~K4^H1vZC^Dw=^O1Yy+R*%VdJ$ebW_Top4@~ z)GD;1jffK<_SwZXJQAF|i#sCyc;@6UJZSk}#Ly+?rEm|waZ-c>%TA)Q|%y2D-9^oi9Q1?w!gj45zlERI=9$)_Z? zTs`kRP+Ff{7Wsvuc*HF-?+MKAa90Q3y&mh<>~gbJb+H&=ZWZ=$C8txAP)42(83~1+ z?%H}Bp)R@}DUe<)##0Oxgbn~<>Q_EDHDh5IQzN^`0S{Vp+!Ol$Q{>z}50^9CNNckE z6;-cDNvlc%Yz_cIvuW=Rj@|%B#Woncs6WME&E&FXhihEM?v7zI;=T&j)DpW>VYH=8 zotaL~(OCWw@N%H*i09)J;Y1SB!1|u8K%Ksl7O&uCQRSJDLpec(2OQ%21f*4q^z+Sl zky1+mJ`Di=IF1PBk<)$NO3Scg&Iq}n@obJkIj8TB_Sb49^6<;x&azcoy;8Zi5=2X3 z2`Q=QyaE2(*+Wogy=)0bt3wp!^R9(ZDpjYl6y!OaL8TZADu`|}%k2dax2au^cO9nM#8 zIWRsHAEcqTyd%OlfdBNXqN$N;ibo+Xt}8JBcwXcYQM7#u*81_PRcZ}raBhSeu39D9 znIZ~B(~`Xh;)lCxSmjNEo)nyjxnAonlzY&$zTOT}+blg>VcrF%2x{FkVDu#*P;eDp zjgdObM}~NRzr4wE1I0Vi=KXeBSCv=&S`R(%hEYGkKq383q!fFm$fQ;X<6ZNi<4Iud zA$(xC!rl}KZD!w*)Mr{omAEF{;8Fu~KoU3#gXHNYe(#=04h88+0RpxXYaO@4irS&12#pbxbL?|CwuS= z*h8Rh?MR3c;L>2w3QO=e;e09c1-voWDU{cqqxpi9NL!D}jA+NkcvNe&5@7cvrpwfJ zH$ap){YS{~G!zJQ`oA6SRp8=e6L0$&&Y6)}>343knq6@zY$#hLdPpPhtg!M}hxb)WCW;Q(u{->C_p|1l)Kp@_1EjH<~ zZdXu|c+aqkIN_*aAdSG)eAaa zCm6App_a)ezyy%Qt4+!NB&=NWtRD1QV6d^dYX@oFN1~9aH(LNKz@B0?l2EX!KW_=B z0BBfdF02lP?AwJ)0SDl|g=^fw!juFelqYO}wotCo5)A>UuuV+l z^Brta7f!7(3mn1sL=Gqk5IH7StP970(Kc)B1*mtzMH28n~4n^=X zA^823H?;u+_lJY|#sz zT8>UgEM84$`<11y4sj*KTGy2V#Rh|Jrrcd=<=8cH!1!D^X=RTYqa(Cttwsj`du|6Q z(2>+azeC+FiXN-e_npI}%Dx^=tWj05WRH$sVY}b=9$E&vLDLrlmwA=tis%#6t4>t0 z7^^|8FhR(Sb{a@pk%>*OUr%j%*->8JCuu9K#bQJw2w1~K59j@x;YX#E7M+$}9eNJd}=&n?@Zkw&X@^l3>|+ui9YBOO6_n})CEo&vSQDnHq}y@Pk{Qqb zihnEvG+8uHb(>bq>sP9s57}gHaIxG}-@o<__V+p`Xz=EG(_v0=C$#$fJ=p}|V~7*1 zH@R_}T<6dOl=>|V&bem);rq$|c!M~}MV_(272bxv87b>Dy_RF7))2WCTt$1G)4lhG zDIrg-9jxiQ64io;EGRFDHA5Cq@2f#zYLtw7v>z(s=KzPi4|(n3Hs}%e`4y7ds)WC! zd_F`GsQWXmiADz$^MG)9f@6cemBkNLbve61V)x7I*J~}94>!dtb;v~DJ8qaPkFuH6>#itgj!87+V5RgYBCfNh7Oy!U4 zR&wkUg>`WBt_PNk3T4=GgPd?aSOV5T83B~PT0wf6FsGgAbj=FtGdWJ8X`@ za85ti+;^nnKoukt%7$hJa2p4M8_X(?{(XxGm10f2v{iB$BZBteEB#3Jq~C6pk9V=*9*cn9>5(Q6F4}ET?@`s ziU%nZw3iHI%=UwJir56K{`;d7B$VK9RDr!&M(m_zYH}*FO!;%!l zR}uxBz;#VA?t}3c=CJYX+uG--a$Hoqxst^xYLbSN?jDFEs#6(L<*kVbc@I%=QPW=6 zT`l{IVdnx4f%Vwctp3JBA85mC&g@?2`1I@qGrl8e)Hy`cS%;02>^MP3A~uAFB*7(W zo&Be=;37mpUJe@6)6v*r&OPK>pU&IOFKww2zPT^kMwKa?=a1Z1xL0Hz|PKUv0+}|rOX)W$5Y5i}> zP>7bVnHV{_dlvn`Na(#5865pJF@PJ&CmQ3Z=guiv`etV^;wU!ICPBTvFcX>2vQ|>? z%X~75#0KV-h?(W%IvSwKyc@3rVkZv zw!#%Dfu80(NyQ=GK+(CjFV@n_ysBGz|1xCarH8QNe^_mCSv91!A$Ux=g4Cr#14;FA zh3jFOgOrfLKDV62?&zYa3s#JU9CDb4nxeIO2SPhQNTFUOT#El8;n#m~2!ImCGrwWUqSL$CPC z2h!@J3+e;PWwc_T5E<=eqiXeeq7;ISRd7IS{Hgg3cF!7FUEI8=1zh;tpy-T(vm6pJ%+lG_iM$kaRN0q-hH5tS>% znO1Wb3-l(Ab2V)eBtPXA==47%+yYNkr=BgpqK+)mtO#hGl$O$neGK$>I96AjX@-Gc z*9XAYr*SptbiBG6d>U8GM)ywOYn&Xv&CW2M5b<_9BZNeMN}_mdj#>2r~tjp?x^>GES43%c6MLX>8S3LytRUcp_2eEl%B3&j3&L<7Hi4E=i|o6MZ^u6&*LgWiJu3C~+_z zeoH&y)d`Pnd|OSD7jkq&*k?<)mwLBc@+El3TdHCech6=f3i4px5LWD&FMcK$Tqh2_ z-NYWXk?=tpyVr_qHE*i79Cftjd@ZBn^2;Q{r)@`S;ch zQJ4#0bGti$oUxc&OrghIZv#vBxz}+39_+ zyk%duDcmoUm>$D@My+<-hPd`2;=|)6o=y?meq}XOSEEuC#mQb5g0qs8vpnLRx z&ZO;%uu&CMBD)rx1Um8Aa3i3PSS8FE28!v3t){t$fxE2VI?XlD&o>yLV!s0!5rjJ|KSn33QqfqBO_qT^Lj%BXiG-*GV+FFM%RJLpEPh6s0PD-+)TpYtCR^s zx6!pjqOF;&7v)q9FiL~fQW8%)g@!^NMSqSu zULJrR02**nZWs=$4|{lM-zye1R#^a|lKo{*O9*lEHM1lkm(65BTOflTWiOi-fWp2|`5);hRHZs3g7ejzZK31Y*YVamN8Tj88IEAWfP+tr#q0ZUyD*U~-tqUah zfX9fqC5YbFZNuE)4khzJQv|5Jg_Iu7p^dzUNk%2$Wcha#b*x%~r|3wG@oFFSnwxsh z-kuzNkX|~;uCnMw&Zaur`Hb|Yh!G#sVHx_NLKc}tLO&pQ1a6yAY~_>#H7U|>Z_vyA z6DYdu7QkgS9(amFjZ#AutoSBDXN1Ob%O)B?^L{)9u0Y9A08s=7?iza?pnA3ch7NJd zC4Dkw8e;%K{7xv~4XQ!ZkL%#g%q|Zr|hsTsuxLny((qXsV9{(d03?S&5 z&|(vHfwbEvg2%XVA{>Wi;z(4d*HuUfLeVC*8Q!UG1awh3hzeqpu#y9V&`}s&tgNg? zR~4xQEoYFJ&MXIFeR|{Wf$7pDoV|&6i-IoQxOCmUEWJA;0U|;KRrZ2S@*#lO4tu~BDOLLYNd_AYvAp$q>H|7Q>H!{_=A7``w-IzQ6qLdsOZIc_^Rw{^Gc|_ucovs_sxU zfEksL$?tDw7;-!Menri*#EVb}!%yGC5RwjezQD)vMtqIE07!rN(O(9bfER`r$?vL4 z8e*#&2npdO`W_iVVoDW+6&|V_!Ehimcgs!?3E#4Yaf}7P1UJ+NJ@N7kX%p3sL)?=r zQldT@>iwkruR1+~Gl>I0#cT8oDL`=uU(Rc0b{rTukQhP{P$paP@Xsv{d+hSH*#;nv zy$bBDoCgB1bCBxY>i`YAFb~h!dOH0)xLa0ZGN)rjMsUkfPz9g2aM1QAOC*o3KjrgLM^ZTwGKuSD+!q>`V*?z|#VaC`!4mr#EP@T}Btxlq74cw6;^eT=LTz z*9a(T8ddDLQd_CXQU6c&)yzArhTdMo3fG=wh$#HSF6mI%v)Vo0Un;8u#KbP$8U6ic z2@VVa9wlf{K0~RvRmM z{!LKnH@(wenRq}Yv^9m*)Ut8F6Hm`R$1;kqlek+(O1>4t(gkh9j#w(-NK5ZzN!+}14%I#wDrr|ah=uwHE_)t+aY|UE z^mzT}i&nu&CZH?}O^F!Q(dr5XE9irY;ztVD(+*0Y8Gwkv)1WhhT4}QU|Md<_m9 z%uu7RS0jaLiyxWfd`OWnSTu_C_flxXU}UG1OEv3JV$mr}7lkitJs+OY29`pDD^p`h zLeLbNMk+^(ztoTcm`obJY0%&SSjGST(b*d?zvKlNp{ZVY z&}x~(pBS7o%-4H&2vf2?^s6Xd(DY#Mu*bOwkk`$COy;I*0nlbHvY>rpRp*vN;cVvU zHF1%0bPah(-MfE+TOeb99C#52pAT5-Qz&X?4&|u&-DZ#J2I#Sxk~7k&%XThCV5%LX z`%QQ?mNyq*?%XV~s2UWuWazAoxAbDT@X5Tmf6Z=}Z6J8Q+vv94g0%{ArSxGGXvJiK zQd0Luf=nY!4^^P%A28G;WAh6*M@LTbxe$lOC(;?dMSs2aj$ER$zNq05)74 z8ZNJvP)|rc)u4vR7$=WDWcMDZXjq?-1}_4VBroaelr!y6BTl4{pAF(81FB#arBc~U zr2Kqgz9_aa4w#LX;40^%sY~(SG^tv!mbnsUghd6v2HW@!g$P(FJ|!T-vzUx;Q7;mSq=Y}NiZlfgzcA#6Hf4$;_%lzoPCZ{~-JZh+y;DI6^=sDf`SAu+uVy;DNA z5~j(dJE^*ZR{J<+kSqi}(Kw@2a(X`Hc{LJo3qB=evY(rjM()Vtl<1T*Ub$>)(^J69 z_Lk-m<<1f?4!0NIR3PJcsD-fvGgf=C=B4+}56;_&AxvQ)$VLn}TcRNNYCMv%1~p84 zMBvBrysD=QIAXlw0sxyO9s(-e2yrw(b<*I>uf-nOh(d@C@PJTA8I|VoZK)(ZdyqM( zsz!Xh3$5c$1MDKPGmQlj-wN8NKxDuAL8_@cO2k9?m8II!A=5{)4~$NVd3lK(Q?hfbloR&+QxB-u{NK}Hgn#&xOn{QSfBElUWJE%L{4e5{peKLfa9WbN7(F8q1o z+HF1SvL>50FJ(t3Uvg6wljtwu&g%B*o@9mPDOe@R0;A3TXC(#0pjDJ+cRWRzvDzU5 zk2-E5!wrZK&bCA;Uh6?8vGUS|d~8sOHR5phIS~`E9U(Z%<9*$m|3dR->K}f%fmef3 zC}|$6Bd(5;|EAXFQvxXk0#ALwH3uoP&EHNlqbN$~5Xr#^#(|p!ySzp6!4;9qLQ?e} zHKaa`8_ooA*R(Oyssq^_NXR-cH_T}L%OlpDyg5I zCKS>HWCn_qSOWOyHRJZ{`GfgzzDF@$-ZkrYnyi?#1trNjPsGX?JFX!N2FMcO%R)g( z^T@r*=E;vI^y)BWr~^svFg9jFLWY_Gb+8YQFT5ha`jNx}88P6zZpQH<^<1KDl$ZBS z2XMFZAJ_y?qZ1`npLN#oQ{qa|6TlV=KEKqEDVNXK_)78As(CfwWzn^q=O$+>JBSuc z+*3q{{Xpicw;9hgHdV1|_DAf*zgl#xi>BG$(;6RY2a%qEy)??8tP_mzXyS zWgAL&lD$jTE_Ww|Uy7V3s9+=R?6eg+6G^@tXnq28d<0NH@MwQ@w!kBZEswd^E?dm-_)qr@szi}*g)r3j_5_bd^Nxh~PG>Uh}i$nI9Zc1}3D3$=OV4I&=FaX{!AAiOcZ z_}ZNJHN{rl<5Q4;yakqKq&cnIi_h1r8NHzVX`v9-3i^xGe2Uv3Q3(+v0u|fIvMGt3 zy*++07_UEcHj3b;yrY^a6mh7I@B<`%4|7h*3FS5ZL!D}UigyGnEi!`jt4H!__a{vU zE0&}E3{plaWnhM!ZJ+gdzOd}NWUtb_t*K*# zWoMca&V4_WFUqW5!b$MUpvtB#PIM47btWHvs2mJ zV{k}fm;`-+lE9!_AJ=g_y;-6lfVOZM2t&dRK?Y*SEo=oq^2sb(FS&3VN7<1M)Bhke z`UY!?GIZ-;_GUh(3or^c7gtACj$-rW4G1nmTK}&4SYcV)N&z*sL5~$kgy~-n*w> zpbE=_OC_k^hEgpHjpI};NyW%}6vC}A6o88xvzhQ6X*OJ51%%aQE|V97P1%Zg2-FaR z1|z#n2{TNV`{)E1uDZ8^G305I(?Z;wByZ6( z5IlLjV>OqhkKz5d6T#3u8&#YbO_(F=pdBxdkeT996du@+*ox6)(wk*!#PkOqjqMeU z`vMYc(0fnQJT`8FqMyw;dAtB3p-NL0U2K*33xf}08lTG6>~w;AGlG64F2_e9o2!-p zrNhSGTQ6gAkNPsSrb|D={j)M0M7&`@<^JiXHTOJISYi^(XV zdrR6-*G-Uvt7?SE7%ow)Y~uuC3Wou4hHyGbrN%m^lPA+8fy14&JB|8?B@b^WwBbvhnC^2=OR{|Jt(V_n1T`x0I2cMbr0xIFf&-4xj*R&i`g|hQ-`>j* zPUxb`6usX;^ux9aEYqIP#Q$gEy!XXtk0TnO;R)n5-m+NZ*&LRe zrL2Q#r3HByl?nc@&oY&*y(7;Rj8&uCu_;R4gi;hub~cln-sSei)!;%vg{`zrA-YKI z^}-LR3zJHXOa4c=<)j3f3O52ph+(ngR}&565XuH^(p-1GA=nRPow8cZ>}{FAx|{S| zj_a=W#=@(y0wg`l`naf9LNDu6^@kI^8=E7Z@S*Ow2U8-}g_+dban;*UPXkmlZ&iZn z!-Ms;H^!4zIOkr0g%*>&!S(89F;0p|#jZ<4mtS;)gXpm8qiaFxPbAP_c)kb}#m7Sr zD|{>qeQ`@h3uZw`;8$p*1+6JA&BDlvKQJJXA5MCy)SkwA&DSLR^))*uqTY7u_A zVev2TC4Qi|uzzGXKWIt$MvPcZ-PTk%WOtzvM1Ixm4Sr1@VxYS#oGjvErtT6OuGxF6 z>kVC^Xi+!qb0&x$5QBoMrO zVIj4v!>wnDT?=`pCMzK8LY#?idKcM`#4UFjQLD3p^~Uf89G#bfHa9eTXyJ;np{Z zdNA;~8q`F4m4x)EprM8&BYi4F|Ir$6Yp`Mg5u?2ZU$fDWu~c~|a@sus9z3L z{e>w|O5m+qEk)%#^?D)4+f4(rTKd} zW7U-?ti7Bsj|QWN`(IR={I^8G`k$V*(-8koLh=d`RFc=zeuo->)dKV}S@)4B0Ibx- zHc z(LFu&-cq*H@}a7(mAEf`Z2U0iA?xK_O!_#|>n|94}RkV+I} z+9m$fdByGC!TGap!&I3r(xk|i_GP9_E9VLBld$QxRt14#CwOQFYA7XVDZ0|Zq|s8K zpwW%ZJu(Uvt0gT79uEZcekAra#LgjIQEq#*3My&%6bz}vtI4t5DuQK5oWnQCk)cG0 z$_$Q~$EU`1@b~WUHg;b@jffR>u}-e%KZ3r%&(`eol^$w{Xa?0wP?V%Y`~w>jpc_NG zH7Z^xFmWtq%i>&`4O8Z);96PI$!B}fDptOVS_<--@Oi|lO}&c z;RTFY-)|q^#iz!`9+`#z-JTKJlH#mDU}UCFA;tGZqhAIU1Y!VTD}?^NpZhrwki`{-Ard8kg3xw8mQ2=_wJh}0m% zk#i?_SC$-xhk6Z=+}qe%+3$8v_TC%30B`|amP+}vr6miw-xZ6wo1C2x)&{RM{{}!D z(PgtV!pq5gDSCB>Ou+kX_l5IMGMaRL{}!T3>HPgpkV~z^9jZ?cPCTWZgHekifvR{4 zz1dIliL5RMS62hIm~fBk`fzPm@ws^0X^GI^x+h1~o8CLPyEZLQuLPGQndWGh&~e?o ziEzN868rtdoVt)4`l7quF^hnjs!eibavqauc1)kDFIhCH8qK96?5OMvoHG>mv3G;* z;R*%urk(%k@o{V&@y71DneGY?ZeGSO;kxb<{`H6=^8m%Yo|4K-{_#}RcQ~kAsb&Cq zle6@E$gvGL1NsdQJ=X1A2?n5*eW0b#f5q9aC&FS77Mw?U-2**4-0!}{;Enx?^-CBR z$V?)0(;k*-y}cdW$D#@j!Ad2Z2p4rEs4&*~m>BQt;_G=*9~v%Ns#W!HM)AyYy^mbK z-Q~?W*PYdGiV?sGUUO6Rme%m!#)Oc|yR9Pp&GncWUX@G(y~mH(UpC`7o8+n6mBy${ z8%j|@2m{g@=sG{`U%Il$v3L>nU68xd8VLrl-0MobcrW^KawYW`mZ$SKr!H!Krc9I$w%wf;3tFzu|*rX45%eGyjkNH8jVb9B=|d+qYHAee!Pr6fv7#$ z^#rw28BPhlnHAAz42PAg5i}%e&>)+h0aua48|((8o&L@IOEfd_H8w*Ti6&qE7nBq_ z1yIGC*Sdx3VYEhRsT?Bis{u>C*PQioEb8|1BS4Bz6(+D=U<8Cu>(v^F^voB;QgLW# zb=L2^>z0Lk!DE;#FC|V1rB*r6%->Luj)KUW<#@EU=H4=uqbnVNpor(jpTt3G@{ME} z%8uN2I~h6)|8m$`vbdMjLoydeKa^YCS_cwVJvOXc*;Pp?vkfN-*JxHGjev07`HVeA zoXXwX!!V&@fHQX9TK-hbO^kyOA`7}|H!WB2@xZqE`t_Rg`@=c7Z~pY15{JEheM>HJ zZO029nEnvZuq@^Q5yN6Kx*W@?(Vb1Io1}WTbNCyGPVfxo3+K>K_}XRD1K?@#fPtp~ zF5#67e3H<~I}&r%Q)n$9#IJ^4qd|q!M7qSL0+KGV0o4k*s|(EFYN*)q0q=)r2M4|W zd!shQgDT^6Qt(eTp@xFk2oP2z2GGuOITk-olb}C@Vi&_x{s-Bnn3?Q?vlw|3gcY!J zSQD>mBH9c5LsgxhE%?%Hno#G z+W!r-dl;t!u{}CDUBmVWJ&n7+pY1&5X6zZ;AZw|Hvc@UBsm~< zF)tA_oKI#&3c^rI8tCTG|3go|CVqM0qwwq%q2S22K}L7fOP_lMtq=XIZsjxui1TXgtzzfJ%bC z_pcL}Nv0ZvHjH!^n&Z6$>$mD>c-VNox>;SkY(=ZtTRN7mLKPZ)r1KM9tcFhlZZCW!TgndHJ0N6t@RYF%I-XeF7YQC4+}+Vao{T zd@fkr5?$MRle6*XILDx|`Vx)3DZ_SY<{>aLb>-K=f;t6|gB1pd8?RnNto4zl1cq9Z zS48N>!7rXj6g~kcJ+o}XPy-cw2?3|eDpg$!BO-si`hFk~wa+Ea3IRe42v-v5m`Q;y zMY#yEk`_CsApp_(S0^_!#ZuXJxvR(4srzcM7d+~ATW%spU^NU=MS1U$u@;@+>Qhn4 ziBprn9)Xueh8-OJ5gK68L4b{j!0jFqaR%A4ZrWOu)Uz*~lg3D5F-95Tj8itLr9A5a zp9Ksax}f@f;OG$hYHiPWKmq>+4o0;sX(3#=lHj5F`_TGdLO}_{9h-Ed7#wf$BqrT@i?Vj1g5q zf$D80HnnLH)|p2Sd?$Z3j(VM@}=qN)Ej#$#O6d_b+pl@=0J816x zcr^wssQ47AlM@t)0yZGCH}yeru!xyfysz zUq8ayD@A}WHpeN7?p2Fa2>CA03ue9xbp3c!&)Ug>L_kazBj**DOuTmqoq97jLv~MU zAPk&MeYGTF@BS6IF<(1-dd36C3UVRXIAp+F~!D~Qa#yE za2a-|GLVhHdsZO}SwIsp9q{0Ys(Ab}cy_HAT1(cpe@C)i7?UK^p1MDs>+9(qv>Cp$ zM$#S-(-^W5_b?w;X+Te(BXMs19GFMxo*i>6Da<9BnJ|UqPX%3riw&R&T^^S+f)~(Z z>tqQv$fvO$00Gq#*eOO@V-zI@S;Cf&zhJB<_G>+0-o@ma;n?&~B4%~`M1|R-bYgl$ zze>wl!1xI{W{L`%nepCN)4|sm60Te<{cd#pb`^R{7IEC z&ak`56oB5M$svduQlu{cdj4sYYAn#T#qZx?^;Km?llZ3x2Z~QSv!$%6g*tV0=9svq z-{F@~OAv2F(H(Pz)<(bkMKM)l$kBUFJ*p3%!?HGF2cdMH`+=vvlMg>CV@_TLh7*x5 z{TznNBT(F6qSG?5DYjy_^G^b}$?}+s>_%624bK+CD(;8#wpdUpTf~-i{tzM)jYjPY zQN0tu0lARMxUXUAQ?Y<}P_5Wjzdj6x8>tg9^9WO}+L%w_p$+%tJD~7|$%9s5oMvPPyn~M*>*~dfz^Z^X%giM1P_>Kh3|05 zQ6?sc91dJp6n+7_B}LSQ7B{b}8u&G`2l*1>VO5li;JCLG>|RCTSCI3&_hk5tv_}34 zGQ;uW_3NVq*s<5Z(4I>Z7tw8Tqp!iRinPSK5M60Sy!x;T5DNN4K^f zUNyhbD`-q*B+ON%A8X)_9<=BPhy=LH_y9wWC;EVN{~Fa5w1eVLIE(-$K7~|k)1f=* z9;jCgI_4OSm|{eG$_wVw$Y!({kvq3r-Dl8aKLh>=DEZEGx-jfWgsnz$#@ zKa(YTTjXMzc#5U#(Y!on=mAew;)llcK`hj+s`<6i@8TN0as-O)m!)f3#UvrLj`opM z(OVWR5yGOi0Ra&hx{=Wot>2d9wSH@^W`=53pIlhD6d{cwEog`eFZNa~8G zzIWl4(+`)KW+HJ7?ryVSJ5BrjK0Nd=sApeQV4uBOS4WQsPSxx{t7t+2S{eq7g>`Y2 z@;q>eOE4u7838M|nG0EvQ&!dCza}gVYqCiX`%vt}yF(_Hdz`pGNSnFkwZE#G6bG7I z$Kwk03d(g~rTjh_0(vyVct*wIze zZnm-7ZN!jD6$SR>7|D8&0w#M^s+R7_38v6Qs|dM29sM6=^qxC-`f_=D$nSXpA(@Om zrE@!RAwq^m+!WLp@?ra{t!H&)dx~RX)T|NlN%pFD-`eE615Xj!kb0_%o&o+>J;?p4 zzbD`+p}rv}#iNqR=6W8LmTA z3t~VmzD$k9x;;R^pSKCOpNYPKW2kjBwYe@h3yuD0qitxUTM2}VDLS60O67a(oxa!o zevB7X!;H~TTY$j0EG$TqqHE4fOl}Ie6&w+&5skG}B_z+0z>No8sKC?rokL6d>$yLi zgT*!J4WxlMy+NSBFNLm_p9#L`SAV`5UopysCq?&KT}Hq#MeS0UB&u_pbeg7 z7gWtLoh41!$B3=2G*Yq*0&a}W-;dv@m+r2@$FmA6skuayCIu0{f~9weMpUi@#w>XA zG?d=E#T=P6<+e~MZ&KUm7SQGx0`+FtGv4^7LtR^D)inkeiDw)bNHn+q7}`Ti?h!Pn z{*?%i`*ckY00=5^x{+sR*R76|#S=K@fG@JDN|mbej^>S6kr{j|4-+A4XU+w-g4J;< zehmjHPOIX*ikr^$MMco~3S~4nvCV{-|Lez`4m{OCJQk_WVo0*uNgs6grM0+_#uCk zZwL3U(E_2pP9*~R!q}*^)-yy0oLtUyG~pnPbmY9{rYoJR>^@wedR5CUwc2*Elkp|C z)hpoQ#+k}PHV8qTLw&7mUNR1j)xW63>EV2Y{x@my@)lK2BElblERuBD&ie}x#7v|+ z2)r?A&X35UGhQIIidely2Vzqo1vWRp%Tb63tmFTcFzVq5`v5Ltgz&l2%7I7&O2#Bf zfRNpil+tob9_B7Zko0eUs?-z;YZI>E>f*6NwPv)$>>b`*oul&pLJnU5X31zSYn*#j zqEFh-mUma@bGi37&xc>WwA*A0_BG9V$)zr{24TgjNtBCeN7n)TgVs`9D(ag~phuT4 z$xlAtA6jWzAG#mjbYVjOdJK%P&xqcq%Cg`2E!5$(U=co>Eykpo7Rl${s%)eVcj>iQ z;cXInJ~U^Cszk`c=fT~wLZ%JYTZ#|TIK5~M8Fp)$*fb8>)lD1Tj`%HhzqvoTrt0#m z-v@R5*TzDOR>E=vXUwd4I9m0tE3#oGfl24cU!^|-uA*^+IfCnmAs?f+;Bl5IFLiE_ z|eS4*X~o&a~ZYgPz-DpiAN;6gH92ken|K6P4fh z_V>Go>1I%De311E`vo1>?QKCOR(O@n+xaehW4C(YBYlri1dlE+{7>g`W$0U>S8xuq z5c-&lV<2hX(86*8FXf6m#AB|t0xnC>EBFI8t)fCjSbIDBb$ELYH6{96eLnRrVfhdw z#qZ5mQr+63i4>xZLt`y36h(DX<=-Sv6CJY;;{_T35ucKG(ldqD+aBp&WK8%5%z-D1 zt-zQq^r1p*Qk`DM>UTUEg#)(8ZG|sO%@M1W*=|w+`!s*_;dA7018Kse!Ar*ivOW$G z5g#qzn5byHkP8Psv4^$V^l1YzucR*aZ-={JW?HVM=u-grPeSCa+jjf;HHs6_(mS=9 zStd_Ye+&B(`_i8Y+T z8-M9eyq#XRtF?Lvs>3E8;>l-SpZg?%P(2BPYA(1Z0El2Y*(A7JEf$=z2`SZ-A$;PV zDM4qDa7N`ej$1(o+7X7pQoKhDtAnncEi4v#UWRMZB zKU+M?0@5Vb1h^5#ctX)a@9_q`b4j!uDs^q*R%^npdG#wKTJS6SF5;}ROlCg2yPDs4 z;snJu@@6##xGxmjOfc06!UWML&-@Q!VgYfX;k#n5vHQ3p0Q!kC5bpGUJKV$OS^Zdn zlyhn5MMm2GH}e}*!zDm5%5;iaJL%Q&!<2h+A>0lAR_k`Kn4nsk@)OnJ)kKPa!jfY> z-I{dStAkR$wM^nE=@7eZ^p{*%S&VeO^K2qdttlUT$p(W(A5gr@n8{-;q$u<06n!hG z=*(JI185snCKA$9iXcf-CM)M{j!y5y`O})1!hC+r#oe=RU!wOPN&TZK{UG z?}2KQPpQHl-zEAVHRh9%&>#n`Dl5X0I{`pQMb1_p(P8vLCqwa0U8?n4A!6EPs6JCv zWR2ZPE<)!1V{;_-OV+YR3gDJK%^3h43`>lQhnIU7Rv0Q(YaVYarZck1HgL!=x2QG# z2lc-)Ey%*+6w9J&-7s|ve+BRlrLU+FCq%||*M-4HLH{eryQfbRXAiGR9tl$e6>P2f zIR6y33JOoomc~lY1wJ+Ra4nMly2}Yx@Flb24bFf8D5(1&GRAuri`pdOjhNrVowzUz z7)2|bn%vMVU5c%RnI?tXuteRz^Rt6wAdXu>6ZJ3?b>kz|dbQ9{h%~zCp!?MJ)Y?@K znh3EbagRa2RLIZ|#d?eG4pNJxdrMZO@GV8BK2b1$to?G8IITCv4B2EZj zWqS*%>}ITaM9-FSfan4ZkV%}C^zT`Khc6f9mgGU)v?J}D@?k954!%?Ty3&3N!B!XzGevM_mcGmWiS>S3)9KF@0f zpn?&M$mBzW%2xwD`#BM_mPAEgl}3Ov*_#Oy=7+&`-BT6edqM!B-U&80#!+;Co#z8! z?rA5oB@2+NTrM2v+G#~fKB!!TDMz4Gmb#ID4~=q^iiBmHQH=Bcg9(MLfKVW_PpsXRo)HeXdBUq_BZYdL>6 zzwK&5zb)o3q-@ujTMsMLjC&xY9#)jcIV%ug4@NL(930Yqh9LcT z&MP++jZ8|aBt)uv90kzmw1Ep;zp=LN3u5yy)CuoW)alybC^(9VKHBS?f_zs;_Yl+h z8JQo(%c4As3Mmxhk*+HcbGl5+@?|+%Q65Z`XLVYtxAQ8A^#Z??nh;N!2y+q84at1S z^wI^}EU*n=GQm*y-W5Vi^sk^-5_LdcG;30dA(eg1)ZROVs7A{zffsTw9%Xh?^oMHV z(Z2HT;QAW9{S0z);e&LKL_D6G-@MfP$RS+Dv-fU&QIx1)M zfXm?*+--=AcDVp7$1@}B6>_prs*Zhm65|OtLpcHSY6?rx6EjN(E_7!o`A<+GKm))a zr9U{0Jn&q-vPC6SeT7<5N(#g^H(9l{jqV9QA0otI(mN^_(UM(o3Eg>qCv<{=bqs$8 z2_#m_uC8~LJbn@`VJ9+B%xD9--dKEKtUY4+!cM0*UKh~RxD;ItwvnBDsWT|72sjLfkwLndM ztAK3&B4gt#QNaY+-6KB-h&wWm`+jz|OuH-lF_#t`WN@$F^n;u=KqmShlA z+mR&#&RRRd<+GAFDI>$zvle(8&5g8XnZ;`>O$~yd)e>b_J9PTQ&y(3s>wE)}YDi>H z3Py2Kgz$kNJSevl-UnPPO82)zDV&5mwe1k6B2LDL6DEz{!MUro7^GFpO1dKi5#?C2 z83s~o>k0_@-T*EOx^=y)6@)55sU}&J%hktqe@Mn5GO$aEtvlX#n|ArA5N%NU)#(vz zz!9ccCnsKywSyt_&!BIWX)?)RY;eg@X>?l08c5rR zZ5U-oj!0(QI$4GAv1Nf&##soFrdxcb}9mM9bmVdnip6tmyu?UM4z&wSzK zZh&7bi?SWusv7*NPTki~!*Xy}|Fk+h0>7f*6mXRHrR@xZ)MCUJvr|!*;c(Vmx7JAo zF$6VO8MYRzKB9e@4vLvsZ9WU3^(h*(#}2E|Q|cQPiv%_l8&$AngMg7Rwzp-2D4`Td z--Dub%?jY;n>NrmVC5c1-ZZ59WBfs$hemArdk%y~YrO2&5t|XmBTv(+z(!?B6E|3l zW5NjYWtdCtEXMnm>SLH?+0isbE@hVxg!W_!E6D1b!F1$vR3B)Lx3Q&J)k-dqAy7Q& z?)MP2b~$Md1r0gWg5#@UmQ#w|}EJ(Iz%DfPA=n+Bv!5g!zNN zi^kE-kc61!Jw+j>TS5IJcPR~ClOaDVSuWNtmgrYsM{D7-E;oF;MLYhd!8G`odi^}^ z?k%mA%%gWprjs5Zq!VIUhiC7Sd&V|_fD493lhJySI%RHVeoYuLJ1%h}FuFO4Ccc}G zWW@gJDTfSwA*VhnHuZ1tO@7BXEfO}Va4LKo<8qYHNekwDW}C!~;H6QKOD=mn9DU+U zWt9~v_qcX8NHb(*0?8TDGJ2bdk8Kr$dNcV|YZ?GHU6~DeTO{y;Ykxhs1T0$3QTsgc7mk`FDP!7{(!DRlnMc_pc*i8JmKr&{Iz_)<#Zig*pA~hKNH+o zRQUrz5B$d-#fL(xTJ}Cv-Z4H&x|^j-8~uQt17RzZHrg8hxz2Bo;lCS%+-XU~fe#jX zN|QDN2u?WN$=mA(A2;LPwcb5|6`;l}sCYC4eTd<@J;20T`}-y!FxW_9Bch>HUiw!k zvtddfFKIAlx`uDfnB_28Tl4Y|CrSn=%On8Ra+ngd6n)EzA@Fj_&s;%`NM-YhS^}%n zE@GSKjTDeiaKeTZ@Wl^9@$)5m7E)39iJW9;M|%AlB|D*!QVJ2Q4j=)14h~4luOF<~`n-db5 zuH1)HgkoRNBzOC$o+jWRCA7(xx2g-^bIUDp;I>gdqOKf&x=@((Cg~8fd~~pGlF)xY zp3);he2eOs@yJZjSN4-@#uoxPMeMQfNJIlTT%**WG|)~Oxj&b#!w)7(TMk>+7#nR; zLr6k>00$*Yzh{8%!0LtrZ5mKgur_StinmmD2(GMIfTW_O)AoiN`71t3|*EkzGh z_4Z_;bp{C|MO4riUWU-- z3@`DfVWOW&;J=l2R0Ah~w!V|%2fZtbk24^3mhf!C&0;qmdsf=J5bP2wiL#B=6vLm5 zkU|RV5S8m=@I0`YHoCEClej4q_j!^yK=RQ^BEAl+e|j~rcF|aQ2CF`Vm0LI!{k#I0 zLcp0c+gBAB{9}}XI$rVYJlhfyC1E~9w{Z8v z@#$}1WIT~^M4i3UK9GGvVB^tubQ_9bqsSe#+ez6pl=T$_9bok{!9so06KhoVMJP;K z^7``B)}?15hJJ9-)S%Bbl?HKyX!OH$CGh-7yv3KG3C#cY7NehUkUIr{xtLssLQd%` zLE?=L`GF{S{XTgZi%28;joXwcFuWo8G{fY!wuuB|`9Q$3Hh-w4-Z86&RkOBNPqGHo zBhPpzE8m2AM5*rk6Jf>TUxQXr^!phfawN(Cg)*6+Qlvx`9mbZ4=Zh~#B|CN|TO?eG zw-~oh40E0uFVeLSu9TozO4Q3EG9YQs1*^a2!&k4W+l$XQ-SC+po0^MRGd2|Fk{Xq7 zS8ivoS55XrrQZ_9aNfs_LxtAdTJ_T%8jeuEFxILuRA(YffTh-EEmX#UYNV@w0sjha z+I)j_yVuyt@`gG&C3$fkH{XRy`wlhnq3GH+yb6Mzw!uwBYx|Si$!PrM?r-D8T#Rzc zRMvoj$4gw#NZMv(riM__Se`y$!Zk!n(b#fFtmJSZKhR z)^e*3FvdfixT%QBE%k_#O%D8Jgj`)jsW0{1OK_`8C$=yVUaT0<;g5IMbIi)nv}&TE z@}@GXE9oUBGcH;{F=ungI2sPLd@ZHK+K%G2adOg@IV??<>O8)kpoP@CdKMKLcQuhD z_nan@np7VjU>m`9Uff3u5l{|_MSt~jf&vVl&z&AFs9}k7OEq{}o1%yZmns-`fx4Dl zN~|b61;(&CzOU4R|@iwQ8(dUi=&4({L1;eJU+bnz#MGi#w zD42}mvUwqTY9m=$urW{Yn(8uEELy&*d)#1rtQhiv57@@j7*>LQgyb;6eudgr5oC)w zyclPl^Rd140acq$TUCx9#zNKAF%msJ-unO9dl&df&$?cGvR!-;vA~v=inSLhwJmLT zC!5V)EQM?`+nsJUNt5iB7Vu>SEkk9`ZES1~63ehY zYl4}B9HU}P~4eLZFiYtRxnQ z_sqo=vB1UcMG)P5&Df9WQ_*mrp*&9bESc@Hr6hD0xrgXAz~ zpr$R>cO?VLSU80zJpg_SzX?@+X>jdM%I%&Hk_pN2dQ02*-eUJLg{^|p)l5FWU)s2L zV>OO%8!+;X&jRWaq$HEF$Po&UQz&+%0T{&*vjLOrViF09!nZ{1+)RWqYP`(B*T8K} zYzq&Hklfn|Kr)58 z)5j6*>1@d)9M7??GSO(mNP!d-t+MbrP$$kdMA=-E$^F#~H6g*ejO~#*0wN}?$OM0;{Qac)2G!ja&y)ar>R!QAU zmk``Voghc+?cp_w3Qsi%49at-xW`^AY_&X3t+Fi8JV0e|rN=frMdW&GPAYcA%VEPp z&y#6|L3MD-?Z{71VEsRX=foO}7{7x~F!?fbb(vgYR9`T~x$jmdqVlk+H{BC#5|rM1{cp zEqa{>WRT3Hu}FECG%J`2hj`iW$@fLNYmkPH&y?h zn< z@SalYDx#cZug-3uTe{oR#{1*4QY{qqpH&MQ0pI zaiidE5VcHK8!UX_1;L60Y7vz6m8{}hQ|JXSeH+{?Rwm%DrNr?j^Fxabd)Um$)iMJE zJH)8Xvq}~#oKEU08;R^2DpdGVR^4c2^W9&#$}0FYX^(tlgoQ!UC);0Whl}A;f@Ap10BRHSoX|X) z{hihdoE{vTD@jZe;dRdZ$-Ree+VUCMF(}wmI*HbOMY70l4N3@W?D|)>$%6q`oSqn= zdlB75V4+${fbZnrCLI%TQzB2zQzu2Mbt({!IIrQicg*zwuTjmanqir0%iDrtXrszj zR#sqS6$Y^hbfhlLKpNuvp3H+Bd;r)aUfjKQfqx}_PN6ut@QG*p_KO75|4>SmQ?ldjUyrz70Ek8hOy_u6=;UbL`^avy!M9yfr#UVYPL0X<>-WLgtB<#2R!F;ZG16GV)NH`6F9!euw%iwS)m$|{{*?Ohcq*iJg9JK|mXNv~` z(X=J2DouuJ@Wb{xK z9HO9SlXxtMZ{B?FmW017$M!hcTwUVb_k44ZysRE_6#i~BeZlilUsiG!$f(Bq3-E!V7>8&Wt9{vL4jaO-oy@Oh`aL^Y%Zq7 z_dq!0$i*tuk_8gLYQbMKhNM%mukfF=;eCiJUSSRBDErzAlWOjO3~d zpqwozD?>UfDQw;aOjr3#WvE&p+7fQ$s_EL zf=2RwWSX;;oT3cvV*(nsx5QQ7dlX=mxUT7znBI8JR!(*rTnpRBFDVB@o-28`nKfSL zbPS$+RE(sG_}GR-S91Fu$JkLfQHr=L;!)0%*}<$tpnyw~m#x%k+jwR7Sj-P*AD$(A z9rAq;I&lH4I@$B0ErK2iYr7#KgmPo$y}Hf;=t`xd$FO;BcX8^1mv} z951e4^-WK;y6P&O31x(>qU2lk#8vQh!BD!k&^lQ-G6mDqhS9D0ED%{yJ6DFIzPd4c zWO#&0`kDp}QWbhF7Xd=H#zD|zuBFu~w;f@&^rJhr2{HraYla~XPAY)Y7$K%w;>ekN z@Ic3El_zCP*~S*oTS&U#*=rGRe62>=s>y@Bt?K8S+2|7bJqG2O`DP}M&Gke9k!0AB zWHRN%vU=b^$b&VGm#+i{=4>B%QByxq5q306)B<&)z)YlE0X==wEwlnA^z%)1ZxvuE zn_jeQ$;sig^P5`Gt^&3EfE;sLuAjsdC(IP`QT}(Vt&1Y(O>4^;q1)%AcBf5ndya^V zTK%0fwhlq~*^y(=h;QI?ggcN7QOGgRmsbR$f-JbcCf2s=L~0i%C#(dfBr;YwW4efX;#BPfovG+VU$q1)1DJAeby#_g?8-yr$;J zRf$z5qhZc$j33hf#Gbm~TK_-7UGd>1k zVl9-3*{D;uoki9>1wR}nGs=p7R9S_mhTR#Pw~D*8%enP6?iCG{k57g~cd9s;6xn?5NBcTNq%?%QEwLl|0nK?@U#0L}9b-f+a@d)XOcs!?=w% zue+6|jvQOwD5Z$02m%CH8p1MDlMH70aMiRH(F(<2T0d(fLhHbGa=1n>I)=_2WRAqa z%JBteVYBtPu235yKP0>CRDDh=z|K<3mNw@f<(ytrZA5KZI^;soxV@2>4`?kU-HAq7 zY8@2#X?1b)B_08$C$fX{;Q%WEi!)_ zz5+ZPpHbD&L~Jq@EKS!C7P~Nma?J&9)3pf4=T-t;87Zw{UFs zw5VJSIx_pnPvpUR_+d(+jm8><;a-`t7Fa#S40FzgL_HOImj<@dg~)S^`kQ$ho%o>t zso{E-)`8cjGq94Ae>p6u*3CTFqE6znm343|Z8|=w{Jv|PWf(1jWs;0kh>6S-G>5|R zvDxw%LX>PJ8uYBEc!QJ+f6E&86l6KOx_tu3c{1%ZQK^s!9<7+97K7$?>Z)>4Wr0DS zNM;AwrvanW(mQI)GaGS5#(8kFNz}bdC(EcKF*fNlI-(cThY&S@iaa+ft~$lSNn(gv zm`iI-7dJdZLJorEq?1~%oJ~>0l=4iUn;)3fi*-ot8W3ufL#L;(InFAaB)t|TY^uJx zk*3kH#SL?v{Sb^-bg7I zn3W(akP8qx`x(mnUryW9papyenCLOr$b>w++<|9;{Ub~+dlC-VI&gftvnME^s!&79 z!~)f^kf1ta_ol=R@t-qI7OiXofemO-f`DjekEVIL^E`m%CGM99w+N2@2>K(BnR*YMBLdeotG0dxXK<|1w?n)=dC^2I>#TZPw-6dW2cJi_LC}F=oqJQ&k0u#<@JtVRBWt9a_y4g&{eB z4ZeGBQ0FbX=Yvd56)P-|P5Sfw2b=OVc&SL_X7?lUXpU+iqs8aayr%ddjv1=w5)p)^ zRcwe~BCO?sYTW$!D7HyeN}&vM9|)6F;&|jZod*MkD4pdIE}ib+a4WK6USht(jExdV z{j->x=OG-S7Sj|*21w&WdR4p4wnR^~$>H&2*~P}9%W1#EM*$#|As&@s5VgpvPQu!P zj=VVydC;+eIx~>!ZTQ*j-oA9W1_Lb3c2XHRl1~w4bmWw zDD7jpxioBpOye4fDl3gzwxwC*Wf4nU$sQb8L@i+sP98?Q$O#HS?6!;;Ix>LpJ4{6& z)ZNIGOu7k^)r4&<-9ozLPU*3!vVj%&)&h1aJw~i?gYxsNQ0vHo-8VKL`X=k6jW(K} zBkF}|i%9ph;;y?QB_dI>sZ!p2^9Af0GWks`1KEkN#3JyszP(p{k=^+!oS-8|8)p-u zVg)!MSV9bkx@K`eRJSlyL|a?B+vw)R`ivGqPysv% zSSLW#&0+?BG0G-%i_-WdEK!@arCNH(Xg8k6S6UpR+?s@@u>n;P2ZlXoQPiZr4c;?4vuKY1unI^z zdL7oN`Yg=<7o5YU|peTH((9qy&v`)(CY3Qa77x5`DpV9g|+KMgt3?hTWCO+oD3K`3O(g zpsZU&M_Z$n7%G@67J~$`iCy@Kq%v5ORpikM0VLmNfHdE=2y|pRM~EQI(qbEtGHa3O zmWcw%%aCOez#v~zZ9g(?LnD=1uz^%-gcE#fZ$i*ZjKI65z?rbrX?r6*)uR5oEfv2g zv4R!h?6b`Jl)RjZZVN5S-?ITYq{y71L~Dv|%pIPdoyR+hqf6qqu4y<+n>x_l**F*`xwV&v15>T%UJlX*q*I>0T^Cj2hLESQ~YOd*J!lQg2BSCo`Kg;u7@`FL$4YXK6;I?i(kplPP^ zaTxIUFv9RSxIm1h;a7oi*+brk#^j1Bd&ItkVw6nN&4F?B+2yGM>7D%)e3dqqcDnn! z(C29R%oKLHc?#-+{EpS(3<*}T>A)*>rYs`*McQW?F09&~?joPKXd--s zb;%U)B0`-Z^+Aobg?de5kkm2@>n_6~Af>fUWo@HVkt_sCQVdI(Nn&*}4As3p!IJC@|o#QE_q;x2v^> z!~#Vjs?dgpJ4~tJj$f~*DFQ^9wsz4UE8gdQ8{XYjb(EGXy=`oE3Z-U1myg|iGcgiw z4n<^KvPI>qol&^h_Bj-;r8Vn) z@L`z7|78{A>020oy+Q){7pYiOZEy_?#@1w2f=0#4)56VF@x<5=5QwqIkYdgtsrGFz+1bR+HOeg z_9#f)WrZ**%+^)>Sfz?Q!lAiB2OI3MhR!k-a492)Zow_Z56w9xxw1)d7xCsso0^~y z8|-CO%0z!m7--a0f0hqB2|U^ZH?M9DD^FVORZJXgLq+36G_ykFCki}qpz@Z;&!Bu3 zA4YC<1Yb5<+#1c+X`LE8A}o(OA45LtI@)!XPE*lGSO__6*=Iut2tH2Hmxs!w$q6}V zJcQAa=(_RXh_M1z>9T*aGX)2%s>@q<-f{THNeG(XmCmPg2h+JRRhq3tnq%3ewm^Y$ zCYXZwo1jMRpdnBaDjn)M2%?=YPoc#PNm8QiFg_PEeSHtU(Fhp5t0o1&iF?hWKR=k9HJqm+KW+yQP+ENh7-D2AUj&$iA9+ziYiEEq~ET2MNZ6y-&CHz=^ zxme>#>fk@+XYpmg5)mDh@E&SZGzy5eY{xp8;0YJqmk{i2|g>Bz~J& zg{;u3uhQB?F>{<1b=~DsekG3gBek1ykEmiK-^+Yy69JIJh)$`cSl$k5F>rnau{QAo z$~hdRUUoRz(cz_UM}VeH!k?fRP!U_^QJLc8YV*{pjaW4Hkg+y5o-(=$FEj5JjpkKWO79S2?2w4zx4{)IgR7#qrl4oSVqnG$N1B%`!nZT3lBE&M1U1Sm^ z+l&eZGl+%)Q4kE=tRQD25C;hs)j9%1>P;U88lRnxus#u_Mr}fLH1IErXbRzF0)@Ur z%~l;=cXCdO)QnI>bNrYjw55{>ksMD^V44UDO@$jnva&9mNncvtX#k>59h~y0aOP z4`*&a3!HqSa)U%T;GI7Y2I_rUP2X`n-e_P4*p#V{HrZT41Qn~i6ce6NNH#<4LAlzhO;b{acb}6ql6K-n(UXHBu_^TXF&{FIcbrn%(FAd=a@IxCSl0@X!H@0SB zz>z%GvbJ0zJk+{>>bHpGb`lKWN-!0%$rU4t9^EM3Mj?34LNVN3y#!BSbD_M$U5bvA zphjs79;VNtEwRQ&FLW}nKy+z7!_a(+(0r@`oJ~Pw`kWSXK6)U_OCytrNtY-@ZN+9Q zrz{;Z!ZFuYFpLoLDhE~R9mbZ88+KYgRHYw;3yTc!AX^CiWw(j7a# z!<5~ziLn{3nm9GnYw^x9HONRZD3$hEKR+p=Fsx0E!8n4iE>E$zlA2Z`bBH8Dv=S{H z$T_#<;AP~K!)gI&Jd0~mVNJ}7vKz4?b!dzVwo$2A?K?Ymv@|z^G!0#ifplQ!3@5Z? zjd(bn4gU@{H3uIfjDfX)!lXUSMig41K9yu4xp2x(ZLPK~H8n5 z8=x>Zj{56@9j5gd$z&2)1_V3<#jjBfS&B?6o;ChfABMm4{iY6l(m3Ss9hPm$%R)IH zN2h%A6gkvkWt;(K%u%{gT%8rF2033%!zcNfFn<#whGypnl_@A1%5c}R)TEhil~$|E zs3;5BpZ47?JthJ3A<;%HNF7^aN>7_FO-;-d%=uSUk%+UDYi2=;rDBz$)q8;dK^S&q zCc*3I-Fm)*lvUVxhwIOV-UM4IaM*1h94T|q&^62cj6Eam0);Xe;Spv}796l2lx;HK zG)o{7x9~fJd$>=hNn{9$rq*a_559oY7r~qE#Ko#-la7v;5fah=i*%BwX9vePM_n5y z{hwD6A|@ZnNKV00z)bCzbTHxte;d{mL>473WmR(oMyzUgLkTsl+vorkrF^qq!e48Doe7?oVaU+LAZiE7iuehY)S`W z=I1{t|HatxICjSJAg-)nZt3FprCVo9hw=>WbA|v~^AvA{tJJmmTF^QYqs; zV}DrVuomO2?XJ^EvRLmrjd-%B31`HPR7=%Tci}d_APHiEHBsDn{HfShPg0n>dIMKi zlO)*{F4LC7t+UBiMvo*4SqQ}kkb5Row;n6a-d>2qi8zBDMtw>gQLd&rSsu>}1YVG9 z=`TpQros_NYmwobOT1|m7x7a0UG2ln{7HC8QOqe4?s0f^#i=eYi~n4Jtx4uMvO#;( z;bSie6`W)7z_w>)3k&ZR@*<8AoYujprFFD{_+_`Nq=Js3O;TVfq!44p7h{r>JdB9# z_5C(|U8U zw`c{0O>X{aqt;exk5JIc6ym%neJqvFn;ZtME(~%5*9PjHa^kCG z3$jR!xO7(oH8y%#`IK}EPX8pD<(%k{tU0uoR=Ar+PnD2nmC`|)o}HkYYjKE$8VGJi zNK;7QCrSq?TyEAgJf^_i$&wOut6&fk5`WpWbl2Tr6XDA_8F=_)E0%E|nKJAsoMBO~ ziL}`!|1Y~n$e+u$e{%Chmg-M4L$|mj%EX9}_v6<35enbr(|1_B7dah`y)0VU1 zCP=y{^9Ev8zU!%=-O!nA# ze~Ovk{;GLhoBa|*#ZffO${I9xM6L=Z?`t%{9-$A85GRKC3{6HtW<=t(r4oITPUvzi z3agnKu;HE|!U48L!51N{MocdH*||9K2uz+scqHde!fNBW^n%Eb{Ii`QR=bm8$u}1o zKpYZTJ;y7o{26S{%{mf3&bi%F$eC9*Scr0=%aBqJA{AzAeBSgd&2_b^-jZl58?PI;>x7hsTlsdRiWOcW)Qdx zl9yLmMz&3M$epyvjaE9{M3lN0$zzMV9Dgb14ESEQ>}dz9}1ROZLafDdHZu#i6ulnNxM7C?02-Qu3gEP zBqrE8EYct!+!%R9pO7^-i0l>!QlA$@7i5RA^FhfG^pvH@j0crBazF|)Z2@1_CbNxb zu!84V9W^wJg;BVyc0sn+F!vnmGu6F-s!GmUd=rNTQlbR>T7(&+ou$gkN=4Y2{;}wh z#L$gkmQk$fah8guyJE(Mr=gBKNik-pZK9xf?e$Ko(W zO`t;Pv)3!jZ3>c;)^A-pj-$&C7YLI%SW<&4!ZmkRW|s`(TRc2_?tFQ2qT~|^hl@e& z2~~2SaWT@f|xYE<-xeeV+t$Eje7IZhmhtD#3?4h05Muudlf;1VmZqMXmu!S)H z;&9f0eK{_SSZ3`t)@YyLb?6Z!fT9+t@*Em-=&!o=A|0Wkb=LTN2Qx6&aRaPF9z7`WBJC-DwkfGfIlxXHxfB zui~2h_$Dpdul?J-h!+mzAma_?FCnUn;?ClHN{#wJ<#L4e!UZV`!CZ>&@Y)gHT7>;< z0a3j)&dhXmAX+TTMTd(U(sAcyVvmlv$rYhQPCQ1eQ6{9=twfIHQmTRwwrdeoQahpc z(W|@7)7VYd{fQ7QPtU<)c|Tz+8Xe&x@YY#c;bZAPmaM22Z$j0Kyi!}rko zYKJt;NEm}{!3KnhLzX;2)D0Ym2eAk@l7XsTyPN}&MbA50Z!MX=#FQox#N|b4 zd1sk|X9Q)IknMzY*2?L$jrs(@QjhrhX^O~vX8P-XzO99l;Cl2}U0@xev3Ta7RK%4a z4eTwK4c|Q?LLrmQ9J3$`W9|i9gp*5#(VNYwE*2q#P9e&OG4=$K-|dT}-w3xJfl+-U zMNoB+wusFVe>qY&pt+@uMeT%V>=@Y zR>q}gCFYYCAEqd5l2F}q&*TR;@*&~vW~jF-vvapFZ<7=i>joKN9u2yh6-*lukCJ?? zlgKs`yMR}0!SOcucWNaAE;NV`|MIF8WljDQzRG)#n6aG2YU<^;n6opmS zVVX>8BKDzDgc?ojtav2m~%qd25)(v3ko7$AuTl@Jn zBt+U)<#9X=V*J#2B32NY2mCvg71Mva+m(9`5BYA0YOXL0t3X!tf>an9Qz&Opl4DJH zvV4wjOjIl&^mlb&5Nk>0#BM!?25|GY`wnjQWV@`_5h_B7S%}IJ3t>Pq60+=m(;p@_ zwQLI~c~$7iT4^+4QdY??Ep{!~AyIao+^uvjy0;+neB?Fs2=%TqYcG@~LAfF6+)Qb_ zjJgW5-XZpI2xks49PGs+^93t-ET$^~<>@i%g_&zMAep11Nr*DMi1)-*b8)ZDP_v_~ zQW4bQs!d5K)P|UOB{cF5_4E7ykS+}JkAbZGX3t}WQ3^sCA{jW;fC?thP_1kf)0O9k zB(IO1m%91_|FUZ3Dr^Fwpr)SDTxZXTGi%MxBHHPw-i{=9V5Q4g+=5jo;{#dlG!}8z zV(Be>KKL&~-n4LoC_RiuF7KvSl_jBVyLjsCK>}KCHel8>W)V8d9HJB~$j%f&%5J&z zRHJhOMeWgT8l?r9G)KZtq-cN~!@!OREi14R;lWHriO|ojnrI65<+3`{tJ6nZIw432 z@06!aLssFO8zOG-DpFd6Q*}lE!{06t$S!)2Jm*Xzq%3pFU5@TZtL@igQ3JM|<1FKI z9I1!Qd^)Ck#F;4RelXa=%HCXMGM9HmvDl*svu}5nL3-=eb-H1AqewaR?K+x2AhZu9 zotmf%eg^&Zm_M9KB|jKw5t2LS$uQw9vh!FfgRu0WYR@csOFC7TKxYpAq<3omn5Ryg zgvs#Rd_G_>C#VRMFEZwG`K(}{3~wW!3;96Daf$_Y5oT2n@9Qg;WOAO1N_~} zgu6&9skV)(=dGM;RVB0!E=oCIo1leYc5?`y;T#@Uz_+JZ=#}!eabaF~lP-o51}E+r z4vkEa*)qz>y7*#<(S$pu_QF(?<3!B4%U`r!ih-%#Pk#8qBCM!vaGFPK>!O$@`83HP zj7f@_p-DPZ%i|cDtls9DsVqPPBJ(g&ClB5E1W4r5%<_7hT9iyQHrT9+ZZt4XxBx#{ zBFQFW`VJ94YP2Br-ef7d4y5*mF$WSfLJIoWlPRmJQM`FnLaufN7llOkF~=KQuf;u_ zW|?IVzmWN9e3I5HqOc^&*zg5|L!6sN5ALdMV=onq-?Vfgh78pkSu-qcK#JRkl0>d1 zIpwI{USL6#_lHOA09m>shvN=N)=HvFmcX`&)bcl(AQF!3V+h1@d#+9W9wK_Wztm+|!&i^Zp$SSl zId=5m#8@1Wbp++WOxq$(X($*z;n4~Ml1G~eM`%-YS_O#s0d9D3IUC@p4aezX@xTG! zx5?__O$QEeh3yU~$<}bf21WrnL$|%n?`7OT#r(0ObNv#}Ca0%vrg@Okkzskvq+MNg z?kGP*&gboo`f|;&9%qjU`q59oRaL00f}Vp%K%1vnc6^O;Wf4#WSvhv5-tq(!S#Dfy z`&VNh=1}9R!g)&e=ip&1MG~2b3=cUnoh>8dCIwxyRpDoXHmbM1#td_7yI9=aT}y8F zex~-Jn(N$ZE@mK)Mq(dXc2;#PBdp&9CX)FWPE8VxJwEB);2}SjtlLPHSt7lr!Nbj# zW+&`}K94iHdpKvpjW}hO;!Y0FPEVEZC{6ejju2Y=FKfXw^Qn7y52(h0gviaKx3S;o z7$)+WL&YMS@?bTB`xFC$4Vt+B=&Chl&cij*c~6y>Zb&2Ls>eCD!^ek zVIvRfhlz-gCl>Ttmm>KZ7)MFKN-OK9(_uD~%WiYNZjDvR3YTzFJax+Vpl-fAtC=s^ zQ$I*Vy>}XL`p!2!&ZKld3>ktcZyxsfWuUU@#}tJM82gQxbOxWz*z}TZQ#1jqMD>JP z5*>5RDB}g&I#F(Yk->?W+^OYav}#H}8O4^J?Llu5(Egg#!%C4xbyC%ES`uczSc&R7 zYW&tGj~xVGWSAe&MlydoeQdrvUKC28k*b6*(|^@SQeQrU7ic96M zIw2In;7}39gYpuxTj~h=z{eR&WSvD^kK|-HO_6~~b~G*((?(V#PJeTiGfLEwCLGCZ zatW?Z(QoKcCcHk_VE!_-b2jDT7XwoNt{0Z=-V9{t1x$HL87UpuS{gH64SUBsOo7p2W@X*o^C@ zC1_w3R;szM>4U#vV{wh$Q8@W&mt@;84V%ZYK8nLrxn9yxpYH4-d6#b>AF&)o| zl5}=Ft%e0VltlZ7`c}EdVP$rzHV%{^!i?Bzg2i<3~o@yq6XkrNLdaqZXOh0a&+IL}h?Q!;Ymp(+OpX06H z3~po%8H7n9l85E!*bm91RelYcv;m=FO^+yFWk}hdqUN^*B7Le`tP$G(-%q0oP44SWEkqX;|qSMQPM^FasKq$o=6ivigN8o@iBS1Nv>Hr5LtAd0G3vN1Mk>&l*LF!)GAI>torXwjO8Mi^Y5VzWf-T_Vr zWiYa;K(0otHm#O8w=I1x#2H^xC8WRl`AfXSO))GY1-#m5+bH3OMr2=Bim9LZYPVhQ+8z}>*%A_KxjOqC0+-9RGpw{i?F21P zHP@GGpmvoSSy*yZuDR0DGH5uwHJB$F#*dCbOq5f=4dR&o7JE;y7X`L$fko?=C$o*! z1+L)nD#U~-MkwsS42vl5qjQB>9)7Crnnt2ra3x(2TN62cWT$P*SEjOe@o&fA+?Al|Zl0peIY#gMY ziL&AN92-Ap^4NNBRX#55rkHGM321vsN}Badla5qN=Es7wE5;;tb(rDVk5=neALvx( z^N?z3Z>3fvo?M!(`sX8J44#USCm56G*_VuslNmM})Xx@yG457?rKf7CVvOa5HxYF! z3oU9d2W*o>do|DE$V*oje?mfda*l4VlhIwK2#@NuSdn1}vkSenH&0F>AF|1>R8$Sm@jJCJ!!bP7l1YQch0e;_B6@z0j^I96HBgZ2^jf{)C!lF7 znkwlxBz}p_^192r>ban}+R@U{gYdC?iF2Hg$YMRu>%oo`;0hXD$`EYJr4D?;Tq&kX zB!f(4s_koJB*Iy^j7*!geV(l0&>0M$0{!3~f^yTHb4%7s*@Zq2fQd81`U>+p*~z-( zFu3ojIJ0I;;?1y~a$QBKvolX{&fq+06X z$+j;x=;XNYmU3GbG5|(&kDaYtCEis;pDm3|OixXs3M66TgT3S9BNPQQH=c6rKipa= z(jxHb*n+Go2arR&)T&{_z{tUb1w{4$PO>qnQ87S{uE7$5fK-iP+_MMZB}=R86xAJ0$ahuRS;4KX7 z>rQ|q?Cing-a~*6c9g?mz+AGxctk7zp%b^^F$hPf_0`3R0Br*;2 zly~--`8`I%Pl(l2P$;Aa zt-#H`A$>m&?g@h zoq)&o%JHJtW;o6>MK`pq3`^I6r)l(v2)|^*Xs@AAq{Bl94YPG2U~EhvdXYONa&NGv z8hL-~ryHHIMTnoAzfG_wy~5dcuEM3g4iw=H1$5I}L*Fao&*rN`>6m1eucIx6yQ=8(TpJz?zybhYld zSXW!?9kjWI4l})Iw%3_>&N5xh@Z8aga|6Myusv(?kz6Zv{*T-IMj{*70V;i_aAL5UebeY|@(u&s6yHO#)sxKrVJ~K2$&E zeiJ3|KhwYmvtxfG`OL^jc(}d{>mF}nd|!F$5M{Q>gmqylsQH#Qx!cHL!YaFKINA_4wg-*1jZxL0mNnDM1BzY(NOAx4 zs{PY=yFwRR5Jrj2TES2?ZP13WKqm`rQmyn?x7r#rUvbgDlhEOrMUlnNaVW0<9_z7+ zjZBsejf>;~L)Wyu+SoX?&n_PB{_RLukqdaK=UX?_!Pm|*H*M>Y#Vacu zSv)Llv@?|(F?O*Hqeg*>^ws^a=mAZL@GMC8!r?*FQbz^ys3D`L8k3m#s1n$J8(1Ym z&-P#^j5Q+gQetX;Stb@GjioeiUK{FqAS;g%FeUGcVg#uC;&=s8DGM9?4Fh-xCsqqp zs$ADqU!u$AiqKJaCb-^}*4g40LIXe$HB&J^u**-5QZx^v?%bJR6Qw*Mg&5g_lNqsb zEK=6we-`C`PRjo*7s4vjhPk>)iYG~yJtr3l9kHkd*7)JE*&Zzl)InoaTL{e4r&jAN za71%!BvQ{5ywbfYb7(pWsZza4=QqYvs8xgG}ofLSc zeAJY)??z(PR0Rk zxCMy-p`lTSAc!tGAB0&*_K>HMc;r&<^1P2Ubv@EhF(G{u0AyueLxhxQ+00JXQLvj* z$2~n!S*@WcU|UK@+s@Bq0Q9Xi@)Sozw!9Q9Ua;2=6pHE-xH0N|prXyx^n|t{l?-O% z?~ZS7WSVCaa2;{U3FOW&2fCmsU)Tb(E+9@pH z6^g;exyUqgve6yJ#!whIcO=!lm~=!I+YX^CGOD;$T1y+5PEqxYnNk8qSes-_x^c=Y zc9;=E#Ew9*6GBFFt|5*sA_7$@V-=yzZXg&Pk=V5Y0ueXV3+QX-9#IkF;)zCkx;3{B zv(#7>&4=2sM{0r;lSjib220Du8xg|-Cw*&rjkBX+oMKlsJ73#*PIq(KQ?Ysondw&l z2QOC1*}+_t6T&nf0|>TJn3t=;CHNkQR;KuiD@GJ*j7(2W%U@;?cDgz0XafadS}1SU zPh}w^I>qRrpy((wY)`2^clbS0m4I?_IjG~y_OIcvEvdE#-Y-^nFrS<2AWOB$#sbvR zDEL|;F|^j4(pD*hV`4OzPFr(>KtXTOMuwMn3;fs0&@7svasgL$VFPP}l6+WnPQeLn zxGqHLbeDHR5JGP={mQGyk>Ay9-3$lQ>cKOdq~cX=rh_PW6tXjrLoH**Mcb(7J2>1d zONGuaS0$ZGBGIfv&dy`{&8<{?36f84a4bW5B1dj=QCjmC6}0`ld}MEk z4Y0%fh7AgpNAWySAL7y+Zuy-&%`8SRy%)vEFvWs-B0E>=L z&yOQJVGQ0ew|+c(%1)(~vGLS7EM2BMKNsY_X(%8$Z;m$Go!~dI;u2jduga&(Bgi2w zqOK#MEU_Ze%`{q*LV`413Kv4eaS|*Gv5AZ<9S|+Zf}DX_s=a#=6y0ti z5QmLIjRK^B_%2PtJB%p@?jfmj()~{8XsbZ!NrjOM4K{eaP=S?BB3`VgBQ$@L+#Uq1 z-MEN$D)o#&La#9#kPd`vE6ZD@jD7A?$ECFR)Rx;}0#tl{Y?o-P54qr{AUBNAH*r_N z{PtCJiA_5Z+zB^x`rs`kv>%%pn}_T^Qz;-GW}$YCUMKKbI+Ye*wKBwU!Zw~Qc42;SqU1m zgFQfbVC*ZQ@8a4rh$L!N%lX2CJUKD4yPajmoE0?3hfX$}5C+ZGP@D?N0R*IQV*@vX zalK>*i$*3O#y!-YKpv@Au-NPY3Fj1#Cm6~nLZ;(Via2HjDqzvm-9g8Pxr}R-ssp9- z=(Yq=k2Nek?|1B$hJ3&{BimXtsuJFs_Iieb%gPX`Poh_Q1#z8$OJj`KY+#Ei6EP4= zTU@DSH%MaX&YE8#=-3puMS)4fhE3)Yl3e!1)~2e7eC8lga54!B-A8db!)eM?jC)4N zF2-xOn|4}LO}YqBbVj*=Ab8viAuiR5jRlL_#;EAG?MotW+zNR#hr>S-cuu5YAjS(v zYy_GU${|saIX;Y*09haM{P^TLW6oSgw-_o8I)X|!@Oz3Hn&$sS^$k;>(*D0bn zYQ+WPe83^@^_0@?y?&*ORn(k?BSV;_#XgV;Er211mKTpwO=$&qV@Toxk%7pc7LJe2 zmd6fGmaJ-o>^&-KVY>Y)u7;+b$oXJM51vV;ZXEuQIgx|Lh8cO*Fk62Td4pxJJ?{Wo z)X7%p@h01{KF_L4WnhTz=oj?Qx1*BpJ>oal{Fu@^D`5aru<*SH5 z5uF?;-8^Mf4~NSnZSW1Uh(t2IP!P?a2a(*T~4$Yzc4e2N`~~Gg01w& zVw>$P?`j;FJ<*S8Lu#wlMGqL)K-X-PuxC84P*NAgw-yZ+9z2$tLtnOPyG1)n$geDV zq2dsZ2iLUZem@|g9_648fn59_W<1!=(C5)uwr{lI`&5N7B7SN>spR!>^ zZ7ox5W$eDJ%i5iHAzNf%lL_@zF{Q1Ncp##oe9@_Di^BP0s>y*U1_}F|iQ!#TjhF*a>^b#LINN!{MF&HPqG;t&bh=sekf;Nsk+vsLv+_8&3)W4&ZDBZ*Y3mhtnbQW+ zH5mEY1#vO}hb1JFav0qUw<50)Q%g}Nr2}l%hQ2l_%n;wREbI1&ZXMjXtR0`Gq4op) zkcqaq+=Ru=8!r}w(pd5$22-WG-Dy}6GjnadJzB~HR>~0*(tETj5`c}_bGAB*LQ--* z1{5@eBZGMg+nzfC37qg1qP8DM3-QM4)@8r?DKjfbP~b+uWBgYs4NQ(>~lp3SbMd?+APd^5rnU&_pJk%qLJu_c)kSI$6583=j6$ z`0d?v46?q%YCc9ek%N0d^t7T$e5AXqAm#RCbE$!}8+|mBw8d7PB1Wrq_LTHopG>xl z6(ZenV7yi7SQ}8fsInf?o{_2~G?%&=a*>o!63bQrY3G*E5oLbORH|yCt{go;XcLRw z-C-0f1@0TU2&%x9l{}?`O^&X#l`t9(73XKsCa67$hISKK^AXcMr2clj933|EjgE&9 z)n-pxhF)qVS$TdC23m#kwZ6i_-qs93Rn(`+(h0D0$WX!RVKwXooLq+xUYxhehK*)4 z48W#a6^DZ=rhNFu;l)&cxpfEb^;G5mFeXK_lI? z3byH7e(tF`(o_)B$u76F1zYj}em9@2hsp!U2{+t9?->NWAoieJWq})A&5%@rq|0gs zdmOu1v3ngDBw&Ce9Ob=atq>*(yPnt-w~k<#fAu5LD{KlQPq z)$nVf&_&h+sjNoga`<+e;ueZKU?{!ZB7%ewW=okEyxv)W#mP-^Z=~6iWZ1eZd6)QOW=oS2wZ>ZbTxs$UaLB|_u}mxSK^*r58$X5o^A+8{VFM{MOX5cSRik%G zM2Zt{x~O(0m(j2y`7Pwrmi8gll%gV*8w*6kFu^$#(ow5Fc)Ppr`hGuPKkiUy8jk++m`DD~t7X5f(mD%jKci_nTWygv8V!wi(fPuG3uep@XckTBEQvN8p~pz7+SvicZb$ z;Z$UoD&brhM;cn2W{Sll$B&w;xg#JEtA3ly?5|Z>U8<+pNtilU@a2>mi{K1!4y1ZZ z%8GgLU?^i-3owGY4Pvn>cOR*8gs!*?%Vw-QT3JPqc1;f8Z7oQy@D6;bu%SYQ%_&aNBC4;a9dGXOYg zx50tf29cu?VdRDkfZC+M0SJ{O{Lg?e(Vv16xO`XwO2(-xt)Z%pU2GJPq)aqkLt45| zcaLw~9GD`hMQ`)t1Ai$DZj~FlNoL8C!pQnm5mOY^=8740okg(OYJSLDg^DZVs zPbdmYr6&xw(Ktx`(Ase8fwq3Q(gDE-Y92#Q;qGC~X%L=a3$$iVUpQw5%S12V<>mCw zHUdtYs3cNX(qZr;r2!m7w6=4dwdE`a7Z4q`o_yOn7s(;X1|FAv#7oJ$X971uDx?wD z11uHVmd4u2~&150dWL-RoV**rO@S+rYXBY^IOg1aES9FI&U-5+IGo(zkgfOz&TdeV=oWe1Az*($GcJAr`tXYoVruIe#^ zev%HObiFP++|kt=L{;X?@iST%lnIZ2^Bu<#EYdKubFeF0up}V; zRt-R?4n>LH9O*|((c4f^2Kp3GqbY`|)d}biDieMTm@NLl$Q_#8*Rwwpi>@8*-0C3nZnnoJ=N@bE%iGkv+bjCJwrtZa}&1GqLM zQ3RsQAOhgSo|H2X_8C)Pe_m!=k!@-P_;X>yVL>c|IV)CnFFw6x02<7vCuJ)m@1oU8 zc$OKQkFA%9o@JyFUmmLMyuVI9=e=NM&{O5|bsX3(V2}+Jq`Si*C2x@ zXt9n=6ReozO_?2hs~QEmPfpG!6WaHttZcD5TS_HdpvV*?N|SZeI8YJP-eprCgMF8f4$l+@Kyyc zVEjA5F(|a*1JHPz?jS|-ghc1y|KNvIQDuNdBJY&Dj26joHAdKe9pqsvmD8-0<6%}2?@kCAY~uzFu`(93X;uw#9l1qGC%ehu z>R_{gz(-04*gJ2dy3}B&r_k?Z=?Sy2PMHgM-fqzavKYavxc*?47?8$PkRj@&3|Q>y z>Gs1p)!9PM8I2Wklq+wL&}v-^;FtZ5&t}b*b4=Y$<^0HW+Q=~3ZmbBm0$p$s0x?sR zve1LkOL9e7Jd~}Y8#5#fSz^#p78-roe^|mPB5jXzzKxmja%y|PrAQbt>Z=>qG05a5 zUPCo0cF})a9A~x*M-XvfkAL)Sm9;gAXrjk#)v|_A;1kGR;0ntu1r_(ONF&++g|TJq z+}7TQSc|z7UW>KL5*6>%&aG*MtEdhvfl-m4_6hjg3VDpF{)zljr9d9&a7!HLYI+Mrc*zCl-{D$sylge^qa zX^@go$IXbymgK0+V$M>iK+T-!r9qix#S%YozR&6c`wc+d_OwG+?+l39ro9x*3rIVZ zC?(SZ17J40a|(VPm6Oz@wmUSL6b71HbCF)me)j%BDfiI-Y} z{4!PVoJF-tR+rF+jTL{Uv#e)}ucCX+w!TnIz*==Gjg=zaSBw@8 zQwRGRC$#t?7H~+M=vkZ_QW>ZbX+SP;0xwfrEbw3EVB=EoOmyc~HjB;tl5OhG`7G%L%M zDLl#;9{fNQqCZTkVyji&+0cMXL?u_bv++Qu++@ua6#k=f9!Kb68EWl!Gj5yq(u%~zsWIMgB(Ci{7l*=CLuOT-Dtk~srQ z&o5y+28^pzh0l8HY155v$S64A!`x*oATdc|Gw>$Nkkp(HjU1)kcbz?r)SwNXMtH_W zCXZtwU`4qLh!y9eg1UJT)ekt9aiUO>N%BN zSt)FARj}wd_ZPzGt2`a4ADRU(pTWzud0szxhP(2vBaIl*L{!LKLY@X-?53kQ9~jVE zVyY;}B)pKih&QW-WCxLQ(RU3RRe?O;NEhQ6J*sB7nKbCLjC!W{T;EmZ3P~KbM4TjD zuCE&F$DM5^Eo2%;(}2#2W)0yxgRvKKO`~Z#)z=`x(APC>1GZSfVg}I5{!?HVs|_66 zEgUoJ4slrJ@lFJF`+@O{Fos(re+=I`fVd+ei-<|`m-fgq1m9WHU}$U6-OaCf^NCczKsI>H8_Wy_)hhRG^4g3 zYFcl%N~xQoI^dgRi)Eb7M-1NL&Cs$U5Zl_0=mohMFA)}Gxooo{+5(#qi9hHxdE!pY z6Eey!Cxdl`SKk783JG%)YttMJGl<;nm6OpG&R;HLdBsGA_sRLpw!`HewMYf0FU!Al z03y#Wtlq*j=DHVGltG8U?n%*!z2T&g$~OaNyBr6D9e=}Z^g$v(h}>%W9ArGa=eG}R z#k3+1cQV2E7Wa13&Li1|4o5Rqo2xG93+DIkN2vGTAVJT`_dC^KfKtsS z%J~@2Lx*T2bKEo`GPUUZOM|y$ja~b^*T1PX&ysl zU(Vl@!8HZdT#T4K_>EbS4$NRk$v_>L94^qU^{&7k39Zx8=s{eOm^F;HB(SsaHQ+59 zM#d$DM(NQ2bk$=D&e+}WOn0wqzdMGBkwVlWDS;`l50xohdAKSPRM2e55oA{~y<-mt8pHIydGA390?r{4 zT}pn8(%E(r^p|LT9L}`|k+9vx9tCClVf^Mp<0%i1>w^>)T8-KgGE7BQaUp)%T_#i= zDSxj^ukHW+n>L3NqjuTeEpEleY2<>LF;gwnqU`K`3uYrQiqb90es=CrN!eO(f~Wu{ zSM*e}E^(QQO9+SF1Q#HpWo51v!36(1O~}b+XjnFD(fDNFo!@0a1xwJJe@>q#`Dw{& z>?Ck-I7LPT!x3!^<7{vJ?0w8J*$$}^N1!+J=l0vq&E?@du)raS2F~Nk188Og>g=Ey zSQ#}U7dEK;5@nwj6i009!9MB7lz)LTYmWOE)*Y>~9t7*_$~_41iiIRPvLD*wS_86K z1jGoD8ysV-@*PX3%(k*)%{@hYVB=d?AcUXl#U88vqz@_y<2FwX=UMo&^?Mn*D`1M_ zpvBn2WO3BzQojW0+8Mzgdfot*CeztsGvq}>jR%nYlmRM#%TWj-yEG=Qso`NPV-L(k z4OUyQLx>dEKjj|6j8#8n$ZN9|ozekMSMJW?rC#j-+R^?8S{LPX=JvB>2dugKT#UV*kY>S@IZuS>rBrrBrI?S=^m4z z3vmqC!ID;hLp`p&?(!Z#;z7a(l87BTB|-PBiN=rsXy^>leMd)$B-_=Rb&ntYIn99D=BaRFB!C zk6*7};g&C>8d1ngd){!?2;qZ>Sd8P2PW42Ap6g@gXhrm1k75Rsc2?Ga&Kk(l>vHDT z6v3rr1@5?>muF=0^_)9J;4Yx@aIc5rsF?Z*JvN`?Wu{9~f_K zlo20x{312Z(+eTBM5vBVA7^<>Gg{y{g%^F3$zyZ~>sLYhy{KV$p392AiGRtYX~ z6VAH$oA(7ZMHC?hy72pNYqn7Ib={U*d8p1F^$3;=;|uKb0&=yK3UQ@O?k#J`ltr!J zkPq5+D^_EwT#b?CxQ9gdX8Yk?pPNs#{d8zrzcSNht&A;L9i~f{sNw5gqWx%<7g2bv z%3W2az+5g(4MC6U9TRc4e2{t2UZve25OJ` z#A0^al~lzyLj6Y;Nr?UN6TuyWxsQ%y&pk!8f9h$*4p!csFmHyfjEB$_K+9muQ!Jhp zy~#%TIU`idI^1A3sTa&D5E^cRa|cb%Zz|B!yOsx0<6ST#%H?ty<}iYoM&`lyi38il zZ{Xv$c7(v7H$p7mm>WmB>`JPmmIXEMC2X^3Xi3-Lqz(I0Eb^&=Q?;|+4)^Ftb>>h+$FOUr z9YIX^;Nza5W;-OniZ6kzB%~aa5qT>#fVMV7vRz}H4yx$!l(&psPpi}>@nk~I45URF zfDH7TAgM9@diuDi$TPxOCLY?t%t`~|06u=Nw1a4~(0ODM^>gTWK}RF2yW<>2m9uTU zVX?>FBYzRQg#_gS8Xk@vo19O_4?d*NA!kzH9OBCZF|Jtj7-nf^0S#&+BKBaNRbNBY zcNmr@$bU5-22KL!5y$Ntf}YJI;V8Lrxw5iQt6Y7Jx&t1v8W;+@EZe^6S3LQ~O$v;# z`%QsZ95}$DPCo_K*ts;vV_>m#b8lhagjKes69z0$nP!nbVjSV=LzStmQD!_MpZE8a z*B~o1>FzRPXk=?h*Eh?I&?940a<-#rqBq~fe8-hl{wCU*pzNwQkUj1-NO(+?t%Sa1 zj=kAMLIZj-FPZ9bvVF2%gQ|g+zKWJ)GSCehA&VgXQ5HIv;0llMRo7fCR6xK+DxykM zS6#ygNolv}Gt_`LlAlWpkZ`Pm1}&<(-ZGCVs9yF^=2L5HaK&N`AF@Y(P1QS++Ipt` zQ<6q3ygk^5JW@jaRgAKJ9(=Q-G^;T}FUhO4uY9CJWwA@4&o&hJHgv1T7MwKvV2LSa z(y9qUp@D63C8b~iYO|7k-i@(Bk2(b)YTa+c73>)eg?KJHH%P%ZDb@8*JtiwFSf#a2 z>zH^&glYv8QJ2#$P;nQXD4}aPcKk@!$XWVP5j*t3EI1;>h^yn&Tb(n4Mw+@{o8>%| zDGoKMj%L7_tj4k+)Abs|Gw*;bmN{m9B0^9QY3e;Y0w61$+-OLb?cUnyK| z$e2Si4xc7HJLChWkkzw+M09C-7qo;{@!F_Z zB3N7e6Hd@?vba37i0ooxJge1Y5HXKCJBweivP)WT53f~LYb+N%R4FivJLw%Y0orqw7bW2^a+oJAjGt$-xfp=6zL z#dxUd6e_y{BFV6?BG$iR(m8tsO4t!TM}-@1*x7DXcba`iip&DV!tOlLT&eFov0gb< zZ|tnJPNLw~8t}c9);sN#8(LuI^aG_}U623mw0GiG8AwUcoeS%Y<(j^ruyeiL+SypG zF0a?>JF8E6(#~RW=RyPCnv5Ul9{YcMN}Fpu%j()%uiti3!K1cbv5Lk%WI9E7OM55% zaXovRu7`c9=QHTMXH9A+y!`^lckW!OR(GD>H=2%)T)*5{T|a&O(&{>Wl769F*mZ&V ze)@2oZ1DMAH}qMkowfSH`cm(g_5M}%Ko&b#v8OT_*x9a~+}S+QY@;T^%IJvsyqz6* z<=Pf$cCH~@s8P*Y_)R@#slJNlNu7GlKAF%l>#?$*YmMtqpxzp^9y2ldShLK!dTZ^@ za>2F&zu^Q09u~ZYL4efGfRZ<=*CS>Jj{`vPn(+yL;Q@&HUqb7mcAf4Aid^4VUDjX3 zeu+O|CxHsqX|~$e(=kbx-f)xPW&2 z5V|yop~M9oGpGTZ_>=58_@C|v`d=0V+3D46@}Wvv(cSnHhcKnv-CG*Xb_dmtR|+@M zk?&w>D8a7=t3571g#(<@W72eGfjm^Wk^eeWo-AR2Tk#r1gz{h2Q?xM!@A(DnB4)GL zpjETGn1Y((Z^nQ8Zxye@dkR&G5=Z139*Sj7HyX6l_>ItruW9N}i>GS14HM^ZU3$W) zD!r6I_>HEILM621)fGyQFj^TRC)=1HI>%xH_TEkd?wKkotFGetXAn=eqLtS1PMV0^ zE|bS2@o*W_Wa#5ND}b)ysddO5cy@D*-dyRRnrUWa4>_b5V2ZaW+*K(9)Ws3!aP!(AI36T2qsKE04>?8>(t+o;@Rm6 z`o8#f??w!3%ZpW78_QQPz;aRfO2b-qN>xi*R8!TG4m~=jo>&oli7ud1%$I_0NES)& z=f_v${Pvm-(Gbijq$#-PJ>OO+Jgo5W0{wf~>3`V9gYAVkZrlD7=l#-og@@f|LBBJ! z{Vm&mcU$3MFZxGw)pNGLYUrM!!ozO)hJmbaf6m(g*!v#_aB%zTivifb%K*N8`;K=F zZU5ZR3$_)K#*+m4g->itWi$EucMV@geiZQb#+J@7K|#$t&%3_vq-$L&A? zx$-X`mhAeH48JmzT&_s;u5HOPzAVtIk{9aeG0DqybZhc=I@+0B^cA^oI617Nd$%Ru z|5X9Ldt36(f3m}W`DYoVHi~#(i4yThF z|F`-1B|5?quiY=eh2-Np+L>(oH-X)rJVQr2lb7hIn7l_vSj~5ST`v64Q1XNSF2fs= zU)515xnD;=yDfR_|1Up(Z76w!o~MruC7;#dqmnP!(fvBQD!KGO<({jO2_5~~w&Yad zJU-SR+LpX;NQQv^>oz;Qdb06#KP{? z(Phaeb#xED`&;CeTa!=g=(6N%c63o9zh0K?(a{r=J9M;?e9->-c^&=Fq2w(Oms@rw zpViSt$yaoAVe&2CD!+bDa)XYpPLAv7Ny!U!bXoEXI=VIa7abi=ZhVB?`>AcokAIsC zk0qbi(KX4AM+)q^$E=hhvN2AFXb@cLWN#T6C1;fWaN`{vtyL2?2{D6+` zO8!kp*sALuBNt+r?vUX|@@XC2JCywQ3k0|)d9RKxOYXCy!eiyvR}Cev(&3Ym59;XF zpf zk-SJpPfp&eqnYH<-z|6i=6T51Zao{3>(Zu#Wa5OFFtJd9IGmPkuy4k5As9qemsbuA|}Pb2_>!o}okIvP!`yH;SACb#J5hlY}m>u_)KtxuAl_aryzXgFEZ z(RgyNj;=^Pts}774_qg=OeQ<7m(h4~Oh=>1OLVj&d9{viNItBiMlyPX+;L%YL`T;r zr*(8k@^Kwqk^Hlc_9R#DG!uNLjxI>nbaWtjvyP4=U(?YQ$;G?m4ovmoMHx;e^E#SO z-lU_w$zSSdG`VP4uG^7ZZAS-mbZt`8(f;JsI%+37cFP?XCRgj|+GJKojpSWAx*_?3 zj`k#%j>sK*l6f6nmE5JH(c~T-U7LJXN5$lkd*qI*l3^X~OYYRs4aqBXG@5)=M^8w; zs-xlL%2B!Zf@H6bE=`W>=;CBmNA=_rIw~gH_sShh$w?hukUURE)5%A4ge}}B*X>9S z>*(U-SvqPaf25{Q(WS|c>u5UpD;@1f{#i#$$sGsGlb3b0ntWDAmnQey zUmx+ka@~6J13KD~{FoiRPDiWBV{Vk|u1JP;R7|Qmx+u9zN0%nA(9zSAf7a2CicG@v`TuiZUVNZz3HeE*my&1cE_PJ+*p+wV-}xfdqS*U_Qm13G#y zM9^o+&pY}E^RLkBaBK&b>t9@vXHWl^g#TX>KIG_gDB(M~-jnA4Sn)Aeuzy5V5cVV6 zlG|!B%ogmQYkz&69X%kyzMq!<2l|@7JkQes-n1xlye#>kj;>Aq$&PyK08a3~WJ#X# zg`wnOCuDdunbpzL6Hi%qNT~>K)fv8hTk;nTnf9@4yD|FP_l2*}2 zm3V}b@*~M{9X&2t)e$TkrDd7V4o{4In!;{OUaq6dl6&pwlRA1{GP@%89!_4Vqbrm5 z=;&DT*j4%U)}*eZBgs8F+VM?PN6wNC@;?2PrzMYX%7FAE+ zO**cO*m-|@?4vOhkw{f$HKhdlf;o#8vL^eo=a&i%okk~`iql(c_ZhKDoF z(p!;aGcDBb*4I42vsK@xuq%`8uaHSxnOtp0lXkSGqo*YISlB1+=zbjyC)fUrJmq&` zTGip74J99Zr9g+1uj>es{BQlN05QDlRWkhUyuY9d6CQNnDc%2NNoH#4|D;0K8a*vKK z`@h-Qt9l_#kNAI(v-U9Dm>2z zftkPWvETQ|H<&LyVMp)R5h%*tZ!|yuwT_;Yoc|_)O(u8fXeN2Hj-HbIy^gL-&i^I3 z?!x2=I@*zp>gb+r$>N*k=N~&qR`Anrk@pQJZ`RRe$sbzSH*|DGa;fr_9my^oy62J93v#60NV>lA+P&JYe6hp&HKF@*nx!fzf9;s2)a>YfmODgLDQ?%x~2#}xkO z5&W47f6Kn``ZEf@Wq%0&NrnGI1pf_%|JZ@>dUC(heD;2C2qz~h!9N|rAFuFJH-^`b zDE!M$4&gHj|KL+XIB9w}tTcD180)5dLL_Puvm0zvEkE zo)`I1pfntk1U4Qe?{SMT?*lk10kY$zUf2=A5-|fjS${c z_?;(1_%A5@Ez2SN4-|gsY6$;|!XMKN;TL_Y%;(W-A^gb-|Ema|D*Qj69bW%Jg@3FS z!e6KG*S16WhZWxHgz&E@e0)8Ge+Rrmv~HD+5I&~xyH17hs=|+)4>f@Joo0dU*KD z3O{gH2>+16f9p9R{L2cz^SL4X0>q!uJRkJ~A$+gG?~CA1SNPkXA71|gg+KoVA^c4W zzxG8T{0|lW#Qzq;zo_u9MeqwCh|oO0dUtsJ0foQsheG%r3jgGbL-_L){&znd!r!3q zYkwq!e@Nk%yd;GGy~02Kqapm;zg_0}{+EXEoeIC}Wg+~S!teXB5PnMGr+*@Z|BS-# ze0d0em%^8SDujPV;SYaB2>(xo|49UYA_O}=?>`e>KdJCHzA}X0sqi=aYzTj;!cV;_ zgx{<1*3X6Tk1G7xuMXk=r0}($58;o0l+3gFnh^eEg|EIggjW>)lwSzpcPsqSuM6RC zRrp^<@J}fGS6&}p|5b&*@fSn*V;(K@e9ap|_-=(Ce^Us5rozAHmqPg63co*szfIv^ ze@l4%M-_gH^vh{FFWg8zoXfA!bG z>;FdKFS<8`U$R5yGym%$d_v(*Btg-mhb@Kw={rLBPb>VF-x+VGzw2Eg{IM6vJpVC*?@{>gygR)9h{9j?+adf;h5wKDgz&o+{-)mv;crv;^m{}2 z#}xjx2>w-tfB1L9>mU1Ang7qdFNE(?_$&Tr2!DpcfBO9){BDK+)bEAxw(t1uE4B?k5{GY}{_^859mO}V(g+Jy{ z2;Wfn2O{`SDE!#X;q`A<_*I8P_{SCgw8;?uC58V@1b+lJn!c-fG`#*Qg}-AegiioY z>-?F>Uh#B=-xtAOuFp9=8$Rb=z5esj^?$F|KYTvC{^5_8_kJb1{u;n({(li&U()OE zkFKxk^`AQyKL0MgzVJc8D5xR)?`3-ZpB)dcf3w10bXy4jxWcb}S_uD!!qeMB_yyl7 z^M9$rfqwk&84CYJh3{7Q8x{T;g@cXqzkgNu_dQddZ|HzI@BjXN0zaqr+lKFg0pYuKX{HDSm zyAeMB)j9Bw08aS%Xx&GkJ^%ZXUcXD9^8|$_m&$u%_!SDD)9bHLLUu^u3uk0L<~e5+ zez(G3qR)S;!gr`&^>T&(nZi4#IVP2OX06pxH(53RQLxK{ttS60tBGv-1|J4k2$A@75+Je59{^+L*d`? z19JVf3jct@Clp>(_#>~B=YLk=W}e3tzOL}PUjK51e_r8c{-09#W1b(r_i;~@=YOxl z%{-s0@D+t$rO*E*h5v-YLDu-+KPdcN3V)`;Z^4bUKG(fK-dj=lOBDX23a={sV+#L@ z!l7RAzY9PR=sATK%5%(n=M?@{eXm)c7b*PldcC11?@;)d!YB0kUsU+T`d)~m|EIY( zfsd@J^2Y^wE+`|oA&keR%ehhJw=XVe{dA=G0N%$Z98s&c?>38Pf*AgEiy~+R21J9EG?*~88>+ZZ$`9FsI zP2c+h@jZy&Px>!LxaoUeig45Sz8vAE?|p^1z4r$wr^xxkqxE{P7ic?dd9#)iV%Ghf zLj0A)2Z&z>T;$|7%E`Tn|F6R_$|C*Y#1|_6Ka$UDS>b8o=Uk!h?IfS~0Nm4DV{~>-i zachUiA1U?Sx8qj27>&<NBK~gTKHiY{*MT1Z`h969vGLh)l=AU`ouoe)xX_&SP+H3kDVrdI&ps}f%q$l`!HDIR}uH;28n+HxRhrV z?Zy`qe}MG<3<~k*V4>WPzo$R?flE1kv?;%w1ipWokiVY;T;6-btvcR{#BU@YJD2(l z8;7Jn@C`~oN&3Hn;vw(#rxS_4j<`QLP5dU{^4?zBfo=SJkN8jNr?B?lzeoA|vwGxH z2QGa6n|>>!{}L>^5uYLMqX&t961bHA{q!&FApR@j z=dvF^MEr)-*)mA?;sBA;gi&l=C& zz(u|dQ$8Eb5O8_#m3`s3eFgDfzFcvW54Sm-FH3!VpY%^YN&5>cuKW2T@#AQRw|X6V zw7&P}wBOoz+XP(3l|Oe$KL1ACpR^$U6Y|-)L(6IWp9n=u>h&)ABTgoLFY!BQx3~A! zfy;Y+&?D*JMckjpB>qM6Ie_*Y8_y3BKZABiopW|9g+t z%lO(Yv7qHVo%l-Pk6o^~$-@S4X=k7Jf%I39ev1Ab>&IJ2@6%F{{@cWT+6Ur~dvW&o zKM1(I*B?SA{d(ZiKChwu_5|Wn#1Fnq%a7&N{k)fa{Ly5#=Yhv7pJQnsK8y6Li63;d z@_|@(KW74$^7!y!;+F!Kc{)Qq3>c? z5sK%2_FJj-y6F_<^I_sg6aQp19!@3x&_C|!C_DGi2QDIh?u_DP^7%AyDZf7!LHr@& zmVn?8@_8mEpwRmx4x~R7cvd?%NbfUDkpBI|eGU)ew-Wd9g_eSc5o3g>je}MEp9R~5|V*@CBeA)uye^1;_8FsV%-wj;K^EUbspq99w`$_MUOb~zGpz`gm%df$caZ+sYm~pwltX+CaA}{P(jRC2HADJ%-*h4Htaf-W`5Z<6tj(8i5I=Uf{x`=fei-Qw1up&Kv*QpyhPY27Li{B1>9|C_Z(!|z9dN0yKh{V- zzas8WNf3YHdVTL#j?;3Q+>-MfC3*|2pwkaNmJ#j{CXH;rt`@@iE|19?RiUWci;n zthmoQ!DntG?$6{B{~d9ER*(2IU!r_`>L22pfXn!?JOG~|exAemN9yBUIrz`X-)9iv zGtb$e{0Gb0Zq`1h0GImuBTA%ikp5uC37DSqVbc4=Hl+V4>0kdc9S=>m+d-J%!rv#o zA^mB1 zd`>FTU*YKaN9yC>$>+Pvv^+25ci$i%f8?C_ABp=TaKsNp14=pn^E%~Y`oj=#sh4Hv zvh{bCxX)KcK9`WsIgFFE@qY*LHDh7B{SWacu>97Ze+@-l-s_Lbk$)Mulye>FPbYpU z>HSF?;`_f;`S`Oq#NSKY=ba+{8RGtkAMyVLF7GXKy|a2f4GOlD)1PG|eHU?`6pHvc zz=hBKAJTT%pZ$IV>HP^A(%(S@UnR*l;L<)mRT1$gyiEDOgmztP&o#tUUa~AP~E7{}WDBx1Bk=H7{@i~cj{J9Yy@pr1vRpi2s7PKPyc9N#n}jXYL~YO5jq?BahVb*x0_9`0~|? z-%t7*$j1&So4x24!0lO*x{p04^u7K(D8D=fxQ)p){d*j~PscAV-OItR;g@%ik54E^ ze6MZF-=|6;ekgFM*F{{fw-7&-^#0&4@vjk&E-%fpW2mpCvc&E(U+8d3-L3FfByrD z+qnG*@T~s2mGqWZ;jQFzFY&WRmCpe2JiTiwWq`w-tl=Je-wSODLzejqX z(S-QlLeL3)<0VS}*gf=%VdASV)bg0zm?geH`^)D0KLVHj^7$vpf1fGk|7+Ucio{nE zzig@Uzn=IkaN!gCd9NkzlZTN0$HaYtRN~K?*7sgZdD0|)B5>jF(}ECxJ?Zb}zQg3e z`$!+#bG}ac`t@Od{lVd6n)+B@lk&9wydAidC*F7eKj8bfl6UMoqx3!pAZgwSJd6Kl z9llS;-LZfCOl_aHeo)JA{rDo_QXYSto&2{r`ql!SOM0JSfFxIv|6QL}{eNei2EF(#Loo2KjJIyjN&MElHR9MCjC{!ea;`^UnidAV9_t` zC+^dClKu!xG-)@VkBm63uwmAnBik0WAD2Y4nRYPfr3a^Y=0I zD}8|Umy+HRvDv=tCer`ao!T##k^XMd`*f+qOS9Q>tPWh>d&;Yo&sRzRPT*2bpYDnH zJ;Z%VZQ^^)DWAXMK7D}r-vJjsK7}*!my-USAJO-2A^uj<`y^q+kJ+w#d>(P)X8}Ke zzo$R`$>Go^Bmcr}kNlOX=Qv$ej@f35b* z1H@MWm-72e*u-anOZo4M;*l;Ty`{9ad2~DR*xvYi;92dq|0}dSXVd>;2R z_=v+VzM_c?0G|3dN^q}(VGzk~EX z3oh{$=PG}nicUY{y%vhzn zO#Gw3h5y^%qx=Vm{|D*)O%24Ki4BGD_j!|uA5T2?=hG+sdx6V)-&EB1t|xvc z@k8nFfEw?9{y;vKU}ld!6yNb$El+G8z7}}aJiV3lvAuV%*C`*LeVy<9JK$2zp*4Fs zM*Jq+4emZfVRGs*n$md5KCs-EU&*w=W#~1yMxX&L?`U@}6_xhxR#IGmr)5H<~ z5^l=$z6`^-bcuXuyj_uzjE>wCMyNtF8dW)6NIaA_ZZJqw@N`;E%~7RuF^5nl>C zYh0}bE_{5tMbd94ZWl>xV!wZZxWDX$^iRG}`S{%G#E%0m^&x#IWpoZxRc{ttIJiBccO=HOd_OMU&_6@2Du;{IYM;-7MS5I4nr+1?7DvxNQXjVf7r*eO^b0?Y-`xp3Ykb}fTHBl&%fO}l@p}3};y#@s`FxSMzbS+G>MNB`90$9TxW9^r^c`|>jgE^{p|G*+2t8=_&yykrvJ<2;S6vor_T;= z?+R<4>s@qm-u~*TRVdEOWv;h{mom%PbThDEE4};;L=~;f4|mig!sV_ z_)<=v!j||kz_Z5rI@0@$-=semxbVOHCCdMP;_oN^6vi_Q5dRwSXAFn*zjZi?QXemQ zr}E!=n)Yu$zndlg*EcI4=4; zdz8Pw5s&o4#C>X4;$HwR{rjPv+HRK;e~9!xc{uT7-mCVLHqn}ExB^9jC5e;sk3 z`;+*o@6-2A^yzyG#AksEAD>i|_(AVi+~1-@`~=`q{+no@FB3nP^#1ld;vXXYt<*D* zCVn6B#$`GV|B?8oq|99Mb!AyTso?`t_W@ zCE{Nqe$>^<$M!pWT%+%e<4J~qOFJAwIf?C|`4ke-jnoF+o1xWq(zPzlQh=8GrR}#6RrtQ~~+x$AJrfpGBDXmH3)dgJm`x_`pKScbz_iKM0LVPs_ zYL*=PD(QU+b<+O|cozM!n6UC*f0H2Tr-}Pa-^4Ehp2g>G()*Obq<`K&DSv+>9`Om{ z@p+jmi2F;UNdFPyalFv4iO1&?&-_UCxOz2knRh>7{O}#*e+zJFhuBZ|P15(R)P6jj z^iRA_`Fxo6iUHzFfD0dgJ1Ozi#AE;38Njo~|EtOW1xxh3E6C@1;#Yk^ag*D>1TOaZ zE4jXye*UEEwLI~8hwa4u9dhJ$9DJt>7Vr~r8hm{N5Henv**qF zUVjNC%ky61{)$WDzW^@fx#EVfJcna}lX2)TTq6Aj;;|j$65=1;Tl@DY(q9ccYhK(8 zT;97jic9$|@yF7hZ1p|*-?cm!9;y6otiFP{&pFTc?)fpL_m>_MKN7gS_vzG&Y`#}X zZ+9O{{to%M7lDz#B+4a2zxU}1z^lKDJ|KG%)&Afaz z-=6`+HLG4n0+;vNZN=u#-Qwu?>3E3#hyn7yfb{+zQ{p#~{ySwIw?_Xx(#Lrl9w6@T z!6ly;+^Xfd`6tTf5aNTx<8!93Bp%xtZULS(PQFBXe^GXa{`@a+Y0s0kn)>)NaOp39Auhk`{X>@6uj<81Wl`3m<=bEAhwOrntX>nD|M+rCv+uk1#oTIq`Q=ex6MFo5{yt zcTW5s;-C4Jw!?YEA0!^f)&Je?TAp}6ax!o!&ovwNavaVipVv8@f22OHA|HR98o&Dy zaer?S@jWnMrG5NOX2h2P&+4zuz@UJWe+H> z!vCmODxbTpJixQcvjMp9@mD*O{E_LGXAnq?ZBYrdSSPvZflJbw&mr39>5n>6_jg;kzgtFp6!cm1{WawC+)pW= zLDF9XT-r0X7k$UklPLA^_^)U=f5UUN5RdNX7~-$FHZ1=baN!@vQCvX$_tANfACb@D z^n=*=e9BjqPn-|oxxl4gK2Q7G)ArEvoKF1N96#3nA0l3(T)LFyznl0l&mkK9L0{AN z#`@|zfoJJUpC7DPk+pi{8~WboenN%`A+Sq5Cj!-4;&_=BW>m80h$sgJLa&rO?^-umSU-%>vQj&(jW zNc;&;)%ICR{6gaA?5nt~BYz_9@0Tb25tzv0ulyzBRG&h81#oGfW2rB}ZRCC?fJ?pn zC9K3hNPHRl-Nww%h{x;TOTVN1@1XzXWb%0}aN+Ooy(E5-qvs!~kGo0##OG;!?Y&R^ zuJWJ$y0+&{e5MDu@c(+R(%U$E1Mz3lK4a~93vqvC8~OZ%xWDR*_`%;({&wY>ozol! z?#3JAD6GD7q<=5R`Af*>8q)8)Sj&mmxt}{pAKNYeK>SxrmA;Ggm;8sm_x67Y$JJLH zPNLMuy}+~P<1fkQee}D1jL-CZU--BFtOqXb9LL4Y5%(9v@zHx7pM5(1iT+lTx6k;2 zmjCdomj6Q1p9Wm`$LEOWi2v+CrC(3_w-N6>HXJ8EAphh3S?LEzzxV%B{{B*8;zt9Q ze!S*#rC&?@bcgeg)W<8y=f8fT^hfc#%ZRU{-OToPUnc)wQ*SZ<`0t26K9WDr{Gpbo zmwxT%kpD@<|6@YmJ3{R1%@05w}eUFys>|ZIpo!8g| zT*|Y0r{Y^kzk~QbQQm-e0+)7<&!K;c^l#;Qgkrd#2T32>SC9U&^6{6=lm2|*Ql1*^ zpQgWkocNJn-qTTDLi%5jPi%L3!oAAp8`OITNZ$us${*WlUqSjed|vrmyWI#pOD=tx z^xa&?tsfsEe}Bm@-+R!1>U&%AT>zK*{_%_YUMuGtNPimV?_uQg9!JkVQXe;y&yn?z z&v%J$o>KgFKJz#KrSGl2fcPHz#UaGM@ed)NB5-N9Ez9XJX}6mPw46`3^53WUd3Py(E%|H)o>k5> zflIw&JHxf)a|-i!okl)iB>t3Wem(JieeapvM{FVeGU6ZH8n)*);PT%4yS066-M^an z;}2GR8TovPc)Y&+inzZ_ob*e6s{CWQIz;@31?AsM`g?%y&)?G@PyO$XjziM`fA0n^ zuN$UBIOuyJ`1ZN&NT3U%W;6Jf3`>{xhL({V4#K z^2BitC*{!B9KKJ-Q$DNwZzIcV$S02LSp9S5ALkD|7r2!F6SpWI)34r1{JF1F+~oFW ziC=k!;*)&uuZh2q^X@F-NBmEAea{9i^^M~k-ay=6C{8}t68G265`P93KH)QYwD#jP z@pFJny-xdxmUDpkhlsEFScu<6KA+x0`IsI1*Tnsm=;X7{FZI1was7QV@gsrDd#_rn z{L92gfoIL%Inp1`eZA5DGx3clYI!c<`1w5Xw{bn)LH-@T((*j?G^IEB(+^zAvz`5D z{qpw?w}+F@i%I{}VdZlHzq*z9*QiIGLj3=T*SY_)c7EQk)&9^)`-9c}IN8%MxevcA1DEnYaF({`XNX@3+|8G3w49$J{!!u;+S3jr{xkBq_}H*tp79&y zzuyJQ=P~+q$FabLf1E#X+R>9~>f>V4$N6DyBLCAr9=`Vn#6Nnx;!?%gs?bnvS@$d(f|2IFU zbl}oHS2UDQAMvY5zyIqMe~9=eh=1>9n}P4o-_sx8B>hi*sC#SyDgIp2uOr?|{lVJp zUf_qOU&!BoL;ADcu6&+N{D9wUdp@J0<(VOV9B^sRIF9S3q#t1ZftQf}Y|_VhWv?Lp zm2X!5w~_uf;z#j(leOm$fM?Ce-;jSCr}XSUX!%cJJjnq0uLmyWAF6A8O<%gq;Ur3Z zTnGHn)Zg~&=Ny0gEBQR=kIMgJ)Hjy!s}qTDr2WC>`y_Cg7jL;k+u>EDzk>K0j>9tX zyU6F|v;!Fb&Ht->-oSId8%W;(F7(G) zti9_a#INVPyPNf@VS-CL#CDi>5s&Q^Px`ac$9}Ypz@@)#puYoZq5IhmJZpSj06c5H zf0%s6skgt1e7*@>%6TB|dj}KWvttj3_b%7=w|Vgv;8u5%x{v!w|I=%g-sHmtdnlhc z4)#XiS$zKFaKw*szc#>^9D;$7MZdz~$UD^3{wkCH9N?`ZFP z?Xps-T9dCjN}Gq4mr4`Uv!&4;JJxm;P^8Lud3Lf{nyihUQJSeuR!4Uhg{-$!nrSpA zmsfUFMrWJV+H}`kVQqJ#a%P)vXUg^bZTB))FjXI4M+=`a2NE=R0*0xv1ZY|)JU^l zo#yk>57I#`M60TkEFF5pktDAWM*4dDZn$0>tyIP~)>5^y?^s`uOkj{iHQrVkJ)=^` zQ}yNw{oN6C_wc1BmFol5X^h>$F$}coc(qdRM^o=?R2$04Dv%JOIvZ;}1MExd2l!A8P7tX6^#VR-9zRx)j|grX3BoqRD;Y0m$2mp<*si0iZB#*yKAb*kE| z&Q&(qm@GFM=-ru0y}45ftk2Qe zL$$HW%Gs%z)s5P8swDQB6h*Pw7^#mYG~HbsInvbSdZSX;PA~45sbhLtX$sbIgHniO zkazRx!N!1yGB-7*Fp6CXyKQ=e-+3Y(-aS?V4DV`r>ttnRWpuJ!FH1|uQ zPW-?cOr#X070`!#+FDvU>4<^an6`DdwKW;p(=xWuYUQbP@oezg08G8tAlE#; z;)bRO2OIsMBKe9$f>(!a2J=Q-qwra9WVP^#mNwkb%r-T$qO|)#*bs^P; zN^`dEW>o+5bPdwo#z&X6bVxrqrti%DR_iOW-X^gP1s#J{!Bo2_J0sgPGlsPym(0cq zN3X)go9X**cN?sF^b(x3=#g>=*zNz(XP}9owoe4A7Wzit($D%ngE&UzS z+3-+aCbdRDU4~T6RJ}HiY?_9Ml_{XZ!*q+(7xHC#k+3FY1Enab1^Hze6UVb3theVA zHjoy^-lT2Zj)KkCsv>lSf)R>}s4I8kT|ebQqQQDtB;Q*hnP@QSQEU}t^H|4oM`Y8M z-$Da20&PMYnZ9u=<$6HTZ5(Wj_(HZU-6pVGC}qMZwf0FaVWKr@>5Ne4O|pxMwpa1j zx_|1nr8ap^bn@yPG$98iW6bwRiqvm0U4v`EZNP?tDHdNwrNy$=h^ee}%BvsS{Ox(9 zHa2sJ>@ioyr6xRci1l^SBave2rL(b13T%irg3Y?*d%sj**O{P7ZN&*!C|l_{N^KN| zMDkaKQ{C8boTep>JSREQs|^B& zhqBRYWuf{6BHxf~msHWz@F9%SyUHvA6e6+7*w8`cJcko1(<9BXwbiYzhrFcLkr8hI zLmC~@nKWKdL_0qeIiCO4nXQx~v$muqDp0u7bTc$8R8Vl+a8g9rU=0c$(O4TPA6JBE z6nn*9*<_LU>7!hrF$_-4)auQ6G;QHAjkSjJnN zebuxZa&feLUYffhd-YLg+bT2(iye#WLd1oBHy-_N6%PUZOoLLquVNV zM`G1PqqS0KHzyOQQl8Es@_LghfNLw$6U}YfN+vP&o0a8eISXG`K7+#7#>u+!G_25L z`q;^Jm;>E&es2Kruivc_J+FEewNtOU4o=V2&ZtCRTAz!>vROX~`zdU@@vO2o0hj)^ zI9W+{iPjV#IH6vH_!wJTqlL$M8dA01@}tX5NnvgQd%^kG-@QW2); z;v8mu6+g+7-u~&ocO6;iohXfRyvu;qvF^vHKsJsYeIia%--yH$0eNC=5>5c6v$2`x zV00TQla(?IwJZURp+jiDxe7tuE)@+&_E_6Eo4#Z5U zG(0!bQ!2t~RvhUr;aB{Vewv?AHlLo-s!c~v6#@x$XnUviZ+CAGoLDYf`{{x0$;Ky9xJS9i+U=o-U|Qb-Z>}FvTJE=le}_a ztM_VNWd4Xkm{{%SLlY!PnLm9UOm%rdA6rnTUa`# z-t0lx@yjsMx_){%6UllscOrR$#SP~^o7rxifbXDejG$rCJzwaau55SiZLCPOdiEIK z#hJW|^S`^a4r&_Yc@0IX6o(;t7BiFzeeQV;IMA`NsG*3R;<^%Cq>W0c+(azIm@9#d zr^U9KwKm2^FRN2Ss7Ae9Z8ipTJG)ruOx1n^76RV_3!Sserph}?>3NGOvv4859QDUk zDQ%od#)T6ABTd=Q%}zVNty2v}pVo$+E@2hOTn46O>DVX>?8eU022^_^6sN^VAQXOG z35qpBMObci zz||h==B^B;U{nm_-L4K85xb{v7b>WsT8)(a@Y=A(8bK7`oRN{!EK`0^NOLT5jx6(C zDc!KB?u4!x$`395>pDW-KcYM;Vl zZ_}exE)}vXC}Ir*ba`c3qF74R@xfCX2>Ws-)kbM+wYj~DC6s)GWN>3?uDEorJUJ_i z`cmwko3P;)NBT4(*=tD$3N|)pg+}2J(1$*l-B-N%$<ptkx9 z8auOlTx+LBImT<$@G^v}jZyl~uH5bJcLY|C{+x_PJ%R$EwH8`ug-*alVXx#F@ae@7c{ z?ph85`doFa0x#F>B;qAB4AzVf!>fi|WM{9s_AyLL-Nos-qL_M|DFC(``Q2^*-LDUu z=_auUIi55H>=w3#&XvVg{hQWqEUg%LxJ4`!MrZ5RLSVMG&?!+d+Jf3%u947K)^3gp zqsW;}65`O1QqZVbH_}Qntk(9Grd+plVD>XU+3c!_Bwn?le_auxW2F$6P8ix$DxOI2 z#FZN)I=N9R!5%$^D@s?Myrf0%|aR7LV%^L?r7VQ|V z%t(}08rQllbuqYD!$o`TD6M?yQ2)BY6?omobt|ki9JA|Jtr~$i+}J;`w&>|DrT9{VsY7Md8RyyMk&sv-?^l#fY)w3 zNo!x|>Tm3vmOx1HDyb&ZH(sl6FW1KgH`shxdXf{)8`cbABp14DunbO**NVmBdaQp= zPpem^YI7pm8KpEhvdn}zUfE`w6q`_slq}u7ZikxV>@>%vwGpb_!iZa~?movTar}%} z3!jj7Y8t1skbt>oo^g%3FSc*WBeLG~lv+EcYneD9OVY$iX}v=gJ>bd~^?{6|KKEQ0 zO#ml@^Qh%NhQR|vdRhrsgGTTcAau7VXd)gl@Y6jgv%glKf--DN>7eS5P91i(zfb^} zt)RQ$D`?}$EV^p>%`a?Er+YNRm1}-D3y{s{;g%0;&p~ZX6Kkj<9&8=r&Mp=YtzLx4 zBJiV#U8nm#YxLOyxyE&x<{>K@p|uGjQ!H+8Fy!opEu1Rep7}|6r_7l(<$mov3iw zld4F%2(=nCfZ>pLs+FrGFfY zWi_Nc3dTkhRawYyU5t$!WjSMrEK*f=UXkwQ88Rn{@<~Ea^2;c%4Q)`nx%>KByH7?o z6pfZA38MB5VAZ?!M z)n?D~Am=}&12e4JG8<^cA`6e!mo?xKu=Hevg`};FL`3NiP)hpGyti-Q2|OCtGMATqSyKXf~S@ zMMI1?U1|?jiAonaBRbH^E>^_it(mHXf;X%6u-OHjO$(DXkbvY5E$;Y?rcD>hJ|S z4>rE#DiZ2`NhGPQB1_!>V>_A><*ZftCBjsOHDnBjNyVcj%bwVFvW+TB(KFQi)uW)P_c7s^^v&O<5Xs8=C<>>Z7TbTZG;*T++aN1Ld)t53%Idci^mP_` zrx0+ZI=_0{hKJ{5ICpnC%~r$RY*MD>1_o+Xl-sh1fzHOxsjan18F2$koi%_?uk;RM z8BQU(K6D*Hbwt+{%yyh7&ToB6Ju2?=Y9d4F*N)B&M>{?l2drN>4pPDJoUlW&c7gG? zLG^hj2)JFEZ&aqOE;V<22SpHp6{<3+nU~=USF2{Y?D$|smbXiVskUlZx%}2mExbVq zu)k8bHr6EsG&KiTZ^(#mgk~}~&klT8_UjUmBi;pBU%OOQ)M5_0kkt_j@ysu0cb6NJ zKB_p0o3{hmy1b@)zfc%#Y{Kbn7~gOlUV7e}n9|!jwJ^<0=9{h1NIBLNx5pAEF?L+b zO3)9Ty}oVl`fisB$&gwDl~sm>8&qP}j0HEoL^PX5HIFeCu`xJ2SA@?dc?yeQcZvG} zVdq8|bp^VrI*Uc@zPzg{9^dMva@(kuv7a(6=%!t?7PX^pt<@yOK;B3ip+8(~nd%hx zHBN2rA3ebuy3;6K!l=W%Vd$oES&Wm`h`!$_T;~%8u97QFfG|C`3R_@a7^a6%#IRT6;bNKs>O5s#+NIN!3SDwU zfg-A)1{og^nb*)FC8GI`(PMcP+)U@*M5~=hgRV9#RX)ZG8Ul&N@*jex*e+TiZW9+M z&}BaBL~lrBD;gh-)#YY9rf4rW`$4cx%oT=nZxh%6X)zU;^3~{Gnr)6R^YcE4phbPU6CEKr-UY3RI!j)^c>Amo6H*kv+I<@#)1r5(|%{T0)@kgvQLPHe*SS z3Wd4x(l{iaoLOlZKRuF6C^T)MMd4Gx;-QjW*M`t-)n?dccA>;L%-@CG>IK5=(=*a$ z5wgS33wvwZ2IGR5sWz)*a=n=4Z+>;$C}XO^WD z!cnbMu_j{HjC{tJd5M>|wawf4bi2)vD{bJ`vwWj+i|A_5W}38Tq{o^|Q* z6K+7$>9L$5Qs{)FSv6TJV`U7q@su)-;2t@vqkC<&zw35I*WSS4y|UA7RkGZboI8~D zIuu}C*<^_b2J6FfvM)y~U^+sM!Kqf;j!3F84JQqp?ymD)v08K}>B$x;AblHH2CPRT z%Ygd5oM}Mg2*LwTQn;>eXZCA7-IYH$%-aTOkl};&6QElaOl_JRAASByAOs^J*3t@Q z9rLnIS`huRUL}tXfY23g3QXFVo+zwsoMnk4CeEdlUj+_UzfYDkeHuui0}eIpuFv8O z74qdd*^jcrUemg**oB1ME-&QcfUlNG-svnO*qBU)S# z67F<02v_lMa;*-R6ZK5wkMh9C2iqdup(!J8&PnffEK}=$_Dbwb;&L>lG=pQ6P~M9Mq2%h z&fYxov$6;^5ZXCns$uSiAVE`eJj0&nHWpE|hln-|c+s4lpSO(Q?9O7A`UX395!)u{ z#^^jT+2K8il8g8iblvwm9@B4hrxgt_C(uculdx|9b}>0E-J)>BL5QJQ7ZRI?+ueQ> zb)Io&-DSyibGE&Hy(d)9m>Qa{kLgdn?14Wlu2JH*myf(U5=j=3s4$qLy;P9Gl97ASL zLHbmNVTPiS2bOK^)D#%Hgr-f*jGRgZEnr5u)>kSU1gSU;?iCUZAo-JOBMdv6Z3Y)jDjTc1l(;Ub0^B`R z*&c7)c4dU1Xf)r3ugtGWI-G1bORy}14W^V>Ya&aBR~_9p`OzyzqQ+2Xb>p;kA@b(J z$Ox!OQwxQawOO2yP$QsQaaEfSS8&-7w(AEc#B^5l4K|8XGZGUlgV)*v+G9rKTUV?R zAxfw)DEh<(_+J?Nwz0%>EIBsfHY&G{Q!SS>Fi5mjdUiu=3F7BAtZ_OS$G0|7>-Zk? z(=vBoYK^Ts!nA*?XZ`g0HLh`7UzJjkmGjB?eEX1?pq7i`LTS+{7S%EAn94inU$7{` zRO89m2IhCXYy@mus&VPM3yHQMC>Mo}-{cO)$!$dF$Y$4xywquvthLSt)vidHj8VAY zJ%p~MC%CP%x;=CDq}GV}EyoyTBTP2IhU7nrS|@W~ZF7E(LuHCiFjFm8ixxN1X4hKG zJK}whnGu75t|uJ~O7&u-Zf0sB&ZdPWk$%WoI48QhRE9+L%_|FRB=nTHEmiv1xvt+` zokbi{nvo-6spZt`Sb>irNGhGzQsu2UFcc}8=~*1t8;6NZRT2N6lecPC(XMIrW?{kA zAcgc96AVOobmIu8`%=1N~V)nLvH~L7lb7CEB`?Z z)YcHzrK94^aK)!-F=RY{RFoell2plYDNw>-^rwktSuEgKqynr zEkoLs$qMfehVhjMbro*{L*XE@(!PXPvbSn;p})hVNb6M?j;jkilCASH3p~oHkyFET zz=!5JqU%o+WjpS&K6I!G2JI!<)+JXL!~yH{AtTV&R|2ssv_fE z#a$=Y%QF@+KZtE499R$g6htpJ@0%v)WDk$Qr5ioh7U}SsSk_q`X>(!VBIk6JGarV& zW+51Qey`aw>cSRA3q-bDv1!U#!Hf~C`J-A&p7aNVgb(3Lto=56-q1f>I;nr{CX5(x=~e?(mhep{6V0imFi=~B?TLJF zw>lKuOwW7RP2X+hh8&G{SGh1gaNdz10fnLA`e^7R zX1SNKtwso~9}1+9G@OsCSO-PG_bFqU3Zjhe6&+uH-;+ z{=BzMqBFGH34OIO*$I8;-5;-45XxbujHtomF12Zwjv1#X6J4h_dwD^cV=HRaOu`*S zN|45{w-J?L@Qd<=bm3mb4LH!=?e?rG!ypD3G6zlLOcyR^gno~^`6SL{tGI`e85w!4 z;o>u^cG?GqV%zanAxNZsULhez!sDTg*6g0DP7h9@bTFYK5SX|W`<6@3@DA7TS2&b8*xDLRYW?skIn6p@$T>FRVlxD9Wrh`TosK0|~_ z>&jN7M+|~ki=4uWxzO|m+hjq_3VqdiEiRLhk{ZKWb_DUjvkrA?kQj$s@@$%va#oi< zUK`4DfU44~O(PBm^;i2ysZj240>Dq-e#|q@FEMvzT(puu3}A1NeJ=tlkdtErsSresRA-XZLZ$84f@0?&(GJMFJ6hg}6dc?k`J`q;NYMd;l}OKlqvX1M z@?Ro~uvl6@vf9Z!wWav|;3DS;)KFL_Q}Lh9pfCAzRlSI80n4QeG@-m~za`d$9kUp1 zG6?b-hM1E8FK@O@`!vPUmKGi1=GLSmRW6RPLTuXVJ^|J~^q%rstg+AOTaqaicMl_` zE6X~PwU>r$TaYyf^_y=^NDZgO7CtL0OvY|6C7v>qNhF$`a|`B8f7IEV2MQW?rbe`t zXt?}oh7Mlf3lcK7M|4M|u-bZy+MMM2VsJZi$XTaqlxKERHWsy&0_8TANH zTp|-IbQcR`lejY%{@LSZxUD94B@=o_&9h2cx7Vl{}$~bP*6Rvpi34)(+Bz;Mz+9G3NsmOLVaS2gB)Dw zJn@UN7Q5BLqBxIRYgC3wNU%GBu0PVYZ1NV>kX98FZPB#Mt_hfJeMPQAgE z37+T>m18Zb`-$@(YqMNL`kfs^O~+)Rj#MGhqv6d86A zJ_|0|b+KaErE{0XWH=+Dp0R2!AkPPRwrNRMR~0WUi%z&+qPxE(7<}vHQTC6i`+Jr}2jdGcy;i$wNQAxX5@OeBZqlGxpSC9(0GG?=M zr?h`)cxySEh4x8oG%2eVqz zx``uiAXaedHjGXiY$OJch0G5Zi0oSUd7@ri=x_hxGO6*~}=qN%BVJw`pr08g!^!*c4gcl6mc{wx%xN7(CASbjv@9 z5l15g2?|^0dz*r|1r`58UbQ$LBwShXl9UVmkza1wdFXL)%6sV3hZ19<#nV+bL{zy! z&UFkD7}#;zDkW8Nr7;pnyX}t&_Wan4bl}SZ_mv3rS=7GL;x-~#=VCYtng@GV(e$q67z7fY(!)yUBfDJcNHNW-)Eafm zQE1tXweXfcbUL#eCv1JJxLXC+j7|-&3by|vJs=69HKBM8<3G1r ztN7qHd~|LXwnrM|(O%-EmJWv2MXhF8(i?eQ7H)<#-aR9S1KI;(0kf5f*y+X_k*;&$ zB1n}`*H|QX|D_(ScXB7^-UpGf^DLOVSsX0bO4H8TxYZvglVDvyncx?^bg}H@YaCcD0fe;JQ{6Yf&UU=;<}x&0M_}*%UdXPzpa@ zb0>tiN2wVViPCYL0q>pO9>f>`(NG{&SaKS^^%_{|W#*S|$!&`8=r*f6)f(zbP8iZt zn3_hBQuN5rpj4!Q)1_Oi*t@w1Sq2DN9}>f(vx{p4N_rv3>E=*gBhp5)6^p)u+v_A- zvFm-k|jWF$H{%pvirER(7WJ|@3^Xua?kBx94qb5p6% zjV0obgG7mPb%=7E4&)(GFWAeCe?bnpXkfHN;CEqRR|j2d(%hag*@4U84~#UC>}hk1 zGSISHwn90QMQY=;>_V5ww2kG72|0H)zm1KB)ZU1>rS+|0kV_DQkc5AE zg)Z;4ZZ={al^cOHJDRjIGYmPcFIfF_frMV@4zHNrfx=1WaCe$Mvy}JRym6npG1oP{ zH?FkSKaex>cDeM*a$FC-d>((jE~6-Fc7iOar>Is1aRv=*T+c!d96a3Zs#J3nJLK-x zYj2RYv^t4f_NJ+lPu6fnoZj_>i_5UCp}6MT&KX3hQ+2xZZml9yf3qYf6?@%HOPb|U zN3PR|lA(l^&<&PR?gg^%M|rpnV3Am=-0KF$g3Z+L{G*e2X)182rPDY;@ybBYR`1PDoLZmxYn6y_%N6` z)<;D15@SF@CYog^1;j$wd%|RGEA2j(SUlXrIkl%v1L;W&7<6?z;ZtnpKf={NZJ1q- z=QTl=4_I(*ni{ld+!nhurrmB$OS|BGcFKvO(}h#7e{9ThLfTSCb8IiuYT$xHoWgRW z8;g5d@?){kW9_L*N1LL!m(91%QOZI@PJE6TTEo!LiRC@NkHS2&!f`b&I!p&KK=dwl zydx9~nMEaWlUy3uz>*A+gAA!@T~|kcp{HJXd1X{Ghr$e38H-X@yI3$gQ-CR+tfpeV zuUJeQBO)@zVw!7A1K(|TOEs1PzBVb&IX6L6sY0$Bv z>xejg7`HUzX|pxqLSlXFBcFEuswj5NR8wWtVCK^BNk)A5sK6H6#}1Bv-FB|GAA7;dud z=xCB>UlkoUp(KbxRarMV5}QsQ&0l0;3-j{X;oo?Pur`9caPIB#@kwm+y;h|+%~F{U z?Lgj`h7^FN*o%qFdBhUIjoYux*5l4=$i#)7)|+Y7MF4qlkWqtY(p%tE6T7j%ah+JH zliyrUCbtccLxgdalA$myx9r(WM%fmt-#@I=3PqW-?R2{0$V+5N3G(2if}MRz^wb#3 z?c>xz2W>}g&*nFW+O9)wxWV2-T3CGhJa)D5q;zmhdXFPLuQNA_aJH22@$P;%_emR1 z6qP{Rw5lBr5hAVk!7O%gxUiAD>_VY2BN14k`GV^s3m2YA=yB16bmT3zY&hPG?0D72 z3~axl>xBohU2l2iFu1P*V>TrKvTv(U_ir-M#A@cIeW_V5SDTGN2p_EfvJ=9dW~9`> z1rDRlQf=BTIHFA{2UiS6X3RfSTY{>Rpsl1`+n#jD%A2P;3MScZwY+3p2m}p5%mW!$ zT|28u1IH9oDLm+?(Or9n>Xfe#v@{dvK;Ui?b)jBGN=_Vf6|Yr3yU=oC0R@5OM6I3S z_^s}6nQ|x>f&eUqt&h%k z=aS#F#Ygp=#p0148q{$@5BXe@alc118D7_WC-5{+*|E-Q=ujg zb+>&?n?FHqgV1&oKB^_Z_NhfQC5_>|DUH>9G(i-031y}aM$F1Y9cL{^CEHecx;ePj zd5vV@PJ2ItB$}-%H^`YYO4alJMx#10Jyn@*CW?A~;TeW!-S1r(Nje6n48b2?9u7?J zcx{yILOfxO>U{YwoLp9uj+3!|nj%8I0@ot4JI=|`M({_&M#A@zA77%{%8BxD{q(C= z=8aN|bcaeyTbx$Ai%-?BuKFPNIkF;R4MC z8tR%!d*(Hx6aMp=9|Aovv@;|@OD!i8!l0#*W;c=`g}G}QO`O_D!r9fF!MsJ@f|i&J z?6&3ny7Z`@AXbdwUknswr}*Y`nKyYt-a3$YVAD&~E6(pESf)tS)rPUpWfDnrbS@a^_%d6Lx{BA6@4bt zFoF)xG+^%Lrpwwi1ya8VsV^#SaZb*Y5BuZ&Zs|f0-*m|(VU|GCIJl325rLsLe+Dv1 zKAj^g7-W@4KQ<}v_Iei16+u;NO-`}R9fZ$T?%cwyamebkz|l0!uw=RM>X~+|EilO} z&rWd0NgwJNBE8(97JjWD%XsZdZpyk6d}}_NJ#}1iM=kvFhe-X(M6C|zH|-N4r?%E`h5k6C64B{(na%xrL>`RZMNC%DICsr6W=NgtbzRsOwyU-%Ol;#P;$LV)^YX8DK6N$juL8V(+1=y585)rXtrjh?KbnkXQC zTZRj}B_5<+uFE}ji`RQ)Jqhk8%Q8i4SBR#@t6dhfD|Ryw)liKnJPfrMLHfw++K~ZS z*KUp19xS)sXPiFwKR7*Jg9asitWKxEw1+?DH4vzA-N{-zv7%E3+CDGgY_CpnEYSQ4 z*I2ZgSO-|hpDVH(lrDlpx5eRhUAk^qk1|=*ytBNb-&41==MP;bn$e|QeQ@e{(~;y( zf&C@7R&aGU^iE#cRN0;iZDOPK;a|ETXMcv)xNA3<&4&6;thX-2LMg&{@pIb_z63rX zH6&R2sqidBdmAjpge|bi4$Tlw_>t!B$Q1@1LIcLq!PVZfla6^xpZP*U80Hpds6?_Q za*+U!o-E1Mw~}?SB@HZ{z8W3a{(9V&E5LeWW2+k~wcT>1SznivdS#agcOF4R|3t=4 zOs_o&P6|N|$Qym;YxaEL(`=!ET*{LePE{(8o;h2s=WN;R)+2Ar#lq{OA&2K&i=@<* zNJ)(xHI|PE8WSQ_bR$@sML^1Usa~F*z*cbzcPx*d6}r(nMP?Qxr*H|{I#juZ95jg( zRj(_wS|Zw%9to7}%zWQ?t-ifnACnxWsg(mN_Ye+5g)tXcK-ye;)0axB6Y3``o{(qy@XESL>;>uRlm6Pt}nk0kRDg&;k2(L1SqDdwte38T9iH)Pqo zi@2<@(_hw@XWY}V$e`J-RMae$kMv=^%Cccvkn4vRSEa0(P^X)w$tFjhOdKjl6sS%k1nDyaKIGZ4*Tn%;O{HbQAGf}guDtL(n&t7g7L9J;>bR(Mp8sL;~Xn|4v4w|Do>2KOpy7w2B!8uZ$c41?KHbwON z9ISEasi4}Aty9tAH=M?E4wH6QFFk#k+Pobu8nA9#6IcP_Wfj-@`s-+95wJu8g&<^K_Lzxhk7qYB2H?VN zGcM`^c~`fYVnuze+Iqj+@5fO$}G3*6@7${3kR0y zN$g${%`s2kL-Kivd<`t=P7!HB$*jrAtHN?D9<|B2ik;7f31hO|IEc<~LlinQBK8O+ z*z`xYg@(ioDdoFCt>-QbNA&AQUKq)pjv~5)aPWnixP4z_D%>fnd|qE*{^yE%8GQKkg}+3^A<`6wi3Syz&?%&SV; zJh6>UEo`NU9XsF|s3ZRXGAT88mgYL6;iCIImj-iX-VvI-buMr!vtj8P4~==U;v}ao z-HKy&;S7cF#M&g{t*8#_{!Mm`)228k2}$yM-t-9-OXr#i5c!I9H|Ne(dvRj(xcSo%iGI+V1QXRulZcZVjG8Q!(#FH(HxcV)l z*~GIh0$0neqG2#eM4)5dO+Zf6JiEjKh8yK1?K@dJwl=j*=~`Ltzg*dh6~%n~58oDy zIQ^x#Ow8GW&1$Xl-w8xs)s|lip7v%lyW>FWipYNi^VgjCXkr>mI3l|>_$109n5gT{ z%9?b{VgvYbC=A=YFsxqvO6)sHH#@(IH{tjKxU(M5zgxzAM|Blx1;!-?M!iE?_rhE5l<;n|9<_HsK(` zKo3%B+h$1i{4vr8@hV!OQ=K%vG|%R4MNdtqXdk_swY)4_;WEEh#>tn^@a7Zg7E}|$ zWu9nNXwy~v$dZv(vZ9h>hlcRGb)~=x(7OKZ<_cznOUghKUtX(aK=%x(IUO$weunGO z&#oXr%$T&pc(qdR${!16PBKNNWgzE0>ZYlS-i#75w%O*!r5F8O<882S(GDDP_m!@# zO=MaHyEQvpdkL0TVoVveK&m{=^6|)UXWT}&PK?k*n4D5e4EmfR&@!?T=jPc4^im_U zt!3@=3#s5O7--Y(^qhT#ZiW`q{?W|Be8GUq=_S=VljY@6oEO;pqz^VCdGU$zkJnSh z#{!WHWNvDnbAf{!ai|=}|0bXdR_Ytqt(dG$Bi*eg!cvF|M9(8Gv)n9U zckB#zB4ScooYqJo5Wtv(r8LahX~y|!q6d2eYrA>0Wh^tPk)67zQ*9dVh;QrCkQyC*X$zFQ&6F+0Ams4MIh8YLE@lSN zMLf}syiq77RMC~O+G9H_TXOLwvkSPSV@Hwpq~{M9RBy2wpIBE%b>-MFmEo(Pm(?3Q zbf&m)A-UPaHZ3}$+?U=Rmf^nIWv^I<)5|5ag~&$2T%R`xQ&F-8%{vs)Ctk;)ZNo3r4+<46?FHpdRXyr)WVCCH{DD~Lm29%AscTrh zoR&rVFi0)9;eZ?Jd~O-DHb>3x#%K=wGMbw`(6ck9Xx^(E&HC8vOkk-+9n`+D7Lku9 zRqM^!^5i-=eQ~BS!waeh8ZFX1!;od3&AbvM3Qw-HkVDTWjY#|7m^yo0Zpz@<Xq5sgJjt{W>gYd8{!V;hya^Oiap z=Ur8zc+Gz`a_fzoxcdTG@!UpOrHd}GQ6BiV6^WdWu`(wWa@n3`tC?(MA7kgw1rm)rUfF_fNmUyy&EB)4->uH(N3Use{r;tiDWs!n zNbqz?T?1}%__Wq;j3ozRsB`K_Hytcxx{~o_x}=WFFeHLP3egj1R8Fc@$J)$}cru7K zt-6l7-?a=F-FhX3yg7bECQ4rw)~ZrExTh+2e5&T*1P``{%;q9Jn65t5@OIu$kaw%0 zKFf-i%D7~+4id@xrRGb}W!f?N#-FZp&efS&#EQe-C#fz91oJ#m7{G*DeXXYKC8&5~0y&7Ha}$hYst^HD7Tv92qOOI#07V zp3?np>Z2ETbsXn}0NG%2l0XJgGNjtbrk08P$d4jfO`M@OH!LZ&_&kcmk#oRkJa>hx zhFcBVk^Qumfo_Xax(}m1NQRA|))|Cr%b;s%)@Y%XHb_Uo%HNN8zCxc~tEF`D@Rs5@ zbuGi7BggEz-A-LsjLdDaTPM5^E0qON6q@KVu}G^a=nahChtX#6W=(Cc3>S+Fo!q;* z}t{}LuO`F#yYJe+jI}T z2!VDk1YPIQVkM;Lr|HqelTtcPGu^LloVxiM2H=Z!m*#}>(3qpjT9(_SjbXQMvbt4v z;f$Qsr7TD$A1`RNdfvG2Sb~dyo8_(eY}WO2oBcLjYgU#_OwTUyGj558w$9=fu_LQv z9gbjIxv{Nd$=J?mFw@UwUB8(_AQMis1%H(A9U|Pz@&JFEnQV3}k${qpCHQs8M2){R zDx)1sTt2=f5{nJ$+8DHgjwO|CrEy%)gzP3`;AVf}HKU_EU|m9Oa384Ss@c0b91r_l z_((Cp(iOQpRmHpTW+?#>_nNJZM#qxT+LQzn0;_DDoxt;QCJ4CxS;dJ@`@Ot%YrQgO ze@(&$Wxu0M?N@;%fZzVEPftkrOrv8r{X7GF{tEx?Nq*Pz7yCSvxP9zxzwmPjKGV;6!xe@(iqQCp`_k(}_bIsoWOa5Y?=RRE@u;=3Uuff+(z<>7q%-<@#ecrrP|9&h! z_P~Gk{L>Wf7{TXW_|Kj{{9OIQK39EB|F-`NkMz%}_~Xy1@=tG23i~{oFSPR8d+c)? zo_{Fy{I#3)dHeh&Unb?3a$5NbcWlQm!rS;=d8$5dpTB&*Qri3Nd8_}c`22v9b)5fd zecnE=Uy(e25PprHeO&)a9`kw&SX`|(fv zyexWt`2Y0%_IW(%?Zck4&#R*6FXi+0dFVXve_!5VV_TWE!%?yu=iSdJ{UcJ z>vhu09Ub=hB==YHzqtLb!&mYK>;I1H^?Ca|{NUtS`7M6`zXD4?fA|;ldHekMq4HGn z6Tkm6_$vMUeLvIZ?eqNelV{~O8$X7A8NZ~TpPAJ+*ypuRG)n!9-~S`P``|y;y5stH zE5-Gf>gV|~aZ*3_e*646zS|f7+4IY;(dU+3p`S))EbMRl`~$v_^4s&r^ZDcX{JHXF z>gUkZ@AB*8@V(3(d;ZoB=zDK{tA75H&s#O@z1EL!!L#Z2U;jaU?)tas=kb1G%G;9m zH$MB~;q>zz*Xwf~Y{zS#qR-j??K%5=TJ-#_cj)uCepElNwFmimX!Q3p@x1V|`p`S zR#wO4Cw~5foadjsSqJ`K9hW>Szs1jQ%6b0aEA{!kML?u};^)hJK5oC~o}iNFJwMQT z7z=yeJ|}aY|IBj_aF5&=R^ON3o Date: Thu, 26 Dec 2024 21:50:08 +0300 Subject: [PATCH 3/5] few fixes --- .../src/generated/plugin_api_Native.ts | 7 ++- .../libarkts/generated-api/src/index.ts | 13 ++---- .../generated-api/src/loadLibraries.ts | 45 +++++++++++++++++++ .../libarkts/generated-api/tsconfig.json | 2 +- 4 files changed, 55 insertions(+), 12 deletions(-) create mode 100644 arkoala-arkts/libarkts/generated-api/src/loadLibraries.ts diff --git a/arkoala-arkts/libarkts/generated-api/src/generated/plugin_api_Native.ts b/arkoala-arkts/libarkts/generated-api/src/generated/plugin_api_Native.ts index 9760d3450..3ba16041b 100644 --- a/arkoala-arkts/libarkts/generated-api/src/generated/plugin_api_Native.ts +++ b/arkoala-arkts/libarkts/generated-api/src/generated/plugin_api_Native.ts @@ -3,7 +3,6 @@ import { } from "@koalaui/common" import { - // registerNativeModule, KPointer, KInt, KBoolean, @@ -22,4 +21,8 @@ export class PLUGIN_API_NativeModule { } } -// registerNativeModule("PLUGIN_APINativeModule", PLUGIN_API_NativeModule) +import { + registerNativeModule, +} from "../loadLibraries" + +registerNativeModule("PLUGIN_APINativeModule", PLUGIN_API_NativeModule) diff --git a/arkoala-arkts/libarkts/generated-api/src/index.ts b/arkoala-arkts/libarkts/generated-api/src/index.ts index 9c74190b7..be4a2b5f4 100644 --- a/arkoala-arkts/libarkts/generated-api/src/index.ts +++ b/arkoala-arkts/libarkts/generated-api/src/index.ts @@ -2,14 +2,9 @@ import * as path from "path" import * as process from "process" import * as os from "os" -function loadLibrary(): void { - const libPath = "/home/huawei/arkcompiler_ets_frontend/arkoala-arkts/libarkts/generated-api/PLUGIN_API_NativeModule.node" - console.debug("Loading native library from " + libPath) - ;(process as any).dlopen({ exports }, libPath, (os.constants as any).dlopen.RTLD_NOW) ; //TODO fix @types/node -} - -loadLibrary() - import { Identifier } from "./generated/plugin_api"; -console.log("RUNNING MAIN") +console.log("RUNNING") + +const ident = new Identifier("abc") +console.log(ident.Name) diff --git a/arkoala-arkts/libarkts/generated-api/src/loadLibraries.ts b/arkoala-arkts/libarkts/generated-api/src/loadLibraries.ts new file mode 100644 index 000000000..be37ebb22 --- /dev/null +++ b/arkoala-arkts/libarkts/generated-api/src/loadLibraries.ts @@ -0,0 +1,45 @@ +import * as path from "path" +import * as process from "process" +import * as os from "os" + +const nativeModulesToLoad: Map = new Map() +const lateInitNativeModules: Map = new Map() + +function loadLibrary(name: string): Record { + const libPath = path.resolve(name + ".node"); // TODO lib dir, support es6 modules, etc. + console.debug("Loading native library from " + libPath) + const exports = {} + ;(process as any).dlopen({ exports }, libPath, (os.constants as any).dlopen.RTLD_NOW) ; //TODO fix @types/node + return exports +} + +export function loadLibraries(libraries: string[]) { + for (const lib of libraries) { + const modules = loadLibrary(lib) + if (!modules) continue + console.debug("Loaded native modules: " + JSON.stringify(Object.keys(modules))) + for (const moduleName of Object.keys(modules)) { + const target = nativeModulesToLoad.get(moduleName); + if (!target) { + lateInitNativeModules.set(moduleName, modules[moduleName]); + continue + } + Object.assign(target, modules[moduleName]) // TODO freeze? + nativeModulesToLoad.delete(moduleName) + } + } +} + +export function registerNativeModule(moduleName: string, target: object) { + if (nativeModulesToLoad.has(moduleName)) { + console.warn("native module '" + moduleName + "' is registered twice") + // return + } + console.debug("Register native module: " + moduleName) + if (lateInitNativeModules.has(moduleName)) { + Object.assign(target, lateInitNativeModules.get(moduleName)) + lateInitNativeModules.delete(moduleName) + } else { + nativeModulesToLoad.set(moduleName, target) + } +} diff --git a/arkoala-arkts/libarkts/generated-api/tsconfig.json b/arkoala-arkts/libarkts/generated-api/tsconfig.json index d86bc53e5..8097951b6 100644 --- a/arkoala-arkts/libarkts/generated-api/tsconfig.json +++ b/arkoala-arkts/libarkts/generated-api/tsconfig.json @@ -11,6 +11,6 @@ "module": "CommonJS" }, "include": [ - "./src/**/*.ts", + "./**/*.ts", ] } -- Gitee From 0669c8915f6913d6596043aa2eae59c46358e262 Mon Sep 17 00:00:00 2001 From: chernishevvictor Date: Thu, 26 Dec 2024 22:22:36 +0300 Subject: [PATCH 4/5] trying to run anything))0) --- .../generated-api/src/generated/plugin_api.ts | 74 +++++++++---------- .../src/generated/plugin_api_Native.ts | 31 +++++++- .../libarkts/generated-api/src/index.ts | 28 +++++-- 3 files changed, 85 insertions(+), 48 deletions(-) diff --git a/arkoala-arkts/libarkts/generated-api/src/generated/plugin_api.ts b/arkoala-arkts/libarkts/generated-api/src/generated/plugin_api.ts index f2361dd31..b9857b2be 100644 --- a/arkoala-arkts/libarkts/generated-api/src/generated/plugin_api.ts +++ b/arkoala-arkts/libarkts/generated-api/src/generated/plugin_api.ts @@ -1,37 +1,37 @@ -import { - KPointer, - KInt, - KBoolean, - KNativePointer -} from "@koalaui/interop" - -import { - PLUGIN_API_NativeModule, -} from './plugin_api_Native' - -export interface Identifier_Interface { - Name(): string - SetName(name: string): void -} - -export class Identifier implements Identifier_Interface { - peer: KPointer - - constructor(name: string) { - this.peer = PLUGIN_API_NativeModule._CreateIdentifier(name) - } - - getPeer(): KPointer { - return this.peer - } - - Name(): string { - const result = PLUGIN_API_NativeModule._IdentifierName(this.peer) - return result - } - - SetName(name: string): void { - PLUGIN_API_NativeModule._IdentifierSetName(this.peer, name) - } - -} +// import { +// KPointer, +// KInt, +// KBoolean, +// KNativePointer +// } from "@koalaui/interop" + +// import { +// PLUGIN_API_NativeModule, +// } from './plugin_api_Native' + +// export interface Identifier_Interface { +// Name(): string +// SetName(name: string): void +// } + +// export class Identifier implements Identifier_Interface { +// peer: KPointer + +// constructor(name: string) { +// this.peer = PLUGIN_API_NativeModule._CreateIdentifier(name) +// } + +// getPeer(): KPointer { +// return this.peer +// } + +// Name(): string { +// const result = PLUGIN_API_NativeModule._IdentifierName(this.peer) +// return result +// } + +// SetName(name: string): void { +// PLUGIN_API_NativeModule._IdentifierSetName(this.peer, name) +// } + +// } diff --git a/arkoala-arkts/libarkts/generated-api/src/generated/plugin_api_Native.ts b/arkoala-arkts/libarkts/generated-api/src/generated/plugin_api_Native.ts index 3ba16041b..c6bf9206a 100644 --- a/arkoala-arkts/libarkts/generated-api/src/generated/plugin_api_Native.ts +++ b/arkoala-arkts/libarkts/generated-api/src/generated/plugin_api_Native.ts @@ -10,19 +10,42 @@ import { } from "@koalaui/interop" export class PLUGIN_API_NativeModule { - static _CreateIdentifier(name: string): KPointer { + static _CreateConfig(argc: number, argv: string[]): KPointer { throw new Error("Not implemented") } - static _IdentifierName(self: KPointer): string { + static _CreateContextFromString(config: KPointer, source: String, filename: String): KPointer { throw new Error("Not implemented") } - static _IdentifierSetName(self: KPointer, name: string): void { + static _CreateIdentifier1(context: KPointer, name: String): KPointer { throw new Error("Not implemented") } + static _IdentifierName(context: KPointer, node: KPointer): KPointer { + throw new Error("Not implemented") + } + + // static _CreateIdentifier(name: string): KPointer { + // throw new Error("Not implemented") + // } + // static _IdentifierName(self: KPointer): string { + // throw new Error("Not implemented") + // } + // static _IdentifierSetName(self: KPointer, name: string): void { + // throw new Error("Not implemented") + // } } import { registerNativeModule, } from "../loadLibraries" -registerNativeModule("PLUGIN_APINativeModule", PLUGIN_API_NativeModule) +registerNativeModule("PLUGIN_API_NativeModule", PLUGIN_API_NativeModule) + + +export interface NativeModule { + _CreateConfig(argc: number, argv: string[]): KPointer + _CreateContextFromString(config: KPointer, source: String, filename: String): KPointer + _CreateIdentifier1(context: KPointer, name: String): KPointer + _IdentifierName(context: KPointer, node: KPointer): KPointer +} + +export const nativeModule: NativeModule = require("/home/huawei/arkcompiler_ets_frontend/arkoala-arkts/libarkts/generated-api/PLUGIN_API_NativeModule.node") diff --git a/arkoala-arkts/libarkts/generated-api/src/index.ts b/arkoala-arkts/libarkts/generated-api/src/index.ts index be4a2b5f4..86d361e81 100644 --- a/arkoala-arkts/libarkts/generated-api/src/index.ts +++ b/arkoala-arkts/libarkts/generated-api/src/index.ts @@ -1,10 +1,24 @@ -import * as path from "path" -import * as process from "process" -import * as os from "os" +console.log("RUNNING") -import { Identifier } from "./generated/plugin_api"; +// import { PLUGIN_API_NativeModule } from "./generated/plugin_api_Native"; +import { nativeModule as PLUGIN_API_NativeModule } from "./generated/plugin_api_Native"; -console.log("RUNNING") +const config = PLUGIN_API_NativeModule._CreateConfig( + 4, + [ + "", + "--arktsconfig", + // path to config + "/home/huawei/arkcompiler_ets_frontend/arkoala-arkts/libarkts/arktsconfig.json", + // path to source + "/home/huawei/arkcompiler_ets_frontend/arkoala-arkts/libarkts/input/main.sts" + ] +) + +// const context = PLUGIN_API_NativeModule._CreateContextFromString(config, "", "../input/main.sts") + +// // import { Identifier } from "./generated/plugin_api"; + +// const ident = PLUGIN_API_NativeModule._CreateIdentifier1(context, "ABC") -const ident = new Identifier("abc") -console.log(ident.Name) +// console.log(PLUGIN_API_NativeModule._IdentifierName(context, ident)) -- Gitee From 76cda701c5c2d1e4ddfa62c08d92455fe2a98cc4 Mon Sep 17 00:00:00 2001 From: chernishevvictor Date: Thu, 26 Dec 2024 22:34:13 +0300 Subject: [PATCH 5/5] I need help :3 --- .../src/generated/plugin_api_Native.ts | 2 +- .../libarkts/native/src/es2panda_lib.cc | 1474 ----------------- arkoala-arkts/libarkts/package.json | 3 +- 3 files changed, 3 insertions(+), 1476 deletions(-) diff --git a/arkoala-arkts/libarkts/generated-api/src/generated/plugin_api_Native.ts b/arkoala-arkts/libarkts/generated-api/src/generated/plugin_api_Native.ts index c6bf9206a..3038f8c0a 100644 --- a/arkoala-arkts/libarkts/generated-api/src/generated/plugin_api_Native.ts +++ b/arkoala-arkts/libarkts/generated-api/src/generated/plugin_api_Native.ts @@ -48,4 +48,4 @@ export interface NativeModule { _IdentifierName(context: KPointer, node: KPointer): KPointer } -export const nativeModule: NativeModule = require("/home/huawei/arkcompiler_ets_frontend/arkoala-arkts/libarkts/generated-api/PLUGIN_API_NativeModule.node") +export const nativeModule: NativeModule = require("/home/huawei/arkcompiler_ets_frontend/arkoala-arkts/libarkts/native/build/es2panda.node") diff --git a/arkoala-arkts/libarkts/native/src/es2panda_lib.cc b/arkoala-arkts/libarkts/native/src/es2panda_lib.cc index d1d376c2e..d070124f2 100644 --- a/arkoala-arkts/libarkts/native/src/es2panda_lib.cc +++ b/arkoala-arkts/libarkts/native/src/es2panda_lib.cc @@ -150,32 +150,6 @@ KNativePointer impl_ContextProgram(KNativePointer contextPtr) { } KOALA_INTEROP_1(ContextProgram, KNativePointer, KNativePointer) -KBoolean impl_CheckerStartChecker(KNativePointer contextPtr) { - auto context = reinterpret_cast(contextPtr); - return GetImpl()->CheckerStartChecker(context); -} -KOALA_INTEROP_1(CheckerStartChecker, KBoolean, KNativePointer) - -KNativePointer impl_VarBinderIdentifierAnalysis(KNativePointer contextPtr) { - auto context = reinterpret_cast(contextPtr); - GetImpl()->VarBinderIdentifierAnalysis(context); - return context; -} -KOALA_INTEROP_1(VarBinderIdentifierAnalysis, KNativePointer, KNativePointer) - -KNativePointer impl_VarBinderInitTopScope(KNativePointer contextPtr) { - auto context = reinterpret_cast(contextPtr); - GetImpl()->VarBinderInitTopScope(context); - return context; -} -KOALA_INTEROP_1(VarBinderInitTopScope, KNativePointer, KNativePointer) - -KNativePointer impl_ProgramAst(KNativePointer programPtr) { - auto program = reinterpret_cast(programPtr); - return GetImpl()->ProgramAst(program); -} -KOALA_INTEROP_1(ProgramAst, KNativePointer, KNativePointer) - KBoolean impl_IsIdentifier(KNativePointer nodePtr) { auto node = reinterpret_cast(nodePtr); return GetImpl()->IsIdentifier(node); @@ -202,1451 +176,3 @@ KNativePointer impl_IdentifierSetName(KNativePointer contextPtr, KNativePointer return node; } KOALA_INTEROP_3(IdentifierSetName, KNativePointer, KNativePointer, KNativePointer, KStringPtr) - -KNativePointer impl_CreateIdentifier2(KNativePointer contextPtr, KStringPtr namePtr, KNativePointer typeAnnotationPtr) { - auto context = reinterpret_cast(contextPtr); - auto typeAnnotation = reinterpret_cast(typeAnnotationPtr); - return GetImpl()->CreateIdentifier2(context, getStringCopy(namePtr), typeAnnotation); -} -KOALA_INTEROP_3(CreateIdentifier2, KNativePointer, KNativePointer, KStringPtr, KNativePointer) - -KNativePointer impl_CreateETSPrimitiveType(KNativePointer contextPtr, KInt type) { - auto context = reinterpret_cast(contextPtr); - return GetImpl()->CreateETSPrimitiveType(context, static_cast(type)); -} -KOALA_INTEROP_2(CreateETSPrimitiveType, KNativePointer, KNativePointer, KInt) - -KInt impl_ETSPrimitiveTypeGetPrimitiveTypeConst(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->ETSPrimitiveTypeGetPrimitiveTypeConst(context, node); -} -KOALA_INTEROP_2(ETSPrimitiveTypeGetPrimitiveTypeConst, KInt, KNativePointer, KNativePointer) - -KNativePointer impl_CreateETSFunctionTypeIr(KNativePointer contextPtr, KNativePointer signaturePtr, KInt funcFlagsT) { - auto context = reinterpret_cast(contextPtr); - auto signature = reinterpret_cast(signaturePtr); - auto funcFlags = Es2pandaScriptFunctionFlags(funcFlagsT); - - return GetImpl()->CreateETSFunctionTypeIr(context, signature, funcFlags); -} -KOALA_INTEROP_3(CreateETSFunctionTypeIr, KNativePointer, KNativePointer, KNativePointer, KInt) - -KNativePointer impl_CreateNumberLiteral(KNativePointer contextPtr, KStringPtr strPtr) { - auto context = reinterpret_cast(contextPtr); - - return GetImpl()->CreateNumberLiteral(context, getStringCopy(strPtr)); -} -KOALA_INTEROP_2(CreateNumberLiteral, KNativePointer, KNativePointer, KStringPtr) - -KNativePointer impl_CreateStringLiteral(KNativePointer contextPtr, KStringPtr stringPtr) { - auto context = reinterpret_cast(contextPtr); - return GetImpl()->CreateStringLiteral1(context, getStringCopy(stringPtr)); -} -KOALA_INTEROP_2(CreateStringLiteral, KNativePointer, KNativePointer, KStringPtr) - -KNativePointer impl_StringLiteralStrConst(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - return new string(GetImpl()->StringLiteralStrConst(context, node)); -} -KOALA_INTEROP_2(StringLiteralStrConst, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_NumberLiteralStrConst(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - return new string(GetImpl()->NumberLiteralStrConst(context, node)); -} -KOALA_INTEROP_2(NumberLiteralStrConst, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_CreateMethodDefinition( - KNativePointer contextPtr, - KInt kindT, - KNativePointer keyPtr, - KNativePointer valuePtr, - KInt modifiersT, - KBoolean isComputedT -) { - auto context = reinterpret_cast(contextPtr); - auto kind = static_cast(kindT); - auto key = reinterpret_cast(keyPtr); - auto value = reinterpret_cast(valuePtr); - auto modifiers = static_cast(modifiersT); - auto isComputed = static_cast(isComputedT); - - return GetImpl()->CreateMethodDefinition(context, kind, key, value, modifiers, isComputed); -} -KOALA_INTEROP_6(CreateMethodDefinition, KNativePointer, KNativePointer, KInt, KNativePointer, KNativePointer, KInt, KBoolean) - -KNativePointer impl_CreateClassProperty( - KNativePointer contextPtr, - KNativePointer keyPtr, - KNativePointer valuePtr, - KNativePointer typeAnnotationPtr, - KInt modifiersT, - KBoolean isComputedT -) { - auto context = reinterpret_cast(contextPtr); - auto key = reinterpret_cast(keyPtr); - auto value = reinterpret_cast(valuePtr); - auto typeAnnotation = reinterpret_cast(typeAnnotationPtr); - auto modifiers = static_cast(modifiersT); - auto isComputed = static_cast(isComputedT); - - return GetImpl()->CreateClassProperty(context, key, value, typeAnnotation, modifiers, isComputed); -} -KOALA_INTEROP_6(CreateClassProperty, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KInt, KBoolean) - -KNativePointer impl_AstNodeDumpJsonConst(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - return new string(GetImpl()->AstNodeDumpJSONConst(context, node)); -} -KOALA_INTEROP_2(AstNodeDumpJsonConst, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_AstNodeDumpEtsSrcConst(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - return new string(GetImpl()->AstNodeDumpEtsSrcConst(context, node)); -} -KOALA_INTEROP_2(AstNodeDumpEtsSrcConst, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ETSParserCreateExpression(KNativePointer contextPtr, KStringPtr sourceCodePtr, KInt flagsT) { - auto context = reinterpret_cast(contextPtr); - auto flags = static_cast(flagsT); - - return GetImpl()->ETSParserCreateExpression(context, getStringCopy(sourceCodePtr), flags); -} -KOALA_INTEROP_3(ETSParserCreateExpression, KNativePointer, KNativePointer, KStringPtr, KInt) - -KBoolean impl_IsProgram(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - return GetImpl()->AstNodeIsProgramConst(context, node); -} -KOALA_INTEROP_2(IsProgram, KBoolean, KNativePointer, KNativePointer) - -KBoolean impl_IsBlockStatement(KNativePointer nodePtr) { - auto node = reinterpret_cast(nodePtr); - return GetImpl()->IsBlockStatement(node); -} -KOALA_INTEROP_1(IsBlockStatement, KBoolean, KNativePointer) - -KNativePointer impl_BlockStatementStatements(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - size_t n; - auto statements = GetImpl()->BlockStatementStatements(context, node, &n); - return new vector(statements, statements + n); -} -KOALA_INTEROP_2(BlockStatementStatements, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_VariableDeclarationDeclaratorsConst(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - size_t n; - auto declarators = GetImpl()->VariableDeclarationDeclaratorsConst(context, node, &n); - return new vector(declarators, declarators + n); -} -KOALA_INTEROP_2(VariableDeclarationDeclaratorsConst, KNativePointer, KNativePointer, KNativePointer) - -KInt impl_VariableDeclarationKindConst(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->VariableDeclarationKindConst(context, node); -} -KOALA_INTEROP_2(VariableDeclarationKindConst, KInt, KNativePointer, KNativePointer) - -KNativePointer impl_ClassDeclarationDefinition(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - return GetImpl()->ClassDeclarationDefinition(context, node); -} -KOALA_INTEROP_2(ClassDeclarationDefinition, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ClassDefinitionBody(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - size_t n; - auto body = GetImpl()->ClassDefinitionBody(context, node, &n); - return new std::vector(body, body + n); -} -KOALA_INTEROP_2(ClassDefinitionBody, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ClassDefinitionTypeParamsConst(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return const_cast(GetImpl()->ClassDefinitionTypeParamsConst(context, node)); -} -KOALA_INTEROP_2(ClassDefinitionTypeParamsConst, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_FunctionDeclarationFunction(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - return GetImpl()->FunctionDeclarationFunction(context, node); -} -KOALA_INTEROP_2(FunctionDeclarationFunction, KNativePointer, KNativePointer, KNativePointer) - -KBoolean impl_FunctionDeclarationIsAnonymousConst(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->FunctionDeclarationIsAnonymousConst(context, node); -} -KOALA_INTEROP_2(FunctionDeclarationIsAnonymousConst, KBoolean, KNativePointer, KNativePointer) - -KNativePointer impl_ScriptFunctionAddFlag(KNativePointer contextPtr, KNativePointer nodePtr, KInt flagsT) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - auto flags = static_cast(flagsT); - - GetImpl()->ScriptFunctionAddFlag(context, node, flags); - return node; -} -KOALA_INTEROP_3(ScriptFunctionAddFlag, KNativePointer, KNativePointer, KNativePointer, KInt) - -KNativePointer impl_ScriptFunctionParams(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - std::size_t params_len = 0; - auto params = GetImpl()->ScriptFunctionParams(context, node, ¶ms_len); - return new std::vector(params, params + params_len); -} -KOALA_INTEROP_2(ScriptFunctionParams, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ScriptFunctionTypeParams(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->ScriptFunctionTypeParams(context, node); -} -KOALA_INTEROP_2(ScriptFunctionTypeParams, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ScriptFunctionReturnTypeAnnotation(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->ScriptFunctionReturnTypeAnnotation(context, node); -} -KOALA_INTEROP_2(ScriptFunctionReturnTypeAnnotation, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ScriptFunctionId(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - return GetImpl()->ScriptFunctionId(context, node); -} -KOALA_INTEROP_2(ScriptFunctionId, KNativePointer, KNativePointer, KNativePointer) - -KBoolean impl_ScriptFunctionDeclareConst(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - return GetImpl()->ScriptFunctionDeclareConst(context, node); -} -KOALA_INTEROP_2(ScriptFunctionDeclareConst, KBoolean, KNativePointer, KNativePointer) - -KNativePointer impl_CreateFunctionDeclaration( - KNativePointer contextPtr, - KNativePointer funcPtr, - KNativePointerArray annotationsPtr, - KInt annotationsLen, - KBoolean isAnonK -) { - auto context = reinterpret_cast(contextPtr); - auto func = reinterpret_cast(funcPtr); - auto annotations = reinterpret_cast(annotationsPtr); - auto isAnon = static_cast(isAnonK); - - return GetImpl()->CreateFunctionDeclaration(context, func, annotations, annotationsLen, isAnon); -} -KOALA_INTEROP_5(CreateFunctionDeclaration, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt, KBoolean) - -KNativePointer impl_UpdateFunctionDeclaration( - KNativePointer contextPtr, - KNativePointer nodePtr, - KNativePointer funcPtr, - KNativePointerArray annotationsPtr, - KInt annotationsLen, - KBoolean isAnonK -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - auto func = reinterpret_cast(funcPtr); - auto annotations = reinterpret_cast(annotationsPtr); - auto isAnon = static_cast(isAnonK); - - return GetImpl()->UpdateFunctionDeclaration(context, node, func, annotations, annotationsLen, isAnon); -} -KOALA_INTEROP_6(UpdateFunctionDeclaration, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt, KBoolean) - -// TODO: add param initializer -KNativePointer impl_CreateETSParameterExpression(KNativePointer contextPtr, KNativePointer identifierPtr, KNativePointer initializerPtr) { - auto context = reinterpret_cast(contextPtr); - auto identifier = reinterpret_cast(identifierPtr); - auto initializer = reinterpret_cast(initializerPtr); - - return GetImpl()->CreateETSParameterExpression(context, identifier, initializer); -} -KOALA_INTEROP_3(CreateETSParameterExpression, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_CreateTSTypeParameterDeclaration( - KNativePointer contextPtr, - KNativePointerArray paramsPtr, - KInt paramsLen, - KInt requiredParams -) { - auto context = reinterpret_cast(contextPtr); - auto params = reinterpret_cast(paramsPtr); - - return GetImpl()->CreateTSTypeParameterDeclaration(context, params, paramsLen, requiredParams); -} -KOALA_INTEROP_4(CreateTSTypeParameterDeclaration, KNativePointer, KNativePointer, KNativePointerArray, KInt, KInt) - -KNativePointer impl_TSTypeParameterDeclarationParamsConst(KNativePointer contextPtr, KNativePointer nodePtr, KNativePointer returnLen) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - std::size_t params_len = 0; - auto params = GetImpl()->TSTypeParameterDeclarationParamsConst(context, node, ¶ms_len); - return new std::vector(params, params + params_len); -} -KOALA_INTEROP_3(TSTypeParameterDeclarationParamsConst, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_CreateVariableDeclaration( - KNativePointer contextPtr, - KInt kindT, - KNativePointerArray declaratorsPtr, - KInt declaratorsLen, - KBoolean declareT -) { - auto context = reinterpret_cast(contextPtr); - auto kind = static_cast(kindT); - auto declarators = reinterpret_cast(declaratorsPtr); - auto declare = static_cast(declareT); - - return GetImpl()->CreateVariableDeclaration(context, kind, declarators, declaratorsLen, declare); -} -KOALA_INTEROP_5(CreateVariableDeclaration, KNativePointer, KNativePointer, KInt, KNativePointerArray, KInt, KBoolean) - -KNativePointer impl_UpdateVariableDeclaration( - KNativePointer contextPtr, - KNativePointer originalPtr, - KInt kindT, - KNativePointerArray declaratorsPtr, - KInt declaratorsLen, - KBoolean declareT -) { - auto context = reinterpret_cast(contextPtr); - auto original = reinterpret_cast(originalPtr); - auto kind = static_cast(kindT); - auto declarators = reinterpret_cast(declaratorsPtr); - auto declare = static_cast(declareT); - - return GetImpl()->UpdateVariableDeclaration(context, original, kind, declarators, declaratorsLen, declare); -} -KOALA_INTEROP_6(UpdateVariableDeclaration, KNativePointer, KNativePointer, KNativePointer, KInt, KNativePointerArray, KInt, KBoolean) - -KNativePointer impl_CreateVariableDeclarator( - KNativePointer contextPtr, - KInt flagT, - KNativePointer identPtr -) { - auto context = reinterpret_cast(contextPtr); - auto flag = static_cast(flagT); - auto ident = reinterpret_cast(identPtr); - - return GetImpl()->CreateVariableDeclarator(context, flag, ident); -} -KOALA_INTEROP_3(CreateVariableDeclarator, KNativePointer, KNativePointer, KInt, KNativePointer) - -KNativePointer impl_VariableDeclaratorSetInit(KNativePointer contextPtr, KNativePointer nodePtr, KNativePointer initPtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - auto init = reinterpret_cast(initPtr); - - GetImpl()->VariableDeclaratorSetInit(context, node, init); - return node; -} -KOALA_INTEROP_3(VariableDeclaratorSetInit, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_VariableDeclaratorId(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->VariableDeclaratorId(context, node); -} -KOALA_INTEROP_2(VariableDeclaratorId, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_CreateTSTypeParameter( - KNativePointer contextPtr, - KNativePointer namePtr, - KNativePointer constraintPtr, - KNativePointer defaultTypePtr -) { - auto context = reinterpret_cast(contextPtr); - auto name = reinterpret_cast(namePtr); - auto constraint = reinterpret_cast(constraintPtr); - auto defaultType = reinterpret_cast(defaultTypePtr); - - return GetImpl()->CreateTSTypeParameter(context, name, constraint, defaultType); -} -KOALA_INTEROP_4(CreateTSTypeParameter, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_TSTypeParameterName(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->TSTypeParameterName(context, node); -} -KOALA_INTEROP_2(TSTypeParameterName, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ETSParameterExpressionIdent(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->ETSParameterExpressionIdent(context, node); -} -KOALA_INTEROP_2(ETSParameterExpressionIdent, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_CreateETSTypeReference(KNativePointer contextPtr, KNativePointer partPtr) { - auto context = reinterpret_cast(contextPtr); - auto part = reinterpret_cast(partPtr); - - return GetImpl()->CreateETSTypeReference(context, part); -} -KOALA_INTEROP_2(CreateETSTypeReference, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_CreateETSTypeReferencePart1(KNativePointer contextPtr, KNativePointer namePtr) { - auto context = reinterpret_cast(contextPtr); - auto name = reinterpret_cast(namePtr); - - return GetImpl()->CreateETSTypeReferencePart1(context, name); -} -KOALA_INTEROP_2(CreateETSTypeReferencePart1, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_CreateETSTypeReferencePart(KNativePointer contextPtr, KNativePointer namePtr, KNativePointer typeParamsPtr, KNativePointer prevPtr) { - auto context = reinterpret_cast(contextPtr); - auto name = reinterpret_cast(namePtr); - auto typeParams = reinterpret_cast(typeParamsPtr); - auto prev = reinterpret_cast(prevPtr); - - return GetImpl()->CreateETSTypeReferencePart(context, name, typeParams, prev); -} -KOALA_INTEROP_4(CreateETSTypeReferencePart, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_UpdateBlockStatement(KNativePointer contextPtr, KNativePointer originalPtr, KNativePointerArray statementListPtr, KInt statementListLen) { - auto context = reinterpret_cast(contextPtr); - auto statementList = reinterpret_cast(statementListPtr); - auto original = reinterpret_cast(originalPtr); - - // tmp solution while waiting fix for UpdateBlockStatement - GetImpl()->BlockStatementSetStatements(context, original, statementList, static_cast(statementListLen)); - return original; -} -KOALA_INTEROP_4(UpdateBlockStatement, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt) - -KNativePointer impl_CreateReturnStatement1(KNativePointer contextPtr, KNativePointer argumentPtr) { - auto context = reinterpret_cast(contextPtr); - auto argument = reinterpret_cast(argumentPtr); - - return GetImpl()->CreateReturnStatement1(context, argument); -} -KOALA_INTEROP_2(CreateReturnStatement1, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ReturnStatementArgument(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->ReturnStatementArgument(context, node); -} -KOALA_INTEROP_2(ReturnStatementArgument, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_CreateIfStatement(KNativePointer contextPtr, KNativePointer testPtr, KNativePointer consequentPtr, KNativePointer alternatePtr) { - auto context = reinterpret_cast(contextPtr); - auto test = reinterpret_cast(testPtr); - auto consequent = reinterpret_cast(consequentPtr); - auto alternate = reinterpret_cast(alternatePtr); - - return GetImpl()->CreateIfStatement(context, test, consequent, alternate); -} -KOALA_INTEROP_4(CreateIfStatement, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_CreateMemberExpression( - KNativePointer contextPtr, - KNativePointer objectPtr, - KNativePointer propertyPtr, - KInt kindT, - KBoolean computedT, - KBoolean optionalT -) { - auto context = reinterpret_cast(contextPtr); - auto object = reinterpret_cast(objectPtr); - auto property = reinterpret_cast(propertyPtr); - auto computed = static_cast(computedT); - auto optional = static_cast(optionalT); - auto kind = static_cast(kindT); - - return GetImpl()->CreateMemberExpression(context, object, property, kind, computed, optional); -} -KOALA_INTEROP_6(CreateMemberExpression, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KInt, KBoolean, KBoolean) - -KNativePointer impl_UpdateMemberExpression( - KNativePointer contextPtr, - KNativePointer nodePtr, - KNativePointer objectPtr, - KNativePointer propertyPtr, - KInt kindT, - KBoolean computedT, - KBoolean optionalT -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - auto object = reinterpret_cast(objectPtr); - auto property = reinterpret_cast(propertyPtr); - auto computed = static_cast(computedT); - auto optional = static_cast(optionalT); - auto kind = static_cast(kindT); - - return GetImpl()->UpdateMemberExpression(context, node, object, property, kind, computed, optional); -} -KOALA_INTEROP_7(UpdateMemberExpression, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KInt, KBoolean, KBoolean) - -KNativePointer impl_UpdateMethodDefinition( - KNativePointer contextPtr, - KNativePointer nodePtr, - KInt kindT, - KNativePointer keyPtr, - KNativePointer valuePtr, - KInt modifiersT, - KBoolean isComputedT -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - auto kind = static_cast(kindT); - auto key = reinterpret_cast(keyPtr); - auto value = reinterpret_cast(valuePtr); - auto modifiers = static_cast(modifiersT); - auto isComputed = static_cast(isComputedT); - - return GetImpl()->UpdateMethodDefinition(context, node, kind, key, value, modifiers, isComputed); -} -KOALA_INTEROP_7(UpdateMethodDefinition, KNativePointer, KNativePointer, KNativePointer, KInt, KNativePointer, KNativePointer, KInt, KBoolean) - -KNativePointer impl_MemberExpressionObject( - KNativePointer contextPtr, - KNativePointer nodePtr -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->MemberExpressionObject(context, node); -} -KOALA_INTEROP_2(MemberExpressionObject, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_MemberExpressionProperty( - KNativePointer contextPtr, - KNativePointer nodePtr -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->MemberExpressionProperty(context, node); -} -KOALA_INTEROP_2(MemberExpressionProperty, KNativePointer, KNativePointer, KNativePointer) - -KInt impl_MemberExpressionKindConst( - KNativePointer contextPtr, - KNativePointer nodePtr -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->MemberExpressionKindConst(context, node); -} -KOALA_INTEROP_2(MemberExpressionKindConst, KInt, KNativePointer, KNativePointer) - -KNativePointer impl_CreateCallExpression( - KNativePointer contextPtr, - KNativePointer calleePtr, - KNativePointerArray argumentsPtr, - KInt argumentsLen, - KNativePointer typeParamsPtr, - KBoolean optionalT, - KBoolean trailingCommaT -) { - auto context = reinterpret_cast(contextPtr); - auto callee = reinterpret_cast(calleePtr); - auto arguments = reinterpret_cast(argumentsPtr); - auto typeParams = reinterpret_cast(typeParamsPtr); - auto optional = static_cast(optionalT); - auto trailingComma = static_cast(trailingCommaT); - - return GetImpl()->CreateCallExpression(context, callee, arguments, argumentsLen, typeParams, optional, trailingComma); -} -KOALA_INTEROP_7(CreateCallExpression, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt, KNativePointer, KBoolean, KBoolean) - -KNativePointer impl_UpdateCallExpression( - KNativePointer contextPtr, - KNativePointer nodePtr, - KNativePointer calleePtr, - KNativePointerArray argumentsPtr, - KInt argumentsLen, - KNativePointer typeParamsPtr, - KBoolean optionalT, - KBoolean trailingCommaT -) { - auto node = reinterpret_cast(nodePtr); - auto context = reinterpret_cast(contextPtr); - auto callee = reinterpret_cast(calleePtr); - auto arguments = reinterpret_cast(argumentsPtr); - auto typeParams = reinterpret_cast(typeParamsPtr); - auto optional = static_cast(optionalT); - auto trailingComma = static_cast(trailingCommaT); - - // auto nn = GetImpl()->UpdateCallExpression(context, node, callee, arguments, argumentsLen, typeParams, optional, trailingComma); - auto nn = GetImpl()->CreateCallExpression(context, callee, arguments, argumentsLen, typeParams, optional, trailingComma); - GetImpl()->AstNodeSetOriginalNode(context, nn, node); - return nn; -} -KOALA_INTEROP_8(UpdateCallExpression, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt, KNativePointer, KBoolean, KBoolean) - -KNativePointer impl_CreateExpressionStatement(KNativePointer contextPtr, KNativePointer exprPtr) { - auto context = reinterpret_cast(contextPtr); - auto expr = reinterpret_cast(exprPtr); - - return GetImpl()->CreateExpressionStatement(context, expr); -} -KOALA_INTEROP_2(CreateExpressionStatement, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_UpdateExpressionStatement(KNativePointer contextPtr, KNativePointer nodePtr, KNativePointer exprPtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - auto expr = reinterpret_cast(exprPtr); - - return GetImpl()->UpdateExpressionStatement(context, node, expr); -} -KOALA_INTEROP_3(UpdateExpressionStatement, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ScriptFunctionBody(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->ScriptFunctionBody(context, node); -} -KOALA_INTEROP_2(ScriptFunctionBody, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_CreateBinaryExpression(KNativePointer contextPtr, KNativePointer leftPtr, KNativePointer rightPtr, KInt tokenKind) { - auto context = reinterpret_cast(contextPtr); - auto left = reinterpret_cast(leftPtr); - auto right = reinterpret_cast(rightPtr); - - return GetImpl()->CreateBinaryExpression(context, left, right, Es2pandaTokenType(tokenKind)); -} -KOALA_INTEROP_4(CreateBinaryExpression, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KInt) - -KNativePointer impl_CreateAssignmentExpression(KNativePointer contextPtr, KNativePointer leftPtr, KNativePointer rightPtr, KInt assignmentOperator) { - auto context = reinterpret_cast(contextPtr); - auto left = reinterpret_cast(leftPtr); - auto right = reinterpret_cast(rightPtr); - - return GetImpl()->CreateAssignmentExpression(context, left, right, Es2pandaTokenType(assignmentOperator)); -} -KOALA_INTEROP_4(CreateAssignmentExpression, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KInt) - -KNativePointer impl_CreateFunctionSignature( - KNativePointer contextPtr, - KNativePointer typeParamsPtr, - KNativePointerArray paramsPtr, - KInt paramsLen, - KNativePointer returnTypeAnnotationPtr -) { - auto context = reinterpret_cast(contextPtr); - auto typeParams = reinterpret_cast(typeParamsPtr); - auto params = reinterpret_cast(paramsPtr); - auto returnTypeAnnotation = reinterpret_cast(returnTypeAnnotationPtr); - - return GetImpl()->CreateFunctionSignature(context, typeParams, params, paramsLen, returnTypeAnnotation); -} -KOALA_INTEROP_5(CreateFunctionSignature, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt, KNativePointer) - -KNativePointer impl_CreateTSUnionType( - KNativePointer contextPtr, - KNativePointerArray typesPtr, - KInt typesLen -) { - auto context = reinterpret_cast(contextPtr); - auto types = reinterpret_cast(typesPtr); - - return GetImpl()->CreateTSUnionType(context, types, typesLen); -} -KOALA_INTEROP_3(CreateTSUnionType, KNativePointer, KNativePointer, KNativePointerArray, KInt) - -KNativePointer impl_TSUnionTypeTypesConst(KNativePointer contextPtr, KNativePointer nodePtr, KNativePointer returnLen) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - std::size_t params_len = 0; - auto params = GetImpl()->TSUnionTypeTypesConst(context, node, ¶ms_len); - - return new std::vector(params, params + params_len); -} -KOALA_INTEROP_3(TSUnionTypeTypesConst, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_CreateETSUnionTypeIr( - KNativePointer contextPtr, - KNativePointerArray typesPtr, - KInt typesLen -) { - auto context = reinterpret_cast(contextPtr); - auto types = reinterpret_cast(typesPtr); - - return GetImpl()->CreateETSUnionTypeIr(context, types, typesLen); -} -KOALA_INTEROP_3(CreateETSUnionTypeIr, KNativePointer, KNativePointer, KNativePointerArray, KInt) - -KNativePointer impl_ETSUnionTypeIrTypesConst(KNativePointer contextPtr, KNativePointer nodePtr, KNativePointer returnLen) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - std::size_t params_len = 0; - auto params = GetImpl()->ETSUnionTypeIrTypesConst(context, node, ¶ms_len); - - return new std::vector(params, params + params_len); -} -KOALA_INTEROP_3(ETSUnionTypeIrTypesConst, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_CreateScriptFunction( - KNativePointer contextPtr, - KNativePointer databodyPtr, - KNativePointer datasignaturePtr, - KInt datafuncFlags, - KInt dataFlags, - KBoolean datadeclare -) { - auto context = reinterpret_cast(contextPtr); - auto databody = reinterpret_cast(databodyPtr); - auto datasignature = reinterpret_cast(datasignaturePtr); - - return GetImpl()->CreateScriptFunction(context, databody, datasignature, datafuncFlags, dataFlags, datadeclare); -} -KOALA_INTEROP_6(CreateScriptFunction, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KInt, KInt, KBoolean) - -KNativePointer impl_UpdateScriptFunction( - KNativePointer contextPtr, - KNativePointer nodePtr, - KNativePointer databodyPtr, - KNativePointer datasignaturePtr, - KInt datafuncFlags, - KInt dataFlags, - KBoolean datadeclare -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - auto databody = reinterpret_cast(databodyPtr); - auto datasignature = reinterpret_cast(datasignaturePtr); - - return GetImpl()->UpdateScriptFunction(context, node, databody, datasignature, datafuncFlags, dataFlags, datadeclare); -} -KOALA_INTEROP_7(UpdateScriptFunction, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KInt, KInt, KBoolean) - -KNativePointer impl_CreateBlockStatement( - KNativePointer contextPtr, - KNativePointerArray statementListPtr, - KInt statementListLen -) { - auto context = reinterpret_cast(contextPtr); - auto statementList = reinterpret_cast(statementListPtr); - - return GetImpl()->CreateBlockStatement(context, statementList, statementListLen); -} -KOALA_INTEROP_3(CreateBlockStatement, KNativePointer, KNativePointer, KNativePointerArray, KInt) - -KNativePointer impl_CreateAstDumper( - KNativePointer contextPtr, - KNativePointer nodePtr, - KStringPtr sourcePtr -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->CreateAstDumper(context, node, getStringCopy(sourcePtr)); -} -KOALA_INTEROP_3(CreateAstDumper, KNativePointer, KNativePointer, KNativePointer, KStringPtr) - -KNativePointer impl_AstDumperModifierToString( - KNativePointer contextPtr, - KNativePointer dumperPtr, - KInt flagsT -) { - auto context = reinterpret_cast(contextPtr); - auto dumper = reinterpret_cast(dumperPtr); - auto flags = static_cast(flagsT); - - return new std::string(GetImpl()->AstDumperModifierToString(context, dumper, flags)); -} -KOALA_INTEROP_3(AstDumperModifierToString, KNativePointer, KNativePointer, KNativePointer, KInt) - -KNativePointer impl_MethodDefinitionFunction( - KNativePointer contextPtr, - KNativePointer nodePtr -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->MethodDefinitionFunction(context, node); -} -KOALA_INTEROP_2(MethodDefinitionFunction, KNativePointer, KNativePointer, KNativePointer) - -KInt impl_MethodDefinitionKindConst( - KNativePointer contextPtr, - KNativePointer nodePtr -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->MethodDefinitionKindConst(context, node); -} -KOALA_INTEROP_2(MethodDefinitionKindConst, KInt, KNativePointer, KNativePointer) - - -KNativePointer impl_AstNodeSetParent( - KNativePointer contextPtr, - KNativePointer astPtr, - KNativePointer parentPtr -) { - auto context = reinterpret_cast(contextPtr); - auto ast = reinterpret_cast(astPtr); - auto parent = reinterpret_cast(parentPtr); - - GetImpl()->AstNodeSetParent(context, ast, parent); - return ast; -} -KOALA_INTEROP_3(AstNodeSetParent, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_AstNodeSetOriginalNode( - KNativePointer contextPtr, - KNativePointer astPtr, - KNativePointer originalNodePtr -) { - auto context = reinterpret_cast(contextPtr); - auto ast = reinterpret_cast(astPtr); - auto originalNode = reinterpret_cast(originalNodePtr); - - GetImpl()->AstNodeSetOriginalNode(context, ast, originalNode); - return ast; -} -KOALA_INTEROP_3(AstNodeSetOriginalNode, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_AstNodeOriginalNodeConst( - KNativePointer contextPtr, - KNativePointer astPtr -) { - auto context = reinterpret_cast(contextPtr); - auto ast = reinterpret_cast(astPtr); - - return GetImpl()->AstNodeOriginalNodeConst(context, ast); -} -KOALA_INTEROP_2(AstNodeOriginalNodeConst, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_AstNodeClone( - KNativePointer contextPtr, - KNativePointer astPtr, - KNativePointer parentPtr -) { - auto context = reinterpret_cast(contextPtr); - auto ast = reinterpret_cast(astPtr); - auto parent = reinterpret_cast(parentPtr); - - return GetImpl()->AstNodeClone(context, ast, parent); -} -KOALA_INTEROP_3(AstNodeClone, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ScriptFunctionSetIdent( - KNativePointer contextPtr, - KNativePointer astPtr, - KNativePointer idPtr -) { - auto context = reinterpret_cast(contextPtr); - auto ast = reinterpret_cast(astPtr); - auto id = reinterpret_cast(idPtr); - - GetImpl()->ScriptFunctionSetIdent(context, ast, id); - return ast; -} -KOALA_INTEROP_3(ScriptFunctionSetIdent, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ScriptFunctionSetSignature( - KNativePointer contextPtr, - KNativePointer astPtr, - KNativePointer signaturePtr -) { - auto context = reinterpret_cast(contextPtr); - auto ast = reinterpret_cast(astPtr); - auto signature = reinterpret_cast(signaturePtr); - - GetImpl()->ScriptFunctionSetSignature(context, ast, signature); - return ast; -} -KOALA_INTEROP_3(ScriptFunctionSetSignature, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ScriptFunctionSetBody( - KNativePointer contextPtr, - KNativePointer astPtr, - KNativePointer bodyPtr -) { - auto context = reinterpret_cast(contextPtr); - auto ast = reinterpret_cast(astPtr); - auto body = reinterpret_cast(bodyPtr); - - GetImpl()->ScriptFunctionSetBody(context, ast, body); - return ast; -} -KOALA_INTEROP_3(ScriptFunctionSetBody, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ScriptFunctionSetScope( - KNativePointer contextPtr, - KNativePointer astPtr, - KNativePointer scopePtr -) { - auto context = reinterpret_cast(contextPtr); - auto ast = reinterpret_cast(astPtr); - auto scope = reinterpret_cast(scopePtr); - - GetImpl()->ScriptFunctionSetScope(context, ast, scope); - return ast; -} -KOALA_INTEROP_3(ScriptFunctionSetScope, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ScriptFunctionSignature(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->ScriptFunctionSignature(context, node); -} -KOALA_INTEROP_2(ScriptFunctionSignature, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ScriptFunctionIrSignature(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->ScriptFunctionIrSignature(context, node); -} -KOALA_INTEROP_2(ScriptFunctionIrSignature, KNativePointer, KNativePointer, KNativePointer) - -KInt impl_ScriptFunctionFlagsConst(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->ScriptFunctionFlagsConst(context, node); -} -KOALA_INTEROP_2(ScriptFunctionFlagsConst, KInt, KNativePointer, KNativePointer) - -KInt impl_AstNodeModifiers(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->AstNodeModifiers(context, node); -} -KOALA_INTEROP_2(AstNodeModifiers, KInt, KNativePointer, KNativePointer) - -KNativePointer impl_AstNodeAddModifier(KNativePointer contextPtr, KNativePointer nodePtr, KInt flagsT) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - auto flags = static_cast(flagsT); - - GetImpl()->AstNodeAddModifier(context, node, flags); - return node; -} -KOALA_INTEROP_3(AstNodeAddModifier, KNativePointer, KNativePointer, KNativePointer, KInt) - -KNativePointer impl_AstNodeClearModifier(KNativePointer contextPtr, KNativePointer nodePtr, KInt flagsT) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - auto flags = static_cast(flagsT); - - GetImpl()->AstNodeClearModifier(context, node, flags); - return node; -} -KOALA_INTEROP_3(AstNodeClearModifier, KNativePointer, KNativePointer, KNativePointer, KInt) - -KNativePointer impl_FunctionSignatureParamsConst(KNativePointer contextPtr, KNativePointer nodePtr, KNativePointer returnTypeLen) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - std::size_t params_len = 0; - auto params = GetImpl()->FunctionSignatureParamsConst(context, node, ¶ms_len); - return new std::vector(params, params + params_len); -} -KOALA_INTEROP_3(FunctionSignatureParamsConst, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_FunctionSignatureTypeParams(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->FunctionSignatureTypeParams(context, node); -} -KOALA_INTEROP_2(FunctionSignatureTypeParams, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_FunctionSignatureReturnType(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->FunctionSignatureReturnType(context, node); -} -KOALA_INTEROP_2(FunctionSignatureReturnType, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_UpdateIdentifier1(KNativePointer contextPtr, KNativePointer nodePtr, KStringPtr namePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->UpdateIdentifier1(context, node, getStringCopy(namePtr)); -} -KOALA_INTEROP_3(UpdateIdentifier1, KNativePointer, KNativePointer, KNativePointer, KStringPtr) - -KNativePointer impl_UpdateIdentifier2(KNativePointer contextPtr, KNativePointer nodePtr, KStringPtr namePtr, KNativePointer typeAnnotationPtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - auto typeAnnotation = reinterpret_cast(typeAnnotationPtr); - - return GetImpl()->UpdateIdentifier2(context, node, getStringCopy(namePtr), typeAnnotation); -} -KOALA_INTEROP_4(UpdateIdentifier2, KNativePointer, KNativePointer, KNativePointer, KStringPtr, KNativePointer) - -KBoolean impl_IdentifierIsPrivateIdentConst(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->IdentifierIsPrivateIdentConst(context, node); -} -KOALA_INTEROP_2(IdentifierIsPrivateIdentConst, KBoolean, KNativePointer, KNativePointer) - -KInt impl_IdentifierIdentifierFlags(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return - (GetImpl()->IdentifierIsOptionalConst(context, node) ? (1 << 0) : 0) | - (GetImpl()->IdentifierIsReferenceConst(context, node, Es2pandaScriptExtension::SCRIPT_EXTENSION_TS) ? (1 << 1) : 0) | - (GetImpl()->IdentifierIsTdzConst(context, node) ? (1 << 2) : 0); -} -KOALA_INTEROP_2(IdentifierIdentifierFlags, KInt, KNativePointer, KNativePointer) - -KNativePointer impl_CreateFunctionExpression(KNativePointer contextPtr, KNativePointer funcPtr) { - auto context = reinterpret_cast(contextPtr); - auto func = reinterpret_cast(funcPtr); - - return GetImpl()->CreateFunctionExpression(context, func); -} -KOALA_INTEROP_2(CreateFunctionExpression, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_UpdateFunctionExpression(KNativePointer contextPtr, KNativePointer nodePtr, KNativePointer funcPtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - auto func = reinterpret_cast(funcPtr); - - return GetImpl()->UpdateFunctionExpression(context, node, func); -} -KOALA_INTEROP_3(UpdateFunctionExpression, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_CreateArrowFunctionExpression(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->CreateArrowFunctionExpression(context, node); -} -KOALA_INTEROP_2(CreateArrowFunctionExpression, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ArrowFunctionExpressionFunction(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->ArrowFunctionExpressionFunction(context, node); -} -KOALA_INTEROP_2(ArrowFunctionExpressionFunction, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ArrowFunctionExpressionCreateTypeAnnotation(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->ArrowFunctionExpressionCreateTypeAnnotation(context, node); -} -KOALA_INTEROP_2(ArrowFunctionExpressionCreateTypeAnnotation, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_FunctionExpressionFunction(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->FunctionExpressionFunction(context, node); -} -KOALA_INTEROP_2(FunctionExpressionFunction, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ExpressionStatementGetExpression(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->ExpressionStatementGetExpression(context, node); -} -KOALA_INTEROP_2(ExpressionStatementGetExpression, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_CallExpressionArguments(KNativePointer contextPtr, KNativePointer nodePtr, KNativePointer returnLen) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - std::size_t params_len = 0; - auto params = GetImpl()->CallExpressionArguments(context, node, ¶ms_len); - return new std::vector(params, params + params_len); -} -KOALA_INTEROP_3(CallExpressionArguments, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_CallExpressionCallee(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - return GetImpl()->CallExpressionCallee(context, node); -} -KOALA_INTEROP_2(CallExpressionCallee, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_AstNodeParent(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - return GetImpl()->AstNodeParent(context, node); -} -KOALA_INTEROP_2(AstNodeParent, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_AstNodeVariableConst(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->AstNodeVariableConst(context, node); -} -KOALA_INTEROP_2(AstNodeVariableConst, KNativePointer, KNativePointer, KNativePointer) - -KInt impl_AstNodeTypeConst(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->AstNodeTypeConst(context, node); -} -KOALA_INTEROP_2(AstNodeTypeConst, KInt, KNativePointer, KNativePointer) - -KNativePointer impl_VariableDeclaration(KNativePointer contextPtr, KNativePointer variablePtr) { - auto context = reinterpret_cast(contextPtr); - auto variable = reinterpret_cast(variablePtr); - - return GetImpl()->VariableDeclaration(context, variable); -} -KOALA_INTEROP_2(VariableDeclaration, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_DeclNode(KNativePointer contextPtr, KNativePointer declPtr) { - auto context = reinterpret_cast(contextPtr); - auto decl = reinterpret_cast(declPtr); - - return GetImpl()->DeclNode(context, decl); -} -KOALA_INTEROP_2(DeclNode, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_AstNodeScopeConst(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - return GetImpl()->AstNodeScopeConst(context, node); -} -KOALA_INTEROP_2(AstNodeScopeConst, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ScopeSetParent(KNativePointer contextPtr, KNativePointer nodePtr, KNativePointer parentPtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - auto parent = reinterpret_cast(parentPtr); - GetImpl()->ScopeSetParent(context, node, parent); - return node; -} -KOALA_INTEROP_3(ScopeSetParent, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_BlockStatementSetStatements( - KNativePointer contextPtr, - KNativePointer nodePtr, - KNativePointerArray statementsPtr, - KInt statementsLen -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - auto statements = reinterpret_cast(statementsPtr); - - GetImpl()->BlockStatementSetStatements(context, node, statements, statementsLen); - return node; -} -KOALA_INTEROP_4(BlockStatementSetStatements, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt) - -KNativePointer impl_VarBinderSetProgram(KNativePointer contextPtr) { - auto context = reinterpret_cast(contextPtr); - - GetImpl()->VarBinderSetProgram(context); - return nullptr; -} -KOALA_INTEROP_1(VarBinderSetProgram, KNativePointer, KNativePointer) - -KNativePointer impl_VarBinderSetContext(KNativePointer contextPtr) { - auto context = reinterpret_cast(contextPtr); - - GetImpl()->VarBinderSetContext(context); - return nullptr; -} -KOALA_INTEROP_1(VarBinderSetContext, KNativePointer, KNativePointer) - -KNativePointer impl_VarBinderSetGenStdLib(KNativePointer contextPtr, KBoolean genStdLibT) { - auto context = reinterpret_cast(contextPtr); - auto genStdLib = static_cast(genStdLibT); - - GetImpl()->VarBinderSetGenStdLib(context, genStdLib); - return nullptr; -} -KOALA_INTEROP_2(VarBinderSetGenStdLib, KNativePointer, KNativePointer, KBoolean) - -KNativePointer impl_CreateClassDeclaration(KNativePointer contextPtr, KNativePointer defPtr) { - auto context = reinterpret_cast(contextPtr); - auto def = reinterpret_cast(defPtr); - - return GetImpl()->CreateClassDeclaration(context, def); -} -KOALA_INTEROP_2(CreateClassDeclaration, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_UpdateClassDeclaration(KNativePointer contextPtr, KNativePointer originalPtr, KNativePointer defPtr) { - auto context = reinterpret_cast(contextPtr); - auto original = reinterpret_cast(originalPtr); - auto def = reinterpret_cast(defPtr); - - return GetImpl()->UpdateClassDeclaration(context, original, def); -} -KOALA_INTEROP_3(UpdateClassDeclaration, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ClassDefinitionSetTypeParams( - KNativePointer contextPtr, - KNativePointer nodePtr, - KNativePointer typeParamsPtr -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - auto typeParams = reinterpret_cast(typeParamsPtr); - - GetImpl()->ClassDefinitionSetTypeParams(context, node, typeParams); - return node; -} -KOALA_INTEROP_3(ClassDefinitionSetTypeParams, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ClassDefinitionSetSuper( - KNativePointer contextPtr, - KNativePointer astPtr, - KNativePointer superClassPtr -) { - auto context = reinterpret_cast(contextPtr); - auto ast = reinterpret_cast(astPtr); - auto superClass = reinterpret_cast(superClassPtr); - - GetImpl()->ClassDefinitionSetSuper(context, ast, superClass); - return ast; -} -KOALA_INTEROP_3(ClassDefinitionSetSuper, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ClassDefinitionIdent( - KNativePointer contextPtr, - KNativePointer nodePtr -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->ClassDefinitionIdent(context, node); -} -KOALA_INTEROP_2(ClassDefinitionIdent, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_CreateClassDefinition1( - KNativePointer contextPtr, - KNativePointer identPtr, - KNativePointerArray bodyPtr, - KInt bodyLenT, - KInt modifiersT, - KInt flagsT -) { - auto context = reinterpret_cast(contextPtr); - auto ident = reinterpret_cast(identPtr); - auto body = reinterpret_cast(bodyPtr); - auto bodyLen = static_cast(bodyLenT); - auto modifiers = Es2pandaClassDefinitionModifiers(modifiersT); - auto flags = Es2pandaModifierFlags(flagsT); - - return GetImpl()->CreateClassDefinition1(context, ident, body, bodyLen, modifiers, flags); -} -KOALA_INTEROP_6(CreateClassDefinition1, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt, KInt, KInt) - -KNativePointer impl_UpdateClassDefinition1( - KNativePointer contextPtr, - KNativePointer originalPtr, - KNativePointer identPtr, - KNativePointerArray bodyPtr, - KInt bodyLenT, - KInt modifiersT, - KInt flagsT -) { - auto context = reinterpret_cast(contextPtr); - auto original = reinterpret_cast(originalPtr); - auto ident = reinterpret_cast(identPtr); - auto body = reinterpret_cast(bodyPtr); - auto bodyLen = static_cast(bodyLenT); - auto modifiers = Es2pandaClassDefinitionModifiers(modifiersT); - auto flags = Es2pandaModifierFlags(flagsT); - - return GetImpl()->UpdateClassDefinition1(context, original, ident, body, bodyLen, modifiers, flags); -} -KOALA_INTEROP_7(UpdateClassDefinition1, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt, KInt, KInt) - -KNativePointer impl_CreateSuperExpression(KNativePointer contextPtr) { - auto context = reinterpret_cast(contextPtr); - - return GetImpl()->CreateSuperExpression(context); -} -KOALA_INTEROP_1(CreateSuperExpression, KNativePointer, KNativePointer) - -KNativePointer impl_UpdateSuperExpression(KNativePointer contextPtr, KNativePointer originalPtr) { - auto context = reinterpret_cast(contextPtr); - auto original = reinterpret_cast(originalPtr); - - return GetImpl()->UpdateSuperExpression(context, original); -} -KOALA_INTEROP_2(UpdateSuperExpression, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_CreateETSImportDeclaration( - KNativePointer contextPtr, - KNativePointer sourcePtr, - KNativePointerArray specifiersPtr, - KInt specifiersLen, - KInt importKindT -) { - auto context = reinterpret_cast(contextPtr); - auto source = reinterpret_cast(sourcePtr); - auto specifiers = reinterpret_cast(specifiersPtr); - auto importKind = static_cast(importKindT); - - return GetImpl()->CreateETSImportDeclaration(context, source, specifiers, specifiersLen, importKind); -} -KOALA_INTEROP_5(CreateETSImportDeclaration, KNativePointer, KNativePointer, KNativePointer, KNativePointerArray, KInt, KInt) - -KNativePointer impl_ETSImportDeclarationSourceConst( - KNativePointer contextPtr, - KNativePointer nodePtr -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->ETSImportDeclarationSourceConst(context, node); -} -KOALA_INTEROP_2(ETSImportDeclarationSourceConst, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_ETSImportDeclarationResolvedSource( - KNativePointer contextPtr, - KNativePointer nodePtr -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->ETSImportDeclarationResolvedSource(context, node); -} -KOALA_INTEROP_2(ETSImportDeclarationResolvedSource, KNativePointer, KNativePointer, KNativePointer) - -KBoolean impl_ETSImportDeclarationHasDeclConst( - KNativePointer contextPtr, - KNativePointer nodePtr -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - - return GetImpl()->ETSImportDeclarationHasDeclConst(context, node); -} -KOALA_INTEROP_2(ETSImportDeclarationHasDeclConst, KBoolean, KNativePointer, KNativePointer) - -KNativePointer impl_CreateImportSource( - KNativePointer contextPtr, - KNativePointer sourcePtr, - KNativePointer resolvedSourcePtr, - KBoolean hasDeclT -) { - auto context = reinterpret_cast(contextPtr); - auto source = reinterpret_cast(sourcePtr); - auto resolvedSource = reinterpret_cast(resolvedSourcePtr); - auto hasDecl = static_cast(hasDeclT); - - return GetImpl()->CreateImportSource(context, source, resolvedSource, hasDecl); -} -KOALA_INTEROP_4(CreateImportSource, KNativePointer, KNativePointer, KNativePointer, KNativePointer, KBoolean) - -KNativePointer impl_CreateImportSpecifier( - KNativePointer contextPtr, - KNativePointer importedPtr, - KNativePointer localPtr -) { - auto context = reinterpret_cast(contextPtr); - auto imported = reinterpret_cast(importedPtr); - auto local = reinterpret_cast(localPtr); - - return GetImpl()->CreateImportSpecifier(context, imported, local); -} -KOALA_INTEROP_3(CreateImportSpecifier, KNativePointer, KNativePointer, KNativePointer, KNativePointer) - - -/* -TODO: NOT FROM API (shouldn't be there) ------------------------------------------------------------------------------------------------------------------------------ -*/ - -es2panda_AstNode * __parentNode; -es2panda_Context * __context; - -static void changeParent(es2panda_AstNode *child) -{ - GetImpl()->AstNodeSetParent(__context, child, __parentNode); -} - -static void SetRightParent(es2panda_AstNode *node, void *arg) -{ - es2panda_Context *ctx = static_cast(arg); - __context = ctx; - __parentNode = node; - - GetImpl()->AstNodeIterateConst(ctx, node, changeParent); -} - -KNativePointer impl_AstNodeUpdateAll(KNativePointer contextPtr, KNativePointer programPtr) { - auto context = reinterpret_cast(contextPtr); - auto program = reinterpret_cast(programPtr); - - GetImpl()->AstNodeForEach(program, SetRightParent, context); - return program; -} -KOALA_INTEROP_2(AstNodeUpdateAll, KNativePointer, KNativePointer, KNativePointer) - -KNativePointer impl_AstNodeUpdateChildren(KNativePointer contextPtr, KNativePointer nodePtr) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - __parentNode = node; - - GetImpl()->AstNodeIterateConst(context, node, changeParent); - return node; -} -KOALA_INTEROP_2(AstNodeUpdateChildren, KNativePointer, KNativePointer, KNativePointer) - -std::vector __children; - -static void visitChild(es2panda_AstNode *node) { - __children.emplace_back(node); -} - -KNativePointer impl_AstNodeChildren( - KNativePointer contextPtr, - KNativePointer nodePtr -) { - auto context = reinterpret_cast(contextPtr); - auto node = reinterpret_cast(nodePtr); - __context = context; - __children.clear(); - - GetImpl()->AstNodeIterateConst(context, node, visitChild); - return new std::vector(__children); -} -KOALA_INTEROP_2(AstNodeChildren, KNativePointer, KNativePointer, KNativePointer) - -/* ------------------------------------------------------------------------------------------------------------------------------ -*/ diff --git a/arkoala-arkts/libarkts/package.json b/arkoala-arkts/libarkts/package.json index 0cf06a583..020000556 100644 --- a/arkoala-arkts/libarkts/package.json +++ b/arkoala-arkts/libarkts/package.json @@ -14,7 +14,8 @@ "ts-loader": "^9.2.8", "tsconfig-paths-webpack-plugin": "^4.1.0", "typescript": "4.9.5", - "@koalaui/ets-tsc": "4.9.5-r4" + "@koalaui/ets-tsc": "4.9.5-r4", + "@panda/sdk": "next" }, "scripts": { "clean": "rimraf ./build && npm run clean:native && npm run clean:compatible", -- Gitee