RomanYankovsky / DelphiAST

Abstract syntax tree builder for Delphi
Mozilla Public License 2.0
271 stars 116 forks source link

Libraries, programs, and packages should also be parsed. #251

Open JBontes opened 6 years ago

JBontes commented 6 years ago

The fix:

function TPasSyntaxTreeBuilder.Run(SourceStream: TStream): TSyntaxNode;
begin
  Result:= nil;
  try
    FStack.Clear;
    try
      self.OnMessage := ParserMessage;
      inherited Run('', SourceStream);
    finally
      Result:= FStack.Peek;
      FStack.Pop;
    end;
  except
    on E: EParserException do
      raise ESyntaxTreeException.Create(E.Line, E.Col, Lexer.FileName, E.Message, Result);
    on E: ESyntaxError do
      raise ESyntaxTreeException.Create(E.PosXY.X, E.PosXY.Y, Lexer.FileName, E.Message, Result);
    else
      FreeAndNil(Result);
      raise;
  end;

  Assert(FStack.Count = 0);
end;

procedure TPasSyntaxTreeBuilder.LibraryFile;
begin
  //Assert(FStack.Peek.ParentNode = nil);
  FStack.Push(TSyntaxNode.Create(ntLibary));
  AssignLexerPositionToNode(Lexer, FStack.Peek);
  inherited;
  //Stack.pop is done in `Run`
end;

procedure TPasSyntaxTreeBuilder.ProgramFile;
begin
  //Assert(FStack.Peek.ParentNode = nil);
  FStack.Push(TSyntaxNode.Create(ntProgram));
  AssignLexerPositionToNode(Lexer, FStack.Peek);
  inherited;
  //Stack.pop is done in `Run`
end;

procedure TPasSyntaxTreeBuilder.PackageFile;
begin
  //Assert(FStack.Peek.ParentNode = nil);
  FStack.Push(TSyntaxNode.Create(ntPackage));
  AssignLexerPositionToNode(Lexer, FStack.Peek);
  inherited;
  //Stack.pop is done in `Run`
end;

procedure TPasSyntaxTreeBuilder.UnitFile;
begin
  //Assert(FStack.Peek.ParentNode = nil);
  FStack.Push(TSyntaxNode.Create(ntUnit));
  AssignLexerPositionToNode(Lexer, FStack.Peek);
  inherited;
  //Stack.pop is done in `Run`
end;