mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-07 22:56:46 +02:00
codetools: use crc for identifier list item hash for speed reasons
git-svn-id: trunk@51652 -
This commit is contained in:
parent
263929eb6c
commit
c2748fe332
@ -52,7 +52,7 @@ uses
|
||||
CodeTree, CodeAtom, CodeCache, CustomCodeTool, CodeToolsStrConsts,
|
||||
KeywordFuncLists, BasicCodeTools, LinkScanner, AvgLvlTree, AVL_Tree,
|
||||
SourceChanger, FindDeclarationTool, PascalReaderTool, PascalParserTool,
|
||||
CodeToolsStructs, ExprEval, LazDbgLog;
|
||||
CodeToolsStructs, ExprEval, LazDbgLog, crc;
|
||||
|
||||
type
|
||||
TIdentCompletionTool = class;
|
||||
@ -127,7 +127,7 @@ type
|
||||
FToolNodesDeletedStep: integer;// only valid if iliNodeValid
|
||||
FNodeStartPos: integer;
|
||||
FNodeDesc: TCodeTreeNodeDesc;
|
||||
FNodeHash: string;
|
||||
FNodeHash: Cardinal;
|
||||
function GetNode: TCodeTreeNode;
|
||||
function GetParamTypeList: string;
|
||||
function GetParamNameList: string;
|
||||
@ -170,7 +170,7 @@ type
|
||||
procedure UnbindNode;
|
||||
procedure StoreNodeHash;
|
||||
function RestoreNode: boolean;
|
||||
function GetNodeHash(ANode: TCodeTreeNode): string;
|
||||
function GetNodeHash(ANode: TCodeTreeNode): Cardinal;
|
||||
function CompareParamList(CompareItem: TIdentifierListItem): integer;
|
||||
function CompareParamList(CompareItem: TIdentifierListSearchItem): integer;
|
||||
function CalcMemSize: PtrUInt; virtual;
|
||||
@ -3917,7 +3917,7 @@ end;
|
||||
function TIdentifierListItem.RestoreNode: boolean;
|
||||
var
|
||||
NewNode: TCodeTreeNode;
|
||||
NewHash: String;
|
||||
NewHash: Cardinal;
|
||||
begin
|
||||
if not (iliNodeHashValid in Flags) then exit(true);
|
||||
//DebugLn(['TIdentifierListItem.RestoreNode ',Identifier]);
|
||||
@ -3940,20 +3940,23 @@ begin
|
||||
Result:=true;
|
||||
end;
|
||||
|
||||
function TIdentifierListItem.GetNodeHash(ANode: TCodeTreeNode): string;
|
||||
function TIdentifierListItem.GetNodeHash(ANode: TCodeTreeNode): Cardinal;
|
||||
var
|
||||
StartPos: LongInt;
|
||||
EndPos: LongInt;
|
||||
begin
|
||||
case ANode.Desc of
|
||||
ctnVarDefinition,ctnConstDefinition,ctnTypeDefinition,ctnGenericType:
|
||||
Result:=Tool.ExtractDefinitionName(ANode)
|
||||
else
|
||||
ctnVarDefinition,ctnConstDefinition,ctnTypeDefinition,ctnGenericType:
|
||||
ANode:=Tool.FindDefinitionNameNode(ANode);
|
||||
end;
|
||||
if ANode<>nil then
|
||||
begin
|
||||
StartPos:=ANode.StartPos;
|
||||
EndPos:=StartPos+20;
|
||||
if EndPos>ANode.EndPos then EndPos:=ANode.EndPos;
|
||||
Result:=copy(Tool.Src,StartPos,EndPos);
|
||||
end;
|
||||
Result:=crc32(0, @Tool.Src[StartPos], EndPos-StartPos);
|
||||
end else
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
function TIdentifierListItem.CompareParamList(CompareItem: TIdentifierListItem
|
||||
@ -3991,7 +3994,7 @@ function TIdentifierListItem.CalcMemSize: PtrUInt;
|
||||
begin
|
||||
Result:=PtrUInt(InstanceSize)
|
||||
+MemSizeString(FParamTypeList)
|
||||
+MemSizeString(FNodeHash)
|
||||
+SizeOf(FNodeHash)
|
||||
+MemSizeString(Identifier);
|
||||
end;
|
||||
|
||||
|
@ -239,6 +239,7 @@ type
|
||||
function NodeIsPartOfTypeDefinition(ANode: TCodeTreeNode): boolean;
|
||||
function ExtractDefinitionNodeType(DefinitionNode: TCodeTreeNode): string;
|
||||
function ExtractDefinitionName(DefinitionNode: TCodeTreeNode): string;
|
||||
function FindDefinitionNameNode(DefinitionNode: TCodeTreeNode): TCodeTreeNode;
|
||||
function PositionInDefinitionName(DefinitionNode: TCodeTreeNode;
|
||||
CleanPos: integer): boolean;
|
||||
function MoveCursorToParameterSpecifier(DefinitionNode: TCodeTreeNode
|
||||
@ -1084,6 +1085,19 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
function TPascalReaderTool.FindDefinitionNameNode(DefinitionNode: TCodeTreeNode
|
||||
): TCodeTreeNode;
|
||||
begin
|
||||
if DefinitionNode.Desc=ctnGenericType then
|
||||
begin
|
||||
if DefinitionNode.FirstChild<>nil then
|
||||
Result:=DefinitionNode.FirstChild
|
||||
else
|
||||
Result:=nil;
|
||||
end else
|
||||
Result:=DefinitionNode;
|
||||
end;
|
||||
|
||||
function TPascalReaderTool.FindProcBody(ProcNode: TCodeTreeNode): TCodeTreeNode;
|
||||
begin
|
||||
Result:=ProcNode;
|
||||
@ -2816,14 +2830,11 @@ end;
|
||||
function TPascalReaderTool.ExtractDefinitionName(DefinitionNode: TCodeTreeNode
|
||||
): string;
|
||||
begin
|
||||
if DefinitionNode.Desc=ctnGenericType then begin
|
||||
if DefinitionNode.FirstChild<>nil then
|
||||
Result:=GetIdentifier(@Src[DefinitionNode.FirstChild.StartPos])
|
||||
else
|
||||
Result:='';
|
||||
end else begin
|
||||
Result:=GetIdentifier(@Src[DefinitionNode.StartPos]);
|
||||
end;
|
||||
DefinitionNode:=FindDefinitionNameNode(DefinitionNode);
|
||||
if DefinitionNode<>nil then
|
||||
Result:=GetIdentifier(@Src[DefinitionNode.StartPos])
|
||||
else
|
||||
Result:='';
|
||||
end;
|
||||
|
||||
function TPascalReaderTool.PositionInDefinitionName(
|
||||
|
Loading…
Reference in New Issue
Block a user