forked from qt-creator/qt-creator
		
	CppEditor: Respect whitespace in operator names for more quick fixes
* Affected quick fixes: InsertDefFromDecl, MoveFuncDefOutside * Fix also reformating pointer declaration of operator functions for qualified name ids Change-Id: I6a7578f496221557d103f5fdbb5dacc9540ee779 Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
This commit is contained in:
		@@ -115,7 +115,7 @@ static unsigned firstTypeSpecifierWithoutFollowingAttribute(
 | 
			
		||||
 | 
			
		||||
PointerDeclarationFormatter::PointerDeclarationFormatter(
 | 
			
		||||
        const CppRefactoringFilePtr refactoringFile,
 | 
			
		||||
        const Overview &overview,
 | 
			
		||||
        Overview &overview,
 | 
			
		||||
        CursorHandling cursorHandling)
 | 
			
		||||
    : ASTVisitor(refactoringFile->cppDocument()->translationUnit())
 | 
			
		||||
    , m_cppRefactoringFile(refactoringFile)
 | 
			
		||||
@@ -413,21 +413,14 @@ void PointerDeclarationFormatter::checkAndRewrite(DeclaratorAST *declarator,
 | 
			
		||||
    QString rewrittenDeclaration;
 | 
			
		||||
    const Name *name = symbol->name();
 | 
			
		||||
    if (name) {
 | 
			
		||||
        if (name->isOperatorNameId()) {
 | 
			
		||||
            // Take the operator name from the file instead from the AST, so the white
 | 
			
		||||
            // spaces within the operator names can be respected, e.g. in "operator =".
 | 
			
		||||
            const QByteArray operatorText
 | 
			
		||||
                    = m_cppRefactoringFile->textOf(declarator->core_declarator).toLatin1();
 | 
			
		||||
            Identifier operatorName(operatorText.constData(), operatorText.size());
 | 
			
		||||
            rewrittenDeclaration = rewriteDeclaration(type, &operatorName);
 | 
			
		||||
        } else {
 | 
			
		||||
            rewrittenDeclaration = rewriteDeclaration(type, name);
 | 
			
		||||
        if (name->isOperatorNameId()
 | 
			
		||||
                || (name->isQualifiedNameId()
 | 
			
		||||
                    && name->asQualifiedNameId()->name()->isOperatorNameId())) {
 | 
			
		||||
            const QString operatorText = m_cppRefactoringFile->textOf(declarator->core_declarator);
 | 
			
		||||
            m_overview.includeWhiteSpaceInOperatorName = operatorText.contains(QLatin1Char(' '));
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        // The declaration will be correctly rewritten for name == 0 (e.g. "int *").
 | 
			
		||||
        rewrittenDeclaration = rewriteDeclaration(type, name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    rewrittenDeclaration = m_overview.prettyType(type, name);
 | 
			
		||||
    rewrittenDeclaration.remove(0, charactersToRemove);
 | 
			
		||||
 | 
			
		||||
    CHECK_R(originalDeclaration != rewrittenDeclaration, "Rewritten is same as original");
 | 
			
		||||
@@ -460,21 +453,6 @@ void PointerDeclarationFormatter::checkAndRewrite(DeclaratorAST *declarator,
 | 
			
		||||
        qDebug() << "Replacement operation failed";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*! Rewrite/format the given type and name. */
 | 
			
		||||
QString PointerDeclarationFormatter::rewriteDeclaration(FullySpecifiedType type, const Name *name)
 | 
			
		||||
    const
 | 
			
		||||
{
 | 
			
		||||
    CHECK_RV(type.isValid(), "Invalid type", QString());
 | 
			
		||||
 | 
			
		||||
    const char *identifier = 0;
 | 
			
		||||
    if (const Name *declarationName = name) {
 | 
			
		||||
        if (const Identifier *id = declarationName->identifier())
 | 
			
		||||
            identifier = id->chars();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return m_overview.prettyType(type, QLatin1String(identifier));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PointerDeclarationFormatter::printCandidate(AST *ast)
 | 
			
		||||
{
 | 
			
		||||
#if DEBUG_OUTPUT
 | 
			
		||||
 
 | 
			
		||||
@@ -78,7 +78,7 @@ public:
 | 
			
		||||
    enum CursorHandling { RespectCursor, IgnoreCursor };
 | 
			
		||||
 | 
			
		||||
    explicit PointerDeclarationFormatter(const CppRefactoringFilePtr refactoringFile,
 | 
			
		||||
                                         const Overview &overview,
 | 
			
		||||
                                         Overview &overview,
 | 
			
		||||
                                         CursorHandling cursorHandling = IgnoreCursor);
 | 
			
		||||
 | 
			
		||||
    /*!
 | 
			
		||||
@@ -113,11 +113,10 @@ private:
 | 
			
		||||
    void processIfWhileForStatement(ExpressionAST *expression, Symbol *symbol);
 | 
			
		||||
    void checkAndRewrite(DeclaratorAST *declarator, Symbol *symbol, TokenRange range,
 | 
			
		||||
                         unsigned charactersToRemove = 0);
 | 
			
		||||
    QString rewriteDeclaration(FullySpecifiedType type, const Name *name) const;
 | 
			
		||||
    void printCandidate(AST *ast);
 | 
			
		||||
 | 
			
		||||
    const CppRefactoringFilePtr m_cppRefactoringFile;
 | 
			
		||||
    const Overview &m_overview;
 | 
			
		||||
    Overview &m_overview;
 | 
			
		||||
    const CursorHandling m_cursorHandling;
 | 
			
		||||
 | 
			
		||||
    ChangeSet m_changeSet;
 | 
			
		||||
 
 | 
			
		||||
@@ -349,9 +349,13 @@ void CppToolsPlugin::test_format_pointerdeclaration_in_simpledeclarations_data()
 | 
			
		||||
        << source << stripCursor(source);
 | 
			
		||||
 | 
			
		||||
    // Respect white space within operator names
 | 
			
		||||
    QTest::newRow("operators")
 | 
			
		||||
    QTest::newRow("operators1")
 | 
			
		||||
        << "class C { C@&operator = (const C &); };"
 | 
			
		||||
        << "class C { C & operator = (const C &); };";
 | 
			
		||||
 | 
			
		||||
    QTest::newRow("operators2")
 | 
			
		||||
        << "C &C::operator = (const C &) {}"
 | 
			
		||||
        << "C & C::operator = (const C &) {}";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CppToolsPlugin::test_format_pointerdeclaration_in_controlflowstatements()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user