pyVHDLModelTreesitter 0.4.0__tar.gz → 0.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/PKG-INFO +36 -5
  2. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/README.md +23 -0
  3. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/pyproject.toml +33 -20
  4. pyvhdlmodeltreesitter-0.5.1/src/pyVHDLModelTreesitter/Association.py +97 -0
  5. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/Base.py +3 -5
  6. pyvhdlmodeltreesitter-0.5.1/src/pyVHDLModelTreesitter/Concurrent.py +110 -0
  7. pyvhdlmodeltreesitter-0.5.1/src/pyVHDLModelTreesitter/DesignUnit.py +468 -0
  8. pyvhdlmodeltreesitter-0.5.1/src/pyVHDLModelTreesitter/Expression.py +309 -0
  9. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/Interface.py +30 -57
  10. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/Name.py +11 -0
  11. pyvhdlmodeltreesitter-0.5.1/src/pyVHDLModelTreesitter/Object.py +81 -0
  12. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/Symbol.py +44 -29
  13. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/_Design.py +4 -6
  14. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/_Document.py +50 -13
  15. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/_Library.py +1 -5
  16. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/__init__.py +2 -1
  17. pyvhdlmodeltreesitter-0.5.1/src/pyVHDLModelTreesitter/_parse.py +375 -0
  18. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/__init__.py +6 -4
  19. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/_base_class.py +8 -0
  20. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/_utils.py +57 -6
  21. pyvhdlmodeltreesitter-0.5.1/src/pyVHDLModelTreesitter/treesitter/queries/architecture_definition.scm +7 -0
  22. pyvhdlmodeltreesitter-0.5.1/src/pyVHDLModelTreesitter/treesitter/queries/association_element.scm +4 -0
  23. pyvhdlmodeltreesitter-0.5.1/src/pyVHDLModelTreesitter/treesitter/queries/association_elements.scm +7 -0
  24. pyvhdlmodeltreesitter-0.5.1/src/pyVHDLModelTreesitter/treesitter/queries/component_instantiation_statement.scm +18 -0
  25. pyvhdlmodeltreesitter-0.5.1/src/pyVHDLModelTreesitter/treesitter/queries/constant_declaration.scm +10 -0
  26. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/queries/entity_declaration.scm +2 -1
  27. pyvhdlmodeltreesitter-0.5.1/src/pyVHDLModelTreesitter/treesitter/queries/package_declaration.scm +5 -0
  28. pyvhdlmodeltreesitter-0.5.1/src/pyVHDLModelTreesitter/treesitter/queries/package_definition.scm +5 -0
  29. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/query.py +25 -1
  30. pyvhdlmodeltreesitter-0.4.0/src/pyVHDLModelTreesitter/Association.py +0 -36
  31. pyvhdlmodeltreesitter-0.4.0/src/pyVHDLModelTreesitter/DesignUnit.py +0 -270
  32. pyvhdlmodeltreesitter-0.4.0/src/pyVHDLModelTreesitter/Expression.py +0 -711
  33. pyvhdlmodeltreesitter-0.4.0/src/pyVHDLModelTreesitter/treesitter/queries/association_elements.scm +0 -3
  34. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/.gitignore +0 -0
  35. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/LICENSE +0 -0
  36. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/_errors.py +0 -0
  37. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/py.typed +0 -0
  38. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/queries/adding_expression.scm +0 -0
  39. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/queries/constrained_1d_array.scm +0 -0
  40. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/queries/design_units.scm +0 -0
  41. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/queries/function_call.scm +0 -0
  42. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/queries/ignorable_parentheses.scm +0 -0
  43. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/queries/interface_declaration.scm +0 -0
  44. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/queries/interface_declarations.scm +0 -0
  45. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/queries/library_clauses.scm +0 -0
  46. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/queries/library_namespaces.scm +0 -0
  47. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/queries/multiplying_expression.scm +0 -0
  48. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/queries/selected_names.scm +0 -0
  49. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/queries/simple_subtype.scm +0 -0
  50. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/queries/type_conversion.scm +0 -0
  51. {pyvhdlmodeltreesitter-0.4.0 → pyvhdlmodeltreesitter-0.5.1}/src/pyVHDLModelTreesitter/treesitter/queries/use_clauses.scm +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyVHDLModelTreesitter
3
- Version: 0.4.0
3
+ Version: 0.5.1
4
4
  Summary: An implementation of pyVHDLModel using treesitter
5
5
  Project-URL: Repository, https://gitlab.com/dawalters/pyVHDLModelTreesitter
6
6
  Author: Dominic Adam Walters
@@ -19,15 +19,23 @@ Requires-Dist: pyvhdlmodel>=0.32.0
19
19
  Requires-Dist: tree-sitter-vhdl>=1.2.5
20
20
  Requires-Dist: tree-sitter>=0.23.0
21
21
  Provides-Extra: dev
22
- Requires-Dist: coverage==7.13.5; extra == 'dev'
22
+ Requires-Dist: coverage==7.14.0; extra == 'dev'
23
+ Requires-Dist: cryptography==48.0.0; extra == 'dev'
23
24
  Requires-Dist: hatch==1.16.5; extra == 'dev'
24
- Requires-Dist: mypy==1.20.1; extra == 'dev'
25
- Requires-Dist: pre-commit==4.5.1; extra == 'dev'
25
+ Requires-Dist: idna==3.16; extra == 'dev'
26
+ Requires-Dist: jaraco-context==6.1.2; extra == 'dev'
27
+ Requires-Dist: mypy==2.1.0; extra == 'dev'
28
+ Requires-Dist: pre-commit==4.6.0; extra == 'dev'
29
+ Requires-Dist: pygments==2.20.0; extra == 'dev'
26
30
  Requires-Dist: pytest-cov==7.1.0; extra == 'dev'
31
+ Requires-Dist: pytest-order==1.4.0; extra == 'dev'
27
32
  Requires-Dist: pytest-sugar==1.1.1; extra == 'dev'
28
33
  Requires-Dist: pytest-xdist==3.8.0; extra == 'dev'
29
34
  Requires-Dist: pytest==9.0.3; extra == 'dev'
30
- Requires-Dist: ruff==0.15.10; extra == 'dev'
35
+ Requires-Dist: rich==15.0.0; extra == 'dev'
36
+ Requires-Dist: ruff==0.15.14; extra == 'dev'
37
+ Requires-Dist: ty==0.0.39; extra == 'dev'
38
+ Requires-Dist: uv==0.11.16; extra == 'dev'
31
39
  Description-Content-Type: text/markdown
32
40
 
33
41
  # pyVHDLModelTreesitter
@@ -74,6 +82,29 @@ document = pyVHDLModelTreesitter.Document.from_file("path/to/file.vhd")
74
82
 
75
83
  Detailed documentation is currently unavailable.
76
84
 
85
+ ## Setup for Development
86
+
87
+ ### Dependencies
88
+
89
+ Developers aiming to contribute to this repository need the following tools:
90
+
91
+ - `make`
92
+ - `uv`
93
+
94
+ All other dependencies are automatically obtained.
95
+
96
+ ### Initial setup
97
+
98
+ Simply:
99
+
100
+ ```bash
101
+ source ./settings.sh
102
+ ```
103
+
104
+ You can `make help` to see what actions are available.
105
+
106
+ ---
107
+
77
108
  [precommit-github]: https://github.com/pre-commit/pre-commit
78
109
  [pyVHDLModel-Document]: https://vhdl.github.io/pyVHDLModel/pyVHDLModel/pyVHDLModel.html#pyVHDLModel.Document
79
110
  [pyVHDLModel-github]: https://github.com/VHDL/pyVHDLModel
@@ -42,6 +42,29 @@ document = pyVHDLModelTreesitter.Document.from_file("path/to/file.vhd")
42
42
 
43
43
  Detailed documentation is currently unavailable.
44
44
 
45
+ ## Setup for Development
46
+
47
+ ### Dependencies
48
+
49
+ Developers aiming to contribute to this repository need the following tools:
50
+
51
+ - `make`
52
+ - `uv`
53
+
54
+ All other dependencies are automatically obtained.
55
+
56
+ ### Initial setup
57
+
58
+ Simply:
59
+
60
+ ```bash
61
+ source ./settings.sh
62
+ ```
63
+
64
+ You can `make help` to see what actions are available.
65
+
66
+ ---
67
+
45
68
  [precommit-github]: https://github.com/pre-commit/pre-commit
46
69
  [pyVHDLModel-Document]: https://vhdl.github.io/pyVHDLModel/pyVHDLModel/pyVHDLModel.html#pyVHDLModel.Document
47
70
  [pyVHDLModel-github]: https://github.com/VHDL/pyVHDLModel
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pyVHDLModelTreesitter"
7
- version = "0.4.0"
7
+ version = "0.5.1"
8
8
  description = "An implementation of pyVHDLModel using treesitter"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -18,28 +18,35 @@ authors = [
18
18
  ]
19
19
  keywords = ["language", "model", "treesitter", "vhdl"]
20
20
  classifiers = [
21
- "Development Status :: 3 - Alpha",
22
- "License :: OSI Approved :: MIT License",
23
- "Programming Language :: Python :: 3 :: Only",
24
- "Programming Language :: Python :: 3.11",
25
- "Programming Language :: Python :: 3.12",
26
- "Programming Language :: Python :: 3.13",
27
- "Programming Language :: Python :: 3.14",
28
- "Intended Audience :: Developers",
21
+ "Development Status :: 3 - Alpha",
22
+ "License :: OSI Approved :: MIT License",
23
+ "Programming Language :: Python :: 3 :: Only",
24
+ "Programming Language :: Python :: 3.11",
25
+ "Programming Language :: Python :: 3.12",
26
+ "Programming Language :: Python :: 3.13",
27
+ "Programming Language :: Python :: 3.14",
28
+ "Intended Audience :: Developers",
29
29
  ]
30
30
 
31
31
  [project.optional-dependencies]
32
32
  dev = [
33
- "coverage == 7.13.5",
33
+ "coverage == 7.14.0",
34
34
  "hatch == 1.16.5",
35
- "mypy == 1.20.1",
36
- "pre-commit == 4.5.1",
35
+ "cryptography == 48.0.0", # forced to avoid CVE
36
+ "idna == 3.16", # forced to avoid CVE
37
+ "jaraco-context == 6.1.2", # forced to avoid CVE
38
+ "mypy == 2.1.0",
39
+ "pre-commit == 4.6.0",
37
40
  "pytest == 9.0.3",
38
41
  "pytest-cov == 7.1.0",
42
+ "pytest-order == 1.4.0",
39
43
  "pytest-sugar == 1.1.1",
40
44
  "pytest-xdist == 3.8.0",
41
- "ruff == 0.15.10",
42
- # "sphinx == 8.1.3",
45
+ "rich == 15.0.0",
46
+ "pygments == 2.20.0", # forced to avoid CVE
47
+ "ruff == 0.15.14",
48
+ "ty == 0.0.39",
49
+ "uv == 0.11.16",
43
50
  ]
44
51
 
45
52
  [project.urls]
@@ -75,11 +82,7 @@ packages = ["src/pyVHDLModelTreesitter"]
75
82
 
76
83
  [tool.hatch.envs.hatch-test]
77
84
  dependencies = [
78
- "coverage == 7.13.5",
79
- "pytest == 9.0.3",
80
- "pytest-cov == 7.1.0",
81
- "pytest-sugar == 1.1.1",
82
- "pytest-xdist == 3.8.0",
85
+ "pyVHDLModelTreesitter[dev]",
83
86
  ]
84
87
 
85
88
  [[tool.hatch.envs.hatch-test.matrix]]
@@ -92,6 +95,7 @@ implicit_reexport = true
92
95
 
93
96
  [tool.pytest.ini_options]
94
97
  addopts = "--capture=fd -n 0 --cov=pyVHDLModelTreesitter --cov-report html --cov-report xml --verbose --junitxml=.junit.xml -o junit_family=legacy"
98
+ norecursedirs = "oss/*"
95
99
  testpaths = [
96
100
  "tests",
97
101
  ]
@@ -120,7 +124,16 @@ unfixable = [
120
124
  ]
121
125
 
122
126
  [tool.ruff.lint.flake8-self]
123
- ignore-names = ["_AddEntity"]
127
+ ignore-names = [
128
+ "_AddArchitecture",
129
+ "_AddEntity",
130
+ "_AddPackage",
131
+ "_AddPackageBody",
132
+ ]
124
133
 
125
134
  [tool.ruff.lint.isort]
126
135
  required-imports = ["from __future__ import annotations"]
136
+
137
+ [tool.ruff.lint.per-file-ignores]
138
+ "tests/**/*.py" = ["S101"]
139
+ "tests/examples/local/**/*.py" = ["D100", "D103", "INP001", "TID252"]
@@ -0,0 +1,97 @@
1
+ """Submodule mirroring modified aspects of pyVHDLModel.Association."""
2
+
3
+ from __future__ import annotations
4
+
5
+ __all__ = [
6
+ "AssociationItem",
7
+ "GenericAssociationItem",
8
+ "ParameterAssociationItem",
9
+ "PortAssociationItem",
10
+ ]
11
+
12
+ from typing import TYPE_CHECKING, Self
13
+
14
+ from pyVHDLModel.Association import AssociationItem as pyVHDLModel_AssociationItem
15
+ from pyVHDLModel.Association import (
16
+ GenericAssociationItem as pyVHDLModel_GenericAssociationItem,
17
+ )
18
+ from pyVHDLModel.Association import (
19
+ ParameterAssociationItem as pyVHDLModel_ParameterAssociationItem,
20
+ )
21
+ from pyVHDLModel.Association import (
22
+ PortAssociationItem as pyVHDLModel_PortAssociationItem,
23
+ )
24
+
25
+ from pyVHDLModelTreesitter._parse import parse_conditional_expression
26
+ from pyVHDLModelTreesitter.Name import selected_or_simple_name
27
+ from pyVHDLModelTreesitter.Symbol import SimpleObjectOrFunctionCallSymbol
28
+ from pyVHDLModelTreesitter.treesitter import (
29
+ TreesitterNodeMixin,
30
+ get_node,
31
+ get_node_text,
32
+ )
33
+ from pyVHDLModelTreesitter.treesitter.query import AssociationElement
34
+
35
+ if TYPE_CHECKING:
36
+ import tree_sitter
37
+
38
+
39
+ class AssociationItemMixin(TreesitterNodeMixin, pyVHDLModel_AssociationItem):
40
+ @classmethod
41
+ def from_treesitter_node(
42
+ cls,
43
+ node: tree_sitter.Node,
44
+ ) -> list[Self]:
45
+ """Create one or more AssociationItem from a treesitter node."""
46
+ captures = AssociationElement.capture_first_root(node)
47
+ formal_node = get_node(node, captures, "formal", optional=True)
48
+ formal = None
49
+ if formal_node is not None:
50
+ formal = SimpleObjectOrFunctionCallSymbol(
51
+ selected_or_simple_name(get_node_text(formal_node)),
52
+ )
53
+ actual_node = get_node(node, captures, "actual")
54
+ actual = parse_conditional_expression(actual_node)
55
+ if actual is None:
56
+ return []
57
+ return [cls(actual, formal, _treesitter_node=node)]
58
+
59
+ def __eq__(self, other: object) -> bool:
60
+ if not isinstance(other, self.__class__):
61
+ return False
62
+ return self._formal == other._formal and self._actual == other._actual
63
+
64
+ def __hash__(self) -> int:
65
+ return hash(
66
+ (
67
+ self._formal,
68
+ self._actual,
69
+ ),
70
+ )
71
+
72
+ def __repr__(self) -> str:
73
+ return (
74
+ f"{self.__class__.__name__}("
75
+ f"_formal={self._formal!r}, "
76
+ f"_actual={self._actual!r}, "
77
+ ")"
78
+ )
79
+
80
+
81
+ class AssociationItem(AssociationItemMixin): # noqa: D101
82
+ pass
83
+
84
+
85
+ class GenericAssociationItem(AssociationItemMixin, pyVHDLModel_GenericAssociationItem): # noqa: D101
86
+ pass
87
+
88
+
89
+ class ParameterAssociationItem( # noqa: D101
90
+ AssociationItemMixin,
91
+ pyVHDLModel_ParameterAssociationItem,
92
+ ):
93
+ pass
94
+
95
+
96
+ class PortAssociationItem(AssociationItemMixin, pyVHDLModel_PortAssociationItem): # noqa: D101
97
+ pass
@@ -6,7 +6,7 @@ __all__ = [
6
6
  "Range",
7
7
  ]
8
8
 
9
- from typing import TYPE_CHECKING, Self, cast
9
+ from typing import TYPE_CHECKING, Self
10
10
 
11
11
  import pyVHDLModel
12
12
 
@@ -20,7 +20,7 @@ from pyVHDLModelTreesitter._errors import (
20
20
  NodeTextIsNoneError,
21
21
  NotImplementedWarning,
22
22
  )
23
- from pyVHDLModelTreesitter.Expression import parse_simple_expression
23
+ from pyVHDLModelTreesitter._parse import parse_simple_expression
24
24
  from pyVHDLModelTreesitter.treesitter import TreesitterNodeMixin
25
25
 
26
26
 
@@ -134,10 +134,8 @@ class Range(TreesitterNodeMixin, pyVHDLModel.Base.Range): # noqa: D101
134
134
  return cls(left_expr, right_expr, direction, _treesitter_node=node)
135
135
 
136
136
  def __eq__(self, other: object) -> bool: # noqa: D105
137
- if not isinstance(other, Range):
137
+ if not isinstance(other, self.__class__):
138
138
  return False
139
- # Required for LSP completions
140
- other = cast("Range", other) # type: ignore[redundant-cast]
141
139
  return (
142
140
  self._leftBound == other._leftBound
143
141
  and self._rightBound == other._rightBound
@@ -0,0 +1,110 @@
1
+ """Submodule mirroring modified aspects of pyVHDLModel.Concurrent."""
2
+
3
+ from __future__ import annotations
4
+
5
+ __all__ = [
6
+ "EntityInstantiation",
7
+ ]
8
+
9
+ from typing import TYPE_CHECKING, Self
10
+
11
+ from pyVHDLModel.Concurrent import (
12
+ EntityInstantiation as pyVHDLModel_EntityInstantiation,
13
+ )
14
+
15
+ from pyVHDLModelTreesitter.Association import (
16
+ GenericAssociationItem,
17
+ PortAssociationItem,
18
+ )
19
+ from pyVHDLModelTreesitter.Name import selected_or_simple_name
20
+ from pyVHDLModelTreesitter.Symbol import ArchitectureSymbol, EntityInstantiationSymbol
21
+ from pyVHDLModelTreesitter.treesitter import (
22
+ TreesitterNodeMixin,
23
+ get_node,
24
+ get_node_text,
25
+ get_nodes,
26
+ )
27
+ from pyVHDLModelTreesitter.treesitter.query import ComponentInstantiationStatement
28
+
29
+ if TYPE_CHECKING:
30
+ import tree_sitter
31
+
32
+
33
+ class EntityInstantiation(TreesitterNodeMixin, pyVHDLModel_EntityInstantiation): # noqa: D101
34
+ @classmethod
35
+ def from_treesitter_node(
36
+ cls,
37
+ node: tree_sitter.Node,
38
+ ) -> list[Self]:
39
+ """Create one or more `EntityInstantiation`s from a treesitter node."""
40
+ captures = ComponentInstantiationStatement.capture(node)
41
+ label_node = get_node(node, captures, "label")
42
+ label = get_node_text(label_node)
43
+ entity_str = ""
44
+ namespace_node = get_node(node, captures, "namespace", optional=True)
45
+ if namespace_node is not None:
46
+ entity_str = f"{get_node_text(namespace_node)}."
47
+ entity_node = get_node(node, captures, "entity")
48
+ entity_str += get_node_text(entity_node)
49
+ entity_symbol = EntityInstantiationSymbol(
50
+ selected_or_simple_name(entity_str),
51
+ )
52
+ architecture_node = get_node(node, captures, "architecture", optional=True)
53
+ architecture_symbol = None
54
+ if architecture_node is not None:
55
+ architecture_symbol = ArchitectureSymbol(
56
+ selected_or_simple_name(get_node_text(architecture_node)),
57
+ )
58
+ generic_associations = []
59
+ for association_node in get_nodes(node, captures, "generics", optional=True):
60
+ generic_associations.extend(
61
+ GenericAssociationItem.from_treesitter_node(association_node),
62
+ )
63
+ port_associations = []
64
+ for association_node in get_nodes(node, captures, "ports", optional=True):
65
+ port_associations.extend(
66
+ PortAssociationItem.from_treesitter_node(association_node),
67
+ )
68
+ return [
69
+ cls(
70
+ label=label,
71
+ entitySymbol=entity_symbol,
72
+ architectureSymbol=architecture_symbol,
73
+ genericAssociations=generic_associations,
74
+ portAssociations=port_associations,
75
+ _treesitter_node=node,
76
+ ),
77
+ ]
78
+
79
+ def __eq__(self, other: object) -> bool: # noqa: D105
80
+ if not isinstance(other, self.__class__):
81
+ return False
82
+ return (
83
+ self._label == other._label
84
+ and self._entity == other._entity
85
+ and self._architecture == other._architecture
86
+ and self._genericAssociations == other._genericAssociations
87
+ and self._portAssociations == other._portAssociations
88
+ )
89
+
90
+ def __hash__(self) -> int: # noqa: D105
91
+ return hash(
92
+ (
93
+ self._label,
94
+ self._entity,
95
+ self._architecture,
96
+ self._genericAssociations,
97
+ self._portAssociations,
98
+ ),
99
+ )
100
+
101
+ def __repr__(self) -> str: # noqa: D105
102
+ return (
103
+ f"{self.__class__.__name__}("
104
+ f"_label={self._label!r}, "
105
+ f"_entity={self._entity!r}, "
106
+ f"_architecture={self._architecture!r}, "
107
+ f"_genericAssociations={self._genericAssociations!r}, "
108
+ f"_portAssociations={self._portAssociations!r}, "
109
+ ")"
110
+ )