package outputModules.neo4j;
import neo4j.batchInserter.Neo4JBatchInserter;
import org.neo4j.graphdb.DynamicRelationshipType;
import org.neo4j.graphdb.RelationshipType;
import outputModules.neo4j.importers.ASTNodeImporter;
import outputModules.neo4j.importers.ClassDefImporter;
import outputModules.neo4j.importers.DeclStmtImporter;
import outputModules.neo4j.importers.FunctionImporter;
import ast.ASTNode;
import ast.declarations.ClassDefStatement;
import ast.functionDef.FunctionDef;
import ast.statements.IdentifierDeclStatement;
import ast.walking.ASTNodeVisitor;
import databaseNodes.EdgeTypes;
// Stays alive during the lifetime of the program
public class Neo4JASTNodeVisitor extends ASTNodeVisitor
{
public void visit(FunctionDef node)
{
ASTNodeImporter importer = new FunctionImporter();
importNode(importer, node);
}
public void visit(ClassDefStatement node)
{
ASTNodeImporter importer = new ClassDefImporter();
long classNodeId = importNode(importer, node);
visitClassDefContent(node, classNodeId);
}
public void visit(IdentifierDeclStatement node)
{
ASTNodeImporter importer = new DeclStmtImporter();
importNode(importer, node);
}
private long importNode(ASTNodeImporter importer, ASTNode node)
{
importer.setCurrentFile(currentFileNode);
importer.addToDatabaseSafe(node);
long mainNodeId = importer.getMainNodeId();
addLinkToClassDef(mainNodeId);
importer = null;
return mainNodeId;
}
private void addLinkToClassDef(long dstNodeId)
{
if (contextStack.size() == 0)
return;
Long classId = contextStack.peek();
RelationshipType rel = DynamicRelationshipType
.withName(EdgeTypes.IS_CLASS_OF);
Neo4JBatchInserter.addRelationship(classId, dstNodeId, rel, null);
}
private void visitClassDefContent(ClassDefStatement node, long classNodeId)
{
// visit compound statement, it might contain
// functions, declarations or other class definitions
contextStack.push(classNodeId);
visit(node.content);
contextStack.pop();
}
}