wafer-lsp 0.1.13__py3-none-any.whl

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 (44) hide show
  1. wafer_lsp/__init__.py +1 -0
  2. wafer_lsp/__main__.py +9 -0
  3. wafer_lsp/analyzers/__init__.py +0 -0
  4. wafer_lsp/analyzers/compiler_integration.py +16 -0
  5. wafer_lsp/analyzers/docs_index.py +36 -0
  6. wafer_lsp/handlers/__init__.py +30 -0
  7. wafer_lsp/handlers/code_action.py +48 -0
  8. wafer_lsp/handlers/code_lens.py +48 -0
  9. wafer_lsp/handlers/completion.py +6 -0
  10. wafer_lsp/handlers/diagnostics.py +41 -0
  11. wafer_lsp/handlers/document_symbol.py +176 -0
  12. wafer_lsp/handlers/hip_diagnostics.py +303 -0
  13. wafer_lsp/handlers/hover.py +251 -0
  14. wafer_lsp/handlers/inlay_hint.py +245 -0
  15. wafer_lsp/handlers/semantic_tokens.py +224 -0
  16. wafer_lsp/handlers/workspace_symbol.py +87 -0
  17. wafer_lsp/languages/README.md +195 -0
  18. wafer_lsp/languages/__init__.py +17 -0
  19. wafer_lsp/languages/converter.py +88 -0
  20. wafer_lsp/languages/detector.py +107 -0
  21. wafer_lsp/languages/parser_manager.py +33 -0
  22. wafer_lsp/languages/registry.py +120 -0
  23. wafer_lsp/languages/types.py +37 -0
  24. wafer_lsp/parsers/__init__.py +36 -0
  25. wafer_lsp/parsers/base_parser.py +9 -0
  26. wafer_lsp/parsers/cuda_parser.py +95 -0
  27. wafer_lsp/parsers/cutedsl_parser.py +114 -0
  28. wafer_lsp/parsers/hip_parser.py +688 -0
  29. wafer_lsp/server.py +58 -0
  30. wafer_lsp/services/__init__.py +38 -0
  31. wafer_lsp/services/analysis_service.py +22 -0
  32. wafer_lsp/services/docs_service.py +40 -0
  33. wafer_lsp/services/document_service.py +20 -0
  34. wafer_lsp/services/hip_docs.py +806 -0
  35. wafer_lsp/services/hip_hover_service.py +412 -0
  36. wafer_lsp/services/hover_service.py +237 -0
  37. wafer_lsp/services/language_registry_service.py +26 -0
  38. wafer_lsp/services/position_service.py +77 -0
  39. wafer_lsp/utils/__init__.py +0 -0
  40. wafer_lsp/utils/lsp_helpers.py +79 -0
  41. wafer_lsp-0.1.13.dist-info/METADATA +60 -0
  42. wafer_lsp-0.1.13.dist-info/RECORD +44 -0
  43. wafer_lsp-0.1.13.dist-info/WHEEL +4 -0
  44. wafer_lsp-0.1.13.dist-info/entry_points.txt +2 -0
wafer_lsp/server.py ADDED
@@ -0,0 +1,58 @@
1
+ from lsprotocol.types import (
2
+ INITIALIZE,
3
+ TEXT_DOCUMENT_HOVER,
4
+ )
5
+ from pygls.lsp.server import LanguageServer
6
+
7
+ from .services import (
8
+ create_analysis_service,
9
+ create_docs_service,
10
+ create_document_service,
11
+ create_hover_service,
12
+ create_language_registry_service,
13
+ create_position_service,
14
+ )
15
+
16
+ language_registry_service = create_language_registry_service()
17
+ analysis_service = create_analysis_service()
18
+ docs_service = create_docs_service()
19
+ position_service = create_position_service()
20
+ hover_service = create_hover_service(
21
+ language_registry_service,
22
+ analysis_service,
23
+ docs_service,
24
+ position_service
25
+ )
26
+
27
+ server = LanguageServer("wafer-lsp", "1.0.0")
28
+ document_service = create_document_service(server)
29
+
30
+
31
+ @server.feature(INITIALIZE)
32
+ def initialize(params):
33
+ return {
34
+ "capabilities": {
35
+ "hoverProvider": True,
36
+ }
37
+ }
38
+
39
+
40
+ @server.feature(TEXT_DOCUMENT_HOVER)
41
+ def hover(params):
42
+ uri = params.text_document.uri
43
+ position = params.position
44
+ content = document_service.get_document_content(uri)
45
+ if not content:
46
+ test_message = "🎉🎉🎉 **HEYOOO!!! LSP IS DEFINITELY WORKING!!!** 🎉🎉🎉\n\n**THIS IS THE WAFER LSP SERVER!**\n\n**Document content not available, but LSP is running!**"
47
+ from lsprotocol.types import Hover, MarkupContent, MarkupKind
48
+ return Hover(contents=MarkupContent(kind=MarkupKind.Markdown, value=test_message))
49
+ result = hover_service.handle_hover(uri, position, content)
50
+ if not result:
51
+ test_message = "🎉🎉🎉 **HEYOOO!!! LSP IS DEFINITELY WORKING!!!** 🎉🎉🎉\n\n**THIS IS THE WAFER LSP SERVER!**\n\n**Hover service returned None, but LSP is running!**"
52
+ from lsprotocol.types import Hover, MarkupContent, MarkupKind
53
+ return Hover(contents=MarkupContent(kind=MarkupKind.Markdown, value=test_message))
54
+ return result
55
+
56
+
57
+ if __name__ == "__main__":
58
+ server.start_io()
@@ -0,0 +1,38 @@
1
+ from .analysis_service import AnalysisService, create_analysis_service
2
+ from .docs_service import DocsService, create_docs_service
3
+ from .document_service import DocumentService, create_document_service
4
+ from .hip_docs import (
5
+ HIPDocsService,
6
+ HIPAPIDoc,
7
+ MemoryQualifierDoc,
8
+ IntrinsicDoc,
9
+ ThreadIndexDoc,
10
+ create_hip_docs_service,
11
+ )
12
+ from .hip_hover_service import HIPHoverService, create_hip_hover_service
13
+ from .hover_service import HoverService, create_hover_service
14
+ from .language_registry_service import LanguageRegistryService, create_language_registry_service
15
+ from .position_service import PositionService, create_position_service
16
+
17
+ __all__ = [
18
+ "AnalysisService",
19
+ "DocsService",
20
+ "DocumentService",
21
+ "HIPDocsService",
22
+ "HIPAPIDoc",
23
+ "HIPHoverService",
24
+ "HoverService",
25
+ "IntrinsicDoc",
26
+ "LanguageRegistryService",
27
+ "MemoryQualifierDoc",
28
+ "PositionService",
29
+ "ThreadIndexDoc",
30
+ "create_analysis_service",
31
+ "create_docs_service",
32
+ "create_document_service",
33
+ "create_hip_docs_service",
34
+ "create_hip_hover_service",
35
+ "create_hover_service",
36
+ "create_language_registry_service",
37
+ "create_position_service",
38
+ ]
@@ -0,0 +1,22 @@
1
+ from typing import Any
2
+
3
+
4
+ class AnalysisService:
5
+
6
+ def __init__(self):
7
+ self._cache: dict[str, dict[str, Any]] = {}
8
+
9
+ def get_analysis_for_kernel(self, uri: str, kernel_name: str) -> dict[str, Any] | None:
10
+ cache_key = f"{uri}:{kernel_name}"
11
+ return self._cache.get(cache_key)
12
+
13
+ def set_analysis_for_kernel(self, uri: str, kernel_name: str, analysis: dict[str, Any]):
14
+ cache_key = f"{uri}:{kernel_name}"
15
+ self._cache[cache_key] = analysis
16
+
17
+ def clear_cache(self):
18
+ self._cache.clear()
19
+
20
+
21
+ def create_analysis_service() -> AnalysisService:
22
+ return AnalysisService()
@@ -0,0 +1,40 @@
1
+ from pathlib import Path
2
+
3
+
4
+ class DocsService:
5
+
6
+ def __init__(self, docs_path: str | None = None):
7
+ if docs_path:
8
+ self.docs_path = Path(docs_path)
9
+ else:
10
+ self.docs_path = Path(__file__).parent.parent.parent.parent.parent / \
11
+ "curriculum" / "cutlass-docs" / "cutedsl-docs"
12
+
13
+ self.index = self._build_index()
14
+
15
+ def _build_index(self):
16
+ return {
17
+ "layout": [
18
+ "intro-to-cutedsl.md",
19
+ "partitioning-strategies-inner-outer-threadvalue.md"
20
+ ],
21
+ "TMA": ["blackwell-tutorial-fp16-gemm-0.md"],
22
+ "TMEM": ["colfax-blackwell-umma-tensor-memory-part1.md"],
23
+ "kernel": ["blackwell-tutorial-fp16-gemm-0.md"],
24
+ "struct": ["blackwell-tutorial-fp16-gemm-0.md"],
25
+ "pipeline": ["blackwell-tutorial-fp16-gemm-0.md"],
26
+ "MMA": ["mma-atoms-fundamentals-sm70-example.md"],
27
+ }
28
+
29
+ def get_doc_for_concept(self, concept: str) -> str | None:
30
+ concept_lower = concept.lower()
31
+ if self.index.get(concept_lower):
32
+ doc_file = self.index[concept_lower][0]
33
+ doc_path = self.docs_path / doc_file
34
+ if doc_path.exists():
35
+ return str(doc_path)
36
+ return None
37
+
38
+
39
+ def create_docs_service(docs_path: str | None = None) -> DocsService:
40
+ return DocsService(docs_path)
@@ -0,0 +1,20 @@
1
+ from pygls.lsp.server import LanguageServer
2
+
3
+
4
+ class DocumentService:
5
+
6
+ def __init__(self, server: LanguageServer):
7
+ self._server = server
8
+
9
+ def get_document(self, uri: str):
10
+ return self._server.workspace.text_documents.get(uri)
11
+
12
+ def get_document_content(self, uri: str) -> str:
13
+ doc = self.get_document(uri)
14
+ if doc is None:
15
+ return ''
16
+ return getattr(doc, 'text', getattr(doc, 'source', ''))
17
+
18
+
19
+ def create_document_service(server: LanguageServer) -> DocumentService:
20
+ return DocumentService(server)