-
Notifications
You must be signed in to change notification settings - Fork 247
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Datasource Spans & Completions #3703
Merged
Merged
Changes from all commits
Commits
Show all changes
31 commits
Select commit
Hold shift + click to select a range
01a2ea3
Added datasource completions from LT to prisma-fmt
Druue 1856db1
Completions for DS now available at start of line
Druue 1012933
ds completions no longer available outside of the closing curly-brace
Druue 6ef9feb
Updated the rest of the grammar and parsing logic
Druue 15134e0
Updated reformatter to handle inner_contents
Druue b9650cf
fix prisma-fmt tests to reflect span changes
Druue 6af1430
added tests for default ds completions and multischema
Druue 9e0d9e0
Added: sub-completions for xyz_url
Druue 167c549
Update: config values now Optional
Druue d84c5b9
Added tests for url argument completions
Druue 3a3cc52
Updated get_config test snapshots
Druue b991179
Added support for params to pretty_doc
Druue bd30177
Added XYZ_URL completion for `env()`
Druue 92a535b
Updated completion test snapshots due to params
Druue 20350aa
Remove engines tag from completion labels
Druue 46e2010
removed commented line
Druue 283bff0
update `env` doc to mention db pull
Druue 3dc5864
extensions completion
Druue 6b53257
validation to only offer completions for what's not already there
Druue 4c9ec76
`add_quotes` for envar name completions
Druue f3dd1d6
Updated Tests:
Druue 4a31989
missed change in merge
Druue 02971bb
no fancy features allowed
Druue e2a088e
revert direct_url span back to just the arg
Druue c8890a7
Clippy complaining about unused inner_span for models and views
Druue 687f0e1
formatting
Druue 194ab42
Update ds and connector to check prop definitions
Druue 3762e2e
cleanup unused
Druue 7c9018d
Added connector specific completion capabilities.
Druue 4142420
Add schemas completions to other connectors
Druue b8d6880
rename push_completions -> datamodel_completions
Druue File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,160 @@ | ||
use std::collections::HashMap; | ||
|
||
use lsp_types::{ | ||
CompletionItem, CompletionItemKind, CompletionList, Documentation, InsertTextFormat, MarkupContent, MarkupKind, | ||
}; | ||
use psl::datamodel_connector::format_completion_docs; | ||
|
||
use super::{add_quotes, CompletionContext}; | ||
|
||
pub(super) fn relation_mode_completion(completion_list: &mut CompletionList) { | ||
completion_list.items.push(CompletionItem { | ||
label: "relationMode".to_owned(), | ||
insert_text: Some(r#"relationmode = $0"#.to_owned()), | ||
pimeys marked this conversation as resolved.
Show resolved
Hide resolved
|
||
insert_text_format: Some(InsertTextFormat::SNIPPET), | ||
kind: Some(CompletionItemKind::FIELD), | ||
documentation: Some(Documentation::MarkupContent(MarkupContent { | ||
kind: MarkupKind::Markdown, | ||
value: format_completion_docs( | ||
r#"relationMode = "foreignKeys" | "prisma""#, | ||
r#"Set the global relation mode for all relations. Values can be either "foreignKeys" (Default), or "prisma". [Learn more](https://pris.ly/d/relation-mode)"#, | ||
None, | ||
), | ||
})), | ||
..Default::default() | ||
}) | ||
} | ||
|
||
pub(super) fn direct_url_completion(completion_list: &mut CompletionList) { | ||
completion_list.items.push(CompletionItem { | ||
label: "directUrl".to_owned(), | ||
insert_text: Some(r#"directUrl = $0"#.to_owned()), | ||
insert_text_format: Some(InsertTextFormat::SNIPPET), | ||
kind: Some(CompletionItemKind::FIELD), | ||
documentation: Some(Documentation::MarkupContent(MarkupContent { | ||
kind: MarkupKind::Markdown, | ||
value: format_completion_docs( | ||
r#"directUrl = "String" | env("ENVIRONMENT_VARIABLE")"#, | ||
r#"Connection URL for direct connection to the database. [Learn more](https://pris.ly/d/data-proxy-cli)."#, | ||
None, | ||
) | ||
})), | ||
..Default::default() | ||
}) | ||
} | ||
|
||
pub(super) fn shadow_db_completion(completion_list: &mut CompletionList) { | ||
completion_list.items.push(CompletionItem { | ||
label: "shadowDatabaseUrl".to_owned(), | ||
insert_text: Some(r#"shadowDatabaseUrl = $0"#.to_owned()), | ||
insert_text_format: Some(InsertTextFormat::SNIPPET), | ||
kind: Some(CompletionItemKind::FIELD), | ||
documentation: Some(Documentation::MarkupContent(MarkupContent { | ||
kind: MarkupKind::Markdown, | ||
value: format_completion_docs( | ||
r#"shadowDatabaseUrl = "String" | env("ENVIRONMENT_VARIABLE")"#, | ||
r#"Connection URL including authentication info to use for Migrate's [shadow database](https://pris.ly/d/migrate-shadow)."#, | ||
None, | ||
), | ||
})), | ||
..Default::default() | ||
}) | ||
} | ||
|
||
pub(super) fn url_completion(completion_list: &mut CompletionList) { | ||
completion_list.items.push(CompletionItem { | ||
label: "url".to_owned(), | ||
insert_text: Some(r#"url = $0"#.to_owned()), | ||
insert_text_format: Some(InsertTextFormat::SNIPPET), | ||
kind: Some(CompletionItemKind::FIELD), | ||
documentation: Some(Documentation::MarkupContent(MarkupContent { | ||
kind: MarkupKind::Markdown, | ||
value: format_completion_docs( | ||
r#"url = "String" | env("ENVIRONMENT_VARIABLE")"#, | ||
r#"Connection URL including authentication info. Each datasource provider documents the URL syntax. Most providers use the syntax provided by the database. [Learn more](https://pris.ly/d/connection-strings)."#, | ||
None, | ||
), | ||
})), | ||
..Default::default() | ||
}) | ||
} | ||
|
||
pub(super) fn provider_completion(completion_list: &mut CompletionList) { | ||
completion_list.items.push(CompletionItem { | ||
label: "provider".to_owned(), | ||
insert_text: Some(r#"provider = $0"#.to_owned()), | ||
insert_text_format: Some(InsertTextFormat::SNIPPET), | ||
kind: Some(CompletionItemKind::FIELD), | ||
documentation: Some(Documentation::MarkupContent(MarkupContent { | ||
kind: MarkupKind::Markdown, | ||
value: format_completion_docs( | ||
r#"provider = "foo""#, | ||
r#"Describes which datasource connector to use. Can be one of the following datasource providers: `postgresql`, `mysql`, `sqlserver`, `sqlite`, `mongodb` or `cockroachdb`."#, | ||
None, | ||
), | ||
})), | ||
..Default::default() | ||
}) | ||
} | ||
|
||
pub(super) fn url_env_completion(completion_list: &mut CompletionList) { | ||
completion_list.items.push(CompletionItem { | ||
label: "env()".to_owned(), | ||
insert_text: Some(r#"env($0)"#.to_owned()), | ||
insert_text_format: Some(InsertTextFormat::SNIPPET), | ||
kind: Some(CompletionItemKind::PROPERTY), | ||
documentation: Some(Documentation::MarkupContent(MarkupContent { | ||
kind: MarkupKind::Markdown, | ||
value: format_completion_docs( | ||
r#"env(_ environmentVariable: string)"#, | ||
r#"Specifies a datasource via an environment variable. When running a Prisma CLI command that needs the database connection URL (e.g. `prisma db pull`), you need to make sure that the `DATABASE_URL` environment variable is set. One way to do so is by creating a `.env` file. Note that the file must be in the same directory as your schema.prisma file to automatically be picked up by the Prisma CLI.""#, | ||
Some(HashMap::from([( | ||
"environmentVariable", | ||
"The environment variable in which the database connection URL is stored.", | ||
)])), | ||
), | ||
})), | ||
..Default::default() | ||
}) | ||
} | ||
|
||
pub(super) fn url_quotes_completion(completion_list: &mut CompletionList) { | ||
completion_list.items.push(CompletionItem { | ||
label: r#""""#.to_owned(), | ||
insert_text: Some(r#""$0""#.to_owned()), | ||
insert_text_format: Some(InsertTextFormat::SNIPPET), | ||
kind: Some(CompletionItemKind::PROPERTY), | ||
documentation: Some(Documentation::MarkupContent(MarkupContent { | ||
kind: MarkupKind::Markdown, | ||
value: format_completion_docs( | ||
r#""connectionString""#, | ||
r#"Connection URL including authentication info. Each datasource provider documents the URL syntax. Most providers use the syntax provided by the database. [Learn more](https://pris.ly/d/prisma-schema)."#, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Duplication with line 92 avoidable? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As an update to
|
||
None, | ||
), | ||
})), | ||
..Default::default() | ||
}) | ||
} | ||
|
||
pub(super) fn url_env_db_completion(completion_list: &mut CompletionList, kind: &str, ctx: CompletionContext<'_>) { | ||
let text = match kind { | ||
"url" => "DATABASE_URL", | ||
"directUrl" => "DIRECT_URL", | ||
"shadowDatabaseUrl" => "SHADOW_DATABASE_URL", | ||
_ => unreachable!(), | ||
}; | ||
|
||
let insert_text = if add_quotes(ctx.params, ctx.db.source()) { | ||
format!(r#""{text}""#) | ||
} else { | ||
text.to_owned() | ||
}; | ||
|
||
completion_list.items.push(CompletionItem { | ||
label: text.to_owned(), | ||
insert_text: Some(insert_text), | ||
insert_text_format: Some(InsertTextFormat::PLAIN_TEXT), | ||
kind: Some(CompletionItemKind::CONSTANT), | ||
..Default::default() | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
55 changes: 55 additions & 0 deletions
55
...a-fmt/tests/text_document_completion/scenarios/datasource_default_completions/result.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
{ | ||
"isIncomplete": false, | ||
"items": [ | ||
{ | ||
"label": "provider", | ||
"kind": 5, | ||
"documentation": { | ||
"kind": "markdown", | ||
"value": "```prisma\nprovider = \"foo\"\n```\n___\nDescribes which datasource connector to use. Can be one of the following datasource providers: `postgresql`, `mysql`, `sqlserver`, `sqlite`, `mongodb` or `cockroachdb`.\n\n" | ||
}, | ||
"insertText": "provider = $0", | ||
"insertTextFormat": 2 | ||
}, | ||
{ | ||
"label": "url", | ||
"kind": 5, | ||
"documentation": { | ||
"kind": "markdown", | ||
"value": "```prisma\nurl = \"String\" | env(\"ENVIRONMENT_VARIABLE\")\n```\n___\nConnection URL including authentication info. Each datasource provider documents the URL syntax. Most providers use the syntax provided by the database. [Learn more](https://pris.ly/d/connection-strings).\n\n" | ||
}, | ||
"insertText": "url = $0", | ||
"insertTextFormat": 2 | ||
}, | ||
{ | ||
"label": "shadowDatabaseUrl", | ||
"kind": 5, | ||
"documentation": { | ||
"kind": "markdown", | ||
"value": "```prisma\nshadowDatabaseUrl = \"String\" | env(\"ENVIRONMENT_VARIABLE\")\n```\n___\nConnection URL including authentication info to use for Migrate's [shadow database](https://pris.ly/d/migrate-shadow).\n\n" | ||
}, | ||
"insertText": "shadowDatabaseUrl = $0", | ||
"insertTextFormat": 2 | ||
}, | ||
{ | ||
"label": "directUrl", | ||
"kind": 5, | ||
"documentation": { | ||
"kind": "markdown", | ||
"value": "```prisma\ndirectUrl = \"String\" | env(\"ENVIRONMENT_VARIABLE\")\n```\n___\nConnection URL for direct connection to the database. [Learn more](https://pris.ly/d/data-proxy-cli).\n\n" | ||
}, | ||
"insertText": "directUrl = $0", | ||
"insertTextFormat": 2 | ||
}, | ||
{ | ||
"label": "relationMode", | ||
"kind": 5, | ||
"documentation": { | ||
"kind": "markdown", | ||
"value": "```prisma\nrelationMode = \"foreignKeys\" | \"prisma\"\n```\n___\nSet the global relation mode for all relations. Values can be either \"foreignKeys\" (Default), or \"prisma\". [Learn more](https://pris.ly/d/relation-mode)\n\n" | ||
}, | ||
"insertText": "relationmode = $0", | ||
pimeys marked this conversation as resolved.
Show resolved
Hide resolved
|
||
"insertTextFormat": 2 | ||
} | ||
] | ||
} |
7 changes: 7 additions & 0 deletions
7
...fmt/tests/text_document_completion/scenarios/datasource_default_completions/schema.prisma
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
generator client { | ||
provider = "prisma-client-js" | ||
} | ||
|
||
datasource db { | ||
<|> | ||
} |
25 changes: 25 additions & 0 deletions
25
...-fmt/tests/text_document_completion/scenarios/datasource_direct_url_arguments/result.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
{ | ||
"isIncomplete": false, | ||
"items": [ | ||
{ | ||
"label": "env()", | ||
"kind": 10, | ||
"documentation": { | ||
"kind": "markdown", | ||
"value": "```prisma\nenv(_ environmentVariable: string)\n```\n___\nSpecifies a datasource via an environment variable. When running a Prisma CLI command that needs the database connection URL (e.g. `prisma db pull`), you need to make sure that the `DATABASE_URL` environment variable is set. One way to do so is by creating a `.env` file. Note that the file must be in the same directory as your schema.prisma file to automatically be picked up by the Prisma CLI.\"\n\n_@param_ environmentVariable The environment variable in which the database connection URL is stored." | ||
}, | ||
"insertText": "env($0)", | ||
"insertTextFormat": 2 | ||
}, | ||
{ | ||
"label": "\"\"", | ||
"kind": 10, | ||
"documentation": { | ||
"kind": "markdown", | ||
"value": "```prisma\n\"connectionString\"\n```\n___\nConnection URL including authentication info. Each datasource provider documents the URL syntax. Most providers use the syntax provided by the database. [Learn more](https://pris.ly/d/prisma-schema).\n\n" | ||
}, | ||
"insertText": "\"$0\"", | ||
"insertTextFormat": 2 | ||
} | ||
] | ||
} |
10 changes: 10 additions & 0 deletions
10
...mt/tests/text_document_completion/scenarios/datasource_direct_url_arguments/schema.prisma
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
generator client { | ||
provider = "prisma-client-js" | ||
previewFeatures = ["multischema"] | ||
} | ||
|
||
datasource db { | ||
provider = "postgresql" | ||
url = "" | ||
directUrl = <|> | ||
} |
11 changes: 11 additions & 0 deletions
11
prisma-fmt/tests/text_document_completion/scenarios/datasource_env_db_direct_url/result.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
{ | ||
"isIncomplete": false, | ||
"items": [ | ||
{ | ||
"label": "DIRECT_URL", | ||
"kind": 21, | ||
"insertText": "DIRECT_URL", | ||
"insertTextFormat": 1 | ||
} | ||
] | ||
} |
10 changes: 10 additions & 0 deletions
10
...a-fmt/tests/text_document_completion/scenarios/datasource_env_db_direct_url/schema.prisma
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
generator client { | ||
provider = "prisma-client-js" | ||
previewFeatures = ["multischema"] | ||
} | ||
|
||
datasource db { | ||
provider = "postgresql" | ||
url = env("") | ||
directUrl = env("<|>") | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd implement these directly in the datasource. So, we could ask from datasource
ds.schemas_defined()
and so on.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure do we really need this. Maybe in a follow-up PR.