forked from qt-creator/qt-creator
Python: ensure opened file is inside a workspace
The Python language server seems to dislike files that are not part of a workspace resulting in very long lookup times for specific symbols. Fixes: QTCREATORBUG-26230 Fixes: QTCREATORBUG-24704 Fixes: QTCREATORBUG-24140 Change-Id: Iceb7a2b3d57aea6554225a74587f619e530e10c9 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -143,7 +143,7 @@ public:
|
||||
bool isSupportedDocument(const TextEditor::TextDocument *document) const;
|
||||
bool isSupportedFile(const Utils::FilePath &filePath, const QString &mimeType) const;
|
||||
bool isSupportedUri(const LanguageServerProtocol::DocumentUri &uri) const;
|
||||
void openDocument(TextEditor::TextDocument *document);
|
||||
virtual void openDocument(TextEditor::TextDocument *document);
|
||||
void closeDocument(TextEditor::TextDocument *document);
|
||||
void activateDocument(TextEditor::TextDocument *document);
|
||||
void deactivateDocument(TextEditor::TextDocument *document);
|
||||
|
@@ -27,18 +27,18 @@
|
||||
|
||||
#include "pythonconstants.h"
|
||||
#include "pythonplugin.h"
|
||||
#include "pythonproject.h"
|
||||
#include "pythonsettings.h"
|
||||
#include "pythonutils.h"
|
||||
|
||||
#include <coreplugin/editormanager/editormanager.h>
|
||||
#include <coreplugin/icore.h>
|
||||
#include <coreplugin/progressmanager/progressmanager.h>
|
||||
|
||||
#include <languageclient/languageclientmanager.h>
|
||||
|
||||
#include <languageserverprotocol/workspace.h>
|
||||
#include <projectexplorer/session.h>
|
||||
#include <texteditor/textdocument.h>
|
||||
#include <texteditor/texteditor.h>
|
||||
|
||||
#include <utils/infobar.h>
|
||||
#include <utils/qtcprocess.h>
|
||||
#include <utils/runextensions.h>
|
||||
@@ -471,9 +471,50 @@ void PyLSSettings::setInterpreter(const QString &interpreterId)
|
||||
m_executable = interpreter.command;
|
||||
}
|
||||
|
||||
static PythonProject *projectForFile(const FilePath &pythonFile)
|
||||
{
|
||||
for (ProjectExplorer::Project *project : ProjectExplorer::SessionManager::projects()) {
|
||||
if (auto pythonProject = qobject_cast<PythonProject *>(project)) {
|
||||
if (pythonProject->isKnownFile(pythonFile))
|
||||
return pythonProject;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
class PyLSClient : public Client
|
||||
{
|
||||
public:
|
||||
using Client::Client;
|
||||
void openDocument(TextEditor::TextDocument *document) override
|
||||
{
|
||||
using namespace LanguageServerProtocol;
|
||||
if (reachable()) {
|
||||
const FilePath documentPath = document->filePath();
|
||||
if (isSupportedDocument(document) && !projectForFile(documentPath)) {
|
||||
const FilePath workspacePath = documentPath.parentDir();
|
||||
if (!extraWorkspaceDirs.contains(workspacePath)) {
|
||||
WorkspaceFoldersChangeEvent event;
|
||||
event.setAdded({WorkSpaceFolder(DocumentUri::fromFilePath(workspacePath),
|
||||
workspacePath.fileName())});
|
||||
DidChangeWorkspaceFoldersParams params;
|
||||
params.setEvent(event);
|
||||
DidChangeWorkspaceFoldersNotification change(params);
|
||||
sendContent(change);
|
||||
extraWorkspaceDirs.append(workspacePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
Client::openDocument(document);
|
||||
}
|
||||
|
||||
private:
|
||||
FilePaths extraWorkspaceDirs;
|
||||
};
|
||||
|
||||
Client *PyLSSettings::createClient(BaseClientInterface *interface) const
|
||||
{
|
||||
return new Client(interface);
|
||||
return new PyLSClient(interface);
|
||||
}
|
||||
|
||||
QJsonObject PyLSSettings::defaultConfiguration()
|
||||
|
Reference in New Issue
Block a user