Extract source fragment printing functionality.

This commit is contained in:
Bartosz Taudul 2022-04-06 01:54:14 +02:00
parent 1b3464a386
commit 4555910536
No known key found for this signature in database
GPG Key ID: B7FE2008B7575DF3

View File

@ -165,6 +165,54 @@ static void PrintHwSampleTooltip( size_t cycles, size_t retired, size_t cacheRef
} }
} }
static void PrintSourceFragment( const SourceContents& src, uint32_t srcline, int pre = 4, int post = 3 )
{
auto& lines = src.get();
const int start = std::max( 0, (int)srcline - pre );
const int end = std::min<int>( src.get().size(), srcline + post );
bool first = true;
int bottomEmpty = 0;
for( int i=start; i<end; i++ )
{
auto& line = lines[i];
if( line.begin == line.end )
{
if( !first ) bottomEmpty++;
}
else
{
first = false;
while( bottomEmpty > 0 )
{
ImGui::TextUnformatted( "" );
bottomEmpty--;
}
auto ptr = line.begin;
auto it = line.tokens.begin();
while( ptr < line.end )
{
if( it == line.tokens.end() )
{
ImGui::TextUnformatted( ptr, line.end );
ImGui::SameLine( 0, 0 );
break;
}
if( ptr < it->begin )
{
ImGui::TextUnformatted( ptr, it->begin );
ImGui::SameLine( 0, 0 );
}
TextColoredUnformatted( i == srcline-1 ? SyntaxColors[(int)it->color] : SyntaxColorsDimmed[(int)it->color], it->begin, it->end );
ImGui::SameLine( 0, 0 );
ptr = it->end;
++it;
}
ImGui::ItemSize( ImVec2( 0, 0 ), 0 );
}
}
}
enum { JumpSeparationBase = 6 }; enum { JumpSeparationBase = 6 };
enum { JumpArrowBase = 9 }; enum { JumpArrowBase = 9 };
@ -1478,50 +1526,7 @@ void SourceView::RenderSymbolView( Worker& worker, View& view )
{ {
ImGui::BeginTooltip(); ImGui::BeginTooltip();
SetFont(); SetFont();
auto& lines = m_sourceTooltip.get(); PrintSourceFragment( m_sourceTooltip, sd->line, 4, 7 );
const int start = std::max( 0, (int)sd->line - 4 );
const int end = std::min<int>( m_sourceTooltip.get().size(), sd->line + 7 );
bool first = true;
int bottomEmpty = 0;
for( int i=start; i<end; i++ )
{
auto& line = lines[i];
if( line.begin == line.end )
{
if( !first ) bottomEmpty++;
}
else
{
first = false;
while( bottomEmpty > 0 )
{
ImGui::TextUnformatted( "" );
bottomEmpty--;
}
auto ptr = line.begin;
auto it = line.tokens.begin();
while( ptr < line.end )
{
if( it == line.tokens.end() )
{
ImGui::TextUnformatted( ptr, line.end );
ImGui::SameLine( 0, 0 );
break;
}
if( ptr < it->begin )
{
ImGui::TextUnformatted( ptr, it->begin );
ImGui::SameLine( 0, 0 );
}
TextColoredUnformatted( i == sd->line - 1 ? SyntaxColors[(int)it->color] : SyntaxColorsDimmed[(int)it->color], it->begin, it->end );
ImGui::SameLine( 0, 0 );
ptr = it->end;
++it;
}
ImGui::ItemSize( ImVec2( 0, 0 ), 0 );
}
}
UnsetFont(); UnsetFont();
ImGui::EndTooltip(); ImGui::EndTooltip();
} }
@ -3428,50 +3433,7 @@ void SourceView::RenderAsmLine( AsmLine& line, const AddrStat& ipcnt, const Addr
{ {
ImGui::Separator(); ImGui::Separator();
SetFont(); SetFont();
auto& lines = m_sourceTooltip.get(); PrintSourceFragment( m_sourceTooltip, srcline );
const int start = std::max( 0, (int)srcline - 4 );
const int end = std::min<int>( m_sourceTooltip.get().size(), srcline + 3 );
bool first = true;
int bottomEmpty = 0;
for( int i=start; i<end; i++ )
{
auto& line = lines[i];
if( line.begin == line.end )
{
if( !first ) bottomEmpty++;
}
else
{
first = false;
while( bottomEmpty > 0 )
{
ImGui::TextUnformatted( "" );
bottomEmpty--;
}
auto ptr = line.begin;
auto it = line.tokens.begin();
while( ptr < line.end )
{
if( it == line.tokens.end() )
{
ImGui::TextUnformatted( ptr, line.end );
ImGui::SameLine( 0, 0 );
break;
}
if( ptr < it->begin )
{
ImGui::TextUnformatted( ptr, it->begin );
ImGui::SameLine( 0, 0 );
}
TextColoredUnformatted( i == srcline-1 ? SyntaxColors[(int)it->color] : SyntaxColorsDimmed[(int)it->color], it->begin, it->end );
ImGui::SameLine( 0, 0 );
ptr = it->end;
++it;
}
ImGui::ItemSize( ImVec2( 0, 0 ), 0 );
}
}
UnsetFont(); UnsetFont();
} }
} }