From d7319528cdb53d5d01c2d1e915bb7ebffb4a3e0e Mon Sep 17 00:00:00 2001 From: huangyu Date: Mon, 14 Nov 2022 20:38:42 +0800 Subject: [PATCH 1/3] Fix wrong type record of method in object type Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/I5Y64A Signed-off-by: huangyu Change-Id: I214efc01d0e18191005bc96cf893f145ccb658a5 --- ts2panda/src/base/typeSystem.ts | 51 ++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/ts2panda/src/base/typeSystem.ts b/ts2panda/src/base/typeSystem.ts index 18a04e5132..5a3e0d8e30 100644 --- a/ts2panda/src/base/typeSystem.ts +++ b/ts2panda/src/base/typeSystem.ts @@ -760,6 +760,7 @@ export class ArrayType extends BaseType { export class ObjectType extends BaseType { private properties: Map = new Map(); + private methods: Array = new Array(); typeIndex: number = PrimitiveType.ANY; shiftedTypeIndex: number = PrimitiveType.ANY; @@ -767,16 +768,46 @@ export class ObjectType extends BaseType { super(); this.typeIndex = this.getIndexFromTypeArrayBuffer(new PlaceHolderType()); this.shiftedTypeIndex = this.typeIndex + literalBufferIndexShift; - this.fillInMembers(objNode); + this.fillInFieldsAndMethods(objNode); this.setTypeArrayBuffer(this, this.typeIndex); } - fillInMembers(objNode: ts.TypeLiteralNode) { - for (let member of objNode.members) { - let propertySig = member; - let name = member.name ? member.name.getText() : "#undefined"; - let typeIndex = this.getOrCreateRecordForTypeNode(propertySig.type, member.name); - this.properties.set(name, typeIndex); + private fillInMethods(member: ts.MethodSignature) { + if (this.typeChecker.isFromDefaultLib(member)) { + return; + } + let variableNode = member.name ? member.name : undefined; + let funcType = new FunctionType(member); + if (variableNode) { + this.setVariable2Type(variableNode, funcType.shiftedTypeIndex); + } + let typeIndex = this.tryGetTypeIndex(member); + this.methods.push(typeIndex!); + } + + private fillInFields(member) { + let propertySig = member; + let name = member.name ? member.name.getText() : "#undefined"; + let typeIndex = this.getOrCreateRecordForTypeNode(propertySig.type, member.name); + this.properties.set(name, typeIndex); + } + + private fillInFieldsAndMethods(objNode: ts.TypeLiteralNode) { + if (objNode.members) { + for (let member of objNode.members) { + switch (member.kind) { + case ts.SyntaxKind.MethodSignature: { + this.fillInMethods(member); + break; + } + case ts.SyntaxKind.PropertySignature: { + this.fillInFields(member); + break; + } + default: + break; + } + } } } @@ -789,6 +820,12 @@ export class ObjectType extends BaseType { objLiterals.push(new Literal(LiteralTag.STRING, name)); this.transferType2Literal(typeIndex, objLiterals); }); + if (this.method.legnth > 0) { + objLiterals.push(new Literal(LiteralTag.INTEGER, this.methods.length)); + this.methods.forEach(method => { + this.transferType2Literal(method, objLiterals); + }); + } objTypeBuf.addLiterals(...objLiterals); return objTypeBuf; } -- Gitee From edb5b3bce05ccf6e2ce7a230f650fda0399182df Mon Sep 17 00:00:00 2001 From: huangyu Date: Thu, 1 Dec 2022 14:48:51 +0800 Subject: [PATCH 2/3] Fix typos Signed-off-by: huangyu Change-Id: Ie1916e765c934f4b13d8ec1a6de6875762d3eb4d --- ts2panda/src/base/typeSystem.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/ts2panda/src/base/typeSystem.ts b/ts2panda/src/base/typeSystem.ts index 5a3e0d8e30..1c0f3d4095 100644 --- a/ts2panda/src/base/typeSystem.ts +++ b/ts2panda/src/base/typeSystem.ts @@ -796,14 +796,12 @@ export class ObjectType extends BaseType { if (objNode.members) { for (let member of objNode.members) { switch (member.kind) { - case ts.SyntaxKind.MethodSignature: { + case ts.SyntaxKind.MethodSignature: this.fillInMethods(member); break; - } - case ts.SyntaxKind.PropertySignature: { + case ts.SyntaxKind.PropertySignature: this.fillInFields(member); break; - } default: break; } @@ -820,7 +818,7 @@ export class ObjectType extends BaseType { objLiterals.push(new Literal(LiteralTag.STRING, name)); this.transferType2Literal(typeIndex, objLiterals); }); - if (this.method.legnth > 0) { + if (this.methods.length > 0) { objLiterals.push(new Literal(LiteralTag.INTEGER, this.methods.length)); this.methods.forEach(method => { this.transferType2Literal(method, objLiterals); -- Gitee From 5fa79555a2ad0e90f56db79d83271a2a399cc880 Mon Sep 17 00:00:00 2001 From: huangyu Date: Thu, 15 Dec 2022 10:02:46 +0800 Subject: [PATCH 3/3] Only record the total number of properties and methods to save abc size Signed-off-by: huangyu Change-Id: I1414154b3b288643d33610b0d723b175a6c7085a --- ts2panda/src/base/typeSystem.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/ts2panda/src/base/typeSystem.ts b/ts2panda/src/base/typeSystem.ts index 1c0f3d4095..780d81d46e 100644 --- a/ts2panda/src/base/typeSystem.ts +++ b/ts2panda/src/base/typeSystem.ts @@ -802,6 +802,10 @@ export class ObjectType extends BaseType { case ts.SyntaxKind.PropertySignature: this.fillInFields(member); break; + case ts.SyntaxKind.CallSignature: + case ts.SyntaxKind.ConstructSignature: + // Considering the complex cases of function overloads, call/construct signature is not recorded + case ts.SyntaxKind.IndexSignature: default: break; } @@ -813,17 +817,14 @@ export class ObjectType extends BaseType { let objTypeBuf = new LiteralBuffer(); let objLiterals: Array = new Array(); objLiterals.push(new Literal(LiteralTag.INTEGER, L2Type.OBJECT)); - objLiterals.push(new Literal(LiteralTag.INTEGER, this.properties.size)); + objLiterals.push(new Literal(LiteralTag.INTEGER, this.properties.size + this.methods.length)); this.properties.forEach((typeIndex, name) => { objLiterals.push(new Literal(LiteralTag.STRING, name)); this.transferType2Literal(typeIndex, objLiterals); }); - if (this.methods.length > 0) { - objLiterals.push(new Literal(LiteralTag.INTEGER, this.methods.length)); - this.methods.forEach(method => { - this.transferType2Literal(method, objLiterals); - }); - } + this.methods.forEach(method => { + this.transferType2Literal(method, objLiterals); + }); objTypeBuf.addLiterals(...objLiterals); return objTypeBuf; } -- Gitee