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.heinisch@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 0000000..e4eff75
--- /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 6459ab4..6559b3e 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 95235977..a0d9b9a 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 19ee319..39dda9f 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 );