blob: f107f44e05f48a42f03b4fdc7631e443bf193987 [file] [log] [blame]
// Copyright (c) 2024, 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.
part of 'fragment.dart';
class FactoryFragment implements Fragment, FunctionFragment {
final ConstructorName constructorName;
final Uri fileUri;
final int startOffset;
final int formalsOffset;
final int endOffset;
final Modifiers modifiers;
final List<MetadataBuilder>? metadata;
final NominalParameterNameSpace typeParameterNameSpace;
/// The scope in which the factory is declared.
///
/// This is the scope used for resolving the [metadata].
final LookupScope enclosingScope;
final LookupScope typeParameterScope;
final List<FormalParameterBuilder>? formals;
final AsyncMarker asyncModifier;
final String? nativeMethodName;
final ConstructorReferenceBuilder? redirectionTarget;
final DeclarationFragment enclosingDeclaration;
final LibraryFragment enclosingCompilationUnit;
SourceFactoryBuilder? _builder;
FactoryFragmentDeclaration? _declaration;
@override
late final UriOffsetLength uriOffset = new UriOffsetLength(
fileUri,
constructorName.fullNameOffset,
constructorName.fullNameLength,
);
FactoryFragment({
required this.constructorName,
required this.fileUri,
required this.startOffset,
required this.formalsOffset,
required this.endOffset,
required this.modifiers,
required this.metadata,
required this.typeParameterNameSpace,
required this.enclosingScope,
required this.typeParameterScope,
required this.formals,
required this.asyncModifier,
required this.nativeMethodName,
required this.redirectionTarget,
required this.enclosingDeclaration,
required this.enclosingCompilationUnit,
});
@override
SourceFactoryBuilder get builder {
assert(_builder != null, "Builder has not been computed for $this.");
return _builder!;
}
void set builder(SourceFactoryBuilder value) {
assert(_builder == null, "Builder has already been computed for $this.");
_builder = value;
}
FactoryFragmentDeclaration get declaration {
assert(
_declaration != null,
"Declaration has not been computed for $this.",
);
return _declaration!;
}
void set declaration(FactoryFragmentDeclaration value) {
assert(
_declaration == null,
"Declaration has already been computed for $this.",
);
_declaration = value;
}
int get fullNameOffset => constructorName.fullNameOffset;
@override
String get name => constructorName.name;
@override
FunctionBodyBuildingContext createFunctionBodyBuildingContext() {
return new _FactoryBodyBuildingContext(this);
}
@override
String toString() => '$runtimeType($name,$fileUri,$fullNameOffset)';
}
class _FactoryBodyBuildingContext implements FunctionBodyBuildingContext {
FactoryFragment _fragment;
_FactoryBodyBuildingContext(this._fragment);
@override
InferenceDataForTesting? get inferenceDataForTesting => _fragment
.builder
.dataForTesting
// Coverage-ignore(suite): Not run.
?.inferenceData;
@override
// Coverage-ignore(suite): Not run.
MemberKind get memberKind => MemberKind.Factory;
@override
bool get shouldBuild => true;
@override
List<TypeParameter>? get thisTypeParameters => null;
@override
VariableDeclaration? get thisVariable => null;
@override
LookupScope get typeParameterScope {
return _fragment.typeParameterScope;
}
@override
LocalScope computeFormalParameterScope(LookupScope typeParameterScope) {
if (_fragment.formals == null) {
return new FormalParameterScope(parent: typeParameterScope);
}
Map<String, VariableBuilder> local = {};
for (FormalParameterBuilder formal in _fragment.formals!) {
if (formal.isWildcard) {
continue;
}
local[formal.name] = formal;
}
return new FormalParameterScope(local: local, parent: typeParameterScope);
}
@override
BodyBuilderContext createBodyBuilderContext() {
return _fragment.declaration.createBodyBuilderContext(_fragment.builder);
}
}