Skip to content

Commit fbcf13f

Browse files
authored
Use itself (#31)
1 parent 8659d33 commit fbcf13f

File tree

6 files changed

+38
-32
lines changed

6 files changed

+38
-32
lines changed

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@
77
},
88
"[typescript]": {
99
"editor.defaultFormatter": "biomejs.biome"
10-
}
10+
},
11+
"auto-typing-final.import-style": "final"
1112
}

auto_typing_final/finder.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from collections import defaultdict
22
from collections.abc import Iterable
33
from dataclasses import dataclass
4+
from typing import Final
45

56
from ast_grep_py import Config, SgNode
67

@@ -178,7 +179,7 @@ class ImportsResult:
178179

179180

180181
def find_imports_of_identifier_in_scope(root: SgNode, module_name: str, identifier_name: str) -> ImportsResult: # noqa: C901
181-
result = ImportsResult(module_aliases={module_name}, has_from_import=False)
182+
result: Final = ImportsResult(module_aliases={module_name}, has_from_import=False)
182183

183184
for node in root.find_all(any=[{"kind": "import_statement"}, {"kind": "import_from_statement"}]):
184185
if _is_inside_inner_function_or_class(root, node) or node == root:

auto_typing_final/lsp.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import uuid
22
from collections.abc import Iterable
33
from importlib.metadata import version
4-
from typing import cast, get_args
4+
from typing import Final, cast, get_args
55

66
import attr
77
import cattrs
@@ -42,7 +42,7 @@ def make_import_text_edit(import_text: str) -> lsp.TextEdit:
4242

4343

4444
def make_text_edit(edit: Edit) -> lsp.TextEdit:
45-
node_range = edit.node.range()
45+
node_range: Final = edit.node.range()
4646
return lsp.TextEdit(
4747
range=lsp.Range(
4848
start=lsp.Position(line=node_range.start.line, character=node_range.start.column),
@@ -55,7 +55,7 @@ def make_text_edit(edit: Edit) -> lsp.TextEdit:
5555
def make_diagnostics(source: str) -> Iterable[lsp.Diagnostic]:
5656
if not IMPORT_CONFIG:
5757
return
58-
result = make_replacements(root=SgRoot(source, "python").root(), import_config=IMPORT_CONFIG)
58+
result: Final = make_replacements(root=SgRoot(source, "python").root(), import_config=IMPORT_CONFIG)
5959

6060
for replacement in result.replacements:
6161
if replacement.operation_type == AddFinal:
@@ -86,7 +86,7 @@ def make_diagnostics(source: str) -> Iterable[lsp.Diagnostic]:
8686
def make_fixall_text_edits(source: str) -> Iterable[lsp.TextEdit]:
8787
if not IMPORT_CONFIG:
8888
return
89-
result = make_replacements(root=SgRoot(source, "python").root(), import_config=IMPORT_CONFIG)
89+
result: Final = make_replacements(root=SgRoot(source, "python").root(), import_config=IMPORT_CONFIG)
9090

9191
for replacement in result.replacements:
9292
for edit in replacement.edits:
@@ -147,7 +147,7 @@ def workspace_did_change_configuration(params: lsp.DidChangeConfigurationParams)
147147
def did_open_did_save_did_change(
148148
params: lsp.DidOpenTextDocumentParams | lsp.DidSaveTextDocumentParams | lsp.DidChangeTextDocumentParams,
149149
) -> None:
150-
text_document = LSP_SERVER.workspace.get_text_document(params.text_document.uri)
150+
text_document: Final = LSP_SERVER.workspace.get_text_document(params.text_document.uri)
151151
LSP_SERVER.publish_diagnostics(text_document.uri, diagnostics=list(make_diagnostics(text_document.source)))
152152

153153

@@ -163,12 +163,12 @@ def did_close(params: lsp.DidCloseTextDocumentParams) -> None:
163163
),
164164
)
165165
def code_action(params: lsp.CodeActionParams) -> list[lsp.CodeAction] | None:
166-
requested_kinds = params.context.only or {lsp.CodeActionKind.QuickFix, lsp.CodeActionKind.SourceFixAll}
167-
actions: list[lsp.CodeAction] = []
166+
requested_kinds: Final = params.context.only or {lsp.CodeActionKind.QuickFix, lsp.CodeActionKind.SourceFixAll}
167+
actions: Final[list[lsp.CodeAction]] = []
168168

169169
if lsp.CodeActionKind.QuickFix in requested_kinds:
170-
text_document = LSP_SERVER.workspace.get_text_document(params.text_document.uri)
171-
our_diagnostics = [
170+
text_document: Final = LSP_SERVER.workspace.get_text_document(params.text_document.uri)
171+
our_diagnostics: Final = [
172172
diagnostic for diagnostic in params.context.diagnostics if diagnostic.source == LSP_SERVER.name
173173
]
174174

@@ -210,7 +210,7 @@ def code_action(params: lsp.CodeActionParams) -> list[lsp.CodeAction] | None:
210210

211211
@LSP_SERVER.feature(lsp.CODE_ACTION_RESOLVE)
212212
def resolve_code_action(params: lsp.CodeAction) -> lsp.CodeAction:
213-
text_document = LSP_SERVER.workspace.get_text_document(cast(str, params.data))
213+
text_document: Final = LSP_SERVER.workspace.get_text_document(cast(str, params.data))
214214
params.edit = lsp.WorkspaceEdit(
215215
document_changes=[
216216
lsp.TextDocumentEdit(

auto_typing_final/main.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
from collections.abc import Iterable
44
from difflib import unified_diff
55
from pathlib import Path
6-
from typing import get_args
6+
from typing import Final, get_args
77

88
from ast_grep_py import SgRoot
99

1010
from auto_typing_final.transform import IMPORT_STYLES_TO_IMPORT_CONFIGS, ImportConfig, ImportStyle, make_replacements
1111

1212

1313
def transform_file_content(source: str, import_config: ImportConfig) -> str:
14-
root = SgRoot(source, "python").root()
15-
result = make_replacements(root, import_config)
16-
new_text = root.commit_edits(
14+
root: Final = SgRoot(source, "python").root()
15+
result: Final = make_replacements(root, import_config)
16+
new_text: Final = root.commit_edits(
1717
[edit.node.replace(edit.new_text) for replacement in result.replacements for edit in replacement.edits]
1818
)
1919
return root.commit_edits([root.replace(f"{result.import_text}\n{new_text}")]) if result.import_text else new_text
@@ -42,13 +42,13 @@ def find_all_source_files(paths: list[Path]) -> Iterable[Path]:
4242

4343

4444
def main() -> int:
45-
parser = argparse.ArgumentParser()
45+
parser: Final = argparse.ArgumentParser()
4646
parser.add_argument("files", type=Path, nargs="*")
4747
parser.add_argument("--check", action="store_true")
4848
parser.add_argument("--import-style", type=str, choices=get_args(ImportStyle), default="typing-final")
4949

50-
args = parser.parse_args()
51-
import_config = IMPORT_STYLES_TO_IMPORT_CONFIGS[args.import_style]
50+
args: Final = parser.parse_args()
51+
import_config: Final = IMPORT_STYLES_TO_IMPORT_CONFIGS[args.import_style]
5252

5353
has_changes = False
5454

auto_typing_final/transform.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from collections.abc import Iterable
22
from dataclasses import dataclass
3-
from typing import Literal
3+
from typing import Final, Literal
44

55
from ast_grep_py import SgNode
66

@@ -63,7 +63,7 @@ class RemoveFinal:
6363

6464

6565
def _make_operation_from_assignments_to_one_name(nodes: list[SgNode]) -> Operation:
66-
value_assignments: list[Definition] = []
66+
value_assignments: Final[list[Definition]] = []
6767
has_node_inside_loop = False
6868

6969
for node in nodes:
@@ -107,11 +107,11 @@ def _attribute_is_exact_identifier(node: SgNode, imports_result: ImportsResult,
107107
def _strip_identifier_from_type_annotation(
108108
node: SgNode, imports_result: ImportsResult, identifier_name: str
109109
) -> str | None:
110-
type_node_children = node.children()
110+
type_node_children: Final = node.children()
111111
if len(type_node_children) != 1:
112112
return None
113-
inner_type_node = type_node_children[0]
114-
kind = inner_type_node.kind()
113+
inner_type_node: Final = type_node_children[0]
114+
kind: Final = inner_type_node.kind()
115115

116116
if kind == "subscript":
117117
match tuple((child.kind(), child) for child in inner_type_node.children()):
@@ -182,9 +182,9 @@ class MakeReplacementsResult:
182182

183183

184184
def make_replacements(root: SgNode, import_config: ImportConfig) -> MakeReplacementsResult:
185-
replacements = []
185+
replacements: Final = []
186186
has_added_final = False
187-
imports_result = find_imports_of_identifier_in_scope(root, module_name="typing", identifier_name="Final")
187+
imports_result: Final = find_imports_of_identifier_in_scope(root, module_name="typing", identifier_name="Final")
188188

189189
for current_definitions in find_all_definitions_in_functions(root):
190190
operation = _make_operation_from_assignments_to_one_name(current_definitions)

tests/test_main.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from typing import Final
2+
13
import pytest
24

35
from auto_typing_final.main import transform_file_content
@@ -39,16 +41,18 @@
3941
],
4042
)
4143
def test_variants(import_config: ImportConfig, before: str, after: str) -> None:
42-
source_function_content = "\n".join(f" {line.format(import_config.value)}" for line in before.splitlines())
43-
source = f"""
44+
source_function_content: Final = "\n".join(
45+
f" {line.format(import_config.value)}" for line in before.splitlines()
46+
)
47+
source: Final = f"""
4448
{import_config.import_text}
4549
4650
def foo():
4751
{source_function_content}
4852
"""
4953

50-
after_function_content = "\n".join(f" {line.format(import_config.value)}" for line in after.splitlines())
51-
after_source = f"""
54+
after_function_content: Final = "\n".join(f" {line.format(import_config.value)}" for line in after.splitlines())
55+
after_source: Final = f"""
5256
{import_config.import_text}
5357
5458
def foo():
@@ -588,7 +592,7 @@ def foo(self):
588592
],
589593
)
590594
def test_transform_file_content(case: str) -> None:
591-
import_config = IMPORT_STYLES_TO_IMPORT_CONFIGS["typing-final"]
595+
import_config: Final = IMPORT_STYLES_TO_IMPORT_CONFIGS["typing-final"]
592596
before, _, after = case.partition("---")
593597
assert (
594598
transform_file_content(f"{import_config.import_text}\n" + before.strip(), import_config=import_config)
@@ -653,7 +657,7 @@ def f():
653657
)
654658
def test_add_import(case: str) -> None:
655659
before, _, after = case.partition("---")
656-
import_config = IMPORT_STYLES_TO_IMPORT_CONFIGS["typing-final"]
660+
import_config: Final = IMPORT_STYLES_TO_IMPORT_CONFIGS["typing-final"]
657661
assert transform_file_content(before.strip(), import_config=import_config) == after.strip()
658662

659663

0 commit comments

Comments
 (0)