From 8709d2fba79f6bc66f362f4b1e6df97aed48f0f6 Mon Sep 17 00:00:00 2001 From: "Scott L. Burson" Date: Sat, 23 May 2026 22:36:36 -0700 Subject: [PATCH] Capture ref qualifiers on methods --- resect.h | 6 ++++++ src/decl.c | 19 +++++++++++++++++++ src/resect_private.h | 2 ++ 3 files changed, 27 insertions(+) diff --git a/resect.h b/resect.h index 10bed9e..b2cdd5b 100644 --- a/resect.h +++ b/resect.h @@ -231,6 +231,12 @@ typedef enum { RESECT_CONSTRUCTOR_KIND_OTHER = 5, } resect_constructor_kind; +typedef enum { + RESECT_REF_QUALIFIER_NONE = 0, + RESECT_REF_QUALIFIER_LVALUE = 1, + RESECT_REF_QUALIFIER_RVALUE = 2 +} resect_ref_qualifier; + typedef struct P_resect_translation_unit *resect_translation_unit; typedef struct P_resect_collection *resect_collection; typedef struct P_resect_iterator *resect_iterator; diff --git a/src/decl.c b/src/decl.c index 6e0976e..a00e32b 100644 --- a/src/decl.c +++ b/src/decl.c @@ -947,6 +947,7 @@ typedef struct P_resect_function_data { resect_function_calling_convention calling_convention; resect_type result_type; resect_bool inlined; + resect_ref_qualifier ref_qualifier; } *resect_function_data; resect_type resect_function_get_result_type(resect_decl decl) { @@ -1097,10 +1098,22 @@ resect_function_data resect_function_data_create(resect_visit_context visit_cont data->variadic = clang_isFunctionTypeVariadic(functionType) != 0 ? resect_true : resect_false; data->result_type = resect_type_create(visit_context, context, clang_getResultType(functionType)); data->inlined = convert_bool_from_uint(clang_Cursor_isFunctionInlined(cursor)); + data->ref_qualifier = convert_ref_qualifier(clang_Type_getCXXRefQualifier(functionType)); return data; } +resect_ref_qualifier convert_ref_qualifier(enum CXRefQualifierKind qual) { + switch (qual) { + case CXRefQualifier_LValue: + return RESECT_REF_QUALIFIER_LVALUE; + case CXRefQualifier_RValue: + return RESECT_REF_QUALIFIER_RVALUE; + default: + return RESECT_REF_QUALIFIER_NONE; + } +} + void resect_function_init(resect_visit_context visit_context, resect_translation_context context, resect_decl decl, CXCursor cursor) { resect_function_data function_data = resect_function_data_create(visit_context, context, cursor); @@ -1426,6 +1439,12 @@ resect_collection resect_method_parameters(resect_decl decl) { return data->function_data->parameters; } +resect_ref_qualifier resect_method_get_ref_qualifier(resect_decl decl) { + assert(decl->kind == RESECT_DECL_KIND_METHOD); + resect_method_data data = decl->data; + return data->function_data->ref_qualifier; +} + enum CXChildVisitResult resect_visit_method_parameter(CXCursor cursor, CXCursor parent, CXClientData data) { resect_decl_child_visit_data visit_data = data; resect_method_data method_data = visit_data->parent->data; diff --git a/src/resect_private.h b/src/resect_private.h index 414e8a3..a8d2029 100644 --- a/src/resect_private.h +++ b/src/resect_private.h @@ -286,6 +286,8 @@ resect_decl_visit_data resect_decl_visit_data_create(resect_translation_context void resect_visit_decl_data_free(resect_decl_visit_data data); +resect_ref_qualifier convert_ref_qualifier(enum CXRefQualifierKind qual); + /* * TEMPLATE ARGUMENT */