pyVHDLModelTreesitter 0.9.0__tar.gz → 0.10.0__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 (139) hide show
  1. {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/PKG-INFO +25 -14
  2. {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/README.md +10 -3
  3. {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/pyproject.toml +33 -11
  4. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/Declaration.py +96 -0
  5. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/Object.py +52 -0
  6. {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/_Association.py +7 -13
  7. {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/_Base.py +95 -23
  8. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Common.py +60 -0
  9. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Concurrent.py +661 -0
  10. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Declaration.py +179 -0
  11. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_DesignUnit.py +555 -0
  12. {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/_Document.py +20 -40
  13. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_parse.py → pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Expression.py +266 -331
  14. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Interface.py +312 -0
  15. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Name.py +87 -0
  16. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Object.py +138 -0
  17. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Sequential.py +442 -0
  18. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Subprogram.py +212 -0
  19. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_subtype_indication.py → pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Symbol.py +44 -64
  20. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Type.py +313 -0
  21. {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/__init__.py +0 -2
  22. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_parse.py +97 -0
  23. {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/error.py +72 -29
  24. {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/format.py +65 -19
  25. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/__init__.py +171 -0
  26. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/_generated_queries.py +241 -0
  27. {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/queries/_query.py +103 -25
  28. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AliasDeclaration.scm +11 -0
  29. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AliasSignature.scm +8 -0
  30. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ArrayTypeDefinition.scm +19 -0
  31. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AssertionStatement.scm +8 -0
  32. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AttributeDeclaration.scm +4 -0
  33. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AttributeSpecification.scm +7 -0
  34. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/BlockStatement.scm +12 -0
  35. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/CaseGenerateAlternative.scm +10 -0
  36. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/CaseGenerateStatement.scm +6 -0
  37. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/CaseStatement.scm +5 -0
  38. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/CaseStatementAlternative.scm +9 -0
  39. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ConcurrentAssertionStatement.scm +8 -0
  40. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ConditionalWaveforms.scm +7 -0
  41. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/Constrained1DArray.scm +8 -0
  42. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ConstrainedScalar.scm +8 -0
  43. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/entity_declaration.scm → pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/EntityDeclaration.scm +1 -1
  44. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/EntityNameList.scm +3 -0
  45. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/EnumerationTypeDefinition.scm +8 -0
  46. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ExitStatement.scm +10 -0
  47. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/FileDeclaration.scm +12 -0
  48. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ForGenerateStatement.scm +13 -0
  49. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/FunctionCall.scm +9 -0
  50. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/FunctionSpecification.scm +5 -0
  51. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/IfElsifStatement.scm +19 -0
  52. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/IfGenerateBranch.scm +29 -0
  53. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/IfGenerateStatement.scm +7 -0
  54. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/IfStatementBlock.scm +5 -0
  55. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/InterfaceDeclarations.scm +12 -0
  56. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/InterfaceList.scm +9 -0
  57. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/InterfaceObjectDeclaration.scm +55 -0
  58. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/InterfacePackageDeclaration.scm +3 -0
  59. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/InterfaceSubprogramDeclaration.scm +15 -0
  60. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/InterfaceTypeDeclaration.scm +3 -0
  61. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/LoopStatement.scm +16 -0
  62. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/MultiplyingExpression.scm +5 -0
  63. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/NextStatement.scm +10 -0
  64. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/PackageDeclaration.scm +9 -0
  65. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/PhysicalTypeDefinition.scm +15 -0
  66. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ProcedureSpecification.scm +4 -0
  67. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ReportStatement.scm +5 -0
  68. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ReturnStatement.scm +8 -0
  69. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/SequentialVariableAssignment.scm +6 -0
  70. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/SimpleSignalAssignment.scm +12 -0
  71. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/SimpleSubtype.scm +5 -0
  72. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/TargetName.scm +6 -0
  73. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/TypeConversion.scm +9 -0
  74. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/type_declaration.scm → pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/TypeDeclaration.scm +9 -1
  75. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/UnaryExpression.scm +4 -0
  76. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/UseClause.scm +3 -0
  77. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/treesitter/__init__.py +18 -0
  78. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/treesitter/_access.py +28 -0
  79. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/_protocol.py → pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/treesitter/_map.py +2 -26
  80. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/treesitter/_sort.py +36 -0
  81. pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/treesitter/formatting.py +53 -0
  82. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Concurrent.py +0 -239
  83. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Design.py +0 -24
  84. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_DesignUnit.py +0 -427
  85. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Interface.py +0 -138
  86. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Name.py +0 -20
  87. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Object.py +0 -90
  88. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Sequential.py +0 -172
  89. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Type.py +0 -134
  90. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/__init__.py +0 -9
  91. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/_generated_queries.py +0 -193
  92. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/_utils.py +0 -149
  93. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/concurrent_simple_signal_assignment.scm +0 -6
  94. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/constrained_1d_array.scm +0 -17
  95. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/constrained_scalar.scm +0 -17
  96. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/enumeration_type_definition.scm +0 -5
  97. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/function_call.scm +0 -27
  98. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/if_elsif_statement.scm +0 -18
  99. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/if_statement_block.scm +0 -3
  100. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/interface_declaration.scm +0 -36
  101. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/interface_declarations.scm +0 -6
  102. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/multiplying_expression.scm +0 -11
  103. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/package_declaration.scm +0 -5
  104. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/simple_subtype.scm +0 -11
  105. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/type_conversion.scm +0 -18
  106. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/unary_expression.scm +0 -9
  107. pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/use_clauses.scm +0 -1
  108. {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/.gitignore +0 -0
  109. {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/LICENSE +0 -0
  110. {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/Expression.py +0 -0
  111. {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/py.typed +0 -0
  112. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/adding_expression.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AddingExpression.scm +0 -0
  113. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/aggregate.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/Aggregate.scm +0 -0
  114. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/architecture_definition.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ArchitectureDefinition.scm +0 -0
  115. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/association_element.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AssociationElement.scm +0 -0
  116. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/association_elements.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AssociationElements.scm +0 -0
  117. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/association_list_simple_range.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AssociationListSimpleRange.scm +0 -0
  118. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/bit_string_literal.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/BitStringLiteral.scm +0 -0
  119. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/component_declaration.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ComponentDeclaration.scm +0 -0
  120. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/component_instantiation_statement.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ComponentInstantiationStatement.scm +0 -0
  121. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/concurrent_conditional_signal_assignment.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ConcurrentConditionalSignalAssignment.scm +0 -0
  122. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/constant_declaration.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ConstantDeclaration.scm +0 -0
  123. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/design_units.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/DesignUnits.scm +0 -0
  124. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/else_statement.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ElseStatement.scm +0 -0
  125. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/indexed_name.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/IndexedName.scm +0 -0
  126. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/library_clauses.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/LibraryClauses.scm +0 -0
  127. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/library_namespaces.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/LibraryNamespaces.scm +0 -0
  128. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/logical_expression.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/LogicalExpression.scm +0 -0
  129. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/package_definition.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/PackageDefinition.scm +0 -0
  130. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/physical_literal.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/PhysicalLiteral.scm +0 -0
  131. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/process_statement.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ProcessStatement.scm +0 -0
  132. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/record_type_definition.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/RecordTypeDefinition.scm +0 -0
  133. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/relational_expression.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/RelationalExpression.scm +0 -0
  134. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/selected_names.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/SelectedNames.scm +0 -0
  135. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/shift_expression.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ShiftExpression.scm +0 -0
  136. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/signal_declaration.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/SignalDeclaration.scm +0 -0
  137. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/subtype_declaration.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/SubtypeDeclaration.scm +0 -0
  138. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/variable_declaration.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/VariableDeclaration.scm +0 -0
  139. /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/wait_statement.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/WaitStatement.scm +0 -0
@@ -1,14 +1,15 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: pyVHDLModelTreesitter
3
- Version: 0.9.0
3
+ Version: 0.10.0
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
7
+ License-Expression: Apache-2.0
7
8
  License-File: LICENSE
8
9
  Keywords: language,model,treesitter,vhdl
9
10
  Classifier: Development Status :: 3 - Alpha
10
11
  Classifier: Intended Audience :: Developers
11
- Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: License :: OSI Approved :: Apache Software License
12
13
  Classifier: Programming Language :: Python :: 3 :: Only
13
14
  Classifier: Programming Language :: Python :: 3.11
14
15
  Classifier: Programming Language :: Python :: 3.12
@@ -18,24 +19,27 @@ Requires-Python: >=3.11
18
19
  Requires-Dist: pygments>=2.20.0
19
20
  Requires-Dist: pyvhdlmodel>=0.38.0
20
21
  Requires-Dist: rich>=11.0.0
21
- Requires-Dist: tree-sitter-vhdl>=1.2.5
22
+ Requires-Dist: tree-sitter-vhdl>=2.0.0
22
23
  Requires-Dist: tree-sitter>=0.23.0
23
24
  Provides-Extra: dev
24
- Requires-Dist: coverage>=7.15.2; extra == 'dev'
25
+ Requires-Dist: codespell>=2.4.3; extra == 'dev'
26
+ Requires-Dist: coverage>=7.15.4; extra == 'dev'
25
27
  Requires-Dist: cryptography>=49.0.0; extra == 'dev'
26
- Requires-Dist: hatch>=1.17.1; extra == 'dev'
28
+ Requires-Dist: git-cliff>=2.13.1; extra == 'dev'
29
+ Requires-Dist: hatch>=1.18.0; extra == 'dev'
27
30
  Requires-Dist: idna>=3.18; extra == 'dev'
28
31
  Requires-Dist: jaraco-context>=6.1.2; extra == 'dev'
29
- Requires-Dist: mypy>=2.3.0; extra == 'dev'
30
- Requires-Dist: pre-commit>=4.6.1; extra == 'dev'
32
+ Requires-Dist: mypy>=2.3.1; extra == 'dev'
33
+ Requires-Dist: pre-commit>=4.6.2; extra == 'dev'
31
34
  Requires-Dist: pytest-cov>=7.1.0; extra == 'dev'
32
35
  Requires-Dist: pytest-order>=1.5.0; extra == 'dev'
33
36
  Requires-Dist: pytest-sugar>=1.1.1; extra == 'dev'
34
37
  Requires-Dist: pytest-xdist>=3.8.0; extra == 'dev'
35
38
  Requires-Dist: pytest>=9.1.1; extra == 'dev'
36
- Requires-Dist: ruff>=0.16.1; extra == 'dev'
37
- Requires-Dist: ty>=0.0.65; extra == 'dev'
38
- Requires-Dist: uv>=0.12.0; extra == 'dev'
39
+ Requires-Dist: ruff>=0.16.4; extra == 'dev'
40
+ Requires-Dist: ty>=0.0.74; extra == 'dev'
41
+ Requires-Dist: uv>=0.12.5; extra == 'dev'
42
+ Requires-Dist: vsg>=3.35.0; extra == 'dev'
39
43
  Description-Content-Type: text/markdown
40
44
 
41
45
  # pyVHDLModelTreesitter
@@ -50,8 +54,13 @@ Description-Content-Type: text/markdown
50
54
  [`pyVHDLModel`][pyVHDLModel-github] API using
51
55
  [`tree-sitter-vhdl`][tree-sitter-vhdl].
52
56
 
53
- > Disclaimer: This project is in early development and only implements a
54
- fraction of the features of [`pyVHDLModel`][pyVHDLModel-github].
57
+ ## Implementation Status Disclaimer
58
+
59
+ This project is in early development and only implements a fraction of the
60
+ features of [`pyVHDLModel`][pyVHDLModel-github].
61
+
62
+ A complete breakdown of the current implementation status is available in
63
+ [`docs/IMPLEMENTATION_STATUS.md`](/docs/IMPLEMENTATION_STATUS.md).
55
64
 
56
65
  ## Installation
57
66
 
@@ -83,10 +92,12 @@ document = pyVHDLModelTreesitter.Document.from_file("path/to/file.vhd")
83
92
 
84
93
  Detailed documentation is available for [`pyVHDLModel`][pyVHDLModel-documentation].
85
94
 
86
- A complete list of public API endpoints is in [DOCS.md](DOCS.md).
95
+ A complete list of public API endpoints is in [`docs/API.md`](docs/API.md).
87
96
 
88
97
  ## Setup for Development
89
98
 
99
+ See [`CONTRIBUTING.md`](CONTRIBUTING.md) for the full contribution guide.
100
+
90
101
  ### Dependencies
91
102
 
92
103
  Developers aiming to contribute to this repository need the following tools:
@@ -10,8 +10,13 @@
10
10
  [`pyVHDLModel`][pyVHDLModel-github] API using
11
11
  [`tree-sitter-vhdl`][tree-sitter-vhdl].
12
12
 
13
- > Disclaimer: This project is in early development and only implements a
14
- fraction of the features of [`pyVHDLModel`][pyVHDLModel-github].
13
+ ## Implementation Status Disclaimer
14
+
15
+ This project is in early development and only implements a fraction of the
16
+ features of [`pyVHDLModel`][pyVHDLModel-github].
17
+
18
+ A complete breakdown of the current implementation status is available in
19
+ [`docs/IMPLEMENTATION_STATUS.md`](/docs/IMPLEMENTATION_STATUS.md).
15
20
 
16
21
  ## Installation
17
22
 
@@ -43,10 +48,12 @@ document = pyVHDLModelTreesitter.Document.from_file("path/to/file.vhd")
43
48
 
44
49
  Detailed documentation is available for [`pyVHDLModel`][pyVHDLModel-documentation].
45
50
 
46
- A complete list of public API endpoints is in [DOCS.md](DOCS.md).
51
+ A complete list of public API endpoints is in [`docs/API.md`](docs/API.md).
47
52
 
48
53
  ## Setup for Development
49
54
 
55
+ See [`CONTRIBUTING.md`](CONTRIBUTING.md) for the full contribution guide.
56
+
50
57
  ### Dependencies
51
58
 
52
59
  Developers aiming to contribute to this repository need the following tools:
@@ -4,16 +4,18 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pyVHDLModelTreesitter"
7
- version = "0.9.0"
7
+ version = "0.10.0"
8
8
  description = "An implementation of pyVHDLModel using treesitter"
9
9
  readme = "README.md"
10
+ license = "Apache-2.0"
11
+ license-files = ["LICENSE"]
10
12
  requires-python = ">=3.11"
11
13
  dependencies = [
12
14
  "pyVHDLModel >= 0.38.0",
13
15
  "rich >= 11.0.0",
14
16
  "pygments >= 2.20.0", # forced to avoid CVE
15
17
  "tree-sitter >= 0.23.0",
16
- "tree-sitter-vhdl >= 1.2.5", # TODO: move to 1.6.0 once released
18
+ "tree-sitter-vhdl >= 2.0.0",
17
19
  ]
18
20
  authors = [
19
21
  { name = "Dominic Adam Walters" },
@@ -21,7 +23,7 @@ authors = [
21
23
  keywords = ["language", "model", "treesitter", "vhdl"]
22
24
  classifiers = [
23
25
  "Development Status :: 3 - Alpha",
24
- "License :: OSI Approved :: MIT License",
26
+ "License :: OSI Approved :: Apache Software License",
25
27
  "Programming Language :: Python :: 3 :: Only",
26
28
  "Programming Language :: Python :: 3.11",
27
29
  "Programming Language :: Python :: 3.12",
@@ -32,21 +34,24 @@ classifiers = [
32
34
 
33
35
  [project.optional-dependencies]
34
36
  dev = [
35
- "coverage >= 7.15.2",
36
- "hatch >= 1.17.1",
37
+ "codespell >= 2.4.3",
38
+ "coverage >= 7.15.4",
39
+ "git-cliff >= 2.13.1",
40
+ "hatch >= 1.18.0",
37
41
  "cryptography >= 49.0.0", # forced to avoid CVE
38
42
  "idna >= 3.18", # forced to avoid CVE
39
43
  "jaraco-context >= 6.1.2", # forced to avoid CVE
40
- "mypy >= 2.3.0",
41
- "pre-commit >= 4.6.1",
44
+ "mypy >= 2.3.1",
45
+ "pre-commit >= 4.6.2",
42
46
  "pytest >= 9.1.1",
43
47
  "pytest-cov >= 7.1.0",
44
48
  "pytest-order >= 1.5.0",
45
49
  "pytest-sugar >= 1.1.1",
46
50
  "pytest-xdist >= 3.8.0",
47
- "ruff >= 0.16.1",
48
- "ty >= 0.0.65",
49
- "uv >= 0.12.0",
51
+ "ruff >= 0.16.4",
52
+ "ty >= 0.0.74",
53
+ "uv >= 0.12.5",
54
+ "vsg >= 3.35.0",
50
55
  ]
51
56
 
52
57
  [project.urls]
@@ -54,6 +59,8 @@ Repository = "https://gitlab.com/dawalters/pyVHDLModelTreesitter"
54
59
 
55
60
  [tool.codespell]
56
61
  ignore-words-list = "inout"
62
+ # CHANGELOG.md quotes historical commit messages verbatim
63
+ exclude-file = "CHANGELOG.md"
57
64
 
58
65
  [tool.coverage.html]
59
66
  directory = ".htmlcov"
@@ -63,9 +70,15 @@ exclude_also = [
63
70
  "@overload",
64
71
  "if TYPE_CHECKING:",
65
72
  ]
73
+ omit = [
74
+ "src/pyVHDLModelTreesitter/queries/_generated_queries.py",
75
+ ]
66
76
 
67
77
  [tool.coverage.run]
68
78
  branch = true
79
+ omit = [
80
+ "src/pyVHDLModelTreesitter/queries/_generated_queries.py",
81
+ ]
69
82
 
70
83
  [tool.coverage.xml]
71
84
  output = ".coverage.xml"
@@ -96,11 +109,15 @@ strict = true
96
109
  warn_unreachable = true
97
110
 
98
111
  [tool.pytest.ini_options]
99
- addopts = "--capture=fd -n auto --dist loadgroup --cov=pyVHDLModelTreesitter --cov-report html --cov-report xml --verbose --junitxml=.junit.xml -o junit_family=legacy"
112
+ addopts = "--capture=fd -n auto --dist loadgroup --strict-markers --cov=pyVHDLModelTreesitter --cov-report html --cov-report xml --verbose --junitxml=.junit.xml -o junit_family=legacy"
100
113
  norecursedirs = "oss/*"
101
114
  testpaths = [
102
115
  "tests",
103
116
  ]
117
+ markers = [
118
+ "order: control test execution order relative to other tests (pytest-order)",
119
+ "xdist_group: run tests in the same group on the same xdist worker",
120
+ ]
104
121
 
105
122
  [tool.ruff]
106
123
  unsafe-fixes = true
@@ -141,6 +158,11 @@ required-imports = ["from __future__ import annotations"]
141
158
  "tests/**/*.py" = ["S101"]
142
159
  "tests/examples/local/**/*.py" = ["D100", "D103", "INP001", "TID252"]
143
160
 
161
+ [tool.ty.src]
162
+ exclude = [
163
+ "tests/examples/oss/**",
164
+ ]
165
+
144
166
  [tool.ty.rules]
145
167
  all = "error"
146
168
  missing-override-decorator = "ignore" # this is emitted for every dunder override
@@ -0,0 +1,96 @@
1
+ """
2
+ Submodule mirroring modified aspects of pyVHDLModel.Declaration.
3
+
4
+ The :class:`Alias` class is overridden to add support for the signature that
5
+ :class:`pyVHDLModel.Declaration.Alias` does not model.
6
+ """
7
+
8
+ # ruff: file-ignore[invalid-argument-name, mixed-case-variable-in-class-scope, undocumented-public-init]
9
+
10
+ from __future__ import annotations
11
+
12
+ __all__ = [
13
+ "Alias",
14
+ "AliasSignature",
15
+ ]
16
+
17
+ from typing import TYPE_CHECKING
18
+
19
+ import pyVHDLModel
20
+ from pyVHDLModel.Declaration import Alias as Alias_VHDLModel
21
+
22
+ if TYPE_CHECKING:
23
+ from pyVHDLModel.Base import ModelEntity
24
+ from pyVHDLModel.Symbol import SimpleSubtypeSymbol
25
+
26
+
27
+ class AliasSignature(pyVHDLModel.Base.ModelEntity):
28
+ """
29
+ Represents a signature in an alias declaration.
30
+
31
+ A signature is used to disambiguate overloaded subprograms and enumeration
32
+ literals, and has the form ``[ type_mark { , type_mark } [ return type_mark ] ]``.
33
+ """
34
+
35
+ _parameters: list[SimpleSubtypeSymbol]
36
+ _returnType: SimpleSubtypeSymbol | None
37
+
38
+ def __init__(
39
+ self,
40
+ parameters: list[SimpleSubtypeSymbol],
41
+ returnType: SimpleSubtypeSymbol | None = None,
42
+ parent: ModelEntity | None = None,
43
+ ) -> None:
44
+ super().__init__(parent)
45
+ self._parameters = parameters
46
+ self._returnType = returnType
47
+
48
+ @property
49
+ # ruff: ignore[invalid-function-name, undocumented-public-method]
50
+ def Parameters(self) -> list[SimpleSubtypeSymbol]:
51
+ return self._parameters
52
+
53
+ @property
54
+ # ruff: ignore[invalid-function-name, undocumented-public-method]
55
+ def ReturnType(self) -> SimpleSubtypeSymbol | None:
56
+ return self._returnType
57
+
58
+ def __str__(self) -> str: # ruff: ignore[undocumented-magic-method]
59
+ parameters = ", ".join(str(parameter) for parameter in self._parameters)
60
+ result = "["
61
+ if parameters:
62
+ result += f" {parameters}"
63
+ if self._returnType is not None:
64
+ result += f" return {self._returnType}"
65
+ return f"{result} ]"
66
+
67
+
68
+ class Alias(Alias_VHDLModel):
69
+ """An alias declaration with optional signature support."""
70
+
71
+ _signature: AliasSignature | None
72
+
73
+ # ruff: ignore[too-many-arguments, too-many-positional-arguments]
74
+ def __init__(
75
+ self,
76
+ identifier: str,
77
+ name: pyVHDLModel.Symbol.Symbol,
78
+ subtype: pyVHDLModel.Symbol.SubtypeSymbol | None = None,
79
+ signature: AliasSignature | None = None,
80
+ documentation: str = "",
81
+ parent: ModelEntity | None = None,
82
+ ) -> None:
83
+ super().__init__(identifier, name, subtype, documentation, parent)
84
+ self._signature = signature
85
+ if signature is not None:
86
+ signature.Parent = self
87
+
88
+ @property
89
+ # ruff: ignore[invalid-function-name, undocumented-public-method]
90
+ def Signature(self) -> AliasSignature | None:
91
+ return self._signature
92
+
93
+ def __str__(self) -> str: # ruff: ignore[undocumented-magic-method]
94
+ subtype = f" : {self._subtype}" if self._subtype is not None else ""
95
+ signature = f" {self._signature}" if self._signature is not None else ""
96
+ return f"alias {self._identifier}{subtype} is {self._name}{signature}"
@@ -0,0 +1,52 @@
1
+ """
2
+ Submodule mirroring modified aspects of pyVHDLModel.Object.
3
+
4
+ The :class:`File` class is overridden to add support for the file open
5
+ information that :class:`pyVHDLModel.Object.File` does not model.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ __all__ = [
11
+ "File",
12
+ ]
13
+
14
+ from typing import TYPE_CHECKING
15
+
16
+ import pyVHDLModel
17
+
18
+ if TYPE_CHECKING:
19
+ from pyVHDLModel.Base import ModelEntity
20
+ from pyVHDLModel.Expression import EnumerationLiteral, StringLiteral
21
+ from pyVHDLModel.Symbol import Symbol
22
+
23
+
24
+ class File(pyVHDLModel.Object.File):
25
+ """A file declaration with optional file open information."""
26
+
27
+ _fileOpenKind: EnumerationLiteral | None # ruff: ignore[mixed-case-variable-in-class-scope]
28
+ _fileLogicalName: StringLiteral | None # ruff: ignore[mixed-case-variable-in-class-scope]
29
+
30
+ # ruff: ignore[too-many-arguments, too-many-positional-arguments, undocumented-public-init]
31
+ def __init__(
32
+ self,
33
+ identifiers: list[str],
34
+ subtype: Symbol,
35
+ fileOpenKind: EnumerationLiteral | None = None, # ruff: ignore[invalid-argument-name]
36
+ fileLogicalName: StringLiteral | None = None, # ruff: ignore[invalid-argument-name]
37
+ documentation: str = "",
38
+ parent: ModelEntity | None = None,
39
+ ) -> None:
40
+ super().__init__(identifiers, subtype, documentation, parent)
41
+ self._fileOpenKind = fileOpenKind
42
+ self._fileLogicalName = fileLogicalName
43
+
44
+ @property
45
+ # ruff: ignore[invalid-function-name, undocumented-public-method]
46
+ def fileOpenKind(self) -> EnumerationLiteral | None:
47
+ return self._fileOpenKind
48
+
49
+ @property
50
+ # ruff: ignore[invalid-function-name, undocumented-public-method]
51
+ def fileLogicalName(self) -> StringLiteral | None:
52
+ return self._fileLogicalName
@@ -10,15 +10,10 @@ from typing import TYPE_CHECKING, TypeVar
10
10
 
11
11
  from pyVHDLModel.Association import AssociationItem
12
12
  from pyVHDLModel.Name import OpenName
13
- from pyVHDLModel.Symbol import SignalSymbol
14
13
 
15
14
  from pyVHDLModelTreesitter._Name import parse_name
16
- from pyVHDLModelTreesitter.queries import AssociationElement
17
- from pyVHDLModelTreesitter.queries._protocol import inject_node
18
- from pyVHDLModelTreesitter.queries._utils import (
19
- get_node,
20
- get_node_text,
21
- )
15
+ from pyVHDLModelTreesitter.queries import AssociationElementQuery
16
+ from pyVHDLModelTreesitter.treesitter import get_node_text, inject_node
22
17
 
23
18
  if TYPE_CHECKING:
24
19
  import pyVHDLModel
@@ -30,23 +25,22 @@ T = TypeVar("T", bound=AssociationItem)
30
25
 
31
26
  def parse_association_item(cls: type[T], node: tree_sitter.Node) -> T | None:
32
27
  """Create an AssociationItem from a tree-sitter node."""
33
- captures = AssociationElement.capture_first_root(node)
34
- formal_node = get_node(node, captures, "formal", optional=True)
28
+ captures = AssociationElementQuery.capture_first_root(node)
29
+ formal_node = captures.get_node(node, "formal", optional=True)
35
30
  formal = None
36
31
  if formal_node is not None:
37
- formal = SignalSymbol(parse_name(get_node_text(formal_node)))
38
- actual_node = get_node(node, captures, "actual")
32
+ formal = parse_name(get_node_text(formal_node))
33
+ actual_node = captures.get_node(node, "actual")
39
34
  actual: pyVHDLModel.Base.ExpressionUnion
40
35
  if actual_node.type == "OPEN":
41
36
  actual = OpenName()
42
37
  else:
43
38
  # ruff: ignore[import-outside-top-level]
44
- from pyVHDLModelTreesitter._parse import parse_conditional_expression
39
+ from pyVHDLModelTreesitter._Expression import parse_conditional_expression
45
40
 
46
41
  actual = parse_conditional_expression(actual_node)
47
42
  if actual is None:
48
43
  return None
49
- # TODO: `formal` is a `SignalSymbol`, is this correct?
50
44
  # TODO: `OpenName` might need wrapping in a `Symbol`
51
45
  # ty: ignore[invalid-argument-type]
52
46
  ret = cls(formal, actual) # type: ignore[arg-type]
@@ -5,19 +5,27 @@ from __future__ import annotations
5
5
  __all__ = [
6
6
  "parse_direction",
7
7
  "parse_mode",
8
+ "parse_range_attribute",
8
9
  "parse_simple_range",
9
10
  "parse_waveform_element",
11
+ "parse_waveform_elements",
10
12
  ]
11
13
 
12
14
  from typing import TYPE_CHECKING
13
15
 
14
16
  import pyVHDLModel
15
- from pyVHDLModel.Base import SimpleRange, WaveformElement
17
+ from pyVHDLModel.Base import RangeFromName, SimpleRange, WaveformElement
18
+ from pyVHDLModel.Name import AttributeName
19
+ from pyVHDLModel.Symbol import RangeAttributeSymbol
16
20
 
17
21
  if TYPE_CHECKING:
18
22
  from tree_sitter import Node
19
23
 
20
- from pyVHDLModelTreesitter._parse import parse_simple_expression
24
+ from pyVHDLModelTreesitter._Expression import parse_simple_expression
25
+ from pyVHDLModelTreesitter._Name import parse_name
26
+ from pyVHDLModelTreesitter._parse import (
27
+ _parse_enum_string,
28
+ )
21
29
  from pyVHDLModelTreesitter.error import (
22
30
  NodeExtraChildError,
23
31
  NodeMissingChildError,
@@ -25,12 +33,17 @@ from pyVHDLModelTreesitter.error import (
25
33
  NodeTextIsNoneError,
26
34
  NotImplementedWarning,
27
35
  )
28
- from pyVHDLModelTreesitter.queries._protocol import inject_node
36
+ from pyVHDLModelTreesitter.treesitter._access import get_node_text
37
+ from pyVHDLModelTreesitter.treesitter._map import inject_node
29
38
 
30
39
 
31
- def parse_direction(string: str) -> pyVHDLModel.Base.Direction | None:
40
+ def parse_direction(node: Node | None) -> pyVHDLModel.Base.Direction | None:
32
41
  """
33
- Parse a string as a direction.
42
+ Parse a tree-sitter direction node.
43
+
44
+ Extracts the text from a direction node and resolves it to a
45
+ :class:`pyVHDLModel.Base.Direction` enum value. Returns ``None`` if the text
46
+ does not match any known direction.
34
47
 
35
48
  This will accept any mix of the following:
36
49
  - Incorrect capitalisation
@@ -39,19 +52,23 @@ def parse_direction(string: str) -> pyVHDLModel.Base.Direction | None:
39
52
  - Split words with whitespace
40
53
  - "down to"
41
54
  """
42
- # TODO: make a PR on pyVHDLModel to add this
43
- string = "".join(string.split()).lower().capitalize()
44
- if string == "Downto":
45
- string = "DownTo"
46
- try:
47
- return pyVHDLModel.Base.Direction[string]
48
- except IndexError:
55
+ if node is None:
49
56
  return None
57
+ string = get_node_text(node)
58
+ return _parse_enum_string(
59
+ string,
60
+ pyVHDLModel.Base.Direction,
61
+ renames={"Downto": "DownTo"},
62
+ )
50
63
 
51
64
 
52
- def parse_mode(string: str) -> pyVHDLModel.Base.Mode | None:
65
+ def parse_mode(node: Node | None) -> pyVHDLModel.Base.Mode | None:
53
66
  """
54
- Parse a string as a mode.
67
+ Parse a tree-sitter mode node.
68
+
69
+ Extracts the text from a mode node and resolves it to a
70
+ :class:`pyVHDLModel.Base.Mode` enum value. Returns ``None`` if the text does
71
+ not match any known mode.
55
72
 
56
73
  This will accept any mix of the following:
57
74
  - Incorrect capitalisation
@@ -61,14 +78,60 @@ def parse_mode(string: str) -> pyVHDLModel.Base.Mode | None:
61
78
  - Split words with whitespace
62
79
  - "in out"
63
80
  """
64
- # TODO: make a PR on pyVHDLModel to add this
65
- string = "".join(string.split()).lower().capitalize()
66
- if string == "Inout":
67
- string = "InOut"
68
- try:
69
- return pyVHDLModel.Base.Mode[string]
70
- except IndexError:
81
+ if node is None:
82
+ return pyVHDLModel.Base.Mode.In
83
+ string = get_node_text(node)
84
+ parsed = _parse_enum_string(
85
+ string,
86
+ pyVHDLModel.Base.Mode,
87
+ renames={"Inout": "InOut"},
88
+ )
89
+ if parsed is None:
90
+ normalized = "".join(string.split()).lower().capitalize()
91
+ NotImplementedWarning.warn(
92
+ f"'{normalized}' is not a supported interface mode",
93
+ node,
94
+ )
95
+ return parsed
96
+
97
+
98
+ def parse_range_attribute( # ruff: ignore[complex-structure, too-many-return-statements]
99
+ node: Node,
100
+ ) -> RangeFromName | None:
101
+ """
102
+ Check if a conditional_expression node represents a range attribute.
103
+
104
+ For example, parses ``s'range`` into a `RangeFromName`.
105
+ Returns `None` if the node is not a range attribute.
106
+ """
107
+ if node.type != "conditional_expression":
108
+ return None
109
+ if node.child_count != 1:
110
+ return None
111
+ simple_expr = node.children[0]
112
+ if simple_expr.type != "simple_expression":
71
113
  return None
114
+ if simple_expr.child_count != 1:
115
+ return None
116
+ name_node = simple_expr.children[0]
117
+ if name_node.type != "name":
118
+ return None
119
+ prefix_identifier = None
120
+ has_range_attr = False
121
+ for nc in name_node.children:
122
+ if nc.type == "identifier":
123
+ prefix_identifier = nc
124
+ elif nc.type == "attribute":
125
+ for ac in nc.children:
126
+ if ac.type == "attribute_range":
127
+ has_range_attr = True
128
+ break
129
+ if has_range_attr and prefix_identifier is not None:
130
+ prefix_text = get_node_text(prefix_identifier)
131
+ prefix_name = parse_name(prefix_text)
132
+ attr_name = AttributeName("range", prefix_name)
133
+ return RangeFromName(RangeAttributeSymbol(attr_name))
134
+ return None
72
135
 
73
136
 
74
137
  def parse_simple_range(node: Node) -> SimpleRange | None: # ruff: ignore[complex-structure, too-many-branches]
@@ -109,7 +172,6 @@ def parse_simple_range(node: Node) -> SimpleRange | None: # ruff: ignore[comple
109
172
  return None
110
173
  if direction_node.text is None or len(direction_node.text) == 0:
111
174
  raise NodeTextIsNoneError(direction_node)
112
- direction_str = direction_node.text.decode("utf-8")
113
175
  right = node.child(2)
114
176
  if right is None:
115
177
  raise NodeMissingChildError(node, "third-child")
@@ -124,8 +186,9 @@ def parse_simple_range(node: Node) -> SimpleRange | None: # ruff: ignore[comple
124
186
  right_expr = parse_simple_expression(right)
125
187
  if right_expr is None:
126
188
  return None
127
- direction = parse_direction(direction_str)
189
+ direction = parse_direction(direction_node)
128
190
  if direction is None:
191
+ direction_str = direction_node.text.decode("utf-8")
129
192
  raise NodeTextIsInvalidError(
130
193
  node,
131
194
  f"'{direction_str}' is not a valid VHDL direction",
@@ -152,3 +215,12 @@ def parse_waveform_element(node: Node) -> WaveformElement | None:
152
215
  if expression is None:
153
216
  return None
154
217
  return inject_node(WaveformElement(expression), node)
218
+
219
+
220
+ def parse_waveform_elements(node: Node) -> list[WaveformElement]:
221
+ return [
222
+ we
223
+ for child in node.children
224
+ if child.type == "waveform_element"
225
+ if (we := parse_waveform_element(child)) is not None
226
+ ]
@@ -0,0 +1,60 @@
1
+ """Submodule defining parsers for classes from pyVHDLModel.Common."""
2
+
3
+ from __future__ import annotations
4
+
5
+ __all__ = [
6
+ "parse_conditional_waveforms",
7
+ ]
8
+
9
+ from typing import TYPE_CHECKING
10
+
11
+ from pyVHDLModel.Common import ConditionalWaveform
12
+
13
+ if TYPE_CHECKING:
14
+ import tree_sitter
15
+
16
+ from pyVHDLModelTreesitter._Base import parse_waveform_elements
17
+ from pyVHDLModelTreesitter._Expression import parse_simple_expression
18
+ from pyVHDLModelTreesitter.queries import ConditionalWaveformsQuery
19
+ from pyVHDLModelTreesitter.treesitter import sort_into_text_order
20
+
21
+
22
+ def parse_conditional_waveforms(
23
+ node: tree_sitter.Node,
24
+ ) -> list[ConditionalWaveform] | None:
25
+ """Parse a ``conditional_waveforms`` node into a list of ``ConditionalWaveform``."""
26
+ captures = ConditionalWaveformsQuery.capture_first_root(node)
27
+ waveform_node = captures.get_node(node, "waveform")
28
+ condition_nodes = sort_into_text_order(
29
+ captures.get_nodes(node, "when_expression"),
30
+ )
31
+ other_waveform_nodes = sort_into_text_order(
32
+ captures.get_nodes(node, "else_waveform"),
33
+ )
34
+
35
+ result: list[ConditionalWaveform] = []
36
+
37
+ next_waveform_node = waveform_node
38
+ for condition_node, other_waveform_node in zip(
39
+ condition_nodes,
40
+ other_waveform_nodes,
41
+ strict=True,
42
+ ):
43
+ waveform = parse_waveform_elements(next_waveform_node)
44
+ if len(waveform) == 0:
45
+ # TODO: message
46
+ return None
47
+ condition = parse_simple_expression(condition_node)
48
+ if condition is None:
49
+ # TODO: message
50
+ return None
51
+ result.append(
52
+ ConditionalWaveform(waveform=waveform, condition=condition),
53
+ )
54
+ next_waveform_node = other_waveform_node
55
+ else_waveform = parse_waveform_elements(next_waveform_node)
56
+ if len(else_waveform) == 0:
57
+ # TODO: message
58
+ return None
59
+ result.append(ConditionalWaveform(waveform=else_waveform, condition=None))
60
+ return result