1/* 2 * Copyright (c) 2025 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*/ 15enum Color{RED, GREEN, BLUE} 16 17@Retention("SOURCE") 18@interface ClassAuthor{ 19 authorName: string = "Jim" 20 authorAge: number = 35 21 testBool: boolean = false 22 favorColor: Color = Color.BLUE 23 color: Color[] = [Color.RED, Color.BLUE] 24 reviewers: string[] = ["Bob", "Jim", "Tom"] 25 reviewersAge: number[] = [18, 21, 32] 26 testBools: boolean[] = [false, true, false] 27 mutiArray: number[][] = [ 28 [1, 2, 3], 29 [4, -5, 6], 30 [7, 8, -9] 31 ] 32} 33 34@Retention("SOURCE") 35@interface Log{ 36 msg:string = "" 37} 38 39@Retention("SOURCE") 40@interface Anno{} 41 42const base = @ClassAuthor (x: number) => x * 2; 43 44const multipleAnno = @ClassAuthor @Log() @Anno (x: number) => x + 1; 45 46const withArg = @Log("msg") (x: number) => x + 2; 47 48const nested1 = @Log (x: number) => { 49 const inner = @Anno (y: number) => y * 2; 50 return inner(x) + 1; 51}; 52const nested2 = @Log("nested") ((x: number) => { 53 const inner = @Anno (y: number) => y * x; 54 return inner(x); 55}); 56 57const deeplyNested = @ClassAuthor() @Anno @Log() (x: number) => { 58 const level1 = @ClassAuthor @Anno @Log (y: number) => { 59 const level2 = @ClassAuthor() @Anno() @Log() (z: number) => z * 2; 60 return level2(y) + 1; 61 }; 62 return level1(x); 63}; 64 65@ClassAuthor (x: number) => x * 2; 66 67function foo(a:()=>number){} 68 69function main(){ 70 foo(@Log ()=>1) 71} 72 73class A { name = "Bob" } 74let a = new A(); 75let show = @Anno(this: A): string => { 76 return "Hi," + this.name; 77} 78 79let show2 = @Anno()(this: A): string => { 80 return "Hello," + this.name; 81}