forked from qt-creator/qt-creator
LSP: Set client working directory to project directory
If the server settings specify that a server is to be started "per project". This fixes e.g. running the haskell-language-server Fixes: QTCREATORBUG-26115 Change-Id: If10af71d60786826a9218b4b98818df8d9710adf Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -166,9 +166,8 @@ Client *LanguageClientManager::startClient(BaseSettings *setting, ProjectExplore
|
|||||||
QTC_ASSERT(managerInstance, return nullptr);
|
QTC_ASSERT(managerInstance, return nullptr);
|
||||||
QTC_ASSERT(setting, return nullptr);
|
QTC_ASSERT(setting, return nullptr);
|
||||||
QTC_ASSERT(setting->isValid(), return nullptr);
|
QTC_ASSERT(setting->isValid(), return nullptr);
|
||||||
Client *client = setting->createClient();
|
Client *client = setting->createClient(project);
|
||||||
QTC_ASSERT(client, return nullptr);
|
QTC_ASSERT(client, return nullptr);
|
||||||
client->setCurrentProject(project);
|
|
||||||
client->start();
|
client->start();
|
||||||
managerInstance->m_clientsForSetting[setting->m_id].append(client);
|
managerInstance->m_clientsForSetting[setting->m_id].append(client);
|
||||||
return client;
|
return client;
|
||||||
|
@@ -557,16 +557,22 @@ bool BaseSettings::isValid() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
Client *BaseSettings::createClient()
|
Client *BaseSettings::createClient()
|
||||||
|
{
|
||||||
|
return createClient(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
Client *BaseSettings::createClient(ProjectExplorer::Project *project)
|
||||||
{
|
{
|
||||||
if (!isValid() || !m_enabled)
|
if (!isValid() || !m_enabled)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
BaseClientInterface *interface = createInterface();
|
BaseClientInterface *interface = createInterfaceWithProject(project);
|
||||||
QTC_ASSERT(interface, return nullptr);
|
QTC_ASSERT(interface, return nullptr);
|
||||||
auto *client = createClient(interface);
|
auto *client = createClient(interface);
|
||||||
client->setName(Utils::globalMacroExpander()->expand(m_name));
|
client->setName(Utils::globalMacroExpander()->expand(m_name));
|
||||||
client->setSupportedLanguage(m_languageFilter);
|
client->setSupportedLanguage(m_languageFilter);
|
||||||
client->setInitializationOptions(initializationOptions());
|
client->setInitializationOptions(initializationOptions());
|
||||||
client->setActivateDocumentAutomatically(true);
|
client->setActivateDocumentAutomatically(true);
|
||||||
|
client->setCurrentProject(project);
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -733,10 +739,12 @@ Utils::CommandLine StdIOSettings::command() const
|
|||||||
Utils::CommandLine::Raw);
|
Utils::CommandLine::Raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseClientInterface *StdIOSettings::createInterface() const
|
BaseClientInterface *StdIOSettings::createInterfaceWithProject(ProjectExplorer::Project *project) const
|
||||||
{
|
{
|
||||||
auto interface = new StdIOClientInterface;
|
auto interface = new StdIOClientInterface;
|
||||||
interface->setCommandLine(command());
|
interface->setCommandLine(command());
|
||||||
|
if (project)
|
||||||
|
interface->setWorkingDirectory(project->projectDirectory().toString());
|
||||||
return interface;
|
return interface;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -96,12 +96,18 @@ public:
|
|||||||
virtual BaseSettings *copy() const { return new BaseSettings(*this); }
|
virtual BaseSettings *copy() const { return new BaseSettings(*this); }
|
||||||
virtual bool isValid() const;
|
virtual bool isValid() const;
|
||||||
Client *createClient();
|
Client *createClient();
|
||||||
|
Client *createClient(ProjectExplorer::Project *project);
|
||||||
virtual QVariantMap toMap() const;
|
virtual QVariantMap toMap() const;
|
||||||
virtual void fromMap(const QVariantMap &map);
|
virtual void fromMap(const QVariantMap &map);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
// TODO: remove in Qt Creator 6 and rename createInterfaceWithProject back to it
|
||||||
virtual BaseClientInterface *createInterface() const { return nullptr; }
|
virtual BaseClientInterface *createInterface() const { return nullptr; }
|
||||||
virtual Client *createClient(BaseClientInterface *interface) const;
|
virtual Client *createClient(BaseClientInterface *interface) const;
|
||||||
|
virtual BaseClientInterface *createInterfaceWithProject(ProjectExplorer::Project *) const
|
||||||
|
{
|
||||||
|
return createInterface();
|
||||||
|
}
|
||||||
|
|
||||||
BaseSettings(const BaseSettings &other) = default;
|
BaseSettings(const BaseSettings &other) = default;
|
||||||
BaseSettings(BaseSettings &&other) = default;
|
BaseSettings(BaseSettings &&other) = default;
|
||||||
@@ -131,7 +137,7 @@ public:
|
|||||||
Utils::CommandLine command() const;
|
Utils::CommandLine command() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
BaseClientInterface *createInterface() const override;
|
BaseClientInterface *createInterfaceWithProject(ProjectExplorer::Project *project) const override;
|
||||||
|
|
||||||
StdIOSettings(const StdIOSettings &other) = default;
|
StdIOSettings(const StdIOSettings &other) = default;
|
||||||
StdIOSettings(StdIOSettings &&other) = default;
|
StdIOSettings(StdIOSettings &&other) = default;
|
||||||
|
Reference in New Issue
Block a user