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:
skalogryz
2009-02-28 13:53:56 +00:00
parent 6f30ade18f
commit 9fa9abbd3f
2 changed files with 46 additions and 9 deletions

View File

@@ -72,14 +72,22 @@ type
ObjcIDReplace : AnsiString; // = 'objc.id';
fExternVarPrefix : AnsiString; // always '_'?
UseRefClassType : Boolean;
RefClassPostfix : AnsiString;
constructor Create;
destructor Destroy; override;
procedure AssignNewTypeName(const AName, TypeDefStr: AnsiString; var NewTypeName: AnsiString);
function GetCallConv(withSemiColon: Boolean = true): AnsiString;
function GetObjCClassReplaceName(const ObjCName: AnsiString): AnsiString;
property CallConv: AnsiString read fCallConv write SetCallConv;
property ExternFuncPrefix: AnsiString read fExternPrefix; // external function name prefix
property ExternVarPrefix: AnsiString read fExternVarPrefix; // external function var prefix
end;
var
@@ -1158,6 +1166,8 @@ var
subs : TStringList;
consts : TStringList;
cmt : TStringList;
cl : TClassDef;
clName : String;
PasSection : String;
@@ -1194,6 +1204,18 @@ begin
subs.Clear;
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
if Assigned(hdr.Items[i]) then begin
@@ -1303,8 +1325,8 @@ begin
restype := TClassMethodDef(cl.Items[j]).GetResultType;
if Assigned(restype) then begin
cmt := TClassMethodDef(cl.Items[j]).GetResultType.TagComment;
if cmt <> '' then
s := s + '{'+cmt+'}';
(*if cmt <> '' then
s := s + '{'+cmt+'}';*)
end;
subs.Add(SpacePrefix + s);
@@ -1799,6 +1821,7 @@ var
prm : TObjCParameterDef;
res : TObjCResultTypeDef;
td : TTypeDef;
nm : AnsiString;
begin
// i := 0;
for i := 0 to ent.Items.Count - 1 do begin
@@ -1818,18 +1841,20 @@ begin
TParamDescr(obj)._Descr := '_'+TParamDescr(obj)._Descr}
end else if (obj is TClassMethodDef) and not IsMethodConstructor(TClassDef(obj.Owner ), TClassMethodDef(obj)) then begin
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
td := TTypeDef(res._Type);
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 else if (obj is TObjCParameterDef) then begin
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
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;
@@ -1838,8 +1863,9 @@ begin
end else if (obj is TStructField) then begin
// should _TypeName to be removed?
if ConvertSettings.ObjCClassTypes.IndexOf(TStructField(obj)._TypeName) >= 0 then begin
TStructField(obj)._TypeName := ConvertSettings.ObjCIDReplace
nm := TStructField(obj)._TypeName;
if ConvertSettings.ObjCClassTypes.IndexOf(nm) >= 0 then begin
TStructField(obj)._TypeName := ConvertSettings.GetObjCClassReplaceName(nm);
end;
end else if (obj is TClassesForward) then begin
for j := 0 to TClassesForward(obj)._Classes.Count - 1 do
@@ -1989,6 +2015,7 @@ begin
ObjcIDReplace := 'objc.id';
CallConv := 'cdecl';
fExternVarPrefix := '_';
RefClassPostfix := 'Ref';
end;
destructor TConvertSettings.Destroy;
@@ -2094,6 +2121,12 @@ begin
Result := Result + ';';
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);
begin
fCallConv := ACallConv;

View File

@@ -419,6 +419,8 @@ begin
else if prm = 'all' then doparseAll:=true
else if (prm = 'id') and (vlm <> '') then ConvertSettings.ObjcIDReplace:=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
ReadIniFile(Settings, vlm);
end else
@@ -457,7 +459,9 @@ begin
writeln(' default is cdecl. Please note, that calling convention');
writeln(' also effect external functions name. Thus, using ');
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;
var