/** * 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. */ package org.python.pydev.plugin.nature; import java.io.File; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; 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.python.pydev.core.ICodeCompletionASTManager; import org.python.pydev.core.IInterpreterInfo; import org.python.pydev.core.IInterpreterManager; import org.python.pydev.core.IModule; import org.python.pydev.core.IPythonNature; import org.python.pydev.core.IPythonPathNature; import org.python.pydev.core.IToken; import org.python.pydev.core.MisconfigurationException; import org.python.pydev.core.PropertiesHelper; import org.python.pydev.core.PythonNatureWithoutProjectException; import org.python.pydev.editor.codecompletion.revisited.SystemASTManager; /** * This nature is used only as a 'last resort', if we're unable to link a given resource to * a project (and thus, we don't have project-related completions and we don't know with what * exactly we're dealing with: it's usually only used for external files) */ public class SystemPythonNature extends AbstractPythonNature implements IPythonNature { /** * @author Fabio * */ private final class SystemPythonPathNature implements IPythonPathNature { public void setVariableSubstitution(Map<String, String> variableSubstitution) throws CoreException { throw new RuntimeException("Not implemented"); } public void setProjectSourcePath(String newSourcePath) throws CoreException { throw new RuntimeException("Not implemented"); } public void setProjectExternalSourcePath(String newExternalSourcePath) throws CoreException { throw new RuntimeException("Not implemented"); } public void setProject(IProject project, IPythonNature nature) { throw new RuntimeException("Not implemented"); } public Map<String, String> getVariableSubstitution(boolean addInterpreterInfoSubstitutions) throws CoreException, MisconfigurationException, PythonNatureWithoutProjectException { return getVariableSubstitution(); } public Map<String, String> getVariableSubstitution() throws CoreException, MisconfigurationException, PythonNatureWithoutProjectException { Properties stringSubstitutionVariables = SystemPythonNature.this.info.getStringSubstitutionVariables(); Map<String, String> variableSubstitution; if (stringSubstitutionVariables == null) { variableSubstitution = new HashMap<String, String>(); } else { variableSubstitution = PropertiesHelper.createMapFromProperties(stringSubstitutionVariables); } return variableSubstitution; } public Set<String> getProjectSourcePathSet(boolean replaceVariables) throws CoreException { throw new RuntimeException("Not implemented"); } public String getProjectSourcePath(boolean replaceVariables) throws CoreException { throw new RuntimeException("Not implemented"); } public List<String> getProjectExternalSourcePathAsList(boolean replaceVariables) throws CoreException { throw new RuntimeException("Not implemented"); } public String getProjectExternalSourcePath(boolean replaceVariables) throws CoreException { throw new RuntimeException("Not implemented"); } public String getOnlyProjectPythonPathStr(boolean addExternal) throws CoreException { throw new RuntimeException("Not implemented"); } public IPythonNature getNature() { return SystemPythonNature.this; } public List<String> getCompleteProjectPythonPath(IInterpreterInfo interpreter, IInterpreterManager info) { return interpreter.getPythonPath(); } public void clearCaches() { //No caches anyways } } private final IInterpreterManager manager; public final IInterpreterInfo info; private SystemASTManager systemASTManager; public SystemPythonNature(IInterpreterManager manager) throws MisconfigurationException { this(manager, manager.getDefaultInterpreterInfo(false)); } public SystemPythonNature(IInterpreterManager manager, IInterpreterInfo info) { this.info = info; this.manager = manager; } public boolean isResourceInPythonpathProjectSources(IResource resource, boolean addExternal) throws MisconfigurationException { return super.isResourceInPythonpath(resource); //no source folders in the system nature (just treat it as default) } public boolean isResourceInPythonpathProjectSources(String resource, boolean addExternal) throws MisconfigurationException { return super.isResourceInPythonpath(resource); //no source folders in the system nature (just treat it as default) } public String resolveModuleOnlyInProjectSources(IResource fileAbsolutePath, boolean addExternal) throws CoreException, MisconfigurationException { return super.resolveModule(fileAbsolutePath); } public String resolveModuleOnlyInProjectSources(String fileAbsolutePath, boolean addExternal) throws CoreException, MisconfigurationException { return super.resolveModule(new File(fileAbsolutePath)); } public String getVersion() throws CoreException { if (this.info != null) { String version = this.info.getVersion(); if (version != null && version.startsWith("3")) { switch (this.manager.getInterpreterType()) { case IInterpreterManager.INTERPRETER_TYPE_PYTHON: return IPythonNature.PYTHON_VERSION_3_0; case IInterpreterManager.INTERPRETER_TYPE_JYTHON: return IPythonNature.JYTHON_VERSION_3_0; case IInterpreterManager.INTERPRETER_TYPE_IRONPYTHON: return IPythonNature.PYTHON_VERSION_3_0; default: throw new RuntimeException("Not python nor jython nor iron python?"); } } } switch (this.manager.getInterpreterType()) { case IInterpreterManager.INTERPRETER_TYPE_PYTHON: return IPythonNature.PYTHON_VERSION_LATEST; case IInterpreterManager.INTERPRETER_TYPE_JYTHON: return IPythonNature.JYTHON_VERSION_LATEST; case IInterpreterManager.INTERPRETER_TYPE_IRONPYTHON: return IPythonNature.PYTHON_VERSION_LATEST; default: throw new RuntimeException("Not python nor jython nor iron python?"); } } public String getDefaultVersion() { try { return getVersion(); } catch (CoreException e) { throw new RuntimeException(e); } } public void setVersion(String version, String interpreter) throws CoreException { throw new RuntimeException("Not Implemented: the system nature is read-only."); } public int getInterpreterType() throws CoreException { return this.manager.getInterpreterType(); } public File getCompletionsCacheDir() { throw new RuntimeException("Not Implemented"); } public void saveAstManager() { throw new RuntimeException("Not Implemented: system nature is only transient."); } public IPythonPathNature getPythonPathNature() { return new SystemPythonPathNature(); } public String resolveModule(String file) throws MisconfigurationException { if (info == null) { return null; } return info.getModulesManager().resolveModule(file); } public ICodeCompletionASTManager getAstManager() { if (systemASTManager == null) { systemASTManager = new SystemASTManager(this.manager, this, this.info); } return systemASTManager; } public void configure() throws CoreException { } public void deconfigure() throws CoreException { } public IProject getProject() { return null; } public void setProject(IProject project) { } public void rebuildPath() { throw new RuntimeException("Not Implemented"); } public void rebuildPath(String defaultSelectedInterpreter, IProgressMonitor monitor) { throw new RuntimeException("Not Implemented"); } public IInterpreterManager getRelatedInterpreterManager() { return manager; } //builtin completions public IToken[] getBuiltinCompletions() { if (!this.isOkToUse()) { return null; } return this.manager.getBuiltinCompletions(this.info.getName()); } public void clearBuiltinCompletions() { this.manager.clearBuiltinCompletions(this.info.getName()); } //builtin mod public IModule getBuiltinMod() { if (!this.isOkToUse()) { return null; } return this.manager.getBuiltinMod(this.info.getName()); } public void clearBuiltinMod() { this.manager.clearBuiltinMod(this.info.getName()); } public int getGrammarVersion() throws MisconfigurationException { IInterpreterInfo info = this.info; if (info != null) { return info.getGrammarVersion(); } else { return IPythonNature.LATEST_GRAMMAR_VERSION; } } public IInterpreterInfo getProjectInterpreter() throws MisconfigurationException { return this.info; } public boolean isOkToUse() { return this.manager != null && this.info != null; } }