chelper: support for macros with variable arguments. end offset of a comment

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3982 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
skalogryz
2015-03-03 03:06:50 +00:00
parent 23d6bdc557
commit bacca9d664

View File

@ -69,6 +69,7 @@ type
MacroName : AnsiString; MacroName : AnsiString;
MacroParams : TStringList; MacroParams : TStringList;
ReplaceText : AnsiString; ReplaceText : AnsiString;
isVariableParams : Boolean;
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
@ -168,6 +169,7 @@ type
public public
Params : TStringList; Params : TStringList;
_Name : AnsiString; _Name : AnsiString;
isVar : Boolean;
SubsText : AnsiString; SubsText : AnsiString;
destructor Destroy; override; destructor Destroy; override;
end; end;
@ -804,6 +806,7 @@ begin
comment := TComment.Create(idx); comment := TComment.Create(idx);
comment._Comment := cmt; comment._Comment := cmt;
comment.CommenType:=ct; comment.CommenType:=ct;
comment.EndOffset:=Index;
Comments.Add(Comment); Comments.Add(Comment);
end; end;
if (Assigned(OnComment)) then OnComment(Self, cmt); if (Assigned(OnComment)) then OnComment(Self, cmt);
@ -1263,11 +1266,21 @@ procedure TCMacroHandler.AddParamMacro(const MacroStr,ReplaceStr:AnsiString;
var var
cm : TCMacroStruct; cm : TCMacroStruct;
i : Integer; i : Integer;
begin begin
cm := TCMacroStruct.Create; cm := TCMacroStruct.Create;
cm.MacroName := MacroStr; cm.MacroName := MacroStr;
cm.ReplaceText := ReplaceStr; cm.ReplaceText := ReplaceStr;
if Assigned(Params) then cm.MacroParams.Assign(Params); if Assigned(Params) then begin
cm.MacroParams.Assign(Params);
i:=cm.MacroParams.Count-1;
if i>=0 then begin
if (cm.MacroParams[i]='...') then begin
cm.isVariableParams:=true;
cm.MacroParams.Delete(i);
end;
end;
end;
i := MacrosNames.IndexOf(MacroStr); i := MacrosNames.IndexOf(MacroStr);
if i >= 0 then begin if i >= 0 then begin
@ -1338,6 +1351,10 @@ var
//j : Integer; //j : Integer;
cm : TCMacroStruct; cm : TCMacroStruct;
RVal : TStringList; RVal : TStringList;
va : string;
const
VaArgs = '__VA_ARGS__';
begin begin
Parser.FindNextToken(s, tt); Parser.FindNextToken(s, tt);
i := MacrosNames.IndexOf(s); i := MacrosNames.IndexOf(s);
@ -1368,12 +1385,20 @@ begin
while Parser.Token<>')' do begin while Parser.Token<>')' do begin
ParseCMacroParam(Parser, x); ParseCMacroParam(Parser, x);
Result:=i<cm.MacroParams.Count; Result:=(i<cm.MacroParams.Count) or cm.isVariableParams;
if not Result then begin if not Result then begin
Parser.SetError('too many params for the Macro: '+ name); Parser.SetError('too many params for the Macro: '+ name);
Exit; Exit;
end; end;
RVal.Values [ cm.MacroParams[i]]:=x;
if i>=cm.MacroParams.Count then begin
//todo: optimize. Values access is slow!
va:=RVal.Values[ VaArgs ];
if va='' then va:=x
else va:=va+','+x;
RVal.Values[ VaArgs ]:=va;
end else
RVal.Values [ cm.MacroParams[i]]:=x;
Parser.NextToken; Parser.NextToken;
if Parser.Token=',' then Parser.NextToken; if Parser.Token=',' then Parser.NextToken;