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.
- wafer_lsp/__init__.py +1 -0
- wafer_lsp/__main__.py +9 -0
- wafer_lsp/analyzers/__init__.py +0 -0
- wafer_lsp/analyzers/compiler_integration.py +16 -0
- wafer_lsp/analyzers/docs_index.py +36 -0
- wafer_lsp/handlers/__init__.py +30 -0
- wafer_lsp/handlers/code_action.py +48 -0
- wafer_lsp/handlers/code_lens.py +48 -0
- wafer_lsp/handlers/completion.py +6 -0
- wafer_lsp/handlers/diagnostics.py +41 -0
- wafer_lsp/handlers/document_symbol.py +176 -0
- wafer_lsp/handlers/hip_diagnostics.py +303 -0
- wafer_lsp/handlers/hover.py +251 -0
- wafer_lsp/handlers/inlay_hint.py +245 -0
- wafer_lsp/handlers/semantic_tokens.py +224 -0
- wafer_lsp/handlers/workspace_symbol.py +87 -0
- wafer_lsp/languages/README.md +195 -0
- wafer_lsp/languages/__init__.py +17 -0
- wafer_lsp/languages/converter.py +88 -0
- wafer_lsp/languages/detector.py +107 -0
- wafer_lsp/languages/parser_manager.py +33 -0
- wafer_lsp/languages/registry.py +120 -0
- wafer_lsp/languages/types.py +37 -0
- wafer_lsp/parsers/__init__.py +36 -0
- wafer_lsp/parsers/base_parser.py +9 -0
- wafer_lsp/parsers/cuda_parser.py +95 -0
- wafer_lsp/parsers/cutedsl_parser.py +114 -0
- wafer_lsp/parsers/hip_parser.py +688 -0
- wafer_lsp/server.py +58 -0
- wafer_lsp/services/__init__.py +38 -0
- wafer_lsp/services/analysis_service.py +22 -0
- wafer_lsp/services/docs_service.py +40 -0
- wafer_lsp/services/document_service.py +20 -0
- wafer_lsp/services/hip_docs.py +806 -0
- wafer_lsp/services/hip_hover_service.py +412 -0
- wafer_lsp/services/hover_service.py +237 -0
- wafer_lsp/services/language_registry_service.py +26 -0
- wafer_lsp/services/position_service.py +77 -0
- wafer_lsp/utils/__init__.py +0 -0
- wafer_lsp/utils/lsp_helpers.py +79 -0
- wafer_lsp-0.1.13.dist-info/METADATA +60 -0
- wafer_lsp-0.1.13.dist-info/RECORD +44 -0
- wafer_lsp-0.1.13.dist-info/WHEEL +4 -0
- 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)
|