Skip to content
  • Simon Peyton Jones's avatar
    Refactor (again) the treatment of record-selector bindings · ac11b1f1
    Simon Peyton Jones authored
    We were generating them from the tcg_tcs field of the TcGblEnv,
    but that goes badly wrong when there are top-level Template
    Haskell splices, because the tcg_tcs field grows successively.
    If we generate record-selector binds for all the TyCons in the
    accumulated list, we generate them multiple times for TyCons
    earlier in the program.  This what was happening in Trac #5665:
      data T = T { x :: Int }
      $(f 4)  -- Top level splice
      ..more code..
    Here the record selector bindings for T were being generated
    twice.
    
    Better instead to generate the record-selector bindings in
    TcTyClsDecls, right where the new TyCons are being declared (as indeed
    they were some time ago).  This pushed me into doing some refactoring:
    instead of returning the record bindings, tcTyAndClassDecls adds them
    to the tcg_binds field of the TcGblEnv.  I think the result is a bit
    nicer, and it has the additional merit of working.
    ac11b1f1