sysmlpy 0.64.0__tar.gz → 0.65.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.
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/PKG-INFO +1 -1
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/pyproject.toml +2 -1
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/__init__.py +1 -1
- sysmlpy-0.65.0/src/sysmlpy/lsp/__init__.py +24 -0
- sysmlpy-0.65.0/src/sysmlpy/lsp/__main__.py +9 -0
- sysmlpy-0.65.0/src/sysmlpy/lsp/protocol.py +106 -0
- sysmlpy-0.65.0/src/sysmlpy/lsp/server.py +738 -0
- sysmlpy-0.65.0/src/sysmlpy/lsp/stdio.py +104 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/LICENSE +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/README.md +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/__main__.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/README.md +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/SysMLv2Lexer.interp +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/SysMLv2Lexer.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/SysMLv2Lexer.tokens +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/SysMLv2Parser.interp +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/SysMLv2Parser.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/SysMLv2Parser.tokens +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/SysMLv2ParserListener.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/SysMLv2ParserVisitor.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr_parser.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr_visitor.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/boxes_view.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/definition.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/evaluator.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/examples/attribute_values.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/examples/part_attributes.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/examples/tuples_sequences.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/formatting.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/README.md +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.g4 +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.g4 +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.interp +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.tokens +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserListener.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserVisitor.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/desc.xml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/examples/camera.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/examples/toaster-system.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/examples/vehicle-model.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/pom.xml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/classes.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/interchange.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/LICENSE +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/README.md +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/__init__.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Analysis/AnalysisTooling.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Analysis/SampledFunctions.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Analysis/StateSpaceRepresentation.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Analysis/TradeStudies.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Cause and Effect/CausationConnections.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Cause and Effect/CauseAndEffect.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Geometry/ShapeItems.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Geometry/SpatialItems.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Metadata/ImageMetadata.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Metadata/ModelingMetadata.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Metadata/ParametersOfInterestMetadata.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Metadata/RiskMetadata.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQ.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAcoustics.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAtomicNuclear.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQBase.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCharacteristicNumbers.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQChemistryMolecular.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCondensedMatter.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQElectromagnetism.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQInformation.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQLight.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQMechanics.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQSpaceTime.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQThermodynamics.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementRefCalculations.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementReferences.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/Quantities.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/QuantityCalculations.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/SI.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/SIPrefixes.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/TensorCalculations.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/Time.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/USCustomaryUnits.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/VectorCalculations.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Requirement Derivation/DerivationConnections.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Requirement Derivation/RequirementDerivation.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Base.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/BaseFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/BooleanFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Clocks.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/CollectionFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Collections.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/ComplexFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/ControlFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/ControlPerformances.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/DataFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/FeatureReferencingPerformances.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/IntegerFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/KerML.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Links.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Metaobjects.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/NaturalFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/NumericalFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Objects.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Observation.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/OccurrenceFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Occurrences.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Performances.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/RationalFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/RealFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/ScalarFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/ScalarValues.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/SequenceFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/SpatialFrames.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/StatePerformances.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/StringFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Transfers.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/TransitionPerformances.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/TrigFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Triggers.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/VectorFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/VectorValues.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Actions.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Allocations.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/AnalysisCases.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Attributes.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Calculations.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Cases.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Connections.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Constraints.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Flows.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Interfaces.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Items.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Metadata.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Parts.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Ports.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Requirements.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/StandardViewDefinitions.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/States.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/SysML.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/UseCases.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/VerificationCases.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Views.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/navigate.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/plantuml.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/project.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/semantic.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/store.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/traceability.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/us_customary_units.txt +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/usage.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.65.0}/src/sysmlpy/validator.py +0 -0
|
@@ -6,7 +6,7 @@ build-backend = "poetry.core.masonry.api"
|
|
|
6
6
|
|
|
7
7
|
[project]
|
|
8
8
|
name = "sysmlpy"
|
|
9
|
-
version = "0.
|
|
9
|
+
version = "0.65.0"
|
|
10
10
|
description = ""
|
|
11
11
|
authors = [{ name = "Jon R. Fox (mycr0ft)", email = "jon.fox@drfox.com" }]
|
|
12
12
|
readme = "README.md"
|
|
@@ -27,6 +27,7 @@ kuzu = ["kuzu"]
|
|
|
27
27
|
|
|
28
28
|
[tool.poetry.scripts]
|
|
29
29
|
sysmlpy = "sysmlpy.__main__:main"
|
|
30
|
+
sysmlpy-lsp = "sysmlpy.lsp.stdio:main"
|
|
30
31
|
|
|
31
32
|
[tool.poetry.group.dev.dependencies]
|
|
32
33
|
pytest = ">=8.0,<9.0"
|
|
@@ -30,7 +30,7 @@ __all__ = [
|
|
|
30
30
|
"render_state_transition_view_svg", "boxes_view",
|
|
31
31
|
]
|
|
32
32
|
__author__ = "Jon Fox"
|
|
33
|
-
__version__ = "0.
|
|
33
|
+
__version__ = "0.65.0"
|
|
34
34
|
|
|
35
35
|
from sysmlpy.usage import (
|
|
36
36
|
Item, Attribute, Part, Port, Action, Reference, UseCase, Requirement, Interface, Message,
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# LSP package (v0.65.0 — Adoption Roadmap Goal 5)
|
|
2
|
+
#
|
|
3
|
+
# A minimal Language Server Protocol (LSP 3.17) implementation exposing
|
|
4
|
+
# sysmlpy's parse/analyze pipeline to editors:
|
|
5
|
+
#
|
|
6
|
+
# textDocument/didOpen|didChange|didClose → publishDiagnostics
|
|
7
|
+
# textDocument/hover | /documentSymbol | /definition | /completion
|
|
8
|
+
#
|
|
9
|
+
# Layout:
|
|
10
|
+
# protocol.py — JSON-RPC Content-Length framing + LSP constants
|
|
11
|
+
# server.py — transport-agnostic language server (dict in → dict out)
|
|
12
|
+
# stdio.py — stdio transport; ``python -m sysmlpy.lsp`` entry point
|
|
13
|
+
#
|
|
14
|
+
# See docs/LSP.md for VS Code / Neovim wiring instructions.
|
|
15
|
+
|
|
16
|
+
from sysmlpy.lsp.protocol import (
|
|
17
|
+
encode_message, read_message, ErrorCodes, SymbolKind,
|
|
18
|
+
)
|
|
19
|
+
from sysmlpy.lsp.server import Document, DocumentIndex, SysmlLanguageServer
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
"encode_message", "read_message", "ErrorCodes", "SymbolKind",
|
|
23
|
+
"Document", "DocumentIndex", "SysmlLanguageServer",
|
|
24
|
+
]
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""JSON-RPC / LSP protocol helpers (v0.65.0 — Adoption Roadmap Goal 5).
|
|
3
|
+
|
|
4
|
+
Implements the ``Content-Length`` message framing used by the Language
|
|
5
|
+
Server Protocol over byte streams, plus the small set of LSP constants
|
|
6
|
+
the server needs. Deliberately dependency-free so the server core can
|
|
7
|
+
be tested in-process without a transport.
|
|
8
|
+
|
|
9
|
+
Message framing (both sides):
|
|
10
|
+
|
|
11
|
+
Content-Length: <bytes>\\r\\n
|
|
12
|
+
[Content-Type: application/vscode-jsonrpc; charset=utf-8]\\r\\n
|
|
13
|
+
\\r\\n
|
|
14
|
+
<JSON payload>
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import json
|
|
20
|
+
from typing import BinaryIO, Dict, Any, Optional
|
|
21
|
+
|
|
22
|
+
HEADER_ENCODING = "ascii"
|
|
23
|
+
PAYLOAD_ENCODING = "utf-8"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ErrorCodes:
|
|
27
|
+
"""JSON-RPC / LSP error codes used by the server."""
|
|
28
|
+
|
|
29
|
+
PARSE_ERROR = -32700
|
|
30
|
+
INVALID_REQUEST = -32600
|
|
31
|
+
METHOD_NOT_FOUND = -32601
|
|
32
|
+
INVALID_PARAMS = -32602
|
|
33
|
+
INTERNAL_ERROR = -32603
|
|
34
|
+
SERVER_NOT_INITIALIZED = -32002
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class SymbolKind:
|
|
38
|
+
"""LSP SymbolKind values used in documentSymbol results."""
|
|
39
|
+
|
|
40
|
+
FILE = 1
|
|
41
|
+
MODULE = 2
|
|
42
|
+
NAMESPACE = 3
|
|
43
|
+
PACKAGE = 4
|
|
44
|
+
CLASS = 5
|
|
45
|
+
METHOD = 6
|
|
46
|
+
PROPERTY = 7
|
|
47
|
+
FIELD = 8
|
|
48
|
+
ENUM = 10
|
|
49
|
+
INTERFACE = 11
|
|
50
|
+
FUNCTION = 12
|
|
51
|
+
VARIABLE = 13
|
|
52
|
+
CONSTANT = 14
|
|
53
|
+
ENUM_MEMBER = 22
|
|
54
|
+
STRUCT = 23
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def encode_message(payload: Dict[str, Any]) -> bytes:
|
|
58
|
+
"""Encode a JSON-RPC message dict with LSP ``Content-Length`` framing."""
|
|
59
|
+
body = json.dumps(payload, ensure_ascii=False).encode(PAYLOAD_ENCODING)
|
|
60
|
+
header = f"Content-Length: {len(body)}\r\n\r\n".encode(HEADER_ENCODING)
|
|
61
|
+
return header + body
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def read_message(stream: BinaryIO) -> Optional[Dict[str, Any]]:
|
|
65
|
+
"""Read one framed JSON-RPC message from a binary stream.
|
|
66
|
+
|
|
67
|
+
Returns the decoded message dict, or ``None`` on clean EOF before any
|
|
68
|
+
header bytes. Raises ``ValueError`` on malformed framing.
|
|
69
|
+
|
|
70
|
+
Tolerates ``\\n``-only header terminators in addition to the spec's
|
|
71
|
+
``\\r\\n`` (some clients get this wrong; being lenient costs nothing).
|
|
72
|
+
"""
|
|
73
|
+
# Read header lines until the blank separator.
|
|
74
|
+
content_length: Optional[int] = None
|
|
75
|
+
saw_header_bytes = False
|
|
76
|
+
while True:
|
|
77
|
+
line = stream.readline()
|
|
78
|
+
if not line:
|
|
79
|
+
if not saw_header_bytes:
|
|
80
|
+
return None # clean EOF
|
|
81
|
+
raise ValueError("EOF while reading message header")
|
|
82
|
+
stripped = line.strip()
|
|
83
|
+
if not stripped:
|
|
84
|
+
if content_length is None and not saw_header_bytes:
|
|
85
|
+
continue # tolerate stray blank lines between messages
|
|
86
|
+
break # end of headers
|
|
87
|
+
saw_header_bytes = True
|
|
88
|
+
name, _, value = stripped.partition(b":")
|
|
89
|
+
if name.strip().lower() == b"content-length":
|
|
90
|
+
try:
|
|
91
|
+
content_length = int(value.strip())
|
|
92
|
+
except ValueError:
|
|
93
|
+
raise ValueError(
|
|
94
|
+
f"Malformed Content-Length header: {value!r}"
|
|
95
|
+
) from None
|
|
96
|
+
|
|
97
|
+
if content_length is None:
|
|
98
|
+
raise ValueError("Missing Content-Length header")
|
|
99
|
+
|
|
100
|
+
body = stream.read(content_length)
|
|
101
|
+
if len(body) < content_length:
|
|
102
|
+
raise ValueError(
|
|
103
|
+
f"EOF while reading message body "
|
|
104
|
+
f"({len(body)} of {content_length} bytes)"
|
|
105
|
+
)
|
|
106
|
+
return json.loads(body.decode(PAYLOAD_ENCODING))
|