From ac20ff8a7c44b705f047d2a072883988eb152845 Mon Sep 17 00:00:00 2001 From: hufeng Date: Sat, 2 Apr 2022 09:36:19 +0800 Subject: [PATCH] Fix duplicate-named function's declaration in Scope on Release Signed-off-by: hufeng Change-Id: Ia9bbf86e30bd76a9bc02909b757776177eb3406f --- ts2panda/src/recorder.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/ts2panda/src/recorder.ts b/ts2panda/src/recorder.ts index f428649bda..a43b71f8f3 100644 --- a/ts2panda/src/recorder.ts +++ b/ts2panda/src/recorder.ts @@ -444,19 +444,22 @@ export class Recorder { } let funcName = jshelpers.getTextOfIdentifierOrLiteral(funcId); let funcDecl = new FuncDecl(funcName, node); - scope.setDecls(funcDecl); let hoistScope = scope; + let need2AddDecls: boolean = true; if (scope instanceof GlobalScope || scope instanceof ModuleScope) { this.collectHoistDecls(node, hoistScope, funcDecl); } else if (scope instanceof LocalScope) { hoistScope = scope.getNearestVariableScope(); let expectHoistScope = this.getScopeOfNode(node.parent.parent); if ((hoistScope == expectHoistScope) && (hoistScope instanceof FunctionScope)) { - this.collectHoistDecls(node, hoistScope, funcDecl); + need2AddDecls = this.collectHoistDecls(node, hoistScope, funcDecl); } } else { LOGD("Function declaration", " in function is collected in its body block"); } + if (need2AddDecls) { + scope.setDecls(funcDecl); + } } private recordOtherFunc(node: ts.FunctionLikeDeclaration, scope: Scope) { // functionlikedecalration except function declaration @@ -578,20 +581,17 @@ export class Recorder { return parameter.dotDotDotToken ? true : false; } - private collectHoistDecls(node: ts.Node, scope: VariableScope, decl: Decl) { + private collectHoistDecls(node: ts.Node, scope: VariableScope, decl: Decl): boolean { let declName = decl.name; // if variable share a same name with the parameter of its contained function, it should not be hoisted if (scope instanceof FunctionScope) { let nearestFunc = jshelpers.getContainingFunctionDeclaration(node); - if (!nearestFunc) { - return; - } let functionParameters = this.getParametersOfFunction(nearestFunc); if (functionParameters) { for (let i = 0; i < functionParameters.length; i++) { if (functionParameters[i].name == declName) { - return; + return false; } } } @@ -599,10 +599,11 @@ export class Recorder { // Variable named of global identifier should not be hoisted. if (isGlobalIdentifier(declName) && (scope instanceof GlobalScope)) { - return; + return true; } this.setHoistMap(scope, decl); + return false; } setScopeMap(node: ts.Node, scope: Scope) { -- Gitee