From 6eaa05d088ab2c962c23eb954408630b8735c3ee Mon Sep 17 00:00:00 2001 From: Aleksander Sotov Date: Tue, 9 Sep 2025 15:17:21 +0300 Subject: [PATCH] add Class.getName Issue: https://gitee.com/openharmony/arkcompiler_runtime_core/issues/ICX76I Testing: all tests passed Signed-off-by: Aleksander Sotov --- .../plugins/ets/stdlib/std/core/Class.ets | 30 +++++++- .../std/core/ClassGetNameTest.ets | 77 +++++++++++++++++++ 2 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 static_core/plugins/ets/tests/ets_func_tests/std/core/ClassGetNameTest.ets diff --git a/static_core/plugins/ets/stdlib/std/core/Class.ets b/static_core/plugins/ets/stdlib/std/core/Class.ets index e290401d2a..519c816b38 100644 --- a/static_core/plugins/ets/stdlib/std/core/Class.ets +++ b/static_core/plugins/ets/stdlib/std/core/Class.ets @@ -28,8 +28,36 @@ export final class Class { private constructor() { throw new Error("Class constructor called") } private native getNameInternal(): string; + private static readonly primitiveNameMapping: Record = { + "C": "Char", + "B": "Byte", + "S": "Short", + "I": "Int", + "J": "Long", + "F": "Float", + "D": "Double", + "Z": "Boolean" + } + + private resolveName(name: string): string { + if (!name.startsWith("[")) { + return name + } + let left: string = "" + let right: string = "" + while (name.startsWith("[")) { + left += "FixedArray<" + right += ">" + name = name.slice(1) + } + + return left + Class.primitiveNameMapping.get(name, name.substring(1, name.length - 1)) + right + } + public getName(): string { - return this.name ?? this.getNameInternal() + let internalName: string = this.name ?? this.getNameInternal() + return this.resolveName(internalName) + } public getSuper(): Class | undefined { diff --git a/static_core/plugins/ets/tests/ets_func_tests/std/core/ClassGetNameTest.ets b/static_core/plugins/ets/tests/ets_func_tests/std/core/ClassGetNameTest.ets new file mode 100644 index 0000000000..27135238d4 --- /dev/null +++ b/static_core/plugins/ets/tests/ets_func_tests/std/core/ClassGetNameTest.ets @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +function main() { + const suite = new arktest.ArkTestsuite('Class.getName tests') + suite.addTest('Class.getName FixedArray', testClassGetNameFixedArray) + suite.addTest('Class.getName nested FixedArray', testClassGetNameNestedFixedArray) + suite.addTest('Class.getName Objects', testClassGetNameObjects) + return suite.run() +} + +class A {} + +function getName(obj: Object): string { + return Class.of(obj).getName() +} + +function testClassGetNameFixedArray() { + let fbool: FixedArray = [true] + let fbyte: FixedArray = [1] + let fint: FixedArray = [1] + let fshort: FixedArray = [1] + let flong: FixedArray = [1] + let ffloat: FixedArray = [1] + let fdouble: FixedArray = [1] + let fnumber: FixedArray = [1] + let fchar: FixedArray = [c'a'] + let fobject: FixedArray = [new Object] + let ffunc: FixedArray<() => void> = [() => {}] + let fa: FixedArray = [new A] + + arktest.assertEQ(getName(fbool), "FixedArray") + arktest.assertEQ(getName(fbyte), "FixedArray") + arktest.assertEQ(getName(fint), "FixedArray") + arktest.assertEQ(getName(fshort), "FixedArray") + arktest.assertEQ(getName(flong), "FixedArray") + arktest.assertEQ(getName(ffloat), "FixedArray") + arktest.assertEQ(getName(fdouble), "FixedArray") + arktest.assertEQ(getName(fnumber), "FixedArray") + arktest.assertEQ(getName(fchar), "FixedArray") + arktest.assertEQ(getName(fobject), "FixedArray") + arktest.assertEQ(getName(ffunc), "FixedArray") + arktest.assertEQ(getName(fa), "FixedArray") +} + +function testClassGetNameNestedFixedArray() { + let f: FixedArray>>> = [[[[123]]]] + arktest.assertEQ(getName(f), "FixedArray>>") +} + +function testClassGetNameObjects() { + arktest.assertEQ(getName(1 as byte), "std.core.Byte") + arktest.assertEQ(getName(1 as short), "std.core.Short") + arktest.assertEQ(getName(1 as int), "std.core.Int") + arktest.assertEQ(getName(1 as long), "std.core.Long") + arktest.assertEQ(getName(1.0f), "std.core.Float") + arktest.assertEQ(getName(1.0), "std.core.Double") + arktest.assertEQ(getName(c'a'), "std.core.Char") + arktest.assertEQ(getName(true), "std.core.Boolean") + + arktest.assertEQ(getName(new Object), "std.core.Object") + arktest.assertEQ(getName(new Map), "escompat.Map") + + arktest.assertEQ(getName(new A), "ClassGetNameTest.A") +} -- Gitee