From a6fb6c5e132b7ae8a2b2f20f0eea15d1f9d3d78a Mon Sep 17 00:00:00 2001 From: mattias Date: Tue, 20 Jul 2010 13:06:23 +0000 Subject: [PATCH] codetools: fixed saving find declaration result in parent cache, bug #16985 git-svn-id: trunk@26752 - --- components/codetools/finddeclarationcache.pas | 24 ++++++++++++------- components/codetools/finddeclarationtool.pas | 20 ++++------------ 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/components/codetools/finddeclarationcache.pas b/components/codetools/finddeclarationcache.pas index 5c6a43d7fd..e845cbe4ba 100644 --- a/components/codetools/finddeclarationcache.pas +++ b/components/codetools/finddeclarationcache.pas @@ -147,7 +147,8 @@ type CleanStartPos, CleanEndPos: integer; InFront: boolean): PCodeTreeNodeCacheEntry; function Find(Identifier: PChar): PCodeTreeNodeCacheEntry; - procedure Add(Identifier: PChar; CleanStartPos, CleanEndPos: integer; + procedure Add(Identifier: PChar; + SrcTool: TPascalParserTool; CleanStartPos, CleanEndPos: integer; NewNode: TCodeTreeNode; NewTool: TPascalParserTool; NewCleanPos: integer; Flags: TNodeCacheEntryFlags); procedure Clear; @@ -779,7 +780,7 @@ begin end; procedure TCodeTreeNodeCache.Add(Identifier: PChar; - CleanStartPos, CleanEndPos: integer; + SrcTool: TPascalParserTool; CleanStartPos, CleanEndPos: integer; NewNode: TCodeTreeNode; NewTool: TPascalParserTool; NewCleanPos: integer; Flags: TNodeCacheEntryFlags); @@ -802,23 +803,28 @@ var OldNode: TAVLTreeNode; NewSearchRangeFlags: TNodeCacheEntryFlags; + function P2S(CleanPos: integer): string; + begin + Result:=SrcTool.CleanPosToStr(CleanPos); + end; + function ParamsDebugReport: string; var s: string; begin s:=' Ident='+GetIdentifier(Identifier); - s:=s+' New: Range='+IntToStr(CleanStartPos) - +'-'+IntToStr(CleanEndPos); + s:=s+' New: Range='+P2S(CleanStartPos) + +'-'+P2S(CleanEndPos); if Owner<>nil then begin s:=s+' Owner='+Owner.DescAsString; - s:=s+' OwnerPos='+IntToStr(Owner.StartPos); + s:=s+' OwnerPos='+P2S(Owner.StartPos); end; if OldEntry<>nil then begin - s:=s+' Old: Range='+IntToStr(OldEntry^.CleanStartPos) - +'-'+IntToStr(OldEntry^.CleanEndPos); + s:=s+' Old: Range='+P2S(OldEntry^.CleanStartPos) + +'-'+P2S(OldEntry^.CleanEndPos); if OldEntry^.NewNode<>nil then begin s:=s+' Node='+OldEntry^.NewNode.DescAsString - +' Pos='+IntToStr(OldEntry^.NewNode.StartPos); + +' Pos='+OldEntry^.NewTool.CleanPosToStr(OldEntry^.NewNode.StartPos); end else s:=s+' Node=nil'; if OldEntry^.NewTool<>nil then begin @@ -831,7 +837,7 @@ var end; if NewNode<>nil then begin s:=s+' Node='+NewNode.DescAsString - +' Pos='+IntToStr(NewNode.StartPos); + +' Pos='+NewTool.CleanPosToStr(NewNode.StartPos); end else s:=s+' Node=nil'; if NewTool<>nil then begin diff --git a/components/codetools/finddeclarationtool.pas b/components/codetools/finddeclarationtool.pas index 00c89112fb..bf941f1c7f 100644 --- a/components/codetools/finddeclarationtool.pas +++ b/components/codetools/finddeclarationtool.pas @@ -8971,11 +8971,12 @@ var Node: TCodeTreeNode; else Result:='?'+ANodeOwner.ClassName+'?'; end; - {$ENDIF} begin {$IFDEF CheckNodeTool}CheckNodeTool(StartNode);{$ENDIF} if StartNode=nil then exit; + if EndNode=nil then EndNode:=StartNode; + if Params.NewNode<>nil then begin // identifier found NewNode:=Params.NewNode; @@ -9056,17 +9057,7 @@ begin LastNodeCache:=nil; // start with parent of deepest node and end parent of highest Node:=StartNode; - if (EndNode<>nil) then begin - if (EndNode.GetLevel>StartNode.GetLevel) then begin - Node:=EndNode; - EndNode:=StartNode.Parent; - end else begin - EndNode:=EndNode.Parent; - end; - end else - EndNode:=StartNode.Parent; - Node:=Node.Parent; - while (Node<>nil) do begin + repeat if (Node.Desc in AllNodeCacheDescs) then begin if (Node.Cache=nil) then CreateNewNodeCache(Node); @@ -9079,7 +9070,7 @@ begin end; {$ENDIF} CurNodeCache.Add(Params.Identifier, - CleanStartPos,CleanEndPos, + Self,CleanStartPos,CleanEndPos, NewNode,NewTool,NewCleanPos,SearchRangeFlags); {$IFDEF ShowNodeCache} if BeVerbose then begin @@ -9091,8 +9082,7 @@ begin end; end; Node:=Node.Parent; - if (EndNode=Node) then break; - end; + until (Node=nil) or (EndNode=Node) or EndNode.HasAsParent(Node); {$IFDEF ShowNodeCache} if BeVerbose then begin DebugLn('=========================))))))))))))))))))))))))))))))))');