basic/qa/basic_coverage/test_tdf125637.bas |   34 +++++++++++++++++++++++++++++
 basic/qa/cppunit/test_scanner.cxx          |    3 +-
 basic/source/comp/scanner.cxx              |   16 ++++---------
 basic/source/inc/scanner.hxx               |    1 
 4 files changed, 42 insertions(+), 12 deletions(-)

New commits:
commit 67c15910606575b862410179698f81e7a598aa44
Author:     Andreas Heinisch <andreas.heini...@yahoo.de>
AuthorDate: Tue Oct 19 20:09:21 2021 +0200
Commit:     Andreas Heinisch <andreas.heini...@yahoo.de>
CommitDate: Wed Oct 20 20:27:59 2021 +0200

    tdf#125637 - Correctly hand names ending with an underscore
    
    If a name is ending with an underscore at the end of the line, it won't
    be recognized correctly and it will be wrongly interpreted as the
    respective name without the underscore at the end. Instead of changing
    the macro source, use a flag in order to correclty identify the line end.
    
    Change-Id: I6f933d7382b510bffed3e2692d32c232b7084624
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123833
    Tested-by: Jenkins
    Reviewed-by: Andreas Heinisch <andreas.heini...@yahoo.de>

diff --git a/basic/qa/basic_coverage/test_tdf125637.bas 
b/basic/qa/basic_coverage/test_tdf125637.bas
new file mode 100644
index 000000000000..e4eff75c27b3
--- /dev/null
+++ b/basic/qa/basic_coverage/test_tdf125637.bas
@@ -0,0 +1,34 @@
+'
+' This file is part of the LibreOffice project.
+'
+' This Source Code Form is subject to the terms of the Mozilla Public
+' License, v. 2.0. If a copy of the MPL was not distributed with this
+' file, You can obtain one at http://mozilla.org/MPL/2.0/.
+'
+
+Option Explicit
+
+Function doUnitTest() As String
+    TestUtil.TestInit
+    verify_tdf125637
+    doUnitTest = TestUtil.GetResult()
+End Function
+
+Sub verify_tdf125637
+    On Error GoTo errorHandler
+
+    ' tdf#125637 - correctly hand names ending with an underscore character at 
the end of the line
+    Dim test As Long
+    Dim test_ As Long
+    test_ = 1234
+    test = test_
+
+    ' Without the fix in place, this test would have failed with:
+    ' - Expected: 1234
+    ' - Actual  : 0
+    TestUtil.AssertEqual(test, 1234, "Assignment of the variable failed 
(tdf#125637)")
+
+    Exit Sub
+errorHandler:
+    TestUtil.ReportErrorHandler("verify_tdf125637", Err, Error$, Erl)
+End Sub
diff --git a/basic/qa/cppunit/test_scanner.cxx 
b/basic/qa/cppunit/test_scanner.cxx
index 6459ab45f6b1..6559b3e35d48 100644
--- a/basic/qa/cppunit/test_scanner.cxx
+++ b/basic/qa/cppunit/test_scanner.cxx
@@ -297,7 +297,8 @@ void ScannerTest::testAlphanum()
     CPPUNIT_ASSERT_EQUAL(size_t(2), symbols.size());
     CPPUNIT_ASSERT_EQUAL(OUString("joxclk_"), symbols[0].text);
     CPPUNIT_ASSERT_EQUAL(SbxVARIANT, symbols[0].type);
-    CPPUNIT_ASSERT_EQUAL(OUString("joxclk "), source7); // Change the trailing 
'_' to a ' '
+    // tdf#125637 - don't change underscore to space
+    CPPUNIT_ASSERT_EQUAL(OUString("joxclk_"), source7);
     CPPUNIT_ASSERT_EQUAL(cr, symbols[1].text);
     CPPUNIT_ASSERT_EQUAL(SbxVARIANT, symbols[1].type);
 
diff --git a/basic/source/comp/scanner.cxx b/basic/source/comp/scanner.cxx
index 9523597721bd..a0d9b9ab6c76 100644
--- a/basic/source/comp/scanner.cxx
+++ b/basic/source/comp/scanner.cxx
@@ -52,6 +52,7 @@ SbiScanner::SbiScanner(const OUString& rBuf, StarBASIC* p)
     , bCompatible(false)
     , bVBASupportOn(false)
     , bPrevLineExtentsComment(false)
+    , bClosingUnderscore(false)
     , bInStatement(false)
 {
 }
@@ -287,19 +288,11 @@ bool SbiScanner::NextSym()
         if(nCol < aLine.getLength() && bCompatible && 
aSym.equalsIgnoreAsciiCase("go"))
             scanGoto();
 
-        // replace closing '_' by space when end of line is following
-        // (wrong line continuation otherwise)
+        // tdf#125637 - check for closing underscore
         if (nCol == aLine.getLength() && aLine[nCol - 1] == '_')
         {
-            // We are going to modify a potentially shared string, so force
-            // a copy, so that aSym is not modified by the following operation
-            OUString aSymCopy( aSym.getStr(), aSym.getLength() );
-            aSym = aSymCopy;
-
-            // HACK: modifying a potentially shared string here!
-            const_cast<sal_Unicode*>(aLine.getStr())[nLineIdx - 1] = ' ';
+            bClosingUnderscore = true;
         }
-
         // type recognition?
         // don't test the exclamation mark
         // if there's a symbol behind it
@@ -686,7 +679,7 @@ PrevLineCommentLbl:
 
 
 eoln:
-    if( nCol && aLine[--nLineIdx] == '_' )
+    if (nCol && aLine[--nLineIdx] == '_' && !bClosingUnderscore)
     {
         nLineIdx = -1;
         bool bRes = NextSym();
@@ -707,6 +700,7 @@ eoln:
         nCol2 = nOldCol2;
         aSym = "\n";
         nColLock = 0;
+        bClosingUnderscore = false;
         return true;
     }
 }
diff --git a/basic/source/inc/scanner.hxx b/basic/source/inc/scanner.hxx
index 19ee31947120..39dda9fa391c 100644
--- a/basic/source/inc/scanner.hxx
+++ b/basic/source/inc/scanner.hxx
@@ -61,6 +61,7 @@ protected:
     bool   bCompatible;                 // true: OPTION compatible
     bool   bVBASupportOn;               // true: OPTION VBASupport 1 otherwise 
default False
     bool   bPrevLineExtentsComment;     // true: Previous line is comment and 
ends on "... _"
+    bool   bClosingUnderscore;          // true: Closing underscore followed 
by end of line
 
     bool   bInStatement;
     void   GenError( ErrCode );

Reply via email to