Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion liteidex/src/plugins/dlvdebugger/dlvdebugger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -995,7 +995,7 @@ void DlvDebugger::headlessReadStdOutput()
m_process->setNativeArguments(argsList.join(" "));
m_process->start("\""+m_dlvFilePath+"\"");
#else
m_process->start(m_dlvFilePath + " " + argsList.join(" "));
m_process->start(m_dlvFilePath,argsList);
#endif
QString log = QString("%1 %2 [%3]").arg(m_dlvFilePath).arg(argsList.join(" ")).arg(m_process->workingDirectory());
emit debugLog(LiteApi::DebugRuntimeLog,log);
Expand Down
2 changes: 1 addition & 1 deletion liteidex/src/plugins/dlvdebugger/dlvrpcdebugger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1409,7 +1409,7 @@ void DlvRpcDebugger::headlessReadStdOutput()
m_process->setNativeArguments(argsList.join(" "));
m_process->start("\""+m_dlvFilePath+"\"");
#else
m_process->start(m_dlvFilePath + " " + argsList.join(" "));
m_process->start(m_dlvFilePath,argsList);
#endif
QString log = QString("%1 %2 [%3]").arg(m_dlvFilePath).arg(argsList.join(" ")).arg(m_process->workingDirectory());
emit debugLog(LiteApi::DebugRuntimeLog,log);
Expand Down
2 changes: 1 addition & 1 deletion liteidex/src/plugins/gdbdebugger/gdbdebugger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ bool GdbDebugger::start(const QString &program, const QString &arguments)
m_process->setNativeArguments(argsList.join(" "));
m_process->start("\""+m_gdbFilePath+"\"");
#else
m_process->start(m_gdbFilePath + " " + argsList.join(" "));
m_process->start(m_gdbFilePath,argsList);
#endif

QString log = QString("%1 %2 [%3]").arg(m_gdbFilePath).arg(argsList.join(" ")).arg(m_process->workingDirectory());
Expand Down
81 changes: 79 additions & 2 deletions liteidex/src/plugins/gopls/goplsplugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,18 @@
#include "fileutil/fileutil.h"

#include <QCoreApplication>
#include <QApplication>
#include <QAction>
#include <QFile>
#include <QInputDialog>
#include <QDir>
#include <QFileInfo>
#include <QHelpEvent>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonValue>
#include <QStandardItem>
#include <QPlainTextEdit>
#include <QTextBlock>
#include <QTextDocument>
#include <QUrl>
Expand Down Expand Up @@ -88,6 +91,26 @@ QStringList GoplsPlugin::dependPluginList() const
return QStringList() << "plugin/liteenv" << "plugin/golangast" << "plugin/litefind";
}

bool GoplsPlugin::eventFilter(QObject *object, QEvent *event)
{
LiteApi::IEditor *editor = m_hoverViewports.value(object);
if (!m_ready || !editor || event->type() != QEvent::ToolTip) {
return LiteApi::IPlugin::eventFilter(object,event);
}
if (QApplication::keyboardModifiers() & Qt::ControlModifier) {
return LiteApi::IPlugin::eventFilter(object,event);
}
QPlainTextEdit *plainTextEdit = LiteApi::getPlainTextEdit(editor);
if (!plainTextEdit) {
return LiteApi::IPlugin::eventFilter(object,event);
}
QHelpEvent *helpEvent = static_cast<QHelpEvent*>(event);
QTextCursor cursor = plainTextEdit->cursorForPosition(helpEvent->pos());
LiteApi::selectWordUnderCursor(cursor);
requestHover(editor,cursor,helpEvent->globalPos());
return true;
}

QString GoplsPlugin::workspaceRoot() const
{
LiteApi::IProject *project = m_liteApp->projectManager()->currentProject();
Expand Down Expand Up @@ -172,6 +195,7 @@ void GoplsPlugin::clientStopped()
m_completionPrefixes.clear();
m_completionRoots.clear();
m_pendingCompletions.clear();
m_pendingHovers.clear();
setLegacyCompletionEnabled(true);
}

Expand Down Expand Up @@ -211,6 +235,11 @@ void GoplsPlugin::editorCreated(LiteApi::IEditor *editor)
if (liteEditor) {
connect(liteEditor,SIGNAL(updateLink(QTextCursor,QPoint,bool)),this,SLOT(hoverRequested(QTextCursor,QPoint,bool)),Qt::UniqueConnection);
}
QPlainTextEdit *plainTextEdit = LiteApi::getPlainTextEdit(editor);
if (plainTextEdit && !m_hoverViewports.contains(plainTextEdit->viewport())) {
plainTextEdit->viewport()->installEventFilter(this);
m_hoverViewports.insert(plainTextEdit->viewport(),editor);
}
addEditorActions(editor);
if (m_ready) {
openDocument(editor);
Expand Down Expand Up @@ -316,6 +345,17 @@ void GoplsPlugin::editorAboutToClose(LiteApi::IEditor *editor)
m_completionEditors.remove(requestId);
m_completionPrefixes.remove(requestId);
m_completionRoots.remove(requestId);
int hoverId = m_pendingHovers.take(editor);
if (hoverId) {
m_client->notify("$/cancelRequest",QJsonObject{{"id",hoverId}});
m_hintEditors.remove(hoverId);
m_hintPositions.remove(hoverId);
}
QObject *viewport = m_hoverViewports.key(editor,0);
if (viewport) {
viewport->removeEventFilter(this);
m_hoverViewports.remove(viewport);
}
disconnect(editor,0,this,0);
}

Expand Down Expand Up @@ -492,6 +532,12 @@ void GoplsPlugin::handleHintResponse(int id, const QString &method, const QJsonV
{
LiteApi::IEditor *editor = m_hintEditors.take(id);
QPoint position = m_hintPositions.take(id);
if (method == "textDocument/hover") {
if (!editor || m_pendingHovers.value(editor) != id) {
return;
}
m_pendingHovers.remove(editor);
}
if (!editor || !error.isEmpty() || result.isNull()) {
return;
}
Expand Down Expand Up @@ -625,15 +671,26 @@ QString GoplsPlugin::markupText(const QJsonValue &value) const
}
if (value.isObject()) {
QJsonObject object = value.toObject();
return object.value("value").toString(object.value("language").toString());
QString text = object.value("value").toString();
if (object.value("kind").toString() == "markdown") {
#if QT_VERSION >= QT_VERSION_CHECK(5,14,0)
QTextDocument document;
document.setMarkdown(text);
text = document.toPlainText();
#else
text.replace(QRegExp("```[A-Za-z0-9_+.-]*\\n"),QString());
text.replace("```",QString());
#endif
}
return text.trimmed();
}
if (value.isArray()) {
QStringList parts;
foreach (QJsonValue part, value.toArray()) {
QString text = markupText(part);
if (!text.isEmpty()) parts.append(text);
}
return parts.join("\n");
return parts.join("\n\n");
}
return QString();
}
Expand All @@ -645,16 +702,36 @@ void GoplsPlugin::hoverRequested(const QTextCursor &cursor, const QPoint &positi
}
LiteApi::ILiteEditor *liteEditor = qobject_cast<LiteApi::ILiteEditor*>(sender());
LiteApi::IEditor *editor = liteEditor;
requestHover(editor,cursor,position);
}

void GoplsPlugin::requestHover(LiteApi::IEditor *editor, const QTextCursor &cursor,
const QPoint &position)
{
if (!isGoEditor(editor) || cursor.selectedText().trimmed().isEmpty()) {
int oldId = m_pendingHovers.take(editor);
if (oldId) {
m_client->notify("$/cancelRequest",QJsonObject{{"id",oldId}});
m_hintEditors.remove(oldId);
m_hintPositions.remove(oldId);
}
return;
}
QTextCursor requestCursor = cursor;
requestCursor.setPosition(cursor.selectionStart());
QJsonObject params{{"textDocument",QJsonObject{{"uri",documentUri(editor)}}},
{"position",QJsonObject{{"line",requestCursor.blockNumber()},{"character",requestCursor.positionInBlock()}}}};
changeDocument(editor);
int oldId = m_pendingHovers.value(editor,0);
if (oldId) {
m_client->notify("$/cancelRequest",QJsonObject{{"id",oldId}});
m_hintEditors.remove(oldId);
m_hintPositions.remove(oldId);
}
int id = m_client->request("textDocument/hover",params);
m_hintEditors.insert(id,editor);
m_hintPositions.insert(id,position);
m_pendingHovers.insert(editor,id);
}

void GoplsPlugin::requestSignatureHelp(LiteApi::IEditor *editor)
Expand Down
8 changes: 8 additions & 0 deletions liteidex/src/plugins/gopls/goplsplugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
class GoplsClient;
class GoplsSearchResults;
class QAction;
class QEvent;
namespace LiteApi { class ICompleter; }

class GoplsPlugin : public LiteApi::IPlugin
Expand All @@ -23,6 +24,9 @@ class GoplsPlugin : public LiteApi::IPlugin
virtual bool load(LiteApi::IApplication *app);
virtual QStringList dependPluginList() const;

protected:
bool eventFilter(QObject *object, QEvent *event);

private slots:
void appLoaded();
void clientInitialized();
Expand Down Expand Up @@ -64,6 +68,8 @@ private slots:
void requestLocations(const QString &method);
void addEditorActions(LiteApi::IEditor *editor);
void requestSignatureHelp(LiteApi::IEditor *editor);
void requestHover(LiteApi::IEditor *editor, const QTextCursor &cursor,
const QPoint &position);
QString markupText(const QJsonValue &value) const;
void applyWorkspaceEdit(const QJsonObject &workspaceEdit);
void applyTextEdits(const QString &uri, QJsonArray edits);
Expand All @@ -86,6 +92,8 @@ private slots:
QAction *m_implementationAction;
QHash<int,LiteApi::IEditor*> m_hintEditors;
QHash<int,QPoint> m_hintPositions;
QHash<LiteApi::IEditor*,int> m_pendingHovers;
QHash<QObject*,LiteApi::IEditor*> m_hoverViewports;
QAction *m_renameAction;
QAction *m_formatAction;
QAction *m_organizeImportsAction;
Expand Down
6 changes: 2 additions & 4 deletions liteidex/src/plugins/terminal/terminal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -271,10 +271,9 @@ Terminal::Terminal(LiteApi::IApplication *app, QObject *parent) : LiteApi::ITerm
#ifdef Q_OS_MAC
static QMap<QString,QString> getProcessWorkDirList(const QStringList &pids)
{
QString cmd = QString("lsof -a -p %1 -d cwd -Fn").arg(pids.join(","));
QMap<QString,QString> kv;
QProcess p;
p.start(cmd);
p.start("lsof",QStringList() << "-a" << "-p" << pids.join(",") << "-d" << "cwd" << "-Fn");
if (!p.waitForStarted(1000)) {
return kv;
}
Expand Down Expand Up @@ -320,9 +319,8 @@ static QMap<QString,QString> getProcessWorkDirList(const QStringList &pids)
// pwdx 9194 9947
// 9194: /home/my
// 9947: /home/my
QString cmd = QString("pwdx %1").arg(pids.join(" "));
QProcess p;
p.start(cmd);
p.start("pwdx",pids);
if (!p.waitForStarted(1000)) {
return kv;
}
Expand Down
12 changes: 12 additions & 0 deletions liteidex/src/utils/processex/processex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,11 @@ void Process::stopAndWait(int termMs, int finishMs)

void Process::startEx(const QString &cmd, const QStringList &args)
{
#ifdef Q_OS_WIN
this->startEx(cmd,args.join(" "));
#else
this->start(cmd,args);
#endif
}

void Process::startEx(const QString &cmd, const QString &args)
Expand All @@ -198,13 +202,17 @@ void Process::startEx(const QString &cmd, const QString &args)
} else {
this->start(cmd);
}
#else
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
this->start(cmd,QProcess::splitCommand(args));
#else
if (cmd.contains(' ')) {
this->start("\""+cmd+"\" "+args);
} else {
this->start(cmd+" "+args);
}
#endif
#endif
}

bool Process::startDetachedExAndHide(const QString &cmd, const QStringList &args)
Expand Down Expand Up @@ -275,9 +283,13 @@ void LiteProcess::startEx(const QString &cmd, const QString &args)
this->setNativeArguments(args);
this->start(cmd);
}
#else
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
this->start(cmd,QProcess::splitCommand(args));
#else
this->start(cmd+" "+args);
#endif
#endif
}

#ifdef Q_OS_WIN
Expand Down
Loading