wafer-lsp 0.1.0__py3-none-any.whl → 0.1.2__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.
@@ -0,0 +1,412 @@
1
+ """
2
+ HIP Hover Service.
3
+
4
+ Provides rich hover documentation for HIP code including:
5
+ - HIP API functions (hipMalloc, hipMemcpy, etc.)
6
+ - Memory qualifiers (__device__, __shared__, __constant__)
7
+ - Wavefront intrinsics (__shfl, __ballot, etc.)
8
+ - Thread indexing (threadIdx, blockIdx, etc.)
9
+ - Kernel function information
10
+ """
11
+
12
+ from lsprotocol.types import Hover, MarkupContent, MarkupKind, Position
13
+
14
+ from ..parsers.hip_parser import (
15
+ HIPKernel,
16
+ HIPDeviceFunction,
17
+ SharedMemoryAllocation,
18
+ KernelLaunchSite,
19
+ HIPParser,
20
+ )
21
+ from .hip_docs import (
22
+ HIPDocsService,
23
+ HIPAPIDoc,
24
+ MemoryQualifierDoc,
25
+ IntrinsicDoc,
26
+ ThreadIndexDoc,
27
+ create_hip_docs_service,
28
+ )
29
+
30
+
31
+ class HIPHoverService:
32
+ """Provides hover documentation for HIP code."""
33
+
34
+ def __init__(self, docs_service: HIPDocsService | None = None):
35
+ self._docs = docs_service or create_hip_docs_service()
36
+ self._parser = HIPParser()
37
+
38
+ def get_hover(self, content: str, position: Position, uri: str) -> Hover | None:
39
+ """Get hover information for a position in HIP code.
40
+
41
+ Args:
42
+ content: The document content
43
+ position: The cursor position
44
+ uri: The document URI
45
+
46
+ Returns:
47
+ Hover information or None
48
+ """
49
+ word = self._get_word_at_position(content, position)
50
+ if not word:
51
+ return None
52
+
53
+ # Try different types of hover in order of specificity
54
+
55
+ # 1. Check for HIP API functions
56
+ api_doc = self._docs.get_api_doc(word)
57
+ if api_doc:
58
+ return self._format_api_hover(api_doc)
59
+
60
+ # 2. Check for memory qualifiers (including in context)
61
+ qualifier_doc = self._docs.get_memory_qualifier_doc(word)
62
+ if qualifier_doc:
63
+ return self._format_qualifier_hover(qualifier_doc)
64
+
65
+ # 3. Check for intrinsics
66
+ intrinsic_doc = self._docs.get_intrinsic_doc(word)
67
+ if intrinsic_doc:
68
+ return self._format_intrinsic_hover(intrinsic_doc)
69
+
70
+ # 4. Check for thread indexing variables
71
+ thread_doc = self._docs.get_thread_index_doc(word)
72
+ if thread_doc:
73
+ return self._format_thread_index_hover(thread_doc)
74
+
75
+ # 5. Check for kernels/device functions in the file
76
+ parsed = self._parser.parse_file(content)
77
+
78
+ for kernel in parsed.get("kernels", []):
79
+ if kernel.name == word:
80
+ return self._format_kernel_hover(kernel)
81
+
82
+ for device_func in parsed.get("device_functions", []):
83
+ if device_func.name == word:
84
+ return self._format_device_function_hover(device_func)
85
+
86
+ # 6. Check for shared memory variables
87
+ for shared_var in parsed.get("shared_memory", []):
88
+ if shared_var.name == word:
89
+ return self._format_shared_memory_hover(shared_var)
90
+
91
+ # 7. Check for kernel launch (when hovering on kernel name at launch site)
92
+ for launch in parsed.get("launch_sites", []):
93
+ if launch.kernel_name == word and position.line == launch.line:
94
+ return self._format_launch_site_hover(launch)
95
+
96
+ return None
97
+
98
+ def _get_word_at_position(self, content: str, position: Position) -> str:
99
+ """Extract the word at the given position."""
100
+ lines = content.split("\n")
101
+ if position.line >= len(lines):
102
+ return ""
103
+
104
+ line = lines[position.line]
105
+ if position.character >= len(line):
106
+ return ""
107
+
108
+ # Find word boundaries (include underscores for __global__ etc.)
109
+ start = position.character
110
+ while start > 0 and (line[start - 1].isalnum() or line[start - 1] == "_"):
111
+ start -= 1
112
+
113
+ end = position.character
114
+ while end < len(line) and (line[end].isalnum() or line[end] == "_"):
115
+ end += 1
116
+
117
+ return line[start:end]
118
+
119
+ def _format_api_hover(self, doc: HIPAPIDoc) -> Hover:
120
+ """Format hover content for a HIP API function."""
121
+ lines = [
122
+ f"### `{doc.name}`",
123
+ "",
124
+ f"```cpp",
125
+ doc.signature,
126
+ "```",
127
+ "",
128
+ doc.description,
129
+ "",
130
+ ]
131
+
132
+ if doc.parameters:
133
+ lines.append("**Parameters:**")
134
+ for param_name, param_desc in doc.parameters:
135
+ lines.append(f"- `{param_name}`: {param_desc}")
136
+ lines.append("")
137
+
138
+ lines.append(f"**Returns:** {doc.return_value}")
139
+ lines.append("")
140
+
141
+ if doc.amd_notes:
142
+ lines.append("**AMD Notes:**")
143
+ lines.append(f"> {doc.amd_notes}")
144
+ lines.append("")
145
+
146
+ if doc.example:
147
+ lines.append("**Example:**")
148
+ lines.append("```cpp")
149
+ lines.extend(doc.example.replace("\\n", "\n").split("\n"))
150
+ lines.append("```")
151
+ lines.append("")
152
+
153
+ if doc.related:
154
+ lines.append(f"**Related:** {', '.join(f'`{r}`' for r in doc.related)}")
155
+
156
+ if doc.doc_url:
157
+ lines.append("")
158
+ lines.append(f"[📖 Documentation]({doc.doc_url})")
159
+
160
+ return Hover(contents=MarkupContent(
161
+ kind=MarkupKind.Markdown,
162
+ value="\n".join(lines)
163
+ ))
164
+
165
+ def _format_qualifier_hover(self, doc: MemoryQualifierDoc) -> Hover:
166
+ """Format hover content for a memory qualifier."""
167
+ lines = [
168
+ f"### `{doc.name}`",
169
+ "",
170
+ doc.description,
171
+ "",
172
+ "**AMD Architecture:**",
173
+ doc.amd_details,
174
+ "",
175
+ "**Performance Tips:**",
176
+ doc.performance_tips,
177
+ ]
178
+
179
+ if doc.example:
180
+ lines.append("")
181
+ lines.append("**Example:**")
182
+ lines.append("```cpp")
183
+ lines.extend(doc.example.split("\n"))
184
+ lines.append("```")
185
+
186
+ return Hover(contents=MarkupContent(
187
+ kind=MarkupKind.Markdown,
188
+ value="\n".join(lines)
189
+ ))
190
+
191
+ def _format_intrinsic_hover(self, doc: IntrinsicDoc) -> Hover:
192
+ """Format hover content for a wavefront intrinsic."""
193
+ lines = [
194
+ f"### `{doc.name}`",
195
+ "",
196
+ f"```cpp",
197
+ doc.signature,
198
+ "```",
199
+ "",
200
+ doc.description,
201
+ "",
202
+ "**⚠️ AMD Wavefront Behavior:**",
203
+ f"> {doc.amd_behavior}",
204
+ "",
205
+ ]
206
+
207
+ if doc.parameters:
208
+ lines.append("**Parameters:**")
209
+ for param_name, param_desc in doc.parameters:
210
+ lines.append(f"- `{param_name}`: {param_desc}")
211
+ lines.append("")
212
+
213
+ lines.append(f"**Returns:** {doc.return_value}")
214
+ lines.append("")
215
+
216
+ if doc.example:
217
+ lines.append("**Example:**")
218
+ lines.append("```cpp")
219
+ lines.extend(doc.example.replace("\\n", "\n").split("\n"))
220
+ lines.append("```")
221
+ lines.append("")
222
+
223
+ if doc.cuda_equivalent:
224
+ lines.append(f"**CUDA Equivalent:** `{doc.cuda_equivalent}`")
225
+
226
+ return Hover(contents=MarkupContent(
227
+ kind=MarkupKind.Markdown,
228
+ value="\n".join(lines)
229
+ ))
230
+
231
+ def _format_thread_index_hover(self, doc: ThreadIndexDoc) -> Hover:
232
+ """Format hover content for thread indexing variables."""
233
+ lines = [
234
+ f"### `{doc.name}`",
235
+ "",
236
+ doc.description,
237
+ "",
238
+ "**AMD Context:**",
239
+ f"> {doc.amd_context}",
240
+ "",
241
+ ]
242
+
243
+ if doc.common_patterns:
244
+ lines.append("**Common Patterns:**")
245
+ lines.append("```cpp")
246
+ for pattern in doc.common_patterns:
247
+ lines.append(pattern)
248
+ lines.append("```")
249
+
250
+ return Hover(contents=MarkupContent(
251
+ kind=MarkupKind.Markdown,
252
+ value="\n".join(lines)
253
+ ))
254
+
255
+ def _format_kernel_hover(self, kernel: HIPKernel) -> Hover:
256
+ """Format hover content for a kernel function."""
257
+ lines = [
258
+ f"### 🚀 HIP Kernel: `{kernel.name}`",
259
+ "",
260
+ ]
261
+
262
+ if kernel.docstring:
263
+ lines.append(kernel.docstring)
264
+ lines.append("")
265
+
266
+ # Build signature
267
+ params_str = ", ".join(kernel.parameters) if kernel.parameters else ""
268
+ lines.append("```cpp")
269
+ if kernel.attributes:
270
+ for attr in kernel.attributes:
271
+ lines.append(attr)
272
+ lines.append(f"__global__ void {kernel.name}({params_str})")
273
+ lines.append("```")
274
+ lines.append("")
275
+
276
+ if kernel.parameter_info:
277
+ lines.append("**Parameters:**")
278
+ for param in kernel.parameter_info:
279
+ type_info = f" (`{param.type_str}`)" if param.type_str else ""
280
+ lines.append(f"- `{param.name}`{type_info}")
281
+ lines.append("")
282
+
283
+ lines.append(f"**Location:** Lines {kernel.line + 1} - {kernel.end_line + 1}")
284
+ lines.append("")
285
+ lines.append("**AMD GPU Execution:**")
286
+ lines.append("- Executed on GPU Compute Units")
287
+ lines.append("- Threads grouped into 64-thread wavefronts (CDNA)")
288
+ lines.append("- Use `<<<grid, block>>>` or `hipLaunchKernelGGL` to launch")
289
+
290
+ return Hover(contents=MarkupContent(
291
+ kind=MarkupKind.Markdown,
292
+ value="\n".join(lines)
293
+ ))
294
+
295
+ def _format_device_function_hover(self, func: HIPDeviceFunction) -> Hover:
296
+ """Format hover content for a device function."""
297
+ lines = [
298
+ f"### ⚡ Device Function: `{func.name}`",
299
+ "",
300
+ ]
301
+
302
+ # Build signature
303
+ params_str = ", ".join(func.parameters) if func.parameters else ""
304
+ inline_str = "__forceinline__ " if func.is_inline else ""
305
+ lines.append("```cpp")
306
+ lines.append(f"__device__ {inline_str}{func.return_type} {func.name}({params_str})")
307
+ lines.append("```")
308
+ lines.append("")
309
+
310
+ if func.parameter_info:
311
+ lines.append("**Parameters:**")
312
+ for param in func.parameter_info:
313
+ type_info = f" (`{param.type_str}`)" if param.type_str else ""
314
+ lines.append(f"- `{param.name}`{type_info}")
315
+ lines.append("")
316
+
317
+ lines.append(f"**Returns:** `{func.return_type}`")
318
+ lines.append("")
319
+ lines.append(f"**Location:** Lines {func.line + 1} - {func.end_line + 1}")
320
+ lines.append("")
321
+ lines.append("**Note:** Device functions can only be called from kernel or other device functions.")
322
+
323
+ return Hover(contents=MarkupContent(
324
+ kind=MarkupKind.Markdown,
325
+ value="\n".join(lines)
326
+ ))
327
+
328
+ def _format_shared_memory_hover(self, shared: SharedMemoryAllocation) -> Hover:
329
+ """Format hover content for a shared memory allocation."""
330
+ lines = [
331
+ f"### 📦 Shared Memory (LDS): `{shared.name}`",
332
+ "",
333
+ f"**Type:** `{shared.type_str}`",
334
+ ]
335
+
336
+ if shared.array_size:
337
+ lines.append(f"**Array Size:** `[{shared.array_size}]`")
338
+
339
+ if shared.size_bytes:
340
+ if shared.size_bytes >= 1024:
341
+ size_str = f"{shared.size_bytes / 1024:.1f} KB"
342
+ else:
343
+ size_str = f"{shared.size_bytes} bytes"
344
+ lines.append(f"**Size:** {size_str}")
345
+
346
+ if shared.is_dynamic:
347
+ lines.append("**Allocation:** Dynamic (extern)")
348
+ else:
349
+ lines.append("**Allocation:** Static")
350
+
351
+ lines.append("")
352
+ lines.append("**AMD LDS Details:**")
353
+ lines.append("- On-chip memory with ~100x lower latency than HBM")
354
+ lines.append("- 64 KB per Compute Unit")
355
+ lines.append("- Shared by all threads in the block")
356
+ lines.append("- 32 banks of 4 bytes each")
357
+ lines.append("")
358
+ lines.append("💡 **Tip:** Avoid bank conflicts by using padding: `[SIZE + 1]`")
359
+
360
+ return Hover(contents=MarkupContent(
361
+ kind=MarkupKind.Markdown,
362
+ value="\n".join(lines)
363
+ ))
364
+
365
+ def _format_launch_site_hover(self, launch: KernelLaunchSite) -> Hover:
366
+ """Format hover content for a kernel launch site."""
367
+ lines = [
368
+ f"### 🎯 Kernel Launch: `{launch.kernel_name}`",
369
+ "",
370
+ ]
371
+
372
+ if launch.is_hip_launch_kernel_ggl:
373
+ lines.append("**Launch Method:** `hipLaunchKernelGGL`")
374
+ else:
375
+ lines.append("**Launch Method:** `<<<>>>` syntax")
376
+
377
+ lines.append("")
378
+
379
+ if launch.grid_dim:
380
+ lines.append(f"**Grid Dimensions:** `{launch.grid_dim}`")
381
+ if launch.block_dim:
382
+ lines.append(f"**Block Dimensions:** `{launch.block_dim}`")
383
+ # Try to parse block dimensions for wavefront info
384
+ self._add_wavefront_info(lines, launch.block_dim)
385
+
386
+ if launch.shared_mem_bytes:
387
+ lines.append(f"**Dynamic Shared Memory:** `{launch.shared_mem_bytes}`")
388
+ if launch.stream:
389
+ lines.append(f"**Stream:** `{launch.stream}`")
390
+
391
+ return Hover(contents=MarkupContent(
392
+ kind=MarkupKind.Markdown,
393
+ value="\n".join(lines)
394
+ ))
395
+
396
+ def _add_wavefront_info(self, lines: list[str], block_dim: str) -> None:
397
+ """Add wavefront information based on block dimensions.
398
+
399
+ Only adds info when block_dim is a simple numeric literal we can parse.
400
+ For complex expressions (variables, dim3, etc.), we don't display wavefront count
401
+ because we can't determine the value at parse time.
402
+ """
403
+ # Only handle simple numeric block size - we don't guess at complex expressions
404
+ if block_dim.isdigit():
405
+ block_size = int(block_dim)
406
+ wavefronts = (block_size + 63) // 64
407
+ lines.append(f"**Wavefronts per Block:** {wavefronts} (64 threads each on CDNA)")
408
+
409
+
410
+ def create_hip_hover_service(docs_service: HIPDocsService | None = None) -> HIPHoverService:
411
+ """Create a HIP hover service instance."""
412
+ return HIPHoverService(docs_service)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wafer-lsp
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: Language Server Protocol server for GPU programming languages
5
5
  Author-email: Wafer <support@wafer.ai>
6
6
  License: MIT
@@ -16,6 +16,9 @@ Requires-Python: >=3.12
16
16
  Requires-Dist: lsprotocol>=2024.0.0
17
17
  Requires-Dist: pygls>=1.0.0
18
18
  Requires-Dist: wafer-core
19
+ Provides-Extra: dev
20
+ Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
21
+ Requires-Dist: pytest>=8.0.0; extra == 'dev'
19
22
  Description-Content-Type: text/markdown
20
23
 
21
24
  # Wafer LSP
@@ -4,37 +4,41 @@ wafer_lsp/server.py,sha256=ZGFXghuPdKJH7aLhrYvOiKp6zfOdtoqWavdtDwg8Bk4,1938
4
4
  wafer_lsp/analyzers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  wafer_lsp/analyzers/compiler_integration.py,sha256=SLyIZXk52nKP1b04s9Wo77cRLFn5auc4jGRo59Vl9Wc,341
6
6
  wafer_lsp/analyzers/docs_index.py,sha256=hrrBgPzIM_mJewCzHyw-2YEWdIchuB3SAMXI8PhtDq0,1309
7
- wafer_lsp/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ wafer_lsp/handlers/__init__.py,sha256=tPFuceRrlCkyW7N5BSRZJY7IMx9Etb6D5c54pZZHJ-w,926
8
8
  wafer_lsp/handlers/code_action.py,sha256=PTWs4X3CkfprMmzqC3cg7uEWdfivNNH9thU4E-c6ztQ,1411
9
9
  wafer_lsp/handlers/code_lens.py,sha256=mhdJtbS2LMNHGOirJbXUfatqhqMBess5wndfBBOLnok,1301
10
10
  wafer_lsp/handlers/completion.py,sha256=qz36GIJXu2fG6K-FdbFNGCCTYSpyV5A6-WOHHNne7QI,142
11
- wafer_lsp/handlers/diagnostics.py,sha256=gapTVWObW9xwqLkZbjEn4dhuvaqduD9ozNZDEALnumM,378
12
- wafer_lsp/handlers/document_symbol.py,sha256=u-SUAjZgLVEs3nkhBmd6icfAqIiqYP6TfDas3JHdiD0,3165
13
- wafer_lsp/handlers/hover.py,sha256=uTp190gvwOJyRVpJ0Y8VpP-8D5E5V67-GwzuVZ81dpU,7632
14
- wafer_lsp/handlers/inlay_hint.py,sha256=usPK7a6Z55tHGdd6LrHDO7RHL_UG0G1IGBSVrTF3nHo,1932
15
- wafer_lsp/handlers/semantic_tokens.py,sha256=w90P__qqCeCe1yDZkPNPHj_vxHVzcUylGmgYqPkfaWs,3427
11
+ wafer_lsp/handlers/diagnostics.py,sha256=zSaBYdZCqBK2Nb2WhCyQfKDATf8nsj6jMv-K1lvxnQc,1137
12
+ wafer_lsp/handlers/document_symbol.py,sha256=H9rehZlbJKZ-2ueyvTYvz0_-0xfiGaAEPXSWbp76JUk,6465
13
+ wafer_lsp/handlers/hip_diagnostics.py,sha256=YFaSBuwBb7DJNWhBQpwVzYDJvA0KmMV5X9aEEk4X8eM,10923
14
+ wafer_lsp/handlers/hover.py,sha256=F3vweiSHcFlF66qvneJkX02hTq3iaxfXK2h9EkufL7w,8788
15
+ wafer_lsp/handlers/inlay_hint.py,sha256=HW-AFeWps2VbEGPMTAG9KHyiT1s2JS81F71BXq7rwoA,7765
16
+ wafer_lsp/handlers/semantic_tokens.py,sha256=JNJetP7Flh6yxNFzkGM3Ho9D4HaHsVSmoXdgcJnJtZM,7447
16
17
  wafer_lsp/handlers/workspace_symbol.py,sha256=YGSkf6doChh1BjVezEQFgIsI2NsQHhOjLchoF5bfBK4,2934
17
18
  wafer_lsp/languages/README.md,sha256=hLBqOBvKSqeCrNH9Wrr6XAHa8eBnd81IargPDurodU8,5527
18
19
  wafer_lsp/languages/__init__.py,sha256=5cXQkPRsh4JLyZd2QubvTxvuip10695Hb2zjyGF6Frc,472
19
20
  wafer_lsp/languages/converter.py,sha256=LPKJfkUV-rNXyJg7Tr5AZ1AlREKH4ulfjDHWlUNvyXU,2487
20
- wafer_lsp/languages/detector.py,sha256=B2YrRN3KaSwcTM5UHMQkamRaqcQgySXYbHD71cN2bP8,1109
21
+ wafer_lsp/languages/detector.py,sha256=7FDQZlnfnkI7DCeySzecIarYnNLINlIRgRkCj7L3SQY,4235
21
22
  wafer_lsp/languages/parser_manager.py,sha256=RBYS0w2wIRkKlrEDYvMEGKbsTkOSEpfUB3fjH_9X0Hk,945
22
- wafer_lsp/languages/registry.py,sha256=g8WuTIuwsssHTqM-t3QLsLsUqL0zFUGq3qnBbVxX6sY,2869
23
+ wafer_lsp/languages/registry.py,sha256=Ka9WDURUniqUAZDpdrQtRTLLzS36n4hq2dIwqj_AFdc,3703
23
24
  wafer_lsp/languages/types.py,sha256=c22sDECraXHvazqJSF7WC1ntFNyf9Mbx60EXA9jrbWk,624
24
- wafer_lsp/parsers/__init__.py,sha256=7DUHQE1aA14zXF_3piSqVGr9wBSmDDa7PHtmHzhGkXs,345
25
+ wafer_lsp/parsers/__init__.py,sha256=yh41cxz8Siuv0doHXnhuSY-JPoN82XtqDiOrbJAGeEg,709
25
26
  wafer_lsp/parsers/base_parser.py,sha256=RQjk5QOHrS398CrUGP2ZtSsisSl6Kh0KgWLPssSv8ss,176
26
27
  wafer_lsp/parsers/cuda_parser.py,sha256=X2EX8gFcZCK8-lSsedby1-vSgYsl2CHLxRxzwr5yIlI,2621
27
28
  wafer_lsp/parsers/cutedsl_parser.py,sha256=1r2gdAuwFrp4fQQNEQCRpkwtfunus-hq4h92j2MZyFE,3711
28
- wafer_lsp/services/__init__.py,sha256=ILqsbYVzyOUXZqAy1FBkyP860vrSoAhCBW3VpanTDio,773
29
+ wafer_lsp/parsers/hip_parser.py,sha256=nJdwsyTWxdeRJkLMHzUC_4px2fWvtwxd5FgdqOvIXAU,26465
30
+ wafer_lsp/services/__init__.py,sha256=lMMuCBSMfKQeTlUnSo82tXuMGN9rmeoTmCfUigZReL0,1191
29
31
  wafer_lsp/services/analysis_service.py,sha256=J6jcg0YQZh9iQYyOXO9bF5NqaJDfnIKhwssCLNcUJjA,619
30
32
  wafer_lsp/services/docs_service.py,sha256=ltjkPuQ4DUmuc95AZVfQ6GSWgpjKqv_6-Luh2CFPocQ,1393
31
33
  wafer_lsp/services/document_service.py,sha256=gdQ-leIUSK7tiffFsi4UsseIyBx2TO_WIlBPFh57GU8,559
34
+ wafer_lsp/services/hip_docs.py,sha256=mmbFy89Jpj3KUXLO_0M73f0zrkiIw6omtqwCva0Y7Jw,40442
35
+ wafer_lsp/services/hip_hover_service.py,sha256=zbnjdsU6jlCIJh38EDM0sGnLr8I7VKbLABaULJxcXwE,14112
32
36
  wafer_lsp/services/hover_service.py,sha256=Zby2lhMO4US2IVTAVuU-ntkRKWrrR7HEjWdlGFSRQj4,9743
33
37
  wafer_lsp/services/language_registry_service.py,sha256=qvMR9oI1pUrSv09Q-WRF5-sEu2Nma2fZeUhdydIWaqg,864
34
38
  wafer_lsp/services/position_service.py,sha256=Nx-_AuBEr_yUXjAYPfJ_wmeGM_Gy5vbIUW163GqblCU,2831
35
39
  wafer_lsp/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
40
  wafer_lsp/utils/lsp_helpers.py,sha256=pXYvm_gJiJ_TAwwyGxhqvWJQx6CBecYK1c6tVY7gUF8,2739
37
- wafer_lsp-0.1.0.dist-info/METADATA,sha256=gLx1YqnfAhI55s3EeaIMXb_Jm8xJoD1vBHXHcCDSv0A,1622
38
- wafer_lsp-0.1.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
39
- wafer_lsp-0.1.0.dist-info/entry_points.txt,sha256=XHcM0QZy6GzCYY2ajejqL0tZ2X6y6zYWP0Lg1egxGW4,54
40
- wafer_lsp-0.1.0.dist-info/RECORD,,
41
+ wafer_lsp-0.1.2.dist-info/METADATA,sha256=nGBlPcHE---A85ZbfH8lH9efnWr_noq9FSs9TL3OYXo,1741
42
+ wafer_lsp-0.1.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
43
+ wafer_lsp-0.1.2.dist-info/entry_points.txt,sha256=XHcM0QZy6GzCYY2ajejqL0tZ2X6y6zYWP0Lg1egxGW4,54
44
+ wafer_lsp-0.1.2.dist-info/RECORD,,