IDE: Use class type instead of name when searching for components in various places.

git-svn-id: trunk@64184 -
This commit is contained in:
juha 2020-12-08 19:34:44 +00:00
parent 96027c20c3
commit 1c047add57
6 changed files with 68 additions and 74 deletions

View File

@ -329,9 +329,8 @@ type
Flags: TPkgIntfRequiredFlags = []) virtual; abstract; Flags: TPkgIntfRequiredFlags = []) virtual; abstract;
function AddDependencyToOwners(OwnerList: TFPList; APackage: TIDEPackage; function AddDependencyToOwners(OwnerList: TFPList; APackage: TIDEPackage;
OnlyTestIfPossible: boolean = false): TModalResult; virtual; abstract; // mrOk or mrIgnore for already connected OnlyTestIfPossible: boolean = false): TModalResult; virtual; abstract; // mrOk or mrIgnore for already connected
function AddUnitDependenciesForComponentClasses(const UnitFilename: string; function AddUnitDepsForCompClasses(const UnitFilename: string;
ComponentClassnames: TStrings; ComponentClasses: TClassList; Quiet: boolean = false): TModalResult; virtual; abstract;
Quiet: boolean = false): TModalResult; virtual; abstract;
function RedirectPackageDependency(APackage: TIDEPackage): TIDEPackage; virtual; abstract; function RedirectPackageDependency(APackage: TIDEPackage): TIDEPackage; virtual; abstract;
// package editors // package editors

View File

@ -88,7 +88,7 @@ type
procedure FillReplaceGrids; procedure FillReplaceGrids;
function ShowConvertLFMWizard: TModalResult; function ShowConvertLFMWizard: TModalResult;
protected protected
function FixMissingComponentClasses(aMissingTypes: TStringList): TModalResult; override; function FixMissingComponentClasses(aMissingTypes: TClassList): TModalResult; override;
procedure LoadLFM; procedure LoadLFM;
public public
constructor Create(ACTLink: TCodeToolLink; ALFMBuffer: TCodeBuffer); constructor Create(ACTLink: TCodeToolLink; ALFMBuffer: TCodeBuffer);
@ -585,12 +585,12 @@ begin
end; end;
end; end;
function TLFMFixer.FixMissingComponentClasses(aMissingTypes: TStringList): TModalResult; function TLFMFixer.FixMissingComponentClasses(aMissingTypes: TClassList): TModalResult;
// This is called from TLFMChecker.FindAndFixMissingComponentClasses. // This is called from TLFMChecker.FindAndFixMissingComponentClasses.
// Add needed units to uses section using methods already defined in fUsedUnitsTool. // Add needed units to uses section using methods already defined in fUsedUnitsTool.
var var
RegComp: TRegisteredComponent; RegComp: TRegisteredComponent;
ClassUnitInfo: TUnitInfo; //ClassUnitInfo: TUnitInfo;
i: Integer; i: Integer;
NeededUnitName: String; NeededUnitName: String;
begin begin
@ -600,17 +600,20 @@ begin
begin begin
RegComp:=IDEComponentPalette.FindRegComponent(aMissingTypes[i]); RegComp:=IDEComponentPalette.FindRegComponent(aMissingTypes[i]);
NeededUnitName:=''; NeededUnitName:='';
if (RegComp<>nil) then begin if Assigned(RegComp) then
if RegComp.ComponentClass<>nil then begin begin
if RegComp.ComponentClass<>nil then
begin
NeededUnitName:=RegComp.ComponentClass.UnitName; NeededUnitName:=RegComp.ComponentClass.UnitName;
if NeededUnitName='' then if NeededUnitName='' then
NeededUnitName:=RegComp.GetUnitName; NeededUnitName:=RegComp.GetUnitName;
end; end;
end end
else begin else begin
ClassUnitInfo:=Project1.UnitWithComponentClassName(aMissingTypes[i]); Assert(False, 'TLFMFixer.FixMissingComponentClasses: RegComp=Nil');
{ ClassUnitInfo:=Project1.UnitWithComponentClass(aMissingTypes[i] as TComponentClass);
if ClassUnitInfo<>nil then if ClassUnitInfo<>nil then
NeededUnitName:=ClassUnitInfo.GetUsesUnitName; NeededUnitName:=ClassUnitInfo.GetUsesUnitName; }
end; end;
if (NeededUnitName<>'') if (NeededUnitName<>'')
and fUsedUnitsTool.AddUnitImmediately(NeededUnitName) then and fUsedUnitsTool.AddUnitImmediately(NeededUnitName) then

View File

@ -76,7 +76,7 @@ type
function FindListBoxError: TLFMError; function FindListBoxError: TLFMError;
procedure WriteLFMErrors; procedure WriteLFMErrors;
function FindAndFixMissingComponentClasses: TModalResult; function FindAndFixMissingComponentClasses: TModalResult;
function FixMissingComponentClasses(aMissingTypes: TStringList): TModalResult; virtual; function FixMissingComponentClasses(aMissingTypes: TClassList): TModalResult; virtual;
procedure FillErrorsListBox; procedure FillErrorsListBox;
procedure JumpToError(LFMError: TLFMError); procedure JumpToError(LFMError: TLFMError);
procedure AddReplacement(LFMChangeList: TObjectList; StartPos, EndPos: integer; procedure AddReplacement(LFMChangeList: TObjectList; StartPos, EndPos: integer;
@ -451,31 +451,27 @@ function TLFMChecker.FindAndFixMissingComponentClasses: TModalResult;
// returns true, if after adding units to uses section all errors are fixed // returns true, if after adding units to uses section all errors are fixed
var var
CurError: TLFMError; CurError: TLFMError;
MissingObjectTypes: TStringList; MissingObjectTypes: TClassList;
AClassName: String;
RegComp: TRegisteredComponent; RegComp: TRegisteredComponent;
AClassName: String;
i: Integer; i: Integer;
begin begin
Result:=mrOK; Result:=mrOK;
MissingObjectTypes:=TStringList.Create; MissingObjectTypes:=TClassList.Create;
try try
// collect all missing object types // collect all missing object types
CurError:=fLFMTree.FirstError; CurError:=fLFMTree.FirstError;
while CurError<>nil do begin while CurError<>nil do begin
if CurError.IsMissingObjectType then begin if CurError.IsMissingObjectType then begin
AClassName:=(CurError.Node as TLFMObjectNode).TypeName; AClassName:=(CurError.Node as TLFMObjectNode).TypeName;
if MissingObjectTypes.IndexOf(AClassName)<0 then RegComp:=IDEComponentPalette.FindRegComponent(AClassName);
MissingObjectTypes.Add(AClassName); if Assigned(RegComp) and (RegComp.GetUnitName<>'')
and (MissingObjectTypes.IndexOf(RegComp.ComponentClass)<0)
then
MissingObjectTypes.Add(RegComp.ComponentClass);
end; end;
CurError:=CurError.NextError; CurError:=CurError.NextError;
end; end;
// keep missing object types only with a registered component class
for i:=MissingObjectTypes.Count-1 downto 0 do begin
RegComp:=IDEComponentPalette.FindRegComponent(MissingObjectTypes[i]);
if (RegComp=nil) or (RegComp.GetUnitName='') then
MissingObjectTypes.Delete(i);
end;
// Now the list contains only types that are found in IDE. // Now the list contains only types that are found in IDE.
if MissingObjectTypes.Count>0 then if MissingObjectTypes.Count>0 then
Result:=FixMissingComponentClasses(MissingObjectTypes); // Fix them. Result:=FixMissingComponentClasses(MissingObjectTypes); // Fix them.
@ -484,11 +480,11 @@ begin
end; end;
end; end;
function TLFMChecker.FixMissingComponentClasses(aMissingTypes: TStringList): TModalResult; function TLFMChecker.FixMissingComponentClasses(aMissingTypes: TClassList): TModalResult;
begin begin
// add units for the missing object types with registered component classes // add units for the missing object types with registered component classes
Result:=PackageEditingInterface.AddUnitDependenciesForComponentClasses( Result:=PackageEditingInterface.AddUnitDepsForCompClasses(fPascalBuffer.Filename,
fPascalBuffer.Filename, aMissingTypes); aMissingTypes);
end; end;
function TLFMChecker.CheckUnit: boolean; function TLFMChecker.CheckUnit: boolean;

View File

@ -59,7 +59,7 @@ uses
MemCheck, MemCheck,
{$ENDIF} {$ENDIF}
// fpc packages // fpc packages
Math, Classes, SysUtils, TypInfo, types, strutils, process, Laz_AVL_Tree, Math, Classes, SysUtils, TypInfo, types, strutils, Contnrs, process, Laz_AVL_Tree,
// LCL // LCL
LCLProc, LCLType, LCLIntf, LResources, HelpIntfs, InterfaceBase, LCLPlatformDef, LCLProc, LCLType, LCLIntf, LResources, HelpIntfs, InterfaceBase, LCLPlatformDef,
ComCtrls, Forms, Buttons, Menus, Controls, GraphType, Graphics, ExtCtrls, ComCtrls, Forms, Buttons, Menus, Controls, GraphType, Graphics, ExtCtrls,
@ -13295,12 +13295,11 @@ procedure TMainIDE.PropHookPersistentAdded(APersistent: TPersistent; Select: boo
var var
RegComp: TRegisteredComponent; RegComp: TRegisteredComponent;
ADesigner: TDesigner; ADesigner: TDesigner;
AComponent: TComponent; AComponent, Ancestor: TComponent;
ActiveSrcEdit: TSourceEditor; ActiveSrcEdit: TSourceEditor;
ActiveUnitInfo: TUnitInfo; ActiveUnitInfo, ClassUnitInfo: TUnitInfo;
Ancestor: TComponent; ComponentClasses: TClassList;
ComponentClassNames: TStringList; ct: TClass;
ClassUnitInfo: TUnitInfo;
i: Integer; i: Integer;
begin begin
if ConsoleVerbosity>0 then if ConsoleVerbosity>0 then
@ -13343,18 +13342,18 @@ begin
// add needed package to required packages // add needed package to required packages
if ADesigner.LookupRoot.ComponentCount>0 then if ADesigner.LookupRoot.ComponentCount>0 then
begin begin
ComponentClassNames:=TStringList.Create; DebugLn('TMainIDE.OnPropHookPersistentAdded Creating ComponentClassNames.');
ComponentClassNames.Sorted:=True; ComponentClasses:=TClassList.Create;
ComponentClassNames.Duplicates:=dupIgnore;
ComponentClassNames.CaseSensitive:=False;
try try
for i:=0 to ADesigner.LookupRoot.ComponentCount-1 do for i:=0 to ADesigner.LookupRoot.ComponentCount-1 do
ComponentClassNames.Add(ADesigner.LookupRoot.Components[i].ClassName); begin
//DebugLn(['TMainIDE.OnPropHookPersistentAdded ComponentClassNames=',ComponentClassNames.Text]); ct := ADesigner.LookupRoot.Components[i].ClassType;
PkgBoss.AddUnitDependenciesForComponentClasses(ActiveUnitInfo.Filename, if ComponentClasses.IndexOf(ct)<=0 then
ComponentClassNames,true); ComponentClasses.Add(ct);
end;
PkgBoss.AddUnitDepsForCompClasses(ActiveUnitInfo.Filename,ComponentClasses,true);
finally finally
ComponentClassNames.Free; ComponentClasses.Free;
end; end;
end; end;

View File

@ -5537,8 +5537,7 @@ begin
Result:=Result.fNext[uilWithComponent]; Result:=Result.fNext[uilWithComponent];
end; end;
function TProject.UnitWithComponentClassName(const AClassName: string function TProject.UnitWithComponentClassName(const AClassName: string): TUnitInfo;
): TUnitInfo;
begin begin
Result := fFirst[uilWithComponent]; Result := fFirst[uilWithComponent];
while (Result<>nil) while (Result<>nil)

View File

@ -205,11 +205,11 @@ type
function ResolveBrokenDependenciesOnline(ABrokenDependencies: TFPList): TModalResult; function ResolveBrokenDependenciesOnline(ABrokenDependencies: TFPList): TModalResult;
function ShowBrokenDependenciesReport(Dependencies: TFPList): TModalResult; function ShowBrokenDependenciesReport(Dependencies: TFPList): TModalResult;
// Components // Components
function FilterMissingDependenciesForUnit(const UnitFilename: string; function FilterMissingDepsForUnit(const UnitFilename: string;
InputPackageList: TPackagePackageArray; InputPackageList: TPackagePackageArray;
out OutputPackageList: TOwnerPackageArray): TModalResult; out OutputPackageList: TOwnerPackageArray): TModalResult;
function GetUnitsAndDependenciesForComponents(ComponentClassNames: TStrings; function GetUnitsAndDepsForComps(ComponentClasses: TClassList;
out PackageList: TPackagePackageArray; out UnitList: TStringList): TModalResult; out PackageList: TPackagePackageArray; out UnitList: TStringList): TModalResult;
public public
constructor Create(TheOwner: TComponent); override; constructor Create(TheOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
@ -357,9 +357,8 @@ type
ShowDialog: boolean): TModalResult; ShowDialog: boolean): TModalResult;
// components // components
function AddUnitDependenciesForComponentClasses(const UnitFilename: string; function AddUnitDepsForCompClasses(const UnitFilename: string;
ComponentClassnames: TStrings; ComponentClasses: TClassList; Quiet: boolean): TModalResult; override;
Quiet: boolean = false): TModalResult; override;
{ function GetMissingDependenciesForUnit(const UnitFilename: string; { function GetMissingDependenciesForUnit(const UnitFilename: string;
ComponentClassnames: TStrings; ComponentClassnames: TStrings;
var List: TOwnerPackageArray): TModalResult; var List: TOwnerPackageArray): TModalResult;
@ -4294,9 +4293,8 @@ begin
PackageList.AddObject(APackageID.Name,APackageID); PackageList.AddObject(APackageID.Name,APackageID);
end; end;
function TPkgManager.AddUnitDependenciesForComponentClasses( function TPkgManager.AddUnitDepsForCompClasses(const UnitFilename: string;
const UnitFilename: string; ComponentClassnames: TStrings; ComponentClasses: TClassList; Quiet: boolean): TModalResult;
Quiet: boolean): TModalResult;
var var
UnitBuf: TCodeBuffer; UnitBuf: TCodeBuffer;
UnitNames: TStringList; UnitNames: TStringList;
@ -4449,13 +4447,12 @@ begin
Dependencies:=nil; Dependencies:=nil;
MissingDependencies:=nil; MissingDependencies:=nil;
try try
Result:=GetUnitsAndDependenciesForComponents(ComponentClassnames, Result:=GetUnitsAndDepsForComps(ComponentClasses, Dependencies, UnitNames);
Dependencies,UnitNames);
if Result<>mrOk then exit; if Result<>mrOk then exit;
if (Dependencies<>nil) then if (Dependencies<>nil) then
begin begin
Result:=FilterMissingDependenciesForUnit(UnitFilename,Dependencies,MissingDependencies); Result:=FilterMissingDepsForUnit(UnitFilename,Dependencies,MissingDependencies);
if Result<>mrOk then exit; if Result<>mrOk then exit;
end; end;
@ -4484,15 +4481,14 @@ begin
end; end;
end; end;
function TPkgManager.GetUnitsAndDependenciesForComponents( function TPkgManager.GetUnitsAndDepsForComps(ComponentClasses: TClassList;
ComponentClassNames: TStrings; out PackageList: TPackagePackageArray; out PackageList: TPackagePackageArray; out UnitList: TStringList): TModalResult;
out UnitList: TStringList): TModalResult;
// returns a list of packages and units needed to use the Component in the unit // returns a list of packages and units needed to use the Component in the unit
var var
CurClassID: Integer; CurClassID: Integer;
CurUnitIdx, CurPackageIdx: Integer; CurUnitIdx, CurPackageIdx: Integer;
CurCompClass: string; CurCompClass: TClass;
CurRegisteredComponent: TRegisteredComponent; CurRegComp: TRegisteredComponent;
PkgFile: TPkgFile; PkgFile: TPkgFile;
RequiredPackage: TLazPackageID; RequiredPackage: TLazPackageID;
CurUnitName: String; CurUnitName: String;
@ -4508,11 +4504,11 @@ begin
AllPackages:=nil; AllPackages:=nil;
CurUnitNames:=TStringList.Create; CurUnitNames:=TStringList.Create;
try try
for CurClassID:=0 to ComponentClassnames.Count-1 do for CurClassID:=0 to ComponentClasses.Count-1 do
begin begin
CurCompClass:=ComponentClassnames[CurClassID]; CurCompClass:=ComponentClasses[CurClassID];
CurRegisteredComponent:=IDEComponentPalette.FindRegComponent(CurCompClass); CurRegComp:=IDEComponentPalette.FindRegComponent(CurCompClass);
if CurRegisteredComponent is TPkgComponent then if CurRegComp is TPkgComponent then
begin begin
CurUnitName:=''; CurUnitName:='';
CurUnitNames.Clear; CurUnitNames.Clear;
@ -4525,14 +4521,16 @@ begin
UnitList.CaseSensitive:=False; UnitList.CaseSensitive:=False;
end; end;
try try
if CurRegisteredComponent.ComponentClass<>nil then if CurRegComp.ComponentClass<>nil then
begin begin
CurUnitName:=GetClassUnitName(CurRegisteredComponent.ComponentClass); CurUnitName:=CurRegComp.ComponentClass.UnitName;
CurCompReq:=GetComponentRequirements(CurRegisteredComponent.ComponentClass); CurCompReq:=GetComponentRequirements(CurRegComp.ComponentClass);
end; end;
//DebugLn(['TPkgManager.GetUnitsAndDependenciesForComponents CurUnitName=',CurUnitName]); //DebugLn(['TPkgManager.GetUnitsAndDependenciesForComponents CurUnitName=',CurUnitName]);
if CurUnitName='' then if CurUnitName='' then
CurUnitName:=CurRegisteredComponent.GetUnitName; CurUnitName:=CurRegComp.GetUnitName;
Assert(CurUnitNames.IndexOf(CurUnitName)<0,
'TPkgManager.GetUnitsAndDependenciesForComponents: Name already in CurUnitNames.');
CurUnitNames.Add(CurUnitName); CurUnitNames.Add(CurUnitName);
if CurCompReq<>nil then if CurCompReq<>nil then
CurCompReq.RequiredUnits(CurUnitNames); CurCompReq.RequiredUnits(CurUnitNames);
@ -4543,7 +4541,7 @@ begin
PkgFile:=PackageGraph.FindUnitInAllPackages(CurUnitName,true); PkgFile:=PackageGraph.FindUnitInAllPackages(CurUnitName,true);
//DebugLn(['TPkgManager.GetUnitsAndDependenciesForComponents PkgFile=',PkgFile<>nil]); //DebugLn(['TPkgManager.GetUnitsAndDependenciesForComponents PkgFile=',PkgFile<>nil]);
if PkgFile=nil then if PkgFile=nil then
PkgFile:=TPkgComponent(CurRegisteredComponent).PkgFile; PkgFile:=TPkgComponent(CurRegComp).PkgFile;
if PkgFile<>nil then if PkgFile<>nil then
begin begin
RequiredPackage:=PkgFile.LazPackage; RequiredPackage:=PkgFile.LazPackage;
@ -4578,12 +4576,12 @@ begin
end; end;
end; end;
end; end;
end; end; // for CurUnitIdx:=
finally finally
CurCompReq.Free; CurCompReq.Free;
end; end;
end; end;
end; end; // for CurClassID:=...
if Assigned(AllPackages) and (AllPackages.Count>0) then if Assigned(AllPackages) and (AllPackages.Count>0) then
begin begin
PackageList:=TPackagePackageArray.Create; PackageList:=TPackagePackageArray.Create;
@ -4598,7 +4596,7 @@ begin
Result:=mrOk; Result:=mrOk;
end; end;
function TPkgManager.FilterMissingDependenciesForUnit(const UnitFilename: string; function TPkgManager.FilterMissingDepsForUnit(const UnitFilename: string;
InputPackageList: TPackagePackageArray; InputPackageList: TPackagePackageArray;
out OutputPackageList: TOwnerPackageArray): TModalResult; out OutputPackageList: TOwnerPackageArray): TModalResult;
// returns a list of packages that are not yet used by the project the unit belongs to // returns a list of packages that are not yet used by the project the unit belongs to