You've already forked lazarus-ccr
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:
@ -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;
|
||||||
|
Reference in New Issue
Block a user