fn get_hover_behavior_from_resolution_path()

in compiler/crates/relay-lsp/src/hover/with_resolution_path.rs [98:394]


fn get_hover_behavior_from_resolution_path<'a>(path: &'a ResolutionPath<'a>) -> HoverBehavior<'a> {
    match path {
        // Show query stats on the operation definition name
        // and "query/subscription/mutation" token
        ResolutionPath::Ident(IdentPath {
            inner: _,
            parent:
                IdentParent::OperationDefinitionName(OperationDefinitionPath {
                    inner: operation_definition,
                    parent: _,
                }),
        }) => HoverBehavior::OperationDefinitionName(operation_definition),
        ResolutionPath::Operation(OperationPath {
            inner: _,
            parent:
                OperationDefinitionPath {
                    inner: operation_definition,
                    parent: _,
                },
        }) => HoverBehavior::OperationDefinitionName(operation_definition),
        // Explicitly show no hover in other parts of the operation definition.
        // For example, the curly braces after the operation variables are included in
        // this match arm.
        ResolutionPath::OperationDefinition(_) => HoverBehavior::OperationDefinitionRemainder,

        // Variables definition for both operations and fragments (?):
        // Name, Type and Default Value => info about variable and link to types
        // Directives handled later
        ResolutionPath::VariableIdentifier(VariableIdentifierPath {
            inner: _,
            parent:
                VariableIdentifierParent::VariableDefinition(VariableDefinitionPath {
                    inner: variable_definition,
                    parent: _,
                }),
        }) => HoverBehavior::VariableDefinition(variable_definition),
        ResolutionPath::DefaultValue(DefaultValuePath {
            inner: _,
            parent:
                VariableDefinitionPath {
                    inner: variable_definition,
                    parent: _,
                },
        }) => HoverBehavior::VariableDefinition(variable_definition),
        ResolutionPath::VariableDefinition(VariableDefinitionPath {
            inner: variable_definition,
            parent: _,
        }) => HoverBehavior::VariableDefinition(variable_definition),
        ResolutionPath::NonNullTypeAnnotation(NonNullTypeAnnotationPath {
            inner: _,
            parent: non_null_annotation_parent,
        }) => HoverBehavior::VariableDefinition(
            non_null_annotation_parent
                .parent
                .find_variable_definition_path()
                .inner,
        ),
        ResolutionPath::ListTypeAnnotation(ListTypeAnnotationPath {
            inner: _,
            parent: list_type_annotation_parent,
        }) => HoverBehavior::VariableDefinition(
            list_type_annotation_parent
                .parent
                .find_variable_definition_path()
                .inner,
        ),
        ResolutionPath::Ident(IdentPath {
            inner: _,
            parent:
                IdentParent::NamedTypeAnnotation(NamedTypeAnnotationPath {
                    inner: _,
                    parent:
                        TypeAnnotationPath {
                            inner: _,
                            parent: type_annotation_parent,
                        },
                }),
        }) => HoverBehavior::VariableDefinition(
            type_annotation_parent.find_variable_definition_path().inner,
        ),

        // Explicitly don't show hovers for VariableDefinitionList
        ResolutionPath::VariableDefinitionList(_) => HoverBehavior::VariableDefinitionList,

        // Constant values can either be rooted in variable definitions or arguments to
        // directives or fields. Handle those cases.
        ResolutionPath::ConstantInt(ConstantIntPath {
            inner: _,
            parent:
                ConstantValuePath {
                    inner: _,
                    parent: constant_value_parent,
                },
        }) => HoverBehavior::ConstantValue(constant_value_parent),
        ResolutionPath::ConstantFloat(ConstantFloatPath {
            inner: _,
            parent:
                ConstantValuePath {
                    inner: _,
                    parent: constant_value_parent,
                },
        }) => HoverBehavior::ConstantValue(constant_value_parent),
        ResolutionPath::ConstantString(ConstantStringPath {
            inner: _,
            parent:
                ConstantValuePath {
                    inner: _,
                    parent: constant_value_parent,
                },
        }) => HoverBehavior::ConstantValue(constant_value_parent),
        ResolutionPath::ConstantBoolean(ConstantBooleanPath {
            inner: _,
            parent:
                ConstantValuePath {
                    inner: _,
                    parent: constant_value_parent,
                },
        }) => HoverBehavior::ConstantValue(constant_value_parent),
        ResolutionPath::ConstantNull(ConstantNullPath {
            inner: _,
            parent:
                ConstantValuePath {
                    inner: _,
                    parent: constant_value_parent,
                },
        }) => HoverBehavior::ConstantValue(constant_value_parent),
        ResolutionPath::ConstantEnum(ConstantEnumPath {
            inner: _,
            parent:
                ConstantValuePath {
                    inner: _,
                    parent: constant_value_parent,
                },
        }) => HoverBehavior::ConstantValue(constant_value_parent),
        ResolutionPath::ConstantList(ConstantListPath {
            inner: _,
            parent: constant_value_path,
        }) => HoverBehavior::ConstantValue(&constant_value_path.parent),
        ResolutionPath::Ident(IdentPath {
            inner: _,
            parent:
                IdentParent::ConstantArgKey(ConstantArgPath {
                    inner: _,
                    parent:
                        ConstantObjPath {
                            inner: _,
                            parent: constant_value_path,
                        },
                }),
        }) => HoverBehavior::ConstantValue(&constant_value_path.parent),
        ResolutionPath::ConstantObj(ConstantObjPath {
            inner: _,
            parent: constant_value_path,
        }) => HoverBehavior::ConstantValue(&constant_value_path.parent),
        ResolutionPath::ConstantArg(ConstantArgPath {
            inner: _,
            parent: constant_obj_path,
        }) => HoverBehavior::ConstantValue(&constant_obj_path.parent.parent),

        // Scalar and linked fields
        ResolutionPath::ScalarField(ScalarFieldPath {
            inner: scalar_field,
            parent: selection_path,
        }) => HoverBehavior::ScalarOrLinkedField(&scalar_field.name, selection_path),
        ResolutionPath::Ident(IdentPath {
            inner: _,
            parent:
                IdentParent::ScalarFieldAlias(ScalarFieldPath {
                    inner: scalar_field,
                    parent: selection_path,
                }),
        }) => HoverBehavior::ScalarOrLinkedField(&scalar_field.name, selection_path),
        ResolutionPath::Ident(IdentPath {
            inner: _,
            parent:
                IdentParent::ScalarFieldName(ScalarFieldPath {
                    inner: scalar_field,
                    parent: selection_path,
                }),
        }) => HoverBehavior::ScalarOrLinkedField(&scalar_field.name, selection_path),
        ResolutionPath::LinkedField(LinkedFieldPath {
            inner: scalar_field,
            parent: selection_path,
        }) => HoverBehavior::ScalarOrLinkedField(&scalar_field.name, selection_path),
        ResolutionPath::Ident(IdentPath {
            inner: _,
            parent:
                IdentParent::LinkedFieldAlias(LinkedFieldPath {
                    inner: scalar_field,
                    parent: selection_path,
                }),
        }) => HoverBehavior::ScalarOrLinkedField(&scalar_field.name, selection_path),
        ResolutionPath::Ident(IdentPath {
            inner: _,
            parent:
                IdentParent::LinkedFieldName(LinkedFieldPath {
                    inner: scalar_field,
                    parent: selection_path,
                }),
        }) => HoverBehavior::ScalarOrLinkedField(&scalar_field.name, selection_path),

        // Field and directive arguments
        ResolutionPath::Ident(IdentPath {
            inner: _,
            parent: IdentParent::ArgumentValue(argument_path),
        }) => HoverBehavior::ArgumentPath(argument_path),
        ResolutionPath::Ident(IdentPath {
            inner: _,
            parent: IdentParent::ArgumentName(argument_path),
        }) => HoverBehavior::ArgumentPath(argument_path),
        ResolutionPath::VariableIdentifier(VariableIdentifierPath {
            inner: _,
            parent:
                VariableIdentifierParent::Value(ValuePath {
                    inner: _,
                    parent: value_parent,
                }),
        }) => HoverBehavior::ArgumentPath(value_parent.find_enclosing_argument_path()),
        ResolutionPath::ValueList(ValueListPath {
            inner: _,
            parent: value_path,
        }) => HoverBehavior::ArgumentPath(value_path.parent.find_enclosing_argument_path()),
        ResolutionPath::ConstantObject(ConstantObjectPath {
            inner: _,
            parent: value_path,
        }) => HoverBehavior::ArgumentPath(value_path.parent.find_enclosing_argument_path()),
        ResolutionPath::Argument(argument_path) => HoverBehavior::ArgumentPath(argument_path),

        // inline fragments
        ResolutionPath::InlineFragment(inline_fragment_path) => {
            HoverBehavior::InlineFragment(inline_fragment_path)
        }
        ResolutionPath::Ident(IdentPath {
            inner: _,
            parent:
                IdentParent::TypeConditionType(TypeConditionPath {
                    inner: _,
                    parent: TypeConditionParent::InlineFragment(inline_fragment_path),
                }),
        }) => HoverBehavior::InlineFragment(inline_fragment_path),
        ResolutionPath::TypeCondition(TypeConditionPath {
            inner: _,
            parent: TypeConditionParent::InlineFragment(inline_fragment_path),
        }) => HoverBehavior::InlineFragment(inline_fragment_path),

        // Fragment spreads
        ResolutionPath::FragmentSpread(fragment_spread_path) => {
            HoverBehavior::FragmentSpread(fragment_spread_path)
        }
        ResolutionPath::Ident(IdentPath {
            inner: _,
            parent: IdentParent::FragmentSpreadName(fragment_spread_path),
        }) => HoverBehavior::FragmentSpread(fragment_spread_path),

        ResolutionPath::Directive(directive_path) => HoverBehavior::Directive(directive_path),
        ResolutionPath::Ident(IdentPath {
            inner: _,
            parent: IdentParent::DirectiveName(directive_path),
        }) => HoverBehavior::Directive(directive_path),

        ResolutionPath::FragmentDefinition(FragmentDefinitionPath {
            inner: fragment_definition,
            parent: _,
        }) => HoverBehavior::FragmentDefinition(fragment_definition),
        ResolutionPath::Ident(IdentPath {
            inner: _,
            parent:
                IdentParent::FragmentDefinitionName(FragmentDefinitionPath {
                    inner: fragment_definition,
                    parent: _,
                }),
        }) => HoverBehavior::FragmentDefinition(fragment_definition),
        ResolutionPath::Ident(IdentPath {
            inner: _,
            parent:
                IdentParent::TypeConditionType(TypeConditionPath {
                    inner: _,
                    parent:
                        TypeConditionParent::FragmentDefinition(FragmentDefinitionPath {
                            inner: fragment_definition,
                            parent: _,
                        }),
                }),
        }) => HoverBehavior::FragmentDefinition(fragment_definition),
        ResolutionPath::TypeCondition(TypeConditionPath {
            inner: _,
            parent:
                TypeConditionParent::FragmentDefinition(FragmentDefinitionPath {
                    inner: fragment_definition,
                    parent: _,
                }),
        }) => HoverBehavior::FragmentDefinition(fragment_definition),

        // Explicitly show no hover content of operation/fragment definitions
        ResolutionPath::ExecutableDocument(_) => HoverBehavior::ExecutableDocument,
    }
}