From 9470875cc4e319f4207dc45f05c76410b25db13c Mon Sep 17 00:00:00 2001 From: Sophie Atkins Date: Wed, 10 Jul 2024 23:35:50 +0200 Subject: [PATCH] handle if references already exists --- prisma-fmt/src/code_actions/relations.rs | 6 ++- .../result.json | 41 +++++++++++++++++++ .../schema.prisma | 10 +++++ prisma-fmt/tests/code_actions/tests.rs | 1 + 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 prisma-fmt/tests/code_actions/scenarios/add_missing_relation_attribute_args_references/result.json create mode 100644 prisma-fmt/tests/code_actions/scenarios/add_missing_relation_attribute_args_references/schema.prisma diff --git a/prisma-fmt/src/code_actions/relations.rs b/prisma-fmt/src/code_actions/relations.rs index 55f9b7e135d..c5d7a943173 100644 --- a/prisma-fmt/src/code_actions/relations.rs +++ b/prisma-fmt/src/code_actions/relations.rs @@ -282,7 +282,11 @@ pub(super) fn add_referencing_side_relation( .find(|arg| arg.value.is_string()) .map_or(Default::default(), |arg| format!("{arg}, ")); - let relation_attr = format!("@relation({}fields: [], references: [])", name); + let references = initiating_field + .referenced_fields() + .map_or("references: []".to_owned(), |refs| format!("references: [{}]", refs.map(|r| r.name()).collect::>().join(", "))); + + let relation_attr = format!("@relation({}fields: [], {})", name, references); let range = super::span_to_range(attr.span(), ctx.initiating_file_source()); TextEdit { diff --git a/prisma-fmt/tests/code_actions/scenarios/add_missing_relation_attribute_args_references/result.json b/prisma-fmt/tests/code_actions/scenarios/add_missing_relation_attribute_args_references/result.json new file mode 100644 index 00000000000..bb26a64255a --- /dev/null +++ b/prisma-fmt/tests/code_actions/scenarios/add_missing_relation_attribute_args_references/result.json @@ -0,0 +1,41 @@ +[ + { + "title": "Add relation attribute for relation field", + "kind": "quickfix", + "diagnostics": [ + { + "range": { + "start": { + "line": 3, + "character": 4 + }, + "end": { + "line": 4, + "character": 0 + } + }, + "severity": 1, + "message": "Error parsing attribute \"@relation\": The relation field `organization` on Model `user` must specify the `fields` argument in the @relation attribute. You can run `prisma format` to fix this automatically." + } + ], + "edit": { + "changes": { + "file:///path/to/schema.prisma": [ + { + "range": { + "start": { + "line": 3, + "character": 33 + }, + "end": { + "line": 3, + "character": 60 + } + }, + "newText": "@relation(fields: [], references: [id])" + } + ] + } + } + } +] \ No newline at end of file diff --git a/prisma-fmt/tests/code_actions/scenarios/add_missing_relation_attribute_args_references/schema.prisma b/prisma-fmt/tests/code_actions/scenarios/add_missing_relation_attribute_args_references/schema.prisma new file mode 100644 index 00000000000..d150cc537d5 --- /dev/null +++ b/prisma-fmt/tests/code_actions/scenarios/add_missing_relation_attribute_args_references/schema.prisma @@ -0,0 +1,10 @@ +model user { + id String @id + email String @unique + organization organization? @relation(references: [id]) +} + +model organization { + id String @id + users user[] +} \ No newline at end of file diff --git a/prisma-fmt/tests/code_actions/tests.rs b/prisma-fmt/tests/code_actions/tests.rs index 66c6b2ac095..746e9ae224e 100644 --- a/prisma-fmt/tests/code_actions/tests.rs +++ b/prisma-fmt/tests/code_actions/tests.rs @@ -17,6 +17,7 @@ scenarios! { add_missing_relation_attribute_mongodb add_missing_relation_attribute_args add_missing_relation_attribute_args_self + add_missing_relation_attribute_args_references one_to_many_referenced_side_misses_unique_single_field one_to_many_referenced_side_misses_unique_single_field_multifile one_to_many_referenced_side_misses_unique_single_field_broken_relation