diff --git a/blueprintcompiler/formatter.py b/blueprintcompiler/formatter.py index 35da5d2..60d87b4 100644 --- a/blueprintcompiler/formatter.py +++ b/blueprintcompiler/formatter.py @@ -146,8 +146,10 @@ def format(data, tab_size=2, insert_space=True): is_child_type = False elif str_item in CLOSING_TOKENS: - if str_item == "]" and last_not_whitespace != ",": + if str_item == "]" and str(last_not_whitespace) != "[": current_line = current_line[:-1] + if str(last_not_whitespace) != ",": + current_line += "," commit_current_line() current_line = "]" elif str(last_not_whitespace) in OPENING_TOKENS: diff --git a/blueprintcompiler/language/gobject_signal.py b/blueprintcompiler/language/gobject_signal.py index b052e3c..9c27b97 100644 --- a/blueprintcompiler/language/gobject_signal.py +++ b/blueprintcompiler/language/gobject_signal.py @@ -143,12 +143,13 @@ class Signal(AstNode): @property def document_symbol(self) -> DocumentSymbol: + detail = self.ranges["detail_start", "detail_end"] return DocumentSymbol( self.full_name, SymbolKind.Event, self.range, self.group.tokens["name"].range, - self.ranges["detail_start", "detail_end"].text, + detail.text if detail is not None else None, ) def get_reference(self, idx: int) -> T.Optional[LocationLink]: diff --git a/blueprintcompiler/language/values.py b/blueprintcompiler/language/values.py index 6d60724..5556d99 100644 --- a/blueprintcompiler/language/values.py +++ b/blueprintcompiler/language/values.py @@ -487,6 +487,14 @@ class ArrayValue(AstNode): range=quoted_literal.range, ) ) + elif isinstance(value.child, Translated): + errors.append( + CompileError( + "Arrays can't contain translated strings", + range=value.child.range, + ) + ) + if len(errors) > 0: raise MultipleErrors(errors) diff --git a/blueprintcompiler/lsp.py b/blueprintcompiler/lsp.py index 0659154..c4076b4 100644 --- a/blueprintcompiler/lsp.py +++ b/blueprintcompiler/lsp.py @@ -118,6 +118,7 @@ class LanguageServer: self.client_capabilities = {} self.client_supports_completion_choice = False self._open_files: T.Dict[str, OpenFile] = {} + self._exited = False def run(self): # Read tags from gir files. During normal compilation these are @@ -125,7 +126,7 @@ class LanguageServer: xml_reader.PARSE_GIR.add("doc") try: - while True: + while not self._exited: line = "" content_len = -1 while content_len == -1 or (line != "\n" and line != "\r\n"): @@ -221,6 +222,14 @@ class LanguageServer: }, ) + @command("shutdown") + def shutdown(self, id, params): + self._send_response(id, None) + + @command("exit") + def exit(self, id, params): + self._exited = True + @command("textDocument/didOpen") def didOpen(self, id, params): doc = params.get("textDocument") diff --git a/tests/formatting/lists_in.blp b/tests/formatting/lists_in.blp new file mode 100644 index 0000000..66b37a2 --- /dev/null +++ b/tests/formatting/lists_in.blp @@ -0,0 +1,21 @@ +using Gtk 4.0; + +Box { + styles [] +} + +Box { + styles ["a"] +} + +Box { + styles ["a",] +} + +Box { + styles ["a", "b"] +} + +Box { + styles ["a", "b",] +} diff --git a/tests/formatting/lists_out.blp b/tests/formatting/lists_out.blp new file mode 100644 index 0000000..7f1fe4a --- /dev/null +++ b/tests/formatting/lists_out.blp @@ -0,0 +1,31 @@ +using Gtk 4.0; + +Box { + styles [] +} + +Box { + styles [ + "a", + ] +} + +Box { + styles [ + "a", + ] +} + +Box { + styles [ + "a", + "b", + ] +} + +Box { + styles [ + "a", + "b", + ] +} diff --git a/tests/formatting/out.blp b/tests/formatting/out.blp index 9d9a8b4..b84c25f 100644 --- a/tests/formatting/out.blp +++ b/tests/formatting/out.blp @@ -11,7 +11,7 @@ Overlay { notify::icon-name => $on_icon_name_changed(label) swapped; styles [ - "destructive" + "destructive", ] } diff --git a/tests/sample_errors/incomplete_signal.blp b/tests/sample_errors/incomplete_signal.blp new file mode 100644 index 0000000..4ec693d --- /dev/null +++ b/tests/sample_errors/incomplete_signal.blp @@ -0,0 +1,5 @@ +using Gtk 4.0; + +Label { + notify:: +} diff --git a/tests/sample_errors/incomplete_signal.err b/tests/sample_errors/incomplete_signal.err new file mode 100644 index 0000000..901ef3b --- /dev/null +++ b/tests/sample_errors/incomplete_signal.err @@ -0,0 +1,2 @@ +5,1,0,Expected a signal detail name +4,9,3,Unexpected tokens \ No newline at end of file diff --git a/tests/sample_errors/translated_string_array.blp b/tests/sample_errors/translated_string_array.blp new file mode 100644 index 0000000..451d900 --- /dev/null +++ b/tests/sample_errors/translated_string_array.blp @@ -0,0 +1,7 @@ +using Gtk 4.0; + +StringList { + strings: [ + _("Test") + ]; +} diff --git a/tests/sample_errors/translated_string_array.err b/tests/sample_errors/translated_string_array.err new file mode 100644 index 0000000..0beb7e5 --- /dev/null +++ b/tests/sample_errors/translated_string_array.err @@ -0,0 +1 @@ +5,5,9,Arrays can't contain translated strings \ No newline at end of file diff --git a/tests/samples/string_array.blp b/tests/samples/string_array.blp index 2542d17..85a68fe 100644 --- a/tests/samples/string_array.blp +++ b/tests/samples/string_array.blp @@ -5,6 +5,6 @@ AboutDialog about { authors: [ "Jane doe ", - "Jhonny D " + "Jhonny D ", ]; } diff --git a/tests/samples/style.blp b/tests/samples/style.blp index fe20f52..63720de 100644 --- a/tests/samples/style.blp +++ b/tests/samples/style.blp @@ -3,6 +3,6 @@ using Gtk 4.0; Label { styles [ "class-1", - "class-2" + "class-2", ] } diff --git a/tests/test_formatter.py b/tests/test_formatter.py index af4f9f5..a2cb60f 100644 --- a/tests/test_formatter.py +++ b/tests/test_formatter.py @@ -47,3 +47,4 @@ class TestFormatter(unittest.TestCase): self.assert_format_test("correct1.blp", "correct1.blp") self.assert_format_test("string_in.blp", "string_out.blp") self.assert_format_test("comment_in.blp", "comment_out.blp") + self.assert_format_test("lists_in.blp", "lists_out.blp")