mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-10 14:36:09 +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,
|
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;
|
||||||
|
|
||||||
|
@ -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(
|
||||||
|
Loading…
Reference in New Issue
Block a user