diff options
-rw-r--r-- | basic/qa/basic_coverage/test_tdf125637.bas | 34 | ||||
-rw-r--r-- | basic/qa/cppunit/test_scanner.cxx | 3 | ||||
-rw-r--r-- | basic/source/comp/scanner.cxx | 16 | ||||
-rw-r--r-- | basic/source/inc/scanner.hxx | 1 |
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 ); |