mirror of
https://gcc.gnu.org/git/gcc.git
synced 2026-02-22 20:01:22 -05:00
gccrs: ast: Dump bare function type
+ Return FunctionQualifiers as ref to work in ast dump gcc/rust/ChangeLog: * ast/rust-ast-dump.cc (Dump::visit): Add missing visitor. * ast/rust-ast-dump.h: Add missing getter declaration. * ast/rust-ast-full-test.cc (BareFunctionType::as_string): Fix bare function string representation. * ast/rust-type.h (class BareFunctionType): Declare said getter. Signed-off-by: Jakub Dupak <dev@jakubdupak.com>
This commit is contained in:
committed by
Arthur Cohen
parent
ee0166fa1b
commit
ae1f6b3a96
@@ -249,6 +249,56 @@ Dump::visit (std::vector<LifetimeParam> &for_lifetimes)
|
||||
stream << "> ";
|
||||
}
|
||||
|
||||
void
|
||||
Dump::visit (FunctionQualifiers &qualifiers)
|
||||
{
|
||||
// Syntax:
|
||||
// `const`? `async`? `unsafe`? (`extern` Abi?)?
|
||||
// unsafe? (extern Abi?)?
|
||||
|
||||
switch (qualifiers.get_const_status ())
|
||||
{
|
||||
case NONE:
|
||||
break;
|
||||
case CONST_FN:
|
||||
stream << "const ";
|
||||
break;
|
||||
case ASYNC_FN:
|
||||
stream << "async ";
|
||||
break;
|
||||
}
|
||||
|
||||
if (qualifiers.is_unsafe ())
|
||||
stream << "unsafe ";
|
||||
if (qualifiers.is_extern ())
|
||||
{
|
||||
stream << "extern ";
|
||||
if (qualifiers.has_abi ())
|
||||
stream << "\"" << qualifiers.get_extern_abi () << "\" ";
|
||||
}
|
||||
} // namespace AST
|
||||
|
||||
void
|
||||
Dump::visit (MaybeNamedParam ¶m)
|
||||
{
|
||||
// Syntax:
|
||||
// OuterAttribute* ( ( IDENTIFIER | _ ) : )? Type
|
||||
|
||||
visit_items_joined_by_separator (param.get_outer_attrs (), " ");
|
||||
switch (param.get_param_kind ())
|
||||
{
|
||||
case MaybeNamedParam::UNNAMED:
|
||||
break;
|
||||
case MaybeNamedParam::IDENTIFIER:
|
||||
stream << " " << param.get_name () << ": ";
|
||||
break;
|
||||
case MaybeNamedParam::WILDCARD:
|
||||
stream << " _: ";
|
||||
break;
|
||||
}
|
||||
visit (param.get_type ());
|
||||
}
|
||||
|
||||
void
|
||||
Dump::visit (Token &tok)
|
||||
{
|
||||
@@ -1668,8 +1718,48 @@ Dump::visit (InferredType &)
|
||||
}
|
||||
|
||||
void
|
||||
Dump::visit (BareFunctionType &)
|
||||
{}
|
||||
Dump::visit (BareFunctionType &type)
|
||||
{
|
||||
// Syntax:
|
||||
// ForLifetimes? FunctionTypeQualifiers fn
|
||||
// ( FunctionParametersMaybeNamedVariadic? ) BareFunctionReturnType?
|
||||
//
|
||||
// BareFunctionReturnType:
|
||||
// -> TypeNoBounds
|
||||
//
|
||||
// FunctionParametersMaybeNamedVariadic :
|
||||
// MaybeNamedFunctionParameters | MaybeNamedFunctionParametersVariadic
|
||||
//
|
||||
// MaybeNamedFunctionParameters :
|
||||
// MaybeNamedParam ( , MaybeNamedParam )* ,?
|
||||
//
|
||||
// MaybeNamedFunctionParametersVariadic :
|
||||
// ( MaybeNamedParam , )* MaybeNamedParam , OuterAttribute* ...
|
||||
|
||||
if (type.has_for_lifetimes ())
|
||||
visit (type.get_for_lifetimes ());
|
||||
|
||||
visit (type.get_function_qualifiers ());
|
||||
|
||||
stream << "fn (";
|
||||
|
||||
visit_items_joined_by_separator (type.get_function_params (), ", ");
|
||||
|
||||
if (type.is_variadic ())
|
||||
{
|
||||
stream << ", ";
|
||||
visit_items_joined_by_separator (type.get_variadic_attr (), " ");
|
||||
stream << "...";
|
||||
}
|
||||
|
||||
stream << ')';
|
||||
|
||||
if (type.has_return_type ())
|
||||
{
|
||||
stream << " -> ";
|
||||
visit (type.get_return_type ());
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace AST
|
||||
} // namespace Rust
|
||||
|
||||
@@ -137,6 +137,8 @@ private:
|
||||
void visit (MacroRule &rule);
|
||||
void visit (WhereClause &rule);
|
||||
void visit (std::vector<LifetimeParam> &for_lifetimes);
|
||||
void visit (FunctionQualifiers &qualifiers);
|
||||
void visit (MaybeNamedParam ¶m);
|
||||
|
||||
// rust-ast.h
|
||||
void visit (Token &tok);
|
||||
|
||||
@@ -3071,7 +3071,7 @@ BareFunctionType::as_string () const
|
||||
}
|
||||
|
||||
str += "\n Is variadic: ";
|
||||
if (is_variadic)
|
||||
if (_is_variadic)
|
||||
str += "true";
|
||||
else
|
||||
str += "false";
|
||||
|
||||
@@ -835,7 +835,7 @@ public:
|
||||
};
|
||||
|
||||
/* A function pointer type - can be created via coercion from function items and
|
||||
* non- capturing closures. */
|
||||
* non-capturing closures. */
|
||||
class BareFunctionType : public TypeNoBounds
|
||||
{
|
||||
// bool has_for_lifetimes;
|
||||
@@ -844,7 +844,7 @@ class BareFunctionType : public TypeNoBounds
|
||||
|
||||
FunctionQualifiers function_qualifiers;
|
||||
std::vector<MaybeNamedParam> params;
|
||||
bool is_variadic;
|
||||
bool _is_variadic;
|
||||
std::vector<Attribute> variadic_attrs;
|
||||
|
||||
// bool has_return_type;
|
||||
@@ -860,6 +860,16 @@ public:
|
||||
// Whether the function has ForLifetimes.
|
||||
bool has_for_lifetimes () const { return !for_lifetimes.empty (); }
|
||||
|
||||
std::vector<LifetimeParam> &get_for_lifetimes () { return for_lifetimes; }
|
||||
|
||||
bool is_variadic () const { return _is_variadic; }
|
||||
|
||||
std::vector<Attribute> &get_variadic_attr () { return variadic_attrs; };
|
||||
const std::vector<Attribute> &get_variadic_attr () const
|
||||
{
|
||||
return variadic_attrs;
|
||||
};
|
||||
|
||||
BareFunctionType (std::vector<LifetimeParam> lifetime_params,
|
||||
FunctionQualifiers qualifiers,
|
||||
std::vector<MaybeNamedParam> named_params, bool is_variadic,
|
||||
@@ -867,7 +877,7 @@ public:
|
||||
std::unique_ptr<TypeNoBounds> type, Location locus)
|
||||
: for_lifetimes (std::move (lifetime_params)),
|
||||
function_qualifiers (std::move (qualifiers)),
|
||||
params (std::move (named_params)), is_variadic (is_variadic),
|
||||
params (std::move (named_params)), _is_variadic (is_variadic),
|
||||
variadic_attrs (std::move (variadic_attrs)),
|
||||
return_type (std::move (type)), locus (locus)
|
||||
{
|
||||
@@ -879,7 +889,7 @@ public:
|
||||
BareFunctionType (BareFunctionType const &other)
|
||||
: for_lifetimes (other.for_lifetimes),
|
||||
function_qualifiers (other.function_qualifiers), params (other.params),
|
||||
is_variadic (other.is_variadic), variadic_attrs (other.variadic_attrs),
|
||||
_is_variadic (other._is_variadic), variadic_attrs (other.variadic_attrs),
|
||||
locus (other.locus)
|
||||
{
|
||||
// guard to prevent null dereference
|
||||
@@ -893,7 +903,7 @@ public:
|
||||
for_lifetimes = other.for_lifetimes;
|
||||
function_qualifiers = other.function_qualifiers;
|
||||
params = other.params;
|
||||
is_variadic = other.is_variadic;
|
||||
_is_variadic = other._is_variadic;
|
||||
variadic_attrs = other.variadic_attrs;
|
||||
locus = other.locus;
|
||||
|
||||
@@ -930,7 +940,7 @@ public:
|
||||
return return_type;
|
||||
}
|
||||
|
||||
FunctionQualifiers get_function_qualifiers () { return function_qualifiers; }
|
||||
FunctionQualifiers &get_function_qualifiers () { return function_qualifiers; }
|
||||
|
||||
protected:
|
||||
/* Use covariance to implement clone function as returning this object rather
|
||||
|
||||
Reference in New Issue
Block a user