class Bindgen::Parser::Method

Overview

Describes a method as found by the clang tool.

Included Modules

Defined in:

bindgen/parser/method.cr
bindgen/parser/method/signature.cr

Constant Summary

Log = ::Log.for(self)
RESERVED_NAMES = ["initialize", "finalize"] of ::String

Method names Crystal reserves, which a C++ method of that name gets prefixed with cpp_: QHeaderView::initialize is #cpp_initialize.

Constructors

Instance Method Summary

Constructor Detail

def self.build(name, return_type : Parser::Type, arguments : Array(Parser::Argument), class_name : String, type = Parser::Method::Type::MemberMethod, access = AccessSpecifier::Public, crystal_name = nil) : self #

Utility method to easily build a Method using a more Crystal-style syntax.


[View source]
def self.from_signature(signature : String, class_name : String) : Method #

Parses a C++ member method declaration, as written in a header, into a Method of the class class_name, for the declare_methods: type rule: QMenu *menu() const, static Foo *make(int count = 1), void setMenu(QMenu *menu). Every argument is named, like in a declaration. A default is exposed if it's a literal number, boolean or nullptr. Raises an ArgumentError for anything else.


[View source]
def self.new(name : String, class_name : String, return_type : Bindgen::Parser::Type, arguments : Array(Bindgen::Parser::Argument), first_default_argument : Int32 | Nil = nil, access : Bindgen::Parser::AccessSpecifier = AccessSpecifier::Public, type : Bindgen::Parser::Method::Type = Type::MemberMethod, const : Bool = false, virtual : Bool = false, pure : Bool = false, final : Bool = false, extern_c : Bool = false, builtin : Bool = false, origin : Nil | Bindgen::Parser::Method = nil, crystal_name : Nil | String = nil, binding_name : Nil | String = nil, doc : Nil | String = nil, deprecated : Bool = false, free_function : Bool = false) #

[View source]
def self.new(pull : JSON::PullParser) #

[View source]

Instance Method Detail

def ==(other : self) #
Description copied from class Reference

Returns true if this reference is the same as other. Invokes same?.


def access : AccessSpecifier #

Visibility of the method.


[View source]
def aggregate_constructor?(*args, **options) #

[View source]
def aggregate_constructor?(*args, **options, &) #

[View source]
def any_constructor?(*args, **options) #

[View source]
def any_constructor?(*args, **options, &) #

[View source]
def any_default_constructor? : Bool #

Is this a constructor that can take no arguments?


[View source]
def arguments : Array(Argument) #

Arguments of the method.


[View source]
def arguments=(arguments : Array(Argument)) #

Arguments of the method.


[View source]
def binding_method_name #

Name of the method in C++ and Crystal bindings. If an explicit #binding_name name is set, it'll be returned without further processing.


[View source]
def binding_name=(binding_name : String | Nil) #

Forces the bindings to use the specified name.


[View source]
def binding_operator_name #

Name of the unary operator method in C++ and Crystal bindings. Uniquely identifies a C++ operator.


[View source]
def builtin? : Bool #

Is this a method implicitly generated by C++?


[View source]
def class_name : String #

Fully qualified name of the class in which the method is defined.


[View source]
def const? : Bool #

Returns if the method is const-qualified: std::string getName() const;


[View source]
def constructor?(*args, **options) #

[View source]
def constructor?(*args, **options, &) #

[View source]
def conversion_operator?(*args, **options) #

[View source]
def conversion_operator?(*args, **options, &) #

[View source]
def copy_constructor?(*args, **options) #

[View source]
def copy_constructor?(*args, **options, &) #

[View source]
def crystal_name(override : String | Nil = nil) : String #

Turns the method name into something canonical to Crystal. If an explicit #crystal_name name is set, it'll be returned without further processing. If override is not nil, it'll be used over #name. Otherwise, the generated name will be based on #name.


[View source]
def crystal_name=(crystal_name : String | Nil) #

Forces the Crystal wrapper to use the specified name.


[View source]
def deprecated? : Bool #

Is this method declared [[deprecated]]? Removed by the filter_methods processor if ignore_deprecated is configured.


[View source]
def destructor?(*args, **options) #

[View source]
def destructor?(*args, **options, &) #

[View source]
def doc : String | Nil #

Documentation comment from the C++ source, without comment markers.


[View source]
def equals_except_const?(other : Method) : Bool #

Checks if this method is equal to other, except for the const-qualification.


[View source]
def equals_virtually?(other : Method) : Bool #

Checks if this method is equal to other, as is suitable to determine if they're the same for C++ virtual methods between parent- and sub-classes.


[View source]
def explicit_crystal_name? : Bool #

Checks if the #crystal_name was set explicitly (true), or will be generated (false).


[View source]
def extern_c? : Bool #

Does this function use the C ABI?


[View source]
def filtered?(db : TypeDatabase) : Bool #

Is this method filtered out?

TODO Can we move this into Processor::FilterMethods?


[View source]
def final? : Bool #

Is this a final virtual function, which can't be overridden?


[View source]
def first_default_argument : Int32 | Nil #

The index of the first argument with a default value, if any.


[View source]
def fix_post_succ_or_pred? : Method | Nil #

Checks if this method is a post-increment or post-decrement method that takes a placeholder int argument. If true, returns a copy of this method with the int argument removed.


[View source]
def free_function? : Bool #

Is this a free function of member_functions, like qHash, bound as a member method of the class of its first argument, which is self? The C++ glue calls it with *_self_ first.


[View source]
def function_pointer(name : String | Nil = nil) : String #

Generates a C++ function pointer type matching this methods prototype.


[View source]
def getter?(name = @name) #

Try to deduce if this is a getter.


[View source]
def has_move_semantics? : Bool #

Does this method have move semantics anywhere?


[View source]
def has_result? #

Returns if this method returns something, or not


[View source]
def hash(hasher) #
Description copied from class Reference

See Object#hash(hasher)


def macro?(*args, **options) #

[View source]
def macro?(*args, **options, &) #

[View source]
def mangled_name #

Mangled name for the C++ wrapper method name


[View source]
def member_getter?(*args, **options) #

[View source]
def member_getter?(*args, **options, &) #

[View source]
def member_method?(*args, **options) #

[View source]
def member_method?(*args, **options, &) #

[View source]
def member_setter?(*args, **options) #

[View source]
def member_setter?(*args, **options, &) #

[View source]
def merge(other : Method) : Method #

Merges this and the other method with regards to default values and type deductions. Expects that this and other methods point at the same method, but in different classes in the inheritance chain.

Keeps the class name, access, constness, virtuality and type of this method.


[View source]
def merge_args!(other : Method) #

Unify arguments of this and another method.

Modifies the argument list of this method.


[View source]
def name : String #

Name of the method.


[View source]
def needs_instance? #

Returns if this method needs a class instance to be called.


[View source]
def operator?(*args, **options) #

[View source]
def operator?(*args, **options, &) #

[View source]
def origin : Method | Nil #

The method this method is based on. Used by #variants to indicate the methods origin when splitting occurs.


[View source]
def out_arguments(db : TypeDatabase) : Array(Int32) #

The indices of the out arguments: the non-const references and pointers to converted value types (TypeDatabase#converted_out_argument?), like QString & or QString *, and in a method having one, those to built-in types and enums too (TypeDatabase#builtin_out_argument?), like int &. The wrapper appends their values to the result: a reference is an in/out argument, which it keeps, a pointer is out-only, which it drops. Empty for a method which can't take out arguments, see #takes_out_arguments?, and for one without a converted out argument, whose int & stays an Int32*.

An #out_arguments entry of the class decides instead, see TypeDatabase#out_arguments_rule: true takes every such argument, false none, and a list of indices those among them. Without one, with TypeDatabase#builtin_out_arguments? the built-in ones are out arguments in every method, not only next to a converted one; a pointer to a byte or character type, or to void, is a buffer then, not an out argument (TypeDatabase#buffer_argument?).


[View source]
def private?(*args, **options) #

[View source]
def private?(*args, **options, &) #

[View source]
def protected?(*args, **options) #

[View source]
def protected?(*args, **options, &) #

[View source]
def public?(*args, **options) #

[View source]
def public?(*args, **options, &) #

[View source]
def pure? : Bool #

Is this a pure virtual function?


[View source]
def qualified_name : String #

Fully qualified name of the method: class_name::name. For a function in the global scope, it's the #name itself.


[View source]
def question_getter?(name = @name) #

Try to deduce if this is a getter for a boolean value.


[View source]
def return_type : Parser::Type #

The return type of this method


[View source]
def return_type=(return_type : Bindgen::Parser::Type) #

Replaces the return type, see the nilable: type rule.


[View source]
def same_crystal_signature?(other : Method) : Bool #

Does other have the same Crystal name and argument types, like try_lock next to tryLock? Both would define the same method.


[View source]
def setter?(name = @name) #

Try to deduce if this is a setter.


[View source]
def signal?(*args, **options) #

[View source]
def signal?(*args, **options, &) #

[View source]
def signature : String #

C++ signature of the method, naming its overload: name(type, type), with const appended for a const method. The argument types are written like the parser prints them, const QString &, int *. TypeDatabase::MethodPattern matches ignore_methods against it.


[View source]
def static?(*args, **options) #

[View source]
def static?(*args, **options, &) #

[View source]
def static_getter?(*args, **options) #

[View source]
def static_getter?(*args, **options, &) #

[View source]
def static_method?(*args, **options) #

[View source]
def static_method?(*args, **options, &) #

[View source]
def static_setter?(*args, **options) #

[View source]
def static_setter?(*args, **options, &) #

[View source]
def substitute_type(name : String, with type : Type) : Method #

Substitutes all uses of name on the argument and return types of this method with the given type.


[View source]
def substitute_type(replacements : Hash(String, Parser::Type)) : Method #

Performs type substitution on the argument and return types of this method using the given replacements.


[View source]
def superclass_copy : Method #

Returns a non-virtual copy of this method suitable for use in superclass wrapper structs. The bodies of such copies are expected to ignore method overriding.


[View source]
def supported_operator? : Bool #

Is this operator one bindgen can name, like operator+? Not operator-> or operator,, which filter_methods drops.


[View source]
def takes_out_arguments? : Bool #

Can this method have out arguments? A constructor usually keeps the pointer it is given, like QTextStream(QString *), and so does the setter of a pointer member, a signal passes its arguments to the block, and an operator returning a tuple would be odd: these keep dropping the non-const references and pointers to converted types.


[View source]
def takes_storage_references? : Bool #

Can this method take a pointer to the structure a wrapper hosts, see TypeDatabase#storage_reference?? Not a virtual method, whose Crystal override would get a copy, nor a signal or a constructor.


[View source]
def type : Method::Type #

Type of the method.


[View source]
def variadic? : Bool #

Does this function take a variable amount of arguments?


[View source]
def variants(&) #

Yields all variants of this method, going through an increasing level of default arguments. It will respect exposed default-values.

A C++ method like int foo(int a, int b = 1, std::string c = "foo") would yield two methods like:

  • int foo(int a, int b, std::string c)
  • int foo(int a, int b = 1)

Note that only built-in types (These are: Integers, Floats and Booleans) support an exposed default value. For other types (Like std::string in the example), no default value will be set.

Also see #find_variant_splits for the algorithm.


[View source]
def variants : Array(Method) #

Non-yielding version of #variants.


[View source]
def virtual=(virtual : Bool) #

Makes the method non-virtual for the wrappers, so a Crystal subclass can't override it, and the C++ subclass of Processor::VirtualOverride gets no forwarder for it: the Qt processor does this to the methods Q_OBJECT declares, which Processor::QtMetaObject overrides itself.


[View source]
def virtual? : Bool #

Is this a virtual function?


[View source]