mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-29 14:39:20 +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
|
// analyze
|
||||||
UseAnalyzer.AnalyzeModule(FPasModule);
|
UseAnalyzer.AnalyzeModule(FPasModule);
|
||||||
|
{$IFDEF VerboseUnitQueue}
|
||||||
|
writeln('TPas2jsCompilerFile.ParserFinished ScopeModule=',GetObjName(UseAnalyzer.ScopeModule));
|
||||||
|
{$ENDIF}
|
||||||
except
|
except
|
||||||
on E: ECompilerTerminate do
|
on E: ECompilerTerminate do
|
||||||
raise;
|
raise;
|
||||||
@ -1025,12 +1028,18 @@ begin
|
|||||||
if FPasModule<>nil then
|
if FPasModule<>nil then
|
||||||
Compiler.RaiseInternalError(20180305190321,PasFilename);
|
Compiler.RaiseInternalError(20180305190321,PasFilename);
|
||||||
try
|
try
|
||||||
|
{$IFDEF VerboseUnitQueue}
|
||||||
|
writeln('TPas2jsCompilerFile.ParsePascal ',PasFilename);
|
||||||
|
{$ENDIF}
|
||||||
Compiler.AddParsingModule(Self);
|
Compiler.AddParsingModule(Self);
|
||||||
PascalResolver.InterfaceOnly:=IsForeign;
|
PascalResolver.InterfaceOnly:=IsForeign;
|
||||||
if IsMainFile then
|
if IsMainFile then
|
||||||
Parser.ParseMain(FPasModule)
|
Parser.ParseMain(FPasModule)
|
||||||
else
|
else
|
||||||
Parser.ParseSubModule(FPasModule);
|
Parser.ParseSubModule(FPasModule);
|
||||||
|
{$IFDEF VerboseUnitQueue}
|
||||||
|
writeln('ppp2 TPas2jsCompilerFile.ParsePascal ',PasFilename,' Finished=',Parser.CurModule=nil);
|
||||||
|
{$ENDIF}
|
||||||
if Parser.CurModule=nil then
|
if Parser.CurModule=nil then
|
||||||
ParserFinished;
|
ParserFinished;
|
||||||
except
|
except
|
||||||
@ -1050,7 +1059,13 @@ begin
|
|||||||
if FPasModule=nil then
|
if FPasModule=nil then
|
||||||
Compiler.RaiseInternalError(20180305190338,PasFilename);
|
Compiler.RaiseInternalError(20180305190338,PasFilename);
|
||||||
try
|
try
|
||||||
|
{$IFDEF VerboseUnitQueue}
|
||||||
|
writeln('TPas2jsCompilerFile.ParsePascalContinue ',PasFilename);
|
||||||
|
{$ENDIF}
|
||||||
Parser.ParseContinue;
|
Parser.ParseContinue;
|
||||||
|
{$IFDEF VerboseUnitQueue}
|
||||||
|
writeln('TPas2jsCompilerFile.ParsePascalContinue ',PasFilename,' finished=',Parser.CurModule=nil);
|
||||||
|
{$ENDIF}
|
||||||
if Parser.CurModule=nil then
|
if Parser.CurModule=nil then
|
||||||
ParserFinished;
|
ParserFinished;
|
||||||
except
|
except
|
||||||
@ -1575,24 +1590,31 @@ var
|
|||||||
begin
|
begin
|
||||||
// parse til exception or all modules have finished
|
// parse til exception or all modules have finished
|
||||||
repeat
|
repeat
|
||||||
{$IFDEF VerbosePasResolver}
|
{$IF defined(VerbosePasResolver) or defined(VerboseUnitQueue)}
|
||||||
writeln('TPas2jsCompiler.ParseQueue FParsingModules.Count=',FParsingModules.Count);
|
writeln('TPas2jsCompiler.ParseQueue FParsingModules.Count=',FParsingModules.Count);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
Found:=false;
|
Found:=false;
|
||||||
for i:=0 to FParsingModules.Count-1 do
|
for i:=FParsingModules.Count-1 downto 0 do
|
||||||
begin
|
begin
|
||||||
aFile:=TPas2jsCompilerFile(FParsingModules[i]);
|
aFile:=TPas2jsCompilerFile(FParsingModules[i]);
|
||||||
if not aFile.Parser.CanParseContinue(Section) then
|
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;
|
continue;
|
||||||
|
end;
|
||||||
Found:=true;
|
Found:=true;
|
||||||
{$IFDEF VerbosePasResolver}
|
{$IF defined(VerbosePasResolver) or defined(VerboseUnitQueue)}
|
||||||
writeln('TPas2jsCompiler.ParseQueue aFile=',aFile.PasFilename,' Section=',GetObjName(Section));
|
writeln('TPas2jsCompiler.ParseQueue aFile=',aFile.PasFilename,' Section=',GetObjName(Section));
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
aFile.ParsePascalContinue;
|
aFile.ParsePascalContinue;
|
||||||
break;
|
break;
|
||||||
end;
|
end;
|
||||||
until not Found;
|
until not Found;
|
||||||
{$IFDEF VerbosePasResolver}
|
{$IF defined(VerbosePasResolver) or defined(VerboseUnitQueue)}
|
||||||
writeln('TPas2jsCompiler.ParseQueue END FParsingModules.Count=',FParsingModules.Count);
|
writeln('TPas2jsCompiler.ParseQueue END FParsingModules.Count=',FParsingModules.Count);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
@ -1602,7 +1624,7 @@ begin
|
|||||||
aFile:=TPas2jsCompilerFile(FParsingModules[i]);
|
aFile:=TPas2jsCompilerFile(FParsingModules[i]);
|
||||||
if aFile.Parser.CurModule<>nil then
|
if aFile.Parser.CurModule<>nil then
|
||||||
begin
|
begin
|
||||||
{$IFDEF VerbosePasResolver}
|
{$IF defined(VerbosePasResolver) or defined(VerboseUnitQueue)}
|
||||||
writeln('TPas2jsCompiler.ParseQueue aFile=',aFile.PasFilename,' was not finished');
|
writeln('TPas2jsCompiler.ParseQueue aFile=',aFile.PasFilename,' was not finished');
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
RaiseInternalError(20180305185342,aFile.PasFilename);
|
RaiseInternalError(20180305185342,aFile.PasFilename);
|
||||||
@ -1672,7 +1694,6 @@ begin
|
|||||||
else if (aFile.JSFilename<>'')
|
else if (aFile.JSFilename<>'')
|
||||||
and (DirectoryCache.FileAge(aFile.PasFilename)>DirectoryCache.FileAge(aFile.JSFilename))
|
and (DirectoryCache.FileAge(aFile.PasFilename)>DirectoryCache.FileAge(aFile.JSFilename))
|
||||||
then begin
|
then begin
|
||||||
// ToDo: replace FileAge with checksum
|
|
||||||
Mark(nUnitNeedsCompilePasHasChanged,[aFile.GetModuleName,FileCache.FormatPath(aFile.JSFilename)])
|
Mark(nUnitNeedsCompilePasHasChanged,[aFile.GetModuleName,FileCache.FormatPath(aFile.JSFilename)])
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
@ -3088,7 +3088,7 @@ var
|
|||||||
aStream.Write(c,1);
|
aStream.Write(c,1);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure WriteLn;
|
procedure WriteLine;
|
||||||
begin
|
begin
|
||||||
WriteString(sLineBreak);
|
WriteString(sLineBreak);
|
||||||
if CurIndent>0 then
|
if CurIndent>0 then
|
||||||
@ -3120,7 +3120,7 @@ var
|
|||||||
if not Compressed then
|
if not Compressed then
|
||||||
begin
|
begin
|
||||||
Indent;
|
Indent;
|
||||||
WriteLn;
|
WriteLine;
|
||||||
end;
|
end;
|
||||||
for i:=0 to Obj.Count-1 do
|
for i:=0 to Obj.Count-1 do
|
||||||
begin
|
begin
|
||||||
@ -3128,7 +3128,7 @@ var
|
|||||||
begin
|
begin
|
||||||
WriteChar(',');
|
WriteChar(',');
|
||||||
if not Compressed then
|
if not Compressed then
|
||||||
WriteLn;
|
WriteLine;
|
||||||
end;
|
end;
|
||||||
Name:=Obj.Names[i];
|
Name:=Obj.Names[i];
|
||||||
WriteChar('"');
|
WriteChar('"');
|
||||||
@ -3142,7 +3142,7 @@ var
|
|||||||
if not Compressed then
|
if not Compressed then
|
||||||
begin
|
begin
|
||||||
Unindent;
|
Unindent;
|
||||||
WriteLn;
|
WriteLine;
|
||||||
end;
|
end;
|
||||||
WriteChar('}');
|
WriteChar('}');
|
||||||
end;
|
end;
|
||||||
@ -3155,7 +3155,7 @@ var
|
|||||||
if not Compressed then
|
if not Compressed then
|
||||||
begin
|
begin
|
||||||
Indent;
|
Indent;
|
||||||
WriteLn;
|
WriteLine;
|
||||||
end;
|
end;
|
||||||
for i:=0 to Arr.Count-1 do
|
for i:=0 to Arr.Count-1 do
|
||||||
begin
|
begin
|
||||||
@ -3163,14 +3163,14 @@ var
|
|||||||
begin
|
begin
|
||||||
WriteChar(',');
|
WriteChar(',');
|
||||||
if not Compressed then
|
if not Compressed then
|
||||||
WriteLn;
|
WriteLine;
|
||||||
end;
|
end;
|
||||||
WriteData(Arr[i]);
|
WriteData(Arr[i]);
|
||||||
end;
|
end;
|
||||||
if not Compressed then
|
if not Compressed then
|
||||||
begin
|
begin
|
||||||
Unindent;
|
Unindent;
|
||||||
WriteLn;
|
WriteLine;
|
||||||
end;
|
end;
|
||||||
WriteChar(']');
|
WriteChar(']');
|
||||||
end;
|
end;
|
||||||
|
@ -58,7 +58,6 @@ type
|
|||||||
private
|
private
|
||||||
FLog: TPas2jsLogger;
|
FLog: TPas2jsLogger;
|
||||||
FOnCheckSrcName: TOnCheckSrcName;
|
FOnCheckSrcName: TOnCheckSrcName;
|
||||||
FOnContinueParsing: TNotifyEvent;
|
|
||||||
FOnFindModule: TOnFindModule;
|
FOnFindModule: TOnFindModule;
|
||||||
FP2JParser: TPas2jsPasParser;
|
FP2JParser: TPas2jsPasParser;
|
||||||
public
|
public
|
||||||
@ -69,10 +68,9 @@ type
|
|||||||
function FindModule(const aUnitname: String): TPasModule; override;
|
function FindModule(const aUnitname: String): TPasModule; override;
|
||||||
function FindUnit(const AName, InFilename: String; NameExpr,
|
function FindUnit(const AName, InFilename: String; NameExpr,
|
||||||
InFileExpr: TPasExpr): TPasModule; override;
|
InFileExpr: TPasExpr): TPasModule; override;
|
||||||
procedure ContinueParsing; override;
|
procedure UsedInterfacesFinished(Section: TPasSection); override;
|
||||||
public
|
public
|
||||||
Owner: TObject;
|
Owner: TObject;
|
||||||
property OnContinueParsing: TNotifyEvent read FOnContinueParsing write FOnContinueParsing;
|
|
||||||
property OnFindModule: TOnFindModule read FOnFindModule write FOnFindModule;
|
property OnFindModule: TOnFindModule read FOnFindModule write FOnFindModule;
|
||||||
property OnCheckSrcName: TOnCheckSrcName read FOnCheckSrcName write FOnCheckSrcName;
|
property OnCheckSrcName: TOnCheckSrcName read FOnCheckSrcName write FOnCheckSrcName;
|
||||||
property Log: TPas2jsLogger read FLog write FLog;
|
property Log: TPas2jsLogger read FLog write FLog;
|
||||||
@ -174,9 +172,9 @@ begin
|
|||||||
Result:=OnFindModule(AName,InFilename,NameExpr,InFileExpr);
|
Result:=OnFindModule(AName,InFilename,NameExpr,InFileExpr);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TPas2jsCompilerResolver.ContinueParsing;
|
procedure TPas2jsCompilerResolver.UsedInterfacesFinished(Section: TPasSection);
|
||||||
begin
|
begin
|
||||||
OnContinueParsing(Self);
|
if Section=nil then ;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@ -58,6 +58,7 @@ type
|
|||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
function FindUnit(const AName, InFilename: String; NameExpr,
|
function FindUnit(const AName, InFilename: String; NameExpr,
|
||||||
InFileExpr: TPasExpr): TPasModule; override;
|
InFileExpr: TPasExpr): TPasModule; override;
|
||||||
|
procedure UsedInterfacesFinished(Section: TPasSection); override;
|
||||||
property OnFindUnit: TOnFindUnit read FOnFindUnit write FOnFindUnit;
|
property OnFindUnit: TOnFindUnit read FOnFindUnit write FOnFindUnit;
|
||||||
property Filename: string read FFilename write FFilename;
|
property Filename: string read FFilename write FFilename;
|
||||||
property Resolver: TStreamResolver read FResolver write FResolver;
|
property Resolver: TStreamResolver read FResolver write FResolver;
|
||||||
@ -825,6 +826,13 @@ begin
|
|||||||
if NameExpr=nil then ;
|
if NameExpr=nil then ;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestEnginePasResolver.UsedInterfacesFinished(Section: TPasSection);
|
||||||
|
begin
|
||||||
|
// do not parse recursively
|
||||||
|
// parse via the queue
|
||||||
|
if Section=nil then ;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TCustomTestModule }
|
{ TCustomTestModule }
|
||||||
|
|
||||||
function TCustomTestModule.GetResolverCount: integer;
|
function TCustomTestModule.GetResolverCount: integer;
|
||||||
@ -1021,13 +1029,27 @@ begin
|
|||||||
begin
|
begin
|
||||||
CurResolver:=Resolvers[i];
|
CurResolver:=Resolvers[i];
|
||||||
if CurResolver.CurrentParser=nil then continue;
|
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;
|
CurResolver.Parser.ParseContinue;
|
||||||
Found:=true;
|
Found:=true;
|
||||||
break;
|
break;
|
||||||
end;
|
end;
|
||||||
if not Found then break;
|
if not Found then break;
|
||||||
end;
|
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;
|
end;
|
||||||
|
|
||||||
procedure TCustomTestModule.ParseModule;
|
procedure TCustomTestModule.ParseModule;
|
||||||
|
Loading…
Reference in New Issue
Block a user