/** * Copyright (c) 2005-2011 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. */ /* * Created on Nov 18, 2004 * * @author Fabio Zadrozny */ package org.python.pydev.editor.codecompletion.revisited; import org.eclipse.swt.graphics.Image; import org.python.pydev.core.FullRepIterable; import org.python.pydev.core.IToken; import org.python.pydev.editor.codecompletion.PyCodeCompletionImages; import org.python.pydev.editor.codecompletion.revisited.modules.SourceToken; import org.python.pydev.parser.jython.SimpleNode; import org.python.pydev.parser.jython.ast.ClassDef; import com.aptana.shared_core.string.FastStringBuffer; /** * @author Fabio Zadrozny */ public abstract class AbstractToken implements IToken { protected String rep; protected String originalRep; protected String doc; protected String args; protected String parentPackage; public int type; private boolean originalHasRep; public AbstractToken(String rep, String doc, String args, String parentPackage, int type, String originalRep, boolean originalHasRep) { this(rep, doc, args, parentPackage, type); this.originalRep = originalRep; this.originalHasRep = originalHasRep; } public AbstractToken(String rep, String doc, String args, String parentPackage, int type) { if (rep != null) this.rep = rep; else this.rep = ""; if (args != null) this.args = args; else this.args = ""; this.originalRep = this.rep; if (doc != null) this.doc = doc; else this.doc = ""; if (parentPackage != null) this.parentPackage = parentPackage; else this.parentPackage = ""; this.type = type; } /** * @see org.python.pydev.core.IToken#getArgs() */ public String getArgs() { return args; } /** * @see org.python.pydev.core.IToken#setArgs(java.lang.String) */ public void setArgs(String args) { this.args = args; } /** * @see org.python.pydev.editor.javacodecompletion.IToken#getRepresentation() */ public String getRepresentation() { return rep; } /** * @see org.python.pydev.core.IToken#setDocStr(java.lang.String) */ public void setDocStr(String docStr) { this.doc = docStr; } /** * @see org.python.pydev.editor.javacodecompletion.IToken#getDocStr() */ public String getDocStr() { return doc; } /** * @see org.python.pydev.core.IToken#getParentPackage() */ public String getParentPackage() { return parentPackage; } /** * @see org.python.pydev.core.IToken#getType() */ public int getType() { return type; } public Image getImage() { return PyCodeCompletionImages.getImageForType(type); } /** * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object obj) { if (!(obj instanceof AbstractToken)) { return false; } AbstractToken c = (AbstractToken) obj; if (c.getRepresentation().equals(getRepresentation()) == false) { return false; } if (c.getParentPackage().equals(getParentPackage()) == false) { return false; } if (c.getType() != getType()) { return false; } return true; } /** * @see java.lang.Object#hashCode() */ public int hashCode() { return getRepresentation().hashCode() * getType(); } /** * @see java.lang.Comparable#compareTo(java.lang.Object) */ public int compareTo(Object o) { AbstractToken comp = (AbstractToken) o; int thisT = getType(); int otherT = comp.getType(); if (thisT != otherT) { if (thisT == IToken.TYPE_PARAM || thisT == IToken.TYPE_LOCAL || thisT == IToken.TYPE_OBJECT_FOUND_INTERFACE) return -1; if (otherT == IToken.TYPE_PARAM || otherT == IToken.TYPE_LOCAL || otherT == IToken.TYPE_OBJECT_FOUND_INTERFACE) return 1; if (thisT == IToken.TYPE_IMPORT) return -1; if (otherT == IToken.TYPE_IMPORT) return 1; } int c = getRepresentation().compareTo(comp.getRepresentation()); if (c != 0) return c; c = getParentPackage().compareTo(comp.getParentPackage()); if (c != 0) return c; return c; } /** * @see java.lang.Object#toString() */ public String toString() { if (getParentPackage() != null && getParentPackage().length() > 0) { return new FastStringBuffer(getRepresentation(), 64).append(" - ").append(getParentPackage()).toString(); } else { return getRepresentation(); } } /** * @see org.python.pydev.core.IToken#getOriginalRep(boolean) */ private String getOriginalRep(boolean decorateWithModule) { if (!decorateWithModule) { return originalRep; } String p = getParentPackage(); if (p != null && p.length() > 0) { return p + "." + originalRep; } return originalRep; } /** * Make our complete path relative to the base module. * * @see org.python.pydev.core.IToken#getAsRelativeImport(java.lang.String) */ public String getAsRelativeImport(String baseModule) { String completePath = getOriginalRep(true); return makeRelative(baseModule, completePath); } public String getAsAbsoluteImport() { return getAsRelativeImport("."); } /** * @param baseModule this is the 'parent package'. The path passed will be made relative to it * @param completePath this is the path that we want to make relative * @return the relative path. * * e.g.: if the baseModule is aa.xx and the completePath is aa.xx.foo.bar, this * funcion would return aa.foo.bar */ public static String makeRelative(String baseModule, String completePath) { if (baseModule == null) { return completePath; } if (completePath.startsWith(baseModule)) { String relative = completePath.substring(baseModule.length()); baseModule = FullRepIterable.headAndTail(baseModule)[0]; if (baseModule.length() == 0) { if (relative.length() > 0 && relative.charAt(0) == '.') { return relative.substring(1); } } if (relative.length() > 0 && relative.charAt(0) == '.') { return baseModule + relative; } else { return baseModule + '.' + relative; } } return completePath; } /** * @return the original representation (useful for imports) * e.g.: if it was import coilib.Exceptions as Exceptions, would return coilib.Exceptions */ public String getOriginalRep() { return originalRep; } /** * @return the original representation without the actual representation (useful for imports, because * we have to look within __init__ to check if the token is defined before trying to gather modules, if * we have a name clash). * * e.g.: if it was from coilib.test import Exceptions, it would return coilib.test * * @note: if the rep is not a part of the original representation, this function will return an empty string. */ public String getOriginalWithoutRep() { int i = originalRep.length() - rep.length() - 1; if (!originalHasRep) { return ""; } return i > 0 ? originalRep.substring(0, i) : ""; } public int getLineDefinition() { return UNDEFINED; } public int getColDefinition() { return UNDEFINED; } public boolean isImport() { return false; } public boolean isImportFrom() { return false; } public boolean isWildImport() { return false; } public boolean isString() { return false; } /** * This representation may not be accurate depending on which tokens we are dealing with. */ public int[] getLineColEnd() { return new int[] { UNDEFINED, UNDEFINED }; } public static boolean isClassDef(IToken element) { if (element instanceof SourceToken) { SourceToken token = (SourceToken) element; SimpleNode ast = token.getAst(); if (ast instanceof ClassDef) { return true; } } return false; } }