[Pydev-cvs] org.python.pydev/src/org/python/pydev/editor/codecompletion/revisited ASTManagerIO.java,
Brought to you by:
fabioz
From: Fabio Z. <fa...@us...> - 2004-12-21 18:31:39
|
Update of /cvsroot/pydev/org.python.pydev/src/org/python/pydev/editor/codecompletion/revisited In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11727/src/org/python/pydev/editor/codecompletion/revisited Modified Files: SourceToken.java CompiledModule.java GlobalModelVisitor.java EmptyModule.java AbstractModule.java SourceModule.java ASTManager.java Added Files: ASTManagerIO.java HeuristicFindAttrs.java InnerModelVisitor.java AbstractVisitor.java Removed Files: ASTManagerFactory.java Log Message: Still on code completion... Index: SourceToken.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev/src/org/python/pydev/editor/codecompletion/revisited/SourceToken.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** SourceToken.java 22 Nov 2004 12:16:25 -0000 1.2 --- SourceToken.java 21 Dec 2004 18:31:14 -0000 1.3 *************** *** 7,10 **** --- 7,11 ---- import org.python.parser.SimpleNode; + import org.python.parser.ast.Attribute; import org.python.parser.ast.ClassDef; import org.python.parser.ast.FunctionDef; *************** *** 12,15 **** --- 13,17 ---- import org.python.parser.ast.ImportFrom; import org.python.parser.ast.Name; + import org.python.parser.ast.keywordType; import org.python.pydev.editor.codecompletion.PyCodeCompletion; *************** *** 44,47 **** --- 46,55 ---- }else if (ast instanceof Import || ast instanceof ImportFrom){ return PyCodeCompletion.TYPE_IMPORT; + + }else if (ast instanceof keywordType){ + return PyCodeCompletion.TYPE_ATTR; + + }else if (ast instanceof Attribute){ + return PyCodeCompletion.TYPE_ATTR; } Index: EmptyModule.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev/src/org/python/pydev/editor/codecompletion/revisited/EmptyModule.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** EmptyModule.java 20 Dec 2004 18:16:27 -0000 1.1 --- EmptyModule.java 21 Dec 2004 18:31:14 -0000 1.2 *************** *** 51,53 **** --- 51,60 ---- } + /** + * @see org.python.pydev.editor.codecompletion.revisited.AbstractModule#getGlobalTokens(java.lang.String) + */ + public IToken[] getGlobalTokens(String token) { + throw new RuntimeException("Not intended to be called"); + } + } --- NEW FILE: HeuristicFindAttrs.java --- /* * Created on Dec 21, 2004 * * @author Fabio Zadrozny */ package org.python.pydev.editor.codecompletion.revisited; import org.python.parser.SimpleNode; import org.python.parser.ast.Assign; import org.python.parser.ast.Attribute; import org.python.parser.ast.Call; import org.python.parser.ast.FunctionDef; import org.python.parser.ast.Name; /** * This class defines how we should find attributes. * * Heuristics provided allow someone to find an attr inside a function definition (IN_INIT or IN_ANY) * or inside a method call (e.g. a method called properties.create(x=0) - that's what I use, so, that's specific). * Other uses may be customized later, once we know which other uses are done. * * @author Fabio Zadrozny */ public class HeuristicFindAttrs extends AbstractVisitor { /** * @param where * @param how * @param methodCall */ public HeuristicFindAttrs(int where, int how, String methodCall) { this.where = where; this.how = how; this.methodCall = methodCall; } public static final int WHITIN_METHOD_CALL = 0; public static final int WHITIN_INIT = 1; public static final int WHITIN_ANY = 2; public int where = -1; public static final int IN_ASSIGN = 0; public static final int IN_KEYWORDS = 1; public int how = -1; private boolean entryPointCorrect = false; private boolean inAssing = false; /** * This is the method that can be used to declare them (e.g. properties.create) * It's only used it it is a method call. */ public String methodCall = ""; /** * @see org.python.parser.ast.VisitorBase#unhandled_node(org.python.parser.SimpleNode) */ protected Object unhandled_node(SimpleNode node) throws Exception { return null; } /** * @see org.python.parser.ast.VisitorBase#traverse(org.python.parser.SimpleNode) */ public void traverse(SimpleNode node) throws Exception { } //ENTRY POINTS /** * @see org.python.parser.ast.VisitorBase#visitCall(org.python.parser.ast.Call) */ public Object visitCall(Call node) throws Exception { if(entryPointCorrect == false && methodCall.length() > 0){ entryPointCorrect = true; String[] c = methodCall.split("\\."); if (node.func instanceof Attribute){ Attribute func = (Attribute)node.func; if(func.attr.equals(c[1])){ if(func.value instanceof Name){ Name name = (Name) func.value; if(name.id.equals(c[0])){ for (int i=0; i<node.keywords.length; i++){ addToken(node.keywords[i]); } } } } } entryPointCorrect = false; } return null; } /** * @see org.python.parser.ast.VisitorBase#visitFunctionDef(org.python.parser.ast.FunctionDef) */ public Object visitFunctionDef(FunctionDef node) throws Exception { if(entryPointCorrect == false){ entryPointCorrect = true; if(where == WHITIN_ANY){ node.traverse(this); } else if(where == WHITIN_INIT && node.name.equals("__init__")){ node.traverse(this); } entryPointCorrect = false; } return null; } //END ENTRY POINTS /** * */ private void checkEntryPoint() { if(entryPointCorrect == false) throw new RuntimeException("Invalid entry point. "); } /** * Name should be whithin assign. * * @see org.python.parser.ast.VisitorIF#visitAssign(org.python.parser.ast.Assign) */ public Object visitAssign(Assign node) throws Exception { checkEntryPoint(); if(how == IN_ASSIGN){ inAssing = true; node.traverse(this); inAssing = false; } return null; } /** * @see org.python.parser.ast.VisitorBase#visitAttribute(org.python.parser.ast.Attribute) */ public Object visitAttribute(Attribute node) throws Exception { if(how == IN_ASSIGN && inAssing){ if(node.value instanceof Name){ String id = ((Name)node.value).id; if(id != null && id.equals("self")){ addToken(node); } } } return null; } } Index: CompiledModule.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev/src/org/python/pydev/editor/codecompletion/revisited/CompiledModule.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** CompiledModule.java 22 Nov 2004 12:16:25 -0000 1.2 --- CompiledModule.java 21 Dec 2004 18:31:14 -0000 1.3 *************** *** 21,25 **** * These are the tokens the compiled module has. */ ! private IToken[] tokens = new IToken[0]; /** --- 21,25 ---- * These are the tokens the compiled module has. */ ! private CompiledToken[] tokens = new CompiledToken[0]; /** *************** *** 42,46 **** } ! tokens = (IToken[]) array.toArray(new IToken[0]); } catch (Exception e) { e.printStackTrace(); --- 42,46 ---- } ! tokens = (CompiledToken[]) array.toArray(new CompiledToken[0]); } catch (Exception e) { e.printStackTrace(); *************** *** 80,82 **** --- 80,89 ---- } + /** + * @see org.python.pydev.editor.codecompletion.revisited.AbstractModule#getGlobalTokens(java.lang.String) + */ + public IToken[] getGlobalTokens(String token) { + throw new RuntimeException("TODO: finish them!"); + } + } Index: AbstractModule.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev/src/org/python/pydev/editor/codecompletion/revisited/AbstractModule.java,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** AbstractModule.java 20 Dec 2004 18:16:27 -0000 1.5 --- AbstractModule.java 21 Dec 2004 18:31:14 -0000 1.6 *************** *** 21,25 **** --- 21,33 ---- public abstract class AbstractModule implements Serializable{ + /** + * @return tokens for the wild imports. + */ public abstract IToken[] getWildImportedModules(); + + /** + * @return tokens for the imports in the format from xxx import yyy + * or import xxx + */ public abstract IToken[] getTokenImportedModules(); *************** *** 31,38 **** */ public abstract IToken[] getGlobalTokens(); public abstract String getDocString(); - protected String name; protected AbstractModule(String name){ this.name = name; --- 39,70 ---- */ public abstract IToken[] getGlobalTokens(); + + /** + * This function should return all tokens that are global for a given token. + * E.g. if we have a class declared in the module, we return all tokens that are 'global' + * for the class (methods and attributes). + * + * @param token + * @return + */ + public abstract IToken[] getGlobalTokens(String token); + + /** + * + * @return the docstring for a module. + */ public abstract String getDocString(); + /** + * Name of the module + */ + protected String name; + + /** + * Constructor + * + * @param name - name of the module + */ protected AbstractModule(String name){ this.name = name; --- ASTManagerFactory.java DELETED --- --- NEW FILE: InnerModelVisitor.java --- /* * Created on Dec 21, 2004 * * @author Fabio Zadrozny */ package org.python.pydev.editor.codecompletion.revisited; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.python.parser.SimpleNode; import org.python.parser.ast.Call; import org.python.parser.ast.ClassDef; import org.python.parser.ast.FunctionDef; /** * This class is used to visit the inner context of class or a function. * * @author Fabio Zadrozny */ public class InnerModelVisitor extends AbstractVisitor { /** * List that contains heuristics to find attributes. */ private List attrsHeuristics = new ArrayList(); public InnerModelVisitor(){ attrsHeuristics.add(new HeuristicFindAttrs(HeuristicFindAttrs.WHITIN_METHOD_CALL, HeuristicFindAttrs.IN_KEYWORDS, "properties.create")); attrsHeuristics.add(new HeuristicFindAttrs(HeuristicFindAttrs.WHITIN_ANY , HeuristicFindAttrs.IN_ASSIGN , "")); } /** * This should be changed as soon as we know what should we visit. */ private static int VISITING_NOTHING = -1; /** * When visiting class, get attributes and methods */ private static int VISITING_CLASS = 0; /** * When visiting method, get parameters. */ private static int VISITING_METHOD = 1; /** * Initially, we're visiting nothing. */ private int visiting = VISITING_NOTHING; /** * @see org.python.parser.ast.VisitorBase#unhandled_node(org.python.parser.SimpleNode) */ protected Object unhandled_node(SimpleNode node) throws Exception { return null; } /** * @see org.python.parser.ast.VisitorBase#traverse(org.python.parser.SimpleNode) */ public void traverse(SimpleNode node) throws Exception { node.traverse(this); } public Object visitClassDef(ClassDef node) throws Exception { if(visiting == VISITING_NOTHING){ visiting = VISITING_CLASS; node.traverse(this); }else if(visiting == VISITING_CLASS){ //that's a class within the class we're visiting addToken(node); } return null; } public Object visitFunctionDef(FunctionDef node) throws Exception { if(visiting == VISITING_CLASS){ addToken(node); //iterate heuristics to find attributes for (Iterator iter = attrsHeuristics.iterator(); iter.hasNext();) { HeuristicFindAttrs element = (HeuristicFindAttrs) iter.next(); element.visitFunctionDef(node); addElementTokens(element); } } return null; } /** * @see org.python.parser.ast.VisitorBase#visitCall(org.python.parser.ast.Call) */ public Object visitCall(Call node) throws Exception { if(visiting == VISITING_CLASS){ //iterate heuristics to find attributes for (Iterator iter = attrsHeuristics.iterator(); iter.hasNext();) { HeuristicFindAttrs element = (HeuristicFindAttrs) iter.next(); element.visitCall(node); addElementTokens(element); } } return null; } /** * @param element */ private void addElementTokens(HeuristicFindAttrs element) { tokens.addAll(element.tokens); element.tokens.clear(); } } Index: ASTManager.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev/src/org/python/pydev/editor/codecompletion/revisited/ASTManager.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** ASTManager.java 20 Dec 2004 18:16:27 -0000 1.6 --- ASTManager.java 21 Dec 2004 18:31:14 -0000 1.7 *************** *** 7,16 **** import java.io.File; - import java.io.FileInputStream; - import java.io.FileNotFoundException; - import java.io.FileOutputStream; - import java.io.IOException; - import java.io.ObjectInputStream; - import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.ArrayList; --- 7,10 ---- *************** *** 77,193 **** /** - * @param dir: parent directory where file should be. - * @param name: name of the file. - * @return the file where the module with name "name" should be saved. - */ - private File getFilePath(File dir, String name) { - return new File(dir, name + ".pydevcompletions"); - - } - - /** - * @param dir: parent directory where file should be. - * @return the file where the python path helper should be saved. - */ - static File getPythonPathHelperFilePath(File dir) { - return new File(dir, "pathhelper" + ".pydevpathhelper"); - } - - - - - - - - //------------------------------- SAVE - - /** - * This saves an object representing a delta to a file. - * - * @param f - File to save the delta (the module should have the same name). - * @param obj tuple so that the first item is the name of the module and the second the module itself. - */ - private void saveDelta(File f, ModulesKey key) { - try { - FileOutputStream out = new FileOutputStream(f); - try { - ObjectOutputStream stream = null; - try { - stream = new ObjectOutputStream(out); - stream.writeObject(key); - stream.writeObject(modules.get(key)); - - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (stream != null) { - try { - stream.close(); - } catch (IOException e2) { - e2.printStackTrace(); - } - } - } - } finally { - try { - out.close(); - } catch (IOException e1) { - //that should be ok. - } - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - PydevPlugin.log(e); - } - } - - - /** - * @param monitor - * @param deltas - * @param c - * @return - */ - private void restoreDelta(IProgressMonitor monitor, File delta) { - - monitor.worked(1); - monitor.setTaskName(new StringBuffer("Restoring delta: ").append(delta).toString()); - - Object value = null; - File file = delta; - if (file.exists()) { - try { - FileInputStream in = new FileInputStream(file); - try { - - ObjectInputStream stream = null; - - try { - stream = new ObjectInputStream(in); - ModulesKey key = (ModulesKey) stream.readObject(); - value = stream.readObject(); - if (value != null) { - modules.put(key, value); - } - } finally { - if (stream != null) { - stream.close(); - } - } - - } finally { - in.close(); - } - } catch (Exception e) { - e.printStackTrace(); - PydevPlugin.log(e); - } - } - - } - - - - /** * @see org.python.pydev.editor.codecompletion.revisited.IASTManager#changePythonPath(java.lang.String, org.eclipse.core.resources.IProject, org.eclipse.core.runtime.IProgressMonitor) */ --- 71,74 ---- *************** *** 240,246 **** public void run() { try{ ! ASTManagerFactory.savePythonPath(getCompletionsCacheDir(project), new NullProgressMonitor(), m); }catch(Exception e){ //we're not in the eclipse enviroment } } --- 121,128 ---- public void run() { try{ ! ASTManagerIO.savePythonPath(getCompletionsCacheDir(project), new NullProgressMonitor(), m); }catch(Exception e){ //we're not in the eclipse enviroment + e.printStackTrace(); } } *************** *** 254,268 **** final String m = pythonPathHelper.resolveModule(f.getAbsolutePath()); if (m != null) { ! final AbstractModule s = AbstractModule.createModuleFromDoc(m, f, doc); ! modules.put(new ModulesKey(m, f), s); ! new Thread() { ! public void run() { ! File dir = ASTManager.getCompletionsCacheDir(project); ! String name = m; ! File f = new File(dir, name + ".pydevcompletions"); ! saveDelta(f, new ModulesKey(m,f) ); ! } ! }.start(); } } --- 136,151 ---- final String m = pythonPathHelper.resolveModule(f.getAbsolutePath()); if (m != null) { ! final AbstractModule value = AbstractModule.createModuleFromDoc(m, f, doc); ! final ModulesKey key = new ModulesKey(m, f); ! modules.put(key, value); ! // new Thread() { ! // public void run() { ! // File dir = ASTManager.getCompletionsCacheDir(project); ! // String name = m; ! // File f = new File(dir, name + ".pydevcompletions"); ! // ASTManagerIO.saveDelta(f, key, value ); ! // } ! // }.start(); } } *************** *** 495,502 **** if (module != null) { if (activationToken.length() == 0) { //in completion with nothing, just go for what is imported and global tokens. - IToken[] globalTokens = module.getGlobalTokens(); for (int i = 0; i < globalTokens.length; i++) { completions.add(globalTokens[i]); --- 378,389 ---- if (module != null) { + //get the tokens (global, imported and wild imported) + IToken[] globalTokens = module.getGlobalTokens(); + IToken[] importedModules = module.getTokenImportedModules(); + IToken[] wildImportedModules = module.getWildImportedModules(); + if (activationToken.length() == 0) { //in completion with nothing, just go for what is imported and global tokens. for (int i = 0; i < globalTokens.length; i++) { completions.add(globalTokens[i]); *************** *** 504,508 **** //now go for the token imports - IToken[] importedModules = module.getTokenImportedModules(); for (int i = 0; i < importedModules.length; i++) { completions.add(importedModules[i]); --- 391,394 ---- *************** *** 510,514 **** //wild imports: recursively go and get those completions. - IToken[] wildImportedModules = module.getWildImportedModules(); for (int i = 0; i < wildImportedModules.length; i++) { --- 396,399 ---- *************** *** 527,540 **** }else{ //ok, we have a token, find it and get its completions. ! IToken[] importedModules = module.getTokenImportedModules(); for (int i = 0; i < importedModules.length; i++) { if(importedModules[i].getRepresentation().equals(activationToken)){ String rep = importedModules[i].getCompletePath(); AbstractModule mod = getModule(rep); ! //the activation token corresponds to an imported module. We have to get its global tokens and return them. ! return getCompletionsForModule(rep, "", "", mod); } } } --- 412,451 ---- }else{ //ok, we have a token, find it and get its completions. ! ! //first check if the token is a module... if it is, get the completions for that module. ! //TODO: COMPLETION: when we get here, we might have the module or something importes ! //from a module, so, first we check if it is a module or module token. ! for (int i = 0; i < importedModules.length; i++) { if(importedModules[i].getRepresentation().equals(activationToken)){ + String tok = ""; String rep = importedModules[i].getCompletePath(); + AbstractModule mod = getModule(rep); ! int index; ! while(mod == null && (index = rep.lastIndexOf('.')) != -1){ ! tok = rep.substring(index+1) + tok; ! rep = rep.substring(0,index); ! mod = getModule(rep); ! } ! ! if(tok.length() == 0){ ! //the activation token corresponds to an imported module. We have to get its global tokens and return them. ! return getCompletionsForModule(rep, "", "", mod); ! }else{ ! return mod.getGlobalTokens(tok); ! } } } + + //it was not a module, so, try to get the completions for a global token defined. + IToken[] tokens = module.getGlobalTokens(activationToken); + if (tokens.length > 0){ + return tokens; + } + + + } --- NEW FILE: AbstractVisitor.java --- /* * Created on Dec 21, 2004 * * @author Fabio Zadrozny */ package org.python.pydev.editor.codecompletion.revisited; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import org.python.parser.SimpleNode; import org.python.parser.ast.Expr; import org.python.parser.ast.Str; import org.python.parser.ast.VisitorBase; import org.python.parser.ast.stmtType; import org.python.pydev.utils.REF; /** * @author Fabio Zadrozny */ public abstract class AbstractVisitor extends VisitorBase{ public static final int GLOBAL_TOKENS = 1; public static final int WILD_MODULES = 2; public static final int ALIAS_MODULES = 3; public static final int MODULE_DOCSTRING = 4; public static final int INNER_DEFS = 5; protected List tokens = new ArrayList(); /** * Module being visited. */ protected String moduleName; /** * @param node * @return */ protected String getRepresentationString(SimpleNode node) { if (REF.hasAttr(node, "name")) { return REF.getAttrObj(node, "name").toString(); }else if (REF.hasAttr(node, "id")) { return REF.getAttrObj(node, "id").toString(); }else if (REF.hasAttr(node, "attr")) { return REF.getAttrObj(node, "attr").toString(); }else if (REF.hasAttr(node, "arg")) { return REF.getAttrObj(node, "arg").toString(); } return null; } /** * @param node * @param t */ public static String getNodeDocString(SimpleNode node) { //and check if it has a docstring. if (REF.hasAttr(node, "body")) { Field field = REF.getAttr(node, "body"); try { Object obj = field.get(node); if (obj instanceof stmtType[]) { stmtType body[] = (stmtType[]) obj; if (body.length > 0) { if (body[0] instanceof Expr) { Expr e = (Expr) body[0]; if (e.value instanceof Str) { Str s = (Str) e.value; return s.s; } } } } } catch (Exception e) { e.printStackTrace(); } } return null; } /** * Adds a token with a docstring. * * @param node */ protected void addToken(SimpleNode node) { //add the token SourceToken t = new SourceToken(node, getRepresentationString(node), getNodeDocString(node), moduleName); this.tokens.add(t); } /** * This method transverses the ast and returns a list of found tokens. * * @param ast * @param which * @param name * @return * @throws Exception */ public static IToken[] getTokens(SimpleNode ast, int which, String moduleName) throws Exception { AbstractVisitor modelVisitor; if(which == INNER_DEFS){ modelVisitor = new InnerModelVisitor(); }else{ modelVisitor = new GlobalModelVisitor(which, moduleName); } ast.accept(modelVisitor); return (SourceToken[]) modelVisitor.tokens.toArray(new SourceToken[0]); } } Index: GlobalModelVisitor.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev/src/org/python/pydev/editor/codecompletion/revisited/GlobalModelVisitor.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** GlobalModelVisitor.java 20 Dec 2004 18:16:27 -0000 1.4 --- GlobalModelVisitor.java 21 Dec 2004 18:31:14 -0000 1.5 *************** *** 6,17 **** package org.python.pydev.editor.codecompletion.revisited; - import java.lang.reflect.Field; - import java.util.ArrayList; - import java.util.List; - import org.python.parser.SimpleNode; import org.python.parser.ast.Assign; import org.python.parser.ast.ClassDef; - import org.python.parser.ast.Expr; import org.python.parser.ast.FunctionDef; import org.python.parser.ast.Import; --- 6,12 ---- *************** *** 19,25 **** import org.python.parser.ast.Name; import org.python.parser.ast.Str; - import org.python.parser.ast.VisitorBase; - import org.python.parser.ast.stmtType; - import org.python.pydev.utils.REF; /** --- 14,17 ---- *************** *** 28,58 **** * @author Fabio Zadrozny */ ! public class GlobalModelVisitor extends VisitorBase { ! ! public static final int GLOBAL_TOKENS = 1; ! ! public static final int WILD_MODULES = 2; ! ! public static final int ALIAS_MODULES = 3; ! ! public static final int MODULE_DOCSTRING = 4; private int visitWhat; - private List tokens = new ArrayList(); - private SimpleNode initialAst; /** - * Module being visited. - */ - private String moduleName; - - - /** * @param moduleName * @param global_tokens2 */ ! private GlobalModelVisitor(int visitWhat, String moduleName) { this.visitWhat = visitWhat; this.moduleName = moduleName; --- 20,34 ---- * @author Fabio Zadrozny */ ! public class GlobalModelVisitor extends AbstractVisitor { private int visitWhat; private SimpleNode initialAst; /** * @param moduleName * @param global_tokens2 */ ! GlobalModelVisitor(int visitWhat, String moduleName) { this.visitWhat = visitWhat; this.moduleName = moduleName; *************** *** 68,128 **** } - /** - * @param node - * @return - */ - private String getRepresentationString(SimpleNode node) { - if (REF.hasAttr(node, "name")) { - return REF.getAttrObj(node, "name").toString(); - - }else if (REF.hasAttr(node, "id")) { - return REF.getAttrObj(node, "id").toString(); - } - return null; - } - - - /** - * @param node - * @param t - */ - public static String getNodeDocString(SimpleNode node) { - //and check if it has a docstring. - if (REF.hasAttr(node, "body")) { - - Field field = REF.getAttr(node, "body"); - try { - Object obj = field.get(node); - if (obj instanceof stmtType[]) { - stmtType body[] = (stmtType[]) obj; - if (body.length > 0) { - if (body[0] instanceof Expr) { - Expr e = (Expr) body[0]; - if (e.value instanceof Str) { - Str s = (Str) e.value; - return s.s; - } - } - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - return null; - } - - - /** - * Adds a token with a docstring. - * - * @param node - */ - private void addToken(SimpleNode node) { - //add the token - SourceToken t = new SourceToken(node, getRepresentationString(node), getNodeDocString(node), moduleName); - this.tokens.add(t); - } - public Object visitClassDef(ClassDef node) throws Exception { //when visiting the global namespace, we don't go into any inner scope. --- 44,47 ---- *************** *** 218,235 **** return null; } - - /** - * This method transverses the ast and returns a list of found tokens. - * - * @param ast - * @param which - * @param name - * @return - * @throws Exception - */ - public static IToken[] getTokens(SimpleNode ast, int which, String moduleName) throws Exception { - GlobalModelVisitor modelVisitor = new GlobalModelVisitor(which, moduleName); - ast.accept(modelVisitor); - return (IToken[]) modelVisitor.tokens.toArray(new IToken[0]); - } } \ No newline at end of file --- 137,139 ---- Index: SourceModule.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev/src/org/python/pydev/editor/codecompletion/revisited/SourceModule.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** SourceModule.java 22 Nov 2004 12:16:25 -0000 1.2 --- SourceModule.java 21 Dec 2004 18:31:14 -0000 1.3 *************** *** 103,105 **** --- 103,124 ---- } + /** + * @see org.python.pydev.editor.codecompletion.revisited.AbstractModule#getGlobalTokens(java.lang.String) + */ + public IToken[] getGlobalTokens(String token) { + SourceToken[] tokens = (SourceToken[]) getTokens(GlobalModelVisitor.GLOBAL_TOKENS); + for (int i = 0; i < tokens.length; i++) { + if(tokens[i].getRepresentation().equals(token)){ + ast = tokens[i].getAst(); + try { + //TODO: COMPLETION: get the completions for the whole hierarchy if this is a class!! + return GlobalModelVisitor.getTokens(ast, GlobalModelVisitor.INNER_DEFS, name); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + return new IToken[0]; + } + } \ No newline at end of file --- NEW FILE: ASTManagerIO.java --- /* * Created on Dec 20, 2004 * * @author Fabio Zadrozny */ package org.python.pydev.editor.codecompletion.revisited; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Iterator; import java.util.Set; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IProgressMonitor; import org.python.pydev.plugin.PydevPlugin; /** * @author Fabio Zadrozny */ public class ASTManagerIO { /** * @param monitor * @see other function. This is a wrapper that uses a file. * * @param file * @param monitor * @param string * @param job * @return */ public static IASTManager restoreASTManager(IProject p, String pythonpath, IProgressMonitor monitor) { File dir = ASTManager.getCompletionsCacheDir(p); ASTManager c = new ASTManager(); File file = ASTManagerIO.getPythonPathHelperFilePath(dir); if (file.exists()) { try { FileInputStream stream = new FileInputStream(file); try { ObjectInputStream in = new ObjectInputStream(stream); try { c.pythonPathHelper = (PythonPathHelper) in.readObject(); int size = in.readInt(); for (int i=0; i<size; i++) { //create all modules as empty modules. ModulesKey element = (ModulesKey) in.readObject(); c.modules.put(element, AbstractModule.createEmptyModule(element.name, element.file)); } } finally { in.close(); } } finally { stream.close(); } } catch (Exception e) { e.printStackTrace(); PydevPlugin.log(e); if (pythonpath != null){ c.changePythonPath(pythonpath, p, monitor); } } } return c; } /** * Save the pythonpath helper. * * @see other function. * * @param parentDir: directory where the files should be saved. * @param monitor */ static void savePythonPath(File parentDir, IProgressMonitor monitor, ASTManager ast) { try { int size = ast.modules.size()+1; monitor.worked(1); monitor.setTaskName("Saving python path to disk..."); if (monitor.isCanceled() == false) { File filePath = ASTManagerIO.getPythonPathHelperFilePath(parentDir); FileOutputStream out = new FileOutputStream(filePath); try { ObjectOutputStream stream = new ObjectOutputStream(out); try { stream.writeObject(ast.pythonPathHelper); Set s = ast.modules.keySet(); stream.writeInt(s.size()); for (Iterator iter = s.iterator(); iter.hasNext();) { Object element = (Object) iter.next(); stream.writeObject(element); } monitor.worked(1); monitor.setTaskName("Saved all"); } finally { stream.close(); } } finally { out.close(); } } } catch (IOException e) { e.printStackTrace(); PydevPlugin.log(e); } } /** * This saves an object representing a delta to a file. * * TODO: right now, deltas are not being saved. * * @param f - File to save the delta (the module should have the same name). * @param obj tuple so that the first item is the name of the module and the second the module itself. */ static void saveDelta(File f, ModulesKey key, Object value) { try { FileOutputStream out = new FileOutputStream(f); try { ObjectOutputStream stream = null; try { stream = new ObjectOutputStream(out); stream.writeObject(key); stream.writeObject(value); } catch (IOException e) { e.printStackTrace(); } finally { if (stream != null) { try { stream.close(); } catch (IOException e2) { e2.printStackTrace(); } } } } finally { try { out.close(); } catch (IOException e1) { //that should be ok. } } } catch (FileNotFoundException e) { e.printStackTrace(); PydevPlugin.log(e); } } /** * TODO: right now, deltas are not being saved. * * @param monitor * @param deltas * @param c * @return */ static void restoreDelta(IProgressMonitor monitor, File delta, ASTManager manager) { monitor.worked(1); monitor.setTaskName(new StringBuffer("Restoring delta: ").append(delta).toString()); Object value = null; File file = delta; if (file.exists()) { try { FileInputStream in = new FileInputStream(file); try { ObjectInputStream stream = null; try { stream = new ObjectInputStream(in); ModulesKey key = (ModulesKey) stream.readObject(); value = stream.readObject(); if (value != null) { manager.modules.put(key, value); } } finally { if (stream != null) { stream.close(); } } } finally { in.close(); } } catch (Exception e) { e.printStackTrace(); PydevPlugin.log(e); } } } /** * @param dir: parent directory where file should be. * @return the file where the python path helper should be saved. */ static File getPythonPathHelperFilePath(File dir) { return new File(dir, "pathhelper" + ".pydevpathhelper"); } /** * @param dir: parent directory where file should be. * @param name: name of the file. * @return the file where the module with name "name" should be saved. */ private static File getFilePath(File dir, String name) { return new File(dir, name + ".pydevcompletions"); } } |