basctl/source/basicide/baside2b.cxx |    6 +++++-
 basic/source/runtime/runtime.cxx    |   15 ++++++++++++---
 2 files changed, 17 insertions(+), 4 deletions(-)

New commits:
commit 7d27e4b0257a8a927d3b59edcd549ff9103cbaa9
Author:     Andreas Heinisch <andreas.heini...@yahoo.de>
AuthorDate: Tue Oct 26 21:03:41 2021 +0200
Commit:     Andreas Heinisch <andreas.heini...@yahoo.de>
CommitDate: Wed Oct 27 09:29:34 2021 +0200

    tdf#57308 - Basic IDE: Watching of a variable does not work
    
    Watching a variable which returns a value from a function always shows
    "out of scope" in the watch window of the Basic IDE. In order to resolve
    this issue, the name of the variable being watched will be searched also
    in the current method instance.
    
    Change-Id: I5ff6ce22067e11d74275eeb82da814da1eebe3db
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124239
    Tested-by: Jenkins
    Reviewed-by: Andreas Heinisch <andreas.heini...@yahoo.de>

diff --git a/basctl/source/basicide/baside2b.cxx 
b/basctl/source/basicide/baside2b.cxx
index 5457ebcce376..d998193cc2a5 100644
--- a/basctl/source/basicide/baside2b.cxx
+++ b/basctl/source/basicide/baside2b.cxx
@@ -2373,7 +2373,7 @@ void WatchWindow::UpdateWatches(bool bBasicStopped)
                 eEnableChildren = TRISTATE_TRUE;
             }
 
-            if (SbxVariable const* pVar = IsSbxVariable(pSBX))
+            if (SbxVariable* pVar = dynamic_cast<SbxVariable*>(pSBX))
             {
                 // extra treatment of arrays
                 SbxDataType eType = pVar->GetType();
@@ -2486,7 +2486,11 @@ void WatchWindow::UpdateWatches(bool bBasicStopped)
                     {
                         aWatchStr += aStrStr;
                     }
+                    // tdf#57308 - avoid a second call to retrieve the data
+                    const SbxFlagBits nFlags = pVar->GetFlags();
+                    pVar->SetFlag(SbxFlagBits::NoBroadcast);
                     aWatchStr += pVar->GetOUString();
+                    pVar->SetFlags(nFlags);
                     if( bString )
                     {
                         aWatchStr += aStrStr;
diff --git a/basic/source/runtime/runtime.cxx b/basic/source/runtime/runtime.cxx
index 2d7b988d7647..11699093e022 100644
--- a/basic/source/runtime/runtime.cxx
+++ b/basic/source/runtime/runtime.cxx
@@ -3754,11 +3754,20 @@ SbxBase* SbiRuntime::FindElementExtern( const OUString& 
rName )
     }
     if ( !pElem && pMeth )
     {
-        // for statics, set the method's name in front
-        OUString aMethName = pMeth->GetName() + ":" + rName;
-        pElem = pMod->Find(aMethName, SbxClassType::DontCare);
+        const OUString aMethName = pMeth->GetName();
+        // tdf#57308 - check if the name is the current method instance
+        if (pMeth->GetName() == rName)
+        {
+            pElem = pMeth;
+        }
+        else
+        {
+            // for statics, set the method's name in front
+            pElem = pMod->Find(aMethName + ":" + rName, 
SbxClassType::DontCare);
+        }
     }
 
+
     // search in parameter list
     if( !pElem && pMeth )
     {

Reply via email to