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,
}
}