summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--basic/qa/basic_coverage/test_tdf125637.bas34
-rw-r--r--basic/qa/cppunit/test_scanner.cxx3
-rw-r--r--basic/source/comp/scanner.cxx16
-rw-r--r--basic/source/inc/scanner.hxx1
4 files changed, 42 insertions, 12 deletions
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 );