in compiler/crates/relay-lsp/src/node_resolution_info/mod.rs [198:291]
fn build_node_resolution_info_from_selections(
selections: &List<Selection>,
position_span: Span,
node_resolution_info: &mut NodeResolutionInfo,
) {
if let Some(item) = selections
.items
.iter()
.find(|item| item.span().contains(position_span))
{
if let Some(directive_resolution_info) =
build_node_resolution_for_directive(item.directives(), position_span)
{
node_resolution_info.kind = directive_resolution_info.kind;
return;
}
match item {
Selection::LinkedField(node) => {
node_resolution_info.kind = NodeKind::FieldName;
let LinkedField {
name, selections, ..
} = node;
if build_node_resolution_info_for_argument(
name.value,
&node.arguments,
position_span,
node_resolution_info,
)
.is_none()
{
node_resolution_info
.type_path
.add_type(TypePathItem::LinkedField { name: name.value });
build_node_resolution_info_from_selections(
selections,
position_span,
node_resolution_info,
);
}
}
Selection::FragmentSpread(spread) => {
let FragmentSpread { name, .. } = spread;
if name.span.contains(position_span) {
node_resolution_info.kind = NodeKind::FragmentSpread(name.value);
}
}
Selection::InlineFragment(node) => {
let InlineFragment {
selections,
type_condition,
..
} = node;
node_resolution_info.kind = NodeKind::InlineFragment;
if let Some(type_condition) = type_condition {
let type_name = type_condition.type_.value;
node_resolution_info
.type_path
.add_type(TypePathItem::InlineFragment { type_name });
if let Some(node_kind) =
type_condition_at_position(type_condition, position_span)
{
node_resolution_info.kind = node_kind;
} else {
build_node_resolution_info_from_selections(
selections,
position_span,
node_resolution_info,
)
}
}
}
Selection::ScalarField(node) => {
let ScalarField { name, .. } = node;
if build_node_resolution_info_for_argument(
name.value,
&node.arguments,
position_span,
node_resolution_info,
)
.is_none()
{
node_resolution_info.kind = NodeKind::FieldName;
node_resolution_info
.type_path
.add_type(TypePathItem::ScalarField { name: name.value });
}
}
}
}
}