Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 53 additions & 1 deletion replace/ast_visitor_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@
srctrl, symbolKindToString, referenceKindToString,
NameHierarchy, SourceRange
)
# 用于为函数生成描述的通用生成器(与 Python indexer 复用)
try:
from modelscope_agent.environment.graph_database.indexer.method_description_generator import get_description_generator
except Exception:
# 在某些独立测试环境下,该模块可能不可用;延迟处理时再退回到 mock
def get_description_generator():
return None
import os

class AstVisitorClient:
Expand Down Expand Up @@ -336,6 +343,51 @@ def recordSymbolScopeLocation(self, symbolId, sourceRange: SourceRange):
'file_path': self.symbol_data.get(name, {}).get('path', ''),
}
self.graphDB.add_node(kind, full_name=name, parms=node_parms)
print(f" [CLIENT] Recorded Scope for {kind}: {name}")
# 如果是函数,尝试使用大模型生成描述并更新到节点属性
if kind == 'FUNCTION':
try:
method_code = code
method_name = self.symbol_data.get(name, {}).get('name', name)
class_name = self.symbol_data.get(name, {}).get('parent_name', '')
file_path = self.symbol_data.get(name, {}).get('file_path', '')

# 尝试从 graphDB 获取邻接关系信息(若实现了该方法)
relations = None
if hasattr(self.graphDB, 'get_node_relations'):
try:
relations = self.graphDB.get_node_relations(name)
except Exception:
relations = None

generator = get_description_generator()
if generator is not None:
print(f" [CLIENT] Generating description for {name}...")
description = generator.generate_method_description(
method_code=method_code,
method_name=method_name,
class_name=class_name,
file_path=file_path,
relations=relations,
)
if description:
# 优先使用 update_node(Neo4j 实现),否则回退到 add_node 来合并属性
try:
if hasattr(self.graphDB, 'update_node'):
# Neo4jGraphDatabase.update_node(node_id, properties)
try:
# 新接口(node_id, properties)
updated = self.graphDB.update_node(node_id=name, properties={'description': description})
except TypeError:
# 旧接口兼容(full_name, parms)
updated = self.graphDB.update_node(name, {'description': description})
print(f" [CLIENT] Description written for {name}")
except Exception as e:
print(f" [CLIENT] Failed to write description for {name}: {e}")
else:
print(" [CLIENT] No description generator available; skipping description generation.")
except Exception as e:
print(f" [CLIENT] Exception during description generation for {name}: {e}")
#print(f" [CLIENT] Recorded Scope for {kind}: {name}")

def resolve_referenced_symbol(self, callee_name_short: str):
Expand Down Expand Up @@ -633,4 +685,4 @@ def post_process_references(self):
#if actually_deleted:
#print(f" [POST] Deleted {len(actually_deleted)} resolved/orphaned UNKNOWN nodes")

#print("--- 后处理引用关系完成 ---")
#print("--- 后处理引用关系完成 ---")
Loading