IDE: Optimize DefineTemplates updates for packages and project.

git-svn-id: trunk@64405 -
This commit is contained in:
juha 2021-01-19 09:20:34 +00:00
parent 00e7a5c92b
commit b092cee8be
11 changed files with 91 additions and 90 deletions

View File

@ -602,7 +602,7 @@ type
procedure RemoveTemplatesOwnedBy(TheOwner: TObject;
const MustFlags, NotFlags: TDefineTemplateFlags);
procedure ReplaceChild(ParentTemplate, NewDefineTemplate: TDefineTemplate;
const ChildName: string);
const ChildName: string; AClearCache: boolean=true);
procedure ReplaceRootSameName(ADefineTemplate: TDefineTemplate);
procedure ReplaceRootSameName(const Name: string;
ADefineTemplate: TDefineTemplate);
@ -6007,8 +6007,8 @@ begin
if HadDefines then ClearCache;
end;
procedure TDefineTree.ReplaceChild(ParentTemplate,
NewDefineTemplate: TDefineTemplate; const ChildName: string);
procedure TDefineTree.ReplaceChild(ParentTemplate, NewDefineTemplate: TDefineTemplate;
const ChildName: string; AClearCache: boolean);
// if there is a DefineTemplate with the same name then replace it
// else add as last
var OldDefineTemplate: TDefineTemplate;
@ -6016,9 +6016,9 @@ begin
if (ChildName='') or (ParentTemplate=nil) then exit;
OldDefineTemplate:=ParentTemplate.FindChildByName(ChildName);
if OldDefineTemplate<>nil then begin
if not OldDefineTemplate.IsEqual(NewDefineTemplate,true,false) then begin
if AClearCache
and not OldDefineTemplate.IsEqual(NewDefineTemplate,true,false) then
ClearCache;
end;
if NewDefineTemplate<>nil then
NewDefineTemplate.InsertBehind(OldDefineTemplate);
if OldDefineTemplate=FFirstDefineTemplate then
@ -6026,7 +6026,8 @@ begin
OldDefineTemplate.Unbind;
OldDefineTemplate.Free;
end else begin
ClearCache;
if AClearCache then
ClearCache;
ParentTemplate.AddChild(NewDefineTemplate);
end;
end;

View File

@ -648,10 +648,13 @@ end;
procedure TExpressionEvaluator.RemoveDoubles(OnGetSameString: TOnGetSameString);
var
i: Integer;
V: String;
begin
for i:=0 to FCount-1 do begin
OnGetSameString(FNames[i]);
OnGetSameString(FValues[i]);
V:=FValues[i];
if V<>'' then
OnGetSameString(V);
end;
end;

View File

@ -70,7 +70,6 @@ function CreateProjectTemplateWithID(const ProjectID: string): TDefineTemplate;
// packages
function FindPackagesTemplate: TDefineTemplate;
function FindPackageTemplateWithID(const PkgID: string): TDefineTemplate;
function CreatePackagesTemplate: TDefineTemplate;
function CreatePackageTemplateWithID(const PkgID: string): TDefineTemplate;
// miscellaneous

View File

@ -5212,7 +5212,7 @@ begin
UpdateCaption;
if Assigned(ProjInspector) then
ProjInspector.UpdateTitle;
Project1.DefineTemplates.AllChanged;
Project1.DefineTemplates.AllChanged(false);
IncreaseCompilerParseStamp;
if Project1.UseAsDefault then
@ -9785,8 +9785,8 @@ begin
if FIDECodeToolsDefines=ctdNeedUpdate then begin
FIDECodeToolsDefines:=ctdUpdating;
if Project1<>nil then
Project1.DefineTemplates.AllChanged;
PkgBoss.RebuildDefineTemplates;
Project1.DefineTemplates.AllChanged(false);
PackageGraph.RebuildDefineTemplates;
FIDECodeToolsDefines:=ctdReady;
//DebugLn('TMainIDE.CodeToolBossPrepareTree CompilerGraphStamp=',dbgs(CompilerGraphStamp));
{$IFDEF VerboseAddProjPkg}
@ -9905,12 +9905,12 @@ end;
procedure TMainIDE.CompilerParseStampIncHandler;
begin
if FIDECodeToolsDefines=ctdUpdating then exit;
if (FIDECodeToolsDefines=ctdUpdating) or (not FIDEStarted) then exit;
{$IFDEF VerboseAddProjPkg}
DebugLn(['TMainIDE.OnCompilerParseStampIncreased ']);
{$ENDIF}
FIDECodeToolsDefines:=ctdNeedUpdate;
CodeToolBoss.DefineTree.ClearCache;
//CodeToolBoss.DefineTree.ClearCache;
end;
procedure TMainIDE.CodeToolBossScannerInit(Self: TCodeToolManager; Scanner: TLinkScanner);

View File

@ -564,7 +564,7 @@ type
procedure FixTemplateOrder;
protected
procedure UpdateMain; override;
procedure UpdateSrcDirIfDef; override;
function UpdateSrcDirIfDef: Boolean; override;
procedure UpdateSourceDirectories; override;
procedure UpdateOutputDirectory; override;
procedure UpdateDefinesForCustomDefines; override;
@ -572,7 +572,7 @@ type
public
constructor Create(AOwner: IProjPack);
destructor Destroy; override;
procedure AllChanged; override;
procedure AllChanged(AActivating: boolean); override;
procedure UpdateGlobalValues;
end;
@ -6476,9 +6476,9 @@ begin
// ClearCache is here unnessary, because it is only a block
end;
procedure TProjectDefineTemplates.UpdateSrcDirIfDef;
function TProjectDefineTemplates.UpdateSrcDirIfDef: Boolean;
// Returns the changed state
var
Changed: Boolean;
NamespacesDefTempl: TDefineTemplate;
UnitPathDefTempl: TDefineTemplate;
IncPathDefTempl: TDefineTemplate;
@ -6497,7 +6497,7 @@ begin
FMain.AddChild(FSrcDirectories);
end;
Changed:=false;
Result:=false;
IfValue:='defined(#ProjectSrcMark'+Owner.IDAsWord+')';
if (Owner as TProject) = Project1 then
IfValue:=IfValue+' or defined('+UseDefaultsFlagName+')';
@ -6532,15 +6532,13 @@ begin
da_Define);
FSrcDirIf.AddChild(SrcPathDefTempl);
Changed:=true;
Result:=true;
end else begin
if FSrcDirIf.Value<>IfValue then begin
FSrcDirIf.Value:=IfValue;
Changed:=true;
Result:=true;
end;
end;
if Changed then
CodeToolBoss.DefineTree.ClearCache;
end;
procedure TProjectDefineTemplates.UpdateOutputDirectory;
@ -6576,7 +6574,7 @@ begin
FOutputSrcPath.SetDefineOwner(Proj,false);
FOutputSrcPath.SetFlags([dtfAutoGenerated],[],false);
CodeToolBoss.DefineTree.ReplaceChild(FOutputDir,FOutputSrcPath,
FOutputSrcPath.Name);
FOutputSrcPath.Name, not (ptfLoading in FFlags));
end;
end;
@ -6656,8 +6654,8 @@ begin
// add directory
FSrcDirectories.AddChild(SrcDirDefTempl);
end;
CodeToolBoss.DefineTree.ClearCache;
if not (ptfLoading in FFlags) then
CodeToolBoss.DefineTree.ClearCache;
finally
NewSourceDirs.Free;
end;
@ -6667,14 +6665,12 @@ procedure TProjectDefineTemplates.UpdateDefinesForCustomDefines;
var
OptionsDefTempl: TDefineTemplate;
NewCustomOptions: String;
Changed: Boolean;
begin
if (not Owner.NeedsDefineTemplates) or (not Active) then exit;
// check if something has changed
NewCustomOptions:=Owner.BaseCompilerOptions.GetOptionsForCTDefines;
if (FLastCustomOptions=NewCustomOptions) then exit;
Changed:=false;
FLastCustomOptions:=NewCustomOptions;
OptionsDefTempl:=CodeToolBoss.DefinePool.CreateFPCCommandLineDefines(
@ -6682,16 +6678,15 @@ begin
if OptionsDefTempl=nil then begin
// no custom options -> delete old template
if FSrcDirIf<>nil then begin
if FSrcDirIf.DeleteChild('Custom Options') then
Changed:=true;
if FSrcDirIf.DeleteChild('Custom Options') and not (ptfLoading in FFlags) then
CodeToolBoss.DefineTree.ClearCache;
end;
end else begin
UpdateSrcDirIfDef;
FSrcDirIf.ReplaceChild(OptionsDefTempl);
Changed:=true;
if not (ptfLoading in FFlags) then
CodeToolBoss.DefineTree.ClearCache;
end;
if Changed then
CodeToolBoss.DefineTree.ClearCache;
end;
procedure TProjectDefineTemplates.FixTemplateOrder;
@ -6702,16 +6697,15 @@ end;
procedure TProjectDefineTemplates.ClearFlags;
begin
FFlags:=FFlags+[ptfFlagsChanged];
FFlags:=FFlags+[ptfCustomDefinesChanged];
end;
procedure TProjectDefineTemplates.AllChanged;
procedure TProjectDefineTemplates.AllChanged(AActivating: boolean);
begin
UpdateSrcDirIfDef;
SourceDirectoriesChanged;
CustomDefinesChanged;
UpdateGlobalValues;
UpdateSrcDirIfDef;
CodeToolBoss.DefineTree.ClearCache;
end;
procedure TProjectDefineTemplates.UpdateGlobalValues;

View File

@ -3613,7 +3613,6 @@ begin
MainBuildBoss.SetBuildTargetProject1(false);
// (i.e. remove old project specific things and create new)
IncreaseCompilerParseStamp;
Project1.DefineTemplates.AllChanged;
Project1.DefineTemplates.Active:=true;
DebugBoss.Reset;
finally
@ -7448,7 +7447,6 @@ begin
// load required packages
PkgBoss.OpenProjectDependencies(Project1, MainIDE.IDEStarted);
Project1.DefineTemplates.AllChanged;
//DebugLn('CompleteLoadingProjectInfo ',Project1.IDAsString);
Project1.DefineTemplates.Active:=true;

View File

@ -127,7 +127,6 @@ type
): TModalResult; virtual; abstract;
function CheckUserSearchPaths(aCompilerOptions: TBaseCompilerOptions): TModalResult; virtual; abstract;
procedure DoShowPackageGraphPathList(PathList: TFPList); virtual; abstract;
procedure RebuildDefineTemplates; virtual; abstract;
procedure LazarusSrcDirChanged; virtual; abstract;
// package compilation

View File

@ -405,7 +405,7 @@ type
private
protected
procedure UpdateMain; override;
procedure UpdateSrcDirIfDef; override;
function UpdateSrcDirIfDef: Boolean; override;
procedure UpdateSourceDirectories; override;
procedure UpdateOutputDirectory; override;
procedure UpdateDefinesForCustomDefines; override;
@ -413,7 +413,7 @@ type
public
constructor Create(AOwner: IProjPack);
destructor Destroy; override;
procedure AllChanged; override;
procedure AllChanged(AActivating: boolean); override;
end;
@ -589,6 +589,7 @@ type
procedure SetAutoInstall(AValue: TPackageInstallType); override;
public
constructor Create; override;
constructor CreateAndClear;
destructor Destroy; override;
procedure AssignOptions(Source: TPersistent); override;
// IDE options
@ -742,7 +743,8 @@ type
property FPDocPaths: string read FFPDocPaths write SetFPDocPaths;
property FPDocPackageName: string read FFPDocPackageName write SetFPDocPackageName;
property License: string read FLicense write SetLicense;
property LPKSource: TCodeBuffer read FLPKSource write SetLPKSource;// see Missing, can be nil when file on disk was removed or point to a different codebuffer during rename
// see Missing, can be nil when file on disk was removed or point to a different codebuffer during rename
property LPKSource: TCodeBuffer read FLPKSource write SetLPKSource;
property LPKSourceChangeStep: integer read FLPKSourceChangeStep write FLPKSourceChangeStep;
property Macros: TTransferMacroList read FMacros;
property MainUnit: TPkgFile read FMainUnit;
@ -2626,10 +2628,15 @@ begin
FDefineTemplates:=TLazPackageDefineTemplates.Create(Self);
fPublishOptions:=TPublishPackageOptions.Create(Self);
FProvides:=TStringList.Create;
Clear;
FUsageOptions.ParsedOpts.InvalidateParseOnChange:=true;
end;
constructor TLazPackage.CreateAndClear;
begin
Create;
Clear;
end;
destructor TLazPackage.Destroy;
begin
Include(FFlags,lpfDestroying);
@ -4348,8 +4355,7 @@ begin
Result:=LazPackage.IDAsString;
end;
function TPkgAdditionalCompilerOptions.
GetBaseCompilerOptions: TBaseCompilerOptions;
function TPkgAdditionalCompilerOptions.GetBaseCompilerOptions: TBaseCompilerOptions;
begin
Result:=LazPackage.CompilerOptions;
end;
@ -4374,13 +4380,14 @@ begin
ptfCustomDefinesChanged];
end;
procedure TLazPackageDefineTemplates.AllChanged;
procedure TLazPackageDefineTemplates.AllChanged(AActivating: boolean);
begin
IDChanged;
UpdateSrcDirIfDef;// always create the SrcDirIfDef for IDE add-ons
if not AActivating then // Create the SrcDirIfDef for IDE add-ons
UpdateSrcDirIfDef; // (Will be called from other methods during activation)
SourceDirectoriesChanged;
CustomDefinesChanged;
OutputDirectoryChanged;
CustomDefinesChanged;
end;
procedure TLazPackageDefineTemplates.UpdateMain;
@ -4397,9 +4404,8 @@ begin
// ClearCache is here unnessary, because it is only a block
end;
procedure TLazPackageDefineTemplates.UpdateSrcDirIfDef;
function TLazPackageDefineTemplates.UpdateSrcDirIfDef: Boolean;
var
Changed: Boolean;
NewVariable: String;
UnitPathDefTempl: TDefineTemplate;
IncPathDefTempl: TDefineTemplate;
@ -4416,7 +4422,7 @@ begin
da_Block);
FMain.AddChild(FSrcDirectories);
end;
Changed:=false;
Result:=false;
if FSrcDirIf=nil then begin
FSrcDirIf:=TDefineTemplate.Create('Source Directory Additions',
'Additional defines for package source directories',
@ -4433,8 +4439,7 @@ begin
'#IncPath','$(#IncPath);$PkgIncPath('+Owner.IDAsString+')',
da_Define);
FSrcDirIf.AddChild(IncPathDefTempl);
Changed:=true;
Result:=true;
end else begin
NewVariable:='#PkgSrcMark'+Owner.IDAsWord;
if NewVariable<>FSrcDirIf.Variable then begin
@ -4447,12 +4452,9 @@ begin
IncPathDefTempl:=FSrcDirIf.FindChildByName('IncPath');
if IncPathDefTempl<>nil then
IncPathDefTempl.Value:='$(#IncPath);$PkgIncPath('+Owner.IDAsString+')';
Changed:=true;
Result:=true;
end;
end;
if Changed then
CodeToolBoss.DefineTree.ClearCache;
end;
procedure TLazPackageDefineTemplates.UpdateOutputDirectory;
@ -4484,7 +4486,7 @@ begin
FOutputSrcPath.SetDefineOwner(LazPackage,false);
FOutputSrcPath.SetFlags([dtfAutoGenerated],[],false);
CodeToolBoss.DefineTree.ReplaceChild(FOutputDir,FOutputSrcPath,
FOutputSrcPath.Name);
FOutputSrcPath.Name, not (ptfLoading in FFlags));
end;
end;
@ -4528,8 +4530,7 @@ begin
// build source directory define templates
FreeAndNil(fLastSourceDirectories);
fLastSourceDirectories:=SearchPathToList(CurUnitPath);
if (fLastSourceDirectories.Count>0)
and ((FSrcDirIf=nil) or IDHasChanged) then
if (fLastSourceDirectories.Count>0) and ((FSrcDirIf=nil) or IDHasChanged) then
UpdateSrcDirIfDef;
for i:=0 to fLastSourceDirectories.Count-1 do begin
// create directory template
@ -4547,7 +4548,8 @@ begin
// add directory
FSrcDirectories.AddChild(SrcDirDefTempl);
end;
CodeToolBoss.DefineTree.ClearCache;
if not (ptfLoading in FFlags) then
CodeToolBoss.DefineTree.ClearCache;
end;
procedure TLazPackageDefineTemplates.UpdateDefinesForCustomDefines;
@ -4567,13 +4569,12 @@ begin
if OptionsDefTempl=nil then begin
// no custom options -> delete old template
if FSrcDirIf<>nil then begin
if FSrcDirIf.DeleteChild('Custom Options') then
if FSrcDirIf.DeleteChild('Custom Options') and not (ptfLoading in FFlags) then
CodeToolBoss.DefineTree.ClearCache;
end;
end else begin
UpdateSrcDirIfDef;
FSrcDirIf.ReplaceChild(OptionsDefTempl);
CodeToolBoss.DefineTree.ClearCache;
end;
end;

View File

@ -974,6 +974,7 @@ begin
PkgLink.LPKFileDateValid:=true;
XMLConfig:=TXMLConfig.Create(nil);
NewPackage:=TLazPackage.Create;
NewPackage.BeginUpdate;
NewPackage.Filename:=AFilename;
NewPackage.OnModifySilently := @PkgModify;
Result:=LoadXMLConfigFromCodeBuffer(AFilename,XMLConfig,
@ -1007,6 +1008,8 @@ begin
else
ReplacePackage(OldPackage,NewPackage);
finally
if Assigned(NewPackage) then
NewPackage.EndUpdate;
if Result<>mrOk then
NewPackage.Free;
EndUpdate;
@ -1199,7 +1202,7 @@ var
i: Integer;
begin
for i:=0 to Count-1 do
Packages[i].DefineTemplates.AllChanged;
Packages[i].DefineTemplates.AllChanged(false);
end;
function TLazPackageGraph.MacroFunctionPkgDir(const s: string;
@ -1826,7 +1829,7 @@ end;
function TLazPackageGraph.CreateNewPackage(const Prefix: string): TLazPackage;
begin
BeginUpdate(true);
Result:=TLazPackage.Create;
Result:=TLazPackage.CreateAndClear;
Result.OnModifySilently:=@PkgModify;
Result.Name:=CreateUniquePkgName(Prefix,nil);
AddPackage(Result);
@ -2039,7 +2042,7 @@ end;
function TLazPackageGraph.CreateDefaultPackage: TLazPackage;
begin
Result:=TLazPackage.Create;
Result:=TLazPackage.CreateAndClear;
with Result do begin
Missing:=true;
UserReadOnly:=true;
@ -6067,7 +6070,7 @@ begin
// a valid lpk file of the installed package can not be found
IsBasePkg:=IsStaticBasePackage(Dependency.PackageName);
// -> create a broken package
BrokenPackage:=TLazPackage.Create;
BrokenPackage:=TLazPackage.CreateAndClear;
with BrokenPackage do begin
BeginUpdate;
Missing:=true;

View File

@ -252,7 +252,6 @@ type
procedure DoShowPackageGraph(Show: boolean);
procedure DoShowPackageGraphPathList(PathList: TFPList); override;
function CheckUserSearchPaths(aCompilerOptions: TBaseCompilerOptions): TModalResult; override;
procedure RebuildDefineTemplates; override;
procedure LazarusSrcDirChanged; override;
function GetPackageCount: integer; override;
function GetPackages(Index: integer): TIDEPackage; override;
@ -3974,11 +3973,6 @@ begin
end;
end;
procedure TPkgManager.RebuildDefineTemplates;
begin
PackageGraph.RebuildDefineTemplates;
end;
procedure TPkgManager.LazarusSrcDirChanged;
const
LazDirMacro = '$(LazarusDir)';

View File

@ -11,6 +11,8 @@ uses
LazTracer, FileReferenceList,
// Codetools
DefineTemplates, CodeToolManager,
// IdeIntf
LazIDEIntf,
// IDE
CompilerOptions;
@ -44,8 +46,8 @@ type
{ TProjPackDefineTemplates }
TProjPackDefineTemplatesFlag = (
ptfLoading,
ptfIsPackageTemplate,
ptfFlagsChanged,
ptfIDChanged,
ptfSourceDirsChanged,
ptfOutputDirChanged,
@ -56,6 +58,7 @@ type
TProjPackDefineTemplates = class
private
FOwner: IProjPack;
procedure InternalIDChanged;
protected
FActive: boolean;
FSrcDirectories: TDefineTemplate;
@ -73,7 +76,7 @@ type
fLastUnitPath: string;
procedure SetActive(const AValue: boolean);
procedure UpdateMain; virtual; abstract;
procedure UpdateSrcDirIfDef; virtual; abstract;
function UpdateSrcDirIfDef: Boolean; virtual; abstract;
procedure UpdateSourceDirectories; virtual; abstract;
procedure UpdateOutputDirectory; virtual; abstract;
procedure UpdateDefinesForCustomDefines; virtual; abstract;
@ -84,11 +87,11 @@ type
procedure Clear;
procedure BeginUpdate;
procedure EndUpdate;
procedure AllChanged; virtual; abstract;
procedure AllChanged(AActivating: boolean); virtual; abstract;
procedure IDChanged;
procedure SourceDirectoriesChanged;// a source directory was added/deleted
procedure CustomDefinesChanged; // the defines of the source dirs changed
procedure OutputDirectoryChanged;// the path or the defines of the output dir changed
procedure CustomDefinesChanged; // the defines of the source dirs changed
public
property Owner: IProjPack read FOwner;
property Main: TDefineTemplate read FMain;
@ -145,13 +148,15 @@ begin
if FUpdateLock=0 then RaiseGDBException('TProjPackDefineTemplates.EndUpdate');
dec(FUpdateLock);
if FUpdateLock=0 then begin
if ptfIsPackageTemplate in FFlags then begin
if ptfIDChanged in FFlags then IDChanged;
end;
if ptfFlagsChanged in FFlags then CustomDefinesChanged;
if not LazarusIDE.IDEStarted then
Include(FFlags, ptfLoading);
if FFlags * [ptfIsPackageTemplate,ptfIDChanged] // AND
= [ptfIsPackageTemplate,ptfIDChanged] then
InternalIDChanged;
if ptfSourceDirsChanged in FFlags then SourceDirectoriesChanged;
if ptfOutputDirChanged in FFlags then OutputDirectoryChanged;
if ptfCustomDefinesChanged in FFlags then CustomDefinesChanged;
Exclude(FFlags, ptfLoading);
end;
end;
@ -160,22 +165,30 @@ begin
if FActive=AValue then exit;
FActive:=AValue;
if FActive then
AllChanged
AllChanged(true)
else
Clear;
end;
procedure TProjPackDefineTemplates.InternalIDChanged;
// Called only from EndUpdate.
begin
Exclude(FFlags,ptfIDChanged);
UpdateMain;
end;
procedure TProjPackDefineTemplates.IDChanged;
begin
if FUpdateLock>0 then begin
Include(FFlags,ptfIDChanged);
FFlags:=FFlags+[ptfIDChanged, ptfSourceDirsChanged, ptfOutputDirChanged,
ptfCustomDefinesChanged];
exit;
end;
Exclude(FFlags,ptfIDChanged);
UpdateMain;
UpdateOutputDirectory;
UpdateSourceDirectories;
UpdateDefinesForCustomDefines;
SourceDirectoriesChanged;
OutputDirectoryChanged;
CustomDefinesChanged;
end;
procedure TProjPackDefineTemplates.SourceDirectoriesChanged;
@ -186,7 +199,6 @@ begin
end;
Exclude(FFlags,ptfSourceDirsChanged);
UpdateSourceDirectories;
CodeToolBoss.DefineTree.ClearCache;
end;
procedure TProjPackDefineTemplates.OutputDirectoryChanged;
@ -197,7 +209,6 @@ begin
end;
Exclude(FFlags,ptfOutputDirChanged);
UpdateOutputDirectory;
CodeToolBoss.DefineTree.ClearCache;
end;
procedure TProjPackDefineTemplates.CustomDefinesChanged;
@ -208,8 +219,6 @@ begin
end;
Exclude(FFlags,ptfCustomDefinesChanged);
UpdateDefinesForCustomDefines; // maybe custom defines changed
if ptfIsPackageTemplate in FFlags then
CodeToolBoss.DefineTree.ClearCache;
end;