//===--- DesignatedInitializers.h - clang-tidy ------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// /// \file /// This file provides utilities for designated initializers. /// //===----------------------------------------------------------------------===// #include "clang/AST/Expr.h" #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/DenseMap.h" namespace clang::tidy::utils { /// Get designators describing the elements of a (syntactic) init list. /// /// Given for example the type /// \code /// struct S { int i, j; }; /// \endcode /// and the definition /// \code /// S s{1, 2}; /// \endcode /// calling `getUnwrittenDesignators` for the initializer list expression /// `{1, 2}` would produce the map `{loc(1): ".i", loc(2): ".j"}`. /// /// It does not produce designators for any explicitly-written nested lists, /// e.g. `{1, .j=2}` would only return `{loc(1): ".i"}`. /// /// It also considers structs with fields of record types like /// `struct T { S s; };`. In this case, there would be designators of the /// form `.s.i` and `.s.j` in the returned map. llvm::DenseMap<clang::SourceLocation, std::string> getUnwrittenDesignators(const clang::InitListExpr *Syn); } // namespace clang::tidy::utils