13af6ab5fSopenharmony_ci/*
23af6ab5fSopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License.
53af6ab5fSopenharmony_ci * You may obtain a copy of the License at
63af6ab5fSopenharmony_ci *
73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
83af6ab5fSopenharmony_ci *
93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and
133af6ab5fSopenharmony_ci * limitations under the License.
143af6ab5fSopenharmony_ci */
153af6ab5fSopenharmony_ci// Global-scoped duplicate declarations
163af6ab5fSopenharmony_ciimport G0 from 'module';
173af6ab5fSopenharmony_ciimport { G1 } from 'module';
183af6ab5fSopenharmony_ciimport A from 'x';
193af6ab5fSopenharmony_ciinterface A {
203af6ab5fSopenharmony_ci  f: number;
213af6ab5fSopenharmony_ci}
223af6ab5fSopenharmony_ciclass A implements A {
233af6ab5fSopenharmony_ci  m(); // Not duplicate, method overload
243af6ab5fSopenharmony_ci  m(a?: number) {
253af6ab5fSopenharmony_ci    if (a) a++;
263af6ab5fSopenharmony_ci  } // Not duplicate, method overload
273af6ab5fSopenharmony_ci}
283af6ab5fSopenharmony_ci
293af6ab5fSopenharmony_cinamespace A {
303af6ab5fSopenharmony_ci  export interface B {
313af6ab5fSopenharmony_ci    a: number;
323af6ab5fSopenharmony_ci  }
333af6ab5fSopenharmony_ci  export class B extends A {}
343af6ab5fSopenharmony_ci  export interface C {
353af6ab5fSopenharmony_ci    a: number;
363af6ab5fSopenharmony_ci  } // Not duplicate, interface C has two merging declarations
373af6ab5fSopenharmony_ci}
383af6ab5fSopenharmony_ci
393af6ab5fSopenharmony_cinamespace A {
403af6ab5fSopenharmony_ci  export interface B {
413af6ab5fSopenharmony_ci    b: string;
423af6ab5fSopenharmony_ci  }
433af6ab5fSopenharmony_ci  export interface C {
443af6ab5fSopenharmony_ci    b: string;
453af6ab5fSopenharmony_ci  } // Not duplicate, interface C has two merging declarations
463af6ab5fSopenharmony_ci}
473af6ab5fSopenharmony_ci
483af6ab5fSopenharmony_ciimport * as B from 'y';
493af6ab5fSopenharmony_ciinterface B {
503af6ab5fSopenharmony_ci  f: number;
513af6ab5fSopenharmony_ci}
523af6ab5fSopenharmony_ciclass B {}
533af6ab5fSopenharmony_ci
543af6ab5fSopenharmony_ciimport { C, X as D, E, Y as F } from 'z'; // E and F are not duplicates
553af6ab5fSopenharmony_ciinterface C {
563af6ab5fSopenharmony_ci  f: number;
573af6ab5fSopenharmony_ci}
583af6ab5fSopenharmony_ciclass C extends A implements C {}
593af6ab5fSopenharmony_ci
603af6ab5fSopenharmony_cifunction D(): number {
613af6ab5fSopenharmony_ci  return 1;
623af6ab5fSopenharmony_ci}
633af6ab5fSopenharmony_ciinterface D {
643af6ab5fSopenharmony_ci  f: number;
653af6ab5fSopenharmony_ci}
663af6ab5fSopenharmony_ci
673af6ab5fSopenharmony_cifunction X(); // Not duplicate, function overload
683af6ab5fSopenharmony_cifunction X(x?: number) {
693af6ab5fSopenharmony_ci  // Not duplicate, function overload
703af6ab5fSopenharmony_ci  const ab = new A.B();
713af6ab5fSopenharmony_ci}
723af6ab5fSopenharmony_ci
733af6ab5fSopenharmony_ciexport function scopeDuplicateDeclarations() {
743af6ab5fSopenharmony_ci  // Function-scoped duplicate declarations
753af6ab5fSopenharmony_ci  const A = 1000;
763af6ab5fSopenharmony_ci  interface A {
773af6ab5fSopenharmony_ci    f: number;
783af6ab5fSopenharmony_ci  }
793af6ab5fSopenharmony_ci
803af6ab5fSopenharmony_ci  const B = 'Text';
813af6ab5fSopenharmony_ci  type B = number[];
823af6ab5fSopenharmony_ci
833af6ab5fSopenharmony_ci  class C {}
843af6ab5fSopenharmony_ci  interface C {
853af6ab5fSopenharmony_ci    f: number;
863af6ab5fSopenharmony_ci  }
873af6ab5fSopenharmony_ci
883af6ab5fSopenharmony_ci  function D(): number {
893af6ab5fSopenharmony_ci    return 1;
903af6ab5fSopenharmony_ci  }
913af6ab5fSopenharmony_ci  type D = number;
923af6ab5fSopenharmony_ci
933af6ab5fSopenharmony_ci  function E(): number {
943af6ab5fSopenharmony_ci    return 1;
953af6ab5fSopenharmony_ci  }
963af6ab5fSopenharmony_ci  interface E {
973af6ab5fSopenharmony_ci    f: number;
983af6ab5fSopenharmony_ci  }
993af6ab5fSopenharmony_ci
1003af6ab5fSopenharmony_ci  // Block-scoped duplicate declarations.
1013af6ab5fSopenharmony_ci  {
1023af6ab5fSopenharmony_ci    const A = 54;
1033af6ab5fSopenharmony_ci    interface A {
1043af6ab5fSopenharmony_ci      f: number;
1053af6ab5fSopenharmony_ci    }
1063af6ab5fSopenharmony_ci  }
1073af6ab5fSopenharmony_ci}
1083af6ab5fSopenharmony_ci
1093af6ab5fSopenharmony_ciexport function destructuringDuplicates() {
1103af6ab5fSopenharmony_ci  interface F {
1113af6ab5fSopenharmony_ci    a: number;
1123af6ab5fSopenharmony_ci  }
1133af6ab5fSopenharmony_ci  interface H {
1143af6ab5fSopenharmony_ci    s: string;
1153af6ab5fSopenharmony_ci  }
1163af6ab5fSopenharmony_ci  const [F, G, ...H] = [1, 2, 3, 4, 5];
1173af6ab5fSopenharmony_ci
1183af6ab5fSopenharmony_ci  interface I {
1193af6ab5fSopenharmony_ci    b: boolean;
1203af6ab5fSopenharmony_ci  }
1213af6ab5fSopenharmony_ci  interface K {
1223af6ab5fSopenharmony_ci    i: I;
1233af6ab5fSopenharmony_ci  }
1243af6ab5fSopenharmony_ci  interface M {
1253af6ab5fSopenharmony_ci    k: K;
1263af6ab5fSopenharmony_ci  }
1273af6ab5fSopenharmony_ci  const {
1283af6ab5fSopenharmony_ci    I,
1293af6ab5fSopenharmony_ci    J: {
1303af6ab5fSopenharmony_ci      K,
1313af6ab5fSopenharmony_ci      L: [M, N],
1323af6ab5fSopenharmony_ci      O,
1333af6ab5fSopenharmony_ci    },
1343af6ab5fSopenharmony_ci  } = { I: 10, J: { K: 'foo', L: [30, 40], O: 'bar' } };
1353af6ab5fSopenharmony_ci}
1363af6ab5fSopenharmony_ci
1373af6ab5fSopenharmony_ciexport function switchDuplicates(n: number) {
1383af6ab5fSopenharmony_ci  switch (n) {
1393af6ab5fSopenharmony_ci    case 1:
1403af6ab5fSopenharmony_ci      const XX = 10;
1413af6ab5fSopenharmony_ci      type XX = number;
1423af6ab5fSopenharmony_ci
1433af6ab5fSopenharmony_ci      function XY(): number {
1443af6ab5fSopenharmony_ci        return 1;
1453af6ab5fSopenharmony_ci      }
1463af6ab5fSopenharmony_ci      break;
1473af6ab5fSopenharmony_ci    case 25:
1483af6ab5fSopenharmony_ci      interface XY {
1493af6ab5fSopenharmony_ci        f: number;
1503af6ab5fSopenharmony_ci      }
1513af6ab5fSopenharmony_ci
1523af6ab5fSopenharmony_ci      function XZ(): number {
1533af6ab5fSopenharmony_ci        return 1;
1543af6ab5fSopenharmony_ci      }
1553af6ab5fSopenharmony_ci      break;
1563af6ab5fSopenharmony_ci    default:
1573af6ab5fSopenharmony_ci      type XZ = string[];
1583af6ab5fSopenharmony_ci      break;
1593af6ab5fSopenharmony_ci  }
1603af6ab5fSopenharmony_ci}
1613af6ab5fSopenharmony_ci
1623af6ab5fSopenharmony_ciclass PrivateIdentifiers {
1633af6ab5fSopenharmony_ci  x: number;
1643af6ab5fSopenharmony_ci  #x: string;
1653af6ab5fSopenharmony_ci
1663af6ab5fSopenharmony_ci  y(x: number): number {
1673af6ab5fSopenharmony_ci    return 10;
1683af6ab5fSopenharmony_ci  }
1693af6ab5fSopenharmony_ci  #y(x: number): number {
1703af6ab5fSopenharmony_ci    return 20;
1713af6ab5fSopenharmony_ci  }
1723af6ab5fSopenharmony_ci
1733af6ab5fSopenharmony_ci  z: boolean;
1743af6ab5fSopenharmony_ci  #z(x: number): number {
1753af6ab5fSopenharmony_ci    return 30;
1763af6ab5fSopenharmony_ci  }
1773af6ab5fSopenharmony_ci}
1783af6ab5fSopenharmony_ci
1793af6ab5fSopenharmony_ci// namespace to every other type - no error
1803af6ab5fSopenharmony_cienum T1 {}
1813af6ab5fSopenharmony_cinamespace T1 {}
1823af6ab5fSopenharmony_ci
1833af6ab5fSopenharmony_ciclass T2 {}
1843af6ab5fSopenharmony_cinamespace T2 {}
1853af6ab5fSopenharmony_ci
1863af6ab5fSopenharmony_ciinterface T3 {}
1873af6ab5fSopenharmony_cinamespace T3 {}
1883af6ab5fSopenharmony_ci
1893af6ab5fSopenharmony_citype T4 = T2;
1903af6ab5fSopenharmony_cinamespace T4 {}
1913af6ab5fSopenharmony_ci
1923af6ab5fSopenharmony_cinamespace T5 {}
1933af6ab5fSopenharmony_cinamespace T5 {}
1943af6ab5fSopenharmony_ci
1953af6ab5fSopenharmony_ci// namespace to variable / function - error
1963af6ab5fSopenharmony_cinamespace G0 {}
1973af6ab5fSopenharmony_cinamespace G1 {}
1983af6ab5fSopenharmony_ci
1993af6ab5fSopenharmony_cifunction G3() {}
2003af6ab5fSopenharmony_cinamespace G3 {}
2013af6ab5fSopenharmony_ci
2023af6ab5fSopenharmony_ci// declarations merging 
2033af6ab5fSopenharmony_cinamespace NP1 {} // namespace merging is allowed
2043af6ab5fSopenharmony_cinamespace NP1 {} // namespace merging is allowed
2053af6ab5fSopenharmony_ci
2063af6ab5fSopenharmony_cienum EN1 {}
2073af6ab5fSopenharmony_cienum EN1 {}
2083af6ab5fSopenharmony_ci
2093af6ab5fSopenharmony_ciinterface IF1 {}
2103af6ab5fSopenharmony_ciinterface IF1 {}
2113af6ab5fSopenharmony_ci
2123af6ab5fSopenharmony_ci// variable can't collide with interface, type alias and namespace
2133af6ab5fSopenharmony_ciconst V1: number = 1;
2143af6ab5fSopenharmony_ciinterface V1 {}
2153af6ab5fSopenharmony_ci
2163af6ab5fSopenharmony_ciconst V2: number = 1;
2173af6ab5fSopenharmony_cinamespace V2 {}
2183af6ab5fSopenharmony_ci
2193af6ab5fSopenharmony_ciconst V3: number = 1;
2203af6ab5fSopenharmony_citype V3 = V1;
2213af6ab5fSopenharmony_ci
2223af6ab5fSopenharmony_ci// function can't collide with interface, type alias and namespace
2233af6ab5fSopenharmony_cifunction F1() {}
2243af6ab5fSopenharmony_ciinterface F1 {}
2253af6ab5fSopenharmony_ci
2263af6ab5fSopenharmony_cifunction F2() {}
2273af6ab5fSopenharmony_cinamespace F2 {}
2283af6ab5fSopenharmony_ci
2293af6ab5fSopenharmony_cifunction F3() {}
2303af6ab5fSopenharmony_citype F3 = V1;
2313af6ab5fSopenharmony_ci
2323af6ab5fSopenharmony_ci// interface checks
2333af6ab5fSopenharmony_ciinterface IF2 {}
2343af6ab5fSopenharmony_ciclass IF2 {}
235