1/* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15declare function print(arg:any, arg1?:any):string; 16declare class ArkTools { 17 static isSlicedString(str: string): boolean; 18 isAOTCompiled(args: any): boolean; 19} 20function assert (expr: unknown, msg?: string): asserts expr { 21 if (!expr) throw new Error(msg); 22} 23 24var a : string = "12345"; 25var cr : string = "clashroyale"; 26var c = a + a.substring(2); 27print(c); 28a += a.substring(3); 29print(a); 30a = a + cr.substring(5); 31print(a); 32 33var d = cr.substring(1) + a; 34print(d); 35 36function test_undefined(message, message2, message3, message4) { 37 print(message + ', ' + message2 + ', ' + message3 + ', ' + message4); 38} 39test_undefined('hello'); 40 41// multiple add case 42var Text1 = "[^-]*-"; 43var Text2 = Text1 + "([^-]" + Text1 + ")*-"; 44var Text3 = Text2 + ">?"; 45var Text4 = "<(!(--" + Text2 + ">|[^-]"; 46print(Text4); 47 48// loop opt case 49var stra = "aaaaaa"; 50var strb = "strb"; 51print(strb); 52assert(ArkTools.isSlicedString(strb) == false, "Error optimize string add"); 53strb = stra + "bbbbbbbb" 54var kk = 10; 55var strc = ""; 56for (let i = 0; i < 3; i++) { 57 if (kk > 100) { 58 strc = strb + "c"; 59 } else { 60 strc = strb + "-"; 61 } 62} 63print(strb); 64let strbHasStringAddOpt: boolean = ArkTools.isSlicedString(strb); 65assert(ArkTools.isSlicedString(strc) == false, "Error optimize string add"); 66 67// function call opt case 68function foo1(str) { 69 var strk = str + "kkk"; 70 for (let j = 0; j < 3; j++) { 71 if (strk.length > 5) { 72 var stre = str + "-"; 73 } else { 74 var stre = str + "+"; 75 } 76 } 77} 78foo1(strb); 79print(strb); 80 81// cocos app opt case 82var count = 9; 83function foo2(num) { 84 if (num < 0) { 85 return 3; 86 } else { 87 return "callthis"; 88 } 89} 90var right = "hmos"; 91if (count > 10) { 92 right += foo2(count); 93} 94var e = "oooohhhhoooossss"; 95assert(ArkTools.isSlicedString(e) == false, "Error optimize string add"); 96for (var i = 0; i < count; i++) { 97 e += right; 98} 99let eHasStringAddOpt: boolean = ArkTools.isSlicedString(e); 100 101function foo3(str :string) { 102 print(str); 103 print(str.length); 104} 105 106let s:string = "aaaaaaaaaaaaaaaa" + "bbbbbbbbbbbbbb"; 107let s1:string = "aaaaaaaaaaaaaaaa" + "bbbbbbbbbbbbbb"; 108let ss:string = s + "-"; 109 110foo3(s); 111print(s1 == s); 112 113// two const 114let str:string = "Hello World"; 115print("Hello" + "World"); 116print(str + "Hello"); 117print("" + "" + "123" + ""); 118 119// one const 120let strs = ["OD", "Huawei", ""]; 121for (let i = 0; i<3; ++i) { 122 let m:string = strs[i]; 123 print("Hello, " + m); 124} 125 126// no const 127function foo(flag) { 128 let str = ["BUG", "full of bug"]; 129 if (flag) { 130 return str[0]; 131 } else { 132 return str[1]; 133 } 134} 135let left:string = foo(true); 136let right1:string = foo(true); 137let right2:string = foo(false); 138print(left + right1); 139print(left + right2); 140print(right2 + right2); 141 142if (ArkTools.isAOTCompiled(foo)) { 143 assert(strbHasStringAddOpt == true, "Not optimize string add"); 144 assert(eHasStringAddOpt == true, "Not optimize string add"); 145}