blob: 9692ca708c1502f36276fd13fb5ffdbab4601981 [file] [log] [blame]
// Copyright (c) 2025, 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 'package:kernel/transformations/flags.dart';
import '../../base/local_scope.dart';
import '../../builder/declaration_builders.dart';
import '../../builder/formal_parameter_builder.dart';
import '../../builder/type_builder.dart';
import '../../kernel/body_builder_context.dart';
import '../../source/source_library_builder.dart';
import '../../type_inference/type_schema.dart';
import '../fragment.dart';
import 'declaration.dart';
class MethodFragmentBodyBuilderContext extends BodyBuilderContext {
final MethodFragment _fragment;
final MethodFragmentDeclaration _declaration;
MethodFragmentBodyBuilderContext(
this._fragment,
this._declaration,
SourceLibraryBuilder libraryBuilder,
DeclarationBuilder? declarationBuilder,
{required bool isDeclarationInstanceMember})
: super(libraryBuilder, declarationBuilder,
isDeclarationInstanceMember: isDeclarationInstanceMember);
@override
List<FormalParameterBuilder>? get formals => _declaration.formals;
@override
FunctionNode get function => _declaration.function;
@override
bool get isExternalFunction => _fragment.modifiers.isExternal;
@override
int get memberNameLength => _fragment.name.length;
@override
int get memberNameOffset => _fragment.nameOffset;
@override
TypeBuilder get returnType => _fragment.returnType;
@override
DartType get returnTypeContext {
final bool isReturnTypeUndeclared =
_fragment.returnType is OmittedTypeBuilder &&
function.returnType is DynamicType;
return isReturnTypeUndeclared ? const UnknownType() : function.returnType;
}
@override
LocalScope computeFormalParameterInitializerScope(LocalScope parent) {
/// Initializer formals or super parameters cannot occur in getters so
/// we don't need to create a new scope.
return parent;
}
@override
VariableDeclaration getFormalParameter(int index) =>
_declaration.getFormalParameter(index);
@override
VariableDeclaration? getTearOffParameter(int index) =>
_declaration.getTearOffParameter(index);
@override
void registerFunctionBody(Statement body) {
function.body = body..parent = function;
}
@override
void registerSuperCall() {
// TODO(johnniwinther): This should be set on the member built from this
// fragment and copied to the origin if necessary.
_fragment.builder.invokeTarget.transformerFlags |=
TransformerFlag.superCalls;
}
@override
void setAsyncModifier(AsyncMarker asyncModifier) {
assert(
asyncModifier == _fragment.asyncModifier,
"Unexpected change in async modifier on $_fragment from "
"${_fragment.asyncModifier} to $asyncModifier.");
}
}