QMakePM: Use generalized KeywordsCompletionProvider

Change-Id: Iaa6476be9285d814e4357b861c8fd00f1c9adc1c
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
David Schulz
2017-07-26 11:12:32 +02:00
parent c7abc41d97
commit 2c5186253f
5 changed files with 283 additions and 351 deletions

View File

@@ -24,330 +24,282 @@
****************************************************************************/ ****************************************************************************/
#include "profilecompletionassist.h" #include "profilecompletionassist.h"
#include "qmakeprojectmanagerconstants.h"
#include <texteditor/codeassist/assistinterface.h> #include "texteditor/codeassist/keywordscompletionassist.h"
#include <texteditor/codeassist/keywordscompletionassist.h>
#include <texteditor/texteditorconstants.h>
#include <coreplugin/id.h> const TextEditor::Keywords &QmakeProjectManager::Internal::qmakeKeywords()
using namespace QmakeProjectManager::Internal;
using namespace TextEditor;
static const char *const variableKeywords[] = {
"CCFLAG",
"CLEAN_DEPS",
"CONFIG",
"DEFINES",
"DEF_FILE",
"DEPENDPATH",
"DEPLOYMENT",
"DEPLOYMENT_PLUGIN",
"DESTDIR",
"DESTDIR_TARGET",
"DISTFILES",
"DLLDESTDIR",
"DSP_TEMPLATE",
"FORMS",
"FORMS3",
"GUID",
"HEADERS",
"ICON",
"INCLUDEPATH",
"INSTALLS",
"LEXIMPLS",
"LEXOBJECTS",
"LEXSOURCES",
"LIBS",
"LITERAL_HASH",
"MAKEFILE",
"MAKEFILE_GENERATOR",
"MOBILITY",
"MOC_DIR",
"OBJECTIVE_HEADERS",
"OBJECTIVE_SOURCES",
"OBJECTS",
"OBJECTS_DIR",
"OBJMOC",
"OTHER_FILES",
"OUT_PWD",
"PKGCONFIG",
"POST_TARGETDEPS",
"PRECOMPILED_HEADER",
"PRE_TARGETDEPS",
"PWD",
"QMAKE",
"QMAKESPEC",
"QMAKE_APP_FLAG",
"QMAKE_APP_OR_DLL",
"QMAKE_AR_CMD",
"QMAKE_BUNDLE_DATA",
"QMAKE_BUNDLE_EXTENSION",
"QMAKE_CC",
"QMAKE_CFLAGS",
"QMAKE_CFLAGS_DEBUG",
"QMAKE_CFLAGS_MT",
"QMAKE_CFLAGS_MT_DBG",
"QMAKE_CFLAGS_MT_DLL",
"QMAKE_CFLAGS_MT_DLLDBG",
"QMAKE_CFLAGS_RELEASE",
"QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO",
"QMAKE_CFLAGS_SHLIB",
"QMAKE_CFLAGS_THREAD",
"QMAKE_CFLAGS_WARN_OFF",
"QMAKE_CFLAGS_WARN_ON",
"QMAKE_CLEAN",
"QMAKE_CXX",
"QMAKE_CXXFLAGS",
"QMAKE_CXXFLAGS_DEBUG",
"QMAKE_CXXFLAGS_MT",
"QMAKE_CXXFLAGS_MT_DBG",
"QMAKE_CXXFLAGS_MT_DLL",
"QMAKE_CXXFLAGS_MT_DLLDBG",
"QMAKE_CXXFLAGS_RELEASE",
"QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO",
"QMAKE_CXXFLAGS_SHLIB",
"QMAKE_CXXFLAGS_THREAD",
"QMAKE_CXXFLAGS_WARN_OFF",
"QMAKE_CXXFLAGS_WARN_ON",
"QMAKE_DISTCLEAN",
"QMAKE_EXTENSION_SHLIB",
"QMAKE_EXTRA_COMPILERS",
"QMAKE_EXTRA_TARGETS",
"QMAKE_EXT_CPP",
"QMAKE_EXT_H",
"QMAKE_EXT_LEX",
"QMAKE_EXT_MOC",
"QMAKE_EXT_OBJ",
"QMAKE_EXT_PRL",
"QMAKE_EXT_UI",
"QMAKE_EXT_YACC",
"QMAKE_FAILED_REQUIREMENTS",
"QMAKE_FRAMEWORK_BUNDLE_NAME",
"QMAKE_FRAMEWORK_VERSION",
"QMAKE_INCDIR",
"QMAKE_INCDIR_EGL",
"QMAKE_INCDIR_OPENGL",
"QMAKE_INCDIR_OPENGL_ES1",
"QMAKE_INCDIR_OPENGL_ES2",
"QMAKE_INCDIR_OPENVG",
"QMAKE_INCDIR_QT",
"QMAKE_INCDIR_THREAD",
"QMAKE_INCDIR_X11",
"QMAKE_INFO_PLIST",
"QMAKE_LFLAGS",
"QMAKE_LFLAGS_CONSOLE",
"QMAKE_LFLAGS_CONSOLE_DLL",
"QMAKE_LFLAGS_DEBUG",
"QMAKE_LFLAGS_PLUGIN",
"QMAKE_LFLAGS_QT_DLL",
"QMAKE_LFLAGS_RELEASE",
"QMAKE_LFLAGS_RPATH",
"QMAKE_LFLAGS_SHAPP",
"QMAKE_LFLAGS_SHLIB",
"QMAKE_LFLAGS_SONAME",
"QMAKE_LFLAGS_THREAD",
"QMAKE_LFLAGS_WINDOWS",
"QMAKE_LFLAGS_WINDOWS_DLL",
"QMAKE_LIBDIR",
"QMAKE_LIBDIR_EGL",
"QMAKE_LIBDIR_FLAGS",
"QMAKE_LIBDIR_OPENGL",
"QMAKE_LIBDIR_OPENVG",
"QMAKE_LIBDIR_QT",
"QMAKE_LIBDIR_X11",
"QMAKE_LIBS",
"QMAKE_LIBS_CONSOLE",
"QMAKE_LIBS_EGL",
"QMAKE_LIBS_OPENGL",
"QMAKE_LIBS_OPENGL_ES1",
"QMAKE_LIBS_OPENGL_ES2",
"QMAKE_LIBS_OPENGL_QT",
"QMAKE_LIBS_OPENVG",
"QMAKE_LIBS_QT",
"QMAKE_LIBS_QT_DLL",
"QMAKE_LIBS_QT_OPENGL",
"QMAKE_LIBS_QT_THREAD",
"QMAKE_LIBS_RT",
"QMAKE_LIBS_RTMT",
"QMAKE_LIBS_THREAD",
"QMAKE_LIBS_WINDOWS",
"QMAKE_LIBS_X11",
"QMAKE_LIBS_X11SM",
"QMAKE_LIB_FLAG",
"QMAKE_LINK",
"QMAKE_LINK_SHLIB_CMD",
"QMAKE_LN_SHLIB",
"QMAKE_MACOSX_DEPLOYMENT_TARGET",
"QMAKE_MAC_SDK",
"QMAKE_MAKEFILE",
"QMAKE_MOC_SRC",
"QMAKE_POST_LINK",
"QMAKE_PRE_LINK",
"QMAKE_PROJECT_NAME",
"QMAKE_QMAKE",
"QMAKE_QT_DLL",
"QMAKE_RESOURCE_FLAGS",
"QMAKE_RPATH",
"QMAKE_RPATHDIR",
"QMAKE_RUN_CC",
"QMAKE_RUN_CC_IMP",
"QMAKE_RUN_CXX",
"QMAKE_RUN_CXX_IMP",
"QMAKE_TARGET",
"QMAKE_UIC",
"QT",
"QTPLUGIN",
"QT_MAJOR_VERSION",
"QT_MINOR_VERSION",
"QT_PATCH_VERSION",
"QT_VERSION",
"RCC_DIR",
"RC_FILE",
"REQUIRES",
"RESOURCES",
"RES_FILE",
"RSS_RULES",
"SIGNATURE_FILE",
"SOURCES",
"SRCMOC",
"STATECHARTS",
"SUBDIRS",
"TARGET",
"TEMPLATE",
"TRANSLATIONS",
"UICIMPLS",
"UICOBJECTS",
"UI_DIR",
"UI_HEADERS_DIR",
"UI_SOURCES_DIR",
"VERSION",
"VERSION_PE_HEADER",
"VER_MAJ",
"VER_MIN",
"VER_PAT",
"VPATH",
"YACCIMPLS",
"YACCOBJECTS",
"YACCSOURCES",
"_PRO_FILE_",
"_PRO_FILE_PWD_",
0
};
static const char *const functionKeywords[] = {
"CONFIG",
"absolute_path",
"basename",
"cache",
"cat",
"clean_path",
"clear",
"contains",
"count",
"debug",
"defined",
"dirname",
"enumerate_vars",
"equals",
"error",
"escape_expand",
"eval",
"exists",
"export",
"files",
"find",
"first",
"for",
"format_number",
"fromfile",
"getenv",
"greaterThan",
"if",
"include",
"infile",
"isActiveConfig",
"isEmpty",
"isEqual",
"join",
"last",
"lessThan",
"list",
"load",
"log",
"lower",
"member",
"message",
"mkpath",
"packagesExist",
"parseJson",
"prompt",
"quote",
"re_escape",
"relative_path",
"replace",
"requires",
"resolve_depends",
"reverse",
"section",
"shadowed",
"shell_path",
"shell_quote",
"size",
"sort_depends",
"split",
"sprintf",
"system",
"system_path",
"system_quote",
"title",
"touch",
"unique",
"unset",
"upper",
"val_escape",
"warning",
"write_file",
0
};
// -------------------------------
// ProFileCompletionAssistProvider
// -------------------------------
void ProFileCompletionAssistProvider::init()
{ {
for (uint i = 0; i < sizeof variableKeywords / sizeof variableKeywords[0] - 1; i++) static TextEditor::Keywords keywords(
m_variables.append(QLatin1String(variableKeywords[i])); QStringList{ // variables
for (uint i = 0; i < sizeof functionKeywords / sizeof functionKeywords[0] - 1; i++) "CCFLAG",
m_functions.append(QLatin1String(functionKeywords[i])); "CLEAN_DEPS",
} "CONFIG",
"DEFINES",
ProFileCompletionAssistProvider::~ProFileCompletionAssistProvider() "DEF_FILE",
{ "DEPENDPATH",
} "DEPLOYMENT",
"DEPLOYMENT_PLUGIN",
IAssistProcessor *ProFileCompletionAssistProvider::createProcessor() const "DESTDIR",
{ "DESTDIR_TARGET",
if (m_variables.isEmpty()) "DISTFILES",
const_cast<ProFileCompletionAssistProvider *>(this)->init(); "DLLDESTDIR",
TextEditor::Keywords keywords = TextEditor::Keywords(m_variables, m_functions, QMap<QString, QStringList>()); "DSP_TEMPLATE",
auto processor = new KeywordsCompletionAssistProcessor(keywords); "FORMS",
processor->setSnippetGroup(TextEditor::Constants::TEXT_SNIPPET_GROUP_ID); "FORMS3",
return processor; "GUID",
} "HEADERS",
"ICON",
QStringList ProFileCompletionAssistProvider::variables() const "INCLUDEPATH",
{ "INSTALLS",
if (m_variables.isEmpty()) "LEXIMPLS",
const_cast<ProFileCompletionAssistProvider *>(this)->init(); "LEXOBJECTS",
return m_variables; "LEXSOURCES",
} "LIBS",
"LITERAL_HASH",
QStringList ProFileCompletionAssistProvider::functions() const "MAKEFILE",
{ "MAKEFILE_GENERATOR",
if (m_functions.isEmpty()) "MOBILITY",
const_cast<ProFileCompletionAssistProvider *>(this)->init(); "MOC_DIR",
return m_functions; "OBJECTIVE_HEADERS",
"OBJECTIVE_SOURCES",
"OBJECTS",
"OBJECTS_DIR",
"OBJMOC",
"OTHER_FILES",
"OUT_PWD",
"PKGCONFIG",
"POST_TARGETDEPS",
"PRECOMPILED_HEADER",
"PRE_TARGETDEPS",
"PWD",
"QMAKE",
"QMAKESPEC",
"QMAKE_APP_FLAG",
"QMAKE_APP_OR_DLL",
"QMAKE_AR_CMD",
"QMAKE_BUNDLE_DATA",
"QMAKE_BUNDLE_EXTENSION",
"QMAKE_CC",
"QMAKE_CFLAGS",
"QMAKE_CFLAGS_DEBUG",
"QMAKE_CFLAGS_MT",
"QMAKE_CFLAGS_MT_DBG",
"QMAKE_CFLAGS_MT_DLL",
"QMAKE_CFLAGS_MT_DLLDBG",
"QMAKE_CFLAGS_RELEASE",
"QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO",
"QMAKE_CFLAGS_SHLIB",
"QMAKE_CFLAGS_THREAD",
"QMAKE_CFLAGS_WARN_OFF",
"QMAKE_CFLAGS_WARN_ON",
"QMAKE_CLEAN",
"QMAKE_CXX",
"QMAKE_CXXFLAGS",
"QMAKE_CXXFLAGS_DEBUG",
"QMAKE_CXXFLAGS_MT",
"QMAKE_CXXFLAGS_MT_DBG",
"QMAKE_CXXFLAGS_MT_DLL",
"QMAKE_CXXFLAGS_MT_DLLDBG",
"QMAKE_CXXFLAGS_RELEASE",
"QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO",
"QMAKE_CXXFLAGS_SHLIB",
"QMAKE_CXXFLAGS_THREAD",
"QMAKE_CXXFLAGS_WARN_OFF",
"QMAKE_CXXFLAGS_WARN_ON",
"QMAKE_DISTCLEAN",
"QMAKE_EXTENSION_SHLIB",
"QMAKE_EXTRA_COMPILERS",
"QMAKE_EXTRA_TARGETS",
"QMAKE_EXT_CPP",
"QMAKE_EXT_H",
"QMAKE_EXT_LEX",
"QMAKE_EXT_MOC",
"QMAKE_EXT_OBJ",
"QMAKE_EXT_PRL",
"QMAKE_EXT_UI",
"QMAKE_EXT_YACC",
"QMAKE_FAILED_REQUIREMENTS",
"QMAKE_FRAMEWORK_BUNDLE_NAME",
"QMAKE_FRAMEWORK_VERSION",
"QMAKE_INCDIR",
"QMAKE_INCDIR_EGL",
"QMAKE_INCDIR_OPENGL",
"QMAKE_INCDIR_OPENGL_ES1",
"QMAKE_INCDIR_OPENGL_ES2",
"QMAKE_INCDIR_OPENVG",
"QMAKE_INCDIR_QT",
"QMAKE_INCDIR_THREAD",
"QMAKE_INCDIR_X11",
"QMAKE_INFO_PLIST",
"QMAKE_LFLAGS",
"QMAKE_LFLAGS_CONSOLE",
"QMAKE_LFLAGS_CONSOLE_DLL",
"QMAKE_LFLAGS_DEBUG",
"QMAKE_LFLAGS_PLUGIN",
"QMAKE_LFLAGS_QT_DLL",
"QMAKE_LFLAGS_RELEASE",
"QMAKE_LFLAGS_RPATH",
"QMAKE_LFLAGS_SHAPP",
"QMAKE_LFLAGS_SHLIB",
"QMAKE_LFLAGS_SONAME",
"QMAKE_LFLAGS_THREAD",
"QMAKE_LFLAGS_WINDOWS",
"QMAKE_LFLAGS_WINDOWS_DLL",
"QMAKE_LIBDIR",
"QMAKE_LIBDIR_EGL",
"QMAKE_LIBDIR_FLAGS",
"QMAKE_LIBDIR_OPENGL",
"QMAKE_LIBDIR_OPENVG",
"QMAKE_LIBDIR_QT",
"QMAKE_LIBDIR_X11",
"QMAKE_LIBS",
"QMAKE_LIBS_CONSOLE",
"QMAKE_LIBS_EGL",
"QMAKE_LIBS_OPENGL",
"QMAKE_LIBS_OPENGL_ES1",
"QMAKE_LIBS_OPENGL_ES2",
"QMAKE_LIBS_OPENGL_QT",
"QMAKE_LIBS_OPENVG",
"QMAKE_LIBS_QT",
"QMAKE_LIBS_QT_DLL",
"QMAKE_LIBS_QT_OPENGL",
"QMAKE_LIBS_QT_THREAD",
"QMAKE_LIBS_RT",
"QMAKE_LIBS_RTMT",
"QMAKE_LIBS_THREAD",
"QMAKE_LIBS_WINDOWS",
"QMAKE_LIBS_X11",
"QMAKE_LIBS_X11SM",
"QMAKE_LIB_FLAG",
"QMAKE_LINK",
"QMAKE_LINK_SHLIB_CMD",
"QMAKE_LN_SHLIB",
"QMAKE_MACOSX_DEPLOYMENT_TARGET",
"QMAKE_MAC_SDK",
"QMAKE_MAKEFILE",
"QMAKE_MOC_SRC",
"QMAKE_POST_LINK",
"QMAKE_PRE_LINK",
"QMAKE_PROJECT_NAME",
"QMAKE_QMAKE",
"QMAKE_QT_DLL",
"QMAKE_RESOURCE_FLAGS",
"QMAKE_RPATH",
"QMAKE_RPATHDIR",
"QMAKE_RUN_CC",
"QMAKE_RUN_CC_IMP",
"QMAKE_RUN_CXX",
"QMAKE_RUN_CXX_IMP",
"QMAKE_TARGET",
"QMAKE_UIC",
"QT",
"QTPLUGIN",
"QT_MAJOR_VERSION",
"QT_MINOR_VERSION",
"QT_PATCH_VERSION",
"QT_VERSION",
"RCC_DIR",
"RC_FILE",
"REQUIRES",
"RESOURCES",
"RES_FILE",
"RSS_RULES",
"SIGNATURE_FILE",
"SOURCES",
"SRCMOC",
"STATECHARTS",
"SUBDIRS",
"TARGET",
"TEMPLATE",
"TRANSLATIONS",
"UICIMPLS",
"UICOBJECTS",
"UI_DIR",
"UI_HEADERS_DIR",
"UI_SOURCES_DIR",
"VERSION",
"VERSION_PE_HEADER",
"VER_MAJ",
"VER_MIN",
"VER_PAT",
"VPATH",
"YACCIMPLS",
"YACCOBJECTS",
"YACCSOURCES",
"_PRO_FILE_",
"_PRO_FILE_PWD_"},
QStringList{ // functions
"CONFIG",
"absolute_path",
"basename",
"cache",
"cat",
"clean_path",
"clear",
"contains",
"count",
"debug",
"defined",
"dirname",
"enumerate_vars",
"equals",
"error",
"escape_expand",
"eval",
"exists",
"export",
"files",
"find",
"first",
"for",
"format_number",
"fromfile",
"getenv",
"greaterThan",
"if",
"include",
"infile",
"isActiveConfig",
"isEmpty",
"isEqual",
"join",
"last",
"lessThan",
"list",
"load",
"log",
"lower",
"member",
"message",
"mkpath",
"packagesExist",
"parseJson",
"prompt",
"quote",
"re_escape",
"relative_path",
"replace",
"requires",
"resolve_depends",
"reverse",
"section",
"shadowed",
"shell_path",
"shell_quote",
"size",
"sort_depends",
"split",
"sprintf",
"system",
"system_path",
"system_quote",
"title",
"touch",
"unique",
"unset",
"upper",
"val_escape",
"warning",
"write_file"});
return keywords;
} }

View File

@@ -25,29 +25,11 @@
#pragma once #pragma once
#include <texteditor/codeassist/completionassistprovider.h> namespace TextEditor { class Keywords; }
#include <QStringList>
namespace QmakeProjectManager { namespace QmakeProjectManager {
namespace Internal { namespace Internal {
class ProFileCompletionAssistProvider : public TextEditor::CompletionAssistProvider const TextEditor::Keywords &qmakeKeywords();
{
Q_OBJECT
public:
void init();
~ProFileCompletionAssistProvider();
TextEditor::IAssistProcessor *createProcessor() const override;
QStringList variables() const;
QStringList functions() const;
private:
QStringList m_variables;
QStringList m_functions;
};
} // namespace Internal } // namespace Internal
} // namespace QmakeProjectManager } // namespace QmakeProjectManager

View File

@@ -182,16 +182,14 @@ ProFileEditorFactory::ProFileEditorFactory()
setDocumentCreator(createProFileDocument); setDocumentCreator(createProFileDocument);
setEditorWidgetCreator([]() { return new ProFileEditorWidget; }); setEditorWidgetCreator([]() { return new ProFileEditorWidget; });
ProFileCompletionAssistProvider *pcap = new ProFileCompletionAssistProvider; setCompletionAssistProvider(new KeywordsCompletionAssistProvider(qmakeKeywords()));
setCompletionAssistProvider(pcap);
setCommentDefinition(Utils::CommentDefinition::HashStyle); setCommentDefinition(Utils::CommentDefinition::HashStyle);
setEditorActionHandlers(TextEditorActionHandler::UnCommentSelection setEditorActionHandlers(TextEditorActionHandler::UnCommentSelection
| TextEditorActionHandler::JumpToFileUnderCursor); | TextEditorActionHandler::JumpToFileUnderCursor);
Keywords keywords(pcap->variables(), pcap->functions(), QMap<QString, QStringList>()); addHoverHandler(new ProFileHoverHandler);
addHoverHandler(new ProFileHoverHandler(keywords)); setSyntaxHighlighterCreator([]() { return new ProFileHighlighter; });
setSyntaxHighlighterCreator([keywords]() { return new ProFileHighlighter(keywords); });
const QString defaultOverlay = QLatin1String(ProjectExplorer::Constants::FILEOVERLAY_QT); const QString defaultOverlay = QLatin1String(ProjectExplorer::Constants::FILEOVERLAY_QT);
Core::FileIconProvider::registerIconOverlayForSuffix( Core::FileIconProvider::registerIconOverlayForSuffix(

View File

@@ -53,7 +53,7 @@ static TextStyle styleForFormat(int format)
} }
ProFileHighlighter::ProFileHighlighter(const Keywords &keywords) ProFileHighlighter::ProFileHighlighter(const Keywords &keywords)
: m_keywords(keywords) : m_keywords(qmakeKeywords())
{ {
setTextFormatCategories(NumProfileFormats, styleForFormat); setTextFormatCategories(NumProfileFormats, styleForFormat);
} }

View File

@@ -39,8 +39,8 @@ using namespace Core;
namespace QmakeProjectManager { namespace QmakeProjectManager {
namespace Internal { namespace Internal {
ProFileHoverHandler::ProFileHoverHandler(const TextEditor::Keywords &keywords) ProFileHoverHandler::ProFileHoverHandler()
: m_keywords(keywords) : m_keywords(qmakeKeywords())
{ {
} }