Browse Source

* Fix bug #30720, } is processed wrongly when scanning and PPIsSkipping

git-svn-id: trunk@34879 -
michael 8 years ago
parent
commit
5d4f605a39
2 changed files with 23 additions and 1 deletions
  1. 2 1
      packages/fcl-passrc/src/pscanner.pp
  2. 21 0
      packages/fcl-passrc/tests/tcscanner.pas

+ 2 - 1
packages/fcl-passrc/src/pscanner.pp

@@ -1641,6 +1641,7 @@ var
   i: TToken;
   OldLength, SectionLength, NestingLevel, Index: Integer;
 begin
+  result:=tkLineEnding;
   if TokenStr = nil then
     if not FetchLine then
     begin
@@ -2005,7 +2006,7 @@ begin
           begin
             if not(po_delphi in Options) and (TokenStr[0] = '{') then
               Inc(NestingLevel)
-            else if TokenStr[0] = '}' then
+            else if (TokenStr[0] = '}') and not PPIsSkipping then
               Dec(NestingLevel);
             Inc(TokenStr);
           end;

+ 21 - 0
packages/fcl-passrc/tests/tcscanner.pas

@@ -209,6 +209,7 @@ type
     Procedure TestDefine11;
     Procedure TestDefine12;
     Procedure TestDefine13;
+    Procedure TestDefine14;
     Procedure TestInclude;
     Procedure TestInclude2;
     Procedure TestUnDefine1;
@@ -1396,6 +1397,26 @@ begin
   TestTokens([tkin],'{$IFDEF ALWAYS} }; ą è {$ELSE} in {$ENDIF}');
 end;
 
+procedure TTestScanner.TestDefine14;
+Const
+   Source = '{$ifdef NEVER_DEFINED}' +sLineBreak+
+            'type'+sLineBreak+
+            '  TNPEventModel = ('+sLineBreak+
+            '  NPEventModelCarbon = 0,'+sLineBreak+
+            '  NPEventModelCocoa = 1'+sLineBreak+
+            '}; // yes, this is an error... except this code should never be included.'+sLineBreak+
+            'ą'+sLineBreak+
+            '|'+sLineBreak+
+            '{$endif}'+sLineBreak+
+            ''+sLineBreak+
+            'begin'+sLineBreak+
+            'end.'+sLineBreak;
+begin
+  NewSource(Source,True);
+  While FScanner.fetchToken<>tkEOF do
+
+end;
+
 procedure TTestScanner.TestInclude;
 begin
   FResolver.AddStream('myinclude.inc',TStringStream.Create('if true then'));