diff --git a/src/engine/analyzer/python/common/python-analyzer.ts b/src/engine/analyzer/python/common/python-analyzer.ts index 427ad6df..0a8cf451 100644 --- a/src/engine/analyzer/python/common/python-analyzer.ts +++ b/src/engine/analyzer/python/common/python-analyzer.ts @@ -246,6 +246,33 @@ class PythonAnalyzer extends (Analyzer as any) { return SymbolValue(new_node) } + /** + * + * @param fclos + * @param argvalues + * @param state + * @param node + * @param scope + */ + executeSingleCall(fclos: any, argvalues: any, state: any, node: any, scope: any) { + if (fclos.decorators?.some((d: any) => d.name === 'classmethod')) { + let cls + if (fclos._this.vtype === 'object' && fclos._this.__class) { + cls = fclos._this.__class + } else if (fclos._this.vtype === 'class') { + cls = fclos._this + } + if (cls) { + if (argvalues[0]?.vtype === 'undefine') { + argvalues[0] = cls + } else if (argvalues[0]) { + argvalues.unshift(cls) + } + } + } + return super.executeSingleCall(fclos, argvalues, state, node, scope) + } + /** * * @param scope @@ -355,6 +382,23 @@ class PythonAnalyzer extends (Analyzer as any) { return res } + /** + * + * @param fdef + * @param argvalues + * @param fclos + * @param state + * @param node + * @param scope + */ + buildNewObject(fdef: any, argvalues: any, fclos: any, state: any, node: any, scope: any) { + const result = super.buildNewObject(fdef, argvalues, fclos, state, node, scope) + if (fclos.vtype === 'class') { + result.__class = fclos + } + return result + } + /** * * @param scope