blob: c1179d5a1e9a1a6708c37a3374dae63fdc666120 [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 '../config_provider/config_types.dart' show Declaration;
import '../visitor/ast.dart';
import 'binding_string.dart';
import 'scope.dart';
import 'writer.dart';
/// Base class for all Bindings.
///
/// Do not extend directly, use [LookUpBinding] or [NoLookUpBinding].
abstract class Binding extends AstNode implements Declaration {
/// Holds the Unified Symbol Resolution string obtained from libclang.
@override
final String usr;
/// The name as it was in C.
@override
final String originalName;
Symbol _symbol;
Symbol get symbol => _symbol;
set symbol(Symbol newSymbol) {
assert(!_symbol.isFilled);
_symbol = newSymbol;
}
String get name => _symbol.name;
final String? dartDoc;
final bool isInternal;
/// Whether these bindings should be generated.
///
/// Set by MarkBindingsVisitation.
bool generateBindings = true;
Binding({
required this.usr,
required this.originalName,
required Symbol symbol,
this.dartDoc,
this.isInternal = false,
}) : _symbol = symbol {
// Ideally isImported would be part of the Symbol constructor, but then we
// wouldn't be able to use this.isObjCImport.
_symbol.isImported = isObjCImport;
}
/// Converts a Binding to its actual string representation.
///
/// Note: This does not print the typedef dependencies.
/// Must call getTypedefDependencies first.
BindingString toBindingString(Writer w);
/// Returns the Objective C bindings, if any.
BindingString? toObjCBindingString(Writer w) => null;
@override
void visit(Visitation visitation) => visitation.visitBinding(this);
@override
void visitChildren(Visitor visitor) {
super.visitChildren(visitor);
visitor.visit(_symbol);
}
/// Returns whether this type is imported from package:objective_c.
bool get isObjCImport => false;
}
/// Base class for bindings which look up symbols in dynamic library.
abstract class LookUpBinding extends Binding {
LookUpBinding({
String? usr,
String? originalName,
required super.symbol,
super.dartDoc,
super.isInternal,
}) : super(
usr: usr ?? symbol.oldName,
originalName: originalName ?? symbol.oldName,
);
@override
void visit(Visitation visitation) => visitation.visitLookUpBinding(this);
bool get loadFromNativeAsset;
}
/// Base class for bindings which don't look up symbols in dynamic library.
abstract class NoLookUpBinding extends Binding {
NoLookUpBinding({
String? usr,
String? originalName,
required super.symbol,
super.dartDoc,
super.isInternal,
}) : super(
usr: usr ?? symbol.oldName,
originalName: originalName ?? symbol.oldName,
);
@override
void visit(Visitation visitation) => visitation.visitNoLookUpBinding(this);
}