CMake: Improve auto completion for cmake editor

Change-Id: I82356c2e06907204292bc45731af204a06f0e438
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
This commit is contained in:
Yuchen Deng
2013-02-16 22:37:31 +08:00
parent 2cfd14f63e
commit 89ea067106
2 changed files with 42 additions and 5 deletions

View File

@@ -89,7 +89,6 @@ void CMakeValidator::finished(int exitCode)
QRegExp versionRegexp(QLatin1String("^cmake version ([\\d\\.]*)")); QRegExp versionRegexp(QLatin1String("^cmake version ([\\d\\.]*)"));
versionRegexp.indexIn(QString::fromLocal8Bit(response)); versionRegexp.indexIn(QString::fromLocal8Bit(response));
//m_supportsQtCreator = response.contains(QLatin1String("QtCreator"));
m_hasCodeBlocksMsvcGenerator = response.contains("CodeBlocks - NMake Makefiles"); m_hasCodeBlocksMsvcGenerator = response.contains("CodeBlocks - NMake Makefiles");
m_hasCodeBlocksNinjaGenerator = response.contains("CodeBlocks - Ninja"); m_hasCodeBlocksNinjaGenerator = response.contains("CodeBlocks - Ninja");
m_version = versionRegexp.cap(1); m_version = versionRegexp.cap(1);
@@ -110,7 +109,18 @@ void CMakeValidator::finished(int exitCode)
finished(0); // should never happen, just continue finished(0); // should never happen, just continue
} else if (m_state == CMakeValidator::RunningFunctionDetails) { } else if (m_state == CMakeValidator::RunningFunctionDetails) {
parseFunctionDetailsOutput(m_process->readAll()); parseFunctionDetailsOutput(m_process->readAll());
m_state = CMakeValidator::ValidFunctionDetails; m_state = CMakeValidator::RunningPropertyList;
if (!startProcess(QStringList(QLatin1String("--help-property-list"))))
finished(0); // should never happen, just continue
} else if (m_state == CMakeValidator::RunningPropertyList) {
parseVariableOutput(m_process->readAll());
m_state = CMakeValidator::RunningVariableList;
if (!startProcess(QStringList(QLatin1String("--help-variable-list"))))
finished(0); // should never happen, just continue
} else if (m_state == CMakeValidator::RunningVariableList) {
parseVariableOutput(m_process->readAll());
parseDone();
m_state = CMakeValidator::RunningDone;
} }
} }
@@ -148,10 +158,9 @@ bool CMakeValidator::hasCodeBlocksNinjaGenerator() const
return m_hasCodeBlocksNinjaGenerator; return m_hasCodeBlocksNinjaGenerator;
} }
TextEditor::Keywords CMakeValidator::keywords() TextEditor::Keywords CMakeValidator::keywords()
{ {
while (m_state != ValidFunctionDetails && m_state != CMakeValidator::Invalid) { while (m_state != RunningDone && m_state != CMakeValidator::Invalid) {
m_process->waitForFinished(); m_process->waitForFinished();
} }
@@ -253,6 +262,31 @@ void CMakeValidator::parseFunctionDetailsOutput(const QByteArray &output)
} }
} }
m_functions = m_functionArgs.keys(); m_functions = m_functionArgs.keys();
}
void CMakeValidator::parseVariableOutput(const QByteArray &output)
{
QList<QByteArray> variableList = output.split('\n');
if (!variableList.isEmpty()) {
variableList.removeFirst(); //remove version string
foreach (const QByteArray &variable, variableList) {
if (variable.contains("_<CONFIG>")) {
m_variables << QString::fromLocal8Bit(variable).replace(QLatin1String("_<CONFIG>"), QLatin1String("_DEBUG"));
m_variables << QString::fromLocal8Bit(variable).replace(QLatin1String("_<CONFIG>"), QLatin1String("_RELEASE"));
m_variables << QString::fromLocal8Bit(variable).replace(QLatin1String("_<CONFIG>"), QLatin1String("_MINSIZEREL"));
m_variables << QString::fromLocal8Bit(variable).replace(QLatin1String("_<CONFIG>"), QLatin1String("_RELWITHDEBINFO"));
} else if (variable.contains("_<LANG>")) {
m_variables << QString::fromLocal8Bit(variable).replace(QLatin1String("_<LANG>"), QLatin1String("_C"));
m_variables << QString::fromLocal8Bit(variable).replace(QLatin1String("_<LANG>"), QLatin1String("_CXX"));
} else if (!variable.contains("_<") && !variable.contains('[')) {
m_variables << QString::fromLocal8Bit(variable);
}
}
}
}
void CMakeValidator::parseDone()
{
m_variables.sort(); m_variables.sort();
m_variables.removeDuplicates(); m_variables.removeDuplicates();
} }

View File

@@ -47,7 +47,8 @@ public:
CMakeValidator(); CMakeValidator();
~CMakeValidator(); ~CMakeValidator();
enum State { Invalid, RunningBasic, RunningFunctionList, RunningFunctionDetails, ValidFunctionDetails }; enum State { Invalid, RunningBasic, RunningFunctionList, RunningFunctionDetails,
RunningPropertyList, RunningVariableList, RunningDone };
void cancel(); void cancel();
bool isValid() const; bool isValid() const;
@@ -65,6 +66,8 @@ private:
bool startProcess(const QStringList &args); bool startProcess(const QStringList &args);
void parseFunctionOutput(const QByteArray &output); void parseFunctionOutput(const QByteArray &output);
void parseFunctionDetailsOutput(const QByteArray &output); void parseFunctionDetailsOutput(const QByteArray &output);
void parseVariableOutput(const QByteArray &output);
void parseDone();
QString formatFunctionDetails(const QString &command, const QString &args); QString formatFunctionDetails(const QString &command, const QString &args);
State m_state; State m_state;