Difference between revisions of "Documentation/Nightly/Developers/Tutorials/MigrationGuide/ObsoleteCodeRemoval"
(→Obsolete Code Removal: NULL and 0 to nullptr) |
|||
| Line 168: | Line 168: | ||
self.horizontalHeader().setSectionResizeMode(0, qt.QHeaderView.Stretch) | self.horizontalHeader().setSectionResizeMode(0, qt.QHeaderView.Stretch) | ||
| + | |||
| + | ===Replace NULL and 0 for nullptr (C++11)=== | ||
| + | |||
| + | Two steps, first use clang-tidy for replacing in all the compiled code. | ||
| + | Then, do a manual replace for code not compiled (templated headers, comments, ...) | ||
| + | |||
| + | ====Automatically: Steps to run clang-tidy==== | ||
| + | |||
| + | This will iteratively check files for updates. It takes a while. The sources are only modified at the end of the process, so you could cancel anytime before with no consequences. | ||
| + | # Compile Slicer with the CMake option -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON to generate the file compile_commands.json at configuration time. | ||
| + | # Run clang-tidy on the generated compile_commands.json (in the build folder: Slicer-build) | ||
| + | run-clang-tidy.py -header-filter='.*' -checks='-*,modernize-use-nullptr' -fix | ||
| + | [http://clang.llvm.org/extra/clang-tidy/ clang-tidy] is a tool from clang. In Archlinux: sudo pacman -S clang, in other distros might be clang-extra-tools or similar. | ||
| + | |||
| + | clang-tidy will substitute NULL and 0 for nullptr when appropiate. It is an iterative process, so it make take time. Also, it replaces all the compiled code, including external dependencies. | ||
| + | It is recommended to do a fresh build with the modified code, for testing it without modifications in any external repo. | ||
| + | |||
| + | ====Manual==== | ||
| + | |||
| + | After clang-tidy has modified the compiled code with the help of compile_commands.json, there will still be ignored instances of NULL and 0 in some headers, and comments. | ||
| + | |||
| + | Manually replace with the following regex to change those. | ||
| + | |||
| + | 1) Change NULL to nullptr except when there is a quote or an underscore in | ||
| + | front of it. And there is not a quote after. | ||
| + | |||
| + | ack "NULL" -l --print0 | xargs -0 -n 1 sed -i 's/\([^\"\_]\)NULL\([^\"]\)/\1nullptr\2/g' | ||
| + | |||
| + | 2) The same than before but match end of line NULL | ||
| + | ack "NULL" -l --print0 | xargs -0 -n 1 sed -i 's/\([^\"\_]\)NULL$/\1nullptr/g' | ||
Revision as of 15:38, 11 March 2019
Home < Documentation < Nightly < Developers < Tutorials < MigrationGuide < ObsoleteCodeRemovalContents
Obsolete Code Removal
This section documents suggested code changes after removing support for a particular features. Each category has a short description, code snippets, a suggested upgrade path, and references to relevant commits.
Qt>=5.0.0: Remove obsolete code supporting Qt4 plugin infrastructure (C++)
These changes apply to Qt loadable modules and designer plugins
qSlicerNAMEModuleWidgetsPlugin.h
Before:
#include "vtkSlicerConfigure.h" // For Slicer_HAVE_QT5
// Qt includes
#ifdef Slicer_HAVE_QT5
#include <QtUiPlugin/QDesignerCustomWidgetCollectionInterface>
#else
#include <QDesignerCustomWidgetCollectionInterface>
#endif
[...]
class Q_SLICER_MODULE_SUBJECTHIERARCHY_WIDGETS_PLUGINS_EXPORT qSlicerSubjectHierarchyModuleWidgetsPlugin
: public QObject
, public QDesignerCustomWidgetCollectionInterface
{
Q_OBJECT
#ifdef Slicer_HAVE_QT5
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetCollectionInterface")
#endif
Q_INTERFACES(QDesignerCustomWidgetCollectionInterface);
After:
// Qt includes
#include <QtUiPlugin/QDesignerCustomWidgetCollectionInterface>
[...]
class Q_SLICER_MODULE_SUBJECTHIERARCHY_WIDGETS_PLUGINS_EXPORT qSlicerSubjectHierarchyModuleWidgetsPlugin
: public QObject
, public QDesignerCustomWidgetCollectionInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetCollectionInterface")
Q_INTERFACES(QDesignerCustomWidgetCollectionInterface);
qSlicerNAMEModule.h
Before:
class Q_SLICER_QTMODULES_SUBJECTHIERARCHY_EXPORT qSlicerSubjectHierarchyModule :
public qSlicerLoadableModule
{
Q_OBJECT
#ifdef Slicer_HAVE_QT5
Q_PLUGIN_METADATA(IID "org.slicer.modules.loadable.qSlicerLoadableModule/1.0");
#endif
After:
class Q_SLICER_QTMODULES_SUBJECTHIERARCHY_EXPORT qSlicerSubjectHierarchyModule :
public qSlicerLoadableModule
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.slicer.modules.loadable.qSlicerLoadableModule/1.0");
qSlicerNAMEModuleWidgetsAbstractPlugin.h
Before:
#include <QtGlobal>
#if(QT_VERSION < QT_VERSION_CHECKS(5, 0, 0))
#include <QDesignerCustomWidgetInterface>
#else
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
#endif
[...]
class Q_SLICER_MODULE_SEGMENTATIONS_WIDGETS_PLUGINS_EXPORT qSlicerSegmentationsModuleWidgetsAbstractPlugin
: public QDesignerCustomWidgetInterface
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetInterface")
#endif
Q_INTERFACES(QDesignerCustomWidgetInterface);
}
After:
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
[...]
class Q_SLICER_MODULE_SEGMENTATIONS_WIDGETS_PLUGINS_EXPORT qSlicerSegmentationsModuleWidgetsAbstractPlugin
: public QDesignerCustomWidgetInterface
{
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetInterface")
Q_INTERFACES(QDesignerCustomWidgetInterface);
}
qSlicerNAMEModule.cxx and qSlicerNAMEModuleWidgetsAbstractPlugin.cxx
Remove:
#if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) #include <QtPlugin> Q_EXPORT_PLUGIN2(customwidgetplugin, qSlicerSegmentationsModuleWidgetsPlugin); #endif
Qt>=5.0.0: Simpler use of QHeaderView::setSectionResizeMode
This migration guide entry is obsolete: Documentation/Nightly/Developers/Tutorials/MigrationGuide#Qt5:_Fix_error:_.E2.80.98class_QHeaderView.E2.80.99_has_no_member_named_.E2.80.98setResizeMode.E2.80.99
Solution for Cpp
Before:
#if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) this->SceneViewTableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch); this->SceneViewTableWidget->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); this->SceneViewTableWidget->horizontalHeader()->setResizeMode(SCENE_VIEW_DESCRIPTION_COLUMN, QHeaderView::Stretch); #else this->SceneViewTableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); this->SceneViewTableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); this->SceneViewTableWidget->horizontalHeader()->setSectionResizeMode(SCENE_VIEW_DESCRIPTION_COLUMN, QHeaderView::Stretch); #endif
After:
this->SceneViewTableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); this->SceneViewTableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); this->SceneViewTableWidget->horizontalHeader()->setSectionResizeMode(SCENE_VIEW_DESCRIPTION_COLUMN, QHeaderView::Stretch);
Solution for Python
Before:
def _setSectionResizeMode(header, *args, **kwargs):
if version.parse(qt.Qt.qVersion()) < version.parse("5.0.0"):
header.setResizeMode(*args, **kwargs)
else:
header.setSectionResizeMode(*args, **kwargs)
[...]
_setSectionResizeMode(self.horizontalHeader(), 0, qt.QHeaderView.Stretch)
After:
self.horizontalHeader().setSectionResizeMode(0, qt.QHeaderView.Stretch)
Replace NULL and 0 for nullptr (C++11)
Two steps, first use clang-tidy for replacing in all the compiled code. Then, do a manual replace for code not compiled (templated headers, comments, ...)
Automatically: Steps to run clang-tidy
This will iteratively check files for updates. It takes a while. The sources are only modified at the end of the process, so you could cancel anytime before with no consequences.
- Compile Slicer with the CMake option -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON to generate the file compile_commands.json at configuration time.
- Run clang-tidy on the generated compile_commands.json (in the build folder: Slicer-build)
run-clang-tidy.py -header-filter='.*' -checks='-*,modernize-use-nullptr' -fix
clang-tidy is a tool from clang. In Archlinux: sudo pacman -S clang, in other distros might be clang-extra-tools or similar.
clang-tidy will substitute NULL and 0 for nullptr when appropiate. It is an iterative process, so it make take time. Also, it replaces all the compiled code, including external dependencies. It is recommended to do a fresh build with the modified code, for testing it without modifications in any external repo.
Manual
After clang-tidy has modified the compiled code with the help of compile_commands.json, there will still be ignored instances of NULL and 0 in some headers, and comments.
Manually replace with the following regex to change those.
1) Change NULL to nullptr except when there is a quote or an underscore in front of it. And there is not a quote after.
ack "NULL" -l --print0 | xargs -0 -n 1 sed -i 's/\([^\"\_]\)NULL\([^\"]\)/\1nullptr\2/g'
2) The same than before but match end of line NULL
ack "NULL" -l --print0 | xargs -0 -n 1 sed -i 's/\([^\"\_]\)NULL$/\1nullptr/g'