Modules*de C++20
ReSharper C++ 2022.3 apporte une prise en charge expérimentale de ll'une des plus importantes mises à jour de C++ depuis la norme originale C++98*: les modules de C++20. Les modules introduisent un nouveau modèle de compilation dans lequel, au lieu d'utiliser des fichiers d'en-tête, vous divisez votre code en composants compilés de façon indépendante.
Dans le nouveau code, vous devez utiliser des modules nommés, qui déclarent explicitement leur interface dans des fichiers d'interface de module .ixx. Mais afin de faciliter la transition, C++20 propose également un moyen d'utiliser des fichiers d'en-tête existants, au comportement bien établi, en tant que modules à l'aide d'unités d'en-tête. Ces deux façons de créer et d'utiliser des modules sont maintenant prises en charge dans ReSharper C++.
Tout d'abord, ReSharper C++ gère désormais correctement la nouvelle syntaxe : les déclarations module qui introduisent les modules et partitions de modules, les déclarations import qui utilisent d'autres modules, et l'exportation export d'entités à partir des interfaces de modules. Et comme pour les directives include, ReSharper C++ vous avertira des noms de modules ou des chemins non résolus dans les déclarations import.
Dans la navigation du code, toutes les fonctionnalités que vous utilisez habituellement fonctionnent maintenant pour les entités importées à partir des modules. Grâce à la prise en charge des déclarations de modules, vous pouvez désormais utiliser l'action Go to Declaration sur le nom du module dans les déclarations import, naviguer vers les déclarations de modules à partir de File Structure et rechercher des modules avec Go to Symbol.
Pour créer rapidement un module, vous pouvez utiliser un nouveau modèle de fichier intégré*: Module interface unit. Pour créer un nouveau fichier à partir d'un modèle de fichier, utilisez le raccourci Ctrl+Alt+Ins ou sélectionnez ReSharper | Edit | Create New File dans le menu principal.
Parmi les fonctionnalités bénéficiant de la prise en charge des modules, vous trouverez la saisie semi-automatique du code. La liste de saisie semi-automatique du code inclut maintenant les éléments de tous les modules et unités d'en-tête importés.
Ce travail est en cours, il y a donc encore quelques limitations.
Prise en charge de C++
JetBrains a introduit la prise en charge de la directive #pragma pack, qui modifie l'alignement actuel des classes et des structures. ReSharper C++ calcule désormais correctement la taille des structures empaquetées.
Dans ReSharper C++ 2022.2, JetBrains a implémenté de nombreuses améliorations pour travailler avec des appels de fonctions de type emplace et make. Ces fonctionnalités étaient toutefois limitées aux classes et fonctions de la bibliothèque standard. Dans cette version, ReSharper C++ est en mesure d'afficher des informations sur les paramètres et des conseils d'insertion pour toute fonction similaire définie dans votre code.
Pour que ReSharper C++ sache qu'une fonction implique un appel à un constructeur, vérifiez que le paramètre du modèle de fonction est contraint (à l'aide de SFINAE ou d'une clause requires ) à être constructible à partir du paquet d'arguments donné.
ReSharper C++ 2022.3 inaugure la prise en charge de la version C++20 étendue de [[nodiscard]], qui inclut la raison pour laquelle une fonction ou une classe a été signalée par l'attribut. Vous recevrez désormais un avertissement plus clair précisant la raison lorsque le résultat d'un appel de fonction n'est pas utilisé.
L'évaluation au moment de la compilation a également été améliorée dans cette version. ReSharper C++ gère désormais correctement plusieurs formes d'initialisation d'objets, notamment l'évaluation des constructeurs de tout type (par défaut, générés implicitement, hérités et définis par l'utilisateur).
Nous avons également amélioré la prise en charge des conventions d'appel. ReSharper C++ comprend maintenant le style GNU pour spécifier les conventions d'appel dans les déclarations de fonction pour les compilateurs prenant en charge cette syntaxe (void __attribute__((stdcall)) bar()).
Unreal Engine
Si une ressource est affectée par le renommage d'un symbole, Unreal Engine ne la reconnaîtra plus. Pour éviter la perte de données, ReSharper C++ suggère d'ajouter une redirection Core Redirect lorsque vous lancez une refactorisation Rename. Si elle est acceptée, le fichier .ini correspondant est automatiquement actualisé.
L'option Add Core Redirect était déjà disponible pour UCLASS et UPROPERTY, elle fonctionne à présent également pour UFUNCTION, USTRUCT et UENUM.
ReSharper C++ 2022.3 inaugure un nouveau conseil d'insertion spécifique à Blueprint. Vous pouvez maintenant vérifier rapidement le nombre de blueprints qui utilisent une fonction marquée par le spécificateur BlueprintCallable et obtenir une liste de toutes ses utilisations à partir du menu contextuel du conseil.
ReSharper C++ ne propose plus les entités indésirables des en-têtes système et des fichiers de shaders dans les suggestions d'auto-importation. Vous pouvez activer les suggestions d'système dans Options | Code Editing | C++ | Unreal Engine.
ReSharper C++ 2022.3 inclut également des mises à jour pour la dernière version d'Unreal Engine 5.1.
Formatage du code
ReSharper C++ 2022.3 propose une intégration fluide de clang-format en tant qu'outil de mise en forme alternatif du code. Vous pouvez maintenant basculer entre le moteur de mise en forme propre à ReSharper et сlang-format lors de la mise en forme de vos fichiers.
ReSharper C++ exécute le binaire clang-format dans un processus distinct, ce qui garantit une compatibilité totale avec l'outil de mise en forme standard de l'industrie, ainsi que de meilleures performances et un plus large éventail d'options de mise en forme.
Par défaut, ReSharper C++ utilise le binaire intégré clang-format. Vous pouvez configurer ReSharper C++ pour qu'il exécute n'importe quel autre binaire clang-format sur la page Code Editing | C++ | Formatting Style | General des options de ReSharper.
Pour ceux qui préfèrent l'outil de mise en forme de ReSharper ou qui souhaitent définir rapidement le style de mise en forme grâce à Detect formatting settings, ReSharper C++ 2022.3 inaugure quelques nouvelles options de mise en forme à configurer*:
- Espaces avant et après les ellipses (…) dans les paquets de paramètres.
- Nombre de lignes vides acceptables dans les déclarations et dans le reste du code.
- Si les lignes vides sont conservées ou supprimées après une accolade ouvrante ({) et avant une accolade fermante dans les déclarations et dans le reste du code.
- Lignes vides avant et après les spécificateurs d'accès.
- Alignement des initialisateurs d'énumérateurs dans les colonnes.
Assistance au codage
ReSharper C++ affiche désormais l'origine d'une fonction dans les infos sur les paramètres et autres infobulles. Il permet donc d'identifier si une fonction est générée implicitement (comme par exemple les constructeurs ou les opérateurs d'affectation), intégrée (comme par exemple l'opérateur + pour les types fondamentaux) ou intrinsèque au compilateur (par exemple les fonctions préfixées par __builtin_ ).
Deux nouveaux ajouts utiles améliorent la lisibilité des conditions*:
- Une action contextuelle qui remplace && par || et inversement dans les expressions booléennes, conformément aux lois de De Morgan.
- Une inspection avec un correctif rapide qui simplifie les expressions de comparaison négatives.
JetBrains a également mis à jour le binaire Clang-Tidy intégré vers Clang 15, en ajoutant de nouvelles vérifications provenant de la dernière version de LLVM.
En savoir plus sur ReSharper C++ et télécharger