1b9c1b51eSKate Stone //===-- Language.cpp -------------------------------------------------*- C++
2b9c1b51eSKate Stone //-*-===//
35f9d3106SEnrico Granata //
42946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
52946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
62946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
75f9d3106SEnrico Granata //
85f9d3106SEnrico Granata //===----------------------------------------------------------------------===//
95f9d3106SEnrico Granata 
105f9d3106SEnrico Granata #include <functional>
115f9d3106SEnrico Granata #include <map>
122996d823SEnrico Granata #include <mutex>
135f9d3106SEnrico Granata 
145f9d3106SEnrico Granata #include "lldb/Target/Language.h"
155f9d3106SEnrico Granata 
165f9d3106SEnrico Granata #include "lldb/Core/PluginManager.h"
1763db2395SEnrico Granata #include "lldb/Symbol/SymbolFile.h"
1863db2395SEnrico Granata #include "lldb/Symbol/TypeList.h"
1963db2395SEnrico Granata #include "lldb/Target/Target.h"
20bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
215f9d3106SEnrico Granata 
22c5f28e2aSKamil Rytarowski #include "llvm/Support/Threading.h"
23c5f28e2aSKamil Rytarowski 
245f9d3106SEnrico Granata using namespace lldb;
255f9d3106SEnrico Granata using namespace lldb_private;
26ac49453bSEnrico Granata using namespace lldb_private::formatters;
275f9d3106SEnrico Granata 
285f9d3106SEnrico Granata typedef std::unique_ptr<Language> LanguageUP;
295f9d3106SEnrico Granata typedef std::map<lldb::LanguageType, LanguageUP> LanguagesMap;
305f9d3106SEnrico Granata 
31b9c1b51eSKate Stone static LanguagesMap &GetLanguagesMap() {
325f9d3106SEnrico Granata   static LanguagesMap *g_map = nullptr;
33c5f28e2aSKamil Rytarowski   static llvm::once_flag g_initialize;
345f9d3106SEnrico Granata 
35c5f28e2aSKamil Rytarowski   llvm::call_once(g_initialize, [] {
36b9c1b51eSKate Stone     g_map = new LanguagesMap(); // NOTE: INTENTIONAL LEAK due to global
37b9c1b51eSKate Stone                                 // destructor chain
385f9d3106SEnrico Granata   });
395f9d3106SEnrico Granata 
405f9d3106SEnrico Granata   return *g_map;
415f9d3106SEnrico Granata }
42b9c1b51eSKate Stone static std::mutex &GetLanguagesMutex() {
4316ff8604SSaleem Abdulrasool   static std::mutex *g_mutex = nullptr;
44c5f28e2aSKamil Rytarowski   static llvm::once_flag g_initialize;
455f9d3106SEnrico Granata 
46c5f28e2aSKamil Rytarowski   llvm::call_once(g_initialize, [] {
47b9c1b51eSKate Stone     g_mutex = new std::mutex(); // NOTE: INTENTIONAL LEAK due to global
48b9c1b51eSKate Stone                                 // destructor chain
495f9d3106SEnrico Granata   });
505f9d3106SEnrico Granata 
515f9d3106SEnrico Granata   return *g_mutex;
525f9d3106SEnrico Granata }
535f9d3106SEnrico Granata 
54b9c1b51eSKate Stone Language *Language::FindPlugin(lldb::LanguageType language) {
5516ff8604SSaleem Abdulrasool   std::lock_guard<std::mutex> guard(GetLanguagesMutex());
565f9d3106SEnrico Granata   LanguagesMap &map(GetLanguagesMap());
575f9d3106SEnrico Granata   auto iter = map.find(language), end = map.end();
585f9d3106SEnrico Granata   if (iter != end)
595f9d3106SEnrico Granata     return iter->second.get();
605f9d3106SEnrico Granata 
615f9d3106SEnrico Granata   Language *language_ptr = nullptr;
625f9d3106SEnrico Granata   LanguageCreateInstance create_callback;
635f9d3106SEnrico Granata 
645f9d3106SEnrico Granata   for (uint32_t idx = 0;
65b9c1b51eSKate Stone        (create_callback =
66b9c1b51eSKate Stone             PluginManager::GetLanguageCreateCallbackAtIndex(idx)) != nullptr;
67b9c1b51eSKate Stone        ++idx) {
685f9d3106SEnrico Granata     language_ptr = create_callback(language);
695f9d3106SEnrico Granata 
70b9c1b51eSKate Stone     if (language_ptr) {
715f9d3106SEnrico Granata       map[language] = std::unique_ptr<Language>(language_ptr);
725f9d3106SEnrico Granata       return language_ptr;
735f9d3106SEnrico Granata     }
745f9d3106SEnrico Granata   }
755f9d3106SEnrico Granata 
765f9d3106SEnrico Granata   return nullptr;
775f9d3106SEnrico Granata }
785f9d3106SEnrico Granata 
79566afa0aSRaphael Isemann Language *Language::FindPlugin(llvm::StringRef file_path) {
80566afa0aSRaphael Isemann   Language *result = nullptr;
81566afa0aSRaphael Isemann   ForEach([&result, file_path](Language *language) {
82566afa0aSRaphael Isemann     if (language->IsSourceFile(file_path)) {
83566afa0aSRaphael Isemann       result = language;
84566afa0aSRaphael Isemann       return false;
85566afa0aSRaphael Isemann     }
86566afa0aSRaphael Isemann     return true;
87566afa0aSRaphael Isemann   });
88566afa0aSRaphael Isemann   return result;
89566afa0aSRaphael Isemann }
90566afa0aSRaphael Isemann 
91566afa0aSRaphael Isemann Language *Language::FindPlugin(LanguageType language,
92566afa0aSRaphael Isemann                                llvm::StringRef file_path) {
93566afa0aSRaphael Isemann   Language *result = FindPlugin(language);
94566afa0aSRaphael Isemann   // Finding a language by file path is slower, we so we use this as the
95566afa0aSRaphael Isemann   // fallback.
96566afa0aSRaphael Isemann   if (!result)
97566afa0aSRaphael Isemann     result = FindPlugin(file_path);
98566afa0aSRaphael Isemann   return result;
99566afa0aSRaphael Isemann }
100566afa0aSRaphael Isemann 
101b9c1b51eSKate Stone void Language::ForEach(std::function<bool(Language *)> callback) {
102566afa0aSRaphael Isemann   // If we want to iterate over all languages, we first have to complete the
103566afa0aSRaphael Isemann   // LanguagesMap.
104566afa0aSRaphael Isemann   static llvm::once_flag g_initialize;
105566afa0aSRaphael Isemann   llvm::call_once(g_initialize, [] {
106566afa0aSRaphael Isemann     for (unsigned lang = eLanguageTypeUnknown; lang < eNumLanguageTypes;
107566afa0aSRaphael Isemann          ++lang) {
108566afa0aSRaphael Isemann       FindPlugin(static_cast<lldb::LanguageType>(lang));
109566afa0aSRaphael Isemann     }
110566afa0aSRaphael Isemann   });
111566afa0aSRaphael Isemann 
11216ff8604SSaleem Abdulrasool   std::lock_guard<std::mutex> guard(GetLanguagesMutex());
1135f9d3106SEnrico Granata   LanguagesMap &map(GetLanguagesMap());
114b9c1b51eSKate Stone   for (const auto &entry : map) {
1155f9d3106SEnrico Granata     if (!callback(entry.second.get()))
1165f9d3106SEnrico Granata       break;
1175f9d3106SEnrico Granata   }
1185f9d3106SEnrico Granata }
1195f9d3106SEnrico Granata 
120b9c1b51eSKate Stone bool Language::IsTopLevelFunction(Function &function) { return false; }
1216754e04fSEnrico Granata 
122b9c1b51eSKate Stone lldb::TypeCategoryImplSP Language::GetFormatters() { return nullptr; }
123980c0484SEnrico Granata 
124b9c1b51eSKate Stone HardcodedFormatters::HardcodedFormatFinder Language::GetHardcodedFormats() {
1257cb59e1aSEnrico Granata   return {};
1267cb59e1aSEnrico Granata }
1277cb59e1aSEnrico Granata 
128b9c1b51eSKate Stone HardcodedFormatters::HardcodedSummaryFinder Language::GetHardcodedSummaries() {
1297cb59e1aSEnrico Granata   return {};
1307cb59e1aSEnrico Granata }
1317cb59e1aSEnrico Granata 
1327cb59e1aSEnrico Granata HardcodedFormatters::HardcodedSyntheticFinder
133b9c1b51eSKate Stone Language::GetHardcodedSynthetics() {
1347cb59e1aSEnrico Granata   return {};
1357cb59e1aSEnrico Granata }
1367cb59e1aSEnrico Granata 
1377cb59e1aSEnrico Granata HardcodedFormatters::HardcodedValidatorFinder
138b9c1b51eSKate Stone Language::GetHardcodedValidators() {
1397cb59e1aSEnrico Granata   return {};
1407cb59e1aSEnrico Granata }
1417cb59e1aSEnrico Granata 
142d3233c1eSEnrico Granata std::vector<ConstString>
143b9c1b51eSKate Stone Language::GetPossibleFormattersMatches(ValueObject &valobj,
144b9c1b51eSKate Stone                                        lldb::DynamicValueType use_dynamic) {
145d3233c1eSEnrico Granata   return {};
146d3233c1eSEnrico Granata }
147d3233c1eSEnrico Granata 
148ac49453bSEnrico Granata lldb_private::formatters::StringPrinter::EscapingHelper
149b9c1b51eSKate Stone Language::GetStringPrinterEscapingHelper(
150b9c1b51eSKate Stone     lldb_private::formatters::StringPrinter::GetPrintableElementType
151b9c1b51eSKate Stone         elem_type) {
152ac49453bSEnrico Granata   return StringPrinter::GetDefaultEscapingHelper(elem_type);
153ac49453bSEnrico Granata }
154ac49453bSEnrico Granata 
1550e0984eeSJim Ingham struct language_name_pair {
1560e0984eeSJim Ingham   const char *name;
1570e0984eeSJim Ingham   LanguageType type;
1580e0984eeSJim Ingham };
1590e0984eeSJim Ingham 
160b9c1b51eSKate Stone struct language_name_pair language_names[] = {
1610e0984eeSJim Ingham     // To allow GetNameForLanguageType to be a simple array lookup, the first
1620e0984eeSJim Ingham     // part of this array must follow enum LanguageType exactly.
1630e0984eeSJim Ingham     {"unknown", eLanguageTypeUnknown},
1640e0984eeSJim Ingham     {"c89", eLanguageTypeC89},
1650e0984eeSJim Ingham     {"c", eLanguageTypeC},
1660e0984eeSJim Ingham     {"ada83", eLanguageTypeAda83},
1670e0984eeSJim Ingham     {"c++", eLanguageTypeC_plus_plus},
1680e0984eeSJim Ingham     {"cobol74", eLanguageTypeCobol74},
1690e0984eeSJim Ingham     {"cobol85", eLanguageTypeCobol85},
1700e0984eeSJim Ingham     {"fortran77", eLanguageTypeFortran77},
1710e0984eeSJim Ingham     {"fortran90", eLanguageTypeFortran90},
1720e0984eeSJim Ingham     {"pascal83", eLanguageTypePascal83},
1730e0984eeSJim Ingham     {"modula2", eLanguageTypeModula2},
1740e0984eeSJim Ingham     {"java", eLanguageTypeJava},
1750e0984eeSJim Ingham     {"c99", eLanguageTypeC99},
1760e0984eeSJim Ingham     {"ada95", eLanguageTypeAda95},
1770e0984eeSJim Ingham     {"fortran95", eLanguageTypeFortran95},
1780e0984eeSJim Ingham     {"pli", eLanguageTypePLI},
1790e0984eeSJim Ingham     {"objective-c", eLanguageTypeObjC},
1800e0984eeSJim Ingham     {"objective-c++", eLanguageTypeObjC_plus_plus},
1810e0984eeSJim Ingham     {"upc", eLanguageTypeUPC},
1820e0984eeSJim Ingham     {"d", eLanguageTypeD},
1830e0984eeSJim Ingham     {"python", eLanguageTypePython},
1840e0984eeSJim Ingham     {"opencl", eLanguageTypeOpenCL},
1850e0984eeSJim Ingham     {"go", eLanguageTypeGo},
1860e0984eeSJim Ingham     {"modula3", eLanguageTypeModula3},
1870e0984eeSJim Ingham     {"haskell", eLanguageTypeHaskell},
1880e0984eeSJim Ingham     {"c++03", eLanguageTypeC_plus_plus_03},
1890e0984eeSJim Ingham     {"c++11", eLanguageTypeC_plus_plus_11},
1900e0984eeSJim Ingham     {"ocaml", eLanguageTypeOCaml},
1910e0984eeSJim Ingham     {"rust", eLanguageTypeRust},
1920e0984eeSJim Ingham     {"c11", eLanguageTypeC11},
1930e0984eeSJim Ingham     {"swift", eLanguageTypeSwift},
1940e0984eeSJim Ingham     {"julia", eLanguageTypeJulia},
1950e0984eeSJim Ingham     {"dylan", eLanguageTypeDylan},
1960e0984eeSJim Ingham     {"c++14", eLanguageTypeC_plus_plus_14},
1970e0984eeSJim Ingham     {"fortran03", eLanguageTypeFortran03},
1980e0984eeSJim Ingham     {"fortran08", eLanguageTypeFortran08},
1990e0984eeSJim Ingham     // Vendor Extensions
2000e0984eeSJim Ingham     {"mipsassem", eLanguageTypeMipsAssembler},
2010e0984eeSJim Ingham     {"renderscript", eLanguageTypeExtRenderScript},
2020e0984eeSJim Ingham     // Now synonyms, in arbitrary order
2030e0984eeSJim Ingham     {"objc", eLanguageTypeObjC},
2040e0984eeSJim Ingham     {"objc++", eLanguageTypeObjC_plus_plus},
205b9c1b51eSKate Stone     {"pascal", eLanguageTypePascal83}};
2060e0984eeSJim Ingham 
207b9c1b51eSKate Stone static uint32_t num_languages =
208b9c1b51eSKate Stone     sizeof(language_names) / sizeof(struct language_name_pair);
2090e0984eeSJim Ingham 
2106fa7681bSZachary Turner LanguageType Language::GetLanguageTypeFromString(llvm::StringRef string) {
2116fa7681bSZachary Turner   for (const auto &L : language_names) {
2126fa7681bSZachary Turner     if (string.equals_lower(L.name))
2136fa7681bSZachary Turner       return static_cast<LanguageType>(L.type);
2146fa7681bSZachary Turner   }
2156fa7681bSZachary Turner 
2160e0984eeSJim Ingham   return eLanguageTypeUnknown;
2170e0984eeSJim Ingham }
2180e0984eeSJim Ingham 
219b9c1b51eSKate Stone const char *Language::GetNameForLanguageType(LanguageType language) {
2200e0984eeSJim Ingham   if (language < num_languages)
2210e0984eeSJim Ingham     return language_names[language].name;
2220e0984eeSJim Ingham   else
2230e0984eeSJim Ingham     return language_names[eLanguageTypeUnknown].name;
2240e0984eeSJim Ingham }
2250e0984eeSJim Ingham 
226b9c1b51eSKate Stone void Language::PrintAllLanguages(Stream &s, const char *prefix,
227b9c1b51eSKate Stone                                  const char *suffix) {
228b9c1b51eSKate Stone   for (uint32_t i = 1; i < num_languages; i++) {
2290e0984eeSJim Ingham     s.Printf("%s%s%s", prefix, language_names[i].name, suffix);
2300e0984eeSJim Ingham   }
2310e0984eeSJim Ingham }
2320e0984eeSJim Ingham 
233b9c1b51eSKate Stone void Language::ForAllLanguages(
234b9c1b51eSKate Stone     std::function<bool(lldb::LanguageType)> callback) {
235b9c1b51eSKate Stone   for (uint32_t i = 1; i < num_languages; i++) {
23628b3831eSEnrico Granata     if (!callback(language_names[i].type))
23728b3831eSEnrico Granata       break;
23828b3831eSEnrico Granata   }
23928b3831eSEnrico Granata }
24028b3831eSEnrico Granata 
241b9c1b51eSKate Stone bool Language::LanguageIsCPlusPlus(LanguageType language) {
242b9c1b51eSKate Stone   switch (language) {
2430e0984eeSJim Ingham   case eLanguageTypeC_plus_plus:
2440e0984eeSJim Ingham   case eLanguageTypeC_plus_plus_03:
2450e0984eeSJim Ingham   case eLanguageTypeC_plus_plus_11:
2460e0984eeSJim Ingham   case eLanguageTypeC_plus_plus_14:
2477b3ef05aSSean Callanan   case eLanguageTypeObjC_plus_plus:
2480e0984eeSJim Ingham     return true;
2490e0984eeSJim Ingham   default:
2500e0984eeSJim Ingham     return false;
2510e0984eeSJim Ingham   }
2520e0984eeSJim Ingham }
2530e0984eeSJim Ingham 
254b9c1b51eSKate Stone bool Language::LanguageIsObjC(LanguageType language) {
255b9c1b51eSKate Stone   switch (language) {
2560e0984eeSJim Ingham   case eLanguageTypeObjC:
2570e0984eeSJim Ingham   case eLanguageTypeObjC_plus_plus:
2580e0984eeSJim Ingham     return true;
2590e0984eeSJim Ingham   default:
2600e0984eeSJim Ingham     return false;
2610e0984eeSJim Ingham   }
2620e0984eeSJim Ingham }
2630e0984eeSJim Ingham 
264b9c1b51eSKate Stone bool Language::LanguageIsC(LanguageType language) {
265b9c1b51eSKate Stone   switch (language) {
2660e0984eeSJim Ingham   case eLanguageTypeC:
2670e0984eeSJim Ingham   case eLanguageTypeC89:
2680e0984eeSJim Ingham   case eLanguageTypeC99:
2690e0984eeSJim Ingham   case eLanguageTypeC11:
2700e0984eeSJim Ingham     return true;
2710e0984eeSJim Ingham   default:
2720e0984eeSJim Ingham     return false;
2730e0984eeSJim Ingham   }
2740e0984eeSJim Ingham }
2750e0984eeSJim Ingham 
276*de2cc012SAdrian Prantl bool Language::LanguageIsCFamily(LanguageType language) {
277*de2cc012SAdrian Prantl   switch (language) {
278*de2cc012SAdrian Prantl   case eLanguageTypeC:
279*de2cc012SAdrian Prantl   case eLanguageTypeC89:
280*de2cc012SAdrian Prantl   case eLanguageTypeC99:
281*de2cc012SAdrian Prantl   case eLanguageTypeC11:
282*de2cc012SAdrian Prantl   case eLanguageTypeC_plus_plus:
283*de2cc012SAdrian Prantl   case eLanguageTypeC_plus_plus_03:
284*de2cc012SAdrian Prantl   case eLanguageTypeC_plus_plus_11:
285*de2cc012SAdrian Prantl   case eLanguageTypeC_plus_plus_14:
286*de2cc012SAdrian Prantl   case eLanguageTypeObjC_plus_plus:
287*de2cc012SAdrian Prantl   case eLanguageTypeObjC:
288*de2cc012SAdrian Prantl     return true;
289*de2cc012SAdrian Prantl   default:
290*de2cc012SAdrian Prantl     return false;
291*de2cc012SAdrian Prantl   }
292*de2cc012SAdrian Prantl }
293*de2cc012SAdrian Prantl 
294b9c1b51eSKate Stone bool Language::LanguageIsPascal(LanguageType language) {
295b9c1b51eSKate Stone   switch (language) {
2960e0984eeSJim Ingham   case eLanguageTypePascal83:
2970e0984eeSJim Ingham     return true;
2980e0984eeSJim Ingham   default:
2990e0984eeSJim Ingham     return false;
3000e0984eeSJim Ingham   }
3010e0984eeSJim Ingham }
3020e0984eeSJim Ingham 
303b9c1b51eSKate Stone LanguageType Language::GetPrimaryLanguage(LanguageType language) {
304b9c1b51eSKate Stone   switch (language) {
305bfd96183SDawn Perchik   case eLanguageTypeC_plus_plus:
306bfd96183SDawn Perchik   case eLanguageTypeC_plus_plus_03:
307bfd96183SDawn Perchik   case eLanguageTypeC_plus_plus_11:
308bfd96183SDawn Perchik   case eLanguageTypeC_plus_plus_14:
309bfd96183SDawn Perchik     return eLanguageTypeC_plus_plus;
310bfd96183SDawn Perchik   case eLanguageTypeC:
311bfd96183SDawn Perchik   case eLanguageTypeC89:
312bfd96183SDawn Perchik   case eLanguageTypeC99:
313bfd96183SDawn Perchik   case eLanguageTypeC11:
314bfd96183SDawn Perchik     return eLanguageTypeC;
315bfd96183SDawn Perchik   case eLanguageTypeObjC:
316bfd96183SDawn Perchik   case eLanguageTypeObjC_plus_plus:
317bfd96183SDawn Perchik     return eLanguageTypeObjC;
318bfd96183SDawn Perchik   case eLanguageTypePascal83:
319bfd96183SDawn Perchik   case eLanguageTypeCobol74:
320bfd96183SDawn Perchik   case eLanguageTypeCobol85:
321bfd96183SDawn Perchik   case eLanguageTypeFortran77:
322bfd96183SDawn Perchik   case eLanguageTypeFortran90:
323bfd96183SDawn Perchik   case eLanguageTypeFortran95:
324bfd96183SDawn Perchik   case eLanguageTypeFortran03:
325bfd96183SDawn Perchik   case eLanguageTypeFortran08:
326bfd96183SDawn Perchik   case eLanguageTypeAda83:
327bfd96183SDawn Perchik   case eLanguageTypeAda95:
328bfd96183SDawn Perchik   case eLanguageTypeModula2:
329bfd96183SDawn Perchik   case eLanguageTypeJava:
330bfd96183SDawn Perchik   case eLanguageTypePLI:
331bfd96183SDawn Perchik   case eLanguageTypeUPC:
332bfd96183SDawn Perchik   case eLanguageTypeD:
333bfd96183SDawn Perchik   case eLanguageTypePython:
334bfd96183SDawn Perchik   case eLanguageTypeOpenCL:
335bfd96183SDawn Perchik   case eLanguageTypeGo:
336bfd96183SDawn Perchik   case eLanguageTypeModula3:
337bfd96183SDawn Perchik   case eLanguageTypeHaskell:
338bfd96183SDawn Perchik   case eLanguageTypeOCaml:
339bfd96183SDawn Perchik   case eLanguageTypeRust:
340bfd96183SDawn Perchik   case eLanguageTypeSwift:
341bfd96183SDawn Perchik   case eLanguageTypeJulia:
342bfd96183SDawn Perchik   case eLanguageTypeDylan:
343bfd96183SDawn Perchik   case eLanguageTypeMipsAssembler:
344bfd96183SDawn Perchik   case eLanguageTypeExtRenderScript:
345bfd96183SDawn Perchik   case eLanguageTypeUnknown:
346bfd96183SDawn Perchik   default:
347bfd96183SDawn Perchik     return language;
348bfd96183SDawn Perchik   }
349bfd96183SDawn Perchik }
350bfd96183SDawn Perchik 
351b9c1b51eSKate Stone void Language::GetLanguagesSupportingTypeSystems(
352b9c1b51eSKate Stone     std::set<lldb::LanguageType> &languages,
353b9c1b51eSKate Stone     std::set<lldb::LanguageType> &languages_for_expressions) {
354fe38c850SSean Callanan   uint32_t idx = 0;
355fe38c850SSean Callanan 
356b9c1b51eSKate Stone   while (TypeSystemEnumerateSupportedLanguages enumerate = PluginManager::
357b9c1b51eSKate Stone              GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex(idx++)) {
358fe38c850SSean Callanan     (*enumerate)(languages, languages_for_expressions);
359fe38c850SSean Callanan   }
360fe38c850SSean Callanan }
361fe38c850SSean Callanan 
362b9c1b51eSKate Stone void Language::GetLanguagesSupportingREPLs(
363b9c1b51eSKate Stone     std::set<lldb::LanguageType> &languages) {
36493c0b003SSean Callanan   uint32_t idx = 0;
36593c0b003SSean Callanan 
366b9c1b51eSKate Stone   while (REPLEnumerateSupportedLanguages enumerate =
367b9c1b51eSKate Stone              PluginManager::GetREPLEnumerateSupportedLanguagesCallbackAtIndex(
368b9c1b51eSKate Stone                  idx++)) {
36993c0b003SSean Callanan     (*enumerate)(languages);
37093c0b003SSean Callanan   }
37193c0b003SSean Callanan }
37293c0b003SSean Callanan 
373b9c1b51eSKate Stone std::unique_ptr<Language::TypeScavenger> Language::GetTypeScavenger() {
3749b0af1b8SEnrico Granata   return nullptr;
3759b0af1b8SEnrico Granata }
3769b0af1b8SEnrico Granata 
377b9c1b51eSKate Stone const char *Language::GetLanguageSpecificTypeLookupHelp() { return nullptr; }
378701338a7SEnrico Granata 
379b9c1b51eSKate Stone size_t Language::TypeScavenger::Find(ExecutionContextScope *exe_scope,
380b9c1b51eSKate Stone                                      const char *key, ResultSet &results,
381b9c1b51eSKate Stone                                      bool append) {
3829b0af1b8SEnrico Granata   if (!exe_scope || !exe_scope->CalculateTarget().get())
3839b0af1b8SEnrico Granata     return false;
3849b0af1b8SEnrico Granata 
3859b0af1b8SEnrico Granata   if (!key || !key[0])
3869b0af1b8SEnrico Granata     return false;
3879b0af1b8SEnrico Granata 
3889b0af1b8SEnrico Granata   if (!append)
3899b0af1b8SEnrico Granata     results.clear();
3909b0af1b8SEnrico Granata 
3919b0af1b8SEnrico Granata   size_t old_size = results.size();
3929b0af1b8SEnrico Granata 
3939b0af1b8SEnrico Granata   if (this->Find_Impl(exe_scope, key, results))
3949b0af1b8SEnrico Granata     return results.size() - old_size;
3959b0af1b8SEnrico Granata   return 0;
3969b0af1b8SEnrico Granata }
3979b0af1b8SEnrico Granata 
39863db2395SEnrico Granata bool Language::ImageListTypeScavenger::Find_Impl(
39963db2395SEnrico Granata     ExecutionContextScope *exe_scope, const char *key, ResultSet &results) {
40063db2395SEnrico Granata   bool result = false;
40163db2395SEnrico Granata 
40263db2395SEnrico Granata   Target *target = exe_scope->CalculateTarget().get();
40363db2395SEnrico Granata   if (target) {
40463db2395SEnrico Granata     const auto &images(target->GetImages());
40563db2395SEnrico Granata     ConstString cs_key(key);
40663db2395SEnrico Granata     llvm::DenseSet<SymbolFile *> searched_sym_files;
40763db2395SEnrico Granata     TypeList matches;
408576495e6SZachary Turner     images.FindTypes(nullptr, cs_key, false, UINT32_MAX, searched_sym_files,
40963db2395SEnrico Granata                      matches);
41063db2395SEnrico Granata     for (const auto &match : matches.Types()) {
41170355aceSJonas Devlieghere       if (match) {
41263db2395SEnrico Granata         CompilerType compiler_type(match->GetFullCompilerType());
41363db2395SEnrico Granata         compiler_type = AdjustForInclusion(compiler_type);
41463db2395SEnrico Granata         if (!compiler_type)
41563db2395SEnrico Granata           continue;
41663db2395SEnrico Granata         std::unique_ptr<Language::TypeScavenger::Result> scavengeresult(
41763db2395SEnrico Granata             new Result(compiler_type));
41863db2395SEnrico Granata         results.insert(std::move(scavengeresult));
41963db2395SEnrico Granata         result = true;
42063db2395SEnrico Granata       }
42163db2395SEnrico Granata     }
42263db2395SEnrico Granata   }
42363db2395SEnrico Granata 
42463db2395SEnrico Granata   return result;
42563db2395SEnrico Granata }
42663db2395SEnrico Granata 
427b9c1b51eSKate Stone bool Language::GetFormatterPrefixSuffix(ValueObject &valobj,
428b9c1b51eSKate Stone                                         ConstString type_hint,
429b9c1b51eSKate Stone                                         std::string &prefix,
430b9c1b51eSKate Stone                                         std::string &suffix) {
431675f49bbSEnrico Granata   return false;
432675f49bbSEnrico Granata }
433675f49bbSEnrico Granata 
434b9c1b51eSKate Stone DumpValueObjectOptions::DeclPrintingHelper Language::GetDeclPrintingHelper() {
435c8e7649aSEnrico Granata   return nullptr;
436c8e7649aSEnrico Granata }
437c8e7649aSEnrico Granata 
43897206d57SZachary Turner LazyBool Language::IsLogicalTrue(ValueObject &valobj, Status &error) {
439407b5c62SEnrico Granata   return eLazyBoolCalculate;
440407b5c62SEnrico Granata }
441407b5c62SEnrico Granata 
442b9c1b51eSKate Stone bool Language::IsNilReference(ValueObject &valobj) { return false; }
443608d67c1SEnrico Granata 
444b9c1b51eSKate Stone bool Language::IsUninitializedReference(ValueObject &valobj) { return false; }
445608d67c1SEnrico Granata 
446b9c1b51eSKate Stone bool Language::GetFunctionDisplayName(const SymbolContext *sc,
447293207ddSEnrico Granata                                       const ExecutionContext *exe_ctx,
448d4129b47SEnrico Granata                                       FunctionNameRepresentation representation,
449b9c1b51eSKate Stone                                       Stream &s) {
450d4129b47SEnrico Granata   return false;
451d4129b47SEnrico Granata }
452d4129b47SEnrico Granata 
453b9c1b51eSKate Stone void Language::GetExceptionResolverDescription(bool catch_on, bool throw_on,
454b9c1b51eSKate Stone                                                Stream &s) {
455a2023571SJim Ingham   GetDefaultExceptionResolverDescription(catch_on, throw_on, s);
456a2023571SJim Ingham }
457a2023571SJim Ingham 
458b9c1b51eSKate Stone void Language::GetDefaultExceptionResolverDescription(bool catch_on,
459b9c1b51eSKate Stone                                                       bool throw_on,
460b9c1b51eSKate Stone                                                       Stream &s) {
461a2023571SJim Ingham   s.Printf("Exception breakpoint (catch: %s throw: %s)",
462b9c1b51eSKate Stone            catch_on ? "on" : "off", throw_on ? "on" : "off");
463a2023571SJim Ingham }
4645f9d3106SEnrico Granata // Constructor
465b9c1b51eSKate Stone Language::Language() {}
4665f9d3106SEnrico Granata 
4675f9d3106SEnrico Granata // Destructor
468b9c1b51eSKate Stone Language::~Language() {}
469