mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-17 18:09:15 +02:00
pas2js: search no namespace, cmd line namespaces, default prg namespace, issue #37206
git-svn-id: trunk@45650 -
This commit is contained in:
parent
0feb495ab8
commit
8b84d925fb
@ -5185,10 +5185,11 @@ var
|
|||||||
FoundPasIsForeign: Boolean;
|
FoundPasIsForeign: Boolean;
|
||||||
FoundPCUFilename, FoundPCUUnitName: string;
|
FoundPCUFilename, FoundPCUUnitName: string;
|
||||||
|
|
||||||
procedure TryUnitName(const TestUnitName: string);
|
function TryUnitName(const TestUnitName: string): boolean;
|
||||||
var
|
var
|
||||||
aFile: TPas2jsCompilerFile;
|
aFile: TPas2jsCompilerFile;
|
||||||
begin
|
begin
|
||||||
|
writeln('AAA1 TryUnitName ',TestUnitName);
|
||||||
if FoundPasFilename='' then
|
if FoundPasFilename='' then
|
||||||
begin
|
begin
|
||||||
// search loaded units
|
// search loaded units
|
||||||
@ -5220,6 +5221,9 @@ var
|
|||||||
if FoundPCUFilename<>'' then
|
if FoundPCUFilename<>'' then
|
||||||
FoundPCUUnitName:=TestUnitName;
|
FoundPCUUnitName:=TestUnitName;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Result:=(FoundPasFilename<>'')
|
||||||
|
and (not Assigned(PCUSupport) or (FoundPCUFilename<>''));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
@ -5227,7 +5231,7 @@ var
|
|||||||
i: Integer;
|
i: Integer;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
//writeln('TPas2jsCompiler.GetUnitInfo ',UseUnitName,' in=',InFileName,' ',GetObjName(PCUSupport));
|
writeln('TPas2jsCompiler.GetUnitInfo ',UseUnitName,' in=',InFileName,' ',GetObjName(PCUSupport));
|
||||||
Result:=Default(TFindUnitInfo);
|
Result:=Default(TFindUnitInfo);
|
||||||
FoundPasFilename:='';
|
FoundPasFilename:='';
|
||||||
FoundPasIsForeign:=false;
|
FoundPasIsForeign:=false;
|
||||||
@ -5239,32 +5243,34 @@ begin
|
|||||||
begin
|
begin
|
||||||
CheckUnitAlias(UseUnitName);
|
CheckUnitAlias(UseUnitName);
|
||||||
|
|
||||||
if Pos('.',UseUnitname)<1 then
|
// first search with name as written in module
|
||||||
|
if not TryUnitName(UseUnitname) then
|
||||||
begin
|
begin
|
||||||
// generic unit name -> search with namespaces
|
if Pos('.',UseUnitname)<1 then
|
||||||
// first the default program namespace
|
|
||||||
DefNameSpace:=GetDefaultNamespace;
|
|
||||||
if DefNameSpace<>'' then
|
|
||||||
TryUnitName(DefNameSpace+'.'+UseUnitname);
|
|
||||||
|
|
||||||
if (FoundPasFilename='') or (FoundPCUFilename='') then
|
|
||||||
begin
|
begin
|
||||||
// then the cmdline namespaces
|
// generic unit name -> search with namespaces
|
||||||
|
// first the cmdline namespaces
|
||||||
for i:=0 to Namespaces.Count-1 do
|
for i:=0 to Namespaces.Count-1 do
|
||||||
begin
|
begin
|
||||||
aNameSpace:=Namespaces[i];
|
aNameSpace:=Namespaces[i];
|
||||||
if aNameSpace='' then continue;
|
if aNameSpace='' then continue;
|
||||||
if SameText(aNameSpace,DefNameSpace) then continue;
|
if TryUnitName(aNameSpace+'.'+UseUnitname) then break;
|
||||||
TryUnitName(aNameSpace+'.'+UseUnitname);
|
end;
|
||||||
|
|
||||||
|
if (FoundPasFilename='') or (FoundPCUFilename='') then
|
||||||
|
begin
|
||||||
|
// then the default program namespace
|
||||||
|
DefNameSpace:=GetDefaultNamespace;
|
||||||
|
if DefNameSpace<>'' then
|
||||||
|
begin
|
||||||
|
i:=Namespaces.Count-1;
|
||||||
|
while (i>=0) and not SameText(Namespaces[i],DefNameSpace) do dec(i);
|
||||||
|
if i<0 then
|
||||||
|
TryUnitName(DefNameSpace+'.'+UseUnitname);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end
|
||||||
|
|
||||||
if (FoundPasFilename='') or (FoundPCUFilename='') then
|
|
||||||
begin
|
|
||||||
// search unitname
|
|
||||||
TryUnitName(UseUnitname);
|
|
||||||
end;
|
|
||||||
end else begin
|
end else begin
|
||||||
// search Pascal file with InFilename
|
// search Pascal file with InFilename
|
||||||
FoundPasFilename:=FS.FindUnitFileName(UseUnitname,InFilename,ModuleDir,FoundPasIsForeign);
|
FoundPasFilename:=FS.FindUnitFileName(UseUnitname,InFilename,ModuleDir,FoundPasIsForeign);
|
||||||
|
@ -154,6 +154,12 @@ type
|
|||||||
|
|
||||||
procedure TestUS_UseUnitTwiceFail;
|
procedure TestUS_UseUnitTwiceFail;
|
||||||
procedure TestUS_UseUnitTwiceViaNameSpace;
|
procedure TestUS_UseUnitTwiceViaNameSpace;
|
||||||
|
|
||||||
|
// namespace
|
||||||
|
Procedure TestDefaultNameSpaceLast;
|
||||||
|
Procedure TestDefaultNameSpaceAfterNameSpace;
|
||||||
|
Procedure TestNoNameSpaceBeforeDefaultNameSpace;
|
||||||
|
Procedure TestNoNameSpaceAndDefaultNameSpace;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LinesToStr(const Lines: array of string): string;
|
function LinesToStr(const Lines: array of string): string;
|
||||||
@ -843,6 +849,88 @@ begin
|
|||||||
Compile(['test1.pas','-FNsub','-Jc']);
|
Compile(['test1.pas','-FNsub','-Jc']);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestCLI_UnitSearch.TestDefaultNameSpaceLast;
|
||||||
|
begin
|
||||||
|
AddUnit('system.pp',[''],['']);
|
||||||
|
AddUnit('Unit2.pas',
|
||||||
|
['var i: longint;'],
|
||||||
|
['']);
|
||||||
|
AddUnit('NS1.Unit2.pas',
|
||||||
|
['var j: longint;'],
|
||||||
|
['']);
|
||||||
|
AddFile('test1.pas',[
|
||||||
|
'uses unIt2;',
|
||||||
|
'var',
|
||||||
|
' k: longint;',
|
||||||
|
'begin',
|
||||||
|
' k:=i;',
|
||||||
|
'end.']);
|
||||||
|
Compile(['test1.pas','','-Jc']);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TTestCLI_UnitSearch.TestDefaultNameSpaceAfterNameSpace;
|
||||||
|
begin
|
||||||
|
AddUnit('system.pp',[''],['']);
|
||||||
|
AddUnit('prg.Unit2.pas',
|
||||||
|
['var j: longint;'],
|
||||||
|
['']);
|
||||||
|
AddUnit('sub.Unit2.pas',
|
||||||
|
['var i: longint;'],
|
||||||
|
['']);
|
||||||
|
AddFile('prg.test1.pas',[
|
||||||
|
'uses unIt2;',
|
||||||
|
'var',
|
||||||
|
' k: longint;',
|
||||||
|
'begin',
|
||||||
|
' k:=i;',
|
||||||
|
'end.']);
|
||||||
|
Compile(['prg.test1.pas','-FNsub','-Jc']);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TTestCLI_UnitSearch.TestNoNameSpaceBeforeDefaultNameSpace;
|
||||||
|
begin
|
||||||
|
AddUnit('system.pp',[''],['']);
|
||||||
|
AddUnit('prg.Unit2.pas',
|
||||||
|
['var j: longint;'],
|
||||||
|
['']);
|
||||||
|
AddUnit('Unit2.pas',
|
||||||
|
['var i: longint;'],
|
||||||
|
['']);
|
||||||
|
AddFile('prg.test1.pas',[
|
||||||
|
'uses unIt2;',
|
||||||
|
'var',
|
||||||
|
' k: longint;',
|
||||||
|
'begin',
|
||||||
|
' k:=i;',
|
||||||
|
'end.']);
|
||||||
|
Compile(['prg.test1.pas','','-Jc']);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TTestCLI_UnitSearch.TestNoNameSpaceAndDefaultNameSpace;
|
||||||
|
begin
|
||||||
|
AddUnit('system.pp',[''],['']);
|
||||||
|
AddUnit('UnitA.pas',
|
||||||
|
['type TBool = boolean;'],
|
||||||
|
['']);
|
||||||
|
AddUnit('ThirdParty.UnitB.pas',
|
||||||
|
['uses UnitA;',
|
||||||
|
'type TAlias = TBool;'],
|
||||||
|
['']);
|
||||||
|
AddUnit('MyProject.UnitA.pas',
|
||||||
|
[
|
||||||
|
'uses ThirdParty.UnitB;',
|
||||||
|
'var a: TAlias;'],
|
||||||
|
['']);
|
||||||
|
AddFile('MyProject.Main.pas',[
|
||||||
|
'uses MyProject.UnitA;',
|
||||||
|
'var',
|
||||||
|
' b: boolean;',
|
||||||
|
'begin',
|
||||||
|
' b:=a;',
|
||||||
|
'end.']);
|
||||||
|
Compile(['MyProject.Main.pas','','-Jc']);
|
||||||
|
end;
|
||||||
|
|
||||||
Initialization
|
Initialization
|
||||||
RegisterTests([TTestCLI_UnitSearch]);
|
RegisterTests([TTestCLI_UnitSearch]);
|
||||||
end.
|
end.
|
||||||
|
Loading…
Reference in New Issue
Block a user