Browse Source

* Additional case where whitespace can mess up (bug ID 36037)

git-svn-id: trunk@42904 -
michael 6 years ago
parent
commit
57ac787370
2 changed files with 61 additions and 15 deletions
  1. 10 2
      packages/fcl-json/src/jsonscanner.pp
  2. 51 13
      packages/fcl-json/tests/testjsonparser.pp

+ 10 - 2
packages/fcl-json/src/jsonscanner.pp

@@ -257,6 +257,14 @@ begin
       FCurToken := Result;
       exit;
       end;
+  // Empty line
+  if (FTokenStr=FEOL) then
+    begin
+    Result := tkWhiteSpace;
+    FCurToken := Result;
+    exit;
+    end;
+
 
   FCurTokenString := '';
   case FTokenStr^ of
@@ -270,13 +278,13 @@ begin
       Result := tkWhitespace;
       repeat
         Inc(FTokenStr);
-        if FTokenStr[0] = #0 then
+        if (FTokenStr[0] = #0) or (FTokenStr=FEOL) then
           if not FetchLine then
           begin
             FCurToken := Result;
             exit;
           end;
-      until not (FTokenStr[0] in [#9, ' ']);
+      until not (FTokenStr[0] in [#9, ' ',#10, #13]);
       end;
     '"','''':
       begin

+ 51 - 13
packages/fcl-json/tests/testjsonparser.pp

@@ -70,6 +70,7 @@ type
     Procedure TestHandlerResult;
     Procedure TestHandlerResultStream;
     Procedure TestEmptyLine;
+    procedure TestBug36037Part2;
   end;
 
 implementation
@@ -540,20 +541,23 @@ begin
 end;
 
 procedure TTestParser.TestEmptyLine;
+
 // Bug report 36037
-Const MyJSON =
-'  {'+sLineBreak+
-'  "pylib__linux" : "libpython3.7m.so.1.0",'+sLineBreak+
-'  "ui_toolbar_theme": "default_24x24",'+sLineBreak+
-'  "ui_toolbar_show" : true,'+sLineBreak+
-'  "font_name__linux" : "DejaVu Sans Mono",'+sLineBreak+
-'  "font_size__linux" : 10,'+sLineBreak+
-'    "ui_listbox_fuzzy": false,'+sLineBreak+
-'    "ui_max_size_lexer": 5,'+sLineBreak+
-'    "find_separate_form": false,'+sLineBreak+sLineBreak+
-'}';
-  var
-    J : TJSONData;
+
+Const
+  MyJSON =
+    '  {'+sLineBreak+
+    '  "pylib__linux" : "libpython3.7m.so.1.0",'+sLineBreak+
+    '  "ui_toolbar_theme": "default_24x24",'+sLineBreak+
+    '  "ui_toolbar_show" : true,'+sLineBreak+
+    '  "font_name__linux" : "DejaVu Sans Mono",'+sLineBreak+
+    '  "font_size__linux" : 10,'+sLineBreak+
+    '    "ui_listbox_fuzzy": false,'+sLineBreak+
+    '    "ui_max_size_lexer": 5,'+sLineBreak+
+    '    "find_separate_form": false,'+sLineBreak+sLineBreak+
+    '}';
+var
+  J : TJSONData;
 begin
   With TJSONParser.Create(MyJSON,[joUTF8,joIgnoreTrailingComma]) do
   Try
@@ -564,6 +568,40 @@ begin
   end;
 end;
 
+procedure TTestParser.TestBug36037Part2;
+
+Const
+  MyJSON =
+
+'{'+sLineBreak+
+'  "tab_spaces": true,'+sLineBreak+
+'  //auto-indent kind:'+sLineBreak+
+'  //  0: indent like in prev line'+sLineBreak+
+'  //  1: by spaces'+sLineBreak+
+'  //  2: by tabs+spaces'+sLineBreak+
+'  //  3: by tabs only'+sLineBreak+
+'  "indent_kind": 1,'+sLineBreak+
+'  "indent_size": 4,'+sLineBreak+
+''+sLineBreak+
+'  "saving_trim_spaces": true,'+sLineBreak+
+''+sLineBreak+
+'//  "config_menus_from": "kv-menu JSON.json",'+sLineBreak+
+'    "find_hotkey_replace": "Alt+Enter",'+sLineBreak+
+'    "fold_style": 4,'+sLineBreak+
+'}'+sLineBreak;
+
+var
+  J : TJSONData;
+begin
+  With TJSONParser.Create(MyJSON,[joUTF8,joIgnoreTrailingComma,joComments]) do
+  Try
+    J:=Parse;
+    J.Free;
+  Finally
+    Free;
+  end;
+end;
+
 procedure TTestParser.DoTestError(S : String; Options : TJSONOptions = DefaultOpts);
 
 Var