diff --git a/packages/fcl-passrc/src/pscanner.pp b/packages/fcl-passrc/src/pscanner.pp index 1b59d00dcc..07ca26990a 100644 --- a/packages/fcl-passrc/src/pscanner.pp +++ b/packages/fcl-passrc/src/pscanner.pp @@ -4032,26 +4032,29 @@ var i : Integer; begin - i:=MultilineStringsTrimLeft; - if I=-1 then - // auto unindent -> use line indent of first line - I:=StartPos+1; - if I>0 then + // Start of line, take indent into account + if ({$ifdef UsePChar}TokenStart=PAnsichar(FCurLine){$ELSE}Tokenstart=1{$ENDIF}) then begin - // fixed unindent -> remove up to I leading spaces - While ({$ifdef UsePChar} TokenStart^{$ELSE}FCurLine[TokenStart]{$ENDIF} in [' ',#9]) and (TokenStart<=FTokenPos) and (I>0) do + i:=MultilineStringsTrimLeft; + if I=-1 then + // auto unindent -> use line indent of first line + I:=StartPos+1; + if I>0 then begin - Inc(TokenStart); - Dec(I); + // fixed unindent -> remove up to I leading spaces + While ({$ifdef UsePChar} TokenStart^{$ELSE}FCurLine[TokenStart]{$ENDIF} in [' ',#9]) and (TokenStart<=FTokenPos) and (I>0) do + begin + Inc(TokenStart); + Dec(I); + end; + end + else if I=-2 then + begin + // no indent -> remove all leading spaces + While ({$ifdef UsePChar} TokenStart^{$ELSE}FCurLine[TokenStart]{$ENDIF} in [' ',#9]) and (TokenStart<=FTokenPos) do + Inc(TokenStart); end; - end - else if I=-2 then - begin - // no indent -> remove all leading spaces - While ({$ifdef UsePChar} TokenStart^{$ELSE}FCurLine[TokenStart]{$ENDIF} in [' ',#9]) and (TokenStart<=FTokenPos) do - Inc(TokenStart); end; - {$ifdef UsePChar} Add(TokenStart,FTokenPos - TokenStart); {$else} @@ -4189,6 +4192,9 @@ begin AddToCurString(false); AddApostroph; TokenStart := FTokenPos; + // Can happen if the last char on the line was the quote.. + if ({$ifdef UsePChar}FTokenPos[0] = #0{$else}FTokenPos>l{$endif}) then + Dec(FTokenPos); end; end; Inc(FTokenPos); diff --git a/packages/fcl-passrc/tests/tcscanner.pas b/packages/fcl-passrc/tests/tcscanner.pas index 731eade2fb..414fbc8a5d 100644 --- a/packages/fcl-passrc/tests/tcscanner.pas +++ b/packages/fcl-passrc/tests/tcscanner.pas @@ -138,6 +138,7 @@ type procedure TestMultilineStringTrimAll; procedure TestMultilineStringTrimAuto; procedure TestMultilineStringTrim2; + procedure TestMultilineStringQuoted; Procedure TestDelphiMultiLine; procedure TestDelphiMultiLineNotEnabled; procedure TestDelphiMultiLineWrongIndent; @@ -925,6 +926,23 @@ begin AssertEquals('Correct trim 2',S2,TestTokenString); end; +procedure TTestScanner.TestMultilineStringQuoted; + +const Src = '`'+sLineBreak+ + 'message: ''DataNodeProcessor "'' + this.nodeID + ''" already waiting for data'''+sLineBreak+ + '`'; + Res = #39+sLineBreak+ + 'message: ''''DataNodeProcessor "'''' + this.nodeID + ''''" already waiting for data'''''+sLineBreak+ + ''''; +begin + SCanner.MultilineStringsTrimLeft:=2; + Scanner.CurrentModeSwitches:=[msMultiLineStrings]; + Scanner.MultilineStringsEOLStyle:=elLF; + Scanner.SkipWhiteSpace:=True; + DoTestToken(pscanner.tkString,Src); + AssertEquals('Correct trim',Res,TestTokenString); +end; + procedure TTestScanner.DoTestDelphiMultiLineString;