blob: 89734e0941d6f14d2df3353065e0ca5c24d44c90 [file] [edit]
// Copyright (c) 2023, 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 '../ir/ir.dart' as ir;
import 'builder.dart';
import 'util.dart';
/// The interface for the functions in a module.
class FunctionsBuilder with Builder<ir.Functions> {
final ModuleBuilder _moduleBuilder;
final _definedFunctions = <ir.DefinedFunction>[];
final _importedFunctions = <ir.ImportedFunction>[];
FunctionsBuilder(this._moduleBuilder);
List<ir.DefinedFunction> get defined => _definedFunctions;
/// Defines a new function in this module with the given function type.
///
/// The [ir.DefinedFunction.body] must be completed (including the terminating
/// `end`) before the module can be serialized.
FunctionBuilder define(ir.FunctionType type, [String? name]) {
final function = ir.DefinedFunction.withoutBody(
_moduleBuilder.module,
ir.FinalizableIndex(),
type,
name,
);
_definedFunctions.add(function);
return FunctionBuilder(_moduleBuilder, function);
}
/// Import a function into the module.
ir.ImportedFunction import(
String module,
String name,
ir.FunctionType type, [
String? functionName,
]) {
final function = ir.ImportedFunction(
_moduleBuilder.module,
module,
name,
ir.FinalizableIndex(),
type,
functionName,
);
_importedFunctions.add(function);
return function;
}
@override
ir.Functions forceBuild() {
finalizeImportsAndDefinitions(_importedFunctions, _definedFunctions);
return ir.Functions(_importedFunctions, _definedFunctions);
}
}