Utils: Adjust column numbers affected by convertPosition change

convertPosition change was introduced in 931ec39f64.
It changed 0-based column to 1-based which is how it
naturally is in Qt Creator.

This fixed some usages but broke many more. This is an
attempt to fix the remaining use cases.

Fixes CppEditor auto-tests.

Change-Id: Ia8d14da0ebb035cd2fdd6da4ff6ec89c1c5121a8
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
Ivan Donchevskii
2018-11-02 14:17:12 +01:00
parent 3d93945840
commit 8469e317c9
20 changed files with 72 additions and 60 deletions

View File

@@ -163,13 +163,10 @@ void ClangFollowSymbol::findLink(const CppTools::CursorInEditor &data,
CppTools::SymbolFinder *symbolFinder,
bool inNextSplit)
{
int lineNumber = 0, positionInBlock = 0;
int line = 0;
int column = 0;
QTextCursor cursor = Utils::Text::wordStartCursor(data.cursor());
Utils::Text::convertPosition(cursor.document(), cursor.position(), &lineNumber,
&positionInBlock);
const uint line = lineNumber;
const uint column = positionInBlock + 1;
Utils::Text::convertPosition(cursor.document(), cursor.position(), &line, &column);
ClangEditorDocumentProcessor *processor = ClangEditorDocumentProcessor::get(
data.filePath().toString());
@@ -177,7 +174,10 @@ void ClangFollowSymbol::findLink(const CppTools::CursorInEditor &data,
return processLinkCallback(Utils::Link());
if (!resolveTarget) {
processLinkCallback(linkAtCursor(cursor, data.filePath().toString(), line, column,
processLinkCallback(linkAtCursor(cursor,
data.filePath().toString(),
static_cast<uint>(line),
static_cast<uint>(column),
processor));
return;
}

View File

@@ -423,7 +423,7 @@ void Manager::onDocumentUpdated(CPlusPlus::Document::Ptr doc)
/*!
Opens the text editor for the file \a fileName on \a line (1-based) and
\a column (1-based).
\a column (0-based).
*/
void Manager::gotoLocation(const QString &fileName, int line, int column)
@@ -468,7 +468,8 @@ void Manager::gotoLocations(const QList<QVariant> &list)
}
}
}
gotoLocation(loc.fileName(), loc.line(), loc.column());
// line is 1-based, column is 0-based
gotoLocation(loc.fileName(), loc.line(), loc.column() - 1);
}
/*!

View File

@@ -369,9 +369,9 @@ void Parser::addSymbol(const ParserTreeItem::Ptr &item, const CPlusPlus::Symbol
if (itemAdd.isNull())
itemAdd = ParserTreeItem::Ptr(new ParserTreeItem());
// locations are 1-based in Symbol, start with 0 for the editor
// locations have 1-based column in Symbol, use the same here.
SymbolLocation location(QString::fromUtf8(symbol->fileName() , symbol->fileNameLength()),
symbol->line(), symbol->column() - 1);
symbol->line(), symbol->column());
itemAdd->addSymbolLocation(location);
// prevent showing a content of the functions

View File

@@ -146,8 +146,10 @@ void CMakeEditorWidget::findLinkAt(const QTextCursor &cursor,
{
Utils::Link link;
int lineNumber = 0, positionInBlock = 0;
convertPosition(cursor.position(), &lineNumber, &positionInBlock);
int line = 0;
int column = 0;
convertPosition(cursor.position(), &line, &column);
const int positionInBlock = column - 1;
const QString block = cursor.block().text();

View File

@@ -31,6 +31,7 @@
#include <QElapsedTimer>
#include <QtTest>
// Uses 1-based line and 0-based column.
struct Selection {
Selection(int line, int column, int length) : line(line), column(column), length(length) {}
int line;
@@ -116,7 +117,7 @@ SelectionList UseSelectionsTestCase::toSelectionList(
int line, column;
const int position = qMin(selection.cursor.position(), selection.cursor.anchor());
m_editorWidget->convertPosition(position, &line, &column);
result << Selection(line, column, selection.cursor.selectedText().length());
result << Selection(line, column - 1, selection.cursor.selectedText().length());
}
return result;
}

View File

@@ -317,7 +317,7 @@ F2TestCase::F2TestCase(CppEditorAction action,
initialTestFile->m_editor->setCursorPosition(initialTestFile->m_cursorPosition);
// qDebug() << "Initial line:" << initialTestFile->editor->currentLine();
// qDebug() << "Initial column:" << initialTestFile->editor->currentColumn() - 1;
// qDebug() << "Initial column:" << initialTestFile->editor->currentColumn();
OverrideItemList immediateVirtualSymbolResults;
OverrideItemList finalVirtualSymbolResults;
@@ -338,7 +338,7 @@ F2TestCase::F2TestCase(CppEditorAction action,
QSKIP((curTestName + " is not supported by Clang FollowSymbol").toLatin1());
}
initialTestFile->m_editorWidget->openLinkUnderCursor();
widget->openLinkUnderCursor();
break;
}
@@ -349,7 +349,7 @@ F2TestCase::F2TestCase(CppEditorAction action,
QSharedPointer<VirtualFunctionTestAssistProvider> testProvider(
new VirtualFunctionTestAssistProvider(widget));
builtinFollowSymbol->setVirtualFunctionAssistProvider(testProvider);
initialTestFile->m_editorWidget->openLinkUnderCursor();
widget->openLinkUnderCursor();
immediateVirtualSymbolResults = testProvider->m_immediateItems;
finalVirtualSymbolResults = testProvider->m_finalItems;
@@ -382,7 +382,7 @@ F2TestCase::F2TestCase(CppEditorAction action,
QEXPECT_FAIL("globalVarFromEnum", "Contributor works on a fix.", Abort);
QEXPECT_FAIL("matchFunctionSignature_Follow_5", "foo(int) resolved as CallAST", Abort);
QCOMPARE(currentTextEditor->currentLine(), expectedLine);
QCOMPARE(currentTextEditor->currentColumn() - 1, expectedColumn);
QCOMPARE(currentTextEditor->currentColumn(), expectedColumn);
// qDebug() << immediateVirtualSymbolResults;
// qDebug() << finalVirtualSymbolResults;

View File

@@ -184,8 +184,9 @@ private:
{
CursorInfo result;
// findLocalUses operates with 1-based line and 0-based column
const CppTools::SemanticInfo::LocalUseMap localUses
= BuiltinCursorInfo::findLocalUses(m_document, m_line, m_column);
= BuiltinCursorInfo::findLocalUses(m_document, m_line, m_column - 1);
result.localUses = localUses;
splitLocalUses(localUses, &result.useRanges, &result.unusedVariablesRanges);
@@ -216,8 +217,7 @@ private:
bool good = false;
foreach (const CppTools::SemanticInfo::Use &use, uses) {
unsigned l = static_cast<unsigned>(m_line);
// convertCursorPosition() returns a 0-based column number.
unsigned c = static_cast<unsigned>(m_column + 1);
unsigned c = static_cast<unsigned>(m_column);
if (l == use.line && c >= use.column && c <= (use.column + use.length)) {
good = true;
break;

View File

@@ -112,7 +112,6 @@ CppTools::CheckSymbols *createHighlighter(const CPlusPlus::Document::Ptr &doc,
int line, column;
convertPosition(textDocument, macro.utf16CharOffset(), &line, &column);
++column; //Highlighting starts at (column-1) --> compensate here
Result use(line, column, macro.nameToQString().size(), SemanticHighlighter::MacroUse);
macroUses.append(use);
}

View File

@@ -60,7 +60,6 @@ Scope *CanonicalSymbol::getScopeAndExpression(const QTextCursor &cursor, QString
QTextCursor tc = cursor;
int line, column;
Utils::Text::convertPosition(cursor.document(), tc.position(), &line, &column);
++column; // 1-based line and 1-based column
int pos = tc.position();
QTextDocument *textDocument = cursor.document();
@@ -74,7 +73,7 @@ Scope *CanonicalSymbol::getScopeAndExpression(const QTextCursor &cursor, QString
ExpressionUnderCursor expressionUnderCursor(m_document->languageFeatures());
*code = expressionUnderCursor(tc);
return m_document->scopeAt(line, column);
return m_document->scopeAt(line, column - 1);
}
Symbol *CanonicalSymbol::operator()(const QTextCursor &cursor)

View File

@@ -1092,7 +1092,7 @@ int InternalCppCompletionAssistProcessor::startCompletionHelper()
int line = 0, column = 0;
Utils::Text::convertPosition(m_interface->textDocument(), startOfExpression, &line, &column);
const QString fileName = m_interface->fileName();
return startCompletionInternal(fileName, line, column, expression, endOfExpression);
return startCompletionInternal(fileName, line, column - 1, expression, endOfExpression);
}
bool InternalCppCompletionAssistProcessor::tryObjCCompletion()
@@ -1125,7 +1125,7 @@ bool InternalCppCompletionAssistProcessor::tryObjCCompletion()
int line = 0, column = 0;
Utils::Text::convertPosition(m_interface->textDocument(), m_interface->position(), &line,
&column);
Scope *scope = thisDocument->scopeAt(line, column);
Scope *scope = thisDocument->scopeAt(line, column - 1);
if (!scope)
return false;
@@ -1319,7 +1319,8 @@ bool InternalCppCompletionAssistProcessor::objcKeywordsWanted() const
}
int InternalCppCompletionAssistProcessor::startCompletionInternal(const QString &fileName,
unsigned line, unsigned column,
unsigned line,
unsigned positionInBlock,
const QString &expr,
int endOfExpression)
{
@@ -1331,7 +1332,7 @@ int InternalCppCompletionAssistProcessor::startCompletionInternal(const QString
m_model->m_typeOfExpression->init(thisDocument, m_interface->snapshot());
Scope *scope = thisDocument->scopeAt(line, column);
Scope *scope = thisDocument->scopeAt(line, positionInBlock);
QTC_ASSERT(scope != 0, return -1);
if (expression.isEmpty()) {
@@ -2016,7 +2017,7 @@ bool InternalCppCompletionAssistProcessor::completeConstructorOrFunction(const Q
int lineSigned = 0, columnSigned = 0;
Utils::Text::convertPosition(m_interface->textDocument(), m_interface->position(),
&lineSigned, &columnSigned);
unsigned line = lineSigned, column = columnSigned;
unsigned line = lineSigned, column = columnSigned - 1;
// find a scope that encloses the current location, starting from the lastVisibileSymbol
// and moving outwards

View File

@@ -113,7 +113,7 @@ private:
bool tryObjCCompletion();
bool objcKeywordsWanted() const;
int startCompletionInternal(const QString &fileName,
unsigned line, unsigned column,
unsigned line, unsigned positionInBlock,
const QString &expression,
int endOfExpression);

View File

@@ -373,7 +373,7 @@ void CppElementEvaluator::execute()
// Fetch the expression's code
ExpressionUnderCursor expressionUnderCursor(doc->languageFeatures());
const QString &expression = expressionUnderCursor(m_tc);
Scope *scope = doc->scopeAt(line, column);
Scope *scope = doc->scopeAt(line, column - 1);
TypeOfExpression typeOfExpression;
typeOfExpression.init(doc, snapshot);

View File

@@ -491,12 +491,12 @@ void FollowSymbolUnderCursor::findLink(
{
Link link;
int lineNumber = 0, positionInBlock = 0;
int line = 0;
int column = 0;
QTextCursor cursor = data.cursor();
QTextDocument *document = cursor.document();
Utils::Text::convertPosition(document, cursor.position(), &lineNumber, &positionInBlock);
const unsigned line = lineNumber;
const unsigned column = positionInBlock + 1;
Utils::Text::convertPosition(document, cursor.position(), &line, &column);
const int positionInBlock = column - 1;
Snapshot snapshot = theSnapshot;
@@ -541,8 +541,8 @@ void FollowSymbolUnderCursor::findLink(
for (int i = 0; i < tokens.size(); ++i) {
const Token &tk = tokens.at(i);
if (((unsigned) positionInBlock) >= tk.utf16charsBegin()
&& ((unsigned) positionInBlock) < tk.utf16charsEnd()) {
if (static_cast<unsigned>(positionInBlock) >= tk.utf16charsBegin()
&& static_cast<unsigned>(positionInBlock) < tk.utf16charsEnd()) {
int closingParenthesisPos = tokens.size();
if (i >= 2 && tokens.at(i).is(T_IDENTIFIER) && tokens.at(i - 1).is(T_LPAREN)
&& (tokens.at(i - 2).is(T_SIGNAL) || tokens.at(i - 2).is(T_SLOT))) {
@@ -584,8 +584,8 @@ void FollowSymbolUnderCursor::findLink(
// In this case we want to look at one token before the current position to recognize
// an operator if the cursor is inside the actual operator: operator[$]
if (unsigned(positionInBlock) >= tk.utf16charsBegin()
&& unsigned(positionInBlock) <= tk.utf16charsEnd()) {
if (static_cast<unsigned>(positionInBlock) >= tk.utf16charsBegin()
&& static_cast<unsigned>(positionInBlock) <= tk.utf16charsEnd()) {
cursorRegionReached = true;
if (tk.is(T_OPERATOR)) {
link = attemptFuncDeclDef(cursor, theSnapshot,
@@ -675,7 +675,7 @@ void FollowSymbolUnderCursor::findLink(
}
// Find the last symbol up to the cursor position
Scope *scope = doc->scopeAt(line, column);
Scope *scope = doc->scopeAt(line, positionInBlock);
if (!scope)
return processLinkCallback(link);
@@ -698,19 +698,21 @@ void FollowSymbolUnderCursor::findLink(
if (d->isDeclaration() || d->isFunction()) {
const QString fileName = QString::fromUtf8(d->fileName(), d->fileNameLength());
if (data.filePath().toString() == fileName) {
if (unsigned(lineNumber) == d->line()
&& unsigned(positionInBlock) >= d->column()) { // TODO: check the end
if (static_cast<unsigned>(line) == d->line()
&& static_cast<unsigned>(positionInBlock) >= d->column()) {
// TODO: check the end
result = r; // take the symbol under cursor.
break;
}
}
} else if (d->isUsingDeclaration()) {
int tokenBeginLineNumber = 0, tokenBeginColumnNumber = 0;
int tokenBeginLineNumber = 0;
int tokenBeginColumnNumber = 0;
Utils::Text::convertPosition(document, beginOfToken, &tokenBeginLineNumber,
&tokenBeginColumnNumber);
if (unsigned(tokenBeginLineNumber) > d->line()
|| (unsigned(tokenBeginLineNumber) == d->line()
&& unsigned(tokenBeginColumnNumber) > d->column())) {
if (static_cast<unsigned>(tokenBeginLineNumber) > d->line()
|| (static_cast<unsigned>(tokenBeginLineNumber) == d->line()
&& static_cast<unsigned>(tokenBeginColumnNumber) >= d->column())) {
result = r; // take the symbol under cursor.
break;
}

View File

@@ -74,7 +74,7 @@ CPlusPlus::Symbol *AnalyzerUtils::findSymbolUnderCursor()
CPlusPlus::ExpressionUnderCursor expressionUnderCursor(doc->languageFeatures());
moveCursorToEndOfName(&tc);
const QString &expression = expressionUnderCursor(tc);
CPlusPlus::Scope *scope = doc->scopeAt(line, column);
CPlusPlus::Scope *scope = doc->scopeAt(line, column - 1);
CPlusPlus::TypeOfExpression typeOfExpression;
typeOfExpression.init(doc, snapshot);

View File

@@ -329,7 +329,8 @@ static Document::Ptr addDefinition(const Snapshot &docTable,
const QString contents = editor->textDocument()->plainText();
int column;
editor->convertPosition(contents.length(), line, &column);
editor->gotoLine(*line, column);
// gotoLine accepts 0-based column.
editor->gotoLine(*line, column - 1);
editor->insert(definition);
*line += 1;
}

View File

@@ -81,8 +81,10 @@ void ProFileEditorWidget::findLinkAt(const QTextCursor &cursor,
{
Link link;
int lineNumber = 0, positionInBlock = 0;
convertPosition(cursor.position(), &lineNumber, &positionInBlock);
int line = 0;
int column = 0;
convertPosition(cursor.position(), &line, &column);
const int positionInBlock = column - 1;
const QString block = cursor.block().text();

View File

@@ -128,7 +128,8 @@ void QmakeManager::addLibraryImpl(const QString &fileName, BaseTextEditor *edito
// add extra \n in case the last line is not empty
int line, column;
editor->convertPosition(endOfDoc, &line, &column);
if (!editor->textAt(endOfDoc - column, column).simplified().isEmpty())
const int positionInBlock = column - 1;
if (!editor->textAt(endOfDoc - positionInBlock, positionInBlock).simplified().isEmpty())
snippet = QLatin1Char('\n') + snippet;
editor->insert(snippet);

View File

@@ -133,9 +133,10 @@ void TextEditorWidget::jumpTextCursorToSelectedModelNode()
const int nodeOffset = rewriterView->nodeOffset(selectedNode);
if (nodeOffset > 0) {
int line, column;
m_textEditor->editorWidget()->convertPosition(nodeOffset, &line, &column);
m_textEditor->editorWidget()->gotoLine(line, column);
int line, column;
m_textEditor->editorWidget()->convertPosition(nodeOffset, &line, &column);
// line has to be 1 based, column 0 based!
m_textEditor->editorWidget()->gotoLine(line, column - 1);
}
}
m_updateSelectionTimer.stop();

View File

@@ -374,7 +374,8 @@ void QmlDesignerPlugin::jumpTextCursorToSelectedModelNode()
if (currentSelectedNode != selectedNode) {
int line, column;
currentDesignDocument()->textEditor()->convertPosition(nodeOffset, &line, &column);
currentDesignDocument()->textEditor()->gotoLine(line, column);
// line has to be 1 based, column 0 based!
currentDesignDocument()->textEditor()->gotoLine(line, column - 1);
}
}
}

View File

@@ -3104,14 +3104,14 @@ bool TextEditorWidget::restoreState(const QByteArray &state)
int version;
int vval;
int hval;
int lval;
int cval;
int lineVal;
int columnVal;
QDataStream stream(state);
stream >> version;
stream >> vval;
stream >> hval;
stream >> lval;
stream >> cval;
stream >> lineVal;
stream >> columnVal;
if (version >= 1) {
QList<int> collapsedBlocks;
@@ -3137,7 +3137,8 @@ bool TextEditorWidget::restoreState(const QByteArray &state)
}
d->m_lastCursorChangeWasInteresting = false; // avoid adding last position to history
gotoLine(lval, cval);
// line is 1-based, column is 0-based
gotoLine(lineVal, columnVal - 1);
verticalScrollBar()->setValue(vval);
horizontalScrollBar()->setValue(hval);
d->saveCurrentCursorPositionForNavigation();