15 from pcresolve
import analyze_project
as _pcresolveAnalyze
17 _pcresolveAnalyze =
None
41 global _analysisCache, _lookupCache
42 cacheKey = (projPath, libName)
43 if cacheKey
in _lookupCache:
44 return _lookupCache[cacheKey]
46 if _pcresolveAnalyze
is None:
47 _lookupCache[cacheKey] = {}
48 return _lookupCache[cacheKey]
52 if projPath
in _analysisCache:
53 result = _analysisCache[projPath]
56 result = _pcresolveAnalyze(projPath, scope_model=
"v2")
58 _analysisCache[projPath] =
None
59 _lookupCache[cacheKey] = {}
60 return _lookupCache[cacheKey]
61 _analysisCache[projPath] = result
64 _lookupCache[cacheKey] = {}
65 return _lookupCache[cacheKey]
74 for fileResult
in result.files:
75 lookup[fileResult.file_path] = {}
77 for call
in result.all_api_calls:
78 if not _matchesLibname(call, libName):
81 record = _convertApiCall(call, projPath)
85 lookup[key][record[
'id']] = record
89 for filePath
in lookup:
90 lookup[filePath] = dict(sorted(
91 lookup[filePath].items(),
92 key=
lambda kv: (kv[1][
'lineno'], kv[1][
'col_offset']),
95 _lookupCache[cacheKey] = lookup
109 global _analysisCache, _lookupCache
132 def _convertApiCall(callObj, projPath):
133 from Tool.callsite
import makeCallsiteRecord
135 resolved = callObj.resolved_func
or callObj.func_name
or ''
138 file_path=callObj.file_path,
139 call_text=callObj.expression,
140 format_api=f
"{resolved}({callObj.parameters})" if resolved
else callObj.expression,
141 parameters=callObj.parameters,
142 lineno=callObj.lineno,
143 col_offset=callObj.col_offset,
144 end_lineno=callObj.end_lineno
or None,
145 end_col_offset=callObj.end_col_offset
or None,
169 def _matchesLibname(callObj, libName):
170 deco = getattr(callObj,
'decorated_by', [])
or []
171 return callObj.top_library == libName
or libName
in deco
def makeCallsiteRecord(file_path, call_text, format_api, parameters, lineno, col_offset, end_lineno=None, end_col_offset=None, proj_path=None)
Make callsite record 构造调用点记录
def buildCallsiteLookup(projPath, libName)
Build a CallsiteRecord lookup table from PCResolve analysis 从PCResolve分析结果构建CallsiteRecord查找表