mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-09 19:16:12 +02:00
codetools: changed RetypeClassVariables parameter to tree
git-svn-id: trunk@24219 -
This commit is contained in:
parent
4e55c6562f
commit
d3f232387d
@ -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;
|
||||
|
@ -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:');
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user