mirror of
https://gitlab.com/freepascal.org/fpc/pas2js.git
synced 2025-08-16 16:59:01 +02:00
fcl-passrc: check used unit reference for duplicate, in case unit is found via different names
This commit is contained in:
parent
5cc1eaf8a1
commit
0fd5a961a3
@ -3656,7 +3656,7 @@ function TPasParser.AddUseUnit(ASection: TPasSection;
|
|||||||
const NamePos: TPasSourcePos; AUnitName: string; NameExpr: TPasExpr;
|
const NamePos: TPasSourcePos; AUnitName: string; NameExpr: TPasExpr;
|
||||||
InFileExpr: TPrimitiveExpr): TPasUsesUnit;
|
InFileExpr: TPrimitiveExpr): TPasUsesUnit;
|
||||||
|
|
||||||
procedure CheckDuplicateInUsesList(AUnitName : string; UsesClause: TPasUsesClause);
|
procedure CheckDuplicateInUsesList(UsesClause: TPasUsesClause);
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
@ -3666,6 +3666,16 @@ function TPasParser.AddUseUnit(ASection: TPasSection;
|
|||||||
ParseExc(nParserDuplicateIdentifier,SParserDuplicateIdentifier,[AUnitName]);
|
ParseExc(nParserDuplicateIdentifier,SParserDuplicateIdentifier,[AUnitName]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure CheckDuplicateInUsesList(UnitRef: TPasElement; UsesClause: TPasUsesClause);
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
if UsesClause=nil then exit;
|
||||||
|
for i:=0 to length(UsesClause)-1 do
|
||||||
|
if UsesClause[i].Module=UnitRef then
|
||||||
|
ParseExc(nParserDuplicateIdentifier,SParserDuplicateIdentifier,[AUnitName]);
|
||||||
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
UnitRef: TPasElement;
|
UnitRef: TPasElement;
|
||||||
UsesUnit: TPasUsesUnit;
|
UsesUnit: TPasUsesUnit;
|
||||||
@ -3683,16 +3693,23 @@ begin
|
|||||||
exit; // for compatibility ignore implicit use of system in system
|
exit; // for compatibility ignore implicit use of system in system
|
||||||
ParseExc(nParserDuplicateIdentifier,SParserDuplicateIdentifier,[AUnitName]);
|
ParseExc(nParserDuplicateIdentifier,SParserDuplicateIdentifier,[AUnitName]);
|
||||||
end;
|
end;
|
||||||
CheckDuplicateInUsesList(AUnitName,ASection.UsesClause);
|
|
||||||
if ASection.ClassType=TImplementationSection then
|
|
||||||
CheckDuplicateInUsesList(AUnitName,CurModule.InterfaceSection.UsesClause);
|
|
||||||
|
|
||||||
UnitRef := Engine.FindModule(AUnitName,NameExpr,InFileExpr);
|
UnitRef := Engine.FindModule(AUnitName,NameExpr,InFileExpr);
|
||||||
if Assigned(UnitRef) then
|
if Assigned(UnitRef) then
|
||||||
UnitRef.AddRef{$IFDEF CheckPasTreeRefCount}('TPasUsesUnit.Module'){$ENDIF}
|
begin
|
||||||
|
UnitRef.AddRef{$IFDEF CheckPasTreeRefCount}('TPasUsesUnit.Module'){$ENDIF};
|
||||||
|
CheckDuplicateInUsesList(UnitRef,ASection.UsesClause);
|
||||||
|
if ASection.ClassType=TImplementationSection then
|
||||||
|
CheckDuplicateInUsesList(UnitRef,CurModule.InterfaceSection.UsesClause);
|
||||||
|
end
|
||||||
else
|
else
|
||||||
|
begin
|
||||||
|
CheckDuplicateInUsesList(ASection.UsesClause);
|
||||||
|
if ASection.ClassType=TImplementationSection then
|
||||||
|
CheckDuplicateInUsesList(CurModule.InterfaceSection.UsesClause);
|
||||||
UnitRef := TPasUnresolvedUnitRef(CreateElement(TPasUnresolvedUnitRef,
|
UnitRef := TPasUnresolvedUnitRef(CreateElement(TPasUnresolvedUnitRef,
|
||||||
AUnitName, ASection, NamePos));
|
AUnitName, ASection, NamePos));
|
||||||
|
end;
|
||||||
|
|
||||||
UsesUnit:=TPasUsesUnit(CreateElement(TPasUsesUnit,AUnitName,ASection,NamePos));
|
UsesUnit:=TPasUsesUnit(CreateElement(TPasUsesUnit,AUnitName,ASection,NamePos));
|
||||||
Result:=ASection.AddUnitToUsesList(AUnitName,NameExpr,InFileExpr,UnitRef,UsesUnit);
|
Result:=ASection.AddUnitToUsesList(AUnitName,NameExpr,InFileExpr,UnitRef,UsesUnit);
|
||||||
|
@ -359,6 +359,7 @@ type
|
|||||||
Procedure TestUnitUseIntf;
|
Procedure TestUnitUseIntf;
|
||||||
Procedure TestUnitUseImplFail;
|
Procedure TestUnitUseImplFail;
|
||||||
Procedure TestUnit_DuplicateUsesFail;
|
Procedure TestUnit_DuplicateUsesFail;
|
||||||
|
Procedure TestUnit_DuplicateUsesIntfImplFail;
|
||||||
Procedure TestUnit_NestedFail;
|
Procedure TestUnit_NestedFail;
|
||||||
Procedure TestUnitUseDotted;
|
Procedure TestUnitUseDotted;
|
||||||
Procedure TestUnit_ProgramDefaultNamespace;
|
Procedure TestUnit_ProgramDefaultNamespace;
|
||||||
@ -5564,6 +5565,28 @@ begin
|
|||||||
nParserDuplicateIdentifier);
|
nParserDuplicateIdentifier);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestResolver.TestUnit_DuplicateUsesIntfImplFail;
|
||||||
|
begin
|
||||||
|
AddModuleWithIntfImplSrc('unit2.pp',
|
||||||
|
LinesToStr([
|
||||||
|
'type number = longint;']),
|
||||||
|
LinesToStr([
|
||||||
|
'']));
|
||||||
|
|
||||||
|
StartUnit(true);
|
||||||
|
Add([
|
||||||
|
'interface',
|
||||||
|
'uses unit2;',
|
||||||
|
'var j: number;',
|
||||||
|
'implementation',
|
||||||
|
'uses unit2;',
|
||||||
|
'initialization',
|
||||||
|
' if number(3) then ;',
|
||||||
|
'']);
|
||||||
|
CheckParserException('Duplicate identifier "unit2" at token ";" in file afile.pp at line 6 column 11',
|
||||||
|
nParserDuplicateIdentifier);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestResolver.TestUnit_NestedFail;
|
procedure TTestResolver.TestUnit_NestedFail;
|
||||||
begin
|
begin
|
||||||
AddModuleWithIntfImplSrc('unit2.pp',
|
AddModuleWithIntfImplSrc('unit2.pp',
|
||||||
|
Loading…
Reference in New Issue
Block a user