ReSharper C++
The Visual Studio Extension for C++ Development
ReSharper C++ 2020.3: UnrealHeaderTool, C++20 Comparisons, Push-to-Hint Inlay Hints
Please welcome ReSharper C++ 2020.3, our final release of this year!
We’ve got many cool things you won’t want to miss, like the UnrealHeaderTool integration, new C++20 features, navigation between matching preprocessor directives, fuzzy text search, Push-to-Hint mode for inlay hints, and many other enhancements in the latest update.
Begin your free 30-day trial today, or update to this version immediately with an active subscription of ReSharper, ReSharper C++, dotUltimate, or the All Products Pack. The brand new build is available for download from our website or the Toolbox App.
Here is a quick overview of the new features and improvements in v2020.3:
- Unreal Engine: UnrealHeaderTool integration, an improved project model, and new inspections based on control flow analysis in HLSL shader files.
- C++20 support: C++20 comparison rules, quick-fixes for the ranges library, and standard conformance updates.
- Coding assistance and completion: improvements in import completion and a context action to invert a ternary expression.
- Navigation and search: navigation for matching preprocessor directives, fuzzy text search, Peek Implementation, and Peek Base Symbols.
- Code analysis: new modernizing inspections and Clang-Tidy 11.
- Push-to-Hint: a new visibility mode for inlay hints.
-
Other changes: updates to Catch2 support and
/external:*
compiler switches.
Unreal Engine
ReSharper C++ 2020.3 provides seamless integration with UnrealHeaderTool. It runs the tool in the background as a separate process to check the file you are editing, and it shows the same errors and warnings that you would normally see at compile time. The code analysis results are displayed in the editor, just like any other ReSharper C++ inspection:
This should save you some time, right?
UnrealHeaderTool can detect lots of different issues in your code, such as when you are using a specific meta tag without the required reflection specifier, when you’re using the GENERATED_BODY
macro in a private scope, when an invalid entity is exposed to a blueprint, and so on. To learn more about the integration details and configuration, please check out this blog post. Or you can watch this short demo of the UnrealHeaderTool integration in action:
To ensure you’re up to date, ReSharper C++ now tracks Unreal Engine properties in real time and regenerates the project model as soon as you save any changes in .Build.cs
, .Target.cs
, .uproject
, or .uplugin
files.
The full power of ReSharper’s control flow analysis now comes to HLSL shader files, including warnings about unreachable code, uninitialized variables, redundant control flow jumps and conditional branches, and much more. To get it to work for HLSL, we’ve also added support for HLSL-specific input modifiers that identify a function argument as an input, an output, or both.
We’ve also improved the conformance to the Unreal Engine coding standard. For example, our default settings for Unreal Engine projects now set the tab size to 4 characters (we still auto-detect your formatting and will not force you to use tabs if you prefer spaces). ReSharper C++ also now suggests using MoveTemp
(Unreal Engine’s equivalent of std::move
) for casting to an rvalue reference.
Never miss when you need to regenerate the project files. ReSharper C++ will warn you when the Unreal Engine version file cannot be found, or when the engine version you use does not match the version referenced in your game project.
You can also try out all these features in the early preview of our new standalone Rider for Unreal Engine IDE. It is powered by ReSharper C++ and is currently available absolutely free – simply register and start coding!
C++20 support
With the 2020.3 update, ReSharper C++ brings full support for C++20’s comparison rules. This includes a significant change to how comparisons work, where the language is allowed to rewrite a comparison expression or reverse the order of arguments.
You can now consult the tooltip to learn how an expression has been rewritten or why a defaulted comparison operator in your class has been implicitly deleted, and view the list of considered overloading candidates when a comparison operator cannot be resolved.
There are also new quick-fixes to add the required #include <compare>
directive and create a member or a friend version of a comparison operator. Check out this blog post for an overview of the C++20 changes to comparisons and how ReSharper C++ can help you work with them.
In addition to support for C++20’s comparisons, we’ve created two new inspections with quick-fixes to help you adopt the new ranges library:
-
An algorithm operating on ranges can be used.
-
std::views::keys/values
can be used.
C++20 support has also been improved according to the standard conformance updates in Visual Studio 16.8. In particular, ReSharper C++ now supports both the standard and the extension modes for C++ coroutines, along with the new <coroutine>
header.
Coding assistance and completion
Thanks to the Import Symbol completion, ReSharper C++’s completion list also suggests classes from headers that are not included in the current file. To make it even more useful, we’ve added the following enhancements:
- The completion list now includes suitable members of incomplete classes.
-
There is a new option to add an elaborated type specifier for the corresponding class.
A new context action helps you invert ternary operator expressions:
The "Join declaration and assignment" quick-fix is now available for cases when a local variable is reassigned in all paths before being read:
We’ve improved argument code completion for library functions that accept macro constants. Library macro constants that are applicable to the current argument are now prioritized in the completion list. This heuristic works for functions from the standard library, WinAPI, and OpenGL.
Navigation and Search
The most commonly used action when navigating through source code is Go to Declaration. To make the code navigation experience even smoother, Go to Declaration can now be used to quickly jump between matching preprocessor directives:
-
Navigate between
#define
and#undef
of the same macro inside a single file.
-
Navigate between the directives that form a single conditional preprocessing block.
You can now also use Go to Declaration on an override keyword to navigate to the base function, instead of invoking the separate Base Symbols action on the function’s name:
In addition to its regular search, Find Text now performs a fuzzy search, which means it takes possible typos and missing words into account. This feature can be very helpful if you are looking for a certain format string used as an argument to a text formatting function like printf
or std::format
.
Peek Implementations and Peek Base Symbols come to C++, allowing you to view and edit code in a popup window without switching away from the code you’re writing:
-
Press
Ctrl+Alt+Q
or use the ReSharper | Navigate | Peek menu to peek at implementations.
-
Press
Shift+Alt+Q
or use the ReSharper | Navigate | Peek menu to peek at base symbols.
For better readability, File Structure now uses the C++17 syntax for nested namespaces even if you have not yet adopted the new syntax in your codebase:
ReSharper C++ continues to improve its C++/CLI support. For example, Go to Derived Symbols now works for get
/set
functions inside C++/CLI properties and add
/remove
functions inside C++/CLI events:
Code analysis
In addition to the already mentioned C++20 inspections and control flow analysis for HLSL shader files, we’ve introduced a new inspection to suggest replacing usages of standard algorithms that accept a pair of iterators with equivalent algorithms that accept an iterator and a count where possible:
The bundled Clang-Tidy binary has been updated to Clang 11, adding new checks and compiler diagnostics from the latest LLVM release.
Push-to-Hint
ReSharper C++ provides many kinds of inlay hints. While all of the hints are useful in certain scenarios, sometimes they can be overwhelming. To help address this, we’ve come up with a new "Push-to-Hint" mechanism for inlay hints. In the Push-to-Hint visibility mode, hints are only shown when you either press and hold Ctrl
, or press Ctrl
twice:
We’ve made sure that the visibility mode can be configured separately for every kind of C++ inlay hint. You can quickly change the visibility mode for a given hint using the context menu, or head to the new option pages under Environment | Inlay Hints | C++ to check out all the settings.
Other changes
ReSharper C++ now supports the TEMPLATE_TEST_CASE
and TEMPLATE_PRODUCT_TEST_CASE
macros that were updated in Catch 2.8, as well as the recently introduced TEMPLATE_TEST_CASE_SIG
and TEMPLATE_PRODUCT_TEST_CASE_SIG
:
ReSharper C++ will now be able to pick up and use the include paths to third-party libraries specified via /external:*
compiler switches.
And last but not least, we’ve boosted the performance of Find Usages and Rename when these actions are used on private class members. If the containing class does not have any friend classes, ReSharper C++ will now look for class member usages only in files that contain the class definition and the definitions of its member functions. For huge code bases, this optimization makes Find Usages 50, and sometimes even up to 100, times faster (for example, for the Data and Length fields of the LLVM StringRef class).
The full list of new features and bug fixes in this release includes more than 190 issues and is available in our issue tracker. Feel free to submit a new feature request or upvote any existing ones. Your feedback is always welcome!
Also, more changes are coming from the ReSharper platform, so take a look at What’s New in ReSharper, as well.
Get ReSharper C++ 2020.3 and let us know what you think!
Your ReSharper C++ team
JetBrains
The Drive to Develop