/**
* Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package org.python.pydev.outline;
import java.util.ArrayList;
import org.eclipse.jface.viewers.StructuredSelection;
import org.python.pydev.editor.PyEdit;
import org.python.pydev.parser.jython.SimpleNode;
import org.python.pydev.parser.jython.ast.Attribute;
import org.python.pydev.parser.jython.ast.ClassDef;
import org.python.pydev.parser.jython.ast.FunctionDef;
import org.python.pydev.parser.jython.ast.Import;
import org.python.pydev.parser.jython.ast.ImportFrom;
import org.python.pydev.parser.jython.ast.aliasType;
import org.python.pydev.parser.visitors.scope.ASTEntryWithChildren;
import org.python.pydev.parser.visitors.scope.OutlineCreatorVisitor;
import org.python.pydev.shared_core.editor.IBaseEditor;
import org.python.pydev.shared_core.model.ErrorDescription;
import org.python.pydev.shared_core.model.ISimpleNode;
import org.python.pydev.shared_ui.outline.BaseModel;
import org.python.pydev.shared_ui.outline.IParsedItem;
/**
* ParsedModel represents a python file, parsed for OutlineView display
* It takes PyParser, and converts it into a tree of ParsedItems
*/
public class ParsedModel extends BaseModel {
/**
* @param outline - If not null, view to notify when parser changes
*/
public ParsedModel(IBaseEditor editor) {
super(editor);
}
@Override
protected IParsedItem createInitialRootFromEditor() {
ISimpleNode ast = ((PyEdit) editor).getAST();
return createParsedItemFromSimpleNode(ast);
}
@Override
protected IParsedItem createParsedItemFromSimpleNode(ISimpleNode ast) {
OutlineCreatorVisitor visitor = OutlineCreatorVisitor.create((SimpleNode) ast);
return new ParsedItem(visitor.getAll().toArray(new ASTEntryWithChildren[0]),
((PyEdit) ParsedModel.this.editor).getErrorDescription());
}
@Override
protected IParsedItem duplicateRootAddingError(ErrorDescription errorDesc) {
IParsedItem currRoot = getRoot();
IParsedItem newRoot;
if (currRoot != null) {
newRoot = new ParsedItem(((ParsedItem) currRoot).getAstChildrenEntries(), errorDesc);
newRoot.updateTo(currRoot);
} else {
newRoot = new ParsedItem(new ASTEntryWithChildren[0], errorDesc);
}
return newRoot;
}
@Override
public SimpleNode[] getSelectionPosition(StructuredSelection sel) {
if (sel.size() == 1) { // only sync the editing view if it is a single-selection
Object firstElement = sel.getFirstElement();
ASTEntryWithChildren p = ((ParsedItem) firstElement).getAstThis();
if (p == null) {
return null;
}
SimpleNode node = p.node;
if (node instanceof ClassDef) {
ClassDef def = (ClassDef) node;
node = def.name;
} else if (node instanceof Attribute) {
Attribute attribute = (Attribute) node;
node = attribute.attr;
} else if (node instanceof FunctionDef) {
FunctionDef def = (FunctionDef) node;
node = def.name;
} else if (node instanceof Import) {
ArrayList<SimpleNode> ret = new ArrayList<SimpleNode>();
Import importToken = (Import) node;
for (int i = 0; i < importToken.names.length; i++) {
aliasType aliasType = importToken.names[i];
//as ...
if (aliasType.asname != null) {
ret.add(aliasType.asname);
}
ret.add(aliasType.name);
}
return ret.toArray(new SimpleNode[0]);
} else if (node instanceof ImportFrom) {
ArrayList<SimpleNode> ret = new ArrayList<SimpleNode>();
ImportFrom importToken = (ImportFrom) node;
boolean found = false;
for (int i = 0; i < importToken.names.length; i++) {
found = true;
aliasType aliasType = importToken.names[i];
//as ...
if (aliasType.asname != null) {
ret.add(aliasType.asname);
}
ret.add(aliasType.name);
}
if (!found) {
ret.add(importToken.module);
}
return ret.toArray(new SimpleNode[0]);
}
return new SimpleNode[] { node };
}
return null;
}
}