Converter: for units omitted from project, add Lazarus Package as a dependency

git-svn-id: trunk@39787 -
This commit is contained in:
juha 2013-01-06 19:18:38 +00:00
parent 87703369e3
commit 4d015441b6
4 changed files with 83 additions and 64 deletions

View File

@ -182,7 +182,8 @@ type
function ExtractOptionsFromDOF(const DOFFilename: string): TModalResult;
function ExtractOptionsFromCFG(const CFGFilename: string): TModalResult;
function DoMissingUnits(AUsedUnitsTool: TUsedUnitsTool): integer; override;
function CheckPackageDependency(AUnitName: string): Boolean;
function CheckPackageDep(AUnitName: string): Boolean;
function TryAddPackageDep(AUnitName, ADefaultPkgName: string): Boolean;
protected
function CreateInstance: TModalResult; virtual; abstract;
function CreateMainSourceFile: TModalResult; virtual;
@ -539,7 +540,7 @@ begin
fUsedUnitsTool:=TUsedUnitsTool.Create(fCTLink, fOrigUnitFilename);
if fOwnerConverter is TConvertDelphiProjPack then
with TConvertDelphiProjPack(fOwnerConverter) do begin
fUsedUnitsTool.OnCheckPackageDependency:=@CheckPackageDependency;
fUsedUnitsTool.OnCheckPackageDependency:=@CheckPackageDep;
fUsedUnitsTool.IsConsoleApp:=fIsConsoleApp;
end;
if fOwnerConverter is TConvertDelphiProject then
@ -1095,7 +1096,7 @@ var
';'+lowercase(DelphiPkgNames)+';')>0 then begin
AddPackageDependency(LazarusPkgName);
IDEMessagesWindow.AddMsg(
Format(lisConvDelphiAddedPackageRequirement, [LazarusPkgName]), '', -1);
Format(lisConvDelphiAddedPackageDependency, [LazarusPkgName]), '', -1);
end;
end;
@ -1265,7 +1266,7 @@ function TConvertDelphiProjPack.DoMissingUnits(AUsedUnitsTool: TUsedUnitsTool):
fUnitsToAddToProject.Add(sUnitPath+RealFileName);
AUsedUnits.MissingUnits.Delete(i); // No more missing, delete from list.
end
else if CheckPackageDependency(mUnit) then
else if CheckPackageDep(mUnit) then
AUsedUnits.MissingUnits.Delete(i);
end;
end;
@ -1276,7 +1277,9 @@ begin
Result:=AUsedUnitsTool.MissingUnitCount;
end;
function TConvertDelphiProjPack.CheckPackageDependency(AUnitName: string): Boolean;
function TConvertDelphiProjPack.CheckPackageDep(AUnitName: string): Boolean;
// Check if the given unit can be found in existing packages. Add a dependency if found.
// This is called only if the unit is reported as missing.
var
Pack: TPkgFile;
Dep: TPkgDependency;
@ -1290,7 +1293,7 @@ begin
if s='LCLBase' then
s:='LCL';
AddPackageDependency(s);
IDEMessagesWindow.AddMsg(Format(lisConvDelphiAddedPackageRequirement, [s]), '', -1);
IDEMessagesWindow.AddMsg(Format(lisConvDelphiAddedPackageDependency, [s]), '', -1);
Dep:=FindDependencyByName(s);
if Assigned(Dep) then
PackageGraph.OpenDependency(Dep,false);
@ -1300,6 +1303,22 @@ begin
end;
end;
function TConvertDelphiProjPack.TryAddPackageDep(AUnitName, ADefaultPkgName: string): Boolean;
var
Dep: TPkgDependency;
begin
Result:=False;
if ADefaultPkgName<>'' then begin
Dep:=FindDependencyByName(ADefaultPkgName);
if not Assigned(Dep) then begin
Result:=CheckPackageDep(AUnitName); // Add dependency based on unit name (default is ignored)
if not Result then
// Package was not found. Add a message about a package that must be installed.
IDEMessagesWindow.AddMsg(Format(lisConvDelphiPackageRequired, [ADefaultPkgName]), '', -1);
end;
end;
end;
function TConvertDelphiProjPack.CreateMainSourceFile: TModalResult;
begin
Result:=mrOK; // Do nothing. Overridden in project.
@ -1418,7 +1437,6 @@ function TConvertDelphiProject.AddUnit(AFileName: string;
var
CurUnitInfo: TUnitInfo;
RP, PureUnitName: String;
x: Integer;
begin
Result:=mrOK;
OutUnitInfo:=nil;
@ -1432,7 +1450,13 @@ begin
if (RP<>'') and (fUnitSearchPaths.IndexOf(RP)<0) then
fUnitSearchPaths.Add(RP);
PureUnitName:=ExtractFileNameOnly(AFileName);
if not fSettings.OmitProjUnits.Find(PureUnitName, x) then begin
if fSettings.OmitProjUnits.Contains(PureUnitName) then
begin
fMainUnitConverter.fUsedUnitsTool.Remove(PureUnitName);
IDEMessagesWindow.AddMsg(Format(lisConvDelphiProjOmittedUnit,[PureUnitName]), '', -1);
TryAddPackageDep(PureUnitName, fSettings.OmitProjUnits[PureUnitName]);
end
else begin
// Check unitname and create UnitInfo.
CurUnitInfo:=LazProject.UnitInfoWithFilename(AFileName);
if CurUnitInfo=nil then begin
@ -1461,10 +1485,6 @@ begin
end;
CurUnitInfo.IsPartOfProject:=true;
OutUnitInfo:=CurUnitInfo;
end
else begin
fMainUnitConverter.fUsedUnitsTool.Remove(PureUnitName);
IDEMessagesWindow.AddMsg(Format(lisConvDelphiProjOmittedUnit,[PureUnitName]), '', -1);
end;
end;

View File

@ -68,7 +68,7 @@ type
fFuncReplaceMode: TReplaceModeShort;
fCoordOffsMode: TReplaceModeShort;
// Unit names to leave out of a project. Currently not user editable.
fOmitProjUnits: TStringList;
fOmitProjUnits: TStringToStringTree;
// Delphi units mapped to Lazarus units, will be replaced or removed.
fReplaceUnits: TStringToStringTree;
// Delphi types mapped to Lazarus types, will be replaced.
@ -116,7 +116,7 @@ type
property TypeReplaceMode: TReplaceModeAllow read fTypeReplaceMode;
property FuncReplaceMode: TReplaceModeShort read fFuncReplaceMode;
property CoordOffsMode: TReplaceModeShort read fCoordOffsMode;
property OmitProjUnits: TStringList read fOmitProjUnits;
property OmitProjUnits: TStringToStringTree read fOmitProjUnits;
property ReplaceUnits: TStringToStringTree read fReplaceUnits;
property ReplaceTypes: TStringToStringTree read fReplaceTypes;
property ReplaceFuncs: TFuncsAndCategories read fReplaceFuncs;
@ -382,7 +382,7 @@ begin
fMainPath:='';
fEnabled:=True;
fSettingsForm:=Nil;
fOmitProjUnits:=TStringList.Create;
fOmitProjUnits:=TStringToStringTree.Create(false);
fReplaceUnits:=TStringToStringTree.Create(false);
fReplaceTypes:=TStringToStringTree.Create(false);
fReplaceFuncs:=TFuncsAndCategories.Create;
@ -404,50 +404,49 @@ begin
LoadFuncReplacements(fConfigStorage, 'FuncReplacements/', 'Categories/', fReplaceFuncs);
LoadVisualOffsets(fConfigStorage, 'VisualOffsets/', fCoordOffsets);
// * Add default values for configuration if ConfigStorage doesn't have them *
// Units left out of project. Some projects include them although there are
// Lazarus packages for them. This setting is not saved in configuration.
with fOmitProjUnits do begin
Add('FastMM4');
Add('FastMM4Messages');
Add('GR32');
Add('GR32_Blend');
Add('GR32_Containers');
Add('GR32_DrawingEx');
Add('GR32_Filters');
Add('GR32_Image');
Add('GR32_Layers');
Add('GR32_LowLevel');
Add('GR32_Math');
Add('GR32_MicroTiles');
Add('GR32_OrdinalMaps');
Add('GR32_RangeBars');
Add('GR32_Rasterizers');
Add('GR32_RepaintOpt');
Add('GR32_Resamplers');
Add('GR32_System');
Add('GR32_Transforms');
Add('GR32_VectorMaps');
Add('OpenGL');
Add('SynEdit');
Add('SynEditMiscProcs');
Add('SynEditTextBuffer');
Add('SynEditTypes');
Add('SynEditHighlighter');
Add('SynEditKbdHandler');
Add('SynEditKeyCmds');
Add('SynEditKeyConst');
Add('SynEditMiscClasses');
Add('SynTextDrawer');
Add('SynHighlighterMulti');
Add('SynRegExpr');
Add('SynEditStrConst');
Add('SynEditWordWrap');
Add('SynHighlighterPas');
CaseSensitive:=False;
Sorted:=True;
end;
// Key = Unit name, Value = Lazarus Package to be added to project as dependency
fOmitProjUnits['FastMM4'] :=''; // FastMM4 is not needed as FPC's
fOmitProjUnits['FastMM4Messages'] :=''; // memory manager does its job well.
fOmitProjUnits['GR32'] :='GR32_Lazarus';
fOmitProjUnits['GR32_Blend'] :='GR32_Lazarus';
fOmitProjUnits['GR32_Containers'] :='GR32_Lazarus';
fOmitProjUnits['GR32_DrawingEx'] :='GR32_Lazarus';
fOmitProjUnits['GR32_Filters'] :='GR32_Lazarus';
fOmitProjUnits['GR32_Image'] :='GR32_Lazarus';
fOmitProjUnits['GR32_Layers'] :='GR32_Lazarus';
fOmitProjUnits['GR32_LowLevel'] :='GR32_Lazarus';
fOmitProjUnits['GR32_Math'] :='GR32_Lazarus';
fOmitProjUnits['GR32_MicroTiles'] :='GR32_Lazarus';
fOmitProjUnits['GR32_OrdinalMaps'] :='GR32_Lazarus';
fOmitProjUnits['GR32_RangeBars'] :='GR32_Lazarus';
fOmitProjUnits['GR32_Rasterizers'] :='GR32_Lazarus';
fOmitProjUnits['GR32_RepaintOpt'] :='GR32_Lazarus';
fOmitProjUnits['GR32_Resamplers'] :='GR32_Lazarus';
fOmitProjUnits['GR32_System'] :='GR32_Lazarus';
fOmitProjUnits['GR32_Transforms'] :='GR32_Lazarus';
fOmitProjUnits['GR32_VectorMaps'] :='GR32_Lazarus';
// OpenGL will be replaced with dglOpenGL in uses section. Download dglOpenGL :
// http://wiki.delphigl.com/index.php/dglOpenGL.pas/en#Download
fOmitProjUnits['OpenGL'] :='';
fOmitProjUnits['SynEdit'] :='SynEdit';
fOmitProjUnits['SynEditMiscProcs'] :='SynEdit';
fOmitProjUnits['SynEditTextBuffer'] :='SynEdit';
fOmitProjUnits['SynEditTypes'] :='SynEdit';
fOmitProjUnits['SynEditHighlighter'] :='SynEdit';
fOmitProjUnits['SynEditKbdHandler'] :='SynEdit';
fOmitProjUnits['SynEditKeyCmds'] :='SynEdit';
fOmitProjUnits['SynEditKeyConst'] :='SynEdit';
fOmitProjUnits['SynEditMiscClasses'] :='SynEdit';
fOmitProjUnits['SynEditStrConst'] :='SynEdit';
fOmitProjUnits['SynEditWordWrap'] :='SynEdit';
fOmitProjUnits['SynHighlighterMulti']:='SynEdit';
fOmitProjUnits['SynHighlighterPas'] :='SynEdit';
fOmitProjUnits['SynTextDrawer'] :='SynEdit';
fOmitProjUnits['SynRegExpr'] :='SynEdit';
// * Add default values for configuration if ConfigStorage doesn't have them *
// Map Delphi units to Lazarus units.
TheMap:=fReplaceUnits;
@ -456,8 +455,8 @@ begin
MapReplacement('WinProcs', 'LCLIntf, LCLType, LMessages');
MapReplacement('Mask', 'MaskEdit');
MapReplacement('TabNotBk', 'ComCtrls');
MapReplacement('OpenGL', 'GL, GLu');
MapReplacement('dglOpenGL', 'GL, GLu, GLut'); // ?
MapReplacement('OpenGL', 'dglOpenGL');
// MapReplacement('dglOpenGL', 'GL, GLu, GLut'); // ?
// Database components
MapReplacement('SqlExpr', 'sqldb');
MapReplacement('DBLocalS', 'sqldb');

View File

@ -211,7 +211,6 @@ var
OldUnitName, OldInFilename: String;
NewUnitName, NewInFilename: String;
AFilename, s, LowNU: String;
x: Integer;
OmitUnit: Boolean;
begin
UsesNode:=UsesSectionNode;
@ -236,7 +235,7 @@ begin
if NewInFilename<>'' then
s:=s+' in '''+NewInFilename+'''';
if AFilename<>'' then begin // unit found
OmitUnit := Settings.OmitProjUnits.Find(NewUnitName,x);
OmitUnit := Settings.OmitProjUnits.Contains(NewUnitName);
if (NewUnitName<>OldUnitName) and not OmitUnit then begin
// Character case differs, fix it.
fUnitsToFixCase[OldUnitName]:=NewUnitName;
@ -443,10 +442,10 @@ procedure TUsedUnits.OmitUnits;
// Remove globally omitted units from MissingUnits.
// Those units were added to MissingUnits to find possible replacements.
var
i, x: Integer;
i: Integer;
begin
for i:=fMissingUnits.Count-1 downto 0 do
if fCTLink.Settings.OmitProjUnits.Find(fMissingUnits[i], x) then
if fCTLink.Settings.OmitProjUnits.Contains(fMissingUnits[i]) then
fMissingUnits.Delete(i);
end;

View File

@ -5360,7 +5360,8 @@ resourcestring
lisConvDelphiKeepBoth = 'Keep both';
lisConvDelphiPackageNameExists = 'Package name exists';
lisConvDelphiProjOmittedUnit = 'Omitted unit %s from project';
lisConvDelphiAddedPackageRequirement = 'Added Package %s as a requirement.';
lisConvDelphiAddedPackageDependency = 'Added Package %s as a dependency.';
lisConvDelphiPackageRequired = 'Package %s is required but not installed in Lazarus! Install it later.';
lisConvDelphiThereIsAlreadyAPackageWithTheNamePleaseCloseThisPa = 'There is '
+'already a package with the name "%s"%sPlease close this package first.';
lisConvDelphiDelphiPackageMainSourceDpkFileNotFoundForPackage = 'Delphi '