| Index: pkg/front_end/lib/src/fasta/builder/library_builder.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/builder/library_builder.dart b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
|
| index e3067aa8ccbf980457e61dbfc39343eb82734d3b..8442213be8b387e52c783da10a870eebda9c3f81 100644
|
| --- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
|
| +++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
|
| @@ -118,21 +118,32 @@ abstract class LibraryBuilder<T extends TypeBuilder, R> extends Builder {
|
|
|
| int finishNativeMethods() => 0;
|
|
|
| - /// Looks up [constructorName] in the class named [className]. It's an error
|
| - /// if no such class is exported by this library, or if the class doesn't
|
| - /// have a matching constructor (or factory).
|
| + /// Looks up [constructorName] in the class named [className].
|
| + ///
|
| + /// The class is looked up in this library's export scope unless
|
| + /// [bypassLibraryPrivacy] is true, in which case it is looked up in the
|
| + /// library scope of this library.
|
| + ///
|
| + /// It is an error if no such class is found, or if the class doesn't have a
|
| + /// matching constructor (or factory).
|
| ///
|
| /// If [constructorName] is null or the empty string, it's assumed to be an
|
| - /// unnamed constructor.
|
| + /// unnamed constructor. it's an error if [constructorName] starts with
|
| + /// `"_"`, and [bypassLibraryPrivacy] is false.
|
| Builder getConstructor(String className,
|
| - {String constructorName, bool isPrivate: false}) {
|
| + {String constructorName, bool bypassLibraryPrivacy: false}) {
|
| constructorName ??= "";
|
| - Builder cls = (isPrivate ? scope : exports).lookup(className, -1, null);
|
| + if (constructorName.startsWith("_") && !bypassLibraryPrivacy) {
|
| + throw internalError("Internal error: Can't access private constructor "
|
| + "'$constructorName'.");
|
| + }
|
| + Builder cls =
|
| + (bypassLibraryPrivacy ? scope : exports).lookup(className, -1, null);
|
| if (cls is ClassBuilder) {
|
| // TODO(ahe): This code is similar to code in `endNewExpression` in
|
| // `body_builder.dart`, try to share it.
|
| Builder constructor =
|
| - cls.findConstructorOrFactory(constructorName, -1, null);
|
| + cls.findConstructorOrFactory(constructorName, -1, null, this);
|
| if (constructor == null) {
|
| // Fall-through to internal error below.
|
| } else if (constructor.isConstructor) {
|
|
|