blob: 5f4b87690131274db5616c622f9ecbc322d1784e [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 SetterFragment implements Fragment, FunctionFragment {
@override
final String name;
final Uri fileUri;
final int startOffset;
final int nameOffset;
final int formalsOffset;
final int endOffset;
final bool isTopLevel;
final List<MetadataBuilder>? metadata;
final Modifiers modifiers;
/// The declared return type of this setter.
///
/// If the return type was omitted, this is an [InferableTypeBuilder].
final TypeBuilder returnType;
/// The name space for the type parameters available on this setter.
///
/// Initially this is empty, since setters don't have type parameters, but for
/// extension and extension type instance setters this will include type
/// parameters cloned from the extension or extension type, respectively.
final NominalParameterNameSpace typeParameterNameSpace;
/// The declared type parameters on this setter.
///
/// This is only non-null in erroneous cases since setters don't have type
/// parameters.
final List<TypeParameterFragment>? declaredTypeParameters;
/// The scope in which the setter is declared.
///
/// This is the scope used for resolving the [metadata].
final LookupScope enclosingScope;
/// The scope that introduces type parameters on this setter.
///
/// This is based on [typeParameterNameSpace] and initially doesn't introduce
/// any type parameters, since setters don't have type parameters, but for
/// extension and extension type instance setters this will include type
/// parameters cloned from the extension or extension type, respectively.
final LookupScope typeParameterScope;
/// The declared formals on this setter.
final List<FormalParameterBuilder>? declaredFormals;
final AsyncMarker asyncModifier;
final String? nativeMethodName;
final DeclarationFragment? enclosingDeclaration;
final LibraryFragment enclosingCompilationUnit;
SourcePropertyBuilder? _builder;
SetterFragmentDeclaration? _declaration;
@override
late final UriOffsetLength uriOffset =
new UriOffsetLength(fileUri, nameOffset, name.length);
SetterFragment({
required this.name,
required this.fileUri,
required this.startOffset,
required this.nameOffset,
required this.formalsOffset,
required this.endOffset,
required this.isTopLevel,
required this.metadata,
required this.modifiers,
required this.returnType,
required this.declaredTypeParameters,
required this.typeParameterNameSpace,
required this.enclosingScope,
required this.typeParameterScope,
required this.declaredFormals,
required this.asyncModifier,
required this.nativeMethodName,
required this.enclosingDeclaration,
required this.enclosingCompilationUnit,
});
@override
SourcePropertyBuilder get builder {
assert(_builder != null, "Builder has not been computed for $this.");
return _builder!;
}
void set builder(SourcePropertyBuilder value) {
assert(_builder == null, "Builder has already been computed for $this.");
_builder = value;
}
SetterFragmentDeclaration get declaration {
assert(
_declaration != null, "Declaration has not been computed for $this.");
return _declaration!;
}
void set declaration(SetterFragmentDeclaration value) {
assert(_declaration == null,
"Declaration has already been computed for $this.");
_declaration = value;
}
@override
FunctionBodyBuildingContext createFunctionBodyBuildingContext() {
return new _SetterFunctionBodyBuildingContext(this);
}
@override
String toString() => '$runtimeType($name,$fileUri,$nameOffset)';
}
class _SetterFunctionBodyBuildingContext
implements FunctionBodyBuildingContext {
SetterFragment _fragment;
_SetterFunctionBodyBuildingContext(this._fragment);
@override
InferenceDataForTesting? get inferenceDataForTesting => _fragment
.builder
.dataForTesting
// Coverage-ignore(suite): Not run.
?.inferenceData;
@override
MemberKind get memberKind => _fragment.isTopLevel
? MemberKind.TopLevelMethod
: (_fragment.modifiers.isStatic
? MemberKind.StaticMethod
: MemberKind.NonStaticMethod);
@override
bool get shouldBuild => true;
@override
List<TypeParameter>? get thisTypeParameters =>
_fragment.declaration.thisTypeParameters;
@override
VariableDeclaration? get thisVariable => _fragment.declaration.thisVariable;
@override
LookupScope get typeParameterScope {
return _fragment.typeParameterScope;
}
@override
LocalScope computeFormalParameterScope(LookupScope typeParameterScope) {
return _fragment.declaration.createFormalParameterScope(typeParameterScope);
}
@override
BodyBuilderContext createBodyBuilderContext() {
return _fragment.declaration.createBodyBuilderContext(_fragment.builder);
}
}