From 1c047add57aba655237bddf66750a16f5b95065e Mon Sep 17 00:00:00 2001 From: juha Date: Tue, 8 Dec 2020 19:34:44 +0000 Subject: [PATCH] IDE: Use class type instead of name when searching for components in various places. git-svn-id: trunk@64184 - --- components/buildintf/packageintf.pas | 5 +-- converter/missingpropertiesdlg.pas | 17 ++++---- ide/checklfmdlg.pas | 28 ++++++------- ide/main.pp | 29 +++++++------- ide/project.pp | 3 +- packager/pkgmanager.pas | 60 ++++++++++++++-------------- 6 files changed, 68 insertions(+), 74 deletions(-) diff --git a/components/buildintf/packageintf.pas b/components/buildintf/packageintf.pas index 00042b201f..b879da72b4 100644 --- a/components/buildintf/packageintf.pas +++ b/components/buildintf/packageintf.pas @@ -329,9 +329,8 @@ type Flags: TPkgIntfRequiredFlags = []) virtual; abstract; function AddDependencyToOwners(OwnerList: TFPList; APackage: TIDEPackage; OnlyTestIfPossible: boolean = false): TModalResult; virtual; abstract; // mrOk or mrIgnore for already connected - function AddUnitDependenciesForComponentClasses(const UnitFilename: string; - ComponentClassnames: TStrings; - Quiet: boolean = false): TModalResult; virtual; abstract; + function AddUnitDepsForCompClasses(const UnitFilename: string; + ComponentClasses: TClassList; Quiet: boolean = false): TModalResult; virtual; abstract; function RedirectPackageDependency(APackage: TIDEPackage): TIDEPackage; virtual; abstract; // package editors diff --git a/converter/missingpropertiesdlg.pas b/converter/missingpropertiesdlg.pas index 0e8792e7e5..b7474926c7 100644 --- a/converter/missingpropertiesdlg.pas +++ b/converter/missingpropertiesdlg.pas @@ -88,7 +88,7 @@ type procedure FillReplaceGrids; function ShowConvertLFMWizard: TModalResult; protected - function FixMissingComponentClasses(aMissingTypes: TStringList): TModalResult; override; + function FixMissingComponentClasses(aMissingTypes: TClassList): TModalResult; override; procedure LoadLFM; public constructor Create(ACTLink: TCodeToolLink; ALFMBuffer: TCodeBuffer); @@ -585,12 +585,12 @@ begin end; end; -function TLFMFixer.FixMissingComponentClasses(aMissingTypes: TStringList): TModalResult; +function TLFMFixer.FixMissingComponentClasses(aMissingTypes: TClassList): TModalResult; // This is called from TLFMChecker.FindAndFixMissingComponentClasses. // Add needed units to uses section using methods already defined in fUsedUnitsTool. var RegComp: TRegisteredComponent; - ClassUnitInfo: TUnitInfo; + //ClassUnitInfo: TUnitInfo; i: Integer; NeededUnitName: String; begin @@ -600,17 +600,20 @@ begin begin RegComp:=IDEComponentPalette.FindRegComponent(aMissingTypes[i]); NeededUnitName:=''; - if (RegComp<>nil) then begin - if RegComp.ComponentClass<>nil then begin + if Assigned(RegComp) then + begin + if RegComp.ComponentClass<>nil then + begin NeededUnitName:=RegComp.ComponentClass.UnitName; if NeededUnitName='' then NeededUnitName:=RegComp.GetUnitName; end; end else begin - ClassUnitInfo:=Project1.UnitWithComponentClassName(aMissingTypes[i]); + Assert(False, 'TLFMFixer.FixMissingComponentClasses: RegComp=Nil'); +{ ClassUnitInfo:=Project1.UnitWithComponentClass(aMissingTypes[i] as TComponentClass); if ClassUnitInfo<>nil then - NeededUnitName:=ClassUnitInfo.GetUsesUnitName; + NeededUnitName:=ClassUnitInfo.GetUsesUnitName; } end; if (NeededUnitName<>'') and fUsedUnitsTool.AddUnitImmediately(NeededUnitName) then diff --git a/ide/checklfmdlg.pas b/ide/checklfmdlg.pas index 4a053f5729..fce311a19b 100644 --- a/ide/checklfmdlg.pas +++ b/ide/checklfmdlg.pas @@ -76,7 +76,7 @@ type function FindListBoxError: TLFMError; procedure WriteLFMErrors; function FindAndFixMissingComponentClasses: TModalResult; - function FixMissingComponentClasses(aMissingTypes: TStringList): TModalResult; virtual; + function FixMissingComponentClasses(aMissingTypes: TClassList): TModalResult; virtual; procedure FillErrorsListBox; procedure JumpToError(LFMError: TLFMError); 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 var CurError: TLFMError; - MissingObjectTypes: TStringList; - AClassName: String; + MissingObjectTypes: TClassList; RegComp: TRegisteredComponent; + AClassName: String; i: Integer; begin Result:=mrOK; - MissingObjectTypes:=TStringList.Create; + MissingObjectTypes:=TClassList.Create; try // collect all missing object types CurError:=fLFMTree.FirstError; while CurError<>nil do begin if CurError.IsMissingObjectType then begin AClassName:=(CurError.Node as TLFMObjectNode).TypeName; - if MissingObjectTypes.IndexOf(AClassName)<0 then - MissingObjectTypes.Add(AClassName); + RegComp:=IDEComponentPalette.FindRegComponent(AClassName); + if Assigned(RegComp) and (RegComp.GetUnitName<>'') + and (MissingObjectTypes.IndexOf(RegComp.ComponentClass)<0) + then + MissingObjectTypes.Add(RegComp.ComponentClass); end; CurError:=CurError.NextError; 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. if MissingObjectTypes.Count>0 then Result:=FixMissingComponentClasses(MissingObjectTypes); // Fix them. @@ -484,11 +480,11 @@ begin end; end; -function TLFMChecker.FixMissingComponentClasses(aMissingTypes: TStringList): TModalResult; +function TLFMChecker.FixMissingComponentClasses(aMissingTypes: TClassList): TModalResult; begin // add units for the missing object types with registered component classes - Result:=PackageEditingInterface.AddUnitDependenciesForComponentClasses( - fPascalBuffer.Filename, aMissingTypes); + Result:=PackageEditingInterface.AddUnitDepsForCompClasses(fPascalBuffer.Filename, + aMissingTypes); end; function TLFMChecker.CheckUnit: boolean; diff --git a/ide/main.pp b/ide/main.pp index cb2aabdb64..ef8375d20d 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -59,7 +59,7 @@ uses MemCheck, {$ENDIF} // fpc packages - Math, Classes, SysUtils, TypInfo, types, strutils, process, Laz_AVL_Tree, + Math, Classes, SysUtils, TypInfo, types, strutils, Contnrs, process, Laz_AVL_Tree, // LCL LCLProc, LCLType, LCLIntf, LResources, HelpIntfs, InterfaceBase, LCLPlatformDef, ComCtrls, Forms, Buttons, Menus, Controls, GraphType, Graphics, ExtCtrls, @@ -13295,12 +13295,11 @@ procedure TMainIDE.PropHookPersistentAdded(APersistent: TPersistent; Select: boo var RegComp: TRegisteredComponent; ADesigner: TDesigner; - AComponent: TComponent; + AComponent, Ancestor: TComponent; ActiveSrcEdit: TSourceEditor; - ActiveUnitInfo: TUnitInfo; - Ancestor: TComponent; - ComponentClassNames: TStringList; - ClassUnitInfo: TUnitInfo; + ActiveUnitInfo, ClassUnitInfo: TUnitInfo; + ComponentClasses: TClassList; + ct: TClass; i: Integer; begin if ConsoleVerbosity>0 then @@ -13343,18 +13342,18 @@ begin // add needed package to required packages if ADesigner.LookupRoot.ComponentCount>0 then begin - ComponentClassNames:=TStringList.Create; - ComponentClassNames.Sorted:=True; - ComponentClassNames.Duplicates:=dupIgnore; - ComponentClassNames.CaseSensitive:=False; + DebugLn('TMainIDE.OnPropHookPersistentAdded Creating ComponentClassNames.'); + ComponentClasses:=TClassList.Create; try for i:=0 to ADesigner.LookupRoot.ComponentCount-1 do - ComponentClassNames.Add(ADesigner.LookupRoot.Components[i].ClassName); - //DebugLn(['TMainIDE.OnPropHookPersistentAdded ComponentClassNames=',ComponentClassNames.Text]); - PkgBoss.AddUnitDependenciesForComponentClasses(ActiveUnitInfo.Filename, - ComponentClassNames,true); + begin + ct := ADesigner.LookupRoot.Components[i].ClassType; + if ComponentClasses.IndexOf(ct)<=0 then + ComponentClasses.Add(ct); + end; + PkgBoss.AddUnitDepsForCompClasses(ActiveUnitInfo.Filename,ComponentClasses,true); finally - ComponentClassNames.Free; + ComponentClasses.Free; end; end; diff --git a/ide/project.pp b/ide/project.pp index 2bd8b7db08..ab7126dc77 100644 --- a/ide/project.pp +++ b/ide/project.pp @@ -5537,8 +5537,7 @@ begin Result:=Result.fNext[uilWithComponent]; end; -function TProject.UnitWithComponentClassName(const AClassName: string - ): TUnitInfo; +function TProject.UnitWithComponentClassName(const AClassName: string): TUnitInfo; begin Result := fFirst[uilWithComponent]; while (Result<>nil) diff --git a/packager/pkgmanager.pas b/packager/pkgmanager.pas index 12d885e4d6..728867d2ef 100644 --- a/packager/pkgmanager.pas +++ b/packager/pkgmanager.pas @@ -205,11 +205,11 @@ type function ResolveBrokenDependenciesOnline(ABrokenDependencies: TFPList): TModalResult; function ShowBrokenDependenciesReport(Dependencies: TFPList): TModalResult; // Components - function FilterMissingDependenciesForUnit(const UnitFilename: string; - InputPackageList: TPackagePackageArray; - out OutputPackageList: TOwnerPackageArray): TModalResult; - function GetUnitsAndDependenciesForComponents(ComponentClassNames: TStrings; - out PackageList: TPackagePackageArray; out UnitList: TStringList): TModalResult; + function FilterMissingDepsForUnit(const UnitFilename: string; + InputPackageList: TPackagePackageArray; + out OutputPackageList: TOwnerPackageArray): TModalResult; + function GetUnitsAndDepsForComps(ComponentClasses: TClassList; + out PackageList: TPackagePackageArray; out UnitList: TStringList): TModalResult; public constructor Create(TheOwner: TComponent); override; destructor Destroy; override; @@ -357,9 +357,8 @@ type ShowDialog: boolean): TModalResult; // components - function AddUnitDependenciesForComponentClasses(const UnitFilename: string; - ComponentClassnames: TStrings; - Quiet: boolean = false): TModalResult; override; + function AddUnitDepsForCompClasses(const UnitFilename: string; + ComponentClasses: TClassList; Quiet: boolean): TModalResult; override; { function GetMissingDependenciesForUnit(const UnitFilename: string; ComponentClassnames: TStrings; var List: TOwnerPackageArray): TModalResult; @@ -4294,9 +4293,8 @@ begin PackageList.AddObject(APackageID.Name,APackageID); end; -function TPkgManager.AddUnitDependenciesForComponentClasses( - const UnitFilename: string; ComponentClassnames: TStrings; - Quiet: boolean): TModalResult; +function TPkgManager.AddUnitDepsForCompClasses(const UnitFilename: string; + ComponentClasses: TClassList; Quiet: boolean): TModalResult; var UnitBuf: TCodeBuffer; UnitNames: TStringList; @@ -4449,13 +4447,12 @@ begin Dependencies:=nil; MissingDependencies:=nil; try - Result:=GetUnitsAndDependenciesForComponents(ComponentClassnames, - Dependencies,UnitNames); + Result:=GetUnitsAndDepsForComps(ComponentClasses, Dependencies, UnitNames); if Result<>mrOk then exit; if (Dependencies<>nil) then begin - Result:=FilterMissingDependenciesForUnit(UnitFilename,Dependencies,MissingDependencies); + Result:=FilterMissingDepsForUnit(UnitFilename,Dependencies,MissingDependencies); if Result<>mrOk then exit; end; @@ -4484,15 +4481,14 @@ begin end; end; -function TPkgManager.GetUnitsAndDependenciesForComponents( - ComponentClassNames: TStrings; out PackageList: TPackagePackageArray; - out UnitList: TStringList): TModalResult; +function TPkgManager.GetUnitsAndDepsForComps(ComponentClasses: TClassList; + out PackageList: TPackagePackageArray; out UnitList: TStringList): TModalResult; // returns a list of packages and units needed to use the Component in the unit var CurClassID: Integer; CurUnitIdx, CurPackageIdx: Integer; - CurCompClass: string; - CurRegisteredComponent: TRegisteredComponent; + CurCompClass: TClass; + CurRegComp: TRegisteredComponent; PkgFile: TPkgFile; RequiredPackage: TLazPackageID; CurUnitName: String; @@ -4508,11 +4504,11 @@ begin AllPackages:=nil; CurUnitNames:=TStringList.Create; try - for CurClassID:=0 to ComponentClassnames.Count-1 do + for CurClassID:=0 to ComponentClasses.Count-1 do begin - CurCompClass:=ComponentClassnames[CurClassID]; - CurRegisteredComponent:=IDEComponentPalette.FindRegComponent(CurCompClass); - if CurRegisteredComponent is TPkgComponent then + CurCompClass:=ComponentClasses[CurClassID]; + CurRegComp:=IDEComponentPalette.FindRegComponent(CurCompClass); + if CurRegComp is TPkgComponent then begin CurUnitName:=''; CurUnitNames.Clear; @@ -4525,14 +4521,16 @@ begin UnitList.CaseSensitive:=False; end; try - if CurRegisteredComponent.ComponentClass<>nil then + if CurRegComp.ComponentClass<>nil then begin - CurUnitName:=GetClassUnitName(CurRegisteredComponent.ComponentClass); - CurCompReq:=GetComponentRequirements(CurRegisteredComponent.ComponentClass); + CurUnitName:=CurRegComp.ComponentClass.UnitName; + CurCompReq:=GetComponentRequirements(CurRegComp.ComponentClass); end; //DebugLn(['TPkgManager.GetUnitsAndDependenciesForComponents CurUnitName=',CurUnitName]); if CurUnitName='' then - CurUnitName:=CurRegisteredComponent.GetUnitName; + CurUnitName:=CurRegComp.GetUnitName; + Assert(CurUnitNames.IndexOf(CurUnitName)<0, + 'TPkgManager.GetUnitsAndDependenciesForComponents: Name already in CurUnitNames.'); CurUnitNames.Add(CurUnitName); if CurCompReq<>nil then CurCompReq.RequiredUnits(CurUnitNames); @@ -4543,7 +4541,7 @@ begin PkgFile:=PackageGraph.FindUnitInAllPackages(CurUnitName,true); //DebugLn(['TPkgManager.GetUnitsAndDependenciesForComponents PkgFile=',PkgFile<>nil]); if PkgFile=nil then - PkgFile:=TPkgComponent(CurRegisteredComponent).PkgFile; + PkgFile:=TPkgComponent(CurRegComp).PkgFile; if PkgFile<>nil then begin RequiredPackage:=PkgFile.LazPackage; @@ -4578,12 +4576,12 @@ begin end; end; end; - end; + end; // for CurUnitIdx:= finally CurCompReq.Free; end; end; - end; + end; // for CurClassID:=... if Assigned(AllPackages) and (AllPackages.Count>0) then begin PackageList:=TPackagePackageArray.Create; @@ -4598,7 +4596,7 @@ begin Result:=mrOk; end; -function TPkgManager.FilterMissingDependenciesForUnit(const UnitFilename: string; +function TPkgManager.FilterMissingDepsForUnit(const UnitFilename: string; InputPackageList: TPackagePackageArray; out OutputPackageList: TOwnerPackageArray): TModalResult; // returns a list of packages that are not yet used by the project the unit belongs to