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, CodeTree, CodeAtom, CodeCache, CustomCodeTool, CodeToolsStrConsts,
KeywordFuncLists, BasicCodeTools, LinkScanner, AvgLvlTree, AVL_Tree, KeywordFuncLists, BasicCodeTools, LinkScanner, AvgLvlTree, AVL_Tree,
SourceChanger, FindDeclarationTool, PascalReaderTool, PascalParserTool, SourceChanger, FindDeclarationTool, PascalReaderTool, PascalParserTool,
CodeToolsStructs, ExprEval, LazDbgLog; CodeToolsStructs, ExprEval, LazDbgLog, crc;
type type
TIdentCompletionTool = class; TIdentCompletionTool = class;
@ -127,7 +127,7 @@ type
FToolNodesDeletedStep: integer;// only valid if iliNodeValid FToolNodesDeletedStep: integer;// only valid if iliNodeValid
FNodeStartPos: integer; FNodeStartPos: integer;
FNodeDesc: TCodeTreeNodeDesc; FNodeDesc: TCodeTreeNodeDesc;
FNodeHash: string; FNodeHash: Cardinal;
function GetNode: TCodeTreeNode; function GetNode: TCodeTreeNode;
function GetParamTypeList: string; function GetParamTypeList: string;
function GetParamNameList: string; function GetParamNameList: string;
@ -170,7 +170,7 @@ type
procedure UnbindNode; procedure UnbindNode;
procedure StoreNodeHash; procedure StoreNodeHash;
function RestoreNode: boolean; function RestoreNode: boolean;
function GetNodeHash(ANode: TCodeTreeNode): string; function GetNodeHash(ANode: TCodeTreeNode): Cardinal;
function CompareParamList(CompareItem: TIdentifierListItem): integer; function CompareParamList(CompareItem: TIdentifierListItem): integer;
function CompareParamList(CompareItem: TIdentifierListSearchItem): integer; function CompareParamList(CompareItem: TIdentifierListSearchItem): integer;
function CalcMemSize: PtrUInt; virtual; function CalcMemSize: PtrUInt; virtual;
@ -3917,7 +3917,7 @@ end;
function TIdentifierListItem.RestoreNode: boolean; function TIdentifierListItem.RestoreNode: boolean;
var var
NewNode: TCodeTreeNode; NewNode: TCodeTreeNode;
NewHash: String; NewHash: Cardinal;
begin begin
if not (iliNodeHashValid in Flags) then exit(true); if not (iliNodeHashValid in Flags) then exit(true);
//DebugLn(['TIdentifierListItem.RestoreNode ',Identifier]); //DebugLn(['TIdentifierListItem.RestoreNode ',Identifier]);
@ -3940,20 +3940,23 @@ begin
Result:=true; Result:=true;
end; end;
function TIdentifierListItem.GetNodeHash(ANode: TCodeTreeNode): string; function TIdentifierListItem.GetNodeHash(ANode: TCodeTreeNode): Cardinal;
var var
StartPos: LongInt; StartPos: LongInt;
EndPos: LongInt; EndPos: LongInt;
begin begin
case ANode.Desc of case ANode.Desc of
ctnVarDefinition,ctnConstDefinition,ctnTypeDefinition,ctnGenericType: ctnVarDefinition,ctnConstDefinition,ctnTypeDefinition,ctnGenericType:
Result:=Tool.ExtractDefinitionName(ANode) ANode:=Tool.FindDefinitionNameNode(ANode);
else end;
if ANode<>nil then
begin
StartPos:=ANode.StartPos; StartPos:=ANode.StartPos;
EndPos:=StartPos+20; EndPos:=StartPos+20;
if EndPos>ANode.EndPos then EndPos:=ANode.EndPos; if EndPos>ANode.EndPos then EndPos:=ANode.EndPos;
Result:=copy(Tool.Src,StartPos,EndPos); Result:=crc32(0, @Tool.Src[StartPos], EndPos-StartPos);
end; end else
Result:=0;
end; end;
function TIdentifierListItem.CompareParamList(CompareItem: TIdentifierListItem function TIdentifierListItem.CompareParamList(CompareItem: TIdentifierListItem
@ -3991,7 +3994,7 @@ function TIdentifierListItem.CalcMemSize: PtrUInt;
begin begin
Result:=PtrUInt(InstanceSize) Result:=PtrUInt(InstanceSize)
+MemSizeString(FParamTypeList) +MemSizeString(FParamTypeList)
+MemSizeString(FNodeHash) +SizeOf(FNodeHash)
+MemSizeString(Identifier); +MemSizeString(Identifier);
end; end;

View File

@ -239,6 +239,7 @@ type
function NodeIsPartOfTypeDefinition(ANode: TCodeTreeNode): boolean; function NodeIsPartOfTypeDefinition(ANode: TCodeTreeNode): boolean;
function ExtractDefinitionNodeType(DefinitionNode: TCodeTreeNode): string; function ExtractDefinitionNodeType(DefinitionNode: TCodeTreeNode): string;
function ExtractDefinitionName(DefinitionNode: TCodeTreeNode): string; function ExtractDefinitionName(DefinitionNode: TCodeTreeNode): string;
function FindDefinitionNameNode(DefinitionNode: TCodeTreeNode): TCodeTreeNode;
function PositionInDefinitionName(DefinitionNode: TCodeTreeNode; function PositionInDefinitionName(DefinitionNode: TCodeTreeNode;
CleanPos: integer): boolean; CleanPos: integer): boolean;
function MoveCursorToParameterSpecifier(DefinitionNode: TCodeTreeNode function MoveCursorToParameterSpecifier(DefinitionNode: TCodeTreeNode
@ -1084,6 +1085,19 @@ begin
end; end;
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; function TPascalReaderTool.FindProcBody(ProcNode: TCodeTreeNode): TCodeTreeNode;
begin begin
Result:=ProcNode; Result:=ProcNode;
@ -2816,14 +2830,11 @@ end;
function TPascalReaderTool.ExtractDefinitionName(DefinitionNode: TCodeTreeNode function TPascalReaderTool.ExtractDefinitionName(DefinitionNode: TCodeTreeNode
): string; ): string;
begin begin
if DefinitionNode.Desc=ctnGenericType then begin DefinitionNode:=FindDefinitionNameNode(DefinitionNode);
if DefinitionNode.FirstChild<>nil then if DefinitionNode<>nil then
Result:=GetIdentifier(@Src[DefinitionNode.FirstChild.StartPos]) Result:=GetIdentifier(@Src[DefinitionNode.StartPos])
else else
Result:=''; Result:='';
end else begin
Result:=GetIdentifier(@Src[DefinitionNode.StartPos]);
end;
end; end;
function TPascalReaderTool.PositionInDefinitionName( function TPascalReaderTool.PositionInDefinitionName(