Skip to content

Cheat sheet

One page, the daily moves: build one analysis object, then query it: the same interface for Java and Python. For the why and the walkthroughs, see What is CLDK?, Core concepts, and the Quickstart.

pip install cldk

Reachability uses networkx (a CLDK dependency, but install it explicitly if you query graphs directly):

pip install cldk networkx

One pattern for every language: CLDK(language=...).analysis(...). The analysis level decides how much gets computed.

from cldk import CLDK
from cldk.analysis import AnalysisLevel
# Default level is symbol_table. Use call_graph for callers/callees/reachability.
analysis = CLDK(language="java").analysis(
project_path="commons-cli",
analysis_level=AnalysisLevel.call_graph,
)
print(len(analysis.get_classes()), "classes") # -> 23 classes
ArgumentValueNotes
language"java" / "python"Picks the analysis facade.
project_pathpath to checkoutThe project to analyze.
analysis_levelAnalysisLevel.symbol_table (default) / AnalysisLevel.call_graphCall graph, callers, callees, and reachability need call_graph.

The always-available layer: every class, method, and field, typed and queryable.

MethodReturnsWhat it gives you
get_symbol_table()Dict[str, JCompilationUnit | PyModule]The whole project, file by file.
get_classes()Dict[str, JType | PyClass]Every class/type, keyed by qualified name.
get_methods()DictEvery method (Java).
get_method(qualified_class_name, qualified_method_name)JCallable | PyCallable | NoneOne method; .code is its source body.
m = analysis.get_method(
"org.apache.commons.cli.OptionBuilder", "create(String)"
)
print(m.code) # -> source body of OptionBuilder.create(String)

Java adds class-relationship queries: get_sub_classes(cls), get_extended_classes(cls), get_implemented_interfaces(cls), plus get_all_crud_operations() and get_all_comments().

MethodReturnsNotes
get_call_graph()networkx.DiGraphEdges point caller → callee.
get_call_graph_json()strSame graph, serialized.
get_callers(target_class_name, target_method_declaration)DictWho calls this method.
get_callees(source_class_name, source_method_declaration)DictWhat this method calls.
get_class_call_graph(qualified_class_name, method_signature=None)graphCall graph scoped to one class (Java).
cg = analysis.get_call_graph() # -> networkx.DiGraph
callers = analysis.get_callers(
"org.apache.commons.cli.Options", "addOption(Option)"
) # -> Dict of call sites

Reachability is a networkx query over the call graph:

import networkx as nx
cg = analysis.get_call_graph()
print(nx.has_path(cg, src, sink)) # reachable? -> True / False
# nx.shortest_path(cg, src, sink) # one path
# list(nx.all_simple_paths(cg, src, sink)) # every path

The typed objects each facade returns.

LanguageModels
JavaJType, JCallable, JCompilationUnit, JField, JComment, JCRUDOperation
PythonPyModule, PyClass, PyCallable, PyImport, PyComment