diff --git a/components/codetools/identcompletiontool.pas b/components/codetools/identcompletiontool.pas index 6c971856fb..23070f1c54 100644 --- a/components/codetools/identcompletiontool.pas +++ b/components/codetools/identcompletiontool.pas @@ -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; diff --git a/components/codetools/pascalreadertool.pas b/components/codetools/pascalreadertool.pas index a7358596ed..f75ea0256b 100644 --- a/components/codetools/pascalreadertool.pas +++ b/components/codetools/pascalreadertool.pas @@ -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(