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

library main;

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

var _privateGlobalField = 1;

_privateGlobalMethod() => 9;

class C1 {
  var _privateField = 0;
  _privateMethod() => 2;
}

getPrivateGlobalFieldValue(LibraryMirror lib) {
  for (Symbol symbol in lib.declarations.keys) {
    DeclarationMirror decl = lib.declarations[symbol];
    if (decl is VariableMirror && decl.isPrivate) {
      return lib.getField(symbol).reflectee;
    }
  }
}

getPrivateFieldValue(InstanceMirror cls) {
  for (Symbol symbol in cls.type.declarations.keys) {
    DeclarationMirror decl = cls.type.declarations[symbol];
    if (decl is VariableMirror && decl.isPrivate) {
      return cls.getField(symbol).reflectee;
    }
  }
}

getPrivateGlobalMethodValue(LibraryMirror lib) {
  for (Symbol symbol in lib.declarations.keys) {
    DeclarationMirror decl = lib.declarations[symbol];
    if (decl is MethodMirror && decl.isRegularMethod && decl.isPrivate) {
      return lib.invoke(symbol, []).reflectee;
    }
  }
}

getPrivateMethodValue(InstanceMirror cls) {
  for (Symbol symbol in cls.type.declarations.keys) {
    DeclarationMirror decl = cls.type.declarations[symbol];
    if (decl is MethodMirror && decl.isRegularMethod && decl.isPrivate) {
      return cls.invoke(symbol, []).reflectee;
    }
  }
}

main() {
  LibraryMirror libmain = currentMirrorSystem().findLibrary(#main);
  LibraryMirror libother = currentMirrorSystem().findLibrary(#other);
  Expect.equals(1, getPrivateGlobalFieldValue(libmain));
  Expect.equals(3, getPrivateGlobalFieldValue(libother));
  Expect.equals(9, getPrivateGlobalMethodValue(libmain));
  Expect.equals(11, getPrivateGlobalMethodValue(libother));

  var c1 = reflect(new C1());
  var c2 = reflect(new C2());
  Expect.equals(0, getPrivateFieldValue(c1));
  Expect.equals(1, getPrivateFieldValue(c2));
  Expect.equals(2, getPrivateMethodValue(c1));
  Expect.equals(3, getPrivateMethodValue(c2));
}
