mirror of
https://gitlab.gnome.org/jwestman/blueprint-compiler.git
synced 2025-05-04 15:59:08 -04:00
More errors for duplicates
This commit is contained in:
parent
2ca71de061
commit
6ac798ea6f
13 changed files with 105 additions and 9 deletions
|
@ -24,6 +24,23 @@ from .contexts import ScopeCtx
|
|||
from .common import *
|
||||
|
||||
|
||||
class SignalFlag(AstNode):
|
||||
grammar = AnyOf(
|
||||
UseExact("flag", "swapped"),
|
||||
UseExact("flag", "after"),
|
||||
)
|
||||
|
||||
@property
|
||||
def flag(self) -> str:
|
||||
return self.tokens["flag"]
|
||||
|
||||
@validate()
|
||||
def unique(self):
|
||||
self.validate_unique_in_parent(
|
||||
f"Duplicate flag '{self.flag}'", lambda x: x.flag == self.flag
|
||||
)
|
||||
|
||||
|
||||
class Signal(AstNode):
|
||||
grammar = Statement(
|
||||
UseIdent("name"),
|
||||
|
@ -39,12 +56,7 @@ class Signal(AstNode):
|
|||
Match("(").expected("argument list"),
|
||||
Optional(UseIdent("object")).expected("object identifier"),
|
||||
Match(")").expected(),
|
||||
ZeroOrMore(
|
||||
AnyOf(
|
||||
[Keyword("swapped"), UseLiteral("swapped", True)],
|
||||
[Keyword("after"), UseLiteral("after", True)],
|
||||
)
|
||||
),
|
||||
ZeroOrMore(SignalFlag),
|
||||
)
|
||||
|
||||
@property
|
||||
|
@ -55,6 +67,13 @@ class Signal(AstNode):
|
|||
def detail_name(self) -> T.Optional[str]:
|
||||
return self.tokens["detail_name"]
|
||||
|
||||
@property
|
||||
def full_name(self) -> str:
|
||||
if self.detail_name is None:
|
||||
return self.name
|
||||
else:
|
||||
return self.name + "::" + self.detail_name
|
||||
|
||||
@property
|
||||
def handler(self) -> str:
|
||||
return self.tokens["handler"]
|
||||
|
@ -63,13 +82,17 @@ class Signal(AstNode):
|
|||
def object_id(self) -> T.Optional[str]:
|
||||
return self.tokens["object"]
|
||||
|
||||
@property
|
||||
def flags(self) -> T.List[SignalFlag]:
|
||||
return self.children[SignalFlag]
|
||||
|
||||
@property
|
||||
def is_swapped(self) -> bool:
|
||||
return self.tokens["swapped"] or False
|
||||
return any(x.flag == "swapped" for x in self.flags)
|
||||
|
||||
@property
|
||||
def is_after(self) -> bool:
|
||||
return self.tokens["after"] or False
|
||||
return any(x.flag == "after" for x in self.flags)
|
||||
|
||||
@property
|
||||
def gir_signal(self):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue