Browse Source

fcl-passrc: pasresolver: fixed searching units recursively

git-svn-id: trunk@35709 -
Mattias Gaertner 8 years ago
parent
commit
255870d371
2 changed files with 41 additions and 4 deletions
  1. 17 4
      packages/fcl-passrc/src/pasresolver.pp
  2. 24 0
      packages/fcl-passrc/tests/tcresolver.pas

+ 17 - 4
packages/fcl-passrc/src/pasresolver.pp

@@ -614,6 +614,9 @@ type
     function AddIdentifier(const Identifier: String; El: TPasElement;
     function AddIdentifier(const Identifier: String; El: TPasElement;
       const Kind: TPasIdentifierKind): TPasIdentifier; virtual;
       const Kind: TPasIdentifierKind): TPasIdentifier; virtual;
     function FindElement(const aName: string): TPasElement;
     function FindElement(const aName: string): TPasElement;
+    procedure IterateLocalElements(const aName: string; StartScope: TPasScope;
+      const OnIterateElement: TIterateScopeElement; Data: Pointer;
+      var Abort: boolean);
     procedure IterateElements(const aName: string; StartScope: TPasScope;
     procedure IterateElements(const aName: string; StartScope: TPasScope;
       const OnIterateElement: TIterateScopeElement; Data: Pointer;
       const OnIterateElement: TIterateScopeElement; Data: Pointer;
       var Abort: boolean); override;
       var Abort: boolean); override;
@@ -2171,7 +2174,7 @@ begin
     {$IFDEF VerbosePasResolver}
     {$IFDEF VerbosePasResolver}
     writeln('TPasSectionScope.FindIdentifier "',Identifier,'" in used unit ',GetObjName(UsesScope.Element));
     writeln('TPasSectionScope.FindIdentifier "',Identifier,'" in used unit ',GetObjName(UsesScope.Element));
     {$ENDIF}
     {$ENDIF}
-    Result:=UsesScope.FindIdentifier(Identifier);
+    Result:=UsesScope.FindLocalIdentifier(Identifier);
     if Result<>nil then exit;
     if Result<>nil then exit;
     end;
     end;
 end;
 end;
@@ -2191,7 +2194,7 @@ begin
     {$IFDEF VerbosePasResolver}
     {$IFDEF VerbosePasResolver}
     writeln('TPasSectionScope.IterateElements "',aName,'" in used unit ',GetObjName(UsesScope.Element));
     writeln('TPasSectionScope.IterateElements "',aName,'" in used unit ',GetObjName(UsesScope.Element));
     {$ENDIF}
     {$ENDIF}
-    UsesScope.IterateElements(aName,StartScope,OnIterateElement,Data,Abort);
+    UsesScope.IterateLocalElements(aName,StartScope,OnIterateElement,Data,Abort);
     if Abort then exit;
     if Abort then exit;
     end;
     end;
 end;
 end;
@@ -2463,7 +2466,7 @@ begin
   //writeln('TPasIdentifierScope.FindElement Found="',GetObjName(Result),'"');
   //writeln('TPasIdentifierScope.FindElement Found="',GetObjName(Result),'"');
 end;
 end;
 
 
-procedure TPasIdentifierScope.IterateElements(const aName: string;
+procedure TPasIdentifierScope.IterateLocalElements(const aName: string;
   StartScope: TPasScope; const OnIterateElement: TIterateScopeElement;
   StartScope: TPasScope; const OnIterateElement: TIterateScopeElement;
   Data: Pointer; var Abort: boolean);
   Data: Pointer; var Abort: boolean);
 var
 var
@@ -2475,7 +2478,7 @@ begin
   Item:=FindLocalIdentifier(aName);
   Item:=FindLocalIdentifier(aName);
   while Item<>nil do
   while Item<>nil do
     begin
     begin
-    //writeln('TPasIdentifierScope.IterateElements ',ClassName,' ',Item.Identifier,' ',GetObjName(Item.Element));
+    //writeln('TPasIdentifierScope.IterateLocalElements ',ClassName,' ',Item.Identifier,' ',GetObjName(Item.Element));
     {$IFDEF VerbosePasResolver}
     {$IFDEF VerbosePasResolver}
     OldElement:=Item.Element;
     OldElement:=Item.Element;
     {$ENDIF}
     {$ENDIF}
@@ -2489,6 +2492,13 @@ begin
     end;
     end;
 end;
 end;
 
 
+procedure TPasIdentifierScope.IterateElements(const aName: string;
+  StartScope: TPasScope; const OnIterateElement: TIterateScopeElement;
+  Data: Pointer; var Abort: boolean);
+begin
+  IterateLocalElements(aName,StartScope,OnIterateElement,Data,Abort);
+end;
+
 procedure TPasIdentifierScope.WriteIdentifiers(Prefix: string);
 procedure TPasIdentifierScope.WriteIdentifiers(Prefix: string);
 begin
 begin
   inherited WriteIdentifiers(Prefix);
   inherited WriteIdentifiers(Prefix);
@@ -2954,6 +2964,9 @@ begin
         +El.Name+'->'+GetObjName(PublicEl)+'->'+PublicEl.CustomData.ClassName);
         +El.Name+'->'+GetObjName(PublicEl)+'->'+PublicEl.CustomData.ClassName);
 
 
     UsesScope:=TPasIdentifierScope(PublicEl.CustomData);
     UsesScope:=TPasIdentifierScope(PublicEl.CustomData);
+    {$IFDEF VerbosePasResolver}
+    writeln('TPasResolver.FinishUsesList Add UsesScope=',GetObjName(UsesScope));
+    {$ENDIF}
     Scope.UsesList.Add(UsesScope);
     Scope.UsesList.Add(UsesScope);
     end;
     end;
 end;
 end;

+ 24 - 0
packages/fcl-passrc/tests/tcresolver.pas

@@ -263,6 +263,7 @@ type
     Procedure TestUnitIntfInitalization;
     Procedure TestUnitIntfInitalization;
     Procedure TestUnitUseIntf;
     Procedure TestUnitUseIntf;
     Procedure TestUnitUseImplFail;
     Procedure TestUnitUseImplFail;
+    Procedure TestUnit_NestedFail;
 
 
     // procs
     // procs
     Procedure TestProcParam;
     Procedure TestProcParam;
@@ -3419,6 +3420,29 @@ begin
   CheckResolverException('identifier not found "DoIt"',nIdentifierNotFound);
   CheckResolverException('identifier not found "DoIt"',nIdentifierNotFound);
 end;
 end;
 
 
+procedure TTestResolver.TestUnit_NestedFail;
+begin
+  AddModuleWithIntfImplSrc('unit2.pp',
+    LinesToStr([
+    'var i2: longint;']),
+    LinesToStr([
+    '']));
+
+  AddModuleWithIntfImplSrc('unit1.pp',
+    LinesToStr([
+    'uses unit2;',
+    'var j1: longint;']),
+    LinesToStr([
+    '']));
+
+  StartProgram(true);
+  Add('uses unit1;');
+  Add('begin');
+  Add('  if j1=0 then ;');
+  Add('  if i2=0 then ;');
+  CheckResolverException('identifier not found "i"',nIdentifierNotFound);
+end;
+
 procedure TTestResolver.TestProcParam;
 procedure TTestResolver.TestProcParam;
 begin
 begin
   StartProgram(false);
   StartProgram(false);