From a34187ffdc81694673e38aee53c7d1d1907db2ee Mon Sep 17 00:00:00 2001
From: michael <michael@freepascal.org>
Date: Sun, 23 Aug 2020 10:36:22 +0000
Subject: [PATCH] * Merging revisions r45415 from trunk:    
 ------------------------------------------------------------------------    
 r45415 | michael | 2020-05-18 10:28:14 +0200 (Mon, 18 May 2020) | 1 line

    * Add OnComment
    ------------------------------------------------------------------------

git-svn-id: branches/fixes_3_2@46646 -
---
 packages/fcl-passrc/src/pscanner.pp     | 26 +++++++++++++++++++------
 packages/fcl-passrc/tests/tcscanner.pas | 20 +++++++++++++++++++
 2 files changed, 40 insertions(+), 6 deletions(-)

diff --git a/packages/fcl-passrc/src/pscanner.pp b/packages/fcl-passrc/src/pscanner.pp
index c5a76477d0..38eec9e7be 100644
--- a/packages/fcl-passrc/src/pscanner.pp
+++ b/packages/fcl-passrc/src/pscanner.pp
@@ -684,8 +684,8 @@ type
   TPScannerLogHandler = Procedure (Sender : TObject; Const Msg : String) of object;
   TPScannerLogEvent = (sleFile,sleLineNumber,sleConditionals,sleDirective);
   TPScannerLogEvents = Set of TPScannerLogEvent;
-  TPScannerDirectiveEvent = procedure(Sender: TObject; Directive, Param: String;
-    var Handled: boolean) of object;
+  TPScannerDirectiveEvent = procedure(Sender: TObject; Directive, Param: String; var Handled: boolean) of object;
+  TPScannerCommentEvent = procedure(Sender: TObject; aComment : String) of object;
   TPScannerFormatPathEvent = function(const aPath: string): string of object;
   TPScannerWarnEvent = procedure(Sender: TObject; Identifier: string; State: TWarnMsgState; var Handled: boolean) of object;
   TPScannerModeDirective = procedure(Sender: TObject; NewMode: TModeSwitch; Before: boolean; var Handled: boolean) of object;
@@ -734,6 +734,7 @@ type
     FMacros: TStrings; // Objects are TMacroDef
     FDefines: TStrings;
     FNonTokens: TTokens;
+    FOnComment: TPScannerCommentEvent;
     FOnDirective: TPScannerDirectiveEvent;
     FOnEvalFunction: TCEEvalFunctionEvent;
     FOnEvalVariable: TCEEvalVarEvent;
@@ -799,6 +800,7 @@ type
     function HandleDirective(const ADirectiveText: String): TToken; virtual;
     function HandleLetterDirective(Letter: char; Enable: boolean): TToken; virtual;
     procedure HandleBoolDirective(bs: TBoolSwitch; const Param: String); virtual;
+    procedure DoHandleComment(Sender: TObject; const aComment : string); virtual;
     procedure DoHandleDirective(Sender: TObject; Directive, Param: String;
       var Handled: boolean); virtual;
     procedure HandleIFDEF(const AParam: String);
@@ -882,7 +884,6 @@ type
     property Defines: TStrings read FDefines;
     property Macros: TStrings read FMacros;
     property MacrosOn: boolean read GetMacrosOn write SetMacrosOn;
-    property OnDirective: TPScannerDirectiveEvent read FOnDirective write FOnDirective;
     property AllowedModeSwitches: TModeSwitches read FAllowedModeSwitches Write SetAllowedModeSwitches;
     property ReadOnlyModeSwitches: TModeSwitches read FReadOnlyModeSwitches Write SetReadOnlyModeSwitches;// always set, cannot be disabled
     property CurrentModeSwitches: TModeSwitches read FCurrentModeSwitches Write SetCurrentModeSwitches;
@@ -908,6 +909,9 @@ type
     property OnEvalFunction: TCEEvalFunctionEvent read FOnEvalFunction write FOnEvalFunction;
     property OnWarnDirective: TPScannerWarnEvent read FOnWarnDirective write FOnWarnDirective;
     property OnModeChanged: TPScannerModeDirective read FOnModeChanged write FOnModeChanged; // set by TPasParser
+    property OnDirective: TPScannerDirectiveEvent read FOnDirective write FOnDirective;
+    property OnComment: TPScannerCommentEvent read FOnComment write FOnComment;
+
 
     property LastMsg: string read FLastMsg write FLastMsg;
     property LastMsgNumber: integer read FLastMsgNumber write FLastMsgNumber;
@@ -4096,11 +4100,17 @@ begin
     CurrentBoolSwitches:=CurrentBoolSwitches-[bs];
 end;
 
+procedure TPascalScanner.DoHandleComment(Sender: TObject; const aComment: string);
+begin
+  if Assigned(OnComment) then
+    OnComment(Sender,aComment);
+end;
+
 procedure TPascalScanner.DoHandleDirective(Sender: TObject; Directive,
   Param: String; var Handled: boolean);
 begin
   if Assigned(OnDirective) then
-    OnDirective(Self,Directive,Param,Handled);
+    OnDirective(Sender,Directive,Param,Handled);
 end;
 
 function TPascalScanner.DoFetchToken: TToken;
@@ -4301,7 +4311,9 @@ begin
         Inc(FTokenPos, 2);
         Result := tkComment;
         if Copy(CurTokenString,1,1)='$' then
-          Result := HandleDirective(CurTokenString);
+          Result := HandleDirective(CurTokenString)
+        else
+          DoHandleComment(Self,CurTokenString);
         end;
       end;
     ')':
@@ -4602,7 +4614,9 @@ begin
       Inc(FTokenPos);
       Result := tkComment;
       if (Copy(CurTokenString,1,1)='$') then
-        Result:=HandleDirective(CurTokenString);
+        Result:=HandleDirective(CurTokenString)
+      else
+        DoHandleComment(Self, CurTokenString)
       end;
     'A'..'Z', 'a'..'z', '_':
       begin
diff --git a/packages/fcl-passrc/tests/tcscanner.pas b/packages/fcl-passrc/tests/tcscanner.pas
index e3fd8eb297..4a50306f65 100644
--- a/packages/fcl-passrc/tests/tcscanner.pas
+++ b/packages/fcl-passrc/tests/tcscanner.pas
@@ -55,7 +55,10 @@ type
     FLI: String;
     FScanner : TPascalScanner;
     FResolver : TStreamResolver;
+    FDoCommentCalled : Boolean;
+    FComment: string;
   protected
+    procedure DoComment(Sender: TObject; aComment: String);
     procedure SetUp; override;
     procedure TearDown; override;
     Function TokenToString(tk : TToken) : string;
@@ -82,6 +85,7 @@ type
     procedure TestNestedComment3;
     procedure TestNestedComment4;
     procedure TestNestedComment5;
+    procedure TestonComment;
     procedure TestIdentifier;
     procedure TestSelf;
     procedure TestSelfNoToken;
@@ -369,8 +373,15 @@ end;
   TTestScanner
   ---------------------------------------------------------------------}
 
+procedure TTestScanner.DoComment(Sender: TObject; aComment: String);
+begin
+  FDoCommentCalled:=True;
+  FComment:=aComment;
+end;
+
 procedure TTestScanner.SetUp;
 begin
+  FDoCommentCalled:=False;
   FResolver:=TStreamResolver.Create;
   FResolver.OwnsStreams:=True;
   FScanner:=TTestingPascalScanner.Create(FResolver);
@@ -571,6 +582,15 @@ begin
   TestToken(tkComment,'(* (* comment *) *)');
 end;
 
+procedure TTestScanner.TestonComment;
+begin
+  FScanner.OnComment:=@DoComment;
+  DoTestToken(tkComment,'(* abc *)',False);
+  assertTrue('Comment called',FDoCommentCalled);
+  AssertEquals('Correct comment',' abc ',Scanner.CurTokenString);
+  AssertEquals('Correct comment token',' abc ',FComment);
+end;
+
 
 procedure TTestScanner.TestIdentifier;