// Copyright (c) 2011, 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 test for testing access to private fields.
library PrivateOther;

import "private_test.dart";

class LibOther3 {
  static accessFieldA3(var a) => a.fieldA;
  static accessFieldB3(var b) => b._fieldB;
  static int c_field1b(c) => c._field1;
  static int c_field2b(c) => c._field2;
}

class AImported extends AExposed {
  AImported() : super();
  getFieldA() => fieldA;
}

class C2 extends C1 {
  int _field1;
  C2()
      : _field1 = 99,
        super();

  field1b() => _field1;
}

class C4 extends C3 {
  int _field2;
  C4()
      : _field2 = 1024,
        super();

  field2b() => _field2;
  field1d() => _field1;
}
