// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// Check that we can use pseudo keywords as names in function level code.

// @dart = 2.9

import "package:expect/expect.dart";

class PseudoKWTest {
  static testMain() {
    // This is a list of built-in identifiers from the Dart spec.
    // It sanity checks that these pseudo-keywords are legal identifiers.

    var abstract = 0; //# 01: ok
    var as = 0;
    var dynamic = 0;
    var export = 0;
    var external = 0; //# 01: ok
    var factory = 0;
    var get = 0;
    var interface = 0;
    var implements = 0;
    var import = 0;
    var library = 0;
    var mixin = 0;
    var operator = 0;
    var part = 0;
    var set = 0;
    var static = 0; //# 01: ok
    var typedef = 0;

    // "native" is a per-implementation extension that is not a part of the
    // Dart language.  While it is not an official built-in identifier, it
    // is useful to ensure that it remains a legal identifier.
    var native = 0;

    // The code below adds a few additional variants of usage without any
    // attempt at complete coverage.
    {
      void factory(set) {
        return; //# 01: ok
      }
    }

    get:
    while (import > 0) {
      break get;
    }

    return
        static + //# 01: ok
        library * operator;
  }
}

typedef(x) => "typedef $x"; //# 01: ok

static(abstract) { //# 01: ok
  return abstract == true; //# 01: ok
} //# 01: ok

class A {
  var typedef = 0;
  final operator = "smooth";

  set(x) {
    typedef = x;
  }

  get() => typedef - 5;

  static static() { //# 01: ok
    return 1; //# 01: ok
  } //# 01: ok
  static check() {
    var o = new A();
    o.set(55);
    Expect.equals(50, o.get());
    static(); //# 01: ok
  }
}

class B {
  var set = 100;
  get get => set;
  set get(get) => set = 2 * get.get;

  static() { //# 01: ok
    var set = new B(); //# 01: ok
    set.get = set; //# 01: ok
    Expect.equals(200, set.get); //# 01: ok
  } //# 01: ok
  int operator() {
    return 1;
  }
}

class C {
  static int operator = (5);
  static var get;
  static get set => 111;
  static set set(set) {}
}

main() {
  PseudoKWTest.testMain();
  A.check();
  new B().static(); //# 01: ok
  Expect.equals(1, new B().operator());
  Expect.equals(1, A.static()); //# 01: ok
  typedef("T"); //# 01: ok
  Expect.equals("typedef T", typedef("T")); //# 01: ok
  static("true"); //# 01: ok
  Expect.equals(false, static("true")); //# 01: ok
  Expect.equals(5, C.operator);
  Expect.equals(null, C.get);
  C.set = 0;
  Expect.equals(111, C.set);
}
