completions: Add types in typeof<> and as<>

This commit is contained in:
James Westman 2025-05-03 13:30:55 -05:00
parent d5b2ee3589
commit e9206809d6
No known key found for this signature in database
GPG key ID: CE2DBA0ADB654EA6
10 changed files with 124 additions and 39 deletions

View file

@ -44,7 +44,7 @@ from .gtkbuilder_child import (
from .gtkbuilder_template import Template
from .imports import GtkDirective, Import
from .response_id import ExtResponse
from .types import ClassName
from .types import BracketedTypeName, ClassName, TypeName
from .ui import UI
from .values import (
ArrayValue,

View file

@ -21,7 +21,7 @@
from ..decompiler import decompile_element
from .common import *
from .contexts import ScopeCtx, ValueTypeCtx
from .types import TypeName
from .types import BracketedTypeName, TypeName
expr = Sequence()
@ -196,7 +196,7 @@ class CastExpr(InfixExpr):
grammar = [
Keyword("as"),
AnyOf(
["<", TypeName, Match(">").expected()],
BracketedTypeName,
[
UseExact("lparen", "("),
TypeName,
@ -211,7 +211,13 @@ class CastExpr(InfixExpr):
@property
def type(self) -> T.Optional[GirType]:
return self.children[TypeName][0].gir_type
if len(self.children[BracketedTypeName]) == 1:
type_name = self.children[BracketedTypeName][0].type_name
return None if type_name is None else type_name.gir_type
elif len(self.children[TypeName]) == 1:
return self.children[TypeName][0].gir_type
else:
return None
@validate()
def cast_makes_sense(self):

View file

@ -27,11 +27,11 @@ class TypeName(AstNode):
[
UseIdent("namespace"),
".",
UseIdent("class_name"),
UseIdent("class_name").expected("class name"),
],
[
AnyOf("$", [".", UseLiteral("old_extern", True)]),
UseIdent("class_name"),
UseIdent("class_name").expected("class name"),
UseLiteral("extern", True),
],
UseIdent("class_name"),
@ -47,7 +47,11 @@ class TypeName(AstNode):
@validate("class_name")
def type_exists(self):
if not self.tokens["extern"] and self.gir_ns is not None:
if (
not self.tokens["extern"]
and self.gir_ns is not None
and self.tokens["class_name"] is not None
):
self.root.gir.validate_type(
self.tokens["class_name"], self.tokens["namespace"]
)
@ -182,3 +186,14 @@ class TemplateClassName(ClassName):
self.root.gir.validate_type(
self.tokens["class_name"], self.tokens["namespace"]
)
class BracketedTypeName(AstNode):
grammar = Statement("<", to_parse_node(TypeName).expected("type name"), end=">")
@property
def type_name(self) -> T.Optional[TypeName]:
if len(self.children[TypeName]) == 0:
return None
return self.children[TypeName][0]

View file

@ -26,7 +26,7 @@ from .common import *
from .contexts import ExprValueCtx, ScopeCtx, ValueTypeCtx
from .expression import Expression
from .gobject_object import Object
from .types import TypeName
from .types import BracketedTypeName, TypeName
class Translated(AstNode):
@ -80,11 +80,7 @@ class TypeLiteral(AstNode):
grammar = [
"typeof",
AnyOf(
[
"<",
to_parse_node(TypeName).expected("type name"),
Match(">").expected(),
],
BracketedTypeName,
[
UseExact("lparen", "("),
to_parse_node(TypeName).expected("type name"),
@ -98,8 +94,13 @@ class TypeLiteral(AstNode):
return gir.TypeType()
@property
def type_name(self) -> TypeName:
return self.children[TypeName][0]
def type_name(self) -> T.Optional[TypeName]:
if len(self.children[BracketedTypeName]) == 1:
return self.children[BracketedTypeName][0].type_name
elif len(self.children[TypeName]) == 1:
return self.children[TypeName][0]
else:
return None
@validate()
def validate_for_type(self) -> None: