You've already forked lazarus-ccr
added experimental switch -useRef, suggested by Ryan Jonas
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@727 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@@ -72,14 +72,22 @@ type
|
|||||||
ObjcIDReplace : AnsiString; // = 'objc.id';
|
ObjcIDReplace : AnsiString; // = 'objc.id';
|
||||||
fExternVarPrefix : AnsiString; // always '_'?
|
fExternVarPrefix : AnsiString; // always '_'?
|
||||||
|
|
||||||
|
UseRefClassType : Boolean;
|
||||||
|
RefClassPostfix : AnsiString;
|
||||||
|
|
||||||
|
|
||||||
constructor Create;
|
constructor Create;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
|
|
||||||
procedure AssignNewTypeName(const AName, TypeDefStr: AnsiString; var NewTypeName: AnsiString);
|
procedure AssignNewTypeName(const AName, TypeDefStr: AnsiString; var NewTypeName: AnsiString);
|
||||||
function GetCallConv(withSemiColon: Boolean = true): AnsiString;
|
function GetCallConv(withSemiColon: Boolean = true): AnsiString;
|
||||||
|
|
||||||
|
function GetObjCClassReplaceName(const ObjCName: AnsiString): AnsiString;
|
||||||
|
|
||||||
property CallConv: AnsiString read fCallConv write SetCallConv;
|
property CallConv: AnsiString read fCallConv write SetCallConv;
|
||||||
property ExternFuncPrefix: AnsiString read fExternPrefix; // external function name prefix
|
property ExternFuncPrefix: AnsiString read fExternPrefix; // external function name prefix
|
||||||
property ExternVarPrefix: AnsiString read fExternVarPrefix; // external function var prefix
|
property ExternVarPrefix: AnsiString read fExternVarPrefix; // external function var prefix
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
@@ -1158,6 +1166,8 @@ var
|
|||||||
subs : TStringList;
|
subs : TStringList;
|
||||||
consts : TStringList;
|
consts : TStringList;
|
||||||
cmt : TStringList;
|
cmt : TStringList;
|
||||||
|
cl : TClassDef;
|
||||||
|
clName : String;
|
||||||
|
|
||||||
PasSection : String;
|
PasSection : String;
|
||||||
|
|
||||||
@@ -1194,6 +1204,18 @@ begin
|
|||||||
subs.Clear;
|
subs.Clear;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
if ConvertSettings.UseRefClassType then
|
||||||
|
for i := 0 to hdr.Items.Count - 1 do
|
||||||
|
if (TObject(hdr.Items[i]) is TClassDef) then begin
|
||||||
|
cl := TClassDef(TObject(hdr.Items[i]));
|
||||||
|
if cl._Category = '' then begin
|
||||||
|
StartSection('type');
|
||||||
|
clName := ConvertSettings.GetObjCClassReplaceName( TClassDef(hdr.Items[i])._ClassName);
|
||||||
|
st.Add(Format(' %s = %s;', [clName, ConvertSettings.ObjcIDReplace]) );
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
for i := 0 to hdr.Items.Count - 1 do
|
for i := 0 to hdr.Items.Count - 1 do
|
||||||
if Assigned(hdr.Items[i]) then begin
|
if Assigned(hdr.Items[i]) then begin
|
||||||
|
|
||||||
@@ -1303,8 +1325,8 @@ begin
|
|||||||
restype := TClassMethodDef(cl.Items[j]).GetResultType;
|
restype := TClassMethodDef(cl.Items[j]).GetResultType;
|
||||||
if Assigned(restype) then begin
|
if Assigned(restype) then begin
|
||||||
cmt := TClassMethodDef(cl.Items[j]).GetResultType.TagComment;
|
cmt := TClassMethodDef(cl.Items[j]).GetResultType.TagComment;
|
||||||
if cmt <> '' then
|
(*if cmt <> '' then
|
||||||
s := s + '{'+cmt+'}';
|
s := s + '{'+cmt+'}';*)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
subs.Add(SpacePrefix + s);
|
subs.Add(SpacePrefix + s);
|
||||||
@@ -1799,6 +1821,7 @@ var
|
|||||||
prm : TObjCParameterDef;
|
prm : TObjCParameterDef;
|
||||||
res : TObjCResultTypeDef;
|
res : TObjCResultTypeDef;
|
||||||
td : TTypeDef;
|
td : TTypeDef;
|
||||||
|
nm : AnsiString;
|
||||||
begin
|
begin
|
||||||
// i := 0;
|
// i := 0;
|
||||||
for i := 0 to ent.Items.Count - 1 do begin
|
for i := 0 to ent.Items.Count - 1 do begin
|
||||||
@@ -1818,18 +1841,20 @@ begin
|
|||||||
TParamDescr(obj)._Descr := '_'+TParamDescr(obj)._Descr}
|
TParamDescr(obj)._Descr := '_'+TParamDescr(obj)._Descr}
|
||||||
end else if (obj is TClassMethodDef) and not IsMethodConstructor(TClassDef(obj.Owner ), TClassMethodDef(obj)) then begin
|
end else if (obj is TClassMethodDef) and not IsMethodConstructor(TClassDef(obj.Owner ), TClassMethodDef(obj)) then begin
|
||||||
res := TClassMethodDef(obj).GetResultType;
|
res := TClassMethodDef(obj).GetResultType;
|
||||||
if ConvertSettings.ObjCClassTypes.IndexOf( ObjCResultToDelphiType(res))>= 0 then
|
nm := ObjCResultToDelphiType(res);
|
||||||
|
if ConvertSettings.ObjCClassTypes.IndexOf(nm)>= 0 then
|
||||||
if res._Type is TTypeDef then begin
|
if res._Type is TTypeDef then begin
|
||||||
td := TTypeDef(res._Type);
|
td := TTypeDef(res._Type);
|
||||||
res.tagComment := td._Name;
|
res.tagComment := td._Name;
|
||||||
td._Name := ConvertSettings.ObjcIDReplace; //Format('objc.id', [td._Name] );
|
td._Name := ConvertSettings.GetObjCClassReplaceName(nm); //Format('objc.id', [td._Name] );
|
||||||
end;
|
end;
|
||||||
end else if (obj is TObjCParameterDef) then begin
|
end else if (obj is TObjCParameterDef) then begin
|
||||||
prm := TObjCParameterDef(obj);
|
prm := TObjCParameterDef(obj);
|
||||||
|
|
||||||
if ConvertSettings.ObjCClassTypes.IndexOf( ObjCResultToDelphiType(prm._Type) ) >= 0 then begin
|
nm := ObjCResultToDelphiType(prm._Type);
|
||||||
|
if ConvertSettings.ObjCClassTypes.IndexOf(nm) >= 0 then begin
|
||||||
if prm._Type._Type is TTypeDef then begin
|
if prm._Type._Type is TTypeDef then begin
|
||||||
TTypeDef(prm._Type._Type)._Name := ConvertSettings.ObjCIDReplace; //Format('objc.id {%s}', [TTypeDef(prm._Type._Type)._Name] );
|
TTypeDef(prm._Type._Type)._Name := ConvertSettings.GetObjCClassReplaceName(nm); //Format('objc.id {%s}', [TTypeDef(prm._Type._Type)._Name] );
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -1838,8 +1863,9 @@ begin
|
|||||||
|
|
||||||
end else if (obj is TStructField) then begin
|
end else if (obj is TStructField) then begin
|
||||||
// should _TypeName to be removed?
|
// should _TypeName to be removed?
|
||||||
if ConvertSettings.ObjCClassTypes.IndexOf(TStructField(obj)._TypeName) >= 0 then begin
|
nm := TStructField(obj)._TypeName;
|
||||||
TStructField(obj)._TypeName := ConvertSettings.ObjCIDReplace
|
if ConvertSettings.ObjCClassTypes.IndexOf(nm) >= 0 then begin
|
||||||
|
TStructField(obj)._TypeName := ConvertSettings.GetObjCClassReplaceName(nm);
|
||||||
end;
|
end;
|
||||||
end else if (obj is TClassesForward) then begin
|
end else if (obj is TClassesForward) then begin
|
||||||
for j := 0 to TClassesForward(obj)._Classes.Count - 1 do
|
for j := 0 to TClassesForward(obj)._Classes.Count - 1 do
|
||||||
@@ -1989,6 +2015,7 @@ begin
|
|||||||
ObjcIDReplace := 'objc.id';
|
ObjcIDReplace := 'objc.id';
|
||||||
CallConv := 'cdecl';
|
CallConv := 'cdecl';
|
||||||
fExternVarPrefix := '_';
|
fExternVarPrefix := '_';
|
||||||
|
RefClassPostfix := 'Ref';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TConvertSettings.Destroy;
|
destructor TConvertSettings.Destroy;
|
||||||
@@ -2094,6 +2121,12 @@ begin
|
|||||||
Result := Result + ';';
|
Result := Result + ';';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TConvertSettings.GetObjCClassReplaceName(const ObjCName: AnsiString): AnsiString;
|
||||||
|
begin
|
||||||
|
if UseRefClassType then Result := ObjCName + RefClassPostfix
|
||||||
|
else Result := ObjcIDReplace;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TConvertSettings.SetCallConv(const ACallConv: String);
|
procedure TConvertSettings.SetCallConv(const ACallConv: String);
|
||||||
begin
|
begin
|
||||||
fCallConv := ACallConv;
|
fCallConv := ACallConv;
|
||||||
|
@@ -419,6 +419,8 @@ begin
|
|||||||
else if prm = 'all' then doparseAll:=true
|
else if prm = 'all' then doparseAll:=true
|
||||||
else if (prm = 'id') and (vlm <> '') then ConvertSettings.ObjcIDReplace:=vlm
|
else if (prm = 'id') and (vlm <> '') then ConvertSettings.ObjcIDReplace:=vlm
|
||||||
else if (prm = 'call') then ConvertSettings.CallConv:=vlm
|
else if (prm = 'call') then ConvertSettings.CallConv:=vlm
|
||||||
|
else if (prm = 'userefs') then ConvertSettings.UseRefClassType := true
|
||||||
|
else if (prm = 'refpostfix') and (vlm <> '') then ConvertSettings.RefClassPostfix := vlm
|
||||||
else if prm = 'ini' then begin
|
else if prm = 'ini' then begin
|
||||||
ReadIniFile(Settings, vlm);
|
ReadIniFile(Settings, vlm);
|
||||||
end else
|
end else
|
||||||
@@ -457,7 +459,9 @@ begin
|
|||||||
writeln(' default is cdecl. Please note, that calling convention');
|
writeln(' default is cdecl. Please note, that calling convention');
|
||||||
writeln(' also effect external functions name. Thus, using ');
|
writeln(' also effect external functions name. Thus, using ');
|
||||||
writeln(' if calling convention is not cdecl, the external name');
|
writeln(' if calling convention is not cdecl, the external name');
|
||||||
writeln(' will be prefixed with underscore');
|
writeln(' -useRefs enables additional types to be created, for objc.id ');
|
||||||
|
writeln(' replacements at the parameter and result types');
|
||||||
|
writeln(' -refPostFix post-fix for each ref type. The default postfix is ''Ref''');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
|
Reference in New Issue
Block a user