From 76a66d83d4a1fc56f301379178da37cd27104173 Mon Sep 17 00:00:00 2001 From: mattias Date: Sun, 18 Jul 2010 21:07:44 +0000 Subject: [PATCH] codetools: implemented TCodeToolManager.DirectoryCachePoolGetUnitFromSet git-svn-id: trunk@26728 - --- components/codetools/codetoolmanager.pas | 22 +++++++---- components/codetools/definetemplates.pas | 50 +++++++++++++++++++----- components/codetools/directorycacher.pas | 4 +- 3 files changed, 56 insertions(+), 20 deletions(-) diff --git a/components/codetools/codetoolmanager.pas b/components/codetools/codetoolmanager.pas index 4e55a543f5..7e20984c25 100644 --- a/components/codetools/codetoolmanager.pas +++ b/components/codetools/codetoolmanager.pas @@ -946,10 +946,8 @@ begin UnitSetCache:=FPCDefinesCache.FindUnitToSrcCache(Config.FPCPath, Config.TargetOS,Config.TargetProcessor,Config.FPCOptions,Config.FPCSrcDir, true); - // parse compiler settings - UnitSetCache.GetConfigCache(true); - // parse fpc sources - UnitSetCache.GetSourceCache(true); + // parse compiler settings, fpc sources + UnitSetCache.Init; // create template for FPC settings FPCDefines:=CreateFPCTemplate(UnitSetCache,nil); @@ -5310,11 +5308,19 @@ function TCodeToolManager.DirectoryCachePoolGetUnitFromSet(const UnitSet, var Changed: boolean; UnitSetCache: TFPCUnitSetCache; - Tree: TStringToStringTree; begin - UnitSetCache:=FPCDefinesCache.FindUnitToSrcCache(UnitSet,Changed,true); - Tree:=UnitSetCache.GetUnitToSourceTree(false); - Result:=Tree[AnUnitName]; + UnitSetCache:=FPCDefinesCache.FindUnitToSrcCache(UnitSet,Changed,false); + if UnitSetCache=nil then begin + debugln(['TCodeToolManager.DirectoryCachePoolGetUnitFromSet invalid UnitSet="',dbgstr(UnitSet),'"']); + Result:=''; + exit; + end; + if Changed then begin + debugln(['TCodeToolManager.DirectoryCachePoolGetUnitFromSet outdated UnitSet="',dbgstr(UnitSet),'"']); + Result:=''; + exit; + end; + Result:=UnitSetCache.GetUnitSrcFile(AnUnitName); end; procedure TCodeToolManager.OnToolSetWriteLock(Lock: boolean); diff --git a/components/codetools/definetemplates.pas b/components/codetools/definetemplates.pas index 6e589c6c94..3f2dc18c23 100644 --- a/components/codetools/definetemplates.pas +++ b/components/codetools/definetemplates.pas @@ -816,6 +816,7 @@ type constructor Create(TheOwner: TComponent); override; destructor Destroy; override; procedure Clear; + procedure Init; property Caches: TFPCDefinesCache read FCaches; property CompilerFilename: string read FCompilerFilename write SetCompilerFilename; property CompilerOptions: string read FCompilerOptions write SetCompilerOptions; @@ -827,6 +828,7 @@ type function GetSourceRules(AutoUpdate: boolean): TFPCSourceRules; function GetUnitToSourceTree(AutoUpdate: boolean): TStringToStringTree; // lowercase unit name to file name (maybe relative) function GetSourceDuplicates(AutoUpdate: boolean): TStringToStringTree; // lower case unit to semicolon separated list of files + function GetUnitSrcFile(const AUnitName: string): string; property ChangeStamp: integer read FChangeStamp; procedure IncreaseChangeStamp; function GetUnitSetID: string; @@ -8160,8 +8162,15 @@ begin Options, FPCSrcDir, ChangeStamp); debugln(['TFPCDefinesCache.FindUnitToSrcCache UnitSetID="',dbgstr(UnitSetID),'" CompilerFilename="',CompilerFilename,'" TargetOS="',TargetOS,'" TargetCPU="',TargetCPU,'" Options="',Options,'" FPCSrcDir="',FPCSrcDir,'" ChangeStamp=',ChangeStamp,' exists=',FindUnitToSrcCache(CompilerFilename, TargetOS, TargetCPU,Options, FPCSrcDir,false)<>nil]); Result:=FindUnitToSrcCache(CompilerFilename, TargetOS, TargetCPU, - Options, FPCSrcDir,CreateIfNotExists); - Changed:=ChangeStamp<>Result.ChangeStamp; + Options, FPCSrcDir, false); + if Result<>nil then begin + Changed:=ChangeStamp<>Result.ChangeStamp; + end else if CreateIfNotExists then begin + Changed:=true; + Result:=FindUnitToSrcCache(CompilerFilename, TargetOS, TargetCPU, + Options, FPCSrcDir, true); + end else + Changed:=false; end; function TFPCDefinesCache.GetUnitSetID(CompilerFilename, TargetOS, TargetCPU, @@ -8220,15 +8229,16 @@ begin case NameStartPos^ of 'c','C': if NameFits(PChar('CompilerFilename')) then - CompilerFilename:=Value - else if NameFits(PChar('Stamp')) then - ChangeStamp:=StrToIntDef(Value,0); + CompilerFilename:=Value; 'f','F': if NameFits(PChar('FPCSrcDir')) then FPCSrcDir:=Value; 'o','O': if NameFits(PChar('Options')) then Options:=Value; + 's','S': + if NameFits(PChar('Stamp')) then + ChangeStamp:=StrToIntDef(Value,0); 't','T': if NameFits(PChar('TargetOS')) then TargetOS:=Value @@ -8285,7 +8295,6 @@ end; procedure TFPCUnitSetCache.ClearConfigCache; begin FConfigCache:=nil; - FreeAndNil(fSourceRules); fFlags:=fFlags+[fuscfUnitTreeNeedsUpdate,fuscfSrcRulesNeedUpdate]; end; @@ -8293,7 +8302,6 @@ procedure TFPCUnitSetCache.ClearSourceCache; begin fSourceCache:=nil; Include(fFlags,fuscfUnitTreeNeedsUpdate); - FreeAndNil(fSrcDuplicates); end; procedure TFPCUnitSetCache.Notification(AComponent: TComponent; @@ -8331,6 +8339,11 @@ begin end; +procedure TFPCUnitSetCache.Init; +begin + GetUnitToSourceTree(True); +end; + function TFPCUnitSetCache.GetConfigCache(AutoUpdate: boolean ): TFPCTargetConfigCache; begin @@ -8370,15 +8383,17 @@ var begin Cfg:=GetConfigCache(AutoUpdate); if (fuscfSrcRulesNeedUpdate in fFlags) - or (Cfg.ChangeStamp<>fRulesStampOfConfig) then begin + or (fRulesStampOfConfig<>Cfg.ChangeStamp) then begin + Exclude(fFlags,fuscfSrcRulesNeedUpdate); NewRules:=DefaultFPCSourceRules.Clone; try AdjustFPCSrcRulesForPPUPaths(Cfg.Units,NewRules); + debugln(['TFPCUnitSetCache.GetSourceRules ',DbgSName(fSourceRules),' ',DbgSName(NewRules)]); fSourceRules.Assign(NewRules); // increases ChangeStamp if something changed + fRulesStampOfConfig:=Cfg.ChangeStamp; finally NewRules.Free; end; - fRulesStampOfConfig:=Cfg.ChangeStamp; end; Result:=fSourceRules; end; @@ -8391,12 +8406,14 @@ var NewUnitToSourceTree: TStringToStringTree; NewSrcDuplicates: TStringToStringTree; begin + debugln(['TFPCUnitSetCache.GetUnitToSourceTree START ChangeStamp=',ChangeStamp]); Src:=GetSourceCache(AutoUpdate); SrcRules:=GetSourceRules(AutoUpdate); if (fuscfUnitTreeNeedsUpdate in fFlags) or (fUnitStampOfFiles<>Src.ChangeStamp) or (fUnitStampOfRules<>SrcRules.ChangeStamp) then begin + Exclude(fFlags,fuscfUnitTreeNeedsUpdate); NewSrcDuplicates:=nil; NewUnitToSourceTree:=nil; try @@ -8413,12 +8430,14 @@ begin fSrcDuplicates.Assign(NewSrcDuplicates); IncreaseChangeStamp; end; + fUnitStampOfFiles:=Src.ChangeStamp; + fUnitStampOfRules:=SrcRules.ChangeStamp; finally NewUnitToSourceTree.Free; NewSrcDuplicates.Free; end; - Exclude(fFlags,fuscfUnitTreeNeedsUpdate); end; + debugln(['TFPCUnitSetCache.GetUnitToSourceTree END ChangeStamp=',ChangeStamp]); Result:=fUnitToSourceTree; end; @@ -8429,6 +8448,17 @@ begin Result:=fSrcDuplicates; end; +function TFPCUnitSetCache.GetUnitSrcFile(const AUnitName: string): string; +var + Tree: TStringToStringTree; +begin + Tree:=GetUnitToSourceTree(false); + if Tree=nil then + Result:='' + else + Result:=FPCSourceDirectory+Tree[LowerCase(AUnitName)]; +end; + procedure TFPCUnitSetCache.IncreaseChangeStamp; begin if FChangeStamp