| Index: pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart b/pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart
|
| index 24186c39d4e1bb5b74db05eb9b8ec3f1e96bf090..b07316f1dd22138397c2ab90f79fa0b334e95cd0 100644
|
| --- a/pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart
|
| +++ b/pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart
|
| @@ -13,7 +13,12 @@ import 'builder.dart'
|
| Scope,
|
| TypeBuilder;
|
|
|
| -import '../messages.dart' show templateConstructorNotFound, warning;
|
| +import '../messages.dart'
|
| + show
|
| + templateClassNotFound,
|
| + templateConstructorNotFound,
|
| + templateNotAConstructor,
|
| + warning;
|
|
|
| class ConstructorReferenceBuilder extends Builder {
|
| final String name;
|
| @@ -25,6 +30,8 @@ class ConstructorReferenceBuilder extends Builder {
|
|
|
| Builder target;
|
|
|
| + ClassBuilder classBuilder;
|
| +
|
| ConstructorReferenceBuilder(this.name, this.typeArguments, this.suffix,
|
| Builder parent, int charOffset)
|
| : super(parent, charOffset, parent.fileUri);
|
| @@ -32,33 +39,78 @@ class ConstructorReferenceBuilder extends Builder {
|
| String get fullNameForErrors => "$name${suffix == null ? '' : '.$suffix'}";
|
|
|
| void resolveIn(Scope scope, LibraryBuilder accessingLibrary) {
|
| + List<String> identifiers;
|
| int index = name.indexOf(".");
|
| - Builder builder;
|
| if (index == -1) {
|
| - builder = scope.lookup(name, charOffset, fileUri);
|
| + if (suffix == null) {
|
| + identifiers = <String>[name];
|
| + } else {
|
| + identifiers = <String>[name, suffix];
|
| + }
|
| } else {
|
| - String prefix = name.substring(0, index);
|
| - String middle = name.substring(index + 1);
|
| - builder = scope.lookup(prefix, charOffset, fileUri);
|
| - if (builder is PrefixBuilder) {
|
| + String first = name.substring(0, index);
|
| + String second = name.substring(index + 1);
|
| + if (suffix == null) {
|
| + identifiers = <String>[first, second];
|
| + } else {
|
| + identifiers = <String>[first, second, suffix];
|
| + }
|
| + }
|
| +
|
| + Builder builder;
|
| + bool isConstructor = false;
|
| + ClassBuilder cls;
|
| + for (String identifier in identifiers) {
|
| + isConstructor = false;
|
| + if (builder == null) {
|
| + builder = scope.lookup(identifier, charOffset, fileUri);
|
| + if (builder == null) {
|
| + warning(templateClassNotFound.withArguments(identifier), charOffset,
|
| + fileUri);
|
| + return;
|
| + }
|
| + } else if (builder is PrefixBuilder) {
|
| PrefixBuilder prefix = builder;
|
| - builder = prefix.lookup(middle, charOffset, fileUri);
|
| + builder = prefix.lookup(identifier, charOffset, fileUri);
|
| + if (builder == null) {
|
| + warning(templateClassNotFound.withArguments(identifier), charOffset,
|
| + fileUri);
|
| + return;
|
| + }
|
| } else if (builder is ClassBuilder) {
|
| - ClassBuilder cls = builder;
|
| + cls = builder;
|
| builder = cls.findConstructorOrFactory(
|
| - middle, charOffset, fileUri, accessingLibrary);
|
| - if (suffix == null) {
|
| - target = builder;
|
| + identifier, charOffset, fileUri, accessingLibrary);
|
| + if (builder == null) {
|
| + warning(templateConstructorNotFound.withArguments(identifier),
|
| + charOffset, fileUri);
|
| return;
|
| }
|
| + isConstructor = true;
|
| + } else {
|
| + warning(templateNotAConstructor.withArguments(fullNameForErrors),
|
| + charOffset, fileUri);
|
| + return;
|
| }
|
| }
|
| +
|
| if (builder is ClassBuilder) {
|
| - target = builder.findConstructorOrFactory(
|
| - suffix ?? "", charOffset, fileUri, accessingLibrary);
|
| + cls = builder;
|
| + builder = cls.findConstructorOrFactory(
|
| + "", charOffset, fileUri, accessingLibrary);
|
| + if (builder == null) {
|
| + warning(templateConstructorNotFound.withArguments(fullNameForErrors),
|
| + charOffset, fileUri);
|
| + return;
|
| + }
|
| + isConstructor = true;
|
| }
|
| - if (target == null) {
|
| - warning(templateConstructorNotFound.withArguments(fullNameForErrors),
|
| +
|
| + if (isConstructor) {
|
| + target = builder;
|
| + classBuilder = cls;
|
| + } else {
|
| + warning(templateNotAConstructor.withArguments(fullNameForErrors),
|
| charOffset, fileUri);
|
| }
|
| }
|
|
|