use of org.python.pydev.parser.visitors.scope.DefinitionsASTIteratorVisitor in project Pydev by fabioz.
the class IOUtils method addAstInfo.
/**
* Adds ast info information for a module.
*
* @param m the module we want to add to the info
*/
public List<IInfo> addAstInfo(SimpleNode node, ModulesKey key, boolean generateDelta) {
List<IInfo> createdInfos = new ArrayList<IInfo>();
if (node == null || key.name == null) {
return createdInfos;
}
try {
Tuple<DefinitionsASTIteratorVisitor, Iterator<ASTEntry>> tup = getInnerEntriesForAST(node);
if (DebugSettings.DEBUG_ANALYSIS_REQUESTS) {
org.python.pydev.shared_core.log.ToLogFile.toLogFile(this, "Adding ast info to: " + key.name);
}
try {
Iterator<ASTEntry> entries = tup.o2;
FastStack<SimpleNode> tempStack = new FastStack<SimpleNode>(10);
synchronized (this.lock) {
synchronized (ObjectsInternPool.lock) {
final String file = key.file != null ? ObjectsInternPool.internUnsynched(key.file.toString()) : null;
key.name = ObjectsInternPool.internUnsynched(key.name);
while (entries.hasNext()) {
ASTEntry entry = entries.next();
IInfo infoCreated = null;
if (entry.parent == null) {
// we only want those that are in the global scope
if (entry.node instanceof ClassDef) {
// no intern construct (locked in this loop)
NameTok name = (NameTok) ((ClassDef) entry.node).name;
ClassInfo info = new ClassInfo(ObjectsInternPool.internUnsynched(name.id), key.name, null, false, getNature(), file, name.beginLine, name.beginColumn);
add(info, TOP_LEVEL);
infoCreated = info;
} else if (entry.node instanceof FunctionDef) {
// no intern construct (locked in this loop)
NameTok name = (NameTok) ((FunctionDef) entry.node).name;
FuncInfo info2 = new FuncInfo(ObjectsInternPool.internUnsynched(name.id), key.name, null, false, getNature(), file, name.beginLine, name.beginColumn);
add(info2, TOP_LEVEL);
infoCreated = info2;
} else {
// it is an assign
infoCreated = this.addAssignTargets(entry, key.name, TOP_LEVEL, null, false, file);
}
} else {
if (entry.node instanceof ClassDef || entry.node instanceof FunctionDef) {
// ok, it has a parent, so, let's check to see if the path we got only has class definitions
// as the parent (and get that path)
Tuple<String, Boolean> pathToRoot = this.getPathToRoot(entry, false, false, tempStack);
if (pathToRoot != null && pathToRoot.o1 != null && pathToRoot.o1.length() > 0) {
if (entry.node instanceof ClassDef) {
NameTok name = ((NameTok) ((ClassDef) entry.node).name);
ClassInfo info = new ClassInfo(ObjectsInternPool.internUnsynched(name.id), key.name, ObjectsInternPool.internUnsynched(pathToRoot.o1), false, getNature(), file, name.beginLine, name.beginColumn);
add(info, INNER);
infoCreated = info;
} else {
// FunctionDef
NameTok name = ((NameTok) ((FunctionDef) entry.node).name);
FuncInfo info2 = new FuncInfo(ObjectsInternPool.internUnsynched(name.id), key.name, ObjectsInternPool.internUnsynched(pathToRoot.o1), false, getNature(), file, name.beginLine, name.beginColumn);
add(info2, INNER);
infoCreated = info2;
}
}
} else {
// it is an assign
Tuple<String, Boolean> pathToRoot = this.getPathToRoot(entry, true, false, tempStack);
if (pathToRoot != null && pathToRoot.o1 != null && pathToRoot.o1.length() > 0) {
infoCreated = this.addAssignTargets(entry, key.name, INNER, pathToRoot.o1, pathToRoot.o2, file);
}
}
}
if (infoCreated != null) {
createdInfos.add(infoCreated);
}
}
// end while
}
// end lock ObjectsPool.lock
}
// end this.lock
} catch (Exception e) {
Log.log(e);
}
} catch (Exception e) {
Log.log(e);
}
return createdInfos;
}
use of org.python.pydev.parser.visitors.scope.DefinitionsASTIteratorVisitor in project Pydev by fabioz.
the class IOUtils method getInnerEntriesForAST.
/**
* @return an iterator that'll get the outline entries for the given ast.
*/
public static Tuple<DefinitionsASTIteratorVisitor, Iterator<ASTEntry>> getInnerEntriesForAST(SimpleNode node) throws Exception {
DefinitionsASTIteratorVisitor visitor = new DefinitionsASTIteratorVisitor();
node.accept(visitor);
Iterator<ASTEntry> entries = visitor.getOutline();
return new Tuple<DefinitionsASTIteratorVisitor, Iterator<ASTEntry>>(visitor, entries);
}
use of org.python.pydev.parser.visitors.scope.DefinitionsASTIteratorVisitor in project Pydev by fabioz.
the class PyOutlineSelectionDialog method calculateHierarchy.
@Override
protected void calculateHierarchy() {
if (root != null) {
return;
}
if (this.ast == null && pyEdit != null) {
this.ast = pyEdit.getAST();
}
if (ast == null) {
return;
}
DefinitionsASTIteratorVisitor visitor = DefinitionsASTIteratorVisitor.create(ast);
if (visitor == null) {
return;
}
Map<ASTEntry, DataAndImageTreeNode<Object>> entryToTreeNode = new HashMap<ASTEntry, DataAndImageTreeNode<Object>>();
// Step 1: create 'regular' tree structure from the nodes.
DataAndImageTreeNode<Object> root = new DataAndImageTreeNode<Object>(null, null, null);
for (Iterator<ASTEntry> it = visitor.getOutline(); it.hasNext(); ) {
ASTEntry next = it.next();
DataAndImageTreeNode<Object> n;
if (next.parent != null) {
DataAndImageTreeNode<Object> parent = entryToTreeNode.get(next.parent);
if (parent == null) {
Log.log("Unexpected condition: child found before parent!");
parent = root;
}
n = new DataAndImageTreeNode<Object>(parent, new OutlineEntry(next), null);
} else {
n = new DataAndImageTreeNode<Object>(root, new OutlineEntry(next), null);
}
if (((OutlineEntry) n.data).node.beginLine <= startLineIndex) {
initialSelection = n;
}
entryToTreeNode.put(next, n);
}
this.root = root;
}
use of org.python.pydev.parser.visitors.scope.DefinitionsASTIteratorVisitor in project Pydev by fabioz.
the class HierarchyViewer method onClick.
private void onClick(final HierarchyNodeModel model, int clickCount) {
if (clickCount == 2) {
if (model != null) {
IModule m = model.module;
if (m != null && model.ast != null) {
ItemPointer pointer = new ItemPointer(m.getFile(), model.ast.name);
new PyOpenAction().run(pointer);
}
}
} else {
Runnable r = new Runnable() {
@Override
public void run() {
synchronized (lock) {
if (treeMembers.getItemCount() > 0) {
treeMembers.removeAll();
}
if (model == null) {
return;
}
ClassDef ast = model.ast;
if (ast != null && treeMembers != null) {
DefinitionsASTIteratorVisitor visitor = DefinitionsASTIteratorVisitor.create(ast);
Iterator<ASTEntry> outline = visitor.getOutline();
HashMap<SimpleNode, TreeItem> c = new HashMap<SimpleNode, TreeItem>();
boolean first = true;
while (outline.hasNext()) {
ASTEntry entry = outline.next();
if (first) {
// Don't add the class itself.
first = false;
continue;
}
TreeItem item = null;
if (entry.node instanceof FunctionDef) {
item = createTreeItem(c, entry);
item.setImage(ImageCache.asImage(SharedUiPlugin.getImageCache().get(UIConstants.METHOD_ICON)));
if (model.module != null) {
item.setData(new ItemPointer(model.module.getFile(), ((FunctionDef) entry.node).name));
}
} else if (entry.node instanceof ClassDef) {
item = createTreeItem(c, entry);
item.setImage(ImageCache.asImage(SharedUiPlugin.getImageCache().get(UIConstants.CLASS_ICON)));
if (model.module != null) {
item.setData(new ItemPointer(model.module.getFile(), ((ClassDef) entry.node).name));
}
} else {
item = createTreeItem(c, entry);
item.setImage(ImageCache.asImage(SharedUiPlugin.getImageCache().get(UIConstants.PUBLIC_ATTR_ICON)));
if (model.module != null) {
item.setData(new ItemPointer(model.module.getFile(), entry.node));
}
}
item.setText(entry.getName());
item.setExpanded(true);
}
}
}
}
private TreeItem createTreeItem(HashMap<SimpleNode, TreeItem> c, ASTEntry entry) {
TreeItem parent = null;
ASTEntry par = entry.parent;
if (par != null) {
parent = c.get(par.node);
}
TreeItem item;
if (parent == null) {
item = new TreeItem(treeMembers, 0);
} else {
item = new TreeItem(parent, 0);
}
c.put(entry.node, item);
return item;
}
};
Display.getDefault().asyncExec(r);
}
}
use of org.python.pydev.parser.visitors.scope.DefinitionsASTIteratorVisitor in project Pydev by fabioz.
the class PyOutlineSelectionDialog method addMethods.
private void addMethods(DataAndImageTreeNode<Object> nextEntry, HierarchyNodeModel model) {
if (model == null || model.parents == null) {
return;
}
for (HierarchyNodeModel parent : model.parents) {
DefinitionsASTIteratorVisitor visitor = DefinitionsASTIteratorVisitor.createForChildren(parent.ast);
if (visitor == null) {
continue;
}
Iterator<ASTEntry> outline = visitor.getOutline();
while (outline.hasNext()) {
ASTEntry entry = outline.next();
if (entry.parent == null) {
// only direct children...
new DataAndImageTreeNode<Object>(nextEntry, new OutlineEntry(entry, parent), null);
}
}
addMethods(nextEntry, parent);
}
}
Aggregations