// 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.

// @dart = 2.9

// Test ensuring that compiler can parse metadata. Need to add negative
// test cases with illegal metadata annotations.

library metadata_test.dart;

import "package:expect/expect.dart";
import "lib.dart" as Meta;

class Tag {
  final String annotation;
  const Tag(this.annotation);
}

const meta1 = 1;
const meta2 = const Tag("meta2");

const extern = const Tag("external");

@meta1
var topLevelVar;
@Meta.Alien.unknown()
List unknownUnknowns;

@meta1
typedef int DingDong<@meta2 T>(@meta1 event);

@meta1
class A<@Tag("typeParam") T> {
  @meta1
  @meta2
  static String staticField;

  @Meta.Alien("ET")
  int foo(@meta1 bool fool, {@meta1 @Tag("opt") x: 100}) {
    g() => 10;
    return x * g();
  }

  @Tag(r"timewarp")
  List<int> getNextWeeksLottoNumbers() => [1, 2, 3, 4, 5, 6];
}

@meta1
main() {
  @meta1
  var a = new A();
  Expect.equals(0, a.foo(false, x: 0));

  for (@Tag("loopvar")
  int i = 0;
      i < 10;
      i++) {
    // Do something.
  }

  @meta1
  var s = r'This is a raw \\ string.';
}
