forked from qt-creator/qt-creator
Extract CamelHumpMatcher for use in the C++/QML locator filters
Started-by: David Kaspar <dkaspar@blackberry.com> Change-Id: I928ccdc4084f8d07826746c771e7fca6994f95ab Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
committed by
André Hartmann
parent
7729195d19
commit
3480579943
@@ -255,58 +255,9 @@ void GenericProposalModel::filter(const QString &prefix)
|
||||
if (prefix.isEmpty())
|
||||
return;
|
||||
|
||||
/*
|
||||
* This code builds a regular expression in order to more intelligently match
|
||||
* camel-case and underscore names.
|
||||
*
|
||||
* For any but the first letter, the following replacements are made:
|
||||
* A => [a-z0-9_]*A
|
||||
* a => (?:[a-zA-Z0-9]*_)?a
|
||||
*
|
||||
* That means any sequence of lower-case or underscore characters can preceed an
|
||||
* upper-case character. And any sequence of lower-case or upper case characters -
|
||||
* followed by an underscore can preceed a lower-case character.
|
||||
*
|
||||
* Examples: (case sensitive mode)
|
||||
* gAC matches getActionController
|
||||
* gac matches get_action_controller
|
||||
*
|
||||
* It also implements the fully and first-letter-only case sensitivity.
|
||||
*/
|
||||
const CaseSensitivity caseSensitivity =
|
||||
TextEditorSettings::completionSettings().m_caseSensitivity;
|
||||
|
||||
QString keyRegExp;
|
||||
keyRegExp += QLatin1Char('^');
|
||||
bool first = true;
|
||||
const QLatin1String uppercaseWordContinuation("[a-z0-9_]*");
|
||||
const QLatin1String lowercaseWordContinuation("(?:[a-zA-Z0-9]*_)?");
|
||||
foreach (const QChar &c, prefix) {
|
||||
if (caseSensitivity == CaseInsensitive ||
|
||||
(caseSensitivity == FirstLetterCaseSensitive && !first)) {
|
||||
|
||||
keyRegExp += QLatin1String("(?:");
|
||||
if (!first)
|
||||
keyRegExp += uppercaseWordContinuation;
|
||||
keyRegExp += QRegExp::escape(c.toUpper());
|
||||
keyRegExp += QLatin1Char('|');
|
||||
if (!first)
|
||||
keyRegExp += lowercaseWordContinuation;
|
||||
keyRegExp += QRegExp::escape(c.toLower());
|
||||
keyRegExp += QLatin1Char(')');
|
||||
} else {
|
||||
if (!first) {
|
||||
if (c.isUpper())
|
||||
keyRegExp += uppercaseWordContinuation;
|
||||
else
|
||||
keyRegExp += lowercaseWordContinuation;
|
||||
}
|
||||
keyRegExp += QRegExp::escape(c);
|
||||
}
|
||||
|
||||
first = false;
|
||||
}
|
||||
QRegExp regExp(keyRegExp);
|
||||
const CamelHumpMatcher::CaseSensitivity caseSensitivity =
|
||||
convertCaseSensitivity(TextEditorSettings::completionSettings().m_caseSensitivity);
|
||||
const QRegExp regExp = CamelHumpMatcher::createCamelHumpRegExp(prefix, caseSensitivity);
|
||||
|
||||
m_currentItems.clear();
|
||||
const QString lowerPrefix = prefix.toLower();
|
||||
@@ -328,6 +279,19 @@ void GenericProposalModel::filter(const QString &prefix)
|
||||
}
|
||||
}
|
||||
|
||||
CamelHumpMatcher::CaseSensitivity
|
||||
GenericProposalModel::convertCaseSensitivity(TextEditor::CaseSensitivity textEditorCaseSensitivity)
|
||||
{
|
||||
switch (textEditorCaseSensitivity) {
|
||||
case TextEditor::CaseSensitive:
|
||||
return CamelHumpMatcher::CaseSensitivity::CaseSensitive;
|
||||
case TextEditor::FirstLetterCaseSensitive:
|
||||
return CamelHumpMatcher::CaseSensitivity::FirstLetterCaseSensitive;
|
||||
default:
|
||||
return CamelHumpMatcher::CaseSensitivity::CaseInsensitive;
|
||||
}
|
||||
}
|
||||
|
||||
bool GenericProposalModel::isSortable(const QString &prefix) const
|
||||
{
|
||||
Q_UNUSED(prefix);
|
||||
|
||||
Reference in New Issue
Block a user