blob: 3f8d28b845f01a825980a290c9f41a311369e0ad [file] [log] [blame]
// 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.
library fasta.prefix_builder;
import 'package:kernel/ast.dart' show LibraryDependency;
import '../kernel/load_library_builder.dart' show LoadLibraryBuilder;
import '../fasta_codes.dart';
import '../scope.dart';
import '../source/source_library_builder.dart';
import 'builder.dart';
import 'extension_builder.dart';
class PrefixBuilder extends BuilderImpl {
final String name;
final Scope exportScope = new Scope.top();
@override
final SourceLibraryBuilder parent;
final bool deferred;
@override
final int charOffset;
final int importIndex;
final LibraryDependency? dependency;
LoadLibraryBuilder? loadLibraryBuilder;
PrefixBuilder(this.name, this.deferred, this.parent, this.dependency,
this.charOffset, this.importIndex) {
if (deferred) {
loadLibraryBuilder =
new LoadLibraryBuilder(parent, dependency!, charOffset);
addToExportScope('loadLibrary', loadLibraryBuilder!, charOffset);
}
}
@override
Uri get fileUri => parent.fileUri;
Builder? lookup(String name, int charOffset, Uri fileUri) {
return exportScope.lookup(name, charOffset, fileUri);
}
void addToExportScope(String name, Builder member, int charOffset) {
if (deferred && member is ExtensionBuilder) {
parent.addProblem(templateDeferredExtensionImport.withArguments(name),
charOffset, noLength, fileUri);
}
Builder? existing =
exportScope.lookupLocalMember(name, setter: member.isSetter);
Builder result;
if (existing != null) {
result = parent.computeAmbiguousDeclaration(
name, existing, member, charOffset,
isExport: true);
} else {
result = member;
}
exportScope.addLocalMember(name, result, setter: member.isSetter);
if (result is ExtensionBuilder) {
exportScope.addExtension(result);
}
}
@override
String get fullNameForErrors => name;
}