mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-11 09:16:16 +02:00
codetools: extended directorycacher for darwin filenames
git-svn-id: trunk@16384 -
This commit is contained in:
parent
35596739bf
commit
ebf2d6a8bf
@ -107,8 +107,10 @@ type
|
||||
|
||||
TStringToStringTree = class
|
||||
private
|
||||
FCompareKeyItemFunc: TListSortCompare;
|
||||
FTree: TAVLTree;// tree of TStringToStringTreeItem
|
||||
FCaseSensitive: boolean;
|
||||
function GetCompareItemsFunc: TListSortCompare;
|
||||
function GetStrings(const s: string): string;
|
||||
procedure SetStrings(const s: string; const AValue: string);
|
||||
function FindNode(const s: string): TAVLTreeNode;
|
||||
@ -125,13 +127,31 @@ type
|
||||
property CaseSensitive: boolean read FCaseSensitive;
|
||||
property Tree: TAVLTree read FTree;
|
||||
procedure WriteDebugReport;
|
||||
property CompareItemsFunc: TListSortCompare read GetCompareItemsFunc;
|
||||
property CompareKeyItemFunc: TListSortCompare read FCompareKeyItemFunc;
|
||||
procedure SetCompareFuncs(
|
||||
const NewCompareItemsFunc, NewCompareKeyItemFunc: TListSortCompare);
|
||||
end;
|
||||
|
||||
{ TFilenameToStringTree }
|
||||
|
||||
TFilenameToStringTree = class(TStringToStringTree)
|
||||
public
|
||||
constructor Create(CaseInsensitive: boolean);
|
||||
end;
|
||||
|
||||
function CompareStringToStringItems(Data1, Data2: Pointer): integer;
|
||||
function CompareStringToStringItemsI(Data1, Data2: Pointer): integer;
|
||||
function CompareStringAndStringToStringTreeItem(Key, Data: Pointer): integer;
|
||||
|
||||
function CompareStringToStringItemsI(Data1, Data2: Pointer): integer;
|
||||
function CompareStringAndStringToStringTreeItemI(Key, Data: Pointer): integer;
|
||||
|
||||
function CompareFilenameToStringItems(Data1, Data2: Pointer): integer;
|
||||
function CompareFilenameAndFilenameToStringTreeItem(Key, Data: Pointer): integer;
|
||||
|
||||
function CompareFilenameToStringItemsI(Data1, Data2: Pointer): integer;
|
||||
function CompareFilenameAndFilenameToStringTreeItemI(Key, Data: Pointer): integer;
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
@ -147,6 +167,12 @@ begin
|
||||
PStringToStringTreeItem(Data2)^.Name);
|
||||
end;
|
||||
|
||||
function CompareFilenameToStringItems(Data1, Data2: Pointer): integer;
|
||||
begin
|
||||
Result:=CompareFilenames(PStringToStringTreeItem(Data1)^.Name,
|
||||
PStringToStringTreeItem(Data2)^.Name);
|
||||
end;
|
||||
|
||||
function CompareStringAndStringToStringTreeItem(Key, Data: Pointer): integer;
|
||||
begin
|
||||
Result:=CompareStr(String(Key),PStringToStringTreeItem(Data)^.Name);
|
||||
@ -157,6 +183,25 @@ begin
|
||||
Result:=CompareText(String(Key),PStringToStringTreeItem(Data)^.Name);
|
||||
end;
|
||||
|
||||
function CompareFilenameAndFilenameToStringTreeItem(Key, Data: Pointer
|
||||
): integer;
|
||||
begin
|
||||
Result:=CompareFilenames(String(Key),PStringToStringTreeItem(Data)^.Name);
|
||||
end;
|
||||
|
||||
function CompareFilenameToStringItemsI(Data1, Data2: Pointer): integer;
|
||||
begin
|
||||
Result:=CompareFilenamesIgnoreCase(PStringToStringTreeItem(Data1)^.Name,
|
||||
PStringToStringTreeItem(Data2)^.Name);
|
||||
end;
|
||||
|
||||
function CompareFilenameAndFilenameToStringTreeItemI(Key, Data: Pointer
|
||||
): integer;
|
||||
begin
|
||||
Result:=CompareFilenamesIgnoreCase(String(Key),
|
||||
PStringToStringTreeItem(Data)^.Name);
|
||||
end;
|
||||
|
||||
{ TCodeXYPositions }
|
||||
|
||||
function TCodeXYPositions.GetItems(Index: integer): PCodeXYPosition;
|
||||
@ -322,6 +367,11 @@ begin
|
||||
Result:=''
|
||||
end;
|
||||
|
||||
function TStringToStringTree.GetCompareItemsFunc: TListSortCompare;
|
||||
begin
|
||||
Result:=Tree.OnCompare;
|
||||
end;
|
||||
|
||||
procedure TStringToStringTree.SetStrings(const s: string; const AValue: string);
|
||||
var
|
||||
Node: TAVLTreeNode;
|
||||
@ -340,19 +390,19 @@ end;
|
||||
|
||||
function TStringToStringTree.FindNode(const s: string): TAVLTreeNode;
|
||||
begin
|
||||
if CaseSensitive then
|
||||
Result:=FTree.FindKey(Pointer(s),@CompareStringAndStringToStringTreeItem)
|
||||
else
|
||||
Result:=FTree.FindKey(Pointer(s),@CompareStringAndStringToStringTreeItemI);
|
||||
Result:=FTree.FindKey(Pointer(s),FCompareKeyItemFunc)
|
||||
end;
|
||||
|
||||
constructor TStringToStringTree.Create(TheCaseSensitive: boolean);
|
||||
begin
|
||||
FCaseSensitive:=TheCaseSensitive;
|
||||
if CaseSensitive then
|
||||
FTree:=TAVLTree.Create(@CompareStringToStringItems)
|
||||
else
|
||||
if CaseSensitive then begin
|
||||
FCompareKeyItemFunc:=@CompareStringAndStringToStringTreeItem;
|
||||
FTree:=TAVLTree.Create(@CompareStringToStringItems);
|
||||
end else begin
|
||||
FCompareKeyItemFunc:=@CompareStringAndStringToStringTreeItemI;
|
||||
FTree:=TAVLTree.Create(@CompareStringToStringItemsI);
|
||||
end;
|
||||
end;
|
||||
|
||||
destructor TStringToStringTree.Destroy;
|
||||
@ -441,5 +491,25 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TStringToStringTree.SetCompareFuncs(const NewCompareItemsFunc,
|
||||
NewCompareKeyItemFunc: TListSortCompare);
|
||||
begin
|
||||
FCompareKeyItemFunc:=NewCompareKeyItemFunc;
|
||||
Tree.OnCompare:=NewCompareItemsFunc;
|
||||
end;
|
||||
|
||||
{ TFilenameToStringTree }
|
||||
|
||||
constructor TFilenameToStringTree.Create(CaseInsensitive: boolean);
|
||||
begin
|
||||
inherited Create(true);
|
||||
if CaseInsensitive then
|
||||
SetCompareFuncs(@CompareFilenameToStringItemsI,
|
||||
@CompareFilenameAndFilenameToStringTreeItemI)
|
||||
else
|
||||
SetCompareFuncs(@CompareFilenameToStringItems,
|
||||
@CompareFilenameAndFilenameToStringTreeItem);
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
@ -63,8 +63,8 @@ type
|
||||
ctdusUnitNormal, // e.g. unitname (case depends on OS) -> filename
|
||||
ctdusUnitCaseInsensitive, // unitname case insensitive -> filename
|
||||
ctdusInFilenameNormal, // unit 'in' filename -> filename
|
||||
ctdusInFilenameCaseInsenstive, // unit 'in' filename case insensitive -> filename
|
||||
ctdusUnitFileNormal, // unitname.ext -> filename
|
||||
ctdusInFilenameCaseInsensitive, // unit 'in' filename case insensitive -> filename
|
||||
ctdusUnitFileNormal, // unitname.ext (case depends on OS) -> filename
|
||||
ctdusUnitFileCaseInsensitive // unitname.ext case insensitive -> filename
|
||||
);
|
||||
|
||||
@ -73,7 +73,7 @@ const
|
||||
ctdusInFilenameNormal,
|
||||
ctdusUnitFileNormal];
|
||||
ctdusCaseInsensitive = [ctdusUnitCaseInsensitive,
|
||||
ctdusInFilenameCaseInsenstive,
|
||||
ctdusInFilenameCaseInsensitive,
|
||||
ctdusUnitFileCaseInsensitive];
|
||||
|
||||
type
|
||||
@ -557,11 +557,14 @@ var
|
||||
begin
|
||||
Files:=FUnitSources[UnitSrc].Files;
|
||||
if Files=nil then begin
|
||||
Files:=TStringToStringTree.Create({$IFDEF CaseInsensitiveFilenames}
|
||||
false
|
||||
{$ELSE}
|
||||
UnitSrc in ctdusCaseNormal
|
||||
{$ENDIF});
|
||||
case UnitSrc of
|
||||
ctdusUnitNormal: Files:=TStringToStringTree.Create(FilenamesCaseSensitive);
|
||||
ctdusUnitCaseInsensitive: Files:=TStringToStringTree.Create(false);
|
||||
ctdusInFilenameNormal: Files:=TFilenameToStringTree.Create(false);
|
||||
ctdusInFilenameCaseInsensitive:Files:=TFilenameToStringTree.Create(true);
|
||||
ctdusUnitFileNormal: Files:=TFilenameToStringTree.Create(false);
|
||||
ctdusUnitFileCaseInsensitive: Files:=TFilenameToStringTree.Create(true);
|
||||
end;
|
||||
FUnitSources[UnitSrc].Files:=Files;
|
||||
end;
|
||||
Files[Search]:=Filename;
|
||||
@ -832,7 +835,7 @@ begin
|
||||
// uses IN parameter
|
||||
InFilename:=TrimFilename(SetDirSeparators(InFilename));
|
||||
if AnyCase then
|
||||
UnitSrc:=ctdusInFilenameCaseInsenstive
|
||||
UnitSrc:=ctdusInFilenameCaseInsensitive
|
||||
else
|
||||
UnitSrc:=ctdusInFilenameNormal;
|
||||
if GetUnitSourceCacheValue(UnitSrc,InFilename,Result) then begin
|
||||
|
Loading…
Reference in New Issue
Block a user