use crate::parsing::c::parse::vast::c_vast_word_at;
use crate::parsing::c::parse::vast::*;
use vyre_primitives::predicate::node_kind;
use super::*;
pub(super) fn related_kind(vast_nodes: &[u32], related_idx: u32, node_count: usize) -> u32 {
if related_idx == u32::MAX {
return 0;
}
let Ok(related_idx) = usize::try_from(related_idx) else {
return 0;
};
if related_idx >= node_count {
return 0;
}
c_vast_word_at(vast_nodes, related_idx, IDX_KIND)
}
pub(super) fn semantic_role(
kind: u32,
parent_kind: u32,
first_child_kind: u32,
next_sibling_kind: u32,
) -> u32 {
let role = ROLE_BY_KIND
.iter()
.find_map(|(candidate, role)| (*candidate == kind).then_some(*role))
.unwrap_or(C_AST_PG_ROLE_NONE);
if kind == C_AST_KIND_POINTER_DECL
&& (parent_kind == C_AST_KIND_FUNCTION_DECLARATOR
|| first_child_kind == C_AST_KIND_FUNCTION_DECLARATOR
|| next_sibling_kind == C_AST_KIND_FUNCTION_DECLARATOR)
{
C_AST_PG_ROLE_FUNCTION_POINTER_DECL
} else {
role
}
}
pub(super) const CONTROL_KINDS: &[u32] = &[
C_AST_KIND_LABEL_STMT,
C_AST_KIND_CASE_STMT,
C_AST_KIND_DEFAULT_STMT,
C_AST_KIND_IF_STMT,
C_AST_KIND_ELSE_STMT,
C_AST_KIND_SWITCH_STMT,
C_AST_KIND_FOR_STMT,
C_AST_KIND_WHILE_STMT,
C_AST_KIND_DO_STMT,
C_AST_KIND_RETURN_STMT,
C_AST_KIND_BREAK_STMT,
C_AST_KIND_CONTINUE_STMT,
C_AST_KIND_GOTO_STMT,
C_AST_KIND_BUILTIN_UNREACHABLE_STMT,
];
pub(super) const EXPRESSION_KINDS: &[u32] = &[
C_AST_KIND_GNU_STATEMENT_EXPR,
C_AST_KIND_ASSIGN_EXPR,
C_AST_KIND_MEMBER_ACCESS_EXPR,
C_AST_KIND_SIZEOF_EXPR,
C_AST_KIND_ALIGNOF_EXPR,
C_AST_KIND_CONDITIONAL_EXPR,
C_AST_KIND_UNARY_EXPR,
C_AST_KIND_ARRAY_SUBSCRIPT_EXPR,
C_AST_KIND_GENERIC_SELECTION_EXPR,
C_AST_KIND_RANGE_DESIGNATOR_EXPR,
C_AST_KIND_CAST_EXPR,
C_AST_KIND_COMPOUND_LITERAL_EXPR,
C_AST_KIND_INITIALIZER_LIST,
];
pub(super) const GNU_KINDS: &[u32] = &[
C_AST_KIND_INLINE_ASM,
C_AST_KIND_ASM_TEMPLATE,
C_AST_KIND_ASM_OUTPUT_OPERAND,
C_AST_KIND_ASM_INPUT_OPERAND,
C_AST_KIND_ASM_CLOBBERS_LIST,
C_AST_KIND_ASM_GOTO_LABELS,
C_AST_KIND_ASM_QUALIFIER,
C_AST_KIND_GNU_ATTRIBUTE,
C_AST_KIND_ATTRIBUTE_SECTION,
C_AST_KIND_ATTRIBUTE_WEAK,
C_AST_KIND_ATTRIBUTE_ALIAS,
C_AST_KIND_ATTRIBUTE_ALIGNED,
C_AST_KIND_ATTRIBUTE_USED,
C_AST_KIND_ATTRIBUTE_UNUSED,
C_AST_KIND_ATTRIBUTE_NAKED,
C_AST_KIND_ATTRIBUTE_VISIBILITY,
C_AST_KIND_ATTRIBUTE_PACKED,
C_AST_KIND_ATTRIBUTE_CLEANUP,
C_AST_KIND_ATTRIBUTE_CONSTRUCTOR,
C_AST_KIND_ATTRIBUTE_DESTRUCTOR,
C_AST_KIND_ATTRIBUTE_MODE,
C_AST_KIND_ATTRIBUTE_NOINLINE,
C_AST_KIND_ATTRIBUTE_ALWAYS_INLINE,
C_AST_KIND_ATTRIBUTE_COLD,
C_AST_KIND_ATTRIBUTE_HOT,
C_AST_KIND_ATTRIBUTE_PURE,
C_AST_KIND_ATTRIBUTE_CONST,
C_AST_KIND_ATTRIBUTE_FORMAT,
C_AST_KIND_ATTRIBUTE_FALLTHROUGH,
C_AST_KIND_GNU_LABEL_ADDRESS_EXPR,
C_AST_KIND_BUILTIN_CONSTANT_P_EXPR,
C_AST_KIND_BUILTIN_CHOOSE_EXPR,
C_AST_KIND_BUILTIN_TYPES_COMPATIBLE_P_EXPR,
C_AST_KIND_BUILTIN_EXPECT_EXPR,
C_AST_KIND_BUILTIN_OFFSETOF_EXPR,
C_AST_KIND_BUILTIN_OBJECT_SIZE_EXPR,
C_AST_KIND_BUILTIN_PREFETCH_EXPR,
C_AST_KIND_BUILTIN_OVERFLOW_EXPR,
C_AST_KIND_BUILTIN_CLASSIFY_TYPE_EXPR,
C_AST_KIND_GNU_LOCAL_LABEL_DECL,
];
pub(super) const DECLARATION_KINDS: &[u32] = &[
C_AST_KIND_POINTER_DECL,
C_AST_KIND_ARRAY_DECL,
C_AST_KIND_FUNCTION_DECLARATOR,
C_AST_KIND_FIELD_DECL,
C_AST_KIND_ENUMERATOR_DECL,
C_AST_KIND_STRUCT_DECL,
C_AST_KIND_UNION_DECL,
C_AST_KIND_ENUM_DECL,
C_AST_KIND_TYPEDEF_DECL,
C_AST_KIND_FUNCTION_DEFINITION,
C_AST_KIND_BIT_FIELD_DECL,
C_AST_KIND_STATIC_ASSERT_DECL,
node_kind::FUNCTION_DECL,
];
pub(super) const ROLE_BY_KIND: &[(u32, u32)] = &[
(C_AST_KIND_LABEL_STMT, C_AST_PG_ROLE_LABEL),
(C_AST_KIND_CASE_STMT, C_AST_PG_ROLE_CASE),
(C_AST_KIND_DEFAULT_STMT, C_AST_PG_ROLE_DEFAULT),
(C_AST_KIND_GOTO_STMT, C_AST_PG_ROLE_GOTO),
(C_AST_KIND_SWITCH_STMT, C_AST_PG_ROLE_SWITCH),
(C_AST_KIND_IF_STMT, C_AST_PG_ROLE_SELECTION),
(C_AST_KIND_ELSE_STMT, C_AST_PG_ROLE_SELECTION),
(C_AST_KIND_FOR_STMT, C_AST_PG_ROLE_LOOP),
(C_AST_KIND_WHILE_STMT, C_AST_PG_ROLE_LOOP),
(C_AST_KIND_DO_STMT, C_AST_PG_ROLE_LOOP),
(C_AST_KIND_RETURN_STMT, C_AST_PG_ROLE_RETURN),
(C_AST_KIND_BREAK_STMT, C_AST_PG_ROLE_BREAK),
(C_AST_KIND_CONTINUE_STMT, C_AST_PG_ROLE_CONTINUE),
(
C_AST_KIND_BUILTIN_UNREACHABLE_STMT,
C_AST_PG_ROLE_UNREACHABLE,
),
(C_AST_KIND_GNU_STATEMENT_EXPR, C_AST_PG_ROLE_STATEMENT_EXPR),
(C_AST_KIND_INLINE_ASM, C_AST_PG_ROLE_INLINE_ASM),
(C_AST_KIND_ASM_TEMPLATE, C_AST_PG_ROLE_ASM_TEMPLATE),
(C_AST_KIND_ASM_OUTPUT_OPERAND, C_AST_PG_ROLE_ASM_OUTPUT),
(C_AST_KIND_ASM_INPUT_OPERAND, C_AST_PG_ROLE_ASM_INPUT),
(C_AST_KIND_ASM_CLOBBERS_LIST, C_AST_PG_ROLE_ASM_CLOBBER),
(C_AST_KIND_ASM_GOTO_LABELS, C_AST_PG_ROLE_ASM_GOTO_LABEL),
(C_AST_KIND_ASM_QUALIFIER, C_AST_PG_ROLE_ASM_QUALIFIER),
(C_AST_KIND_GNU_ATTRIBUTE, C_AST_PG_ROLE_GNU_ATTRIBUTE),
(
C_AST_KIND_ATTRIBUTE_SECTION,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_WEAK,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_ALIAS,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_ALIGNED,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_USED,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_UNUSED,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_NAKED,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_VISIBILITY,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_PACKED,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_CLEANUP,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_CONSTRUCTOR,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_DESTRUCTOR,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_MODE,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_NOINLINE,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_ALWAYS_INLINE,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_COLD,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(C_AST_KIND_ATTRIBUTE_HOT, C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL),
(
C_AST_KIND_ATTRIBUTE_PURE,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_CONST,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_FORMAT,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(
C_AST_KIND_ATTRIBUTE_FALLTHROUGH,
C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
),
(C_AST_KIND_INITIALIZER_LIST, C_AST_PG_ROLE_INITIALIZER_LIST),
(
C_AST_KIND_MEMBER_ACCESS_EXPR,
C_AST_PG_ROLE_FIELD_DESIGNATOR_OR_MEMBER_ACCESS,
),
(
C_AST_KIND_ARRAY_SUBSCRIPT_EXPR,
C_AST_PG_ROLE_ARRAY_DESIGNATOR_OR_SUBSCRIPT,
),
(
C_AST_KIND_RANGE_DESIGNATOR_EXPR,
C_AST_PG_ROLE_RANGE_DESIGNATOR,
),
(C_AST_KIND_ASSIGN_EXPR, C_AST_PG_ROLE_ASSIGNMENT),
(
C_AST_KIND_FUNCTION_DEFINITION,
C_AST_PG_ROLE_FUNCTION_DEFINITION,
),
(
C_AST_KIND_FUNCTION_DECLARATOR,
C_AST_PG_ROLE_FUNCTION_DECLARATOR,
),
(C_AST_KIND_STRUCT_DECL, C_AST_PG_ROLE_AGGREGATE_DECL),
(C_AST_KIND_UNION_DECL, C_AST_PG_ROLE_AGGREGATE_DECL),
(C_AST_KIND_ENUM_DECL, C_AST_PG_ROLE_AGGREGATE_DECL),
(C_AST_KIND_FIELD_DECL, C_AST_PG_ROLE_FIELD_DECL),
(C_AST_KIND_TYPEDEF_DECL, C_AST_PG_ROLE_TYPEDEF_DECL),
(C_AST_KIND_ENUMERATOR_DECL, C_AST_PG_ROLE_ENUMERATOR_DECL),
(C_AST_KIND_POINTER_DECL, C_AST_PG_ROLE_POINTER_DECL),
(C_AST_KIND_ARRAY_DECL, C_AST_PG_ROLE_ARRAY_DECL),
(C_AST_KIND_BIT_FIELD_DECL, C_AST_PG_ROLE_BIT_FIELD_DECL),
(
C_AST_KIND_STATIC_ASSERT_DECL,
C_AST_PG_ROLE_STATIC_ASSERT_DECL,
),
(node_kind::FUNCTION_DECL, C_AST_PG_ROLE_DECLARATION),
(C_AST_KIND_CAST_EXPR, C_AST_PG_ROLE_EXPRESSION),
(C_AST_KIND_COMPOUND_LITERAL_EXPR, C_AST_PG_ROLE_EXPRESSION),
(C_AST_KIND_SIZEOF_EXPR, C_AST_PG_ROLE_EXPRESSION),
(C_AST_KIND_ALIGNOF_EXPR, C_AST_PG_ROLE_ALIGNOF),
(C_AST_KIND_CONDITIONAL_EXPR, C_AST_PG_ROLE_EXPRESSION),
(C_AST_KIND_UNARY_EXPR, C_AST_PG_ROLE_EXPRESSION),
(C_AST_KIND_GENERIC_SELECTION_EXPR, C_AST_PG_ROLE_EXPRESSION),
(C_AST_KIND_BUILTIN_CONSTANT_P_EXPR, C_AST_PG_ROLE_EXPRESSION),
(C_AST_KIND_BUILTIN_CHOOSE_EXPR, C_AST_PG_ROLE_EXPRESSION),
(
C_AST_KIND_BUILTIN_TYPES_COMPATIBLE_P_EXPR,
C_AST_PG_ROLE_EXPRESSION,
),
(C_AST_KIND_BUILTIN_EXPECT_EXPR, C_AST_PG_ROLE_EXPRESSION),
(C_AST_KIND_BUILTIN_OFFSETOF_EXPR, C_AST_PG_ROLE_EXPRESSION),
(
C_AST_KIND_BUILTIN_OBJECT_SIZE_EXPR,
C_AST_PG_ROLE_EXPRESSION,
),
(C_AST_KIND_BUILTIN_PREFETCH_EXPR, C_AST_PG_ROLE_EXPRESSION),
(C_AST_KIND_BUILTIN_OVERFLOW_EXPR, C_AST_PG_ROLE_EXPRESSION),
(
C_AST_KIND_BUILTIN_CLASSIFY_TYPE_EXPR,
C_AST_PG_ROLE_EXPRESSION,
),
(C_AST_KIND_GNU_LOCAL_LABEL_DECL, C_AST_PG_ROLE_DECLARATION),
(C_AST_KIND_GNU_LABEL_ADDRESS_EXPR, C_AST_PG_ROLE_EXPRESSION),
];