use of org.python.pydev.ast.codecompletion.revisited.modules.PredefinedSourceModule in project Pydev by fabioz.
the class SystemModulesManager method getBuiltinModule.
@Override
public AbstractModule getBuiltinModule(String name, boolean dontSearchInit, IModuleRequestState moduleRequest) {
AbstractModule n = null;
// check for supported builtins these don't have files associated.
// they are the first to be passed because the user can force a module to be builtin, because there
// is some information that is only useful when you have builtins, such as os and wxPython (those can
// be source modules, but they have so much runtime info that it is almost impossible to get useful information
// from statically analyzing them).
String[] builtins = getBuiltins();
if (builtins == null || this.info == null) {
// still on startup
return null;
}
// for temporary access (so that we don't generate many instances of it)
ModulesKey keyForCacheAccess = new ModulesKey(null, null);
// A different choice for users that want more complete information on the libraries they're dealing
// with is using predefined modules. Those will
File predefinedModule = this.info.getPredefinedModule(name, moduleRequest);
boolean found = predefinedModule != null && predefinedModule.exists();
if (!found && !name.endsWith(".__init__")) {
final String nameWithInit = name + ".__init__";
predefinedModule = this.info.getPredefinedModule(nameWithInit, moduleRequest);
found = predefinedModule != null && predefinedModule.exists();
if (found) {
name = nameWithInit;
}
}
if (found) {
keyForCacheAccess.name = name;
keyForCacheAccess.file = predefinedModule;
n = cachePredefined.getObj(keyForCacheAccess, this);
if ((n instanceof PredefinedSourceModule)) {
PredefinedSourceModule predefinedSourceModule = (PredefinedSourceModule) n;
if (predefinedSourceModule.isSynched()) {
return n;
}
// otherwise (not PredefinedSourceModule or not synched), just keep going to create
// it as a predefined source module
}
boolean tryToParse = true;
Long lastModified = null;
if (predefinedFilesNotParsedToTimestamp == null) {
predefinedFilesNotParsedToTimestamp = new HashMap<File, Long>();
} else {
Long lastTimeChanged = predefinedFilesNotParsedToTimestamp.get(predefinedModule);
if (lastTimeChanged != null) {
lastModified = FileUtils.lastModified(predefinedModule);
if (lastTimeChanged.equals(lastModified)) {
tryToParse = false;
} else {
predefinedFilesNotParsedToTimestamp.remove(predefinedModule);
}
}
}
if (tryToParse) {
IDocument doc;
try {
doc = FileUtilsFileBuffer.getDocFromFile(predefinedModule);
IGrammarVersionProvider provider = new IGrammarVersionProvider() {
@Override
public int getGrammarVersion() throws MisconfigurationException {
// Always Python 3.0 here
return IGrammarVersionProvider.LATEST_GRAMMAR_PY3_VERSION;
}
@Override
public AdditionalGrammarVersionsToCheck getAdditionalGrammarVersions() throws MisconfigurationException {
return null;
}
};
ParseOutput obj = PyParser.reparseDocument(new PyParser.ParserInfo(doc, provider, name, predefinedModule));
if (obj.error != null) {
if (lastModified == null) {
lastModified = FileUtils.lastModified(predefinedModule);
}
predefinedFilesNotParsedToTimestamp.put(predefinedModule, lastModified);
Log.log("Unable to parse: " + predefinedModule, obj.error);
} else if (obj.ast != null) {
SimpleNode ast = (SimpleNode) obj.ast;
if ("builtins".equals(name) || "__builtin__".equals(name)) {
// None/False/True must be added as they're not there by default.
if (ast instanceof Module) {
Module module = (Module) ast;
PyAstFactory astFactory = new PyAstFactory(new AdapterPrefs("\n", info.getModulesManager().getNature()));
module.body = ArrayUtils.concatArrays(module.body, new stmtType[] { astFactory.createAssign(astFactory.createStoreName("None"), astFactory.createNone()), astFactory.createAssign(astFactory.createStoreName("False"), astFactory.createFalse()), astFactory.createAssign(astFactory.createStoreName("True"), astFactory.createTrue()), astFactory.createAssign(astFactory.createStoreName("__builtins__"), astFactory.createName("Any")) });
}
}
n = new PredefinedSourceModule(name, predefinedModule, ast, obj.error);
cachePredefined.add(keyForCacheAccess, n, this);
// doAddSingleModule(keyForCacheAccess, n);
return n;
}
// keep on going
} catch (Throwable e) {
Log.log(e);
}
}
}
boolean foundStartingWithBuiltin = false;
FastStringBuffer buffer = null;
for (int i = 0; i < builtins.length; i++) {
String forcedBuiltin = builtins[i];
if (name.startsWith(forcedBuiltin)) {
if (name.length() > forcedBuiltin.length() && name.charAt(forcedBuiltin.length()) == '.') {
foundStartingWithBuiltin = true;
keyForCacheAccess.name = name;
n = cache.getObj(keyForCacheAccess, this);
if (n == null && dontSearchInit == false) {
if (buffer == null) {
buffer = new FastStringBuffer();
} else {
buffer.clear();
}
keyForCacheAccess.name = buffer.append(name).append(".__init__").toString();
n = cache.getObj(keyForCacheAccess, this);
}
if (n instanceof EmptyModule || n instanceof SourceModule) {
// it is actually found as a source module, so, we have to 'coerce' it to a compiled module
n = new CompiledModule(name, this, this.getNature());
doAddSingleModule(new ModulesKey(n.getName(), null), n);
return n;
}
}
if (name.equals(forcedBuiltin)) {
keyForCacheAccess.name = name;
n = cache.getObj(keyForCacheAccess, this);
if (n == null || n instanceof EmptyModule || n instanceof SourceModule) {
// still not created or not defined as compiled module (as it should be)
n = new CompiledModule(name, this, this.getNature());
doAddSingleModule(new ModulesKey(n.getName(), null), n);
return n;
}
}
if (n instanceof CompiledModule) {
return n;
}
}
}
if (foundStartingWithBuiltin) {
if (builtinsNotConsidered.getObj(name) != null) {
return null;
}
// ok, just add it if it is some module that actually exists
n = new CompiledModule(name, this, this.getNature());
TokensList globalTokens = n.getGlobalTokens();
// the module to see its return values (because that's slow)
if (globalTokens.size() > 0 && contains(globalTokens, "__file__")) {
doAddSingleModule(new ModulesKey(name, null), n);
return n;
} else {
builtinsNotConsidered.add(name, name);
return null;
}
}
return null;
}
Aggregations