From 3487ef24f361e67489454aad0a1e0550c1c8bf91 Mon Sep 17 00:00:00 2001 From: huangyu Date: Thu, 15 Sep 2022 16:30:12 +0800 Subject: [PATCH] Fix bug for ts2abc type recording Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/I5QD67 Signed-off-by: huangyu Change-Id: I97a7673c27fdcd36cd7876f2943edc30bc731579 --- ...ingLiteralTypesOverloadAssignability04.txt | 4 +- ...ringLiteralTypesWithVariousOperators01.txt | 4 +- ts2panda/src/ts2panda.ts | 3 +- ts2panda/src/typeChecker.ts | 45 ++++++++++++++++--- 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/testTs/expect/types/stringLiteral/stringLiteralTypesOverloadAssignability04.txt b/testTs/expect/types/stringLiteral/stringLiteralTypesOverloadAssignability04.txt index e23e1f08fc..a8abf45fe2 100644 --- a/testTs/expect/types/stringLiteral/stringLiteralTypesOverloadAssignability04.txt +++ b/testTs/expect/types/stringLiteral/stringLiteralTypesOverloadAssignability04.txt @@ -1,2 +1,2 @@ -{'lb': [{'t': 2, 'v': 3}, {'t': 2, 'v': 0}, {'t': 5, 'v': 'f'}, {'t': 2, 'v': 0}, {'t': 2, 'v': 1}, {'t': 2, 'v': 0}, {'t': 2, 'v': 1}]} -{'lb': [{'t': 2, 'v': 3}, {'t': 2, 'v': 0}, {'t': 5, 'v': 'g'}, {'t': 2, 'v': 0}, {'t': 2, 'v': 1}, {'t': 2, 'v': 0}, {'t': 2, 'v': 1}]} +{'lb': [{'t': 2, 'v': 3}, {'t': 2, 'v': 0}, {'t': 5, 'v': 'f'}, {'t': 2, 'v': 0}, {'t': 2, 'v': 1}, {'t': 2, 'v': 4}, {'t': 2, 'v': 1}]} +{'lb': [{'t': 2, 'v': 3}, {'t': 2, 'v': 0}, {'t': 5, 'v': 'g'}, {'t': 2, 'v': 0}, {'t': 2, 'v': 1}, {'t': 2, 'v': 4}, {'t': 2, 'v': 1}]} diff --git a/testTs/expect/types/stringLiteral/stringLiteralTypesWithVariousOperators01.txt b/testTs/expect/types/stringLiteral/stringLiteralTypesWithVariousOperators01.txt index a9b36377ef..89c859a6aa 100644 --- a/testTs/expect/types/stringLiteral/stringLiteralTypesWithVariousOperators01.txt +++ b/testTs/expect/types/stringLiteral/stringLiteralTypesWithVariousOperators01.txt @@ -1,2 +1,2 @@ -{'lb': [{'t': 2, 'v': 4}, {'t': 2, 'v': 2}, {'t': 2, 'v': 0}, {'t': 2, 'v': 0}]} -{'lb': [{'t': 2, 'v': 4}, {'t': 2, 'v': 3}, {'t': 2, 'v': 0}, {'t': 2, 'v': 0}, {'t': 2, 'v': 1}]} +{'lb': [{'t': 2, 'v': 4}, {'t': 2, 'v': 2}, {'t': 2, 'v': 4}, {'t': 2, 'v': 4}]} +{'lb': [{'t': 2, 'v': 4}, {'t': 2, 'v': 3}, {'t': 2, 'v': 4}, {'t': 2, 'v': 4}, {'t': 2, 'v': 1}]} diff --git a/ts2panda/src/ts2panda.ts b/ts2panda/src/ts2panda.ts index ce26b5286e..190871169d 100644 --- a/ts2panda/src/ts2panda.ts +++ b/ts2panda/src/ts2panda.ts @@ -171,8 +171,9 @@ export class Ts2Panda { let literalArrays = PandaGen.getLiteralArrayBuffer(); if (CmdOptions.enableTypeLog()) { console.log("-------- LiteralArrayBuffer --------"); + const util = require('util'); for (let e of PandaGen.getLiteralArrayBuffer()) { - console.log(JSON.parse(JSON.stringify(e))); + console.log(util.inspect(JSON.parse(JSON.stringify(e)), { maxArrayLength: null })); } } diff --git a/ts2panda/src/typeChecker.ts b/ts2panda/src/typeChecker.ts index a9ec53df8f..aca8fd8283 100644 --- a/ts2panda/src/typeChecker.ts +++ b/ts2panda/src/typeChecker.ts @@ -195,6 +195,22 @@ export class TypeChecker { } } + public getTypeForLiteralTypeNode(node: ts.Node) { + switch (node.kind) { + case ts.SyntaxKind.NumericLiteral: + return PrimitiveType.NUMBER; + case ts.SyntaxKind.TrueKeyword: + case ts.SyntaxKind.FalseKeyword: + return PrimitiveType.BOOLEAN; + case ts.SyntaxKind.StringLiteral: + return PrimitiveType.STRING; + case ts.SyntaxKind.NullKeyword: + return PrimitiveType.NULL; + default: + return PrimitiveType.ANY; + } + } + public getTypeFromAnotation(typeNode: ts.TypeNode | undefined) { if (!typeNode) { return PrimitiveType.ANY; @@ -206,13 +222,15 @@ export class TypeChecker { case ts.SyntaxKind.SymbolKeyword: case ts.SyntaxKind.UndefinedKeyword: case ts.SyntaxKind.VoidKeyword: - case ts.SyntaxKind.LiteralType: let typeName = typeNode.getText().toUpperCase(); let typeIndex = PrimitiveType.ANY; if (typeName && typeName in PrimitiveType) { typeIndex = PrimitiveType[typeName as keyof typeof PrimitiveType]; } return typeIndex; + case ts.SyntaxKind.LiteralType: + let literalType = (typeNode).literal; + return this.getTypeForLiteralTypeNode(literalType); case ts.SyntaxKind.UnionType: let unionType = new UnionType(typeNode); return unionType.shiftedTypeIndex; @@ -229,6 +247,17 @@ export class TypeChecker { case ts.SyntaxKind.TypeLiteral: let objectType = new ObjectType(typeNode); return objectType.shiftedTypeIndex; + case ts.SyntaxKind.TypeReference: + let typeIdentifier = (typeNode).typeName; + let typeIdentifierName = jshelpers.getTextOfIdentifierOrLiteral(typeIdentifier); + if (BuiltinType[typeIdentifierName]) { + let declNode = this.getDeclNodeForInitializer(typeIdentifier); + if (declNode && ts.isClassLike(declNode)) { + return this.getBuiltinTypeIndex(typeNode, typeIdentifierName); + } else { + return BuiltinType[typeIdentifierName]; + } + } default: return PrimitiveType.ANY; } @@ -262,10 +291,8 @@ export class TypeChecker { return this.getOrCreateInstanceType(builtinContainerTypeIdx); } - getBuiltinTypeIndex(expr: ts.NewExpression) { - let origExprNode = ts.getOriginalNode(expr); - let name = origExprNode.expression.getFullText().replace(/\s/g, ""); - let typeArguments = origExprNode.typeArguments; + getBuiltinTypeIndex(node: ts.NewExpression | ts.TypeReferenceNode, name: string) { + let typeArguments = node.typeArguments; if (typeArguments) { let typeArgIdxs = new Array(); for(let typeArg of typeArguments) { @@ -281,6 +308,12 @@ export class TypeChecker { return this.getOrCreateInstanceType(BuiltinType[name]); } + getBuiltinTypeIndexForExpr(expr: ts.NewExpression) { + let origExprNode = ts.getOriginalNode(expr); + let name = origExprNode.expression.getFullText().replace(/\s/g, ""); + return this.getBuiltinTypeIndex(origExprNode, name); + } + public getOrCreateRecordForDeclNode(initializer: ts.Node | undefined, variableNode?: ts.Node) { if (!initializer) { return PrimitiveType.ANY; @@ -288,7 +321,7 @@ export class TypeChecker { let typeIndex = PrimitiveType.ANY; if (initializer.kind == ts.SyntaxKind.NewExpression && this.isBuiltinType(initializer)) { - typeIndex = this.getBuiltinTypeIndex(initializer); + typeIndex = this.getBuiltinTypeIndexForExpr(initializer); } else { let declNode = this.getDeclNodeForInitializer(initializer); typeIndex = this.getTypeFromDecl(declNode, initializer.kind == ts.SyntaxKind.NewExpression); -- Gitee