From d6089af22534b8631e75f2fb6b8797f5e306071c Mon Sep 17 00:00:00 2001 From: k8w Date: Sat, 8 Jan 2022 05:13:29 +0000 Subject: [PATCH 01/15] Fixed spelling mistake --- doc/cn/CompilerPhaseDescription.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/cn/CompilerPhaseDescription.md b/doc/cn/CompilerPhaseDescription.md index 00e9f947ff..3bd1244dac 100644 --- a/doc/cn/CompilerPhaseDescription.md +++ b/doc/cn/CompilerPhaseDescription.md @@ -15,7 +15,7 @@ 不同于MapleModulePhase,MapleFunctionPhase是一个模板类,主要是因为Maple中有不同层次的函数级IR。中端的优化phase和后端的优化phase都是该类的派生类。 -### phae的内存管理 +### phase的内存管理 方舟编译器的phasemanager可以对内存进行有效的管理,以便每个phase可以保留可能被其他phase依赖的分析结果;以及丢弃失效的结果。每个phasemanager中提供一个AnalysisDataManager类(多线程时,每个线程对应一个AnalysisDataManager)用来存储分析结果。为了实现这个功能,每个phase需要实现GetAnalysisDependence函数。如下: -- Gitee From 9277dba7c3cd1226732835d61318bd0709beaf14 Mon Sep 17 00:00:00 2001 From: Yan Zhang Date: Sun, 9 Jan 2022 15:05:43 -0800 Subject: [PATCH 02/15] Update test case class-deco4.ts to initialize the data property with a literal object --- src/MapleFE/test/typescript/unit_tests/class-deco4.ts | 2 +- .../test/typescript/unit_tests/class-deco4.ts.result | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/MapleFE/test/typescript/unit_tests/class-deco4.ts b/src/MapleFE/test/typescript/unit_tests/class-deco4.ts index 063acd21db..9174fb8079 100644 --- a/src/MapleFE/test/typescript/unit_tests/class-deco4.ts +++ b/src/MapleFE/test/typescript/unit_tests/class-deco4.ts @@ -8,7 +8,7 @@ function class_deco(name: string): Function { @class_deco('Klass') class Klass { data: - {} = {}; + {n: number} = {n : 123}; public dump (value: number) { switch (value) { diff --git a/src/MapleFE/test/typescript/unit_tests/class-deco4.ts.result b/src/MapleFE/test/typescript/unit_tests/class-deco4.ts.result index 83a2de7361..b52fdf7351 100644 --- a/src/MapleFE/test/typescript/unit_tests/class-deco4.ts.result +++ b/src/MapleFE/test/typescript/unit_tests/class-deco4.ts.result @@ -1,7 +1,7 @@ Matched 38 tokens. -Matched 84 tokens. -Matched 94 tokens. -Matched 101 tokens. +Matched 90 tokens. +Matched 100 tokens. +Matched 107 tokens. ============= Module =========== == Sub Tree == func class_deco(name) throws: @@ -13,7 +13,7 @@ func class_deco(name) throws: == Sub Tree == class Klass Fields: - data= {} + data= {n:123} Instance Initializer: Constructors: Methods: -- Gitee From f8b2e91081870663bae1db13e1c02fc295b2b583 Mon Sep 17 00:00:00 2001 From: eching Date: Mon, 10 Jan 2022 00:25:11 -0800 Subject: [PATCH 03/15] Simplify class ctor init. --- src/MapleFE/ast2cpp/src/cpp_definition.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MapleFE/ast2cpp/src/cpp_definition.cpp b/src/MapleFE/ast2cpp/src/cpp_definition.cpp index e35dea4fc2..3531572c72 100644 --- a/src/MapleFE/ast2cpp/src/cpp_definition.cpp +++ b/src/MapleFE/ast2cpp/src/cpp_definition.cpp @@ -31,7 +31,7 @@ std::string CppDef::EmitCtorInstance(ClassNode *c) { proto.insert(0, "&"s, 0, std::string::npos); } str = "\n// Init class ctor as a static class field for "+ thisClass+ "\n"s; - str += thisClass + "::Ctor "s + thisClass+"::ctor = " + thisClass + "::Ctor("s +ctor+","s+proto+","+prototypeProto+");\n\n"s; + str += thisClass + "::Ctor "s + thisClass+"::ctor("s +ctor+","s+proto+","+prototypeProto+");\n\n"s; // piggy back generation of static field definition for (unsigned i = 0; i < c->GetFieldsNum(); ++i) { -- Gitee From f260652ee623f7af03768fb6026708d7e8983024 Mon Sep 17 00:00:00 2001 From: Wen HU Date: Mon, 10 Jan 2022 12:20:34 -0500 Subject: [PATCH 04/15] process import/export subnodes of import/export node while searching for modules involved --- src/MapleFE/ast2cpp/src/a2c_util.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/MapleFE/ast2cpp/src/a2c_util.cpp b/src/MapleFE/ast2cpp/src/a2c_util.cpp index 91fc4b5a43..4b272e6859 100644 --- a/src/MapleFE/ast2cpp/src/a2c_util.cpp +++ b/src/MapleFE/ast2cpp/src/a2c_util.cpp @@ -43,21 +43,31 @@ std::string ImportedFiles::GetTargetFilename(TreeNode *node) { ImportNode *ImportedFiles::VisitImportNode(ImportNode *node) { std::string name = GetTargetFilename(node->GetTarget()); - if (!name.empty()) - mFilenames.push_back(name); - for (unsigned i = 0; i < node->GetPairsNum(); ++i) + if (!name.empty()) { + mFilenames.push_back(name); + } + for (unsigned i = 0; i < node->GetPairsNum(); ++i) { if (auto x = node->GetPair(i); x->IsSingle()) { std::string s = GetTargetFilename(x->GetBefore()); if (!s.empty()) mFilenames.push_back(s); } + } + for (unsigned i = 0; i < node->GetPairsNum(); i++) { + XXportAsPairNode *pair = node->GetPair(i); + (void) AstVisitor::VisitTreeNode(pair); + } return node; } ExportNode *ImportedFiles::VisitExportNode(ExportNode *node) { std::string name = GetTargetFilename(node->GetTarget()); if (!name.empty()) - mFilenames.push_back(name); + mFilenames.push_back(name); + for (unsigned i = 0; i < node->GetPairsNum(); i++) { + XXportAsPairNode *pair = node->GetPair(i); + (void) AstVisitor::VisitTreeNode(pair); + } return node; } } -- Gitee From 4a3ef37381f6bd3a1f68254f33134fbc86e0adae Mon Sep 17 00:00:00 2001 From: Wen HU Date: Mon, 10 Jan 2022 13:54:48 -0500 Subject: [PATCH 05/15] set type for import module node --- src/MapleFE/astopt/src/ast_xxport.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/MapleFE/astopt/src/ast_xxport.cpp b/src/MapleFE/astopt/src/ast_xxport.cpp index 6b7695186d..43e28d1173 100644 --- a/src/MapleFE/astopt/src/ast_xxport.cpp +++ b/src/MapleFE/astopt/src/ast_xxport.cpp @@ -435,6 +435,14 @@ void AST_XXport::UpdateDependency(unsigned hidx, TreeNode *node) { // update handler dependency map unsigned dep = GetHandleIdxFromStrIdx(stridx); mHandlerIdx2DependentHandlerIdxMap[hidx].insert(dep); + + if (node->IsImport()) { + Module_Handler *handler = mASTHandler->GetModuleHandler(dep); + ModuleNode *module = handler->GetASTModule(); + + node->SetTypeId(module->GetTypeId()); + node->SetTypeIdx(module->GetTypeIdx()); + } } } -- Gitee From 165b376a573261155f9065ec9fc7fc3bab658553 Mon Sep 17 00:00:00 2001 From: Wen HU Date: Mon, 10 Jan 2022 14:01:45 -0500 Subject: [PATCH 06/15] set enum field typeidx --- src/MapleFE/astopt/src/ast_ti.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/MapleFE/astopt/src/ast_ti.cpp b/src/MapleFE/astopt/src/ast_ti.cpp index 8325ff3b0d..eeced273c0 100644 --- a/src/MapleFE/astopt/src/ast_ti.cpp +++ b/src/MapleFE/astopt/src/ast_ti.cpp @@ -1537,15 +1537,22 @@ StructNode *TypeInferVisitor::VisitStructNode(StructNode *node) { } if (node->GetProp() == SProp_TSEnum) { TypeId tid = TY_None; + unsigned tidx = 0; for (unsigned i = 0; i < node->GetFieldsNum(); ++i) { TreeNode *t = node->GetField(i); tid = MergeTypeId(tid, t->GetTypeId()); + tidx = MergeTypeIdx(tidx, t->GetTypeIdx()); } for (unsigned i = 0; i < node->GetFieldsNum(); ++i) { TreeNode *t = node->GetField(i); SetTypeId(t, tid); + SetTypeIdx(t, tidx); + } + TreeNode *id = node->GetStructId(); + if (id) { + SetTypeId(id, node->GetTypeId()); + SetTypeIdx(id, node->GetTypeIdx()); } - SetTypeId(node, tid); } (void) AstVisitor::VisitStructNode(node); return node; -- Gitee From fe24a7aa33916e271006f5042c0df1a051c71d4f Mon Sep 17 00:00:00 2001 From: Yan Zhang Date: Mon, 10 Jan 2022 15:01:51 -0800 Subject: [PATCH 07/15] Handle more import cases for extracting dependencies --- src/MapleFE/test/typescript/ts2cxx-test.sh | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/MapleFE/test/typescript/ts2cxx-test.sh b/src/MapleFE/test/typescript/ts2cxx-test.sh index cc5fd7add3..33897fa18f 100755 --- a/src/MapleFE/test/typescript/ts2cxx-test.sh +++ b/src/MapleFE/test/typescript/ts2cxx-test.sh @@ -41,22 +41,14 @@ for f in $list; do (set -x while true; do $TS2AST $f || { echo "(ts2ast)$f" >> ts2cpp.failures.out; break; } - dep=$(grep "^[ei][xm]port.* from " "$f" | sed "s/^ *[ei][xm]port.* from .\([^'\"]*\).*/\1.cpp/" | sort -u) - if [ -z $dep ]; then -# dep=$(grep "^[ei][xm]port.* require" "$f" | sed "s/^ *[ei][xm]port.* require *\([^();\"]*\)/\1.cpp/" | sort -u) - dep=$(grep "^[ei][xm]port.* require" "$f" | sed "s/^ *[ei][xm]port.* require(\"\(.*\)\");/\1.cpp/" | sort -u) - fi -echo $dep > xxx + dep=$(sed 's/[ ,:|]\(import(\)/\n\1/g' "$f" | grep -E "^ *[ei][xm]port.*( from |require|\( *['\"])" | \ + sed -r "s/^ *[ei][xm]port.*( from |require *\(|\() *['\"]([^'\"]*).*/\2.cpp/" | sort -u) for cpp in $dep; do ts=$(sed 's/\.cpp/.ts/' <<< "$cpp") $TS2AST $ts - dep="$dep "$(grep "^[ei][xm]port.* from " "$ts" | sed "s/^ *[ei][xm]port.* from .\([^'\"]*\).*/\1.cpp/" | sort -u) - if [ -z $dep ]; then -# dep=$(grep "^[ei][xm]port.* require" "$f" | sed "s/^ *[ei][xm]port.* require *\([^();\"]*\)/\1.cpp/" | sort -u) - dep=$(grep "^[ei][xm]port.* require" "$f" | sed "s/^ *[ei][xm]port.* require(\"\(.*\)\");/\1.cpp/" | sort -u) - fi + dep="$dep "$(sed 's/[ ,:|]\(import(\)/\n\1/g' "$ts" | grep -E "^ *[ei][xm]port.*( from |require|\( *['\"])" | \ + sed -r "s/^ *[ei][xm]port.*( from |require *\(|\() *['\"]([^'\"]*).*/\2.cpp/" | sort -u) done -echo $dep >> xxx dep=$(echo $dep | xargs -n1 | sort -u) $AST2CPP $f.ast || { echo "(ast2cpp)$f" >> ts2cpp.failures.out; break; } g++ -std=c++17 -g -I$RTINC -I$ASTINC $t.cpp $RTSRC/*.cpp $dep -o $t.out || { echo "(g++)$f" >> ts2cpp.failures2.out; break; } -- Gitee From 1ef94b0950f33511c7bcf2d1cbadc4ef61d355e7 Mon Sep 17 00:00:00 2001 From: Yan Zhang Date: Mon, 10 Jan 2022 15:52:56 -0800 Subject: [PATCH 08/15] Handle ImportNode probably if it is a child node of a TypeOfNode --- src/MapleFE/ast2cpp/src/emitter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MapleFE/ast2cpp/src/emitter.cpp b/src/MapleFE/ast2cpp/src/emitter.cpp index d961d2ae76..91d66224c3 100644 --- a/src/MapleFE/ast2cpp/src/emitter.cpp +++ b/src/MapleFE/ast2cpp/src/emitter.cpp @@ -594,7 +594,7 @@ std::string Emitter::EmitImportNode(ImportNode *node) { str += " from "s + s; else { auto p = node->GetParent(); - if (p && p->IsField()) + if (p && (p->IsField() || p->IsTypeOf())) str += '(' + s + ')'; else str += s; -- Gitee From 05182f72713e4701f9713e580d6723a21c99a857 Mon Sep 17 00:00:00 2001 From: Wen HU Date: Tue, 11 Jan 2022 09:59:04 -0500 Subject: [PATCH 09/15] skip adding type for existing classes in UserTypeNode --- src/MapleFE/astopt/src/ast_scp.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/MapleFE/astopt/src/ast_scp.cpp b/src/MapleFE/astopt/src/ast_scp.cpp index cd2f46565c..4c101784c7 100644 --- a/src/MapleFE/astopt/src/ast_scp.cpp +++ b/src/MapleFE/astopt/src/ast_scp.cpp @@ -477,7 +477,14 @@ UserTypeNode *BuildScopeVisitor::VisitUserTypeNode(UserTypeNode *node) { if (p->IsScope()) { // normal type decl - AddType(scope, node); + // check if it is already in typetable + TreeNode *id = node->GetId(); + if (id) { + TreeNode *decl = scope->FindTypeOf(id->GetStrIdx()); + if (!decl) { + AddType(scope, node); + } + } } } return node; -- Gitee From f9a2c4458a634f0ff0b93b3e82169182bbc9cc9a Mon Sep 17 00:00:00 2001 From: Wen HU Date: Tue, 11 Jan 2022 10:25:15 -0500 Subject: [PATCH 10/15] support castnode in ti --- src/MapleFE/astopt/include/ast_ti.h | 1 + src/MapleFE/astopt/src/ast_ti.cpp | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/src/MapleFE/astopt/include/ast_ti.h b/src/MapleFE/astopt/include/ast_ti.h index 7832681c32..e716c5592b 100644 --- a/src/MapleFE/astopt/include/ast_ti.h +++ b/src/MapleFE/astopt/include/ast_ti.h @@ -165,6 +165,7 @@ class TypeInferVisitor : public TypeInferBaseVisitor { ArrayLiteralNode *VisitArrayLiteralNode(ArrayLiteralNode *node); BinOperatorNode *VisitBinOperatorNode(BinOperatorNode *node); CallNode *VisitCallNode(CallNode *node); + CastNode *VisitCastNode(CastNode *node); ClassNode *VisitClassNode(ClassNode *node); CondBranchNode *VisitCondBranchNode(CondBranchNode *node); DeclNode *VisitDeclNode(DeclNode *node); diff --git a/src/MapleFE/astopt/src/ast_ti.cpp b/src/MapleFE/astopt/src/ast_ti.cpp index eeced273c0..e908280bae 100644 --- a/src/MapleFE/astopt/src/ast_ti.cpp +++ b/src/MapleFE/astopt/src/ast_ti.cpp @@ -1066,6 +1066,13 @@ CallNode *TypeInferVisitor::VisitCallNode(CallNode *node) { return node; } +CastNode *TypeInferVisitor::VisitCastNode(CastNode *node) { + (void) AstVisitor::VisitCastNode(node); + TreeNode *dest = node->GetDestType(); + SetTypeId(node, dest); + return node; +} + ClassNode *TypeInferVisitor::VisitClassNode(ClassNode *node) { if (mFlags & FLG_trace_1) std::cout << "Visiting ClassNode, id=" << node->GetNodeId() << "..." << std::endl; UpdateTypeId(node, TY_Class); -- Gitee From d16dca61bfd61058979094fcec7572bdc0c1ed4d Mon Sep 17 00:00:00 2001 From: Wen HU Date: Tue, 11 Jan 2022 12:51:03 -0500 Subject: [PATCH 11/15] utilize typeidx of upper to handle fields --- src/MapleFE/astopt/src/ast_ti.cpp | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/src/MapleFE/astopt/src/ast_ti.cpp b/src/MapleFE/astopt/src/ast_ti.cpp index e908280bae..de030a66de 100644 --- a/src/MapleFE/astopt/src/ast_ti.cpp +++ b/src/MapleFE/astopt/src/ast_ti.cpp @@ -1451,26 +1451,15 @@ IdentifierNode *TypeInferVisitor::VisitIdentifierNode(IdentifierNode *node) { decl = mHandler->FindDecl(node, true); } } else if (node == fld) { - if (upper->IsIdentifier()) { - if (upper->IsThis()) { - decl = upper; + TreeNode *cls = gTypeTable.GetTypeFromTypeIdx(upper->GetTypeIdx()); + if (cls) { + scope = cls->GetScope(); + + // for imported decl, need trace down the import/export chain + if (decl && mXXport->IsImportedDeclId(mHandler->GetHidx(), decl->GetNodeId())) { + decl = scope->FindExportedDeclOf(node->GetStrIdx()); } else { - decl = mHandler->FindDecl(static_cast(upper), true); - } - if (decl) { - unsigned tidx = decl->GetTypeIdx(); - if (tidx) { - TreeNode *declt = gTypeTable.GetTypeFromTypeIdx(tidx); - scope = declt->GetScope(); - } else { - scope = decl->GetScope(); - } - // for imported decl, need trace down the import/export chain - if (mXXport->IsImportedDeclId(mHandler->GetHidx(), decl->GetNodeId())) { - decl = scope->FindExportedDeclOf(node->GetStrIdx()); - } else { - decl = scope->FindDeclOf(node->GetStrIdx()); - } + decl = scope->FindDeclOf(node->GetStrIdx()); } } } else { -- Gitee From 0c0ac5a3447d9eb4167640d214fb25c30899d0d4 Mon Sep 17 00:00:00 2001 From: Wen HU Date: Tue, 11 Jan 2022 13:28:48 -0500 Subject: [PATCH 12/15] support AsTypeNode in ti --- src/MapleFE/astopt/include/ast_ti.h | 1 + src/MapleFE/astopt/src/ast_ti.cpp | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/MapleFE/astopt/include/ast_ti.h b/src/MapleFE/astopt/include/ast_ti.h index e716c5592b..79b28276a0 100644 --- a/src/MapleFE/astopt/include/ast_ti.h +++ b/src/MapleFE/astopt/include/ast_ti.h @@ -163,6 +163,7 @@ class TypeInferVisitor : public TypeInferBaseVisitor { ArrayElementNode *VisitArrayElementNode(ArrayElementNode *node); ArrayLiteralNode *VisitArrayLiteralNode(ArrayLiteralNode *node); + AsTypeNode *VisitAsTypeNode(AsTypeNode *node); BinOperatorNode *VisitBinOperatorNode(BinOperatorNode *node); CallNode *VisitCallNode(CallNode *node); CastNode *VisitCastNode(CastNode *node); diff --git a/src/MapleFE/astopt/src/ast_ti.cpp b/src/MapleFE/astopt/src/ast_ti.cpp index de030a66de..1a21909423 100644 --- a/src/MapleFE/astopt/src/ast_ti.cpp +++ b/src/MapleFE/astopt/src/ast_ti.cpp @@ -1073,6 +1073,21 @@ CastNode *TypeInferVisitor::VisitCastNode(CastNode *node) { return node; } +AsTypeNode *TypeInferVisitor::VisitAsTypeNode(AsTypeNode *node) { + (void) AstVisitor::VisitAsTypeNode(node); + TreeNode *dest = node->GetType(); + SetTypeId(node, dest); + + TreeNode *parent = node->GetParent(); + if (parent) { + // pass to parent, need refine if multiple AsTypeNode + if (parent->GetAsTypesNum() == 1 && parent->GetAsTypeAtIndex(0) == node) { + SetTypeId(parent, dest); + } + } + return node; +} + ClassNode *TypeInferVisitor::VisitClassNode(ClassNode *node) { if (mFlags & FLG_trace_1) std::cout << "Visiting ClassNode, id=" << node->GetNodeId() << "..." << std::endl; UpdateTypeId(node, TY_Class); -- Gitee From d0e6a1ec88f4db5e3a75e2bb68033f937ce05a48 Mon Sep 17 00:00:00 2001 From: Yan Zhang Date: Tue, 11 Jan 2022 11:21:46 -0800 Subject: [PATCH 13/15] Add a test case with dynamic import() --- src/MapleFE/test/typescript/unit_tests/import-promise.ts | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/MapleFE/test/typescript/unit_tests/import-promise.ts diff --git a/src/MapleFE/test/typescript/unit_tests/import-promise.ts b/src/MapleFE/test/typescript/unit_tests/import-promise.ts new file mode 100644 index 0000000000..9e3ee013a7 --- /dev/null +++ b/src/MapleFE/test/typescript/unit_tests/import-promise.ts @@ -0,0 +1,2 @@ +import("./M").then(() => { console.log("Completed") } ); + -- Gitee From cb64bf7d5e45ce343f397dc85b7e21ff87d5a99e Mon Sep 17 00:00:00 2001 From: Yan Zhang Date: Tue, 11 Jan 2022 11:38:14 -0800 Subject: [PATCH 14/15] Add a test case with 'import' as a method name --- src/MapleFE/test/typescript/unit_tests/import-as-prop-name.ts | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/MapleFE/test/typescript/unit_tests/import-as-prop-name.ts diff --git a/src/MapleFE/test/typescript/unit_tests/import-as-prop-name.ts b/src/MapleFE/test/typescript/unit_tests/import-as-prop-name.ts new file mode 100644 index 0000000000..98e0884aa5 --- /dev/null +++ b/src/MapleFE/test/typescript/unit_tests/import-as-prop-name.ts @@ -0,0 +1,3 @@ +declare interface Load { + import(n: string, o?: string): Promise; +} -- Gitee From 33fa1765adf4a4c391c69dc05c994500ecaaeca4 Mon Sep 17 00:00:00 2001 From: Yan Zhang Date: Tue, 11 Jan 2022 11:56:44 -0800 Subject: [PATCH 15/15] Add a test case which exports a function as 'import' --- .../test/typescript/unit_tests/export-func-as-import.ts | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/MapleFE/test/typescript/unit_tests/export-func-as-import.ts diff --git a/src/MapleFE/test/typescript/unit_tests/export-func-as-import.ts b/src/MapleFE/test/typescript/unit_tests/export-func-as-import.ts new file mode 100644 index 0000000000..93c7e958e8 --- /dev/null +++ b/src/MapleFE/test/typescript/unit_tests/export-func-as-import.ts @@ -0,0 +1,4 @@ +function func(n: string, o?: string): Promise { + return new Promise((resolve, reject) => { resolve("OK"); }); +} +export { func as import }; -- Gitee