You've already forked lazarus-ccr
chelper: added parsing for objc2.0 properties
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1286 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -145,6 +145,7 @@ type
|
|||||||
|
|
||||||
function GetPasObjCMethodName(names: TStrings): AnsiString;
|
function GetPasObjCMethodName(names: TStrings): AnsiString;
|
||||||
procedure WriteObjCMethod(m: TObjCMethod);
|
procedure WriteObjCMethod(m: TObjCMethod);
|
||||||
|
procedure WriteObjCMethods(list: TList);
|
||||||
procedure WriteObjCInterface(cent: TObjCInterface);
|
procedure WriteObjCInterface(cent: TObjCInterface);
|
||||||
procedure WriteObjCProtocol(cent: TObjCProtocol);
|
procedure WriteObjCProtocol(cent: TObjCProtocol);
|
||||||
|
|
||||||
@ -632,6 +633,22 @@ begin
|
|||||||
wr.W(''';');
|
wr.W(''';');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCodeConvertor.WriteObjCMethods(list:TList);
|
||||||
|
var
|
||||||
|
ent : TEntity;
|
||||||
|
i : Integer;
|
||||||
|
begin
|
||||||
|
if not Assigned(list) or (list.Count=0) then Exit;
|
||||||
|
for i:=0 to list.Count-1 do begin
|
||||||
|
ent:=TEntity(list[i]);
|
||||||
|
if not Assigned(ent) then Continue;
|
||||||
|
WriteLnCommentsBeforeOffset(ent.Offset);
|
||||||
|
if ent is TObjCMethod then
|
||||||
|
WriteObjCMethod(TObjCMethod(ent));
|
||||||
|
WriteLnCommentForOffset(ent.Offset);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TCodeConvertor.WriteObjCInterface(cent:TObjCInterface);
|
procedure TCodeConvertor.WriteObjCInterface(cent:TObjCInterface);
|
||||||
var
|
var
|
||||||
i : Integer;
|
i : Integer;
|
||||||
@ -675,7 +692,8 @@ begin
|
|||||||
if cent.Methods.Count>0 then begin
|
if cent.Methods.Count>0 then begin
|
||||||
wr.Wln('public');
|
wr.Wln('public');
|
||||||
wr.IncIdent;
|
wr.IncIdent;
|
||||||
for i:=0 to cent.Methods.Count-1 do begin
|
for i:=0 to cent.Methods.Count-1 do
|
||||||
|
if TObject(cent.Methods[i]) is TObjCMethod then begin
|
||||||
m:=TObjCMethod(cent.Methods[i]);
|
m:=TObjCMethod(cent.Methods[i]);
|
||||||
WriteLnCommentsBeforeOffset(m.Offset);
|
WriteLnCommentsBeforeOffset(m.Offset);
|
||||||
WriteObjCMethod(m);
|
WriteObjCMethod(m);
|
||||||
@ -689,7 +707,6 @@ end;
|
|||||||
procedure TCodeConvertor.WriteObjCProtocol(cent:TObjCProtocol);
|
procedure TCodeConvertor.WriteObjCProtocol(cent:TObjCProtocol);
|
||||||
var
|
var
|
||||||
i : Integer;
|
i : Integer;
|
||||||
m : TObjCMethod;
|
|
||||||
begin
|
begin
|
||||||
SetPasSection(wr, 'type');
|
SetPasSection(wr, 'type');
|
||||||
wr.W(cent.Name+'Protocol = objcprotocol');
|
wr.W(cent.Name+'Protocol = objcprotocol');
|
||||||
@ -701,12 +718,7 @@ begin
|
|||||||
wr.Wln(')');
|
wr.Wln(')');
|
||||||
end;
|
end;
|
||||||
wr.IncIdent;
|
wr.IncIdent;
|
||||||
for i:=0 to cent.Methods.Count-1 do begin
|
WriteObjCMethods(cent.Methods);
|
||||||
m:=TObjCMethod(cent.Methods[i]);
|
|
||||||
WriteLnCommentsBeforeOffset(m.Offset);
|
|
||||||
WriteObjCMethod(m);
|
|
||||||
WriteLnCommentForOffset(m.Offset);
|
|
||||||
end;
|
|
||||||
wr.DecIdent;
|
wr.DecIdent;
|
||||||
wr.W('end; ');
|
wr.W('end; ');
|
||||||
wr.Wln(' external name '''+cent.Name+''';');
|
wr.Wln(' external name '''+cent.Name+''';');
|
||||||
|
@ -96,10 +96,23 @@ type
|
|||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TObjCProperty }
|
||||||
|
|
||||||
|
TObjCProperty = class(TEntity)
|
||||||
|
public
|
||||||
|
Name : TNamePart;
|
||||||
|
RetType : TEntity;
|
||||||
|
SetterName : AnsiString;
|
||||||
|
GetterName : AnsiString;
|
||||||
|
Props : TStringList;
|
||||||
|
constructor Create(AOffset: Integer=-1); override;
|
||||||
|
destructor Destroy; override;
|
||||||
|
end;
|
||||||
|
|
||||||
function ParseClassList(AParser: TTextParser): TObjCClasses;
|
function ParseClassList(AParser: TTextParser): TObjCClasses;
|
||||||
function ParseInterface(AParser: TTextParser): TObjCInterface;
|
function ParseInterface(AParser: TTextParser): TObjCInterface;
|
||||||
function ParseMethod(AParser: TTextParser): TObjCMethod;
|
function ParseMethod(AParser: TTextParser): TObjCMethod;
|
||||||
|
function ParseProperty(AParser: TTextParser): TObjCProperty;
|
||||||
function ParseMethods(AParser: TTextParser; MethodsList: TList; const EndToken: AnsiString): Boolean;
|
function ParseMethods(AParser: TTextParser; MethodsList: TList; const EndToken: AnsiString): Boolean;
|
||||||
function ParseProtocol(AParser: TTextParser): TEntity;
|
function ParseProtocol(AParser: TTextParser): TEntity;
|
||||||
|
|
||||||
@ -393,17 +406,24 @@ end;
|
|||||||
function ParseMethods(AParser: TTextParser; MethodsList: TList; const EndToken: AnsiString = '@end'): Boolean;
|
function ParseMethods(AParser: TTextParser; MethodsList: TList; const EndToken: AnsiString = '@end'): Boolean;
|
||||||
var
|
var
|
||||||
m : TObjCMethod;
|
m : TObjCMethod;
|
||||||
|
p : TObjCProperty;
|
||||||
opt : TObjCMethodOpt;
|
opt : TObjCMethodOpt;
|
||||||
|
s : AnsiString;
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result:=False;
|
||||||
if not Assigned(MethodsList) or not Assigned(AParser) then Exit;
|
if not Assigned(MethodsList) or not Assigned(AParser) then Exit;
|
||||||
opt:=mo_Required;
|
opt:=mo_Required;
|
||||||
while (AParser.Token<>EndToken) and (AParser.Token<>'') and (AParser.Token[1] in ['+','-']) do begin
|
while (AParser.Token<>EndToken) and (AParser.Token<>'') and (AParser.Token[1] in ['+','-','@']) do begin
|
||||||
if isObjCKeyword(AParser.Token) then begin
|
if isObjCKeyword(AParser.Token) then begin
|
||||||
if GetObjCKeyword(AParser.Token)='optional'
|
s:=GetObjCKeyword(AParser.Token);
|
||||||
then opt:=mo_Optional
|
if s='property' then begin
|
||||||
|
p:=ParseProperty(AParser);
|
||||||
|
MethodsList.Add(p);
|
||||||
|
end else begin
|
||||||
|
if s='optional' then opt:=mo_Optional
|
||||||
else opt:=mo_Required;
|
else opt:=mo_Required;
|
||||||
AParser.NextToken
|
AParser.NextToken;
|
||||||
|
end;
|
||||||
end else begin
|
end else begin
|
||||||
m:=ParseMethod(AParser);
|
m:=ParseMethod(AParser);
|
||||||
if not Assigned(m) then Exit;
|
if not Assigned(m) then Exit;
|
||||||
@ -476,6 +496,66 @@ begin
|
|||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TObjCProperty }
|
||||||
|
|
||||||
|
constructor TObjCProperty.Create(AOffset:Integer);
|
||||||
|
begin
|
||||||
|
inherited Create(AOffset);
|
||||||
|
Props:=TStringList.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TObjCProperty.Destroy;
|
||||||
|
begin
|
||||||
|
RetType.Free;
|
||||||
|
Name.Free;
|
||||||
|
Props.Free;
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ParseProperty(AParser: TTextParser): TObjCProperty;
|
||||||
|
var
|
||||||
|
p : TObjCProperty;
|
||||||
|
s : AnsiString;
|
||||||
|
nm : AnsiString;
|
||||||
|
begin
|
||||||
|
Result:=nil;
|
||||||
|
if AParser.Token<>'@property' then Exit;
|
||||||
|
AParser.NextToken;
|
||||||
|
p := TObjCProperty.Create;
|
||||||
|
try
|
||||||
|
if AParser.Token='(' then begin
|
||||||
|
AParser.NextToken;
|
||||||
|
while AParser.Token<>')' do begin
|
||||||
|
s:=AParser.Token;
|
||||||
|
if (s='setter') or (s='getter') then begin
|
||||||
|
AParser.NextToken;
|
||||||
|
if not ConsumeToken(AParser, '=') and not ConsumeIdentifier(AParser, nm) then Exit;
|
||||||
|
if s='setter' then p.SetterName:=nm
|
||||||
|
else p.GetterName:=nm;
|
||||||
|
end else begin
|
||||||
|
p.Props.Add(nm);
|
||||||
|
AParser.NextToken;
|
||||||
|
end;
|
||||||
|
if AParser.Token=',' then AParser.NextToken;
|
||||||
|
end;
|
||||||
|
if AParser.Token=')' then
|
||||||
|
AParser.NextToken
|
||||||
|
else begin
|
||||||
|
ErrorExpect(AParser,')');
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
if ParseName(AParser, p.RetType, p.Name) then begin
|
||||||
|
Result:=p;
|
||||||
|
if APArser.Token=';' then AParser.NextToken;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
finally
|
||||||
|
if not Assigned(Result) then p.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
PrevParseNextEntity:=ParseNextEntity;
|
PrevParseNextEntity:=ParseNextEntity;
|
||||||
ParseNextEntity:=ParseNextObjCEntity;
|
ParseNextEntity:=ParseNextObjCEntity;
|
||||||
|
Reference in New Issue
Block a user