| // Copyright (c) 2016, 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 = 2.9 |
| |
| library fasta.constructor_reference_builder; |
| |
| import '../messages.dart' show noLength, templateConstructorNotFound; |
| |
| import '../identifiers.dart' show QualifiedName, flattenName; |
| |
| import '../scope.dart'; |
| |
| import 'builder.dart'; |
| import 'class_builder.dart'; |
| import 'library_builder.dart'; |
| import 'prefix_builder.dart'; |
| import 'type_alias_builder.dart'; |
| import 'type_builder.dart'; |
| |
| class ConstructorReferenceBuilder { |
| final int charOffset; |
| |
| final Uri fileUri; |
| |
| final Object name; |
| |
| final List<TypeBuilder> typeArguments; |
| |
| /// This is the name of a named constructor. As `bar` in `new Foo<T>.bar()`. |
| final String suffix; |
| |
| Builder target; |
| |
| ConstructorReferenceBuilder(this.name, this.typeArguments, this.suffix, |
| Builder parent, this.charOffset) |
| : fileUri = parent.fileUri; |
| |
| String get fullNameForErrors { |
| return "${flattenName(name, charOffset, fileUri)}" |
| "${suffix == null ? '' : '.$suffix'}"; |
| } |
| |
| void resolveIn(Scope scope, LibraryBuilder accessingLibrary) { |
| final Object name = this.name; |
| Builder declaration; |
| if (name is QualifiedName) { |
| String prefix = name.qualifier; |
| String middle = name.name; |
| declaration = scope.lookup(prefix, charOffset, fileUri); |
| if (declaration is TypeAliasBuilder) { |
| TypeAliasBuilder aliasBuilder = declaration; |
| declaration = aliasBuilder.unaliasDeclaration(typeArguments); |
| } |
| if (declaration is PrefixBuilder) { |
| PrefixBuilder prefix = declaration; |
| declaration = prefix.lookup(middle, name.charOffset, fileUri); |
| } else if (declaration is ClassBuilder) { |
| ClassBuilder cls = declaration; |
| declaration = cls.findConstructorOrFactory( |
| middle, name.charOffset, fileUri, accessingLibrary); |
| if (suffix == null) { |
| target = declaration; |
| return; |
| } |
| } |
| } else { |
| declaration = scope.lookup(name, charOffset, fileUri); |
| if (declaration is TypeAliasBuilder) { |
| TypeAliasBuilder aliasBuilder = declaration; |
| declaration = aliasBuilder.unaliasDeclaration(typeArguments); |
| } |
| } |
| if (declaration is ClassBuilder) { |
| target = declaration.findConstructorOrFactory( |
| suffix ?? "", charOffset, fileUri, accessingLibrary); |
| } |
| if (target == null) { |
| accessingLibrary.addProblem( |
| templateConstructorNotFound.withArguments(fullNameForErrors), |
| charOffset, |
| noLength, |
| fileUri); |
| } |
| } |
| } |