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'; 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;

View File

@@ -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