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); |
} |
} |