client-py/venv/lib/python3.12/site-packages/pylsp/plugins/mccabe_lint.py
2026-05-02 13:34:53 +05:00

56 lines
1.8 KiB
Python

# Copyright 2017-2020 Palantir Technologies, Inc.
# Copyright 2021- Python Language Server Contributors.
import ast
import logging
import mccabe
from pylsp import hookimpl, lsp
log = logging.getLogger(__name__)
THRESHOLD = "threshold"
DEFAULT_THRESHOLD = 15
@hookimpl
def pylsp_lint(config, workspace, document):
with workspace.report_progress("lint: mccabe"):
threshold = config.plugin_settings("mccabe", document_path=document.path).get(
THRESHOLD, DEFAULT_THRESHOLD
)
log.debug("Running mccabe lint with threshold: %s", threshold)
try:
tree = compile(document.source, document.path, "exec", ast.PyCF_ONLY_AST)
except SyntaxError:
# We'll let the other linters point this one out
return None
visitor = mccabe.PathGraphingAstVisitor()
visitor.preorder(tree, visitor)
diags = []
for graph in visitor.graphs.values():
if graph.complexity() >= threshold:
diags.append(
{
"source": "mccabe",
"range": {
"start": {
"line": graph.lineno - 1,
"character": graph.column,
},
"end": {
"line": graph.lineno - 1,
"character": len(document.lines[graph.lineno]),
},
},
"message": "Cyclomatic complexity too high: %s (threshold %s)"
% (graph.complexity(), threshold),
"severity": lsp.DiagnosticSeverity.Warning,
}
)
return diags