pastojs: parse units queued in reverse order

git-svn-id: trunk@38435 -
This commit is contained in:
Mattias Gaertner 2018-03-06 14:09:37 +00:00
parent d316d54dc9
commit e71060c133
4 changed files with 60 additions and 19 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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.

View File

@ -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;