// Copyright (c) 2014, 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.

import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'dart:mirrors';

import "deferred_constraints_constants_lib.dart" deferred as lib;

const myConst1 =
  lib.constantInstance; //# reference1: compile-time error
  /* //                   //# reference1: continued
    499;
  */ //                   //# reference1: continued
const myConst2 =
  lib.Const.instance; //# reference2: compile-time error
  /* //                 //# reference2: continued
    499;
  */ //                 //# reference2: continued

void f1(
    {a:
  const lib.Const() //# default_argument1: compile-time error
  /* //                  //# default_argument1: continued
        499
  */ //                  //# default_argument1: continued
    }) {}

void f2(
    {a:
  lib.constantInstance //# default_argument2: compile-time error
  /* //                        //# default_argument2: continued
        499
  */ //                        //# default_argument2: continued
    }) {}

@lib.Const() //# metadata1: compile-time error
class H1 {}

@lib.Const.instance //# metadata2: compile-time error
class H2 {}

@lib.Const.namedConstructor() //# metadata3: compile-time error
class H3 {}

void main() {
  var a1 = myConst1;
  var a2 = myConst2;

  asyncStart();
  lib.loadLibrary().then((_) {
    var instance = lib.constantInstance;
    var c1 = const lib.Const(); //# constructor1: compile-time error
    var c2 = const lib.Const.namedConstructor(); //# constructor2: compile-time error
    f1();
    f2();
    var constInstance = lib.constantInstance; //# reference_after_load: ok
    var h1 = new H1();
    var h2 = new H2();
    var h3 = new H3();

    // Need to access the metadata to trigger the expected compilation error.
    reflectClass(H1).metadata; //# metadata1: continued
    reflectClass(H2).metadata; //# metadata2: continued
    reflectClass(H3).metadata; //# metadata3: continued

    asyncEnd();
  });
}
