From 3f891541751bbc0b041de30e017cde3d697cc93f Mon Sep 17 00:00:00 2001 From: ctw-ian Date: Thu, 7 Jul 2022 15:47:02 +0800 Subject: [PATCH] Fix incorrect column number in debug mode Fix incorrect column number of CallExpression and MemberAccessExpression Signed-off-by: ctw-ian Change-Id: I9b14990933405423755d97ca970943234cf77863 --- ts2panda/src/expression/callExpression.ts | 27 ++++++++++++++++--- .../src/expression/memberAccessExpression.ts | 6 ++++- ts2panda/tests/scope.test.ts | 13 ++++----- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/ts2panda/src/expression/callExpression.ts b/ts2panda/src/expression/callExpression.ts index ef5336575c..03347cc8fe 100644 --- a/ts2panda/src/expression/callExpression.ts +++ b/ts2panda/src/expression/callExpression.ts @@ -65,7 +65,11 @@ export function getHiddenParameters(expr: ts.Expression, compiler: Compiler) { if ((expr).expression.kind == ts.SyntaxKind.SuperKeyword) { compileSuperProperty(compiler, expr, thisReg, prop); } else { - pandaGen.loadObjProperty(expr, thisReg, prop); + pandaGen.loadObjProperty( + ts.isPropertyAccessExpression(expr) ? expr.name : (expr).argumentExpression, + thisReg, + prop + ); } pandaGen.storeAccumulator(expr, funcReg); args.push(...[funcReg, thisReg]); @@ -105,17 +109,32 @@ function emitCallArguments(compiler: Compiler, expr: ts.CallExpression, args: VR export function emitCall(expr: ts.CallExpression, args: VReg[], passThis: boolean, compiler: Compiler) { let pandaGen = compiler.getPandaGen(); let hasSpread = emitCallArguments(compiler, expr, args); + let callee = expr.expression; + let debugNode = undefined; + switch (callee.kind) { + case ts.SyntaxKind.ElementAccessExpression: { + debugNode = (callee).argumentExpression; + break; + } + case ts.SyntaxKind.PropertyAccessExpression: { + debugNode = (callee).name; + break; + } + default: { + debugNode = expr; + } + } if (!hasSpread) { - pandaGen.call(expr, [...args], passThis); + pandaGen.call(debugNode, [...args], passThis); return; } // spread argument exist - let callee = args[0]; + let calleeReg = args[0]; let thisReg = passThis ? args[1] : getVregisterCache(pandaGen, CacheList.undefined); let argArray = pandaGen.getTemp(); createArrayFromElements(expr, compiler, >expr.arguments, argArray); - pandaGen.callSpread(expr, callee, thisReg, argArray); + pandaGen.callSpread(debugNode, calleeReg, thisReg, argArray); pandaGen.freeTemps(argArray); } \ No newline at end of file diff --git a/ts2panda/src/expression/memberAccessExpression.ts b/ts2panda/src/expression/memberAccessExpression.ts index b50bbfbc8c..1183bb7bef 100644 --- a/ts2panda/src/expression/memberAccessExpression.ts +++ b/ts2panda/src/expression/memberAccessExpression.ts @@ -34,7 +34,11 @@ export function compileMemberAccessExpression(node: ts.ElementAccessExpression | compileSuperProperty(compiler, node, thisReg, property); pandaGen.freeTemps(thisReg); } else { - pandaGen.loadObjProperty(node, obj, property); + pandaGen.loadObjProperty( + ts.isPropertyAccessExpression(node) ? node.name : node.argumentExpression, + obj, + property + ); } pandaGen.freeTemps(objReg, propReg); diff --git a/ts2panda/tests/scope.test.ts b/ts2panda/tests/scope.test.ts index 85ef72aa12..077c531211 100644 --- a/ts2panda/tests/scope.test.ts +++ b/ts2panda/tests/scope.test.ts @@ -126,18 +126,15 @@ describe("ScopeTest", function () { }); it("test add 'none' variable to LocalScope", function () { - let parent = new FunctionScope(); + let parent = new GlobalScope(); let scope = new LocalScope(parent); let variable = scope.add("x", VarDeclarationKind.NONE); - expect(variable).to.be.equal(undefined); + expect(variable instanceof GlobalVariable).to.be.true; let { scope: sp, level: lv, v: outVariable } = scope.find("x"); - expect(outVariable).to.be.equal(undefined); - expect(lv).to.be.equal(0); - expect(sp).to.be.equal(undefined); + expect(outVariable === variable).to.be.true; let { scope: spParent, level: lvParent, v: outVariableParent } = parent.find("x"); - expect(outVariableParent).to.be.equal(undefined); - expect(lvParent).to.be.equal(0); - expect(spParent).to.be.equal(undefined); + expect(outVariableParent === variable).to.be.true; + expect(spParent instanceof GlobalScope).to.be.true; }); it("test add 'var' variable to LocalScope", function () { -- Gitee