mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-12-17 16:18:37 +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 */
|
#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. */
|
/* See source-cache.h. */
|
||||||
|
|
||||||
bool
|
bool
|
||||||
@@ -230,44 +283,10 @@ source_cache::ensure (struct symtab *s)
|
|||||||
|
|
||||||
if (source_styling && gdb_stdout->can_emit_style_escape ())
|
if (source_styling && gdb_stdout->can_emit_style_escape ())
|
||||||
{
|
{
|
||||||
#ifdef HAVE_SOURCE_HIGHLIGHT
|
bool already_styled
|
||||||
bool already_styled = false;
|
= try_source_highlight (contents, s->language (), fullname);
|
||||||
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. */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!already_styled)
|
if (!already_styled)
|
||||||
#endif /* HAVE_SOURCE_HIGHLIGHT */
|
|
||||||
{
|
{
|
||||||
gdb::optional<std::string> ext_contents;
|
gdb::optional<std::string> ext_contents;
|
||||||
ext_contents = ext_lang_colorize (fullname, contents);
|
ext_contents = ext_lang_colorize (fullname, contents);
|
||||||
|
|||||||
Reference in New Issue
Block a user