Graph Buddy - an interactive code dependency browsing and visualization tool
Krzysztof Borowski
Bartosz Baliś
Tomasz Orzechowski
Software development reality
- Growing code bases and fast changing requirements.
- Code quality degradation.
- Increasing cognitive load.
- Wasted time on software comprehension process.
- Wasted money and developers dissatisfaction.
we argue that helping the programmer with code understanding increasingly becomes one of the most essential factors in software development
Modern IDE
what we have now
Rich text editor
Call hierarchy in IDE
IDE problems
- Hidden semantic code connections.
- One method context only.
- Hard to answer reachability questions.
Objective - create a tool which:
- can speed up code dependency understanding,
- is capable of answering various reachability problems,
- is strictly connected to the source code,
- is integrated within developers' workflow,
- is broadly available.
Which abstract model can be used?
Abstract Syntax Tree
while b ≠ 0:
if a > b:
a := a - b
else:
b := b - a
return a
Code Property Graph
CFG + PDG + AST
Representing semantic code dependencies
class A()
object AFactory {
def createA() = {
new A()
}
}
Semantic Code Graph
G_{SCG}=(V_D, E_R)
- \(V_D\) a set of vertices representing all code declarations, e.g., classes, methods, variables;
- \({E_R\displaystyle \subseteq \{(x,y)\mid (x,y)\in V_D^{2}\; \}}\), a set of edges which are ordered pairs of nodes representing relations between nodes, e.g., call, declaration, override, inheritance, or return type.
- required properties: type, displayName, location
Semantic Code Graph - example
class A() {
def runA(): Unit = ...
def run(): Unit = ...
}
object AFactory {
def createA() = {
new A()
}
}
def main() = {
AFactory.createA().runA()
}
SCG output format
syntax = "proto3";
message Location {
string uri = 1;
int32 startLine = 2;
int32 startCharacter = 3;
int32 endLine = 4;
int32 endCharacter = 5;
}
message Edge {
string to = 1;
string type = 2;
Location location = 3;
map<string, string> properties = 4;
}
message GraphNode {
string id = 1;
string kind = 2;
Location location = 3;
map<string, string> properties = 4;
string displayName = 5;
repeated Edge edges = 6;
}
message SemanticGraphFile {
string uri = 1;
repeated GraphNode nodes = 2;
}
Graph Buddy - IDE plugins
https://plugins.jetbrains.com/plugin/13467-graph-buddy
https://marketplace.visualstudio.com/items?itemName=virtuslab.graph-buddy
Graph Buddy - IDE plugin
Providing interactive broad context
Call hierarchy
Find path
Presenting parts of the system
Thank you!
https://graphbuddy.virtuslab.com/
GB
By liosedhel
GB
- 376