From 794bde9c4438577ea4427a770aac19e4f2f0f9ea Mon Sep 17 00:00:00 2001 From: skalogryz Date: Thu, 27 Mar 2008 15:27:00 +0000 Subject: [PATCH] precompiler added git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@389 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- bindings/pascocoa/parser/objcparser.pas | 54 +++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/bindings/pascocoa/parser/objcparser.pas b/bindings/pascocoa/parser/objcparser.pas index 52bd98112..fc16db455 100755 --- a/bindings/pascocoa/parser/objcparser.pas +++ b/bindings/pascocoa/parser/objcparser.pas @@ -14,22 +14,69 @@ program Project1; uses Classes, SysUtils, ObjCParserUtils, ObjCParserTypes; +type + // this object is used only for precomile directives handling + TPrecompileHandler = class(TObject) + public + hdr : TObjCHeader; + procedure OnPrecompile(Sender: TObject); + constructor Create(AHeader: TObjCHeader); + end; + +procedure TPrecompileHandler.OnPrecompile(Sender: TObject); +var + parser : TTextParser; + preEntity : TPrecompiler; + lst : TEntity; + prc : TNotifyEvent; +begin + parser := Sender as TTextParser; + //todo: change for something nicier =) + prc := parser.OnPrecompile; + parser.OnPrecompile := nil; + try + if parser.Stack.Count > 0 then + lst := TEntity(parser.Stack[parser.Stack.Count-1]) + else + lst := nil; + + preEntity := TPrecompiler.Create(lst); + preEntity.Parse(parser); + //writeln('added to: ', lst.ClassName, ' ', preEntity._Directive + preEntity._Params); + lst.Items.Add(preEntity); + //write('// debug: '); + //writeln('precompile: ', preEntity._Directive, ', params:', preEntity._Params); + finally + parser.OnPrecompile := prc; + end; +end; + +constructor TPrecompileHandler.Create(AHeader: TObjCHeader); +begin + hdr := AHeader; +end; + procedure ReadAndParseFile(const FileName: AnsiString; outdata: TStrings); var - hdr : TObjCHeader; - txt : TTextParser; - s : AnsiString; + hdr : TObjCHeader; + txt : TTextParser; + prec : TPrecompileHandler; + s : AnsiString; begin if not FileExists(FileName) then Exit; s := StrFromFile(FileName); hdr := TObjCHeader.Create; + prec := TPrecompileHandler.Create(hdr); txt := TTextParser.Create; txt.TokenTable := CreateObjCTokenTable; + try txt.Buf := s; try + txt.TokenTable.Precompile := '#'; + txt.OnPrecompile := prec.OnPrecompile; hdr._FileName := ExtractFileName(FileName); hdr.Parse(txt); except @@ -39,6 +86,7 @@ begin hdr.Free; txt.TokenTable.Free; txt.Free; + prec.Free; end; end;