Skip to content

Commit

Permalink
Remove PointerAddress from generate_typename
Browse files Browse the repository at this point in the history
Reviewed By: captbaritone

Differential Revision: D67058358

fbshipit-source-id: cd60c47d0bd60d0351b67b35cd2271e2a06197e2
  • Loading branch information
gordyf authored and facebook-github-bot committed Dec 11, 2024
1 parent 2211ac6 commit d0da525
Showing 1 changed file with 13 additions and 15 deletions.
28 changes: 13 additions & 15 deletions compiler/crates/relay-transforms/src/generate_typename.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ use std::sync::Arc;

use common::DirectiveName;
use common::Location;
use common::PointerAddress;
use common::WithLocation;
use fnv::FnvHashMap;
use graphql_ir::Directive;
Expand Down Expand Up @@ -47,14 +46,11 @@ pub fn generate_typename(program: &Program, is_for_codegen: bool) -> Program {
.replace_or_else(|| program.clone())
}

// Note on correctness: the PointerAddress here is calculated from addresses of the input
// context. Because those value are still referenced, that memory cannot be freed/
// reused for the lifetime of the transform.
type Seen = FnvHashMap<PointerAddress, Transformed<Selection>>;
type Seen<'a> = FnvHashMap<&'a InlineFragment, Transformed<Selection>>;

struct GenerateTypenameTransform<'s> {
program: &'s Program,
seen: Seen,
seen: Seen<'s>,
is_for_codegen: bool,
parent_type: Option<Type>,
}
Expand All @@ -70,22 +66,22 @@ impl<'s> GenerateTypenameTransform<'s> {
}
}

impl<'s> Transformer<'_> for GenerateTypenameTransform<'s> {
impl<'s> Transformer<'s> for GenerateTypenameTransform<'s> {
const NAME: &'static str = "GenerateTypenameTransform";
const VISIT_ARGUMENTS: bool = false;
const VISIT_DIRECTIVES: bool = false;

fn transform_operation(
&mut self,
operation: &OperationDefinition,
operation: &'s OperationDefinition,
) -> Transformed<OperationDefinition> {
self.parent_type = Some(operation.type_);
self.default_transform_operation(operation)
}

fn transform_fragment(
&mut self,
fragment: &FragmentDefinition,
fragment: &'s FragmentDefinition,
) -> Transformed<FragmentDefinition> {
self.parent_type = Some(fragment.type_condition);
let schema = &self.program.schema;
Expand Down Expand Up @@ -115,7 +111,7 @@ impl<'s> Transformer<'_> for GenerateTypenameTransform<'s> {
}
}

fn transform_linked_field(&mut self, field: &LinkedField) -> Transformed<Selection> {
fn transform_linked_field(&mut self, field: &'s LinkedField) -> Transformed<Selection> {
let schema = &self.program.schema;
let field_definition = schema.field(field.definition.item);
let parent_type = self.parent_type;
Expand Down Expand Up @@ -154,12 +150,14 @@ impl<'s> Transformer<'_> for GenerateTypenameTransform<'s> {
}
}

fn transform_inline_fragment(&mut self, fragment: &InlineFragment) -> Transformed<Selection> {
let key = PointerAddress::new(fragment);
if let Some(prev) = self.seen.get(&key) {
fn transform_inline_fragment(
&mut self,
fragment: &'s InlineFragment,
) -> Transformed<Selection> {
if let Some(prev) = self.seen.get(fragment) {
return prev.clone();
}
self.seen.insert(key, Transformed::Delete);
self.seen.insert(fragment, Transformed::Delete);
let parent_type = self.parent_type;
if fragment.type_condition.is_some() {
self.parent_type = fragment.type_condition;
Expand Down Expand Up @@ -204,7 +202,7 @@ impl<'s> Transformer<'_> for GenerateTypenameTransform<'s> {
})))
}
};
self.seen.insert(key, result.clone());
self.seen.insert(fragment, result.clone());
result
}

Expand Down

0 comments on commit d0da525

Please sign in to comment.