diff --git a/ts2panda/src/recorder.ts b/ts2panda/src/recorder.ts index da2bb579c17d08adb4356b9a7994304d184a6082..cc1f90981faddfb4ec33354a94447889324d6d69 100644 --- a/ts2panda/src/recorder.ts +++ b/ts2panda/src/recorder.ts @@ -628,19 +628,22 @@ export class Recorder { let funcName = funcId ? jshelpers.getTextOfIdentifierOrLiteral(funcId) : '*default*'; let moduleKind = isExport ? ModuleVarKind.EXPORTED : ModuleVarKind.NOT; let funcDecl = new FuncDecl(funcName, node, moduleKind); - 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 @@ -763,20 +766,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; } } } @@ -784,10 +784,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) {