mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-12-16 23:04:21 +08:00
[gdb/cli] Factor out try_source_highlight
Function source_cache::ensure contains some code using the GNU
source-highlight library.
The code is a sizable part of the function, and contains conditional
compilation in a slightly convoluted way:
...
if (!already_styled)
#endif /* HAVE_SOURCE_HIGHLIGHT */
{
...
Fix this by factoring out the code into new function try_source_highlight,
such that:
- source_cache::ensure is easier to read, and
- the conditional compilation is at the level of the function body.
Tested on x86_64-linux.
Reviewed-By: Lancelot Six <lancelot.six@amd.com>
This commit is contained in:
@@ -191,6 +191,59 @@ get_language_name (enum language lang)
|
||||
|
||||
#endif /* HAVE_SOURCE_HIGHLIGHT */
|
||||
|
||||
/* Try to highlight CONTENTS from file FULLNAME in language LANG using
|
||||
the GNU source-higlight library. Return true if highlighting
|
||||
succeeded. */
|
||||
|
||||
static bool
|
||||
try_source_highlight (std::string &contents ATTRIBUTE_UNUSED,
|
||||
enum language lang ATTRIBUTE_UNUSED,
|
||||
const std::string &fullname ATTRIBUTE_UNUSED)
|
||||
{
|
||||
#ifdef HAVE_SOURCE_HIGHLIGHT
|
||||
if (!use_gnu_source_highlight)
|
||||
return false;
|
||||
|
||||
const char *lang_name = get_language_name (lang);
|
||||
if (lang_name == nullptr)
|
||||
return false;
|
||||
|
||||
/* The global source highlight object, or null if one was
|
||||
never constructed. This is stored here rather than in
|
||||
the class so that we don't need to include anything or do
|
||||
conditional compilation in source-cache.h. */
|
||||
static srchilite::SourceHighlight *highlighter;
|
||||
|
||||
bool styled = false;
|
||||
try
|
||||
{
|
||||
if (highlighter == nullptr)
|
||||
{
|
||||
highlighter = new srchilite::SourceHighlight ("esc.outlang");
|
||||
highlighter->setStyleFile ("esc.style");
|
||||
}
|
||||
|
||||
std::istringstream input (contents);
|
||||
std::ostringstream output;
|
||||
highlighter->highlight (input, output, lang_name, fullname);
|
||||
contents = std::move (output).str ();
|
||||
styled = true;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
/* Source Highlight will throw an exception if
|
||||
highlighting fails. One possible reason it can fail
|
||||
is if the language is unknown -- which matters to gdb
|
||||
because Rust support wasn't added until after 3.1.8.
|
||||
Ignore exceptions here. */
|
||||
}
|
||||
|
||||
return styled;
|
||||
#else
|
||||
return false;
|
||||
#endif /* HAVE_SOURCE_HIGHLIGHT */
|
||||
}
|
||||
|
||||
/* See source-cache.h. */
|
||||
|
||||
bool
|
||||
@@ -230,44 +283,10 @@ source_cache::ensure (struct symtab *s)
|
||||
|
||||
if (source_styling && gdb_stdout->can_emit_style_escape ())
|
||||
{
|
||||
#ifdef HAVE_SOURCE_HIGHLIGHT
|
||||
bool already_styled = false;
|
||||
const char *lang_name = get_language_name (s->language ());
|
||||
if (lang_name != nullptr && use_gnu_source_highlight)
|
||||
{
|
||||
/* The global source highlight object, or null if one was
|
||||
never constructed. This is stored here rather than in
|
||||
the class so that we don't need to include anything or do
|
||||
conditional compilation in source-cache.h. */
|
||||
static srchilite::SourceHighlight *highlighter;
|
||||
|
||||
try
|
||||
{
|
||||
if (highlighter == nullptr)
|
||||
{
|
||||
highlighter = new srchilite::SourceHighlight ("esc.outlang");
|
||||
highlighter->setStyleFile ("esc.style");
|
||||
}
|
||||
|
||||
std::istringstream input (contents);
|
||||
std::ostringstream output;
|
||||
highlighter->highlight (input, output, lang_name, fullname);
|
||||
contents = std::move (output).str ();
|
||||
already_styled = true;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
/* Source Highlight will throw an exception if
|
||||
highlighting fails. One possible reason it can fail
|
||||
is if the language is unknown -- which matters to gdb
|
||||
because Rust support wasn't added until after 3.1.8.
|
||||
Ignore exceptions here and fall back to
|
||||
un-highlighted text. */
|
||||
}
|
||||
}
|
||||
bool already_styled
|
||||
= try_source_highlight (contents, s->language (), fullname);
|
||||
|
||||
if (!already_styled)
|
||||
#endif /* HAVE_SOURCE_HIGHLIGHT */
|
||||
{
|
||||
gdb::optional<std::string> ext_contents;
|
||||
ext_contents = ext_lang_colorize (fullname, contents);
|
||||
|
||||
Reference in New Issue
Block a user