xref: /openbsd-src/gnu/llvm/clang/tools/libclang/CXStoredDiagnostic.cpp (revision e5dd70708596ae51455a0ffa086a00c5b29f8583)
1*e5dd7070Spatrick //===- CXStoredDiagnostic.cpp - Diagnostics C Interface -------------------===//
2*e5dd7070Spatrick //
3*e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5*e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*e5dd7070Spatrick //
7*e5dd7070Spatrick //===----------------------------------------------------------------------===//
8*e5dd7070Spatrick //
9*e5dd7070Spatrick // Implements part of the diagnostic functions of the Clang C interface.
10*e5dd7070Spatrick //
11*e5dd7070Spatrick //===----------------------------------------------------------------------===//
12*e5dd7070Spatrick 
13*e5dd7070Spatrick #include "CIndexDiagnostic.h"
14*e5dd7070Spatrick #include "CIndexer.h"
15*e5dd7070Spatrick #include "CXTranslationUnit.h"
16*e5dd7070Spatrick #include "CXSourceLocation.h"
17*e5dd7070Spatrick #include "CXString.h"
18*e5dd7070Spatrick 
19*e5dd7070Spatrick #include "clang/Basic/DiagnosticIDs.h"
20*e5dd7070Spatrick #include "clang/Frontend/ASTUnit.h"
21*e5dd7070Spatrick #include "llvm/ADT/Twine.h"
22*e5dd7070Spatrick 
23*e5dd7070Spatrick using namespace clang;
24*e5dd7070Spatrick using namespace clang::cxloc;
25*e5dd7070Spatrick 
getSeverity() const26*e5dd7070Spatrick CXDiagnosticSeverity CXStoredDiagnostic::getSeverity() const {
27*e5dd7070Spatrick   switch (Diag.getLevel()) {
28*e5dd7070Spatrick     case DiagnosticsEngine::Ignored: return CXDiagnostic_Ignored;
29*e5dd7070Spatrick     case DiagnosticsEngine::Note:    return CXDiagnostic_Note;
30*e5dd7070Spatrick     case DiagnosticsEngine::Remark:
31*e5dd7070Spatrick     // The 'Remark' level isn't represented in the stable API.
32*e5dd7070Spatrick     case DiagnosticsEngine::Warning: return CXDiagnostic_Warning;
33*e5dd7070Spatrick     case DiagnosticsEngine::Error:   return CXDiagnostic_Error;
34*e5dd7070Spatrick     case DiagnosticsEngine::Fatal:   return CXDiagnostic_Fatal;
35*e5dd7070Spatrick   }
36*e5dd7070Spatrick 
37*e5dd7070Spatrick   llvm_unreachable("Invalid diagnostic level");
38*e5dd7070Spatrick }
39*e5dd7070Spatrick 
getLocation() const40*e5dd7070Spatrick CXSourceLocation CXStoredDiagnostic::getLocation() const {
41*e5dd7070Spatrick   if (Diag.getLocation().isInvalid())
42*e5dd7070Spatrick     return clang_getNullLocation();
43*e5dd7070Spatrick 
44*e5dd7070Spatrick   return translateSourceLocation(Diag.getLocation().getManager(),
45*e5dd7070Spatrick                                  LangOpts, Diag.getLocation());
46*e5dd7070Spatrick }
47*e5dd7070Spatrick 
getSpelling() const48*e5dd7070Spatrick CXString CXStoredDiagnostic::getSpelling() const {
49*e5dd7070Spatrick   return cxstring::createRef(Diag.getMessage());
50*e5dd7070Spatrick }
51*e5dd7070Spatrick 
getDiagnosticOption(CXString * Disable) const52*e5dd7070Spatrick CXString CXStoredDiagnostic::getDiagnosticOption(CXString *Disable) const {
53*e5dd7070Spatrick   unsigned ID = Diag.getID();
54*e5dd7070Spatrick   StringRef Option = DiagnosticIDs::getWarningOptionForDiag(ID);
55*e5dd7070Spatrick   if (!Option.empty()) {
56*e5dd7070Spatrick     if (Disable)
57*e5dd7070Spatrick       *Disable = cxstring::createDup((Twine("-Wno-") + Option).str());
58*e5dd7070Spatrick     return cxstring::createDup((Twine("-W") + Option).str());
59*e5dd7070Spatrick   }
60*e5dd7070Spatrick 
61*e5dd7070Spatrick   if (ID == diag::fatal_too_many_errors) {
62*e5dd7070Spatrick     if (Disable)
63*e5dd7070Spatrick       *Disable = cxstring::createRef("-ferror-limit=0");
64*e5dd7070Spatrick     return cxstring::createRef("-ferror-limit=");
65*e5dd7070Spatrick   }
66*e5dd7070Spatrick 
67*e5dd7070Spatrick   return cxstring::createEmpty();
68*e5dd7070Spatrick }
69*e5dd7070Spatrick 
getCategory() const70*e5dd7070Spatrick unsigned CXStoredDiagnostic::getCategory() const {
71*e5dd7070Spatrick   return DiagnosticIDs::getCategoryNumberForDiag(Diag.getID());
72*e5dd7070Spatrick }
73*e5dd7070Spatrick 
getCategoryText() const74*e5dd7070Spatrick CXString CXStoredDiagnostic::getCategoryText() const {
75*e5dd7070Spatrick   unsigned catID = DiagnosticIDs::getCategoryNumberForDiag(Diag.getID());
76*e5dd7070Spatrick   return cxstring::createRef(DiagnosticIDs::getCategoryNameFromID(catID));
77*e5dd7070Spatrick }
78*e5dd7070Spatrick 
getNumRanges() const79*e5dd7070Spatrick unsigned CXStoredDiagnostic::getNumRanges() const {
80*e5dd7070Spatrick   if (Diag.getLocation().isInvalid())
81*e5dd7070Spatrick     return 0;
82*e5dd7070Spatrick 
83*e5dd7070Spatrick   return Diag.range_size();
84*e5dd7070Spatrick }
85*e5dd7070Spatrick 
getRange(unsigned int Range) const86*e5dd7070Spatrick CXSourceRange CXStoredDiagnostic::getRange(unsigned int Range) const {
87*e5dd7070Spatrick   assert(Diag.getLocation().isValid());
88*e5dd7070Spatrick   return translateSourceRange(Diag.getLocation().getManager(),
89*e5dd7070Spatrick                               LangOpts,
90*e5dd7070Spatrick                               Diag.range_begin()[Range]);
91*e5dd7070Spatrick }
92*e5dd7070Spatrick 
getNumFixIts() const93*e5dd7070Spatrick unsigned CXStoredDiagnostic::getNumFixIts() const {
94*e5dd7070Spatrick   if (Diag.getLocation().isInvalid())
95*e5dd7070Spatrick     return 0;
96*e5dd7070Spatrick   return Diag.fixit_size();
97*e5dd7070Spatrick }
98*e5dd7070Spatrick 
getFixIt(unsigned FixIt,CXSourceRange * ReplacementRange) const99*e5dd7070Spatrick CXString CXStoredDiagnostic::getFixIt(unsigned FixIt,
100*e5dd7070Spatrick                                       CXSourceRange *ReplacementRange) const {
101*e5dd7070Spatrick   const FixItHint &Hint = Diag.fixit_begin()[FixIt];
102*e5dd7070Spatrick   if (ReplacementRange) {
103*e5dd7070Spatrick     // Create a range that covers the entire replacement (or
104*e5dd7070Spatrick     // removal) range, adjusting the end of the range to point to
105*e5dd7070Spatrick     // the end of the token.
106*e5dd7070Spatrick     *ReplacementRange = translateSourceRange(Diag.getLocation().getManager(),
107*e5dd7070Spatrick                                              LangOpts, Hint.RemoveRange);
108*e5dd7070Spatrick   }
109*e5dd7070Spatrick   return cxstring::createDup(Hint.CodeToInsert);
110*e5dd7070Spatrick }
111*e5dd7070Spatrick 
112