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

// Test that final fields in @MirrorsUsed are still inferred.

import 'package:expect/expect.dart';
import "package:async_helper/async_helper.dart";
import 'package:compiler/src/commandline_options.dart';
import '../memory_compiler.dart' show runCompiler;
import '../compiler_helper.dart' show findElement;

const MEMORY_SOURCE_FILES = const <String, String>{
  'main.dart': """
@MirrorsUsed(targets: 'Super')
import 'dart:mirrors';
import 'lib.dart';


class Subclass extends Super {
  int _private;

  int magic() => _private++;
}

main() {
  var objects = [new Super(), new Subclass()];
  reflect(objects[0]); // Trigger mirror usage.
}
""",
  'lib.dart': """
class Super {
  int _private;

  int magic() => _private++;
}
"""
};

void main() {
  asyncTest(() async {
    var result = await runCompiler(
        memorySourceFiles: MEMORY_SOURCE_FILES,
        options: [Flags.useOldFrontend]);
    var compiler = result.compiler;

    dynamic superclass =
        findElement(compiler, 'Super', Uri.parse('memory:lib.dart'));
    dynamic subclass = findElement(compiler, 'Subclass');
    var oracle = compiler.backend.mirrorsData.isMemberAccessibleByReflection;
    print(superclass.lookupMember('_private'));
    Expect.isTrue(oracle(superclass.lookupMember('_private')));
    Expect.isFalse(oracle(subclass.lookupMember('_private')));
  });
}
