From 61b2da847f528985d13f09e801bbc78def1962e8 Mon Sep 17 00:00:00 2001 From: CrackTC Date: Mon, 13 Apr 2026 12:58:25 +0800 Subject: [PATCH] fix: support python @classmethod decorator --- .../analyzer/python/common/python-analyzer.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/engine/analyzer/python/common/python-analyzer.ts b/src/engine/analyzer/python/common/python-analyzer.ts index 4fefb6d8..fb1228a0 100644 --- a/src/engine/analyzer/python/common/python-analyzer.ts +++ b/src/engine/analyzer/python/common/python-analyzer.ts @@ -328,6 +328,18 @@ class PythonAnalyzer extends Analyzer { else argvalues.push(argv) } + if (this.hasClassmethodDecorator(fclos)) { + const cls = this.resolveClassForClassmethod(fclos) + if (cls) { + if (collectedArgs[0] === fclos.ast.fdef.parameters?.[0]) { + argvalues[0] = cls + } else { + collectedArgs.unshift(fclos?.ast?.fdef?.parameters?.[0]) + argvalues.unshift(cls) + } + } + } + // 构建结构化 callInfo,携带 keyword/spread/kwspread 信息 const callInfo: CallInfo = { callArgs: this.buildPythonCallArgs(collectedArgs, argvalues, fclos, node) } @@ -1475,7 +1487,7 @@ class PythonAnalyzer extends Analyzer { * @param fclos */ hasClassmethodDecorator(fclos: any): boolean { - const decorators = fclos.fdef?._meta?.decorators || fclos.ast?._meta?.decorators + const decorators = fclos.fdef?._meta?.decorators || fclos.ast?._meta?.decorators || fclos?.decorators if (!Array.isArray(decorators)) return false return decorators.some( (d: any) =>