📄 projectmodulesmanager.java
字号:
/*
* Created on May 24, 2005
*
* @author Fabio Zadrozny
*/
package org.python.pydev.editor.codecompletion.revisited;
import java.io.File;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.python.pydev.core.DeltaSaver;
import org.python.pydev.core.ICallback;
import org.python.pydev.core.ICodeCompletionASTManager;
import org.python.pydev.core.IDeltaProcessor;
import org.python.pydev.core.IInterpreterManager;
import org.python.pydev.core.IModule;
import org.python.pydev.core.IModulesManager;
import org.python.pydev.core.IPythonNature;
import org.python.pydev.core.ISystemModulesManager;
import org.python.pydev.core.ModulesKey;
import org.python.pydev.core.REF;
import org.python.pydev.editor.codecompletion.revisited.modules.AbstractModule;
import org.python.pydev.editor.codecompletion.revisited.modules.EmptyModule;
import org.python.pydev.plugin.PydevPlugin;
import org.python.pydev.plugin.nature.PythonNature;
import org.python.pydev.ui.pythonpathconf.InterpreterInfo;
/**
* @author Fabio Zadrozny
*/
public class ProjectModulesManager extends ProjectModulesManagerBuild implements IDeltaProcessor<ModulesKey>{
private static final long serialVersionUID = 1L;
/**
* Determines whether we are testing it.
*/
public static boolean IN_TESTS = false;
private static final boolean DEBUG_MODULES = false;
//these attributes must be set whenever this class is restored.
private transient IProject project;
private transient IPythonNature nature;
/**
* Used to process deltas (in case we have the process killed for some reason)
*/
private transient DeltaSaver<ModulesKey> deltaSaver;
/**
* @see org.python.pydev.core.IProjectModulesManager#setProject(org.eclipse.core.resources.IProject, boolean)
*/
public void setProject(IProject project, boolean restoreDeltas){
this.project = project;
this.nature = PythonNature.getPythonNature(project);
this.deltaSaver = new DeltaSaver<ModulesKey>(this.nature.getCompletionsCacheDir(), "astdelta", new ICallback<Object, ObjectInputStream>(){
public ModulesKey call(ObjectInputStream arg) {
try {
return (ModulesKey) arg.readObject();
} catch (Exception e) {
throw new RuntimeException(e);
}
}});
if(!restoreDeltas){
deltaSaver.clearAll(); //remove any existing deltas
}else{
deltaSaver.processDeltas(this); //process the current deltas (clears current deltas automatically and saves it when the processing is concluded)
}
}
// ------------------------ delta processing
/**
* @see org.python.pydev.core.IProjectModulesManager#processUpdate(org.python.pydev.core.ModulesKey)
*/
public void processUpdate(ModulesKey data) {
//updates are ignored because we always start with 'empty modules' (so, we don't actually generate them -- updates are treated as inserts).
throw new RuntimeException("Not impl");
}
/**
* @see org.python.pydev.core.IProjectModulesManager#processDelete(org.python.pydev.core.ModulesKey)
*/
public void processDelete(ModulesKey key) {
super.doRemoveSingleModule(key);
}
/**
* @see org.python.pydev.core.IProjectModulesManager#processInsert(org.python.pydev.core.ModulesKey)
*/
public void processInsert(ModulesKey key) {
super.doAddSingleModule(key, new EmptyModule(key.name, key.file));
}
/**
* @see org.python.pydev.core.IProjectModulesManager#endProcessing()
*/
public void endProcessing() {
//save it with the updated info
nature.saveAstManager();
}
@Override
public void doRemoveSingleModule(ModulesKey key) {
super.doRemoveSingleModule(key);
if(deltaSaver != null || !IN_TESTS){ //we don't want deltas in tests
//overriden to add delta
deltaSaver.addDeleteCommand(key);
checkDeltaSize();
}
}
@Override
public void doAddSingleModule(ModulesKey key, AbstractModule n) {
super.doAddSingleModule(key, n);
if(deltaSaver != null || !IN_TESTS){ //we don't want deltas in tests
//overriden to add delta
deltaSaver.addInsertCommand(key);
checkDeltaSize();
}
}
/**
* If the delta size is big enough, save the current state and discard the deltas.
*/
private void checkDeltaSize() {
if(deltaSaver.availableDeltas() > MAXIMUN_NUMBER_OF_DELTAS){
nature.saveAstManager();
deltaSaver.clearAll();
}
}
// ------------------------ end delta processing
/**
* @see org.python.pydev.core.IProjectModulesManager#setPythonNature(org.python.pydev.core.IPythonNature)
*/
public void setPythonNature(IPythonNature nature){
this.nature = nature;
}
/**
* @see org.python.pydev.core.IProjectModulesManager#getNature()
*/
public IPythonNature getNature() {
return nature;
}
public SystemModulesManager getSystemModulesManager(){
return getSystemModulesManager(null);
}
/**
* @param defaultSelectedInterpreter
* @see org.python.pydev.core.IProjectModulesManager#getSystemModulesManager()
*/
public SystemModulesManager getSystemModulesManager(String defaultSelectedInterpreter){
if(nature == null){
PydevPlugin.log("Nature still not set");
return null; //still not set (initialization)
}
IInterpreterManager iMan = PydevPlugin.getInterpreterManager(nature);
if(defaultSelectedInterpreter == null){
defaultSelectedInterpreter = iMan.getDefaultInterpreter();
}
InterpreterInfo info = (InterpreterInfo) iMan.getInterpreterInfo(defaultSelectedInterpreter, new NullProgressMonitor());
if(info == null){
PydevPlugin.log("Info still not set");
return null; //may happen during initialization
}
return info.getModulesManager();
}
/**
* @see org.python.pydev.core.IProjectModulesManager#getAllModuleNames()
*/
public Set<String> getAllModuleNames() {
Set<String> s = new HashSet<String>();
ModulesManager[] managersInvolved = this.getManagersInvolved(true);
for (int i = 0; i < managersInvolved.length; i++) {
for (Object object : managersInvolved[i].modulesKeys.keySet()) {
ModulesKey m = (ModulesKey) object;
s.add(m.name);
}
}
return s;
}
/**
* @return all the modules that start with some token (from this manager and others involved)
*/
@Override
public SortedMap<ModulesKey, ModulesKey> getAllModulesStartingWith(String strStartingWith) {
SortedMap<ModulesKey, ModulesKey> ret = new TreeMap<ModulesKey, ModulesKey>();
ModulesManager[] managersInvolved = this.getManagersInvolved(true);
for (int i = 0; i < managersInvolved.length; i++) {
ret.putAll(managersInvolved[i].getAllDirectModulesStartingWith(strStartingWith));
}
return ret;
}
/**
* @see org.python.pydev.core.IProjectModulesManager#getModule(java.lang.String, org.python.pydev.plugin.nature.PythonNature, boolean)
*/
public IModule getModule(String name, IPythonNature nature, boolean dontSearchInit) {
return getModule(name, nature, true, dontSearchInit);
}
/**
* When looking for relative, we do not check dependencies
*/
public IModule getRelativeModule(String name, IPythonNature nature) {
return super.getModule(false, name, nature, true); //cannot be a compiled module
}
/**
* @see org.python.pydev.core.IProjectModulesManager#getModule(java.lang.String, org.python.pydev.plugin.nature.PythonNature, boolean, boolean)
*/
public IModule getModule(String name, IPythonNature nature, boolean checkSystemManager, boolean dontSearchInit) {
IModule module = null;
ModulesManager[] managersInvolved = this.getManagersInvolved(true); //only get the system manager here (to avoid recursion)
for (ModulesManager m : managersInvolved) {
module = m.getBuiltinModule(name, nature, dontSearchInit);
if(module != null){
if(DEBUG_MODULES){
System.out.println("Trying to get:"+name+" - "+" returned builtin:"+module+" - "+m.getClass());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -