Added option -d to gir2pas to include deprecated functions in bindings

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2495 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
drewski207 2012-08-26 21:39:16 +00:00
parent c535a5cb15
commit daa7d2edf2
3 changed files with 20 additions and 9 deletions

View File

@ -129,7 +129,7 @@ begin
FindClose(Sr);
end;
if Result = nil then
WriteLn('Unable to find gir file: ',NamespaceName);
WriteLn('Fatal: Unable to find gir file: ',NamespaceName);
end;
procedure TGirConsoleConverter.WriteFile(Sender: TObject; AName: String; AStream: TStringStream);
@ -211,6 +211,7 @@ begin
AddOption(['w', 'overwrite-files'], False ,'If the output .pas file(s) already exists then overwrite them.');
AddOption(['n', 'no-default'], False ,'/usr/share/gir-1.0 is not added as a search location for needed .gir files.');
AddOption(['p', 'paths'], True ,'List of paths seperated by ":" to search for needed .gir files.');
AddOption(['d', 'deprecated'], False, 'Include fields and methods marked as deprecated.');
AddOption(['t', 'test'], False ,'Creates a test program per unit to verify struct sizes.');
end;
FCmdOptions.ReadOptions;
@ -268,6 +269,9 @@ begin
if FCmdOptions.HasOption('dynamic') then
Include(FOptions, goLinkDynamic);
if FCmdOptions.HasOption('deprecated') then
Include(FOptions, goIncludeDeprecated);
if FCmdOptions.HasOption('classes') then
begin
Include(FOptions, goClasses);

View File

@ -220,6 +220,7 @@ type
private
FCIdentifier: String;
FDeprecated: Boolean;
FDeprecatedMsg: String;
FDeprecatedVersion: String;
FParams: TgirParamList;
FReturns: TgirFunctionReturn;
@ -230,6 +231,7 @@ type
property Returns: TgirFunctionReturn read FReturns;
property CIdentifier: String read FCIdentifier;
property Deprecated: Boolean read FDeprecated;
property DeprecatedMsg: String read FDeprecatedMsg;
property DeprecatedVersion: String read FDeprecatedVersion;
end;
@ -939,7 +941,10 @@ begin
end;
FDeprecated:=TDOMElement(ANode).GetAttribute('deprecated') <> '';
if FDeprecated then
begin
FDeprecatedMsg:=TDOMElement(ANode).GetAttribute('deprecated');
FDeprecatedVersion:=TDOMElement(ANode).GetAttribute('deprecated-version');
end;
FObjectType:=otFunction;
end;

View File

@ -8,7 +8,7 @@ uses
Classes, SysUtils, girNameSpaces, girObjects, girTokens, contnrs;
type
TgirOption = (goWantTest, goLinkDynamic, goSeperateConsts, goClasses, goObjects);
TgirOption = (goWantTest, goLinkDynamic, goSeperateConsts, goClasses, goObjects, goIncludeDeprecated);
TgirOptions = set of TgirOption;
TgirWriteEvent = procedure (Sender: TObject; AUnitName: AnsiString; AStream: TStringStream) of object;
@ -1143,13 +1143,14 @@ var
Postfix: String;
Entry: String;
InLineS: String = '';
Deprecated: String = '';
ProperUnit: TPascalUnit;
OptionsIndicateWrapperMethod: Boolean;
begin
Result := '';
OptionsIndicateWrapperMethod:= FUnitType = PascalUnitTypeAll;
// we skip deprecated functions
if AFunction.Deprecated then //and (CompareStr(AFunction.DeprecatedVersion, NameSpace.Version) >= 0) then
if AFunction.Deprecated and not (goIncludeDeprecated in FOptions) then //and (CompareStr(AFunction.DeprecatedVersion, NameSpace.Version) >= 0) then
Exit;
// some abstract functions that are to be implemented by a module and shouldn't be declared. There is no indicator in the gir file that this is so :(
@ -1162,6 +1163,7 @@ begin
if AWantWrapperForObject then
InLineS:=' inline;';
if AFunction.Deprecated then Deprecated :=' deprecated ''Since ' + NameSpace.NameSpace + ' ' + AFunction.DeprecatedVersion+' '+StringReplace(AFunction.DeprecatedMsg,'''','`', [rfReplaceAll])+''';';
// this fills in the values for procedure/function and the return type
WriteFunctionTypeAndReturnType(AFunction, RoutineType, Returns);
@ -1173,9 +1175,9 @@ begin
if Pos('array of const', Params) + Pos('va_list', Params) > 0 then
Prefix:='//';
if not (goLinkDynamic in FOptions) then
Postfix := ' external;'// '+UnitName+'_library;';
Postfix := ' external;'+ Deprecated// '+UnitName+'_library;';
else
PostFix := '';
PostFix := ''+Deprecated;
// first wrapper proc
Entry := Prefix + RoutineType +' '+ SanitizeName(AFunction.Name, AExistingUsedNames)+ParenParams(Params)+Returns+InLineS;
@ -1187,7 +1189,7 @@ begin
// This is the line that will be used by in the TObject declaration. <----
// result will be written in the object declaration.
if OptionsIndicateWrapperMethod then
Result := Entry
Result := Entry + Deprecated
else
Result := '';
@ -1283,12 +1285,12 @@ var
SetFound := SetFound or (Pos(LookingForSet+'(', Line) > 0);
// the first argument must match the property type! (result is the return type)
if SetFound and (Pos(Result+')', Line) = 0) then
writeln('Eliminated ', Line, ' for missing: ', Result);
//if SetFound and (Pos(Result+')', Line) = 0) then
// writeln('Eliminated ', Line, ' for missing: ', Result);
SetFound := SetFound and (Pos(Result+')', Line) > 0);
// pascal properties cannot use functions for the set 'procedure'
SetFound := SetFound and (Pos('procedure ', Line) > 0);
SetFound := SetFound and (Pos('procedure ', Line) > 0) and (Pos('property '+AProperty.Name, Line) = 0);
if SetFound then
Exit;