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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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