@@ -481,6 +481,10 @@ bool SeerEditorManagerWidget::editorAutoSourceReload () const {
481481 return _editorAutoSourceReload;
482482}
483483
484+ void SeerEditorManagerWidget::setSourceBrowserWidget (SeerSourceBrowserWidget* sourceBrowserWidget) {
485+ _sourceBrowserWidget = sourceBrowserWidget;
486+ }
487+
484488void SeerEditorManagerWidget::handleText (const QString& text) {
485489
486490 // Update the current line.
@@ -801,6 +805,41 @@ void SeerEditorManagerWidget::handleText (const QString& text) {
801805 i->widget ->sourceArea ()->eraseColorCurrentLine (line_text.toInt ());
802806 }
803807 }
808+ }else if ( text.contains (QRegularExpression (" ^([0-9]+)\\ ^done,symbols={" )))
809+ {
810+ if (text.startsWith (_idTypeDefinition + " ^done,symbols={" ) || text.startsWith (_idFunctionDefinition + " ^done,symbols={" ) ||
811+ text.startsWith (_idVariableDefinition + " ^done,symbols={" )) // Handle Go to Definition
812+ {
813+ // ^10done,symbols={debug=[{filename=" ",fullname=" ",
814+ // symbols=[{line=" ",name="uwTick",type="volatile uint32_t",description="volatile uint32_t uwTick;"},}]}]
815+ QString debug_text = Seer::parseFirst (text, " debug=" , ' [' , ' ]' , false );
816+ QStringList filenames_list = Seer::parse (debug_text, " " , ' {' , ' }' , false );
817+
818+ for (const auto & filename_entry : filenames_list) {
819+
820+ QString filename_text = Seer::parseFirst (filename_entry, " filename=" , ' "' , ' "' , false );
821+ QString fullname_text = Seer::parseFirst (filename_entry, " fullname=" , ' "' , ' "' , false );
822+
823+ // If that file is not in source browser, skip it
824+ if (_sourceBrowserWidget->findFileWithRegrex (fullname_text).isEmpty ())
825+ continue ;
826+
827+ QString symbols_text = Seer::parseFirst (filename_entry, " symbols=" , ' [' , ' ]' , false );
828+ QStringList symbols_list = Seer::parse (symbols_text, " " , ' {' , ' }' , false );
829+
830+ for (const auto & symbol_entry : symbols_list) {
831+
832+ QString line_text = Seer::parseFirst (symbol_entry, " line=" , ' "' , ' "' , false );
833+ QString name_text = Seer::parseFirst (symbol_entry, " name=" , ' "' , ' "' , false );
834+ // name_text may be st like: function_name(params...) , so only extract function_name part
835+ name_text = name_text.section (' (' , 0 , 0 ).trimmed ();
836+ if (name_text == _gotoDefIdentifier) // you found it! Open file
837+ {
838+ handleOpenFile (filename_text, fullname_text, line_text.toInt ());
839+ }
840+ }
841+ }
842+ }
804843 }
805844 else {
806845 // Ignore others.
@@ -1060,6 +1099,7 @@ SeerEditorWidgetSource* SeerEditorManagerWidget::createEditorWidgetTab (const QS
10601099 QObject::connect (editorWidget->sourceArea (), &SeerEditorWidgetSourceArea::addStructVisualizer, this , &SeerEditorManagerWidget::handleAddStructVisualizer);
10611100 QObject::connect (editorWidget, &SeerEditorWidgetSource::addAlternateDirectory, this , &SeerEditorManagerWidget::handleAddAlternateDirectory);
10621101 QObject::connect (editorWidget->sourceArea (), &SeerEditorWidgetSourceArea::addToMouseNavigation, this , &SeerEditorManagerWidget::handleAddToMouseNavigation);
1102+ QObject::connect (editorWidget->sourceArea (), &SeerEditorWidgetSourceArea::signalGotoDefinition, this , &SeerEditorManagerWidget::gotoDefinitionForwarder);
10631103
10641104 // Send the Editor widget the command to load the file. ??? Do better than this.
10651105 editorWidget->sourceArea ()->handleText (text);
@@ -1124,6 +1164,7 @@ SeerEditorWidgetSource* SeerEditorManagerWidget::createEditorWidgetTab (const QS
11241164 QObject::connect (editorWidget->sourceArea (), &SeerEditorWidgetSourceArea::addStructVisualizer, this , &SeerEditorManagerWidget::handleAddStructVisualizer);
11251165 QObject::connect (editorWidget, &SeerEditorWidgetSource::addAlternateDirectory, this , &SeerEditorManagerWidget::handleAddAlternateDirectory);
11261166 QObject::connect (editorWidget->sourceArea (), &SeerEditorWidgetSourceArea::addToMouseNavigation, this , &SeerEditorManagerWidget::handleAddToMouseNavigation);
1167+ QObject::connect (editorWidget->sourceArea (), &SeerEditorWidgetSourceArea::signalGotoDefinition, this , &SeerEditorManagerWidget::gotoDefinitionForwarder);
11271168
11281169 // Load the file.
11291170 editorWidget->sourceArea ()->open (fullname, QFileInfo (file).fileName ());
@@ -1633,4 +1674,27 @@ void SeerEditorManagerWidget::mousePressEvent(QMouseEvent *event)
16331674 {
16341675 QWidget::mousePressEvent (event);
16351676 }
1636- }
1677+ }
1678+
1679+ /* **********************************************************************************************************************
1680+ * Functions for handling tracing identifier *
1681+ **********************************************************************************************************************/
1682+ void SeerEditorManagerWidget::gotoDefinitionForwarder (const QString& identifier)
1683+ {
1684+ _gotoDefIdentifier = identifier;
1685+
1686+ // Create a unique ID for the function definition request and send the command to gdb
1687+ _idFunctionDefinition = QString::number (Seer::createID ());
1688+ QString gdbCommand = _idFunctionDefinition + " -symbol-info-functions --name " + _gotoDefIdentifier;
1689+ emit gotoDefinitionForward (gdbCommand);
1690+
1691+ // Create a unique ID for the variable definition request and send the command to gdb
1692+ _idVariableDefinition = QString::number (Seer::createID ());
1693+ gdbCommand = _idVariableDefinition + " -symbol-info-variables --name " + _gotoDefIdentifier;
1694+ emit gotoDefinitionForward (gdbCommand);
1695+
1696+ // Create a unique ID for the type definition request and send the command to gdb
1697+ _idTypeDefinition = QString::number (Seer::createID ());
1698+ gdbCommand = _idTypeDefinition + " -symbol-info-types --name " + _gotoDefIdentifier;
1699+ emit gotoDefinitionForward (gdbCommand);
1700+ }
0 commit comments