Skip to content

Commit

Permalink
Support description in snippets (#1705)
Browse files Browse the repository at this point in the history
Support a description field in snippet files
  • Loading branch information
AndreasArvidsson authored Jan 26, 2025
1 parent 3b0c238 commit 1775118
Showing 3 changed files with 27 additions and 13 deletions.
1 change: 1 addition & 0 deletions core/snippets/README.md
Original file line number Diff line number Diff line change
@@ -32,6 +32,7 @@ Custom format to represent snippets.
| Key | Required | Multiple values | Example |
| -------------- | -------- | --------------- | ------------------------------ |
| name | Yes | No | `name: ifStatement` |
| description | No | No | `description: My snippet` |
| language | No | Yes | `language: javascript \| java` |
| phrase | No | Yes | `phrase: if \| if state` |
| insertionScope | No | Yes | `insertionScope: statement` |
19 changes: 10 additions & 9 deletions core/snippets/snippet_types.py
Original file line number Diff line number Diff line change
@@ -4,19 +4,20 @@
@dataclass
class SnippetVariable:
name: str
insertion_formatters: list[str] = None
wrapper_phrases: list[str] = None
wrapper_scope: str = None
insertion_formatters: list[str] | None = None
wrapper_phrases: list[str] | None = None
wrapper_scope: str | None = None


@dataclass
class Snippet:
name: str
body: str
phrases: list[str] = None
insertion_scopes: list[str] = None
languages: list[str] = None
variables: list[SnippetVariable] = None
description: str | None
phrases: list[str] | None = None
insertion_scopes: list[str] | None = None
languages: list[str] | None = None
variables: list[SnippetVariable] | None = None

def get_variable(self, name: str):
if self.variables:
@@ -35,11 +36,11 @@ def get_variable_strict(self, name: str):
@dataclass
class InsertionSnippet:
body: str
scopes: list[str] = None
scopes: list[str] | None = None


@dataclass
class WrapperSnippet:
body: str
variable_name: str
scope: str = None
scope: str | None = None
20 changes: 16 additions & 4 deletions core/snippets/snippets_parser.py
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@ class SnippetDocument:
line_body: int
variables: list[SnippetVariable] = []
name: str | None = None
description: str | None = None
phrases: list[str] | None = None
insertionScopes: list[str] | None = None
languages: list[str] | None = None
@@ -48,10 +49,12 @@ def create_snippets(documents: list[SnippetDocument]) -> list[Snippet]:


def create_snippet(
document: SnippetDocument, default_context: SnippetDocument
document: SnippetDocument,
default_context: SnippetDocument,
) -> Snippet | None:
snippet = Snippet(
name=document.name or default_context.name,
name=document.name or default_context.name or "",
description=document.description or default_context.description,
languages=document.languages or default_context.languages,
phrases=document.phrases or default_context.phrases,
insertion_scopes=document.insertionScopes or default_context.insertionScopes,
@@ -72,6 +75,10 @@ def validate_snippet(document: SnippetDocument, snippet: Snippet) -> bool:
error(document.file, document.line_doc, "Missing snippet name")
is_valid = False

if snippet.variables is None:
error(document.file, document.line_doc, "Missing snippet variables")
return False

for variable in snippet.variables:
var_name = f"${variable.name}"
if var_name not in snippet.body:
@@ -125,9 +132,12 @@ def combine_variables(
return list(variables.values())


def normalize_snippet_body_tabs(body: str) -> str:
def normalize_snippet_body_tabs(body: str | None) -> str:
if not body:
return ""

# If snippet body already contains tabs. No change.
if not body or "\t" in body:
if "\t" in body:
return body

lines = []
@@ -276,6 +286,8 @@ def parse_context_line(
match key:
case "name":
document.name = value
case "description":
document.description = value
case "phrase":
document.phrases = parse_vector_value(value)
case "insertionScope":

0 comments on commit 1775118

Please sign in to comment.