// 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.

/// @assertion The current library is the library currently being compiled. The
/// import modifies the import namespace of the current library in a manner that
/// is determined by the imported library and by the optional elements of the
/// import.
/// . . .
/// Let I be an import directive that refers to a URI via the string s1.
/// Evaluation of I proceeds as follows:
/// . . .
/// If I is an immediate import then, first
/// • If the URI that is the value of s1 has not yet been accessed by an import
///   or export directive in the current isolate then the contents of the URI
///   are compiled to yield a library B. Because libraries may have mutually
///   recursive imports, care must be taken to avoid an infinite regress.
/// • Otherwise, the contents of the URI denoted by s1 have been compiled into
///   a library B within the current isolate.
///
/// Let NS0 be the exported namespace of B. Then, for each combinator clause Ci,
/// 1 <= i <= n in I:
/// • If Ci is of the form
///   show id1, ..., idk
///   then let NSi = show([id1, ..., idk], NSi-1)
///   where show(l, n) takes a list of identifiers l and a namespace n, and
///   produces a namespace that maps each name in l to the same element that n
///   does. Furthermore, for each name x in l, if n defines the name x= then
///   the new namespace maps x= to the same element that n does. Otherwise the
///   resulting mapping is undefined.
/// • If Ci is of the form
///   hide id1, ..., idk
///   then let NSi = hide([id1, ..., idk], NSi-1)
///   where hide(l, n) takes a list of identfiers l and a namespace n, and
///   produces a namespace that is identical to n except that for each name k
///   in l, k and k= are undefined.
///
/// Next, if I includes a prefix clause of the form as p, let NS = NSn ∪
/// {p : pref ixObject(NSn)} where pref ixObject(NSn) is a prefix object for the
/// namespace NSn , which is an object that has the following members:
/// • For every top level function f named id in NSn, a corresponding method with
///   the same name and signature as f that forwards to f.
/// • For every top level getter with the same name and signature as g named id
///   in NSn, a corresponding getter that forwards to g.
/// • For every top level setter s with the same name and signature as named id
///   in NSn, a corresponding setter that forwards to s.
/// • For every type T named id in NSn, a corresponding getter named id with
///   return type Type, that, when invoked, returns the type object for T.
/// Otherwise, let NS = NSn. It is a compile-time error if the current
/// library declares a top-level member named p.
/// . . .
/// Then, for each entry mapping key k to declaration d in NS, d is made
/// available in the top level scope of L under the name k unless either:
/// • a top-level declaration with the name k exists in L, OR
/// • a prefix clause of the form as k is used in L.
///
/// @description Checks that imports of an imported library are not accessible
/// with a combination of prefixes used in both import directives. Library being
/// imported re-exports its own imports by default.
/// @author kaigorodov

import "namespace_changes_lib_reexport.dart" as PP;

main() {
  new PP.P.B.spec().foo();
//         ^
// [analyzer] unspecified
// [cfe] unspecified
}
