Commit 13806679 authored by Nikolai Kosjar's avatar Nikolai Kosjar

C++: Introduce PointerDeclarationFormatter

For a given AST, CppRefactoringFile and Overview this will create a
ChangeSet for rewriting the pointer or reference declaration according
to the Overview.

Task-number: QTCREATORBUG-6169

Change-Id: If6f824c1ea5e9f53a11a58ec8b6d696d01f0723e
Reviewed-by: default avatarErik Verbruggen <erik.verbruggen@digia.com>
parent fa7ab13f
...@@ -181,6 +181,13 @@ void Bind::operator()(DeclarationAST *ast, Scope *scope) ...@@ -181,6 +181,13 @@ void Bind::operator()(DeclarationAST *ast, Scope *scope)
(void) switchScope(previousScope); (void) switchScope(previousScope);
} }
void Bind::operator()(StatementAST *ast, Scope *scope)
{
Scope *previousScope = switchScope(scope);
statement(ast);
(void) switchScope(previousScope);
}
FullySpecifiedType Bind::operator()(ExpressionAST *ast, Scope *scope) FullySpecifiedType Bind::operator()(ExpressionAST *ast, Scope *scope)
{ {
Scope *previousScope = switchScope(scope); Scope *previousScope = switchScope(scope);
......
...@@ -34,6 +34,7 @@ public: ...@@ -34,6 +34,7 @@ public:
void operator()(TranslationUnitAST *ast, Namespace *globalNamespace); void operator()(TranslationUnitAST *ast, Namespace *globalNamespace);
void operator()(DeclarationAST *ast, Scope *scope); void operator()(DeclarationAST *ast, Scope *scope);
void operator()(StatementAST *ast, Scope *scope);
FullySpecifiedType operator()(ExpressionAST *ast, Scope *scope); FullySpecifiedType operator()(ExpressionAST *ast, Scope *scope);
FullySpecifiedType operator()(NewTypeIdAST *ast, Scope *scope); FullySpecifiedType operator()(NewTypeIdAST *ast, Scope *scope);
......
...@@ -595,6 +595,8 @@ void Document::check(CheckMode mode) ...@@ -595,6 +595,8 @@ void Document::check(CheckMode mode)
if (TranslationUnitAST *ast = _translationUnit->ast()->asTranslationUnit()) if (TranslationUnitAST *ast = _translationUnit->ast()->asTranslationUnit())
semantic(ast, _globalNamespace); semantic(ast, _globalNamespace);
else if (StatementAST *ast = _translationUnit->ast()->asStatement())
semantic(ast, _globalNamespace);
else if (ExpressionAST *ast = _translationUnit->ast()->asExpression()) else if (ExpressionAST *ast = _translationUnit->ast()->asExpression())
semantic(ast, _globalNamespace); semantic(ast, _globalNamespace);
else if (DeclarationAST *ast = translationUnit()->ast()->asDeclaration()) else if (DeclarationAST *ast = translationUnit()->ast()->asDeclaration())
......
...@@ -49,9 +49,6 @@ namespace CPlusPlus { ...@@ -49,9 +49,6 @@ namespace CPlusPlus {
class CPLUSPLUS_EXPORT Overview class CPLUSPLUS_EXPORT Overview
{ {
Overview(const Overview &other);
void operator =(const Overview &other);
public: public:
Overview(); Overview();
......
This diff is collapsed.
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#ifndef CPPPOINTERFORMATTER_H
#define CPPPOINTERFORMATTER_H
#include "cpptools_global.h"
#include <AST.h>
#include <ASTVisitor.h>
#include <Overview.h>
#include <Symbols.h>
#include <cpptools/cpprefactoringchanges.h>
#include <utils/changeset.h>
namespace CppTools {
using namespace CPlusPlus;
using namespace CppTools;
using Utils::ChangeSet;
typedef Utils::ChangeSet::Range Range;
/*!
\class CppTools::PointerDeclarationFormatter
\brief Rewrite pointer or reference declarations accordingly to an Overview.
The following constructs are supported:
\list
\o Simple declarations
\o Parameters and return types of function declarations and definitions
\o Control flow statements like if, while, for, foreach
\endlist
*/
class CPPTOOLS_EXPORT PointerDeclarationFormatter: protected ASTVisitor
{
public:
/*!
\enum PointerDeclarationFormatter::CursorHandling
This simplifies the QuickFix implementation.
\value RespectCursor
Consider the cursor position / selection of the CppRefactoringFile
for rejecting edit operation candidates for the resulting ChangeSet.
If there is a selection, the range of the edit operation candidate
should be inside the selection. If there is no selection, the cursor
position should be within the range of the edit operation candidate.
\value IgnoreCursor
Cursor position or selection of the CppRefactoringFile will
_not_ be considered for aborting.
*/
enum CursorHandling { RespectCursor, IgnoreCursor };
explicit PointerDeclarationFormatter(const CppRefactoringFilePtr refactoringFile,
const Overview &overview,
CursorHandling cursorHandling = IgnoreCursor);
/*!
Returns a ChangeSet for applying the formatting changes.
The ChangeSet is empty if it was not possible to rewrite anything.
*/
ChangeSet format(AST *ast)
{
if (ast)
accept(ast);
return m_changeSet;
}
protected:
bool visit(SimpleDeclarationAST *ast);
bool visit(FunctionDefinitionAST *ast);
bool visit(ParameterDeclarationAST *ast);
bool visit(IfStatementAST *ast);
bool visit(WhileStatementAST *ast);
bool visit(ForStatementAST *ast);
bool visit(ForeachStatementAST *ast);
private:
void processIfWhileForStatement(ExpressionAST *expression, Symbol *symbol);
void checkAndRewrite(Symbol *symbol, Range range, unsigned charactersToRemove = 0);
QString rewriteDeclaration(FullySpecifiedType type, const Name *name) const;
const CppRefactoringFilePtr m_cppRefactoringFile;
const Overview &m_overview;
const CursorHandling m_cursorHandling;
ChangeSet m_changeSet;
};
} // namespace CppTools
#endif // CPPPOINTERFORMATTER_H
This diff is collapsed.
...@@ -47,7 +47,8 @@ HEADERS += completionsettingspage.h \ ...@@ -47,7 +47,8 @@ HEADERS += completionsettingspage.h \
ModelManagerInterface.h \ ModelManagerInterface.h \
TypeHierarchyBuilder.h \ TypeHierarchyBuilder.h \
cppindexingsupport.h \ cppindexingsupport.h \
builtinindexingsupport.h builtinindexingsupport.h \
cpppointerdeclarationformatter.h
SOURCES += completionsettingspage.cpp \ SOURCES += completionsettingspage.cpp \
cppclassesfilter.cpp \ cppclassesfilter.cpp \
...@@ -88,7 +89,8 @@ SOURCES += completionsettingspage.cpp \ ...@@ -88,7 +89,8 @@ SOURCES += completionsettingspage.cpp \
ModelManagerInterface.cpp \ ModelManagerInterface.cpp \
TypeHierarchyBuilder.cpp \ TypeHierarchyBuilder.cpp \
cppindexingsupport.cpp \ cppindexingsupport.cpp \
builtinindexingsupport.cpp builtinindexingsupport.cpp \
cpppointerdeclarationformatter.cpp
FORMS += completionsettingspage.ui \ FORMS += completionsettingspage.ui \
cppfilesettingspage.ui \ cppfilesettingspage.ui \
...@@ -99,7 +101,8 @@ equals(TEST, 1) { ...@@ -99,7 +101,8 @@ equals(TEST, 1) {
cppcodegen_test.cpp \ cppcodegen_test.cpp \
cppcompletion_test.cpp \ cppcompletion_test.cpp \
cppmodelmanager_test.cpp \ cppmodelmanager_test.cpp \
modelmanagertesthelper.cpp modelmanagertesthelper.cpp \
cpppointerdeclarationformatter_test.cpp
HEADERS += \ HEADERS += \
modelmanagertesthelper.h modelmanagertesthelper.h
......
...@@ -74,6 +74,8 @@ QtcPlugin { ...@@ -74,6 +74,8 @@ QtcPlugin {
"cppmodelmanager.h", "cppmodelmanager.h",
"cppqtstyleindenter.cpp", "cppqtstyleindenter.cpp",
"cppqtstyleindenter.h", "cppqtstyleindenter.h",
"cpppointerdeclarationformatter.cpp",
"cpppointerdeclarationformatter.h",
"cpprefactoringchanges.cpp", "cpprefactoringchanges.cpp",
"cpprefactoringchanges.h", "cpprefactoringchanges.h",
"cppsemanticinfo.cpp", "cppsemanticinfo.cpp",
...@@ -110,7 +112,8 @@ QtcPlugin { ...@@ -110,7 +112,8 @@ QtcPlugin {
"cppcodegen_test.cpp", "cppcodegen_test.cpp",
"cppcompletion_test.cpp", "cppcompletion_test.cpp",
"cppmodelmanager_test.cpp", "cppmodelmanager_test.cpp",
"modelmanagertesthelper.cpp", "modelmanagertesthelper.h" "modelmanagertesthelper.cpp", "modelmanagertesthelper.h",
"cpppointerdeclarationformatter_test.cpp"
] ]
cpp.defines: outer.concat(['SRCDIR="' + FileInfo.path(filePath) + '"']) cpp.defines: outer.concat(['SRCDIR="' + FileInfo.path(filePath) + '"'])
......
...@@ -74,9 +74,8 @@ public: ...@@ -74,9 +74,8 @@ public:
private slots: private slots:
void switchHeaderSource(); void switchHeaderSource();
#ifdef WITH_TESTS
// codegen tests #ifdef WITH_TESTS
void test_codegen_public_in_empty_class(); void test_codegen_public_in_empty_class();
void test_codegen_public_in_nonempty_class(); void test_codegen_public_in_nonempty_class();
void test_codegen_public_before_protected(); void test_codegen_public_before_protected();
...@@ -114,6 +113,15 @@ private slots: ...@@ -114,6 +113,15 @@ private slots:
void test_completion_instantiate_nested_class_when_enclosing_is_template(); void test_completion_instantiate_nested_class_when_enclosing_is_template();
void test_completion_instantiate_nested_of_nested_class_when_enclosing_is_template(); void test_completion_instantiate_nested_of_nested_class_when_enclosing_is_template();
void test_format_pointerdeclaration_in_simpledeclarations();
void test_format_pointerdeclaration_in_simpledeclarations_data();
void test_format_pointerdeclaration_in_controlflowstatements();
void test_format_pointerdeclaration_in_controlflowstatements_data();
void test_format_pointerdeclaration_multiple_declarators();
void test_format_pointerdeclaration_multiple_declarators_data();
void test_format_pointerdeclaration_multiple_matches();
void test_format_pointerdeclaration_multiple_matches_data();
void test_modelmanager_paths(); void test_modelmanager_paths();
void test_modelmanager_framework_headers(); void test_modelmanager_framework_headers();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment