blob: e0c3c7a8c8d2bbabe6e6716a13284fe57a718267 [file] [log] [blame]
// Copyright (c) 2020, 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:ffigen/src/code_generator.dart';
import 'package:meta/meta.dart';
import 'func.dart' show Parameter;
import 'type.dart';
import 'utils.dart';
import 'writer.dart';
/// A simple typedef, Expands to -
///
/// ```dart
/// typedef $name = $returnType Function(
/// $parameter1...,
/// $parameter2...,
/// .
/// .
/// );
/// ```
/// Return/Parameter types can be of for C/Dart signarture depending on [typedefType].
///
/// Note: re-set [name] after resolving name conflicts.
class Typedef {
String name;
String dartDoc;
final Type returnType;
final TypedefType typedefType;
final List<Parameter> parameters;
Typedef({
@required this.name,
this.dartDoc,
@required this.returnType,
@required this.typedefType,
List<Parameter> parameters,
}) : parameters = parameters ?? [];
/// Returns the [Typedef] dependencies required by this typedef including itself.
List<Typedef> getDependencies() {
final dep = <Typedef>[];
for (final p in parameters) {
final base = p.type.getBaseType();
if (base.broadType == BroadType.NativeFunction) {
dep.addAll(base.nativeFunc.getDependencies());
}
}
dep.add(this);
return dep;
}
String toTypedefString(Writer w) {
final s = StringBuffer();
if (dartDoc != null) {
s.write(makeDartDoc(dartDoc));
}
final typedefName = name;
final paramNamer = UniqueNamer({});
if (typedefType == TypedefType.C) {
s.write('typedef $typedefName = ${returnType.getCType(w)} Function(\n');
for (final p in parameters) {
final name = p.name.isNotEmpty ? paramNamer.makeUnique(p.name) : p.name;
s.write(' ${p.type.getCType(w)} ${name},\n');
}
s.write(');\n\n');
} else {
s.write(
'typedef $typedefName = ${returnType.getDartType(w)} Function(\n');
for (final p in parameters) {
final name = p.name.isNotEmpty ? paramNamer.makeUnique(p.name) : p.name;
s.write(' ${p.type.getDartType(w)} ${name},\n');
}
s.write(');\n\n');
}
return s.toString();
}
}
enum TypedefType { C, Dart }