• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2023-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 */
15
16class A {}
17class B extends A {}
18
19class KlassA {
20    public Foo() : String {
21        return "KlassA::Foo()";
22    }
23
24    public Bar() : String {
25        return "KlassA::Bar()";
26    }
27
28    // NOTE(vpukhov): Baz order affects override resoluition!
29    public Baz(x: A, y: B) : String {
30        return "KlassA::Baz(B, B)";
31    }
32
33    public final Baz(x: A, y: A) : String {
34        return "KlassA::Baz(A, A)";
35    }
36}
37
38class KlassB extends KlassA {
39    public override Foo() : String {
40        return "KlassB::Foo()";
41    }
42
43    public override Bar() : String {
44        return "KlassB::Bar()";
45    }
46
47    public override Baz(x: A, y: B) : String {
48        return "KlassB::Baz(A, B)";
49    }
50}
51
52class KlassC extends KlassB {
53    public override Foo() : String {
54        return "KlassC::Foo()";
55    }
56
57    public Baz(x: B, y: B) : String {
58        return "KlassC::Baz(B, B)";
59    }
60
61    public final CheckThisAndSuper() : void {
62        assertEQ(this.Foo(), "KlassC::Foo()");
63        assertEQ(super.Foo(), "KlassB::Foo()");
64    }
65}
66
67function Foo(x: A, y: B) : String { return "GLOBAL::Foo(A, B)"; }
68function Foo(x: B, y: B) : String { return "GLOBAL::Foo(B, B)"; }
69
70function Bar(x: int) : String { return "GLOBAL::Bar(int)"; }
71function Bar(x: short) : String { return "GLOBAL::Bar(short)"; }
72function Bar(x: char) : String { return "GLOBAL::Bar(char)"; }
73function Bar(x: double) : String { return "GLOBAL::Bar(double)"; }
74
75function Bar2(x: long) : String { return "GLOBAL::Bar2(long)"; }
76function Bar2(x: double) : String { return "GLOBAL::Bar2(double)"; }
77
78function Baz(x: Object) : String { return "GLOBAL::Baz(Object)"; }
79function Baz(x: Int) : String { return "GLOBAL::Baz(Int)"; }
80function Baz(x: Short) : String { return "GLOBAL::Baz(Short)"; }
81function Baz(x: Char) : String { return "GLOBAL::Baz(Char)"; }
82function Baz(x: String) : String { return "GLOBAL::Baz(String)"; }
83
84function main() : void {
85    let a: KlassA = new KlassA();
86    let b: KlassB = new KlassB();
87    let c: KlassC = new KlassC();
88
89    assertEQ(a.Foo(), "KlassA::Foo()");
90    assertEQ(b.Foo(), "KlassB::Foo()");
91    assertEQ(c.Foo(), "KlassC::Foo()");
92
93    let d: KlassA = new KlassC();
94    let f: KlassB = new KlassC();
95
96    assertEQ(d.Foo(), "KlassC::Foo()");
97    assertEQ(f.Foo(), "KlassC::Foo()");
98    assertEQ(c.Bar(), "KlassB::Bar()");
99
100    let objA : A = new A();
101    let objB : B = new B();
102
103    assertEQ(c.Baz(objB, objB), "KlassC::Baz(B, B)");
104    assertEQ(c.Baz(objA, objB), "KlassB::Baz(A, B)");
105    assertEQ(c.Baz(objA, objA), "KlassA::Baz(A, A)");
106
107    c.CheckThisAndSuper();
108
109    assertEQ(Foo(objA, objB), "GLOBAL::Foo(A, B)");
110    assertEQ(Foo(objB, objB), "GLOBAL::Foo(B, B)");
111
112    assertEQ(Baz(new Int(1)), "GLOBAL::Baz(Int)");
113    assertEQ(Baz(new Char(c'1')), "GLOBAL::Baz(Char)");
114    assertEQ(Baz(new Short(1 as short)), "GLOBAL::Baz(Short)");
115    assertEQ(Baz("hello"), "GLOBAL::Baz(String)");
116
117    assertEQ(Bar(1), "GLOBAL::Bar(int)");
118    assertEQ(Bar(c'1'), "GLOBAL::Bar(char)");
119    assertEQ(Bar(3.14), "GLOBAL::Bar(double)");
120
121    assertEQ(Bar2(1), "GLOBAL::Bar2(long)");
122    assertEQ(Bar2(1 as long), "GLOBAL::Bar2(long)");
123    assertEQ(Bar2(1.1), "GLOBAL::Bar2(double)");
124
125}
126