codetools: use crc for identifier list item hash for speed reasons

git-svn-id: trunk@51652 -
This commit is contained in:
ondrej 2016-02-18 04:24:14 +00:00
parent 263929eb6c
commit c2748fe332
2 changed files with 33 additions and 19 deletions

View File

@ -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;

View File

@ -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(