From b4e839a2f755e788b057ac1591115c02257425d2 Mon Sep 17 00:00:00 2001 From: huangyu Date: Thu, 23 Mar 2023 17:05:24 +0800 Subject: [PATCH] fixed 940c606 from https://gitee.com/huangyu76/arkcompiler_ets_frontend/pulls/942 Record abstract modifier for methods Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/I6PNDJ Test: Add type system test ./testTs/test/classes/mixinAbstractClasses.ts Signed-off-by: huangyu Change-Id: Id71a8032df19e5302ce69472da7782d2e2c6152b --- .../expect/classes/mixinAbstractClasses.txt | 13 ++++++++++ testTs/skip_tests.json | 3 +-- ts2panda/src/base/typeSystem.ts | 25 +++++++++++-------- 3 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 testTs/expect/classes/mixinAbstractClasses.txt diff --git a/testTs/expect/classes/mixinAbstractClasses.txt b/testTs/expect/classes/mixinAbstractClasses.txt new file mode 100644 index 0000000000..007190ee8a --- /dev/null +++ b/testTs/expect/classes/mixinAbstractClasses.txt @@ -0,0 +1,13 @@ +{'lb': [{'t': 2, 'v': 3}, {'t': 2, 'v': 0}, {'t': 5, 'v': 'Mixin'}, {'t': 2, 'v': 0}, {'t': 2, 'v': 1}, {'t': 25, 'v': 0}, {'t': 25, 'v': 0}], 'k': '_1'} +{'lb': [{'t': 2, 'v': 1}, {'t': 2, 'v': 1}, {'t': 25, 'v': 0}, {'t': 2, 'v': 1}, {'t': 25, 'v': 0}, {'t': 2, 'v': 0}, {'t': 2, 'v': 1}, {'t': 5, 'v': 'mixinMethod'}, {'t': 24, 'v': '_3'}, {'t': 2, 'v': 0}, {'t': 2, 'v': 0}], 'k': '_2'} +{'lb': [{'t': 2, 'v': 3}, {'t': 2, 'v': 0}, {'t': 5, 'v': 'mixinMethod'}, {'t': 2, 'v': 0}, {'t': 2, 'v': 0}, {'t': 25, 'v': 0}], 'k': '_3'} +{'lb': [{'t': 2, 'v': 1}, {'t': 2, 'v': 0}, {'t': 25, 'v': 0}, {'t': 2, 'v': 0}, {'t': 2, 'v': 0}, {'t': 2, 'v': 1}, {'t': 5, 'v': 'baseMethod'}, {'t': 24, 'v': '_5'}, {'t': 2, 'v': 0}, {'t': 2, 'v': 0}], 'k': '_4'} +{'lb': [{'t': 2, 'v': 3}, {'t': 2, 'v': 0}, {'t': 5, 'v': 'baseMethod'}, {'t': 2, 'v': 0}, {'t': 2, 'v': 0}, {'t': 25, 'v': 0}], 'k': '_5'} +{'lb': [{'t': 2, 'v': 2}, {'t': 24, 'v': '_4'}], 'k': '_6'} +{'lb': [{'t': 2, 'v': 1}, {'t': 2, 'v': 1}, {'t': 25, 'v': 0}, {'t': 2, 'v': 0}, {'t': 2, 'v': 0}, {'t': 2, 'v': 1}, {'t': 5, 'v': 'abstractBaseMethod'}, {'t': 24, 'v': '_8'}, {'t': 2, 'v': 0}, {'t': 2, 'v': 0}], 'k': '_7'} +{'lb': [{'t': 2, 'v': 3}, {'t': 2, 'v': 64}, {'t': 5, 'v': 'abstractBaseMethod'}, {'t': 2, 'v': 0}, {'t': 2, 'v': 0}, {'t': 25, 'v': 3}], 'k': '_8'} +{'lb': [{'t': 2, 'v': 1}, {'t': 2, 'v': 0}, {'t': 25, 'v': 0}, {'t': 2, 'v': 0}, {'t': 2, 'v': 0}, {'t': 2, 'v': 0}, {'t': 2, 'v': 0}, {'t': 2, 'v': 0}], 'k': '_9'} +{'lb': [{'t': 2, 'v': 2}, {'t': 24, 'v': '_9'}], 'k': '_10'} +{'lb': [{'t': 2, 'v': 1}, {'t': 2, 'v': 0}, {'t': 25, 'v': 0}, {'t': 2, 'v': 0}, {'t': 2, 'v': 0}, {'t': 2, 'v': 1}, {'t': 5, 'v': 'abstractBaseMethod'}, {'t': 24, 'v': '_12'}, {'t': 2, 'v': 0}, {'t': 2, 'v': 0}], 'k': '_11'} +{'lb': [{'t': 2, 'v': 3}, {'t': 2, 'v': 0}, {'t': 5, 'v': 'abstractBaseMethod'}, {'t': 2, 'v': 0}, {'t': 2, 'v': 0}, {'t': 25, 'v': 0}], 'k': '_12'} +{'lb': [{'t': 2, 'v': 2}, {'t': 24, 'v': '_11'}], 'k': '_13'} diff --git a/testTs/skip_tests.json b/testTs/skip_tests.json index 10bd289e1b..9cb86c7552 100644 --- a/testTs/skip_tests.json +++ b/testTs/skip_tests.json @@ -2624,7 +2624,6 @@ "./testTs/test/node/allowJs/nodeModulesAllowJs1.ts", "./testTs/test/node/allowJs/nodeModulesAllowJsPackagePatternExportsTrailers.ts", "./testTs/test/classes/mixinAbstractClassesReturnTypeInference.ts", - "./testTs/test/classes/mixinAbstractClasses.ts", "./testTs/test/classes/classExpressions/classWithStaticFieldInParameterBindingPattern.3.ts", "./testTs/test/classes/classExpressions/classWithStaticFieldInParameterInitializer.3.ts", "./testTs/test/classes/classExpressions/extendClassExpressionFromModule.ts", @@ -5058,4 +5057,4 @@ "./testTs/test/override/override17.ts", "./testTs/test/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration6.ts" ] -} \ No newline at end of file +} diff --git a/ts2panda/src/base/typeSystem.ts b/ts2panda/src/base/typeSystem.ts index 18a04e5132..5c1cc93f53 100644 --- a/ts2panda/src/base/typeSystem.ts +++ b/ts2panda/src/base/typeSystem.ts @@ -123,15 +123,16 @@ export enum L2Type { } -export enum ModifierAbstract { +export enum ClassModifierAbstract { NONABSTRACT, ABSTRACT } -export enum Modifier { +export enum MethodModifier { STATIC = 1 << 2, ASYNC = 1 << 3, - ASTERISK = 1 << 4 + ASTERISK = 1 << 4, + ABSTRACT = 1 << 6 // The fifth bit is held by GetOrSetAccessorFlag } export enum ModifierReadonly { @@ -270,7 +271,7 @@ export class TypeSummary extends BaseType { } export class ClassType extends BaseType { - modifier: number = ModifierAbstract.NONABSTRACT; // 0 -> unabstract, 1 -> abstract; + modifier: number = ClassModifierAbstract.NONABSTRACT; // 0 -> unabstract, 1 -> abstract; extendsHeritage: number = PrimitiveType.ANY; implementsHeritages: Array = new Array(); // fileds Array: [typeIndex] [public -> 0, private -> 1, protected -> 2] [readonly -> 1] @@ -312,7 +313,7 @@ export class ClassType extends BaseType { for (let modifier of node.modifiers) { switch (modifier.kind) { case ts.SyntaxKind.AbstractKeyword: { - this.modifier = ModifierAbstract.ABSTRACT; + this.modifier = ClassModifierAbstract.ABSTRACT; break; } default: { @@ -400,7 +401,7 @@ export class ClassType extends BaseType { // Then, get the typeIndex and fill in the methods array let typeIndex = this.tryGetTypeIndex(member); - let isStatic = funcType.hasModifier(Modifier.STATIC); + let isStatic = funcType.hasModifier(MethodModifier.STATIC); if (isStatic) { this.staticMethods.set(funcType.getFunctionName(), typeIndex!); } else { @@ -563,11 +564,15 @@ export class FunctionType extends BaseType { break; } case ts.SyntaxKind.StaticKeyword: { - this.modifiers = Modifier.STATIC; + this.modifiers = MethodModifier.STATIC; break; } case ts.SyntaxKind.AsyncKeyword: { - this.modifiers += Modifier.ASYNC; + this.modifiers += MethodModifier.ASYNC; + break; + } + case ts.SyntaxKind.AbstractKeyword: { + this.modifiers += MethodModifier.ABSTRACT; break; } default: @@ -577,7 +582,7 @@ export class FunctionType extends BaseType { } if (!ts.isMethodSignature(node) && node.asteriskToken) { - this.modifiers += Modifier.ASTERISK; + this.modifiers += MethodModifier.ASTERISK; } } @@ -605,7 +610,7 @@ export class FunctionType extends BaseType { return this.modifiers; } - hasModifier(modifier: Modifier) { + hasModifier(modifier: MethodModifier) { return (this.modifiers & modifier) ? true : false; } -- Gitee