CodeTools: support {$modeswitch multihelpers}. Issue #35911

git-svn-id: trunk@62702 -
This commit is contained in:
ondrej 2020-03-07 17:03:21 +00:00
parent dfd2b9ea65
commit 08b5b4a244

View File

@ -521,7 +521,7 @@ type
public public
function AddFromHelperNode(HelperNode: TCodeTreeNode; function AddFromHelperNode(HelperNode: TCodeTreeNode;
Tool: TFindDeclarationTool; Replace: Boolean): TFDHelpersListItem; Tool: TFindDeclarationTool; Replace: Boolean): TFDHelpersListItem;
procedure AddFromList(const ExtList: TFDHelpersList); procedure AddFromList(const Tool: TFindDeclarationTool; const ExtList: TFDHelpersList);
function IterateFromClassNode(ClassNode: TCodeTreeNode; function IterateFromClassNode(ClassNode: TCodeTreeNode;
Tool: TFindDeclarationTool; out HelperContext: TFindContext; out Iterator: TAVLTreeNode): boolean; // returns newest (rightmost) Tool: TFindDeclarationTool; out HelperContext: TFindContext; out Iterator: TAVLTreeNode): boolean; // returns newest (rightmost)
function GetNext(out HelperContext: TFindContext; var Iterator: TAVLTreeNode): boolean; function GetNext(out HelperContext: TFindContext; var Iterator: TAVLTreeNode): boolean;
@ -1770,13 +1770,14 @@ begin
Result := ComparePointers(I1^.Context.Node, I2.ForExprType.Context.Node); Result := ComparePointers(I1^.Context.Node, I2.ForExprType.Context.Node);
end; end;
procedure TFDHelpersList.AddFromList(const ExtList: TFDHelpersList); procedure TFDHelpersList.AddFromList(const Tool: TFindDeclarationTool;
const ExtList: TFDHelpersList);
function CopyNode(ANode: TAVLTreeNode): TFDHelpersListItem; function CopyNode(ANode: TAVLTreeNode): TFDHelpersListItem;
var var
FromNode: TFDHelpersListItem; FromNode: TFDHelpersListItem;
begin begin
FromNode := TFDHelpersListItem(ANode.Data); FromNode := TFDHelpersListItem(ANode.Data);
if Kind=fdhlkDelphiHelper then if (Kind=fdhlkDelphiHelper) and not (msMultiHelpers in Tool.Scanner.CompilerModeSwitches) then
if FTree.FindKey(FromNode, @CompareHelpersList) <> nil then if FTree.FindKey(FromNode, @CompareHelpersList) <> nil then
Exit(nil); //FPC & Delphi don't support duplicate class helpers! Exit(nil); //FPC & Delphi don't support duplicate class helpers!
Result := TFDHelpersListItem.Create; Result := TFDHelpersListItem.Create;
@ -1840,7 +1841,7 @@ begin
if ExprType.Desc in xtAllIdentTypes then if ExprType.Desc in xtAllIdentTypes then
begin begin
if Kind=fdhlkDelphiHelper then begin if (Kind=fdhlkDelphiHelper) and not (msMultiHelpers in Tool.Scanner.CompilerModeSwitches) then begin
// class/type/record helpers only allow one helper per class // class/type/record helpers only allow one helper per class
OldKey := FTree.FindKey(@ExprType, @CompareHelpersListExprType); OldKey := FTree.FindKey(@ExprType, @CompareHelpersListExprType);
if OldKey <> nil then if OldKey <> nil then
@ -4519,7 +4520,8 @@ var
finally finally
Params.Flags := OldFlags; Params.Flags := OldFlags;
end; end;
until (HelperKind=fdhlkDelphiHelper) or (not Helpers.GetNext(HelperContext,HelperIterator)); until ((HelperKind=fdhlkDelphiHelper) and not (msMultiHelpers in Params.StartTool.Scanner.CompilerModeSwitches))
or (not Helpers.GetNext(HelperContext,HelperIterator));
//debugln(['SearchInHelpers END']); //debugln(['SearchInHelpers END']);
end; end;
@ -6015,7 +6017,7 @@ begin
for HelperKind in TFDHelpersListKind do begin for HelperKind in TFDHelpersListKind do begin
Cache:=FInterfaceHelperCache[HelperKind]; Cache:=FInterfaceHelperCache[HelperKind];
if (Cache<>nil) and (Cache.Count>0) then if (Cache<>nil) and (Cache.Count>0) then
Params.GetHelpers(HelperKind,true).AddFromList(FInterfaceHelperCache[HelperKind]); Params.GetHelpers(HelperKind,true).AddFromList(AskingTool, FInterfaceHelperCache[HelperKind]);
end; end;
end; end;
end; end;