ソースを参照

pastojs: filer: test restored useanalyzer

git-svn-id: trunk@38386 -
Mattias Gaertner 7 年 前
コミット
dc50511dce
2 ファイル変更63 行追加25 行削除
  1. 1 0
      packages/pastojs/src/pas2jsfiler.pp
  2. 62 25
      packages/pastojs/tests/tcfiler.pas

+ 1 - 0
packages/pastojs/src/pas2jsfiler.pp

@@ -26,6 +26,7 @@ Works:
 - resolving forward references
 - resolving forward references
 - restore resolver scopes
 - restore resolver scopes
 - restore resolved references and access flags
 - restore resolved references and access flags
+- useanalyzer: use restored proc references
 - write+read compiled proc body
 - write+read compiled proc body
 
 
 ToDo:
 ToDo:

+ 62 - 25
packages/pastojs/tests/tcfiler.pas

@@ -38,6 +38,7 @@ type
     FInitialFlags: TPJUInitialFlags;
     FInitialFlags: TPJUInitialFlags;
     FPJUReader: TPJUReader;
     FPJUReader: TPJUReader;
     FPJUWriter: TPJUWriter;
     FPJUWriter: TPJUWriter;
+    FRestAnalyzer: TPasAnalyzer;
     procedure OnFilerGetSrc(Sender: TObject; aFilename: string; out p: PChar;
     procedure OnFilerGetSrc(Sender: TObject; aFilename: string; out p: PChar;
       out Count: integer);
       out Count: integer);
     function OnConverterIsElementUsed(Sender: TObject; El: TPasElement): boolean;
     function OnConverterIsElementUsed(Sender: TObject; El: TPasElement): boolean;
@@ -50,6 +51,7 @@ type
     procedure WriteReadUnit; virtual;
     procedure WriteReadUnit; virtual;
     procedure StartParsing; override;
     procedure StartParsing; override;
     function CheckRestoredObject(const Path: string; Orig, Rest: TObject): boolean; virtual;
     function CheckRestoredObject(const Path: string; Orig, Rest: TObject): boolean; virtual;
+    // check restored parser+resolver
     procedure CheckRestoredResolver(Original, Restored: TPas2JSResolver); virtual;
     procedure CheckRestoredResolver(Original, Restored: TPas2JSResolver); virtual;
     procedure CheckRestoredDeclarations(const Path: string; Orig, Rest: TPasDeclarations); virtual;
     procedure CheckRestoredDeclarations(const Path: string; Orig, Rest: TPasDeclarations); virtual;
     procedure CheckRestoredSection(const Path: string; Orig, Rest: TPasSection); virtual;
     procedure CheckRestoredSection(const Path: string; Orig, Rest: TPasSection); virtual;
@@ -72,6 +74,7 @@ type
     procedure CheckRestoredCustomData(const Path: string; RestoredEl: TPasElement; Orig, Rest: TObject); virtual;
     procedure CheckRestoredCustomData(const Path: string; RestoredEl: TPasElement; Orig, Rest: TObject); virtual;
     procedure CheckRestoredReference(const Path: string; Orig, Rest: TPasElement); virtual;
     procedure CheckRestoredReference(const Path: string; Orig, Rest: TPasElement); virtual;
     procedure CheckRestoredElOrRef(const Path: string; Orig, OrigProp, Rest, RestProp: TPasElement); virtual;
     procedure CheckRestoredElOrRef(const Path: string; Orig, OrigProp, Rest, RestProp: TPasElement); virtual;
+    procedure CheckRestoredAnalyzerElement(const Path: string; Orig, Rest: TPasElement); virtual;
     procedure CheckRestoredElement(const Path: string; Orig, Rest: TPasElement); virtual;
     procedure CheckRestoredElement(const Path: string; Orig, Rest: TPasElement); virtual;
     procedure CheckRestoredElementList(const Path: string; Orig, Rest: TFPList); virtual;
     procedure CheckRestoredElementList(const Path: string; Orig, Rest: TFPList); virtual;
     procedure CheckRestoredElRefList(const Path: string; OrigParent: TPasElement;
     procedure CheckRestoredElRefList(const Path: string; OrigParent: TPasElement;
@@ -112,6 +115,7 @@ type
     procedure CheckRestoredOperator(const Path: string; Orig, Rest: TPasOperator); virtual;
     procedure CheckRestoredOperator(const Path: string; Orig, Rest: TPasOperator); virtual;
   public
   public
     property Analyzer: TPasAnalyzer read FAnalyzer;
     property Analyzer: TPasAnalyzer read FAnalyzer;
+    property RestAnalyzer: TPasAnalyzer read FRestAnalyzer;
     property PJUWriter: TPJUWriter read FPJUWriter write FPJUWriter;
     property PJUWriter: TPJUWriter read FPJUWriter write FPJUWriter;
     property PJUReader: TPJUReader read FPJUReader write FPJUReader;
     property PJUReader: TPJUReader read FPJUReader write FPJUReader;
     property InitialFlags: TPJUInitialFlags read FInitialFlags;
     property InitialFlags: TPJUInitialFlags read FInitialFlags;
@@ -215,20 +219,21 @@ procedure TCustomTestPrecompile.WriteReadUnit;
 var
 var
   ms: TMemoryStream;
   ms: TMemoryStream;
   PJU: string;
   PJU: string;
-  ReadResolver: TTestEnginePasResolver;
-  ReadFileResolver: TFileResolver;
-  ReadScanner: TPascalScanner;
-  ReadParser: TPasParser;
+  // restored classes:
+  RestResolver: TTestEnginePasResolver;
+  RestFileResolver: TFileResolver;
+  RestScanner: TPascalScanner;
+  RestParser: TPasParser;
 begin
 begin
   ConvertUnit;
   ConvertUnit;
 
 
   FPJUWriter:=TPJUWriter.Create;
   FPJUWriter:=TPJUWriter.Create;
   FPJUReader:=TPJUReader.Create;
   FPJUReader:=TPJUReader.Create;
   ms:=TMemoryStream.Create;
   ms:=TMemoryStream.Create;
-  ReadParser:=nil;
-  ReadScanner:=nil;
-  ReadResolver:=nil;
-  ReadFileResolver:=nil;
+  RestParser:=nil;
+  RestScanner:=nil;
+  RestResolver:=nil;
+  RestFileResolver:=nil;
   try
   try
     try
     try
       PJUWriter.OnGetSrc:=@OnFilerGetSrc;
       PJUWriter.OnGetSrc:=@OnFilerGetSrc;
@@ -251,18 +256,18 @@ begin
       writeln(PJU);
       writeln(PJU);
       writeln('TCustomTestPrecompile.WriteReadUnit PJU END-------');
       writeln('TCustomTestPrecompile.WriteReadUnit PJU END-------');
 
 
-      ReadFileResolver:=TFileResolver.Create;
-      ReadScanner:=TPascalScanner.Create(ReadFileResolver);
-      InitScanner(ReadScanner);
-      ReadResolver:=TTestEnginePasResolver.Create;
-      ReadResolver.Filename:=Engine.Filename;
-      ReadResolver.AddObjFPCBuiltInIdentifiers(btAllJSBaseTypes,bfAllJSBaseProcs);
-      //ReadResolver.OnFindUnit:=@OnPasResolverFindUnit;
-      ReadParser:=TPasParser.Create(ReadScanner,ReadFileResolver,ReadResolver);
-      ReadParser.Options:=po_tcmodules;
-      ReadResolver.CurrentParser:=ReadParser;
+      RestFileResolver:=TFileResolver.Create;
+      RestScanner:=TPascalScanner.Create(RestFileResolver);
+      InitScanner(RestScanner);
+      RestResolver:=TTestEnginePasResolver.Create;
+      RestResolver.Filename:=Engine.Filename;
+      RestResolver.AddObjFPCBuiltInIdentifiers(btAllJSBaseTypes,bfAllJSBaseProcs);
+      //RestResolver.OnFindUnit:=@OnPasResolverFindUnit;
+      RestParser:=TPasParser.Create(RestScanner,RestFileResolver,RestResolver);
+      RestParser.Options:=po_tcmodules;
+      RestResolver.CurrentParser:=RestParser;
       ms.Position:=0;
       ms.Position:=0;
-      PJUReader.ReadPJU(ReadResolver,ms);
+      PJUReader.ReadPJU(RestResolver,ms);
     except
     except
       on E: Exception do
       on E: Exception do
       begin
       begin
@@ -273,12 +278,18 @@ begin
       end;
       end;
     end;
     end;
 
 
-    CheckRestoredResolver(Engine,ReadResolver);
+    FRestAnalyzer:=TPasAnalyzer.Create;
+    FRestAnalyzer.Resolver:=RestResolver;
+    RestAnalyzer.AnalyzeModule(RestResolver.RootElement);
+    CheckRestoredResolver(Engine,RestResolver);
+
+    // ToDo: compare converter
   finally
   finally
-    ReadParser.Free;
-    ReadScanner.Free;
-    ReadResolver.Free; // free parser before resolver
-    ReadFileResolver.Free;
+    FreeAndNil(FRestAnalyzer);
+    RestParser.Free;
+    RestScanner.Free;
+    RestResolver.Free; // free parser before resolver
+    RestFileResolver.Free;
     ms.Free;
     ms.Free;
   end;
   end;
 end;
 end;
@@ -746,6 +757,29 @@ begin
     CheckRestoredElement(Path,OrigProp,RestProp);
     CheckRestoredElement(Path,OrigProp,RestProp);
 end;
 end;
 
 
+procedure TCustomTestPrecompile.CheckRestoredAnalyzerElement(
+  const Path: string; Orig, Rest: TPasElement);
+var
+  OrigUsed, RestUsed: TPAElement;
+begin
+  //writeln('TCustomTestPrecompile.CheckRestoredAnalyzerElement ',GetObjName(RestAnalyzer));
+  if RestAnalyzer=nil then exit;
+  OrigUsed:=Analyzer.FindUsedElement(Orig);
+  //writeln('TCustomTestPrecompile.CheckRestoredAnalyzerElement ',GetObjName(Orig),'=',OrigUsed<>nil,' ',GetObjName(Rest),'=',RestAnalyzer.FindUsedElement(Rest)<>nil);
+  if OrigUsed<>nil then
+    begin
+    RestUsed:=RestAnalyzer.FindUsedElement(Rest);
+    if RestUsed=nil then
+      Fail(Path+': used in OrigAnalyzer, but not used in RestAnalyzer');
+    if OrigUsed.Access<>RestUsed.Access then
+      AssertEquals(Path+'->Analyzer.Access',dbgs(OrigUsed.Access),dbgs(RestUsed.Access));
+    end
+  else if RestAnalyzer.IsUsed(Rest) then
+    begin
+    Fail(Path+': not used in OrigAnalyzer, but used in RestAnalyzer');
+    end;
+end;
+
 procedure TCustomTestPrecompile.CheckRestoredElement(const Path: string; Orig,
 procedure TCustomTestPrecompile.CheckRestoredElement(const Path: string; Orig,
   Rest: TPasElement);
   Rest: TPasElement);
 var
 var
@@ -864,6 +898,8 @@ begin
     CheckRestoredSection(Path,TPasSection(Orig),TPasSection(Rest))
     CheckRestoredSection(Path,TPasSection(Orig),TPasSection(Rest))
   else
   else
     Fail(Path+': unknown class '+C.ClassName);
     Fail(Path+': unknown class '+C.ClassName);
+
+  CheckRestoredAnalyzerElement(Path,Orig,Rest);
 end;
 end;
 
 
 procedure TCustomTestPrecompile.CheckRestoredElementList(const Path: string;
 procedure TCustomTestPrecompile.CheckRestoredElementList(const Path: string;
@@ -1388,10 +1424,11 @@ begin
   '  function Abs(d: double): double; external name ''Math.Abs'';',
   '  function Abs(d: double): double; external name ''Math.Abs'';',
   '  function GetIt(d: double): double;',
   '  function GetIt(d: double): double;',
   'implementation',
   'implementation',
+  'var k: double;',
   'function GetIt(d: double): double;',
   'function GetIt(d: double): double;',
   'var j: double;',
   'var j: double;',
   'begin',
   'begin',
-  '  j:=Abs(d);',
+  '  j:=Abs(d+k);',
   '  Result:=j;',
   '  Result:=j;',
   'end;',
   'end;',
   'procedure NotUsed;',
   'procedure NotUsed;',