How to make typer.TypeExpr to not throw
От: Liviu1  
Дата: 06.09.11 08:52
Оценка:
USING LATEST FROM GITHUB 201109

Sorry, on this site I will be answer only in Russiat.

  macro Macro2(expr : PExpr)
  syntax ("macro2", expr)
  {
    Macro2Impl.DoTransform(Macros.ImplicitCTX(), expr )
  }
  
  module Macro2Impl
  {
      
    public DoTransform(typer : Typer, expr : PExpr ) : PExpr
    {
         def tt = typer.TypeExpr(<[XXX]>);  <-- COMPILER ERROR: unbound name 'XXX'
         <[]>
    }

Да. И это корректное поведение.

if I Wrap everything in try except i get internal compiler error:
        try
        {
         def tt = typer.TypeExpr(<[XXX]>);
         }
         catch
         {
             _ => ();
         }
          <[]>

Это нельзя делать.

Чтобы сделать спекулятивную типизацию (которая не будет влиять на результат компиляции) можно воспользоваться следующим паттерном:
typer.Solver.PushState();
try
{
  def localErrorsCount = typer.Solver.CurrentMessenger.LocalErrorCount;
  def res = typer.TypeExpr(<[ XXX ]>);
  when (localErrorsCount != typer.Solver.CurrentMessenger.LocalErrorCount)
    Message.Hint($"$res ($(res.GetType()))");
}
finally typer.Solver.PopState();

Так же можно воспользоваться методом JustTry:
_ = typer.JustTry(
  fun()
  {
    def localErrorsCount = typer.Solver.CurrentMessenger.LocalErrorCount;
    def res = typer.TypeExpr(<[ XXX ]>);
    when (localErrorsCount != typer.Solver.CurrentMessenger.LocalErrorCount)
      Message.Hint($"$res ($(res.GetType()))"); // do something if success
  });
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.