Extraction Strategy: Dependencies and FQNs
Goal: Creation of DEPENDS_ON relations between the various concept nodes
Strategy:
- LCE: While traversing the AST register all referenced identifiers as dependencies (with source and target FQN) in a central data structure
- LCE: After finishing the traversal aggregate all detected dependencies and store them as concepts
- Note: as FQNs can’t always be resolved fully during the traversal, a resolution of them has to precede the dependency aggregation
- jQA Plugin: Create dependencies using the stored global FQNs
- jQA Plugin: Fill in all transitive dependencies via Cypher queries
Central Components:
LCEDependency
: concept that represents a direct dependency observed in the code- for transitive dependencies see
DependencyResolver
- for transitive dependencies see
DependencyResolutionProcessor
: processor that resolves FQN references and collects registered dependencies within the AST- executed on the root node of the AST of each source file
- registers Local Contexts that serve as indexes for registering declarations and dependencies within the module as well as schedule FQN resolutions at the end of the AST traversal
- provides static utility methods for the construction of FQNs and the interaction with the Local Contexts from above
IdentifierDependencyProcessor
: processor that registers dependencies for all referenced identifiers within the code that are not part of one of the other processed declaration constructsMemberExpressionDependencyProcessor
handles dependency registration specifically for member expressions (e.g.myObj.b
)
ScopeProcessor
/DeclarationScopeProcessor
: processors that register (un)named FQN scopes at all relevant points of the AST traversal to aid FQN constructionDependencyResolver
(Java): creates DEPENDS_ON relations for the extracted direct dependencies and fills in all transitive dependencies via Cypher queries- in a final step all DEPENDS_ON relations are aggregated