From d3f232387dff4748a5ebb38609b0f8d4e8fc5c7f Mon Sep 17 00:00:00 2001 From: mattias Date: Fri, 26 Mar 2010 12:24:47 +0000 Subject: [PATCH] codetools: changed RetypeClassVariables parameter to tree git-svn-id: trunk@24219 - --- components/codetools/codetoolmanager.pas | 5 +- .../examples/retypepublishedvars.lpr | 8 +- components/codetools/stdcodetools.pas | 84 +++++++++---------- 3 files changed, 45 insertions(+), 52 deletions(-) diff --git a/components/codetools/codetoolmanager.pas b/components/codetools/codetoolmanager.pas index f18feb2299..2940bd2541 100644 --- a/components/codetools/codetoolmanager.pas +++ b/components/codetools/codetoolmanager.pas @@ -663,7 +663,8 @@ type const AClassName, OldVariableName, NewVarName, VarType: shortstring; ErrorOnClassNotFound: boolean): boolean; function RetypeClassVariables(Code: TCodeBuffer; const AClassName: string; - ListOfReTypes: TStrings; ErrorOnClassNotFound: boolean): boolean; + ListOfReTypes: TStringToStringTree; + ErrorOnClassNotFound: boolean): boolean; function FindDanglingComponentEvents(Code: TCodeBuffer; const AClassName: string; RootComponent: TComponent; ExceptionOnClassNotFound, @@ -4609,7 +4610,7 @@ begin end; function TCodeToolManager.RetypeClassVariables(Code: TCodeBuffer; - const AClassName: string; ListOfReTypes: TStrings; + const AClassName: string; ListOfReTypes: TStringToStringTree; ErrorOnClassNotFound: boolean): boolean; begin Result:=false; diff --git a/components/codetools/examples/retypepublishedvars.lpr b/components/codetools/examples/retypepublishedvars.lpr index c491e6f574..fdfc88aaf7 100644 --- a/components/codetools/examples/retypepublishedvars.lpr +++ b/components/codetools/examples/retypepublishedvars.lpr @@ -36,7 +36,7 @@ const var Code: TCodeBuffer; Filename: String; - ListOfTypes: TStringList; + ListOfTypes: TStringToStringTree; begin if (ParamCount>=1) and (Paramcount<>3) then begin writeln('Usage:'); @@ -59,9 +59,9 @@ begin raise Exception.Create('loading failed '+Filename); // complete code - ListOfTypes:=TStringList.Create; - ListOfTypes.Values['TExButton']:='TButton'; - ListOfTypes.Values['TExEdit']:='TEdit'; + ListOfTypes:=TStringToStringTree.Create(false); + ListOfTypes['TExButton']:='TButton'; + ListOfTypes['TExEdit']:='TEdit'; if CodeToolBoss.RetypeClassVariables(Code,'TForm1',ListOfTypes,true) then begin writeln('Sucess:'); diff --git a/components/codetools/stdcodetools.pas b/components/codetools/stdcodetools.pas index 28a08beaec..b353f5584f 100644 --- a/components/codetools/stdcodetools.pas +++ b/components/codetools/stdcodetools.pas @@ -188,7 +188,7 @@ type WithProperties, WithAncestors: boolean; out TreeOfCodeTreeNodeExtension: TAVLTree): boolean; function RetypeClassVariables(const AClassName: string; - ListOfTypes: TStrings; ExceptionOnClassNotFound: boolean; + ListOfTypes: TStringToStringTree; ExceptionOnClassNotFound: boolean; SourceChangeCache: TSourceChangeCache): boolean; function FindDanglingComponentEvents(const TheClassName: string; RootComponent: TComponent; ExceptionOnClassNotFound, @@ -4905,14 +4905,12 @@ begin end; function TStandardCodeTool.RetypeClassVariables(const AClassName: string; - ListOfTypes: TStrings; ExceptionOnClassNotFound: boolean; + ListOfTypes: TStringToStringTree; ExceptionOnClassNotFound: boolean; SourceChangeCache: TSourceChangeCache): boolean; var ClassNode: TCodeTreeNode; Node: TCodeTreeNode; TypeNode: TCodeTreeNode; - i: Integer; - OldToNew: TStringToStringTree; OldType: String; NewType: string; HasChanged: Boolean; @@ -4927,53 +4925,47 @@ begin else exit; end; - if (ListOfTypes=nil) or (ListOfTypes.Count=0) then exit(true); + if (ListOfTypes=nil) or (ListOfTypes.Tree.Count=0) then exit(true); - OldToNew:=TStringToStringTree.Create(false); - try - for i:=0 to ListOfTypes.Count-1 do - OldToNew.Add(ListOfTypes.Names[i],ListOfTypes.ValueFromIndex[i]); - - HasChanged:=false; - BuildSubTreeForClass(ClassNode); - Node:=ClassNode.FirstChild; - while (Node<>nil) and (Node.HasAsParent(ClassNode)) do begin - if (Node.Desc=ctnVarDefinition) and (Node.FirstChild<>nil) then begin - TypeNode:=Node.FirstChild; - if TypeNode.Desc=ctnIdentifier then begin - MoveCursorToNodeStart(TypeNode); + HasChanged:=false; + BuildSubTreeForClass(ClassNode); + Node:=ClassNode.FirstChild; + while (Node<>nil) and (Node.HasAsParent(ClassNode)) do begin + if (Node.Desc=ctnVarDefinition) and (Node.FirstChild<>nil) then begin + TypeNode:=Node.FirstChild; + if TypeNode.Desc=ctnIdentifier then begin + MoveCursorToNodeStart(TypeNode); + ReadNextAtom; + ReadNextAtom; + if CurPos.Flag=cafPoint then begin + // skip unitname ReadNextAtom; - ReadNextAtom; - if CurPos.Flag=cafPoint then begin - // skip unitname - ReadNextAtom; - end else begin - UndoReadNextAtom; - end; - // cursor is now on identifier - OldType:=GetAtom; - if OldToNew.Contains(OldType) then begin - NewType:=OldToNew[OldType]; - if OldType<>NewType then begin - // change type - if not HasChanged then begin - HasChanged:=true; - SourceChangeCache.MainScanner:=Scanner; - end; - if not SourceChangeCache.Replace(gtNone,gtNone, - CurPos.StartPos,CurPos.EndPos,NewType) then exit(false); + end else begin + UndoReadNextAtom; + end; + // cursor is now on identifier + OldType:=GetAtom; + if ListOfTypes.Contains(OldType) then begin + NewType:=ListOfTypes[OldType]; + if OldType<>NewType then begin + // change type (or case) + if not HasChanged then begin + HasChanged:=true; + SourceChangeCache.MainScanner:=Scanner; end; + if not SourceChangeCache.Replace(gtNone,gtNone, + CurPos.StartPos,CurPos.EndPos,NewType) + then + exit(false); end; end; - Node:=Node.NextSkipChilds; - end else - Node:=Node.Next; - end; - if HasChanged then begin - if not SourceChangeCache.Apply then exit; - end; - finally - OldToNew.Free; + end; + Node:=Node.NextSkipChilds; + end else + Node:=Node.Next; + end; + if HasChanged then begin + if not SourceChangeCache.Apply then exit; end; Result:=true; end;