blob: 4876282c2ab22a4f259b35596ad8d46ed12c7cd8 [file] [log] [blame]
// Copyright (c) 2019, 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.
import 'package:kernel/ast.dart';
import '../base/name_space.dart';
import '../base/scope.dart';
import '../builder/declaration_builders.dart';
import '../builder/library_builder.dart';
import '../builder/type_builder.dart';
import 'dill_builder_mixins.dart';
import 'dill_class_builder.dart';
import 'dill_extension_member_builder.dart';
class DillExtensionBuilder extends ExtensionBuilderImpl
with DillDeclarationBuilderMixin {
@override
final Extension extension;
late final LookupScope _scope;
final DeclarationNameSpace _nameSpace;
late final ConstructorScope _constructorScope;
List<NominalVariableBuilder>? _typeParameters;
TypeBuilder? _onType;
DillExtensionBuilder(this.extension, LibraryBuilder parent)
: _nameSpace = new DeclarationNameSpaceImpl(),
super(/* metadata = */ null, 0, extension.name, parent,
extension.fileOffset) {
_scope = new NameSpaceLookupScope(
_nameSpace, ScopeKind.declaration, "extension ${extension.name}",
parent: parent.scope);
_constructorScope =
new DeclarationNameSpaceConstructorScope(extension.name, _nameSpace);
for (ExtensionMemberDescriptor descriptor in extension.memberDescriptors) {
Name name = descriptor.name;
switch (descriptor.kind) {
case ExtensionMemberKind.Method:
if (descriptor.isStatic) {
Procedure procedure = descriptor.memberReference.asProcedure;
nameSpace.addLocalMember(
name.text,
new DillExtensionStaticMethodBuilder(
procedure, descriptor, this),
setter: false);
} else {
Procedure procedure = descriptor.memberReference.asProcedure;
Procedure? tearOff = descriptor.tearOffReference?.asProcedure;
assert(
tearOff != null, // Coverage-ignore(suite): Not run.
"No tear found for ${descriptor}");
nameSpace.addLocalMember(
name.text,
new DillExtensionInstanceMethodBuilder(
procedure, descriptor, this, tearOff!),
setter: false);
}
break;
case ExtensionMemberKind.Getter:
Procedure procedure = descriptor.memberReference.asProcedure;
nameSpace.addLocalMember(name.text,
new DillExtensionGetterBuilder(procedure, descriptor, this),
setter: false);
break;
case ExtensionMemberKind.Field:
Field field = descriptor.memberReference.asField;
nameSpace.addLocalMember(
name.text, new DillExtensionFieldBuilder(field, descriptor, this),
setter: false);
break;
case ExtensionMemberKind.Setter:
Procedure procedure = descriptor.memberReference.asProcedure;
nameSpace.addLocalMember(name.text,
new DillExtensionSetterBuilder(procedure, descriptor, this),
setter: true);
break;
case ExtensionMemberKind.Operator:
Procedure procedure = descriptor.memberReference.asProcedure;
nameSpace.addLocalMember(name.text,
new DillExtensionOperatorBuilder(procedure, descriptor, this),
setter: false);
break;
}
}
}
@override
// Coverage-ignore(suite): Not run.
LookupScope get scope => _scope;
@override
DeclarationNameSpace get nameSpace => _nameSpace;
@override
// Coverage-ignore(suite): Not run.
ConstructorScope get constructorScope => _constructorScope;
@override
List<NominalVariableBuilder>? get typeParameters {
if (_typeParameters == null && extension.typeParameters.isNotEmpty) {
_typeParameters = computeTypeVariableBuilders(
extension.typeParameters, libraryBuilder.loader);
}
return _typeParameters;
}
@override
// Coverage-ignore(suite): Not run.
TypeBuilder get onType {
return _onType ??=
libraryBuilder.loader.computeTypeBuilder(extension.onType);
}
@override
// Coverage-ignore(suite): Not run.
List<TypeParameter> get typeParameterNodes => extension.typeParameters;
}