Browse Source

pastojs: parse units queued in reverse order

git-svn-id: trunk@38435 -
Mattias Gaertner 7 years ago
parent
commit
e71060c133

+ 27 - 6
packages/pastojs/src/pas2jscompiler.pp

@@ -997,6 +997,9 @@ begin
 
     // analyze
     UseAnalyzer.AnalyzeModule(FPasModule);
+    {$IFDEF VerboseUnitQueue}
+    writeln('TPas2jsCompilerFile.ParserFinished ScopeModule=',GetObjName(UseAnalyzer.ScopeModule));
+    {$ENDIF}
   except
     on E: ECompilerTerminate do
       raise;
@@ -1025,12 +1028,18 @@ begin
   if FPasModule<>nil then
     Compiler.RaiseInternalError(20180305190321,PasFilename);
   try
+    {$IFDEF VerboseUnitQueue}
+    writeln('TPas2jsCompilerFile.ParsePascal ',PasFilename);
+    {$ENDIF}
     Compiler.AddParsingModule(Self);
     PascalResolver.InterfaceOnly:=IsForeign;
     if IsMainFile then
       Parser.ParseMain(FPasModule)
     else
       Parser.ParseSubModule(FPasModule);
+    {$IFDEF VerboseUnitQueue}
+    writeln('ppp2 TPas2jsCompilerFile.ParsePascal ',PasFilename,' Finished=',Parser.CurModule=nil);
+    {$ENDIF}
     if Parser.CurModule=nil then
       ParserFinished;
   except
@@ -1050,7 +1059,13 @@ begin
   if FPasModule=nil then
     Compiler.RaiseInternalError(20180305190338,PasFilename);
   try
+    {$IFDEF VerboseUnitQueue}
+    writeln('TPas2jsCompilerFile.ParsePascalContinue ',PasFilename);
+    {$ENDIF}
     Parser.ParseContinue;
+    {$IFDEF VerboseUnitQueue}
+    writeln('TPas2jsCompilerFile.ParsePascalContinue ',PasFilename,' finished=',Parser.CurModule=nil);
+    {$ENDIF}
     if Parser.CurModule=nil then
       ParserFinished;
   except
@@ -1575,24 +1590,31 @@ var
 begin
   // parse til exception or all modules have finished
   repeat
-    {$IFDEF VerbosePasResolver}
+    {$IF defined(VerbosePasResolver) or defined(VerboseUnitQueue)}
     writeln('TPas2jsCompiler.ParseQueue FParsingModules.Count=',FParsingModules.Count);
     {$ENDIF}
     Found:=false;
-    for i:=0 to FParsingModules.Count-1 do
+    for i:=FParsingModules.Count-1 downto 0 do
       begin
       aFile:=TPas2jsCompilerFile(FParsingModules[i]);
       if not aFile.Parser.CanParseContinue(Section) then
+        begin
+        {$IF defined(VerbosePasResolver) or defined(VerboseUnitQueue)}
+        writeln('TPas2jsCompiler.ParseQueue aFile=',aFile.PasFilename,' NOT YET READY');
+        {$ENDIF}
+        if aFile.Parser.CurModule=nil then
+          RaiseInternalError(20180306111410,'File='+aFile.PasFilename+' Parser.CurModule=nil');
         continue;
+        end;
       Found:=true;
-      {$IFDEF VerbosePasResolver}
+      {$IF defined(VerbosePasResolver) or defined(VerboseUnitQueue)}
       writeln('TPas2jsCompiler.ParseQueue aFile=',aFile.PasFilename,' Section=',GetObjName(Section));
       {$ENDIF}
       aFile.ParsePascalContinue;
       break;
       end;
   until not Found;
-  {$IFDEF VerbosePasResolver}
+  {$IF defined(VerbosePasResolver) or defined(VerboseUnitQueue)}
   writeln('TPas2jsCompiler.ParseQueue END FParsingModules.Count=',FParsingModules.Count);
   {$ENDIF}
 
@@ -1602,7 +1624,7 @@ begin
     aFile:=TPas2jsCompilerFile(FParsingModules[i]);
     if aFile.Parser.CurModule<>nil then
       begin
-      {$IFDEF VerbosePasResolver}
+      {$IF defined(VerbosePasResolver) or defined(VerboseUnitQueue)}
       writeln('TPas2jsCompiler.ParseQueue aFile=',aFile.PasFilename,' was not finished');
       {$ENDIF}
       RaiseInternalError(20180305185342,aFile.PasFilename);
@@ -1672,7 +1694,6 @@ begin
     else if (aFile.JSFilename<>'')
     and (DirectoryCache.FileAge(aFile.PasFilename)>DirectoryCache.FileAge(aFile.JSFilename))
     then begin
-      // ToDo: replace FileAge with checksum
       Mark(nUnitNeedsCompilePasHasChanged,[aFile.GetModuleName,FileCache.FormatPath(aFile.JSFilename)])
     end;
   end;

+ 7 - 7
packages/pastojs/src/pas2jsfiler.pp

@@ -3088,7 +3088,7 @@ var
     aStream.Write(c,1);
   end;
 
-  procedure WriteLn;
+  procedure WriteLine;
   begin
     WriteString(sLineBreak);
     if CurIndent>0 then
@@ -3120,7 +3120,7 @@ var
     if not Compressed then
       begin
       Indent;
-      WriteLn;
+      WriteLine;
       end;
     for i:=0 to Obj.Count-1 do
       begin
@@ -3128,7 +3128,7 @@ var
         begin
         WriteChar(',');
         if not Compressed then
-          WriteLn;
+          WriteLine;
         end;
       Name:=Obj.Names[i];
       WriteChar('"');
@@ -3142,7 +3142,7 @@ var
     if not Compressed then
       begin
       Unindent;
-      WriteLn;
+      WriteLine;
       end;
     WriteChar('}');
   end;
@@ -3155,7 +3155,7 @@ var
     if not Compressed then
       begin
       Indent;
-      WriteLn;
+      WriteLine;
       end;
     for i:=0 to Arr.Count-1 do
       begin
@@ -3163,14 +3163,14 @@ var
         begin
         WriteChar(',');
         if not Compressed then
-          WriteLn;
+          WriteLine;
         end;
       WriteData(Arr[i]);
       end;
     if not Compressed then
       begin
       Unindent;
-      WriteLn;
+      WriteLine;
       end;
     WriteChar(']');
   end;

+ 3 - 5
packages/pastojs/src/pas2jspparser.pp

@@ -58,7 +58,6 @@ type
   private
     FLog: TPas2jsLogger;
     FOnCheckSrcName: TOnCheckSrcName;
-    FOnContinueParsing: TNotifyEvent;
     FOnFindModule: TOnFindModule;
     FP2JParser: TPas2jsPasParser;
   public
@@ -69,10 +68,9 @@ type
     function FindModule(const aUnitname: String): TPasModule; override;
     function FindUnit(const AName, InFilename: String; NameExpr,
       InFileExpr: TPasExpr): TPasModule; override;
-    procedure ContinueParsing; override;
+    procedure UsedInterfacesFinished(Section: TPasSection); override;
   public
     Owner: TObject;
-    property OnContinueParsing: TNotifyEvent read FOnContinueParsing write FOnContinueParsing;
     property OnFindModule: TOnFindModule read FOnFindModule write FOnFindModule;
     property OnCheckSrcName: TOnCheckSrcName read FOnCheckSrcName write FOnCheckSrcName;
     property Log: TPas2jsLogger read FLog write FLog;
@@ -174,9 +172,9 @@ begin
   Result:=OnFindModule(AName,InFilename,NameExpr,InFileExpr);
 end;
 
-procedure TPas2jsCompilerResolver.ContinueParsing;
+procedure TPas2jsCompilerResolver.UsedInterfacesFinished(Section: TPasSection);
 begin
-  OnContinueParsing(Self);
+  if Section=nil then ;
 end;
 
 end.

+ 23 - 1
packages/pastojs/tests/tcmodules.pas

@@ -58,6 +58,7 @@ type
     destructor Destroy; override;
     function FindUnit(const AName, InFilename: String; NameExpr,
       InFileExpr: TPasExpr): TPasModule; override;
+    procedure UsedInterfacesFinished(Section: TPasSection); override;
     property OnFindUnit: TOnFindUnit read FOnFindUnit write FOnFindUnit;
     property Filename: string read FFilename write FFilename;
     property Resolver: TStreamResolver read FResolver write FResolver;
@@ -825,6 +826,13 @@ begin
   if NameExpr=nil then ;
 end;
 
+procedure TTestEnginePasResolver.UsedInterfacesFinished(Section: TPasSection);
+begin
+  // do not parse recursively
+  // parse via the queue
+  if Section=nil then ;
+end;
+
 { TCustomTestModule }
 
 function TCustomTestModule.GetResolverCount: integer;
@@ -1021,13 +1029,27 @@ begin
       begin
       CurResolver:=Resolvers[i];
       if CurResolver.CurrentParser=nil then continue;
-      if not CurResolver.CurrentParser.CanParseContinue(Section) then continue;
+      if not CurResolver.CurrentParser.CanParseContinue(Section) then
+        continue;
       CurResolver.Parser.ParseContinue;
       Found:=true;
       break;
       end;
     if not Found then break;
     end;
+
+  for i:=0 to ResolverCount-1 do
+    begin
+    CurResolver:=Resolvers[i];
+    if CurResolver.Parser=nil then
+      begin
+      if CurResolver.CurrentParser<>nil then
+        Fail('TCustomTestModule.ParseModuleQueue '+CurResolver.Filename+' '+GetObjName(CurResolver.Parser)+'=Parser<>CurrentParser='+GetObjName(CurResolver.CurrentParser));
+      continue;
+      end;
+    if CurResolver.Parser.CurModule<>nil then
+      Fail('TCustomTestModule.ParseModuleQueue '+CurResolver.Filename+' NOT FINISHED CurModule='+GetObjName(CurResolver.Parser.CurModule));
+    end;
 end;
 
 procedure TCustomTestModule.ParseModule;