From 9b9fab832bb5dc3a23b6a25ac8233f7db1c62976 Mon Sep 17 00:00:00 2001 From: James Westman Date: Sun, 22 Dec 2024 18:00:39 -0600 Subject: [PATCH] Add tests, remove unused code, fix bugs - Added tests for more error messages - Test the "go to reference" feature at every character index of every test case - Delete unused code and imports - Fix some bugs I found along the way --- blueprintcompiler/ast_utils.py | 32 +++++++++++---- blueprintcompiler/completions.py | 11 ++--- blueprintcompiler/completions_utils.py | 11 ----- blueprintcompiler/formatter.py | 7 ++-- blueprintcompiler/gir.py | 41 +++++++------------ blueprintcompiler/language/__init__.py | 3 +- .../language/adw_response_dialog.py | 5 --- blueprintcompiler/language/attributes.py | 32 --------------- blueprintcompiler/language/expression.py | 21 ---------- .../language/gobject_property.py | 2 +- blueprintcompiler/language/gobject_signal.py | 2 +- blueprintcompiler/language/gtk_a11y.py | 4 +- .../language/gtk_combo_box_text.py | 1 - .../language/gtk_list_item_factory.py | 11 ++--- blueprintcompiler/language/imports.py | 14 ++----- blueprintcompiler/outputs/xml/__init__.py | 5 ++- blueprintcompiler/outputs/xml/xml_emitter.py | 4 +- blueprintcompiler/parse_tree.py | 35 +--------------- tests/formatting/comment_in.blp | 2 + tests/formatting/comment_out.blp | 2 + .../sample_errors/float_to_int_assignment.blp | 5 +++ .../sample_errors/float_to_int_assignment.err | 1 + tests/sample_errors/int_object.blp | 3 ++ tests/sample_errors/int_object.err | 1 + tests/sample_errors/menu_assignment.blp | 7 ++++ tests/sample_errors/menu_assignment.err | 1 + .../string_to_num_assignment.blp | 5 +++ .../string_to_num_assignment.err | 1 + .../string_to_object_assignment.blp | 5 +++ .../string_to_object_assignment.err | 1 + .../string_to_type_assignment.blp | 6 +++ .../string_to_type_assignment.err | 1 + tests/sample_errors/translated_assignment.blp | 5 +++ tests/sample_errors/translated_assignment.err | 1 + tests/sample_errors/typeof_assignment.blp | 5 +++ tests/sample_errors/typeof_assignment.err | 1 + tests/sample_errors/unrecognized_syntax.blp | 1 + tests/sample_errors/unrecognized_syntax.err | 1 + tests/sample_errors/upgrade_sync_create.blp | 5 +++ tests/sample_errors/upgrade_sync_create.err | 1 + .../upgrade_template_list_item.blp | 5 +++ .../upgrade_template_list_item.err | 1 + tests/samples/property_binding.blp | 1 + tests/samples/property_binding.ui | 1 + tests/samples/property_binding_dec.blp | 11 ----- tests/test_formatter.py | 1 + tests/test_samples.py | 8 +++- 47 files changed, 140 insertions(+), 190 deletions(-) delete mode 100644 blueprintcompiler/language/attributes.py create mode 100644 tests/formatting/comment_in.blp create mode 100644 tests/formatting/comment_out.blp create mode 100644 tests/sample_errors/float_to_int_assignment.blp create mode 100644 tests/sample_errors/float_to_int_assignment.err create mode 100644 tests/sample_errors/int_object.blp create mode 100644 tests/sample_errors/int_object.err create mode 100644 tests/sample_errors/menu_assignment.blp create mode 100644 tests/sample_errors/menu_assignment.err create mode 100644 tests/sample_errors/string_to_num_assignment.blp create mode 100644 tests/sample_errors/string_to_num_assignment.err create mode 100644 tests/sample_errors/string_to_object_assignment.blp create mode 100644 tests/sample_errors/string_to_object_assignment.err create mode 100644 tests/sample_errors/string_to_type_assignment.blp create mode 100644 tests/sample_errors/string_to_type_assignment.err create mode 100644 tests/sample_errors/translated_assignment.blp create mode 100644 tests/sample_errors/translated_assignment.err create mode 100644 tests/sample_errors/typeof_assignment.blp create mode 100644 tests/sample_errors/typeof_assignment.err create mode 100644 tests/sample_errors/unrecognized_syntax.blp create mode 100644 tests/sample_errors/unrecognized_syntax.err create mode 100644 tests/sample_errors/upgrade_sync_create.blp create mode 100644 tests/sample_errors/upgrade_sync_create.err create mode 100644 tests/sample_errors/upgrade_template_list_item.blp create mode 100644 tests/sample_errors/upgrade_template_list_item.err delete mode 100644 tests/samples/property_binding_dec.blp diff --git a/blueprintcompiler/ast_utils.py b/blueprintcompiler/ast_utils.py index bd5befa..8f742e0 100644 --- a/blueprintcompiler/ast_utils.py +++ b/blueprintcompiler/ast_utils.py @@ -160,6 +160,11 @@ class AstNode: yield e if e.fatal: return + except MultipleErrors as e: + for error in e.errors: + yield error + if error.fatal: + return for child in self.children: yield from child._get_errors() @@ -249,14 +254,7 @@ def validate( if skip_incomplete and self.incomplete: return - try: - func(self) - except CompileError as e: - # If the node is only partially complete, then an error must - # have already been reported at the parsing stage - if self.incomplete: - return - + def fill_error(e: CompileError): if e.range is None: e.range = ( Range.join( @@ -266,8 +264,26 @@ def validate( or self.range ) + try: + func(self) + except CompileError as e: + # If the node is only partially complete, then an error must + # have already been reported at the parsing stage + if self.incomplete: + return + + fill_error(e) + # Re-raise the exception raise e + except MultipleErrors as e: + if self.incomplete: + return + + for error in e.errors: + fill_error(error) + + raise e inner._validator = True return inner diff --git a/blueprintcompiler/completions.py b/blueprintcompiler/completions.py index e682513..5d36739 100644 --- a/blueprintcompiler/completions.py +++ b/blueprintcompiler/completions.py @@ -17,7 +17,6 @@ # # SPDX-License-Identifier: LGPL-3.0-or-later -import sys import typing as T from . import annotations, gir, language @@ -31,10 +30,6 @@ from .tokenizer import Token, TokenType Pattern = T.List[T.Tuple[TokenType, T.Optional[str]]] -def debug(*args, **kwargs): - print(*args, file=sys.stderr, **kwargs) - - def _complete( lsp, ast_node: AstNode, tokens: T.List[Token], idx: int, token_idx: int ) -> T.Iterator[Completion]: @@ -139,7 +134,7 @@ def gtk_object_completer(lsp, ast_node, match_variables): matches=new_statement_patterns, ) def property_completer(lsp, ast_node, match_variables): - if ast_node.gir_class and not isinstance(ast_node.gir_class, gir.ExternType): + if ast_node.gir_class and hasattr(ast_node.gir_class, "properties"): for prop_name, prop in ast_node.gir_class.properties.items(): if ( isinstance(prop.type, gir.BoolType) @@ -194,7 +189,7 @@ def property_completer(lsp, ast_node, match_variables): @completer( - applies_in=[language.Property, language.BaseAttribute], + applies_in=[language.Property, language.A11yProperty], matches=[[(TokenType.IDENT, None), (TokenType.OP, ":")]], ) def prop_value_completer(lsp, ast_node, match_variables): @@ -218,7 +213,7 @@ def prop_value_completer(lsp, ast_node, match_variables): matches=new_statement_patterns, ) def signal_completer(lsp, ast_node, match_variables): - if ast_node.gir_class and not isinstance(ast_node.gir_class, gir.ExternType): + if ast_node.gir_class and hasattr(ast_node.gir_class, "signals"): for signal_name, signal in ast_node.gir_class.signals.items(): if not isinstance(ast_node.parent, language.Object): name = "on" diff --git a/blueprintcompiler/completions_utils.py b/blueprintcompiler/completions_utils.py index 03bec0f..eccf125 100644 --- a/blueprintcompiler/completions_utils.py +++ b/blueprintcompiler/completions_utils.py @@ -31,17 +31,6 @@ new_statement_patterns = [ ] -def applies_to(*ast_types): - """Decorator describing which AST nodes the completer should apply in.""" - - def decorator(func): - for c in ast_types: - c.completers.append(func) - return func - - return decorator - - def completer(applies_in: T.List, matches: T.List = [], applies_in_subclass=None): def decorator(func): def inner(prev_tokens: T.List[Token], ast_node, lsp): diff --git a/blueprintcompiler/formatter.py b/blueprintcompiler/formatter.py index c003d45..35da5d2 100644 --- a/blueprintcompiler/formatter.py +++ b/blueprintcompiler/formatter.py @@ -20,7 +20,8 @@ import re from enum import Enum -from . import tokenizer, utils +from . import tokenizer +from .errors import CompilerBugError from .tokenizer import TokenType OPENING_TOKENS = ("{", "[") @@ -192,8 +193,8 @@ def format(data, tab_size=2, insert_space=True): commit_current_line(LineType.COMMENT, newlines_before=newlines) - else: - commit_current_line() + else: # pragma: no cover + raise CompilerBugError() elif str_item == "(" and ( re.match(r"^([A-Za-z_\-])+\s*\(", current_line) or watch_parentheses diff --git a/blueprintcompiler/gir.py b/blueprintcompiler/gir.py index e54b849..333f4ac 100644 --- a/blueprintcompiler/gir.py +++ b/blueprintcompiler/gir.py @@ -467,10 +467,13 @@ class Signature(GirNode): return result @cached_property - def return_type(self) -> GirType: - return self.get_containing(Repository)._resolve_type_id( - self.tl.SIGNATURE_RETURN_TYPE - ) + def return_type(self) -> T.Optional[GirType]: + if self.tl.SIGNATURE_RETURN_TYPE == 0: + return None + else: + return self.get_containing(Repository)._resolve_type_id( + self.tl.SIGNATURE_RETURN_TYPE + ) class Signal(GirNode): @@ -490,7 +493,10 @@ class Signal(GirNode): args = ", ".join( [f"{a.type.full_name} {a.name}" for a in self.gir_signature.args] ) - return f"signal {self.container.full_name}::{self.name} ({args})" + result = f"signal {self.container.full_name}::{self.name} ({args})" + if self.gir_signature.return_type is not None: + result += f" -> {self.gir_signature.return_type.full_name}" + return result @property def online_docs(self) -> T.Optional[str]: @@ -902,14 +908,6 @@ class Namespace(GirNode): if isinstance(entry, Class) } - @cached_property - def interfaces(self) -> T.Mapping[str, Interface]: - return { - name: entry - for name, entry in self.entries.items() - if isinstance(entry, Interface) - } - def get_type(self, name) -> T.Optional[GirType]: """Gets a type (class, interface, enum, etc.) from this namespace.""" return self.entries.get(name) @@ -933,13 +931,8 @@ class Namespace(GirNode): """Looks up a type in the scope of this namespace (including in the namespace's dependencies).""" - if type_name in _BASIC_TYPES: - return _BASIC_TYPES[type_name]() - elif "." in type_name: - ns, name = type_name.split(".", 1) - return self.get_containing(Repository).get_type(name, ns) - else: - return self.get_type(type_name) + ns, name = type_name.split(".", 1) + return self.get_containing(Repository).get_type(name, ns) @property def online_docs(self) -> T.Optional[str]: @@ -958,7 +951,7 @@ class Repository(GirNode): self.includes = { name: get_namespace(name, version) for name, version in deps } - except: + except: # pragma: no cover raise CompilerBugError(f"Failed to load dependencies.") else: self.includes = {} @@ -966,12 +959,6 @@ class Repository(GirNode): def get_type(self, name: str, ns: str) -> T.Optional[GirType]: return self.lookup_namespace(ns).get_type(name) - def get_type_by_cname(self, name: str) -> T.Optional[GirType]: - for ns in [self.namespace, *self.includes.values()]: - if type := ns.get_type_by_cname(name): - return type - return None - def lookup_namespace(self, ns: str): """Finds a namespace among this namespace's dependencies.""" if ns == self.namespace.name: diff --git a/blueprintcompiler/language/__init__.py b/blueprintcompiler/language/__init__.py index b302686..e797eaa 100644 --- a/blueprintcompiler/language/__init__.py +++ b/blueprintcompiler/language/__init__.py @@ -4,7 +4,6 @@ from .adw_breakpoint import ( AdwBreakpointSetters, ) from .adw_response_dialog import ExtAdwResponseDialog -from .attributes import BaseAttribute from .binding import Binding from .common import * from .contexts import ScopeCtx, ValueTypeCtx @@ -20,7 +19,7 @@ from .expression import ( from .gobject_object import Object, ObjectContent from .gobject_property import Property from .gobject_signal import Signal -from .gtk_a11y import ExtAccessibility +from .gtk_a11y import A11yProperty, ExtAccessibility from .gtk_combo_box_text import ExtComboBoxItems from .gtk_file_filter import ( Filters, diff --git a/blueprintcompiler/language/adw_response_dialog.py b/blueprintcompiler/language/adw_response_dialog.py index 5493d4d..d2680fd 100644 --- a/blueprintcompiler/language/adw_response_dialog.py +++ b/blueprintcompiler/language/adw_response_dialog.py @@ -20,7 +20,6 @@ from ..decompiler import decompile_translatable, truthy from .common import * -from .contexts import ValueTypeCtx from .gobject_object import ObjectContent, validate_parent_type from .values import StringValue @@ -94,10 +93,6 @@ class ExtAdwResponseDialogResponse(AstNode): self.value.range.text, ) - @context(ValueTypeCtx) - def value_type(self) -> ValueTypeCtx: - return ValueTypeCtx(StringType()) - @validate("id") def unique_in_parent(self): self.validate_unique_in_parent( diff --git a/blueprintcompiler/language/attributes.py b/blueprintcompiler/language/attributes.py deleted file mode 100644 index 8ff1f0b..0000000 --- a/blueprintcompiler/language/attributes.py +++ /dev/null @@ -1,32 +0,0 @@ -# attributes.py -# -# Copyright 2022 James Westman -# -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation; either version 3 of the -# License, or (at your option) any later version. -# -# This file is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program. If not, see . -# -# SPDX-License-Identifier: LGPL-3.0-or-later - - -from .common import * - - -class BaseAttribute(AstNode): - """A helper class for attribute syntax of the form `name: literal_value;`""" - - tag_name: str = "" - attr_name: str = "name" - - @property - def name(self): - return self.tokens["name"] diff --git a/blueprintcompiler/language/expression.py b/blueprintcompiler/language/expression.py index ae9c399..f305035 100644 --- a/blueprintcompiler/language/expression.py +++ b/blueprintcompiler/language/expression.py @@ -38,10 +38,6 @@ class ExprBase(AstNode): def type(self) -> T.Optional[GirType]: raise NotImplementedError() - @property - def type_complete(self) -> bool: - return True - @property def rhs(self) -> T.Optional["ExprBase"]: if isinstance(self.parent, Expression): @@ -65,10 +61,6 @@ class Expression(ExprBase): def type(self) -> T.Optional[GirType]: return self.last.type - @property - def type_complete(self) -> bool: - return self.last.type_complete - class InfixExpr(ExprBase): @property @@ -99,15 +91,6 @@ class LiteralExpr(ExprBase): def type(self) -> T.Optional[GirType]: return self.literal.value.type - @property - def type_complete(self) -> bool: - from .values import IdentLiteral - - if isinstance(self.literal.value, IdentLiteral): - if object := self.context[ScopeCtx].objects.get(self.literal.value.ident): - return not object.gir_class.incomplete - return True - class LookupOp(InfixExpr): grammar = [".", UseIdent("property")] @@ -211,10 +194,6 @@ class CastExpr(InfixExpr): def type(self) -> T.Optional[GirType]: return self.children[TypeName][0].gir_type - @property - def type_complete(self) -> bool: - return True - @validate() def cast_makes_sense(self): if self.type is None or self.lhs.type is None: diff --git a/blueprintcompiler/language/gobject_property.py b/blueprintcompiler/language/gobject_property.py index 5d0c867..b553909 100644 --- a/blueprintcompiler/language/gobject_property.py +++ b/blueprintcompiler/language/gobject_property.py @@ -51,7 +51,7 @@ class Property(AstNode): @property def document_symbol(self) -> DocumentSymbol: - if isinstance(self.value, ObjectValue): + if isinstance(self.value, ObjectValue) or self.value is None: detail = None else: detail = self.value.range.text diff --git a/blueprintcompiler/language/gobject_signal.py b/blueprintcompiler/language/gobject_signal.py index 79f9ae7..0e0332e 100644 --- a/blueprintcompiler/language/gobject_signal.py +++ b/blueprintcompiler/language/gobject_signal.py @@ -122,7 +122,7 @@ class Signal(AstNode): ) def get_reference(self, idx: int) -> T.Optional[LocationLink]: - if idx in self.group.tokens["object"].range: + if self.object_id is not None and idx in self.group.tokens["object"].range: obj = self.context[ScopeCtx].objects.get(self.object_id) if obj is not None: return LocationLink( diff --git a/blueprintcompiler/language/gtk_a11y.py b/blueprintcompiler/language/gtk_a11y.py index 3657565..0cc3cb3 100644 --- a/blueprintcompiler/language/gtk_a11y.py +++ b/blueprintcompiler/language/gtk_a11y.py @@ -19,8 +19,6 @@ import typing as T -from ..decompiler import escape_quote -from .attributes import BaseAttribute from .common import * from .contexts import ValueTypeCtx from .gobject_object import ObjectContent, validate_parent_type @@ -119,7 +117,7 @@ def _get_docs(gir, name): return gir_type.doc -class A11yProperty(BaseAttribute): +class A11yProperty(AstNode): grammar = Statement( UseIdent("name"), ":", diff --git a/blueprintcompiler/language/gtk_combo_box_text.py b/blueprintcompiler/language/gtk_combo_box_text.py index 312750a..32b3486 100644 --- a/blueprintcompiler/language/gtk_combo_box_text.py +++ b/blueprintcompiler/language/gtk_combo_box_text.py @@ -19,7 +19,6 @@ from .common import * -from .contexts import ValueTypeCtx from .gobject_object import ObjectContent, validate_parent_type from .values import StringValue diff --git a/blueprintcompiler/language/gtk_list_item_factory.py b/blueprintcompiler/language/gtk_list_item_factory.py index 3309c08..c9e1399 100644 --- a/blueprintcompiler/language/gtk_list_item_factory.py +++ b/blueprintcompiler/language/gtk_list_item_factory.py @@ -50,7 +50,7 @@ class ExtListItemFactory(AstNode): else: return self.root.gir.get_type("ListItem", "Gtk") - @validate("template") + @validate("id") def container_is_builder_list(self): validate_parent_type( self, @@ -59,7 +59,7 @@ class ExtListItemFactory(AstNode): "sub-templates", ) - @validate("template") + @validate("id") def unique_in_parent(self): self.validate_unique_in_parent("Duplicate template block") @@ -76,7 +76,7 @@ class ExtListItemFactory(AstNode): f"Only Gtk.ListItem, Gtk.ListHeader, Gtk.ColumnViewRow, or Gtk.ColumnViewCell is allowed as a type here" ) - @validate("template") + @validate("id") def type_name_upgrade(self): if self.type_name is None: raise UpgradeWarning( @@ -103,10 +103,7 @@ class ExtListItemFactory(AstNode): @property def action_widgets(self): - """ - The sub-template shouldn't have it`s own actions this is - just hear to satisfy XmlOutput._emit_object_or_template - """ + # The sub-template shouldn't have its own actions, this is just here to satisfy XmlOutput._emit_object_or_template return None @docs("id") diff --git a/blueprintcompiler/language/imports.py b/blueprintcompiler/language/imports.py index 3060bea..2d4bcf6 100644 --- a/blueprintcompiler/language/imports.py +++ b/blueprintcompiler/language/imports.py @@ -59,14 +59,8 @@ class GtkDirective(AstNode): @property def gir_namespace(self): - # validate the GTK version first to make sure the more specific error - # message is emitted - self.gtk_version() - if self.tokens["version"] is not None: - return gir.get_namespace("Gtk", self.tokens["version"]) - else: - # For better error handling, just assume it's 4.0 - return gir.get_namespace("Gtk", "4.0") + # For better error handling, just assume it's 4.0 + return gir.get_namespace("Gtk", "4.0") @docs() def ref_docs(self): @@ -90,7 +84,7 @@ class Import(AstNode): @validate("namespace", "version") def namespace_exists(self): - gir.get_namespace(self.tokens["namespace"], self.tokens["version"]) + gir.get_namespace(self.namespace, self.version) @validate() def unused(self): @@ -106,7 +100,7 @@ class Import(AstNode): @property def gir_namespace(self): try: - return gir.get_namespace(self.tokens["namespace"], self.tokens["version"]) + return gir.get_namespace(self.namespace, self.version) except CompileError: return None diff --git a/blueprintcompiler/outputs/xml/__init__.py b/blueprintcompiler/outputs/xml/__init__.py index 5e43834..420f6ef 100644 --- a/blueprintcompiler/outputs/xml/__init__.py +++ b/blueprintcompiler/outputs/xml/__init__.py @@ -366,12 +366,13 @@ class XmlOutput(OutputFormat): elif isinstance(extension, ExtScaleMarks): xml.start_tag("marks") - for mark in extension.children: + for mark in extension.marks: + label = mark.label.child if mark.label is not None else None xml.start_tag( "mark", value=mark.value, position=mark.position, - **self._translated_string_attrs(mark.label and mark.label.child), + **self._translated_string_attrs(label), ) if mark.label is not None: xml.put_text(mark.label.string) diff --git a/blueprintcompiler/outputs/xml/xml_emitter.py b/blueprintcompiler/outputs/xml/xml_emitter.py index ca87a49..ea91e03 100644 --- a/blueprintcompiler/outputs/xml/xml_emitter.py +++ b/blueprintcompiler/outputs/xml/xml_emitter.py @@ -40,7 +40,9 @@ class XmlEmitter: self._tag_stack = [] self._needs_newline = False - def start_tag(self, tag, **attrs: T.Union[str, GirType, ClassName, bool, None]): + def start_tag( + self, tag, **attrs: T.Union[str, GirType, ClassName, bool, None, float] + ): self._indent() self.result += f"<{tag}" for key, val in attrs.items(): diff --git a/blueprintcompiler/parse_tree.py b/blueprintcompiler/parse_tree.py index fff6e4a..ae062fb 100644 --- a/blueprintcompiler/parse_tree.py +++ b/blueprintcompiler/parse_tree.py @@ -95,19 +95,11 @@ class ParseGroup: try: return self.ast_type(self, children, self.keys, incomplete=self.incomplete) - except TypeError as e: + except TypeError: # pragma: no cover raise CompilerBugError( f"Failed to construct ast.{self.ast_type.__name__} from ParseGroup. See the previous stacktrace." ) - def __str__(self): - result = str(self.ast_type.__name__) - result += "".join([f"\n{key}: {val}" for key, val in self.keys.items()]) + "\n" - result += "\n".join( - [str(child) for children in self.children.values() for child in children] - ) - return result.replace("\n", "\n ") - class ParseContext: """Contains the state of the parser.""" @@ -265,10 +257,6 @@ class ParseNode: """Convenience method for err().""" return self.err("Expected " + expect) - def warn(self, message) -> "Warning": - """Causes this ParseNode to emit a warning if it parses successfully.""" - return Warning(self, message) - class Err(ParseNode): """ParseNode that emits a compile error if it fails to parse.""" @@ -290,27 +278,6 @@ class Err(ParseNode): return True -class Warning(ParseNode): - """ParseNode that emits a compile warning if it parses successfully.""" - - def __init__(self, child, message: str): - self.child = to_parse_node(child) - self.message = message - - def _parse(self, ctx: ParseContext): - ctx.skip() - start_idx = ctx.index - if self.child.parse(ctx).succeeded(): - start_token = ctx.tokens[start_idx] - end_token = ctx.tokens[ctx.index] - ctx.warnings.append( - CompileWarning(self.message, start_token.start, end_token.end) - ) - return True - else: - return False - - class Fail(ParseNode): """ParseNode that emits a compile error if it parses successfully.""" diff --git a/tests/formatting/comment_in.blp b/tests/formatting/comment_in.blp new file mode 100644 index 0000000..32a907c --- /dev/null +++ b/tests/formatting/comment_in.blp @@ -0,0 +1,2 @@ +using Gtk 4.0; +//comment \ No newline at end of file diff --git a/tests/formatting/comment_out.blp b/tests/formatting/comment_out.blp new file mode 100644 index 0000000..d5dca95 --- /dev/null +++ b/tests/formatting/comment_out.blp @@ -0,0 +1,2 @@ +using Gtk 4.0; +// comment diff --git a/tests/sample_errors/float_to_int_assignment.blp b/tests/sample_errors/float_to_int_assignment.blp new file mode 100644 index 0000000..73b5dc4 --- /dev/null +++ b/tests/sample_errors/float_to_int_assignment.blp @@ -0,0 +1,5 @@ +using Gtk 4.0; + +Entry { + margin-bottom: 10.5; +} diff --git a/tests/sample_errors/float_to_int_assignment.err b/tests/sample_errors/float_to_int_assignment.err new file mode 100644 index 0000000..0e9dc41 --- /dev/null +++ b/tests/sample_errors/float_to_int_assignment.err @@ -0,0 +1 @@ +4,18,4,Cannot convert 10.5 to integer \ No newline at end of file diff --git a/tests/sample_errors/int_object.blp b/tests/sample_errors/int_object.blp new file mode 100644 index 0000000..35b2562 --- /dev/null +++ b/tests/sample_errors/int_object.blp @@ -0,0 +1,3 @@ +using Gtk 4.0; + +int {} diff --git a/tests/sample_errors/int_object.err b/tests/sample_errors/int_object.err new file mode 100644 index 0000000..221e6e6 --- /dev/null +++ b/tests/sample_errors/int_object.err @@ -0,0 +1 @@ +3,1,3,int is not a class \ No newline at end of file diff --git a/tests/sample_errors/menu_assignment.blp b/tests/sample_errors/menu_assignment.blp new file mode 100644 index 0000000..9188d8a --- /dev/null +++ b/tests/sample_errors/menu_assignment.blp @@ -0,0 +1,7 @@ +using Gtk 4.0; + +Overlay { + child: my_menu; +} + +menu my_menu {} diff --git a/tests/sample_errors/menu_assignment.err b/tests/sample_errors/menu_assignment.err new file mode 100644 index 0000000..fb3187f --- /dev/null +++ b/tests/sample_errors/menu_assignment.err @@ -0,0 +1 @@ +4,10,7,Cannot assign Gio.Menu to Gtk.Widget \ No newline at end of file diff --git a/tests/sample_errors/string_to_num_assignment.blp b/tests/sample_errors/string_to_num_assignment.blp new file mode 100644 index 0000000..22e8fba --- /dev/null +++ b/tests/sample_errors/string_to_num_assignment.blp @@ -0,0 +1,5 @@ +using Gtk 4.0; + +Entry { + margin-bottom: "10"; +} diff --git a/tests/sample_errors/string_to_num_assignment.err b/tests/sample_errors/string_to_num_assignment.err new file mode 100644 index 0000000..98a6160 --- /dev/null +++ b/tests/sample_errors/string_to_num_assignment.err @@ -0,0 +1 @@ +4,18,4,Cannot convert string to number \ No newline at end of file diff --git a/tests/sample_errors/string_to_object_assignment.blp b/tests/sample_errors/string_to_object_assignment.blp new file mode 100644 index 0000000..0c070ba --- /dev/null +++ b/tests/sample_errors/string_to_object_assignment.blp @@ -0,0 +1,5 @@ +using Gtk 4.0; + +Button { + child: "Click me"; +} diff --git a/tests/sample_errors/string_to_object_assignment.err b/tests/sample_errors/string_to_object_assignment.err new file mode 100644 index 0000000..f9492af --- /dev/null +++ b/tests/sample_errors/string_to_object_assignment.err @@ -0,0 +1 @@ +4,10,10,Cannot convert string to Gtk.Widget \ No newline at end of file diff --git a/tests/sample_errors/string_to_type_assignment.blp b/tests/sample_errors/string_to_type_assignment.blp new file mode 100644 index 0000000..90f531b --- /dev/null +++ b/tests/sample_errors/string_to_type_assignment.blp @@ -0,0 +1,6 @@ +using Gtk 4.0; +using Gio 2.0; + +Gio.ListStore { + item-type: "Button"; +} diff --git a/tests/sample_errors/string_to_type_assignment.err b/tests/sample_errors/string_to_type_assignment.err new file mode 100644 index 0000000..adb9eb0 --- /dev/null +++ b/tests/sample_errors/string_to_type_assignment.err @@ -0,0 +1 @@ +5,14,8,Cannot convert string to GType \ No newline at end of file diff --git a/tests/sample_errors/translated_assignment.blp b/tests/sample_errors/translated_assignment.blp new file mode 100644 index 0000000..fa8fa9d --- /dev/null +++ b/tests/sample_errors/translated_assignment.blp @@ -0,0 +1,5 @@ +using Gtk 4.0; + +Button { + child: _("Click me"); +} diff --git a/tests/sample_errors/translated_assignment.err b/tests/sample_errors/translated_assignment.err new file mode 100644 index 0000000..78f6b96 --- /dev/null +++ b/tests/sample_errors/translated_assignment.err @@ -0,0 +1 @@ +4,10,13,Cannot convert translated string to Gtk.Widget \ No newline at end of file diff --git a/tests/sample_errors/typeof_assignment.blp b/tests/sample_errors/typeof_assignment.blp new file mode 100644 index 0000000..a20d92c --- /dev/null +++ b/tests/sample_errors/typeof_assignment.blp @@ -0,0 +1,5 @@ +using Gtk 4.0; + +Button { + label: typeof