mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 13:49:29 +02:00
pastojs: parse units queued in reverse order
git-svn-id: trunk@38435 -
This commit is contained in:
parent
d316d54dc9
commit
e71060c133
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user