IDE: fix invalid localized package names

git-svn-id: trunk@57961 -
This commit is contained in:
mattias 2018-05-18 21:34:39 +00:00
parent 7ea1e8cd31
commit 967bf6dfd1
5 changed files with 58 additions and 18 deletions

View File

@ -113,6 +113,7 @@ function FindNextIdentifierSkipStrings(const Source: string;
StartPos, MaxPos: integer): integer;
function IsValidIdentPair(const NamePair: string): boolean;
function IsValidIdentPair(const NamePair: string; out First, Second: string): boolean;
function ExtractPasIdentifier(const Ident: string; AllowDots: Boolean): string;
// line/code ends
function SrcPosToLineCol(const s: string; Position: integer;
@ -4818,6 +4819,38 @@ begin
until false;
end;
function ExtractPasIdentifier(const Ident: string; AllowDots: Boolean): string;
var
p: Integer;
begin
p:=1;
Result:=Ident;
while p<=length(Result) do begin
if Result[p] in ['a'..'z','A'..'Z','_'] then begin
inc(p);
while p<=length(Result) do begin
case Result[p] of
'a'..'z','A'..'Z','_','0'..'9': inc(p);
'.':
if AllowDots then
break
else
Delete(Result,p,1);
else
Delete(Result,p,1);
end;
end;
if p>length(Result) then exit;
// p is now on the '.'
inc(p);
end else
Delete(Result,p,1);
end;
p:=length(Result);
if (p>0) and (Result[p]='.') then
Delete(Result,p,1);
end;
function GetLineIndentWithTabs(const Source: string; Position: integer;
TabWidth: integer): integer;
var p: integer;

View File

@ -101,9 +101,9 @@ type
property Removed: boolean read FRemoved write FRemoved;
end;
function IsValidUnitName(AUnitName: String): Boolean; inline;
function IsValidPkgName(APkgName: String): Boolean; inline;
function PackageFileNameIsValid(const AFilename: string): boolean;
function IsValidUnitName(AUnitName: String): Boolean; inline;
function IsValidPkgName(APkgName: String): Boolean; inline;
function PackageFileNameIsValid(const AFilename: string): boolean;
implementation

View File

@ -377,6 +377,7 @@ type
function DoOpenPkgFile(PkgFile: TPkgFile): TModalResult;
function ShowAddDialog(var DlgPage: TAddToPkgType): TModalResult;
function ShowAddDepDialog: TModalResult;
function PkgNameToFormName(const PkgName: string): string;
public
// IFilesEditorInterface
function FilesEditTreeView: TTreeView;
@ -1879,8 +1880,7 @@ procedure TPackageEditorForm.SetLazPackage(const AValue: TLazPackage);
begin
//force editor name change when package name changed!
if (FLazPackage=Nil)
and ( (AValue=Nil) or (Name=PackageEditorWindowPrefix
+StringReplace(AValue.Name,'.','_',[rfReplaceAll])) )
and ( (AValue=Nil) or (Name=PkgNameToFormName(AValue.Name)) )
then
exit;
if FLazPackage<>nil then
@ -2077,7 +2077,7 @@ procedure TPackageEditorForm.UpdateAll(Immediately: boolean);
begin
if csDestroying in ComponentState then exit;
if LazPackage=nil then exit;
Name:=PackageEditorWindowPrefix + StringReplace(LazPackage.Name,'.','_',[rfReplaceAll]);
Name:=PkgNameToFormName(LazPackage.Name);
if fForcedFlags<>[] then
fFlags:=fFlags+fForcedFlags // Flags forcing a partial update
else
@ -2292,6 +2292,11 @@ begin
end;
end;
function TPackageEditorForm.PkgNameToFormName(const PkgName: string): string;
begin
Result:=PackageEditorWindowPrefix+StringReplace(PkgName,'.','_',[rfReplaceAll]);
end;
procedure TPackageEditorForm.BeginUpdate;
begin
inc(fUpdateLock);

View File

@ -265,7 +265,7 @@ type
public
// searching
function CheckIfPackageCanBeClosed(APackage: TLazPackage): boolean;
function CreateUniquePkgName(const Prefix: string;
function CreateUniquePkgName(Prefix: string;
IgnorePackage: TLazPackage): string;
function CreateUniqueUnitName(const Prefix: string): string;
function DependencyExists(Dependency: TPkgDependency;
@ -1778,11 +1778,13 @@ begin
Result:=false;
end;
function TLazPackageGraph.CreateUniquePkgName(const Prefix: string;
function TLazPackageGraph.CreateUniquePkgName(Prefix: string;
IgnorePackage: TLazPackage): string;
var
i: Integer;
begin
if not IsValidPkgName(Prefix) then
RaiseException('invalid pkg name "'+Prefix+'"');
// try Prefix alone
if not PackageNameExists(Prefix,IgnorePackage) then begin
Result:=Prefix;

View File

@ -61,15 +61,15 @@ uses
IDEMsgIntf, SrcEditorIntf, ComponentReg, PropEdits, IDEDialogs, UnitResources,
// IDE
PkgRegisterBase, IDECmdLine, LazarusIDEStrConsts, IDEProcs, ObjectLists,
DialogProcs, IDECommands, IDEOptionDefs, EnvironmentOpts, MiscOptions,
InputHistory, Project, PackageEditor, AddToPackageDlg,
DialogProcs, IDECommands, IDEOptionDefs, EnvironmentOpts,
MiscOptions, InputHistory, Project, PackageEditor, AddToPackageDlg,
PackageDefs, PackageLinks, PackageSystem, OpenInstalledPkgDlg,
PkgGraphExplorer, BrokenDependenciesDlg, CompilerOptions,
IDETranslations, TransferMacros, BuildLazDialog, NewDialog, FindInFilesDlg,
ProjectInspector, SourceEditor, ProjPackChecks, AddFileToAPackageDlg,
LazarusPackageIntf, PublishProjectDlg, PkgLinksDlg,
InterPkgConflictFiles, InstallPkgSetDlg, ConfirmPkgListDlg, NewPkgComponentDlg,
BaseBuildManager, BasePkgManager, MainBar, MainIntf, MainBase, ModeMatrixOpts;
PkgGraphExplorer, BrokenDependenciesDlg, CompilerOptions, IDETranslations,
TransferMacros, BuildLazDialog, NewDialog, FindInFilesDlg, ProjectInspector,
SourceEditor, ProjPackChecks, AddFileToAPackageDlg, LazarusPackageIntf,
PublishProjectDlg, PkgLinksDlg, InterPkgConflictFiles, InstallPkgSetDlg,
ConfirmPkgListDlg, NewPkgComponentDlg, BaseBuildManager, BasePkgManager,
MainBar, MainIntf, MainBase, ModeMatrixOpts;
type
{ TPkgManager }
@ -3509,7 +3509,7 @@ var
begin
Result:=mrCancel;
// create a new package with standard dependencies
NewPackage:=PackageGraph.CreateNewPackage(lisPkgMangNewPackage);
NewPackage:=PackageGraph.CreateNewPackage(ExtractPasIdentifier(lisPkgMangNewPackage,true));
PackageGraph.AddDependencyToPackage(NewPackage,
PackageGraph.FCLPackage.CreateDependencyWithOwner(NewPackage));
NewPackage.Modified:=false;
@ -5229,7 +5229,7 @@ begin
if APackage=nil then begin
// create new package
// create a new package with standard dependencies
APackage:=PackageGraph.CreateNewPackage(lisPkgMangNewPackage);
APackage:=PackageGraph.CreateNewPackage(ExtractPasIdentifier(lisPkgMangNewPackage,true));
PackageGraph.AddDependencyToPackage(APackage,
PackageGraph.IDEIntfPackage.CreateDependencyWithOwner(APackage));
APackage.Modified:=false;