packages feed

ghcide 0.4.0 → 0.5.0

raw patch · 56 files changed

+2714/−9943 lines, 56 filesdep +Globdep +fingertreedep +hie-compatdep ~ghcdep ~implicit-hie-cradledep ~lsp-testPVP ok

version bump matches the API change (PVP)

Dependencies added: Glob, fingertree, hie-compat

Dependency ranges changed: ghc, implicit-hie-cradle, lsp-test, shake

API changes (from Hackage documentation)

- Development.IDE: GenerateByteCode :: GenerateByteCode
- Development.IDE: GetSpanInfo :: GetSpanInfo
- Development.IDE: [hirModIface] :: HiFileResult -> !ModIface
- Development.IDE: [tmrModInfo] :: TcModuleResult -> HomeModInfo
- Development.IDE: [tmrModule] :: TcModuleResult -> TypecheckedModule
- Development.IDE: data GenerateByteCode
- Development.IDE: data GetSpanInfo
- Development.IDE: runGhcEnv :: HscEnv -> Ghc a -> IO (HscEnv, a)
- Development.IDE: tmr_hiFileResult :: TcModuleResult -> HiFileResult
- Development.IDE.Core.RuleTypes: GenerateByteCode :: GenerateByteCode
- Development.IDE.Core.RuleTypes: GetSpanInfo :: GetSpanInfo
- Development.IDE.Core.RuleTypes: [hirModIface] :: HiFileResult -> !ModIface
- Development.IDE.Core.RuleTypes: [tmrModInfo] :: TcModuleResult -> HomeModInfo
- Development.IDE.Core.RuleTypes: [tmrModule] :: TcModuleResult -> TypecheckedModule
- Development.IDE.Core.RuleTypes: data GenerateByteCode
- Development.IDE.Core.RuleTypes: data GetSpanInfo
- Development.IDE.Core.RuleTypes: instance Control.DeepSeq.NFData Development.IDE.Core.RuleTypes.GenerateByteCode
- Development.IDE.Core.RuleTypes: instance Control.DeepSeq.NFData Development.IDE.Core.RuleTypes.GetSpanInfo
- Development.IDE.Core.RuleTypes: instance Data.Binary.Class.Binary Development.IDE.Core.RuleTypes.GenerateByteCode
- Development.IDE.Core.RuleTypes: instance Data.Binary.Class.Binary Development.IDE.Core.RuleTypes.GetSpanInfo
- Development.IDE.Core.RuleTypes: instance Data.Hashable.Class.Hashable Development.IDE.Core.RuleTypes.GenerateByteCode
- Development.IDE.Core.RuleTypes: instance Data.Hashable.Class.Hashable Development.IDE.Core.RuleTypes.GetSpanInfo
- Development.IDE.Core.RuleTypes: instance GHC.Classes.Eq Development.IDE.Core.RuleTypes.GenerateByteCode
- Development.IDE.Core.RuleTypes: instance GHC.Classes.Eq Development.IDE.Core.RuleTypes.GetSpanInfo
- Development.IDE.Core.RuleTypes: instance GHC.Generics.Generic Development.IDE.Core.RuleTypes.GenerateByteCode
- Development.IDE.Core.RuleTypes: instance GHC.Generics.Generic Development.IDE.Core.RuleTypes.GetSpanInfo
- Development.IDE.Core.RuleTypes: instance GHC.Show.Show Development.IDE.Core.RuleTypes.GenerateByteCode
- Development.IDE.Core.RuleTypes: instance GHC.Show.Show Development.IDE.Core.RuleTypes.GetSpanInfo
- Development.IDE.Core.RuleTypes: tmr_hiFileResult :: TcModuleResult -> HiFileResult
- Development.IDE.Core.Rules: generateCore :: RunSimplifier -> NormalizedFilePath -> Action (IdeResult (SafeHaskellMode, CgGuts, ModDetails))
- Development.IDE.Core.Shake: instance GHC.Generics.Generic (Development.IDE.Core.Shake.Q k)
- Development.IDE.GHC.Compat: AnonWildCard :: Located Name -> HsWildCardInfo
- Development.IDE.GHC.Compat: ClassDec :: DeclType
- Development.IDE.GHC.Compat: ClassTyDecl :: Maybe Span -> ContextInfo
- Development.IDE.GHC.Compat: ConDec :: DeclType
- Development.IDE.GHC.Compat: DataDec :: DeclType
- Development.IDE.GHC.Compat: Decl :: DeclType -> Maybe Span -> ContextInfo
- Development.IDE.GHC.Compat: EAsPat :: XEAsPat p -> Located (IdP p) -> LHsExpr p -> HsExpr p
- Development.IDE.GHC.Compat: ELazyPat :: XELazyPat p -> LHsExpr p -> HsExpr p
- Development.IDE.GHC.Compat: EViewPat :: XEViewPat p -> LHsExpr p -> LHsExpr p -> HsExpr p
- Development.IDE.GHC.Compat: EWildPat :: XEWildPat p -> HsExpr p
- Development.IDE.GHC.Compat: Export :: IEType
- Development.IDE.GHC.Compat: FamDec :: DeclType
- Development.IDE.GHC.Compat: HAppTy :: a -> a -> HieType a
- Development.IDE.GHC.Compat: HCastTy :: a -> HieType a
- Development.IDE.GHC.Compat: HCoercionTy :: HieType a
- Development.IDE.GHC.Compat: HForAllTy :: ((Name, a), ArgFlag) -> a -> HieType a
- Development.IDE.GHC.Compat: HFunTy :: a -> a -> HieType a
- Development.IDE.GHC.Compat: HLitTy :: IfaceTyLit -> HieType a
- Development.IDE.GHC.Compat: HQualTy :: a -> a -> HieType a
- Development.IDE.GHC.Compat: HTS :: !TypeMap TypeIndex -> !IntMap HieTypeFlat -> !TypeIndex -> HieTypeState
- Development.IDE.GHC.Compat: HTyConApp :: IfaceTyCon -> HieArgs a -> HieType a
- Development.IDE.GHC.Compat: HTyVarTy :: Name -> HieType a
- Development.IDE.GHC.Compat: HieASTs :: Map FastString (HieAST a) -> HieASTs a
- Development.IDE.GHC.Compat: HieArgs :: [(Bool, a)] -> HieArgs a
- Development.IDE.GHC.Compat: HsArrApp :: XArrApp p -> LHsExpr p -> LHsExpr p -> HsArrAppType -> Bool -> HsExpr p
- Development.IDE.GHC.Compat: HsArrForm :: XArrForm p -> LHsExpr p -> Maybe Fixity -> [LHsCmdTop p] -> HsExpr p
- Development.IDE.GHC.Compat: HsIBRn :: [Name] -> Bool -> HsIBRn
- Development.IDE.GHC.Compat: HsQTvsRn :: [Name] -> NameSet -> HsQTvsRn
- Development.IDE.GHC.Compat: IEThing :: IEType -> ContextInfo
- Development.IDE.GHC.Compat: IdentifierDetails :: Maybe a -> Set ContextInfo -> IdentifierDetails a
- Development.IDE.GHC.Compat: Import :: IEType
- Development.IDE.GHC.Compat: ImportAs :: IEType
- Development.IDE.GHC.Compat: ImportHiding :: IEType
- Development.IDE.GHC.Compat: InstDec :: DeclType
- Development.IDE.GHC.Compat: InstanceBind :: BindType
- Development.IDE.GHC.Compat: LocalScope :: Span -> Scope
- Development.IDE.GHC.Compat: MatchBind :: ContextInfo
- Development.IDE.GHC.Compat: ModuleScope :: Scope
- Development.IDE.GHC.Compat: NoExt :: NoExt
- Development.IDE.GHC.Compat: NoScope :: Scope
- Development.IDE.GHC.Compat: Node :: NodeInfo a -> Span -> [HieAST a] -> HieAST a
- Development.IDE.GHC.Compat: NodeInfo :: Set (FastString, FastString) -> [a] -> NodeIdentifiers a -> NodeInfo a
- Development.IDE.GHC.Compat: NotPromoted :: Promoted
- Development.IDE.GHC.Compat: Opt_LlvmPassVectorsInRegisters :: GeneralFlag
- Development.IDE.GHC.Compat: Opt_SplitObjs :: GeneralFlag
- Development.IDE.GHC.Compat: Opt_SuppressStgFreeVars :: GeneralFlag
- Development.IDE.GHC.Compat: PatSynDec :: DeclType
- Development.IDE.GHC.Compat: PatternBind :: Scope -> Scope -> Maybe Span -> ContextInfo
- Development.IDE.GHC.Compat: Promoted :: Promoted
- Development.IDE.GHC.Compat: RecField :: RecFieldContext -> Maybe Span -> ContextInfo
- Development.IDE.GHC.Compat: RecFieldAssign :: RecFieldContext
- Development.IDE.GHC.Compat: RecFieldDecl :: RecFieldContext
- Development.IDE.GHC.Compat: RecFieldMatch :: RecFieldContext
- Development.IDE.GHC.Compat: RecFieldOcc :: RecFieldContext
- Development.IDE.GHC.Compat: RegularBind :: BindType
- Development.IDE.GHC.Compat: ResolvedScopes :: [Scope] -> TyVarScope
- Development.IDE.GHC.Compat: Roll :: HieType HieTypeFix -> HieTypeFix
- Development.IDE.GHC.Compat: SynDec :: DeclType
- Development.IDE.GHC.Compat: TyDecl :: ContextInfo
- Development.IDE.GHC.Compat: TyVarBind :: Scope -> TyVarScope -> ContextInfo
- Development.IDE.GHC.Compat: UnresolvedScope :: [Name] -> Maybe Span -> TyVarScope
- Development.IDE.GHC.Compat: Use :: ContextInfo
- Development.IDE.GHC.Compat: ValBind :: BindType -> Scope -> Maybe Span -> ContextInfo
- Development.IDE.GHC.Compat: [freshIndex] :: HieTypeState -> !TypeIndex
- Development.IDE.GHC.Compat: [getAsts] :: HieASTs a -> Map FastString (HieAST a)
- Development.IDE.GHC.Compat: [hsib_closed] :: HsIBRn -> Bool
- Development.IDE.GHC.Compat: [hsib_vars] :: HsIBRn -> [Name]
- Development.IDE.GHC.Compat: [hsq_dependent] :: HsQTvsRn -> NameSet
- Development.IDE.GHC.Compat: [hsq_implicit] :: HsQTvsRn -> [Name]
- Development.IDE.GHC.Compat: [htyTable] :: HieTypeState -> !IntMap HieTypeFlat
- Development.IDE.GHC.Compat: [identInfo] :: IdentifierDetails a -> Set ContextInfo
- Development.IDE.GHC.Compat: [identType] :: IdentifierDetails a -> Maybe a
- Development.IDE.GHC.Compat: [maxPmCheckIterations] :: DynFlags -> Int
- Development.IDE.GHC.Compat: [mi_exp_hash] :: ModIface -> !Fingerprint
- Development.IDE.GHC.Compat: [mi_finsts] :: ModIface -> !WhetherHasFamInst
- Development.IDE.GHC.Compat: [mi_fix_fn] :: ModIface -> OccName -> Maybe Fixity
- Development.IDE.GHC.Compat: [mi_flag_hash] :: ModIface -> !Fingerprint
- Development.IDE.GHC.Compat: [mi_hash_fn] :: ModIface -> OccName -> Maybe (OccName, Fingerprint)
- Development.IDE.GHC.Compat: [mi_hpc_hash] :: ModIface -> !Fingerprint
- Development.IDE.GHC.Compat: [mi_iface_hash] :: ModIface -> !Fingerprint
- Development.IDE.GHC.Compat: [mi_mod_hash] :: ModIface -> !Fingerprint
- Development.IDE.GHC.Compat: [mi_opt_hash] :: ModIface -> !Fingerprint
- Development.IDE.GHC.Compat: [mi_orphan] :: ModIface -> !WhetherHasOrphans
- Development.IDE.GHC.Compat: [mi_orphan_hash] :: ModIface -> !Fingerprint
- Development.IDE.GHC.Compat: [mi_plugin_hash] :: ModIface -> !Fingerprint
- Development.IDE.GHC.Compat: [mi_warn_fn] :: ModIface -> OccName -> Maybe WarningTxt
- Development.IDE.GHC.Compat: [nodeAnnotations] :: NodeInfo a -> Set (FastString, FastString)
- Development.IDE.GHC.Compat: [nodeChildren] :: HieAST a -> [HieAST a]
- Development.IDE.GHC.Compat: [nodeIdentifiers] :: NodeInfo a -> NodeIdentifiers a
- Development.IDE.GHC.Compat: [nodeInfo] :: HieAST a -> NodeInfo a
- Development.IDE.GHC.Compat: [nodeSpan] :: HieAST a -> Span
- Development.IDE.GHC.Compat: [nodeType] :: NodeInfo a -> [a]
- Development.IDE.GHC.Compat: [plugins] :: DynFlags -> [LoadedPlugin]
- Development.IDE.GHC.Compat: [settings] :: DynFlags -> Settings
- Development.IDE.GHC.Compat: [tyMap] :: HieTypeState -> !TypeMap TypeIndex
- Development.IDE.GHC.Compat: addBootSuffixLocnOut :: ModLocation -> ModLocation
- Development.IDE.GHC.Compat: class HasSrcSpan a
- Development.IDE.GHC.Compat: combineAst :: HieAST Type -> HieAST Type -> HieAST Type
- Development.IDE.GHC.Compat: combineNodeInfo :: NodeInfo Type -> NodeInfo Type -> NodeInfo Type
- Development.IDE.GHC.Compat: combineScopes :: Scope -> Scope -> Scope
- Development.IDE.GHC.Compat: compressTypes :: HieASTs Type -> (HieASTs TypeIndex, Array TypeIndex HieTypeFlat)
- Development.IDE.GHC.Compat: data BindType
- Development.IDE.GHC.Compat: data ContextInfo
- Development.IDE.GHC.Compat: data DeclType
- Development.IDE.GHC.Compat: data HieAST a
- Development.IDE.GHC.Compat: data HieType a
- Development.IDE.GHC.Compat: data HieTypeState
- Development.IDE.GHC.Compat: data HsIBRn
- Development.IDE.GHC.Compat: data HsQTvsRn
- Development.IDE.GHC.Compat: data IEType
- Development.IDE.GHC.Compat: data IdentifierDetails a
- Development.IDE.GHC.Compat: data ModIface
- Development.IDE.GHC.Compat: data NoExt
- Development.IDE.GHC.Compat: data NodeInfo a
- Development.IDE.GHC.Compat: data Promoted
- Development.IDE.GHC.Compat: data RecFieldContext
- Development.IDE.GHC.Compat: data Scope
- Development.IDE.GHC.Compat: data TyVarScope
- Development.IDE.GHC.Compat: definedInAsts :: Map FastString (HieAST a) -> Name -> Bool
- Development.IDE.GHC.Compat: emptyTyClGroup :: () => TyClGroup (GhcPass p)
- Development.IDE.GHC.Compat: famDeclHasCusk :: () => Maybe Bool -> FamilyDecl pass -> Bool
- Development.IDE.GHC.Compat: flattenAst :: HieAST a -> [HieAST a]
- Development.IDE.GHC.Compat: foldType :: (HieType a -> a) -> HieTypeFix -> a
- Development.IDE.GHC.Compat: freshTypeIndex :: State HieTypeState TypeIndex
- Development.IDE.GHC.Compat: generateReferencesMap :: Foldable f => f (HieAST a) -> Map Identifier [(Span, IdentifierDetails a)]
- Development.IDE.GHC.Compat: getBindSiteFromContext :: ContextInfo -> Maybe Span
- Development.IDE.GHC.Compat: getHeaderImports :: DynFlags -> StringBuffer -> FilePath -> FilePath -> IO (Either ErrorMessages ([(Maybe FastString, Located ModuleName)], [(Maybe FastString, Located ModuleName)], Located ModuleName))
- Development.IDE.GHC.Compat: getNameBinding :: Name -> Map FastString (HieAST a) -> Maybe Span
- Development.IDE.GHC.Compat: getNameBindingInClass :: Name -> Span -> Map FastString (HieAST a) -> Maybe Span
- Development.IDE.GHC.Compat: getNameScope :: Name -> Map FastString (HieAST a) -> Maybe [Scope]
- Development.IDE.GHC.Compat: getNameScopeAndBinding :: Name -> Map FastString (HieAST a) -> Maybe ([Scope], Maybe Span)
- Development.IDE.GHC.Compat: getScopeFromContext :: ContextInfo -> Maybe [Scope]
- Development.IDE.GHC.Compat: getTypeIndex :: Type -> State HieTypeState TypeIndex
- Development.IDE.GHC.Compat: hieTypeToIface :: HieTypeFix -> IfaceType
- Development.IDE.GHC.Compat: hieVersion :: Integer
- Development.IDE.GHC.Compat: includePathsGlobal :: IncludeSpecs -> [String]
- Development.IDE.GHC.Compat: includePathsQuote :: IncludeSpecs -> [String]
- Development.IDE.GHC.Compat: initialHTS :: HieTypeState
- Development.IDE.GHC.Compat: insertAst :: HieAST Type -> [HieAST Type] -> [HieAST Type]
- Development.IDE.GHC.Compat: instance Development.IDE.GHC.Compat.HasSrcSpan (SrcLoc.GenLocated SrcLoc.SrcSpan a)
- Development.IDE.GHC.Compat: instance Development.IDE.GHC.Compat.HasSrcSpan Name.Name
- Development.IDE.GHC.Compat: isListCompExpr :: () => HsStmtContext id -> Bool
- Development.IDE.GHC.Compat: isOccurrence :: ContextInfo -> Bool
- Development.IDE.GHC.Compat: leftOf :: Span -> Span -> Bool
- Development.IDE.GHC.Compat: locOnly :: SrcSpan -> [HieAST a]
- Development.IDE.GHC.Compat: makeNode :: (Applicative m, Data a) => a -> SrcSpan -> m [HieAST b]
- Development.IDE.GHC.Compat: makeTypeNode :: (Applicative m, Data a) => a -> SrcSpan -> Type -> m [HieAST Type]
- Development.IDE.GHC.Compat: mergeAsts :: [HieAST Type] -> [HieAST Type] -> [HieAST Type]
- Development.IDE.GHC.Compat: mergeSortAsts :: [HieAST Type] -> [HieAST Type]
- Development.IDE.GHC.Compat: mkHsSpliceE :: SpliceDecoration -> LHsExpr GhcPs -> HsExpr GhcPs
- Development.IDE.GHC.Compat: mkHsSpliceTE :: SpliceDecoration -> LHsExpr GhcPs -> HsExpr GhcPs
- Development.IDE.GHC.Compat: mkHsSpliceTy :: SpliceDecoration -> LHsExpr GhcPs -> HsType GhcPs
- Development.IDE.GHC.Compat: mkLScope :: Located a -> Scope
- Development.IDE.GHC.Compat: mkScope :: SrcSpan -> Scope
- Development.IDE.GHC.Compat: mkTyClGroup :: () => [LTyClDecl (GhcPass p)] -> [LInstDecl (GhcPass p)] -> TyClGroup (GhcPass p)
- Development.IDE.GHC.Compat: mk_easy_FunBind :: SrcSpan -> RdrName -> [LPat GhcPs] -> LHsExpr GhcPs -> LHsBind GhcPs
- Development.IDE.GHC.Compat: newtype HieASTs a
- Development.IDE.GHC.Compat: newtype HieArgs a
- Development.IDE.GHC.Compat: newtype HieTypeFix
- Development.IDE.GHC.Compat: newtype HsWildCardInfo
- Development.IDE.GHC.Compat: noExt :: NoExt
- Development.IDE.GHC.Compat: pattern ClassOpSig :: Bool -> [Located (IdP pass)] -> LHsSigType pass -> Sig pass
- Development.IDE.GHC.Compat: pattern DerivD :: DerivDecl p -> HsDecl p
- Development.IDE.GHC.Compat: pattern ForD :: ForeignDecl p -> HsDecl p
- Development.IDE.GHC.Compat: pattern HsValBinds :: HsValBindsLR p p -> HsLocalBindsLR p p
- Development.IDE.GHC.Compat: pattern IEThingAll :: LIEWrappedName (IdP pass) -> IE pass
- Development.IDE.GHC.Compat: pattern IEThingWith :: LIEWrappedName (IdP pass) -> IEWildcard -> [LIEWrappedName (IdP pass)] -> [Located (FieldLbl (IdP pass))] -> IE pass
- Development.IDE.GHC.Compat: pattern InstD :: InstDecl p -> HsDecl p
- Development.IDE.GHC.Compat: pattern PatSynBind :: PatSynBind p p -> HsBind p
- Development.IDE.GHC.Compat: pattern SigD :: Sig p -> HsDecl p
- Development.IDE.GHC.Compat: pattern TyClD :: TyClDecl p -> HsDecl p
- Development.IDE.GHC.Compat: pattern TypeSig :: [Located (IdP p)] -> LHsSigWcType p -> Sig p
- Development.IDE.GHC.Compat: pattern ValBinds :: LHsBinds p -> [LSig p] -> HsValBindsLR p p
- Development.IDE.GHC.Compat: pattern ValD :: HsBind p -> HsDecl p
- Development.IDE.GHC.Compat: pattern VarPat :: Located (IdP p) -> Pat p
- Development.IDE.GHC.Compat: pattern PSB :: () => () => XPSB idL idR -> Located (IdP idL) -> HsPatSynDetails (Located (IdP idR)) -> LPat idR -> HsPatSynDir idR -> PatSynBind idL idR
- Development.IDE.GHC.Compat: pattern XPatSynBind :: () => () => XXPatSynBind idL idR -> PatSynBind idL idR
- Development.IDE.GHC.Compat: pprFamInstLHS :: OutputableBndrId (GhcPass p) => Located (IdP (GhcPass p)) -> HsTyPats (GhcPass p) -> LexicalFixity -> HsContext (GhcPass p) -> Maybe (LHsKind (GhcPass p)) -> SDoc
- Development.IDE.GHC.Compat: pprHsContext :: OutputableBndrId (GhcPass p) => HsContext (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprHsContextMaybe :: OutputableBndrId (GhcPass p) => HsContext (GhcPass p) -> Maybe SDoc
- Development.IDE.GHC.Compat: pprHsContextNoArrow :: OutputableBndrId (GhcPass p) => HsContext (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprHsForAllTvs :: OutputableBndrId (GhcPass p) => [LHsTyVarBndr (GhcPass p)] -> SDoc
- Development.IDE.GHC.Compat: psb_args :: PatSynBind idL idR -> HsPatSynDetails (Located (IdP idR))
- Development.IDE.GHC.Compat: psb_def :: PatSynBind idL idR -> LPat idR
- Development.IDE.GHC.Compat: psb_dir :: PatSynBind idL idR -> HsPatSynDir idR
- Development.IDE.GHC.Compat: psb_ext :: PatSynBind idL idR -> XPSB idL idR
- Development.IDE.GHC.Compat: psb_id :: PatSynBind idL idR -> Located (IdP idL)
- Development.IDE.GHC.Compat: recoverFullType :: TypeIndex -> Array TypeIndex HieTypeFlat -> HieTypeFix
- Development.IDE.GHC.Compat: renderHieType :: DynFlags -> HieTypeFix -> String
- Development.IDE.GHC.Compat: resolveTyVarScopeLocal :: HieAST a -> Map FastString (HieAST a) -> HieAST a
- Development.IDE.GHC.Compat: resolveTyVarScopes :: Map FastString (HieAST a) -> Map FastString (HieAST a)
- Development.IDE.GHC.Compat: resolveVisibility :: Type -> [Type] -> [(Bool, Type)]
- Development.IDE.GHC.Compat: rightOf :: Span -> Span -> Bool
- Development.IDE.GHC.Compat: sameWildCard :: Located HsWildCardInfo -> Located HsWildCardInfo -> Bool
- Development.IDE.GHC.Compat: scopeContainsSpan :: Scope -> Span -> Bool
- Development.IDE.GHC.Compat: selectLargestContainedBy :: Span -> HieAST a -> Maybe (HieAST a)
- Development.IDE.GHC.Compat: selectSmallestContaining :: Span -> HieAST a -> Maybe (HieAST a)
- Development.IDE.GHC.Compat: simpleNodeInfo :: FastString -> FastString -> NodeInfo a
- Development.IDE.GHC.Compat: smallestContainingSatisfying :: Span -> (HieAST a -> Bool) -> HieAST a -> Maybe (HieAST a)
- Development.IDE.GHC.Compat: splitHsAppTys :: LHsType GhcRn -> [LHsType GhcRn] -> (LHsType GhcRn, [LHsType GhcRn])
- Development.IDE.GHC.Compat: splitLHsForAllTy :: () => LHsType pass -> ([LHsTyVarBndr pass], LHsType pass)
- Development.IDE.GHC.Compat: splitLHsSigmaTy :: () => LHsType pass -> ([LHsTyVarBndr pass], LHsContext pass, LHsType pass)
- Development.IDE.GHC.Compat: startsRightOf :: Span -> Span -> Bool
- Development.IDE.GHC.Compat: type HieTypeFlat = HieType TypeIndex
- Development.IDE.GHC.Compat: type Identifier = Either ModuleName Name
- Development.IDE.GHC.Compat: type LTyFamDefltEqn pass = Located TyFamDefltEqn pass
- Development.IDE.GHC.Compat: type NodeIdentifiers a = Map Identifier (IdentifierDetails a)
- Development.IDE.GHC.Compat: type Span = RealSrcSpan
- Development.IDE.GHC.Compat: type TyFamDefltEqn pass = FamEqn pass LHsQTyVars pass LHsType pass
- Development.IDE.GHC.Compat: type TypeIndex = Int
- Development.IDE.GHC.Compat: userHsLTyVarBndrs :: () => SrcSpan -> [Located (IdP (GhcPass p))] -> [LHsTyVarBndr (GhcPass p)]
- Development.IDE.GHC.Compat: userHsTyVarBndrs :: () => SrcSpan -> [IdP (GhcPass p)] -> [LHsTyVarBndr (GhcPass p)]
- Development.IDE.GHC.Compat: wildCardName :: HsWildCardInfo -> Name
- Development.IDE.GHC.Util: runGhcEnv :: HscEnv -> Ghc a -> IO (HscEnv, a)
- Development.IDE.Import.DependencyInformation: reverseDependencies :: NormalizedFilePath -> DependencyInformation -> [NormalizedFilePath]
- Development.IDE.Spans.Common: listifyAllSpans :: (Typeable a, Data m) => m -> [Located a]
- Development.IDE.Spans.Common: listifyAllSpans' :: Typeable a => TypecheckedSource -> [Pat a]
+ Development.IDE: BCOLinkable :: LinkableType
+ Development.IDE: DKMap :: !DocMap -> !KindMap -> DocAndKindMap
+ Development.IDE: GetBindings :: GetBindings
+ Development.IDE: GetClientSettings :: GetClientSettings
+ Development.IDE: GetDocMap :: GetDocMap
+ Development.IDE: GetHieAst :: GetHieAst
+ Development.IDE: GetImportMap :: GetImportMap
+ Development.IDE: GetModIfaceWithoutLinkable :: GetModIfaceWithoutLinkable
+ Development.IDE: HAR :: Module -> !HieASTs Type -> RefMap -> HieAstResult
+ Development.IDE: ImportMap :: Map ModuleName NormalizedFilePath -> ImportMap
+ Development.IDE: NeedsCompilation :: NeedsCompilation
+ Development.IDE: ObjectLinkable :: LinkableType
+ Development.IDE: [$sel:clientSettings:IdeConfiguration] :: IdeConfiguration -> Hashed (Maybe Value)
+ Development.IDE: [getDocMap] :: DocAndKindMap -> !DocMap
+ Development.IDE: [getKindMap] :: DocAndKindMap -> !KindMap
+ Development.IDE: [hieAst] :: HieAstResult -> !HieASTs Type
+ Development.IDE: [hieModule] :: HieAstResult -> Module
+ Development.IDE: [hirHomeMod] :: HiFileResult -> !HomeModInfo
+ Development.IDE: [importMap] :: ImportMap -> Map ModuleName NormalizedFilePath
+ Development.IDE: [refMap] :: HieAstResult -> RefMap
+ Development.IDE: [tmrParsed] :: TcModuleResult -> ParsedModule
+ Development.IDE: [tmrRenamed] :: TcModuleResult -> RenamedSource
+ Development.IDE: [tmrTypechecked] :: TcModuleResult -> TcGblEnv
+ Development.IDE: data DocAndKindMap
+ Development.IDE: data GetBindings
+ Development.IDE: data GetClientSettings
+ Development.IDE: data GetDocMap
+ Development.IDE: data GetHieAst
+ Development.IDE: data GetImportMap
+ Development.IDE: data GetModIfaceWithoutLinkable
+ Development.IDE: data HieAstResult
+ Development.IDE: data LinkableType
+ Development.IDE: data NeedsCompilation
+ Development.IDE: hirModIface :: HiFileResult -> ModIface
+ Development.IDE: newHscEnvEqWithImportPaths :: Maybe [String] -> HscEnv -> [(InstalledUnitId, DynFlags)] -> IO HscEnvEq
+ Development.IDE: newtype ImportMap
+ Development.IDE: realSrcLocToPosition :: RealSrcLoc -> Position
+ Development.IDE.Core.IdeConfiguration: [$sel:clientSettings:IdeConfiguration] :: IdeConfiguration -> Hashed (Maybe Value)
+ Development.IDE.Core.IdeConfiguration: getClientSettings :: Action (Maybe Value)
+ Development.IDE.Core.IdeConfiguration: getIdeConfiguration :: Action IdeConfiguration
+ Development.IDE.Core.IdeConfiguration: modifyClientSettings :: IdeState -> (Maybe Value -> Maybe Value) -> IO ()
+ Development.IDE.Core.Preprocessor: instance GHC.Show.Show Development.IDE.Core.Preprocessor.CPPDiag
+ Development.IDE.Core.Preprocessor: instance GHC.Show.Show Development.IDE.Core.Preprocessor.CPPLog
+ Development.IDE.Core.Preprocessor: preprocessor :: HscEnv -> FilePath -> Maybe StringBuffer -> ExceptT [FileDiagnostic] IO (StringBuffer, DynFlags)
+ Development.IDE.Core.RuleTypes: BCOLinkable :: LinkableType
+ Development.IDE.Core.RuleTypes: DKMap :: !DocMap -> !KindMap -> DocAndKindMap
+ Development.IDE.Core.RuleTypes: GetBindings :: GetBindings
+ Development.IDE.Core.RuleTypes: GetClientSettings :: GetClientSettings
+ Development.IDE.Core.RuleTypes: GetDocMap :: GetDocMap
+ Development.IDE.Core.RuleTypes: GetHieAst :: GetHieAst
+ Development.IDE.Core.RuleTypes: GetImportMap :: GetImportMap
+ Development.IDE.Core.RuleTypes: GetModIfaceWithoutLinkable :: GetModIfaceWithoutLinkable
+ Development.IDE.Core.RuleTypes: HAR :: Module -> !HieASTs Type -> RefMap -> HieAstResult
+ Development.IDE.Core.RuleTypes: ImportMap :: Map ModuleName NormalizedFilePath -> ImportMap
+ Development.IDE.Core.RuleTypes: NeedsCompilation :: NeedsCompilation
+ Development.IDE.Core.RuleTypes: ObjectLinkable :: LinkableType
+ Development.IDE.Core.RuleTypes: [getDocMap] :: DocAndKindMap -> !DocMap
+ Development.IDE.Core.RuleTypes: [getKindMap] :: DocAndKindMap -> !KindMap
+ Development.IDE.Core.RuleTypes: [hieAst] :: HieAstResult -> !HieASTs Type
+ Development.IDE.Core.RuleTypes: [hieModule] :: HieAstResult -> Module
+ Development.IDE.Core.RuleTypes: [hirHomeMod] :: HiFileResult -> !HomeModInfo
+ Development.IDE.Core.RuleTypes: [importMap] :: ImportMap -> Map ModuleName NormalizedFilePath
+ Development.IDE.Core.RuleTypes: [refMap] :: HieAstResult -> RefMap
+ Development.IDE.Core.RuleTypes: [tmrParsed] :: TcModuleResult -> ParsedModule
+ Development.IDE.Core.RuleTypes: [tmrRenamed] :: TcModuleResult -> RenamedSource
+ Development.IDE.Core.RuleTypes: [tmrTypechecked] :: TcModuleResult -> TcGblEnv
+ Development.IDE.Core.RuleTypes: data DocAndKindMap
+ Development.IDE.Core.RuleTypes: data GetBindings
+ Development.IDE.Core.RuleTypes: data GetClientSettings
+ Development.IDE.Core.RuleTypes: data GetDocMap
+ Development.IDE.Core.RuleTypes: data GetHieAst
+ Development.IDE.Core.RuleTypes: data GetImportMap
+ Development.IDE.Core.RuleTypes: data GetModIfaceWithoutLinkable
+ Development.IDE.Core.RuleTypes: data HieAstResult
+ Development.IDE.Core.RuleTypes: data LinkableType
+ Development.IDE.Core.RuleTypes: data NeedsCompilation
+ Development.IDE.Core.RuleTypes: hirModIface :: HiFileResult -> ModIface
+ Development.IDE.Core.RuleTypes: instance Control.DeepSeq.NFData Development.IDE.Core.RuleTypes.DocAndKindMap
+ Development.IDE.Core.RuleTypes: instance Control.DeepSeq.NFData Development.IDE.Core.RuleTypes.GetBindings
+ Development.IDE.Core.RuleTypes: instance Control.DeepSeq.NFData Development.IDE.Core.RuleTypes.GetClientSettings
+ Development.IDE.Core.RuleTypes: instance Control.DeepSeq.NFData Development.IDE.Core.RuleTypes.GetDocMap
+ Development.IDE.Core.RuleTypes: instance Control.DeepSeq.NFData Development.IDE.Core.RuleTypes.GetHieAst
+ Development.IDE.Core.RuleTypes: instance Control.DeepSeq.NFData Development.IDE.Core.RuleTypes.GetImportMap
+ Development.IDE.Core.RuleTypes: instance Control.DeepSeq.NFData Development.IDE.Core.RuleTypes.GetModIfaceWithoutLinkable
+ Development.IDE.Core.RuleTypes: instance Control.DeepSeq.NFData Development.IDE.Core.RuleTypes.HieAstResult
+ Development.IDE.Core.RuleTypes: instance Control.DeepSeq.NFData Development.IDE.Core.RuleTypes.ImportMap
+ Development.IDE.Core.RuleTypes: instance Control.DeepSeq.NFData Development.IDE.Core.RuleTypes.NeedsCompilation
+ Development.IDE.Core.RuleTypes: instance Data.Binary.Class.Binary Development.IDE.Core.RuleTypes.GetBindings
+ Development.IDE.Core.RuleTypes: instance Data.Binary.Class.Binary Development.IDE.Core.RuleTypes.GetClientSettings
+ Development.IDE.Core.RuleTypes: instance Data.Binary.Class.Binary Development.IDE.Core.RuleTypes.GetDocMap
+ Development.IDE.Core.RuleTypes: instance Data.Binary.Class.Binary Development.IDE.Core.RuleTypes.GetHieAst
+ Development.IDE.Core.RuleTypes: instance Data.Binary.Class.Binary Development.IDE.Core.RuleTypes.GetImportMap
+ Development.IDE.Core.RuleTypes: instance Data.Binary.Class.Binary Development.IDE.Core.RuleTypes.GetModIfaceWithoutLinkable
+ Development.IDE.Core.RuleTypes: instance Data.Binary.Class.Binary Development.IDE.Core.RuleTypes.NeedsCompilation
+ Development.IDE.Core.RuleTypes: instance Data.Hashable.Class.Hashable Development.IDE.Core.RuleTypes.GetBindings
+ Development.IDE.Core.RuleTypes: instance Data.Hashable.Class.Hashable Development.IDE.Core.RuleTypes.GetClientSettings
+ Development.IDE.Core.RuleTypes: instance Data.Hashable.Class.Hashable Development.IDE.Core.RuleTypes.GetDocMap
+ Development.IDE.Core.RuleTypes: instance Data.Hashable.Class.Hashable Development.IDE.Core.RuleTypes.GetHieAst
+ Development.IDE.Core.RuleTypes: instance Data.Hashable.Class.Hashable Development.IDE.Core.RuleTypes.GetImportMap
+ Development.IDE.Core.RuleTypes: instance Data.Hashable.Class.Hashable Development.IDE.Core.RuleTypes.GetModIfaceWithoutLinkable
+ Development.IDE.Core.RuleTypes: instance Data.Hashable.Class.Hashable Development.IDE.Core.RuleTypes.NeedsCompilation
+ Development.IDE.Core.RuleTypes: instance GHC.Classes.Eq Development.IDE.Core.RuleTypes.GetBindings
+ Development.IDE.Core.RuleTypes: instance GHC.Classes.Eq Development.IDE.Core.RuleTypes.GetClientSettings
+ Development.IDE.Core.RuleTypes: instance GHC.Classes.Eq Development.IDE.Core.RuleTypes.GetDocMap
+ Development.IDE.Core.RuleTypes: instance GHC.Classes.Eq Development.IDE.Core.RuleTypes.GetHieAst
+ Development.IDE.Core.RuleTypes: instance GHC.Classes.Eq Development.IDE.Core.RuleTypes.GetImportMap
+ Development.IDE.Core.RuleTypes: instance GHC.Classes.Eq Development.IDE.Core.RuleTypes.GetModIfaceWithoutLinkable
+ Development.IDE.Core.RuleTypes: instance GHC.Classes.Eq Development.IDE.Core.RuleTypes.LinkableType
+ Development.IDE.Core.RuleTypes: instance GHC.Classes.Eq Development.IDE.Core.RuleTypes.NeedsCompilation
+ Development.IDE.Core.RuleTypes: instance GHC.Classes.Ord Development.IDE.Core.RuleTypes.LinkableType
+ Development.IDE.Core.RuleTypes: instance GHC.Generics.Generic Development.IDE.Core.RuleTypes.GetBindings
+ Development.IDE.Core.RuleTypes: instance GHC.Generics.Generic Development.IDE.Core.RuleTypes.GetClientSettings
+ Development.IDE.Core.RuleTypes: instance GHC.Generics.Generic Development.IDE.Core.RuleTypes.GetDocMap
+ Development.IDE.Core.RuleTypes: instance GHC.Generics.Generic Development.IDE.Core.RuleTypes.GetHieAst
+ Development.IDE.Core.RuleTypes: instance GHC.Generics.Generic Development.IDE.Core.RuleTypes.GetImportMap
+ Development.IDE.Core.RuleTypes: instance GHC.Generics.Generic Development.IDE.Core.RuleTypes.GetModIfaceWithoutLinkable
+ Development.IDE.Core.RuleTypes: instance GHC.Generics.Generic Development.IDE.Core.RuleTypes.NeedsCompilation
+ Development.IDE.Core.RuleTypes: instance GHC.Show.Show Development.IDE.Core.RuleTypes.DocAndKindMap
+ Development.IDE.Core.RuleTypes: instance GHC.Show.Show Development.IDE.Core.RuleTypes.GetBindings
+ Development.IDE.Core.RuleTypes: instance GHC.Show.Show Development.IDE.Core.RuleTypes.GetClientSettings
+ Development.IDE.Core.RuleTypes: instance GHC.Show.Show Development.IDE.Core.RuleTypes.GetDocMap
+ Development.IDE.Core.RuleTypes: instance GHC.Show.Show Development.IDE.Core.RuleTypes.GetHieAst
+ Development.IDE.Core.RuleTypes: instance GHC.Show.Show Development.IDE.Core.RuleTypes.GetImportMap
+ Development.IDE.Core.RuleTypes: instance GHC.Show.Show Development.IDE.Core.RuleTypes.GetModIfaceWithoutLinkable
+ Development.IDE.Core.RuleTypes: instance GHC.Show.Show Development.IDE.Core.RuleTypes.HieAstResult
+ Development.IDE.Core.RuleTypes: instance GHC.Show.Show Development.IDE.Core.RuleTypes.ImportMap
+ Development.IDE.Core.RuleTypes: instance GHC.Show.Show Development.IDE.Core.RuleTypes.LinkableType
+ Development.IDE.Core.RuleTypes: instance GHC.Show.Show Development.IDE.Core.RuleTypes.NeedsCompilation
+ Development.IDE.Core.RuleTypes: newtype ImportMap
+ Development.IDE.Core.Rules: GetClientSettings :: GetClientSettings
+ Development.IDE.Core.Rules: data GetClientSettings
+ Development.IDE.Core.Rules: highlightAtPoint :: NormalizedFilePath -> Position -> IdeAction (Maybe [DocumentHighlight])
+ Development.IDE.Core.Rules: instance Development.IDE.Core.Shake.IsIdeGlobal Development.IDE.Core.Rules.CompiledLinkables
+ Development.IDE.Core.Shake: TargetFile :: NormalizedFilePath -> Target
+ Development.IDE.Core.Shake: TargetModule :: ModuleName -> Target
+ Development.IDE.Core.Shake: data Target
+ Development.IDE.Core.Shake: instance Control.DeepSeq.NFData Development.IDE.Core.Shake.Target
+ Development.IDE.Core.Shake: instance Data.Hashable.Class.Hashable Development.IDE.Core.Shake.Target
+ Development.IDE.Core.Shake: instance GHC.Classes.Eq Development.IDE.Core.Shake.Target
+ Development.IDE.Core.Shake: instance GHC.Generics.Generic Development.IDE.Core.Shake.Target
+ Development.IDE.Core.Shake: instance GHC.Show.Show Development.IDE.Core.Shake.Target
+ Development.IDE.GHC.Compat: AixLD :: [Option] -> LinkerInfo
+ Development.IDE.GHC.Compat: AppleClang :: CompilerInfo
+ Development.IDE.GHC.Compat: AppleClang51 :: CompilerInfo
+ Development.IDE.GHC.Compat: CFGWeights :: Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> CfgWeights
+ Development.IDE.GHC.Compat: Clang :: CompilerInfo
+ Development.IDE.GHC.Compat: ClassOpSig :: XClassOpSig pass -> Bool -> [Located (IdP pass)] -> LHsSigType pass -> Sig pass
+ Development.IDE.GHC.Compat: ClearPackageDBs :: PackageDBFlag
+ Development.IDE.GHC.Compat: DarwinLD :: [Option] -> LinkerInfo
+ Development.IDE.GHC.Compat: DelayedSplice :: TcLclEnv -> LHsExpr GhcRn -> TcType -> LHsExpr GhcTcId -> DelayedSplice
+ Development.IDE.GHC.Compat: Deployable :: DynLibLoader
+ Development.IDE.GHC.Compat: DerivD :: XDerivD p -> DerivDecl p -> HsDecl p
+ Development.IDE.GHC.Compat: DistrustPackage :: String -> TrustFlag
+ Development.IDE.GHC.Compat: ErrReason :: !Maybe WarningFlag -> WarnReason
+ Development.IDE.GHC.Compat: FileOption :: String -> String -> Option
+ Development.IDE.GHC.Compat: FileSettings :: FilePath -> FilePath -> Maybe FilePath -> FilePath -> String -> FilePath -> FileSettings
+ Development.IDE.GHC.Compat: FilesToClean :: !Set FilePath -> !Set FilePath -> FilesToClean
+ Development.IDE.GHC.Compat: FlagSpec :: String -> flag -> (TurnOnFlag -> DynP ()) -> GhcFlagMode -> FlagSpec flag
+ Development.IDE.GHC.Compat: FlushErr :: IO () -> FlushErr
+ Development.IDE.GHC.Compat: FlushOut :: IO () -> FlushOut
+ Development.IDE.GHC.Compat: ForD :: XForD p -> ForeignDecl p -> HsDecl p
+ Development.IDE.GHC.Compat: ForallInvis :: ForallVisFlag
+ Development.IDE.GHC.Compat: ForallVis :: ForallVisFlag
+ Development.IDE.GHC.Compat: GCC :: CompilerInfo
+ Development.IDE.GHC.Compat: GhcNameVersion :: String -> String -> GhcNameVersion
+ Development.IDE.GHC.Compat: GlobalPkgConf :: PkgConfRef
+ Development.IDE.GHC.Compat: GnuGold :: [Option] -> LinkerInfo
+ Development.IDE.GHC.Compat: GnuLD :: [Option] -> LinkerInfo
+ Development.IDE.GHC.Compat: Haskell2010 :: Language
+ Development.IDE.GHC.Compat: Haskell98 :: Language
+ Development.IDE.GHC.Compat: HidePackage :: String -> PackageFlag
+ Development.IDE.GHC.Compat: HsAppKindTy :: XAppKindTy pass -> LHsType pass -> LHsKind pass -> HsType pass
+ Development.IDE.GHC.Compat: HsArgPar :: SrcSpan -> HsArg tm ty
+ Development.IDE.GHC.Compat: HsSplicedT :: DelayedSplice -> HsSplice id
+ Development.IDE.GHC.Compat: HsTypeArg :: SrcSpan -> ty -> HsArg tm ty
+ Development.IDE.GHC.Compat: HsValArg :: tm -> HsArg tm ty
+ Development.IDE.GHC.Compat: HsValBinds :: XHsValBinds idL idR -> HsValBindsLR idL idR -> HsLocalBindsLR idL idR
+ Development.IDE.GHC.Compat: IEThingAll :: XIEThingAll pass -> LIEWrappedName (IdP pass) -> IE pass
+ Development.IDE.GHC.Compat: IEThingWith :: XIEThingWith pass -> LIEWrappedName (IdP pass) -> IEWildcard -> [LIEWrappedName (IdP pass)] -> [Located (FieldLbl (IdP pass))] -> IE pass
+ Development.IDE.GHC.Compat: IgnorePackage :: String -> IgnorePackageFlag
+ Development.IDE.GHC.Compat: IncludeSpecs :: [String] -> [String] -> IncludeSpecs
+ Development.IDE.GHC.Compat: InstD :: XInstD p -> InstDecl p -> HsDecl p
+ Development.IDE.GHC.Compat: IntegerGMP :: IntegerLibrary
+ Development.IDE.GHC.Compat: IntegerSimple :: IntegerLibrary
+ Development.IDE.GHC.Compat: KindSigD :: XKindSigD p -> StandaloneKindSig p -> HsDecl p
+ Development.IDE.GHC.Compat: LlvmConfig :: [(String, LlvmTarget)] -> [(Int, String)] -> LlvmConfig
+ Development.IDE.GHC.Compat: LlvmLLD :: [Option] -> LinkerInfo
+ Development.IDE.GHC.Compat: LlvmTarget :: String -> String -> [String] -> LlvmTarget
+ Development.IDE.GHC.Compat: ModRenaming :: Bool -> [(ModuleName, ModuleName)] -> ModRenaming
+ Development.IDE.GHC.Compat: NoExtField :: NoExtField
+ Development.IDE.GHC.Compat: NoGlobalPackageDB :: PackageDBFlag
+ Development.IDE.GHC.Compat: NoProfAuto :: ProfAuto
+ Development.IDE.GHC.Compat: NoReason :: WarnReason
+ Development.IDE.GHC.Compat: NoUserPackageDB :: PackageDBFlag
+ Development.IDE.GHC.Compat: NotQualified :: ImportDeclQualifiedStyle
+ Development.IDE.GHC.Compat: Opt_ByteCode :: GeneralFlag
+ Development.IDE.GHC.Compat: Opt_CfgBlocklayout :: GeneralFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_BCOs :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_asm :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_asm_conflicts :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_asm_expanded :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_asm_liveness :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_asm_native :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_asm_regalloc :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_asm_regalloc_stages :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_asm_stats :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_call_arity :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cfg_weights :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cmm :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cmm_caf :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cmm_cbe :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cmm_cfg :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cmm_cps :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cmm_from_stg :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cmm_info :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cmm_proc :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cmm_procmap :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cmm_raw :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cmm_sink :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cmm_sp :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cmm_split :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cmm_switch :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cmm_verbose :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cmm_verbose_by_proc :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_core_stats :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cs_trace :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_cse :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_debug :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_deriv :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_ds :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_ds_preopt :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_ec_trace :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_exitify :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_foreign :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_hi :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_hi_diffs :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_if_trace :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_inlinings :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_json :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_llvm :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_mod_cycles :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_mod_map :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_occur_anal :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_opt_cmm :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_parsed :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_parsed_ast :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_prep :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_rn :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_rn_ast :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_rn_stats :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_rn_trace :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_rtti :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_rule_firings :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_rule_rewrites :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_rules :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_simpl :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_simpl_iterations :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_simpl_stats :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_simpl_trace :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_spec :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_splices :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_stg :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_stg_final :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_stg_unarised :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_str_signatures :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_stranal :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_tc :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_tc_ast :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_tc_trace :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_ticked :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_timings :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_types :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_view_pattern_commoning :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_vt_trace :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_dump_worker_wrapper :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_no_debug_output :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_ppr_debug :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_source_stats :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_th_dec_file :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_verbose_core2core :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_D_verbose_stg2stg :: DumpFlag
+ Development.IDE.GHC.Compat: Opt_DeferDiagnostics :: GeneralFlag
+ Development.IDE.GHC.Compat: Opt_EnableThSpliceWarnings :: GeneralFlag
+ Development.IDE.GHC.Compat: Opt_KeepCAFs :: GeneralFlag
+ Development.IDE.GHC.Compat: Opt_KeepGoing :: GeneralFlag
+ Development.IDE.GHC.Compat: Opt_KeepHscppFiles :: GeneralFlag
+ Development.IDE.GHC.Compat: Opt_NoTypeableBinds :: GeneralFlag
+ Development.IDE.GHC.Compat: Opt_PluginTrustworthy :: GeneralFlag
+ Development.IDE.GHC.Compat: Opt_PrintAxiomIncomps :: GeneralFlag
+ Development.IDE.GHC.Compat: Opt_ShowDocsOfHoleFits :: GeneralFlag
+ Development.IDE.GHC.Compat: Opt_StgLiftLams :: GeneralFlag
+ Development.IDE.GHC.Compat: Opt_SuppressStgExts :: GeneralFlag
+ Development.IDE.GHC.Compat: Opt_ValidateHie :: GeneralFlag
+ Development.IDE.GHC.Compat: Opt_WarnAllMissedSpecs :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnAlternativeLayoutRuleTransitional :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnAutoOrphans :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnCPPUndef :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnCompatUnqualifiedImports :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnDeferredOutOfScopeVariables :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnDeferredTypeErrors :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnDeprecatedFlags :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnDerivingDefaults :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnDerivingTypeable :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnDodgyExports :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnDodgyForeignImports :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnDodgyImports :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnDuplicateConstraints :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnDuplicateExports :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnEmptyEnumerations :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnHiShadows :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnIdentities :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnImplicitKindVars :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnImplicitPrelude :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnInaccessibleCode :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnIncompletePatterns :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnIncompletePatternsRecUpd :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnIncompleteUniPatterns :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnInferredSafeImports :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnInlineRuleShadowing :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnMissedExtraSharedLib :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnMissedSpecs :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnMissingDerivingStrategies :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnMissingExportList :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnMissingExportedSignatures :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnMissingFields :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnMissingHomeModules :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnMissingImportList :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnMissingLocalSignatures :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnMissingMethods :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnMissingMonadFailInstances :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnMissingPatternSynonymSignatures :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnMissingSafeHaskellMode :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnMissingSignatures :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnMonomorphism :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnNameShadowing :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnNonCanonicalMonadFailInstances :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnNonCanonicalMonadInstances :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnNonCanonicalMonoidInstances :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnOrphans :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnOverflowedLiterals :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnOverlappingPatterns :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnPartialFields :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnPartialTypeSignatures :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnPrepositiveQualifiedModule :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnRedundantConstraints :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnRedundantRecordWildcards :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnSafe :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnSemigroup :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnSimplifiableClassConstraints :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnSpaceAfterBang :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnStarBinder :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnStarIsType :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnTabs :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnTrustworthySafe :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnTypeDefaults :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnTypedHoles :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnUnbangedStrictPatterns :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnUnrecognisedPragmas :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnUnrecognisedWarningFlags :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnUnsafe :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnUnsupportedCallingConventions :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnUnsupportedLlvmVersion :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnUntickedPromotedConstructors :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnUnusedDoBind :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnUnusedForalls :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnUnusedImports :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnUnusedLocalBinds :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnUnusedMatches :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnUnusedPackages :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnUnusedPatternBinds :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnUnusedRecordWildcards :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnUnusedTopBinds :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnUnusedTypePatterns :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnWarningsDeprecations :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WarnWrongDoBind :: WarningFlag
+ Development.IDE.GHC.Compat: Opt_WeightlessBlocklayout :: GeneralFlag
+ Development.IDE.GHC.Compat: Opt_WriteHie :: GeneralFlag
+ Development.IDE.GHC.Compat: Option :: String -> Option
+ Development.IDE.GHC.Compat: PSB :: XPSB idL idR -> Located (IdP idL) -> HsPatSynDetails (Located (IdP idR)) -> LPat idR -> HsPatSynDir idR -> PatSynBind idL idR
+ Development.IDE.GHC.Compat: PackageArg :: String -> PackageArg
+ Development.IDE.GHC.Compat: PackageDB :: PkgConfRef -> PackageDBFlag
+ Development.IDE.GHC.Compat: PatSynBind :: XPatSynBind idL idR -> PatSynBind idL idR -> HsBindLR idL idR
+ Development.IDE.GHC.Compat: PkgConfFile :: FilePath -> PkgConfRef
+ Development.IDE.GHC.Compat: PlatformConstants :: Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Bool -> Bool -> Int -> Integer -> Integer -> Integer -> PlatformConstants
+ Development.IDE.GHC.Compat: PlatformMisc :: String -> String -> IntegerLibrary -> Bool -> Bool -> Bool -> String -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> String -> PlatformMisc
+ Development.IDE.GHC.Compat: ProfAutoAll :: ProfAuto
+ Development.IDE.GHC.Compat: ProfAutoCalls :: ProfAuto
+ Development.IDE.GHC.Compat: ProfAutoExports :: ProfAuto
+ Development.IDE.GHC.Compat: ProfAutoTop :: ProfAuto
+ Development.IDE.GHC.Compat: QualifiedPost :: ImportDeclQualifiedStyle
+ Development.IDE.GHC.Compat: QualifiedPre :: ImportDeclQualifiedStyle
+ Development.IDE.GHC.Compat: Reason :: !WarningFlag -> WarnReason
+ Development.IDE.GHC.Compat: RtsOptsAll :: RtsOptsEnabled
+ Development.IDE.GHC.Compat: RtsOptsIgnore :: RtsOptsEnabled
+ Development.IDE.GHC.Compat: RtsOptsIgnoreAll :: RtsOptsEnabled
+ Development.IDE.GHC.Compat: RtsOptsNone :: RtsOptsEnabled
+ Development.IDE.GHC.Compat: RtsOptsSafeOnly :: RtsOptsEnabled
+ Development.IDE.GHC.Compat: Settings :: {-# UNPACK #-} !GhcNameVersion -> {-# UNPACK #-} !FileSettings -> Platform -> {-# UNPACK #-} !ToolSettings -> {-# UNPACK #-} !PlatformMisc -> PlatformConstants -> [(String, String)] -> Settings
+ Development.IDE.GHC.Compat: Sf_Ignore :: SafeHaskellMode
+ Development.IDE.GHC.Compat: Sf_SafeInferred :: SafeHaskellMode
+ Development.IDE.GHC.Compat: SigD :: XSigD p -> Sig p -> HsDecl p
+ Development.IDE.GHC.Compat: SolarisLD :: [Option] -> LinkerInfo
+ Development.IDE.GHC.Compat: StandaloneKindSig :: XStandaloneKindSig pass -> Located (IdP pass) -> LHsSigType pass -> StandaloneKindSig pass
+ Development.IDE.GHC.Compat: SystemDependent :: DynLibLoader
+ Development.IDE.GHC.Compat: TrustPackage :: String -> TrustFlag
+ Development.IDE.GHC.Compat: TyClD :: XTyClD p -> TyClDecl p -> HsDecl p
+ Development.IDE.GHC.Compat: TypeSig :: XTypeSig pass -> [Located (IdP pass)] -> LHsSigWcType pass -> Sig pass
+ Development.IDE.GHC.Compat: UnitIdArg :: UnitId -> PackageArg
+ Development.IDE.GHC.Compat: UnknownCC :: CompilerInfo
+ Development.IDE.GHC.Compat: UnknownLD :: LinkerInfo
+ Development.IDE.GHC.Compat: UserPkgConf :: PkgConfRef
+ Development.IDE.GHC.Compat: ValBinds :: XValBinds idL idR -> LHsBindsLR idL idR -> [LSig idR] -> HsValBindsLR idL idR
+ Development.IDE.GHC.Compat: ValD :: XValD p -> HsBind p -> HsDecl p
+ Development.IDE.GHC.Compat: VarPat :: XVarPat p -> Located (IdP p) -> Pat p
+ Development.IDE.GHC.Compat: WayCustom :: String -> Way
+ Development.IDE.GHC.Compat: WayDebug :: Way
+ Development.IDE.GHC.Compat: WayDyn :: Way
+ Development.IDE.GHC.Compat: WayEventLog :: Way
+ Development.IDE.GHC.Compat: WayProf :: Way
+ Development.IDE.GHC.Compat: WayThreaded :: Way
+ Development.IDE.GHC.Compat: XPatSynBind :: XXPatSynBind idL idR -> PatSynBind idL idR
+ Development.IDE.GHC.Compat: XStandaloneKindSig :: XXStandaloneKindSig pass -> StandaloneKindSig pass
+ Development.IDE.GHC.Compat: [app_arg_pattern] :: ApplicativeArg idL -> LPat idL
+ Development.IDE.GHC.Compat: [app_stmts] :: ApplicativeArg idL -> [ExprLStmt idL]
+ Development.IDE.GHC.Compat: [arg_expr] :: ApplicativeArg idL -> LHsExpr idL
+ Development.IDE.GHC.Compat: [backEdgeBonus] :: CfgWeights -> Int
+ Development.IDE.GHC.Compat: [binBlobThreshold] :: DynFlags -> Word
+ Development.IDE.GHC.Compat: [bv_pattern] :: ApplicativeArg idL -> LPat idL
+ Development.IDE.GHC.Compat: [cachedPlugins] :: DynFlags -> [LoadedPlugin]
+ Development.IDE.GHC.Compat: [callWeight] :: CfgWeights -> Int
+ Development.IDE.GHC.Compat: [cfgWeightInfo] :: DynFlags -> CfgWeights
+ Development.IDE.GHC.Compat: [condBranchWeight] :: CfgWeights -> Int
+ Development.IDE.GHC.Compat: [depIncludeCppDeps] :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: [fail_operator] :: ApplicativeArg idL -> SyntaxExpr idL
+ Development.IDE.GHC.Compat: [feqn_bndrs] :: FamEqn pass rhs -> Maybe [LHsTyVarBndr pass]
+ Development.IDE.GHC.Compat: [fileSettings] :: DynFlags -> {-# UNPACK #-} !FileSettings
+ Development.IDE.GHC.Compat: [fileSettings_ghcUsagePath] :: FileSettings -> FilePath
+ Development.IDE.GHC.Compat: [fileSettings_ghciUsagePath] :: FileSettings -> FilePath
+ Development.IDE.GHC.Compat: [fileSettings_systemPackageConfig] :: FileSettings -> FilePath
+ Development.IDE.GHC.Compat: [fileSettings_tmpDir] :: FileSettings -> String
+ Development.IDE.GHC.Compat: [fileSettings_toolDir] :: FileSettings -> Maybe FilePath
+ Development.IDE.GHC.Compat: [fileSettings_topDir] :: FileSettings -> FilePath
+ Development.IDE.GHC.Compat: [final_expr] :: ApplicativeArg idL -> HsExpr idL
+ Development.IDE.GHC.Compat: [flagSpecAction] :: FlagSpec flag -> TurnOnFlag -> DynP ()
+ Development.IDE.GHC.Compat: [flagSpecFlag] :: FlagSpec flag -> flag
+ Development.IDE.GHC.Compat: [flagSpecGhcMode] :: FlagSpec flag -> GhcFlagMode
+ Development.IDE.GHC.Compat: [flagSpecName] :: FlagSpec flag -> String
+ Development.IDE.GHC.Compat: [ftcCurrentModule] :: FilesToClean -> !Set FilePath
+ Development.IDE.GHC.Compat: [ftcGhcSession] :: FilesToClean -> !Set FilePath
+ Development.IDE.GHC.Compat: [ghcNameVersion] :: DynFlags -> {-# UNPACK #-} !GhcNameVersion
+ Development.IDE.GHC.Compat: [ghcNameVersion_programName] :: GhcNameVersion -> String
+ Development.IDE.GHC.Compat: [ghcNameVersion_projectVersion] :: GhcNameVersion -> String
+ Development.IDE.GHC.Compat: [group_kisigs] :: TyClGroup pass -> [LStandaloneKindSig pass]
+ Development.IDE.GHC.Compat: [hieDir] :: DynFlags -> Maybe String
+ Development.IDE.GHC.Compat: [hieSuf] :: DynFlags -> String
+ Development.IDE.GHC.Compat: [hst_fvf] :: HsType pass -> ForallVisFlag
+ Development.IDE.GHC.Compat: [includePathsGlobal] :: IncludeSpecs -> [String]
+ Development.IDE.GHC.Compat: [includePathsQuote] :: IncludeSpecs -> [String]
+ Development.IDE.GHC.Compat: [infoTablePenalty] :: CfgWeights -> Int
+ Development.IDE.GHC.Compat: [integerLibrary] :: DynFlags -> IntegerLibrary
+ Development.IDE.GHC.Compat: [is_body_stmt] :: ApplicativeArg idL -> Bool
+ Development.IDE.GHC.Compat: [lAttributes] :: LlvmTarget -> [String]
+ Development.IDE.GHC.Compat: [lCPU] :: LlvmTarget -> String
+ Development.IDE.GHC.Compat: [lDataLayout] :: LlvmTarget -> String
+ Development.IDE.GHC.Compat: [liftLamsKnown] :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: [liftLamsNonRecArgs] :: DynFlags -> Maybe Int
+ Development.IDE.GHC.Compat: [liftLamsRecArgs] :: DynFlags -> Maybe Int
+ Development.IDE.GHC.Compat: [likelyCondWeight] :: CfgWeights -> Int
+ Development.IDE.GHC.Compat: [llvmConfig] :: DynFlags -> LlvmConfig
+ Development.IDE.GHC.Compat: [maxPmCheckModels] :: DynFlags -> Int
+ Development.IDE.GHC.Compat: [mi_final_exts] :: ModIface_ (phase :: ModIfacePhase) -> !IfaceBackendExts phase
+ Development.IDE.GHC.Compat: [modRenamingWithImplicit] :: ModRenaming -> Bool
+ Development.IDE.GHC.Compat: [modRenamings] :: ModRenaming -> [(ModuleName, ModuleName)]
+ Development.IDE.GHC.Compat: [ms_hie_date] :: ModSummary -> Maybe UTCTime
+ Development.IDE.GHC.Compat: [pc_AP_STACK_SPLIM] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_BITMAP_BITS_SHIFT] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_BLOCKS_PER_MBLOCK] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_BLOCK_SIZE] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_CINT_SIZE] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_CLONG_LONG_SIZE] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_CLONG_SIZE] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_CONTROL_GROUP_CONST_291] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_DOUBLE_SIZE] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_DYNAMIC_BY_DEFAULT] :: PlatformConstants -> Bool
+ Development.IDE.GHC.Compat: [pc_ILDV_CREATE_MASK] :: PlatformConstants -> Integer
+ Development.IDE.GHC.Compat: [pc_ILDV_STATE_CREATE] :: PlatformConstants -> Integer
+ Development.IDE.GHC.Compat: [pc_ILDV_STATE_USE] :: PlatformConstants -> Integer
+ Development.IDE.GHC.Compat: [pc_LDV_SHIFT] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MAX_CHARLIKE] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MAX_Double_REG] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MAX_Float_REG] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MAX_INTLIKE] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MAX_Long_REG] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MAX_Real_Double_REG] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MAX_Real_Float_REG] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MAX_Real_Long_REG] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MAX_Real_Vanilla_REG] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MAX_Real_XMM_REG] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MAX_SPEC_AP_SIZE] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MAX_SPEC_SELECTEE_SIZE] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MAX_Vanilla_REG] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MAX_XMM_REG] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MIN_CHARLIKE] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MIN_INTLIKE] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MIN_PAYLOAD_SIZE] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_MUT_ARR_PTRS_CARD_BITS] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_Capability_r] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_CostCentreStack_mem_alloc] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_CostCentreStack_scc_count] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgArrBytes_bytes] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgEntCounter_allocd] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgEntCounter_allocs] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgEntCounter_entry_count] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgEntCounter_link] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgEntCounter_registeredp] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgFunInfoExtraFwd_arity] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgFunInfoExtraRev_arity] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgHeader_ccs] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgHeader_ldvw] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgMutArrPtrs_ptrs] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgMutArrPtrs_size] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rCCCS] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rCurrentNursery] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rCurrentTSO] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rD1] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rD2] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rD3] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rD4] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rD5] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rD6] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rF1] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rF2] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rF3] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rF4] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rF5] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rF6] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rHpAlloc] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rHpLim] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rHp] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rL1] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rR10] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rR1] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rR2] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rR3] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rR4] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rR5] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rR6] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rR7] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rR8] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rR9] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rSpLim] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rSp] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rXMM1] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rXMM2] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rXMM3] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rXMM4] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rXMM5] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rXMM6] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rYMM1] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rYMM2] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rYMM3] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rYMM4] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rYMM5] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rYMM6] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rZMM1] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rZMM2] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rZMM3] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rZMM4] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rZMM5] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgRegTable_rZMM6] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgSmallMutArrPtrs_ptrs] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgStack_sp] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgStack_stack] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgTSO_alloc_limit] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgTSO_cccs] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgTSO_stackobj] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_StgUpdateFrame_updatee] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_bdescr_blocks] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_bdescr_flags] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_bdescr_free] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_bdescr_start] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_stgEagerBlackholeInfo] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_stgGCEnter1] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_OFFSET_stgGCFun] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_PROF_HDR_SIZE] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_REP_CostCentreStack_mem_alloc] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_REP_CostCentreStack_scc_count] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_REP_StgEntCounter_allocd] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_REP_StgEntCounter_allocs] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_REP_StgFunInfoExtraFwd_arity] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_REP_StgFunInfoExtraRev_arity] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_RESERVED_C_STACK_BYTES] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_RESERVED_STACK_WORDS] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_SIZEOF_CostCentreStack] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_SIZEOF_StgArrBytes_NoHdr] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_SIZEOF_StgFunInfoExtraRev] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_SIZEOF_StgMutArrPtrs_NoHdr] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_SIZEOF_StgSMPThunkHeader] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_SIZEOF_StgSmallMutArrPtrs_NoHdr] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_SIZEOF_StgUpdateFrame_NoHdr] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_STD_HDR_SIZE] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_TAG_BITS] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_TICKY_BIN_COUNT] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [pc_WORDS_BIGENDIAN] :: PlatformConstants -> Bool
+ Development.IDE.GHC.Compat: [pc_WORD_SIZE] :: PlatformConstants -> Int
+ Development.IDE.GHC.Compat: [platformConstants] :: DynFlags -> PlatformConstants
+ Development.IDE.GHC.Compat: [platformMisc] :: DynFlags -> {-# UNPACK #-} !PlatformMisc
+ Development.IDE.GHC.Compat: [platformMisc_ghcDebugged] :: PlatformMisc -> Bool
+ Development.IDE.GHC.Compat: [platformMisc_ghcRTSWays] :: PlatformMisc -> String
+ Development.IDE.GHC.Compat: [platformMisc_ghcRtsWithLibdw] :: PlatformMisc -> Bool
+ Development.IDE.GHC.Compat: [platformMisc_ghcThreaded] :: PlatformMisc -> Bool
+ Development.IDE.GHC.Compat: [platformMisc_ghcWithInterpreter] :: PlatformMisc -> Bool
+ Development.IDE.GHC.Compat: [platformMisc_ghcWithNativeCodeGen] :: PlatformMisc -> Bool
+ Development.IDE.GHC.Compat: [platformMisc_ghcWithSMP] :: PlatformMisc -> Bool
+ Development.IDE.GHC.Compat: [platformMisc_integerLibraryType] :: PlatformMisc -> IntegerLibrary
+ Development.IDE.GHC.Compat: [platformMisc_integerLibrary] :: PlatformMisc -> String
+ Development.IDE.GHC.Compat: [platformMisc_leadingUnderscore] :: PlatformMisc -> Bool
+ Development.IDE.GHC.Compat: [platformMisc_libFFI] :: PlatformMisc -> Bool
+ Development.IDE.GHC.Compat: [platformMisc_llvmTarget] :: PlatformMisc -> String
+ Development.IDE.GHC.Compat: [platformMisc_tablesNextToCode] :: PlatformMisc -> Bool
+ Development.IDE.GHC.Compat: [platformMisc_targetPlatformString] :: PlatformMisc -> String
+ Development.IDE.GHC.Compat: [psb_args] :: PatSynBind idL idR -> HsPatSynDetails (Located (IdP idR))
+ Development.IDE.GHC.Compat: [psb_def] :: PatSynBind idL idR -> LPat idR
+ Development.IDE.GHC.Compat: [psb_dir] :: PatSynBind idL idR -> HsPatSynDir idR
+ Development.IDE.GHC.Compat: [psb_ext] :: PatSynBind idL idR -> XPSB idL idR
+ Development.IDE.GHC.Compat: [psb_id] :: PatSynBind idL idR -> Located (IdP idL)
+ Development.IDE.GHC.Compat: [rawSettings] :: DynFlags -> [(String, String)]
+ Development.IDE.GHC.Compat: [rd_act] :: RuleDecl pass -> Activation
+ Development.IDE.GHC.Compat: [rd_ext] :: RuleDecl pass -> XHsRule pass
+ Development.IDE.GHC.Compat: [rd_lhs] :: RuleDecl pass -> Located (HsExpr pass)
+ Development.IDE.GHC.Compat: [rd_name] :: RuleDecl pass -> Located (SourceText, RuleName)
+ Development.IDE.GHC.Compat: [rd_rhs] :: RuleDecl pass -> Located (HsExpr pass)
+ Development.IDE.GHC.Compat: [rd_tmvs] :: RuleDecl pass -> [LRuleBndr pass]
+ Development.IDE.GHC.Compat: [rd_tyvs] :: RuleDecl pass -> Maybe [LHsTyVarBndr (NoGhcTc pass)]
+ Development.IDE.GHC.Compat: [sFileSettings] :: Settings -> {-# UNPACK #-} !FileSettings
+ Development.IDE.GHC.Compat: [sGhcNameVersion] :: Settings -> {-# UNPACK #-} !GhcNameVersion
+ Development.IDE.GHC.Compat: [sPlatformConstants] :: Settings -> PlatformConstants
+ Development.IDE.GHC.Compat: [sPlatformMisc] :: Settings -> {-# UNPACK #-} !PlatformMisc
+ Development.IDE.GHC.Compat: [sRawSettings] :: Settings -> [(String, String)]
+ Development.IDE.GHC.Compat: [sTargetPlatform] :: Settings -> Platform
+ Development.IDE.GHC.Compat: [sToolSettings] :: Settings -> {-# UNPACK #-} !ToolSettings
+ Development.IDE.GHC.Compat: [staticPlugins] :: DynFlags -> [StaticPlugin]
+ Development.IDE.GHC.Compat: [switchWeight] :: CfgWeights -> Int
+ Development.IDE.GHC.Compat: [targetPlatform] :: DynFlags -> Platform
+ Development.IDE.GHC.Compat: [toolSettings] :: DynFlags -> {-# UNPACK #-} !ToolSettings
+ Development.IDE.GHC.Compat: [uncondWeight] :: CfgWeights -> Int
+ Development.IDE.GHC.Compat: [unlikelyCondWeight] :: CfgWeights -> Int
+ Development.IDE.GHC.Compat: [xarg_app_arg_many] :: ApplicativeArg idL -> XApplicativeArgMany idL
+ Development.IDE.GHC.Compat: [xarg_app_arg_one] :: ApplicativeArg idL -> XApplicativeArgOne idL
+ Development.IDE.GHC.Compat: aP_STACK_SPLIM :: DynFlags -> Int
+ Development.IDE.GHC.Compat: addGlobalInclude :: IncludeSpecs -> [String] -> IncludeSpecs
+ Development.IDE.GHC.Compat: addPluginModuleName :: String -> DynFlags -> DynFlags
+ Development.IDE.GHC.Compat: addQuoteInclude :: IncludeSpecs -> [String] -> IncludeSpecs
+ Development.IDE.GHC.Compat: addWay' :: Way -> DynFlags -> DynFlags
+ Development.IDE.GHC.Compat: allNonDeprecatedFlags :: [String]
+ Development.IDE.GHC.Compat: bITMAP_BITS_SHIFT :: DynFlags -> Int
+ Development.IDE.GHC.Compat: bLOCKS_PER_MBLOCK :: DynFlags -> Int
+ Development.IDE.GHC.Compat: bLOCK_SIZE :: DynFlags -> Int
+ Development.IDE.GHC.Compat: bLOCK_SIZE_W :: DynFlags -> Int
+ Development.IDE.GHC.Compat: backendMaintainsCfg :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: cINT_SIZE :: DynFlags -> Int
+ Development.IDE.GHC.Compat: cL :: HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
+ Development.IDE.GHC.Compat: cLONG_LONG_SIZE :: DynFlags -> Int
+ Development.IDE.GHC.Compat: cLONG_SIZE :: DynFlags -> Int
+ Development.IDE.GHC.Compat: cONTROL_GROUP_CONST_291 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: canonicalizeHomeModule :: DynFlags -> ModuleName -> Module
+ Development.IDE.GHC.Compat: canonicalizeModuleIfHome :: DynFlags -> Module -> Module
+ Development.IDE.GHC.Compat: class ContainsDynFlags t
+ Development.IDE.GHC.Compat: class HasDynFlags (m :: Type -> Type)
+ Development.IDE.GHC.Compat: compilerInfo :: DynFlags -> [(String, String)]
+ Development.IDE.GHC.Compat: composeSrcSpan :: HasSrcSpan a => Located (SrcSpanLess a) -> a
+ Development.IDE.GHC.Compat: dL :: HasSrcSpan a => a -> Located (SrcSpanLess a)
+ Development.IDE.GHC.Compat: dOUBLE_SIZE :: DynFlags -> Int
+ Development.IDE.GHC.Compat: dYNAMIC_BY_DEFAULT :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: data AvailInfo
+ Development.IDE.GHC.Compat: data CfgWeights
+ Development.IDE.GHC.Compat: data CompilerInfo
+ Development.IDE.GHC.Compat: data DelayedSplice
+ Development.IDE.GHC.Compat: data DumpFlag
+ Development.IDE.GHC.Compat: data DynLibLoader
+ Development.IDE.GHC.Compat: data FileSettings
+ Development.IDE.GHC.Compat: data FilesToClean
+ Development.IDE.GHC.Compat: data FlagSpec flag
+ Development.IDE.GHC.Compat: data ForallVisFlag
+ Development.IDE.GHC.Compat: data GhcNameVersion
+ Development.IDE.GHC.Compat: data HsArg tm ty
+ Development.IDE.GHC.Compat: data ImportDeclQualifiedStyle
+ Development.IDE.GHC.Compat: data IncludeSpecs
+ Development.IDE.GHC.Compat: data IntegerLibrary
+ Development.IDE.GHC.Compat: data Language
+ Development.IDE.GHC.Compat: data LinkerInfo
+ Development.IDE.GHC.Compat: data LlvmConfig
+ Development.IDE.GHC.Compat: data LlvmTarget
+ Development.IDE.GHC.Compat: data ModIface_ (phase :: ModIfacePhase)
+ Development.IDE.GHC.Compat: data ModRenaming
+ Development.IDE.GHC.Compat: data NoExtCon
+ Development.IDE.GHC.Compat: data NoExtField
+ Development.IDE.GHC.Compat: data Option
+ Development.IDE.GHC.Compat: data PackageArg
+ Development.IDE.GHC.Compat: data PackageDBFlag
+ Development.IDE.GHC.Compat: data PackageFlag
+ Development.IDE.GHC.Compat: data PatSynBind idL idR
+ Development.IDE.GHC.Compat: data PkgConfRef
+ Development.IDE.GHC.Compat: data PlatformConstants
+ Development.IDE.GHC.Compat: data PlatformMisc
+ Development.IDE.GHC.Compat: data ProfAuto
+ Development.IDE.GHC.Compat: data RtsOptsEnabled
+ Development.IDE.GHC.Compat: data Settings
+ Development.IDE.GHC.Compat: data StandaloneKindSig pass
+ Development.IDE.GHC.Compat: data TrustFlag
+ Development.IDE.GHC.Compat: data WarnReason
+ Development.IDE.GHC.Compat: data WarningFlag
+ Development.IDE.GHC.Compat: data Way
+ Development.IDE.GHC.Compat: decomposeSrcSpan :: HasSrcSpan a => a -> Located (SrcSpanLess a)
+ Development.IDE.GHC.Compat: defaultDynFlags :: Settings -> LlvmConfig -> DynFlags
+ Development.IDE.GHC.Compat: defaultFatalMessager :: FatalMessager
+ Development.IDE.GHC.Compat: defaultFlushErr :: FlushErr
+ Development.IDE.GHC.Compat: defaultFlushOut :: FlushOut
+ Development.IDE.GHC.Compat: defaultLogAction :: LogAction
+ Development.IDE.GHC.Compat: defaultLogActionHPrintDoc :: DynFlags -> Handle -> SDoc -> PprStyle -> IO ()
+ Development.IDE.GHC.Compat: defaultLogActionHPutStrDoc :: DynFlags -> Handle -> SDoc -> PprStyle -> IO ()
+ Development.IDE.GHC.Compat: defaultWays :: Settings -> [Way]
+ Development.IDE.GHC.Compat: dopt :: DumpFlag -> DynFlags -> Bool
+ Development.IDE.GHC.Compat: dopt_set :: DynFlags -> DumpFlag -> DynFlags
+ Development.IDE.GHC.Compat: dopt_unset :: DynFlags -> DumpFlag -> DynFlags
+ Development.IDE.GHC.Compat: dynFlagDependencies :: DynFlags -> [ModuleName]
+ Development.IDE.GHC.Compat: dynamicGhc :: Bool
+ Development.IDE.GHC.Compat: dynamicOutputFile :: DynFlags -> FilePath -> FilePath
+ Development.IDE.GHC.Compat: dynamicTooMkDynamicDynFlags :: DynFlags -> DynFlags
+ Development.IDE.GHC.Compat: emptyFilesToClean :: FilesToClean
+ Development.IDE.GHC.Compat: enrichHie :: TypecheckedSource -> RenamedSource -> Hsc (HieASTs Type)
+ Development.IDE.GHC.Compat: execStmt' :: GhcMonad m => GhciLStmt GhcPs -> String -> ExecOptions -> m ExecResult
+ Development.IDE.GHC.Compat: extraGccViaCFlags :: DynFlags -> [String]
+ Development.IDE.GHC.Compat: extractDynFlags :: ContainsDynFlags t => t -> DynFlags
+ Development.IDE.GHC.Compat: fFlags :: [FlagSpec GeneralFlag]
+ Development.IDE.GHC.Compat: fLangFlags :: [FlagSpec Extension]
+ Development.IDE.GHC.Compat: famResultKindSignature :: forall (p :: Pass). FamilyResultSig (GhcPass p) -> Maybe (LHsKind (GhcPass p))
+ Development.IDE.GHC.Compat: familyDeclLName :: forall (p :: Pass). FamilyDecl (GhcPass p) -> Located (IdP (GhcPass p))
+ Development.IDE.GHC.Compat: familyDeclName :: forall (p :: Pass). FamilyDecl (GhcPass p) -> IdP (GhcPass p)
+ Development.IDE.GHC.Compat: flagsAll :: [Flag (CmdLineP DynFlags)]
+ Development.IDE.GHC.Compat: flagsDynamic :: [Flag (CmdLineP DynFlags)]
+ Development.IDE.GHC.Compat: flagsForCompletion :: Bool -> [String]
+ Development.IDE.GHC.Compat: flagsPackage :: [Flag (CmdLineP DynFlags)]
+ Development.IDE.GHC.Compat: flattenIncludes :: IncludeSpecs -> [String]
+ Development.IDE.GHC.Compat: foldDerivStrategy :: forall p (pass :: Pass) r. p ~ GhcPass pass => r -> (XViaStrategy p -> r) -> DerivStrategy p -> r
+ Development.IDE.GHC.Compat: getDynFlags :: HasDynFlags m => m DynFlags
+ Development.IDE.GHC.Compat: getInstancesForType :: GhcMonad m => Type -> m [ClsInst]
+ Development.IDE.GHC.Compat: getOpts :: DynFlags -> (DynFlags -> [a]) -> [a]
+ Development.IDE.GHC.Compat: getRealSrcSpan :: RealLocated a -> RealSrcSpan
+ Development.IDE.GHC.Compat: getVerbFlags :: DynFlags -> [String]
+ Development.IDE.GHC.Compat: ghcUsagePath :: DynFlags -> FilePath
+ Development.IDE.GHC.Compat: ghciUsagePath :: DynFlags -> FilePath
+ Development.IDE.GHC.Compat: glasgowExtsFlags :: [Extension]
+ Development.IDE.GHC.Compat: gopt_set :: DynFlags -> GeneralFlag -> DynFlags
+ Development.IDE.GHC.Compat: gopt_unset :: DynFlags -> GeneralFlag -> DynFlags
+ Development.IDE.GHC.Compat: hasNoDebugOutput :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: hasNoOptCoercion :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: hasNoStateHack :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: hasPprDebug :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: hsConDetailsArgs :: HsConDetails (LHsType a) (Located [LConDeclField a]) -> [LHsType a]
+ Development.IDE.GHC.Compat: hsLTyVarNames :: forall (p :: Pass). [LHsTyVarBndr (GhcPass p)] -> [IdP (GhcPass p)]
+ Development.IDE.GHC.Compat: hsTyKindSig :: LHsType pass -> Maybe (LHsKind pass)
+ Development.IDE.GHC.Compat: iLDV_CREATE_MASK :: DynFlags -> Integer
+ Development.IDE.GHC.Compat: iLDV_STATE_CREATE :: DynFlags -> Integer
+ Development.IDE.GHC.Compat: iLDV_STATE_USE :: DynFlags -> Integer
+ Development.IDE.GHC.Compat: ifGeneratingDynamicToo :: MonadIO m => DynFlags -> m a -> m a -> m a
+ Development.IDE.GHC.Compat: importDeclQualifiedStyle :: Maybe (Located a) -> Maybe (Located a) -> ImportDeclQualifiedStyle
+ Development.IDE.GHC.Compat: initDynFlags :: DynFlags -> IO DynFlags
+ Development.IDE.GHC.Compat: interpWays :: [Way]
+ Development.IDE.GHC.Compat: interpreterDynamic :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: interpreterProfiled :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: isAvx2Enabled :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: isAvx512cdEnabled :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: isAvx512erEnabled :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: isAvx512fEnabled :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: isAvx512pfEnabled :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: isAvxEnabled :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: isBmi2Enabled :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: isBmiEnabled :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: isComprehensionContext :: HsStmtContext id -> Bool
+ Development.IDE.GHC.Compat: isImportDeclQualified :: ImportDeclQualifiedStyle -> Bool
+ Development.IDE.GHC.Compat: isMonadCompContext :: HsStmtContext id -> Bool
+ Development.IDE.GHC.Compat: isNoLink :: GhcLink -> Bool
+ Development.IDE.GHC.Compat: isObjectTarget :: HscTarget -> Bool
+ Development.IDE.GHC.Compat: isOneShot :: GhcMode -> Bool
+ Development.IDE.GHC.Compat: isSse2Enabled :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: isSse4_2Enabled :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: isSseEnabled :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: lDV_SHIFT :: DynFlags -> Int
+ Development.IDE.GHC.Compat: lang_set :: DynFlags -> Maybe Language -> DynFlags
+ Development.IDE.GHC.Compat: languageExtensions :: Maybe Language -> [Extension]
+ Development.IDE.GHC.Compat: lieWrappedName :: LIEWrappedName name -> name
+ Development.IDE.GHC.Compat: mAX_CHARLIKE :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mAX_Double_REG :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mAX_Float_REG :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mAX_INTLIKE :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mAX_Long_REG :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mAX_PTR_TAG :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mAX_Real_Double_REG :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mAX_Real_Float_REG :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mAX_Real_Long_REG :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mAX_Real_Vanilla_REG :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mAX_Real_XMM_REG :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mAX_SPEC_AP_SIZE :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mAX_SPEC_SELECTEE_SIZE :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mAX_Vanilla_REG :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mAX_XMM_REG :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mIN_CHARLIKE :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mIN_INTLIKE :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mIN_PAYLOAD_SIZE :: DynFlags -> Int
+ Development.IDE.GHC.Compat: mUT_ARR_PTRS_CARD_BITS :: DynFlags -> Int
+ Development.IDE.GHC.Compat: makeDynFlagsConsistent :: DynFlags -> (DynFlags, [Located String])
+ Development.IDE.GHC.Compat: mapDerivStrategy :: forall p (pass :: Pass). p ~ GhcPass pass => (XViaStrategy p -> XViaStrategy p) -> DerivStrategy p -> DerivStrategy p
+ Development.IDE.GHC.Compat: mkBuildTag :: [Way] -> String
+ Development.IDE.GHC.Compat: mkHieFile' :: ModSummary -> [AvailInfo] -> HieASTs Type -> ByteString -> Hsc HieFile
+ Development.IDE.GHC.Compat: mkHsAppKindTy :: forall (p :: Pass). XAppKindTy (GhcPass p) -> LHsType (GhcPass p) -> LHsType (GhcPass p) -> LHsType (GhcPass p)
+ Development.IDE.GHC.Compat: mkHsCmdIf :: forall (p :: Pass). LHsExpr (GhcPass p) -> LHsCmd (GhcPass p) -> LHsCmd (GhcPass p) -> HsCmd (GhcPass p)
+ Development.IDE.GHC.Compat: mkSimpleGeneratedFunBind :: SrcSpan -> RdrName -> [LPat GhcPs] -> LHsExpr GhcPs -> LHsBind GhcPs
+ Development.IDE.GHC.Compat: mkSyntaxExpr :: forall (p :: Pass). HsExpr (GhcPass p) -> SyntaxExpr (GhcPass p)
+ Development.IDE.GHC.Compat: mkTypedSplice :: SpliceDecoration -> LHsExpr GhcPs -> HsSplice GhcPs
+ Development.IDE.GHC.Compat: modInfoRdrEnv :: ModuleInfo -> Maybe GlobalRdrEnv
+ Development.IDE.GHC.Compat: newtype FlushErr
+ Development.IDE.GHC.Compat: newtype FlushOut
+ Development.IDE.GHC.Compat: newtype IgnorePackageFlag
+ Development.IDE.GHC.Compat: nlHsAppKindTy :: forall (p :: Pass). LHsType (GhcPass p) -> LHsKind (GhcPass p) -> LHsType (GhcPass p)
+ Development.IDE.GHC.Compat: noExtCon :: NoExtCon -> a
+ Development.IDE.GHC.Compat: noExtField :: NoExtField
+ Development.IDE.GHC.Compat: noLHsContext :: LHsContext pass
+ Development.IDE.GHC.Compat: numVisibleArgs :: [HsArg tm ty] -> Arity
+ Development.IDE.GHC.Compat: oFFSET_Capability_r :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_CostCentreStack_mem_alloc :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_CostCentreStack_scc_count :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgArrBytes_bytes :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgEntCounter_allocd :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgEntCounter_allocs :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgEntCounter_entry_count :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgEntCounter_link :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgEntCounter_registeredp :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgFunInfoExtraFwd_arity :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgFunInfoExtraRev_arity :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgHeader_ccs :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgHeader_ldvw :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgMutArrPtrs_ptrs :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgMutArrPtrs_size :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rCCCS :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rCurrentNursery :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rCurrentTSO :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rD1 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rD2 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rD3 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rD4 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rD5 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rD6 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rF1 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rF2 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rF3 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rF4 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rF5 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rF6 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rHp :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rHpAlloc :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rHpLim :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rL1 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rR1 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rR10 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rR2 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rR3 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rR4 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rR5 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rR6 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rR7 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rR8 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rR9 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rSp :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rSpLim :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rXMM1 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rXMM2 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rXMM3 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rXMM4 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rXMM5 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rXMM6 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rYMM1 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rYMM2 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rYMM3 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rYMM4 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rYMM5 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rYMM6 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rZMM1 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rZMM2 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rZMM3 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rZMM4 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rZMM5 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgRegTable_rZMM6 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgSmallMutArrPtrs_ptrs :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgStack_sp :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgStack_stack :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgTSO_alloc_limit :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgTSO_cccs :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgTSO_stackobj :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_StgUpdateFrame_updatee :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_bdescr_blocks :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_bdescr_flags :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_bdescr_free :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_bdescr_start :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_stgEagerBlackholeInfo :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_stgGCEnter1 :: DynFlags -> Int
+ Development.IDE.GHC.Compat: oFFSET_stgGCFun :: DynFlags -> Int
+ Development.IDE.GHC.Compat: opt_F :: DynFlags -> [String]
+ Development.IDE.GHC.Compat: opt_L :: DynFlags -> [String]
+ Development.IDE.GHC.Compat: opt_P :: DynFlags -> [String]
+ Development.IDE.GHC.Compat: opt_P_signature :: DynFlags -> ([String], Fingerprint)
+ Development.IDE.GHC.Compat: opt_a :: DynFlags -> [String]
+ Development.IDE.GHC.Compat: opt_c :: DynFlags -> [String]
+ Development.IDE.GHC.Compat: opt_cxx :: DynFlags -> [String]
+ Development.IDE.GHC.Compat: opt_i :: DynFlags -> [String]
+ Development.IDE.GHC.Compat: opt_l :: DynFlags -> [String]
+ Development.IDE.GHC.Compat: opt_lc :: DynFlags -> [String]
+ Development.IDE.GHC.Compat: opt_lcc :: DynFlags -> [String]
+ Development.IDE.GHC.Compat: opt_lm :: DynFlags -> [String]
+ Development.IDE.GHC.Compat: opt_lo :: DynFlags -> [String]
+ Development.IDE.GHC.Compat: opt_windres :: DynFlags -> [String]
+ Development.IDE.GHC.Compat: optimisationFlags :: EnumSet GeneralFlag
+ Development.IDE.GHC.Compat: pROF_HDR_SIZE :: DynFlags -> Int
+ Development.IDE.GHC.Compat: packageFlagsChanged :: DynFlags -> DynFlags -> Bool
+ Development.IDE.GHC.Compat: packageTrustOn :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: parenthesizeHsContext :: forall (p :: Pass). PprPrec -> LHsContext (GhcPass p) -> LHsContext (GhcPass p)
+ Development.IDE.GHC.Compat: parseDynamicFilePragma :: MonadIO m => DynFlags -> [Located String] -> m (DynFlags, [Located String], [Warn])
+ Development.IDE.GHC.Compat: parseDynamicFlagsCmdLine :: MonadIO m => DynFlags -> [Located String] -> m (DynFlags, [Located String], [Warn])
+ Development.IDE.GHC.Compat: parseDynamicFlagsFull :: MonadIO m => [Flag (CmdLineP DynFlags)] -> Bool -> DynFlags -> [Located String] -> m (DynFlags, [Located String], [Warn])
+ Development.IDE.GHC.Compat: parseInstanceHead :: GhcMonad m => String -> m Type
+ Development.IDE.GHC.Compat: pattern ExposePackage :: String -> PackageArg -> ModRenaming -> PackageFlag
+ Development.IDE.GHC.Compat: pgm_F :: DynFlags -> String
+ Development.IDE.GHC.Compat: pgm_L :: DynFlags -> String
+ Development.IDE.GHC.Compat: pgm_P :: DynFlags -> (String, [Option])
+ Development.IDE.GHC.Compat: pgm_T :: DynFlags -> String
+ Development.IDE.GHC.Compat: pgm_a :: DynFlags -> (String, [Option])
+ Development.IDE.GHC.Compat: pgm_ar :: DynFlags -> String
+ Development.IDE.GHC.Compat: pgm_c :: DynFlags -> String
+ Development.IDE.GHC.Compat: pgm_dll :: DynFlags -> (String, [Option])
+ Development.IDE.GHC.Compat: pgm_i :: DynFlags -> String
+ Development.IDE.GHC.Compat: pgm_l :: DynFlags -> (String, [Option])
+ Development.IDE.GHC.Compat: pgm_lc :: DynFlags -> (String, [Option])
+ Development.IDE.GHC.Compat: pgm_lcc :: DynFlags -> (String, [Option])
+ Development.IDE.GHC.Compat: pgm_libtool :: DynFlags -> String
+ Development.IDE.GHC.Compat: pgm_lm :: DynFlags -> (String, [Option])
+ Development.IDE.GHC.Compat: pgm_lo :: DynFlags -> (String, [Option])
+ Development.IDE.GHC.Compat: pgm_ranlib :: DynFlags -> String
+ Development.IDE.GHC.Compat: pgm_windres :: DynFlags -> String
+ Development.IDE.GHC.Compat: picCCOpts :: DynFlags -> [String]
+ Development.IDE.GHC.Compat: picPOpts :: DynFlags -> [String]
+ Development.IDE.GHC.Compat: positionIndependent :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: pprArg :: forall (idL :: Pass). OutputableBndrId idL => ApplicativeArg (GhcPass idL) -> SDoc
+ Development.IDE.GHC.Compat: pprHsExplicitForAll :: forall (p :: Pass). OutputableBndrId p => ForallVisFlag -> Maybe [LHsTyVarBndr (GhcPass p)] -> SDoc
+ Development.IDE.GHC.Compat: pprHsFamInstLHS :: forall (p :: Pass). OutputableBndrId p => IdP (GhcPass p) -> Maybe [LHsTyVarBndr (GhcPass p)] -> HsTyPats (GhcPass p) -> LexicalFixity -> LHsContext (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprLHsContext :: forall (p :: Pass). OutputableBndrId p => LHsContext (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprTyFamInstDecl :: forall (p :: Pass). OutputableBndrId p => TopLevelFlag -> TyFamInstDecl (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: ppr_infix_expr :: forall (p :: Pass). OutputableBndrId p => HsExpr (GhcPass p) -> Maybe SDoc
+ Development.IDE.GHC.Compat: programName :: DynFlags -> String
+ Development.IDE.GHC.Compat: projectVersion :: DynFlags -> String
+ Development.IDE.GHC.Compat: putLogMsg :: DynFlags -> WarnReason -> Severity -> SrcSpan -> PprStyle -> MsgDoc -> IO ()
+ Development.IDE.GHC.Compat: rESERVED_C_STACK_BYTES :: DynFlags -> Int
+ Development.IDE.GHC.Compat: rESERVED_STACK_WORDS :: DynFlags -> Int
+ Development.IDE.GHC.Compat: rtsIsProfiled :: Bool
+ Development.IDE.GHC.Compat: runParsedDecls :: GhcMonad m => [LHsDecl GhcPs] -> m [Name]
+ Development.IDE.GHC.Compat: sExtraGccViaCFlags :: Settings -> [String]
+ Development.IDE.GHC.Compat: sGccSupportsNoPie :: Settings -> Bool
+ Development.IDE.GHC.Compat: sGhcDebugged :: Settings -> Bool
+ Development.IDE.GHC.Compat: sGhcRTSWays :: Settings -> String
+ Development.IDE.GHC.Compat: sGhcRtsWithLibdw :: Settings -> Bool
+ Development.IDE.GHC.Compat: sGhcThreaded :: Settings -> Bool
+ Development.IDE.GHC.Compat: sGhcUsagePath :: Settings -> FilePath
+ Development.IDE.GHC.Compat: sGhcWithInterpreter :: Settings -> Bool
+ Development.IDE.GHC.Compat: sGhcWithNativeCodeGen :: Settings -> Bool
+ Development.IDE.GHC.Compat: sGhcWithSMP :: Settings -> Bool
+ Development.IDE.GHC.Compat: sGhciUsagePath :: Settings -> FilePath
+ Development.IDE.GHC.Compat: sIZEOF_CostCentreStack :: DynFlags -> Int
+ Development.IDE.GHC.Compat: sIZEOF_StgArrBytes_NoHdr :: DynFlags -> Int
+ Development.IDE.GHC.Compat: sIZEOF_StgFunInfoExtraRev :: DynFlags -> Int
+ Development.IDE.GHC.Compat: sIZEOF_StgMutArrPtrs_NoHdr :: DynFlags -> Int
+ Development.IDE.GHC.Compat: sIZEOF_StgSMPThunkHeader :: DynFlags -> Int
+ Development.IDE.GHC.Compat: sIZEOF_StgSmallMutArrPtrs_NoHdr :: DynFlags -> Int
+ Development.IDE.GHC.Compat: sIZEOF_StgUpdateFrame_NoHdr :: DynFlags -> Int
+ Development.IDE.GHC.Compat: sIntegerLibrary :: Settings -> String
+ Development.IDE.GHC.Compat: sIntegerLibraryType :: Settings -> IntegerLibrary
+ Development.IDE.GHC.Compat: sLdIsGnuLd :: Settings -> Bool
+ Development.IDE.GHC.Compat: sLdSupportsBuildId :: Settings -> Bool
+ Development.IDE.GHC.Compat: sLdSupportsCompactUnwind :: Settings -> Bool
+ Development.IDE.GHC.Compat: sLdSupportsFilelist :: Settings -> Bool
+ Development.IDE.GHC.Compat: sLeadingUnderscore :: Settings -> Bool
+ Development.IDE.GHC.Compat: sLibFFI :: Settings -> Bool
+ Development.IDE.GHC.Compat: sOpt_F :: Settings -> [String]
+ Development.IDE.GHC.Compat: sOpt_L :: Settings -> [String]
+ Development.IDE.GHC.Compat: sOpt_P :: Settings -> [String]
+ Development.IDE.GHC.Compat: sOpt_P_fingerprint :: Settings -> Fingerprint
+ Development.IDE.GHC.Compat: sOpt_a :: Settings -> [String]
+ Development.IDE.GHC.Compat: sOpt_c :: Settings -> [String]
+ Development.IDE.GHC.Compat: sOpt_cxx :: Settings -> [String]
+ Development.IDE.GHC.Compat: sOpt_i :: Settings -> [String]
+ Development.IDE.GHC.Compat: sOpt_l :: Settings -> [String]
+ Development.IDE.GHC.Compat: sOpt_lc :: Settings -> [String]
+ Development.IDE.GHC.Compat: sOpt_lcc :: Settings -> [String]
+ Development.IDE.GHC.Compat: sOpt_lm :: Settings -> [String]
+ Development.IDE.GHC.Compat: sOpt_lo :: Settings -> [String]
+ Development.IDE.GHC.Compat: sOpt_windres :: Settings -> [String]
+ Development.IDE.GHC.Compat: sPgm_F :: Settings -> String
+ Development.IDE.GHC.Compat: sPgm_L :: Settings -> String
+ Development.IDE.GHC.Compat: sPgm_P :: Settings -> (String, [Option])
+ Development.IDE.GHC.Compat: sPgm_T :: Settings -> String
+ Development.IDE.GHC.Compat: sPgm_a :: Settings -> (String, [Option])
+ Development.IDE.GHC.Compat: sPgm_ar :: Settings -> String
+ Development.IDE.GHC.Compat: sPgm_c :: Settings -> String
+ Development.IDE.GHC.Compat: sPgm_dll :: Settings -> (String, [Option])
+ Development.IDE.GHC.Compat: sPgm_i :: Settings -> String
+ Development.IDE.GHC.Compat: sPgm_l :: Settings -> (String, [Option])
+ Development.IDE.GHC.Compat: sPgm_lc :: Settings -> (String, [Option])
+ Development.IDE.GHC.Compat: sPgm_lcc :: Settings -> (String, [Option])
+ Development.IDE.GHC.Compat: sPgm_libtool :: Settings -> String
+ Development.IDE.GHC.Compat: sPgm_lm :: Settings -> (String, [Option])
+ Development.IDE.GHC.Compat: sPgm_lo :: Settings -> (String, [Option])
+ Development.IDE.GHC.Compat: sPgm_ranlib :: Settings -> String
+ Development.IDE.GHC.Compat: sPgm_windres :: Settings -> String
+ Development.IDE.GHC.Compat: sProgramName :: Settings -> String
+ Development.IDE.GHC.Compat: sProjectVersion :: Settings -> String
+ Development.IDE.GHC.Compat: sSystemPackageConfig :: Settings -> FilePath
+ Development.IDE.GHC.Compat: sTD_HDR_SIZE :: DynFlags -> Int
+ Development.IDE.GHC.Compat: sTablesNextToCode :: Settings -> Bool
+ Development.IDE.GHC.Compat: sTargetPlatformString :: Settings -> String
+ Development.IDE.GHC.Compat: sTmpDir :: Settings -> String
+ Development.IDE.GHC.Compat: sToolDir :: Settings -> Maybe FilePath
+ Development.IDE.GHC.Compat: sTopDir :: Settings -> FilePath
+ Development.IDE.GHC.Compat: safeDirectImpsReq :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: safeHaskellModeEnabled :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: safeHaskellOn :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: safeImplicitImpsReq :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: safeImportsOn :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: safeInferOn :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: safeLanguageOn :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: setFlagsFromEnvFile :: FilePath -> String -> DynP ()
+ Development.IDE.GHC.Compat: setGeneralFlag' :: GeneralFlag -> DynFlags -> DynFlags
+ Development.IDE.GHC.Compat: setTmpDir :: FilePath -> DynFlags -> DynFlags
+ Development.IDE.GHC.Compat: setUnitId :: String -> DynFlags -> DynFlags
+ Development.IDE.GHC.Compat: setUnsafeGlobalDynFlags :: DynFlags -> IO ()
+ Development.IDE.GHC.Compat: settings :: DynFlags -> Settings
+ Development.IDE.GHC.Compat: shouldUseColor :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: shouldUseHexWordLiterals :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: showOpt :: Option -> String
+ Development.IDE.GHC.Compat: splitLHsForAllTyInvis :: LHsType pass -> ([LHsTyVarBndr pass], LHsType pass)
+ Development.IDE.GHC.Compat: splitLHsSigmaTyInvis :: LHsType pass -> ([LHsTyVarBndr pass], LHsContext pass, LHsType pass)
+ Development.IDE.GHC.Compat: standaloneKindSigName :: forall (p :: Pass). StandaloneKindSig (GhcPass p) -> IdP (GhcPass p)
+ Development.IDE.GHC.Compat: supportedLanguagesAndExtensions :: PlatformMini -> [String]
+ Development.IDE.GHC.Compat: systemPackageConfig :: DynFlags -> FilePath
+ Development.IDE.GHC.Compat: tAG_BITS :: DynFlags -> Int
+ Development.IDE.GHC.Compat: tAG_MASK :: DynFlags -> Int
+ Development.IDE.GHC.Compat: tARGET_MAX_INT :: DynFlags -> Integer
+ Development.IDE.GHC.Compat: tARGET_MAX_WORD :: DynFlags -> Integer
+ Development.IDE.GHC.Compat: tARGET_MIN_INT :: DynFlags -> Integer
+ Development.IDE.GHC.Compat: tICKY_BIN_COUNT :: DynFlags -> Int
+ Development.IDE.GHC.Compat: tablesNextToCode :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: targetRetainsAllBindings :: HscTarget -> Bool
+ Development.IDE.GHC.Compat: tcg_exports :: TcGblEnv -> [AvailInfo]
+ Development.IDE.GHC.Compat: thisComponentId :: DynFlags -> ComponentId
+ Development.IDE.GHC.Compat: thisPackage :: DynFlags -> UnitId
+ Development.IDE.GHC.Compat: thisUnitIdInsts :: DynFlags -> [(ModuleName, Module)]
+ Development.IDE.GHC.Compat: tmpDir :: DynFlags -> String
+ Development.IDE.GHC.Compat: topDir :: DynFlags -> FilePath
+ Development.IDE.GHC.Compat: tyClGroupKindSigs :: [TyClGroup pass] -> [LStandaloneKindSig pass]
+ Development.IDE.GHC.Compat: type FatalMessager = String -> IO ()
+ Development.IDE.GHC.Compat: type HasSrcSpan = HasSrcSpan
+ Development.IDE.GHC.Compat: type HsValBinds id = HsValBindsLR id id
+ Development.IDE.GHC.Compat: type LHsFunDep pass = Located FunDep Located IdP pass
+ Development.IDE.GHC.Compat: type LHsTypeArg p = HsArg LHsType p LHsKind p
+ Development.IDE.GHC.Compat: type LStandaloneKindSig pass = Located StandaloneKindSig pass
+ Development.IDE.GHC.Compat: type LTyFamDefltDecl pass = Located TyFamDefltDecl pass
+ Development.IDE.GHC.Compat: type LogAction = DynFlags -> WarnReason -> Severity -> SrcSpan -> PprStyle -> MsgDoc -> IO ()
+ Development.IDE.GHC.Compat: type ModIface = ModIface_ 'ModIfaceFinal
+ Development.IDE.GHC.Compat: type RefMap = Map Identifier [(Span, IdentifierDetails Type)]
+ Development.IDE.GHC.Compat: type TyFamDefltDecl = TyFamInstDecl
+ Development.IDE.GHC.Compat: unRealSrcSpan :: RealLocated a -> a
+ Development.IDE.GHC.Compat: unSetGeneralFlag' :: GeneralFlag -> DynFlags -> DynFlags
+ Development.IDE.GHC.Compat: unsafeFlags :: [(String, DynFlags -> SrcSpan, DynFlags -> Bool, DynFlags -> DynFlags)]
+ Development.IDE.GHC.Compat: unsafeFlagsForInfer :: [(String, DynFlags -> SrcSpan, DynFlags -> Bool, DynFlags -> DynFlags)]
+ Development.IDE.GHC.Compat: unsafeGlobalDynFlags :: DynFlags
+ Development.IDE.GHC.Compat: updOptLevel :: Int -> DynFlags -> DynFlags
+ Development.IDE.GHC.Compat: updateWays :: DynFlags -> DynFlags
+ Development.IDE.GHC.Compat: useStarIsType :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: useUnicodeSyntax :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: versionedAppDir :: DynFlags -> MaybeT IO FilePath
+ Development.IDE.GHC.Compat: versionedFilePath :: DynFlags -> FilePath
+ Development.IDE.GHC.Compat: wORDS_BIGENDIAN :: DynFlags -> Bool
+ Development.IDE.GHC.Compat: wORD_SIZE :: DynFlags -> Int
+ Development.IDE.GHC.Compat: wORD_SIZE_IN_BITS :: DynFlags -> Int
+ Development.IDE.GHC.Compat: wWarningFlags :: [FlagSpec WarningFlag]
+ Development.IDE.GHC.Compat: warningGroups :: [(String, [WarningFlag])]
+ Development.IDE.GHC.Compat: warningHierarchies :: [[String]]
+ Development.IDE.GHC.Compat: wayGeneralFlags :: Platform -> Way -> [GeneralFlag]
+ Development.IDE.GHC.Compat: wayRTSOnly :: Way -> Bool
+ Development.IDE.GHC.Compat: wayUnsetGeneralFlags :: Platform -> Way -> [GeneralFlag]
+ Development.IDE.GHC.Compat: whenCannotGenerateDynamicToo :: MonadIO m => DynFlags -> m () -> m ()
+ Development.IDE.GHC.Compat: whenGeneratingDynamicToo :: MonadIO m => DynFlags -> m () -> m ()
+ Development.IDE.GHC.Compat: wopt :: WarningFlag -> DynFlags -> Bool
+ Development.IDE.GHC.Compat: wopt_fatal :: WarningFlag -> DynFlags -> Bool
+ Development.IDE.GHC.Compat: wopt_set :: DynFlags -> WarningFlag -> DynFlags
+ Development.IDE.GHC.Compat: wopt_set_fatal :: DynFlags -> WarningFlag -> DynFlags
+ Development.IDE.GHC.Compat: wopt_unset :: DynFlags -> WarningFlag -> DynFlags
+ Development.IDE.GHC.Compat: wopt_unset_fatal :: DynFlags -> WarningFlag -> DynFlags
+ Development.IDE.GHC.Compat: wordAlignment :: DynFlags -> Alignment
+ Development.IDE.GHC.Compat: xFlags :: [FlagSpec Extension]
+ Development.IDE.GHC.Compat: xopt :: Extension -> DynFlags -> Bool
+ Development.IDE.GHC.Compat: xopt_set :: DynFlags -> Extension -> DynFlags
+ Development.IDE.GHC.Compat: xopt_set_unlessExplSpec :: Extension -> (DynFlags -> Extension -> DynFlags) -> DynFlags -> DynFlags
+ Development.IDE.GHC.Compat: xopt_unset :: DynFlags -> Extension -> DynFlags
+ Development.IDE.GHC.Error: realSrcLocToPosition :: RealSrcLoc -> Position
+ Development.IDE.GHC.Orphans: instance (Control.DeepSeq.NFData l, Control.DeepSeq.NFData e) => Control.DeepSeq.NFData (SrcLoc.GenLocated l e)
+ Development.IDE.GHC.Orphans: instance Control.DeepSeq.NFData (GHC.Hs.ImpExp.ImportDecl GHC.Hs.Extension.GhcPs)
+ Development.IDE.GHC.Orphans: instance Control.DeepSeq.NFData DynFlags.SafeHaskellMode
+ Development.IDE.GHC.Orphans: instance Control.DeepSeq.NFData GHC.CoreModule
+ Development.IDE.GHC.Orphans: instance Control.DeepSeq.NFData GHC.Hs.Doc.HsDocString
+ Development.IDE.GHC.Orphans: instance Control.DeepSeq.NFData GHC.ParsedModule
+ Development.IDE.GHC.Orphans: instance Control.DeepSeq.NFData HieTypes.HieFile
+ Development.IDE.GHC.Orphans: instance Control.DeepSeq.NFData HscTypes.CgGuts
+ Development.IDE.GHC.Orphans: instance Control.DeepSeq.NFData HscTypes.ModDetails
+ Development.IDE.GHC.Orphans: instance Control.DeepSeq.NFData HscTypes.ModGuts
+ Development.IDE.GHC.Orphans: instance Control.DeepSeq.NFData HscTypes.ModSummary
+ Development.IDE.GHC.Orphans: instance Control.DeepSeq.NFData HscTypes.SourceModified
+ Development.IDE.GHC.Orphans: instance Control.DeepSeq.NFData LinkerTypes.Linkable
+ Development.IDE.GHC.Orphans: instance Control.DeepSeq.NFData Module.InstalledUnitId
+ Development.IDE.GHC.Orphans: instance Control.DeepSeq.NFData SrcLoc.RealSrcSpan
+ Development.IDE.GHC.Orphans: instance Control.DeepSeq.NFData StringBuffer.StringBuffer
+ Development.IDE.GHC.Orphans: instance Control.DeepSeq.NFData TyCoRep.Type
+ Development.IDE.GHC.Orphans: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (HieTypes.IdentifierDetails a)
+ Development.IDE.GHC.Orphans: instance Data.Hashable.Class.Hashable Module.InstalledUnitId
+ Development.IDE.GHC.Orphans: instance Data.Hashable.Class.Hashable Module.ModuleName
+ Development.IDE.GHC.Orphans: instance GHC.Classes.Eq HscTypes.SourceModified
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show DynFlags.PackageFlag
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show GHC.CoreModule
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show GHC.ParsedModule
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show HieTypes.HieFile
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show HscTypes.CgGuts
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show HscTypes.InteractiveImport
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show HscTypes.ModDetails
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show HscTypes.ModGuts
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show HscTypes.ModSummary
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show HscTypes.SourceModified
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show LinkerTypes.Linkable
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show Module.ComponentId
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show Module.InstalledUnitId
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show Module.Module
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show Module.ModuleName
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show PackageConfig.PackageName
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show PackageConfig.SourcePackageId
+ Development.IDE.GHC.Orphans: instance GHC.Show.Show a => GHC.Show.Show (Bag.Bag a)
+ Development.IDE.GHC.Orphans: instance Outputable.Outputable a => GHC.Show.Show (SrcLoc.GenLocated SrcLoc.SrcSpan a)
+ Development.IDE.GHC.Util: newHscEnvEqWithImportPaths :: Maybe [String] -> HscEnv -> [(InstalledUnitId, DynFlags)] -> IO HscEnvEq
+ Development.IDE.Import.DependencyInformation: immediateReverseDependencies :: NormalizedFilePath -> DependencyInformation -> [NormalizedFilePath]
+ Development.IDE.Import.DependencyInformation: transitiveReverseDependencies :: NormalizedFilePath -> DependencyInformation -> [NormalizedFilePath]
+ Development.IDE.LSP.HoverDefinition: setHandlersDocHighlight :: PartialHandlers c
+ Development.IDE.Plugin.Test: WaitForShakeQueue :: TestRequest
+ Development.IDE.Spans.AtPoint: atPoint :: IdeOptions -> HieASTs Type -> DocAndKindMap -> Position -> Maybe (Maybe Range, [Text])
+ Development.IDE.Spans.AtPoint: documentHighlight :: Monad m => HieASTs Type -> RefMap -> Position -> MaybeT m [DocumentHighlight]
+ Development.IDE.Spans.AtPoint: gotoDefinition :: MonadIO m => (Module -> MaybeT m (HieFile, FilePath)) -> IdeOptions -> Map ModuleName NormalizedFilePath -> HieASTs Type -> Position -> MaybeT m Location
+ Development.IDE.Spans.AtPoint: gotoTypeDefinition :: MonadIO m => (Module -> MaybeT m (HieFile, FilePath)) -> IdeOptions -> HieASTs Type -> Position -> MaybeT m [Location]
+ Development.IDE.Spans.AtPoint: pointCommand :: HieASTs Type -> Position -> (HieAST Type -> a) -> [a]
+ Development.IDE.Spans.Common: instance Control.DeepSeq.NFData Development.IDE.Spans.Common.SpanDoc
+ Development.IDE.Spans.Common: instance Control.DeepSeq.NFData Development.IDE.Spans.Common.SpanDocUris
+ Development.IDE.Spans.Common: instance GHC.Generics.Generic Development.IDE.Spans.Common.SpanDoc
+ Development.IDE.Spans.Common: instance GHC.Generics.Generic Development.IDE.Spans.Common.SpanDocUris
+ Development.IDE.Spans.Common: showNameWithoutUniques :: Outputable a => a -> Text
+ Development.IDE.Spans.Common: type DocMap = NameEnv SpanDoc
+ Development.IDE.Spans.Common: type KindMap = NameEnv TyThing
+ Development.IDE.Spans.LocalBindings: bindings :: RefMap -> Bindings
+ Development.IDE.Spans.LocalBindings: data Bindings
+ Development.IDE.Spans.LocalBindings: getDefiningBindings :: Bindings -> RealSrcSpan -> [(Name, Maybe Type)]
+ Development.IDE.Spans.LocalBindings: getFuzzyDefiningBindings :: Bindings -> Position -> Position -> [(Name, Maybe Type)]
+ Development.IDE.Spans.LocalBindings: getFuzzyScope :: Bindings -> Position -> Position -> [(Name, Maybe Type)]
+ Development.IDE.Spans.LocalBindings: getLocalScope :: Bindings -> RealSrcSpan -> [(Name, Maybe Type)]
+ Development.IDE.Spans.LocalBindings: instance Control.DeepSeq.NFData Development.IDE.Spans.LocalBindings.Bindings
+ Development.IDE.Spans.LocalBindings: instance GHC.Base.Monoid Development.IDE.Spans.LocalBindings.Bindings
+ Development.IDE.Spans.LocalBindings: instance GHC.Base.Semigroup Development.IDE.Spans.LocalBindings.Bindings
+ Development.IDE.Spans.LocalBindings: instance GHC.Show.Show Development.IDE.Spans.LocalBindings.Bindings
+ Development.IDE.Types.Exports: createExportsMapMg :: [ModGuts] -> ExportsMap
+ Development.IDE.Types.Exports: createExportsMapTc :: [TcGblEnv] -> ExportsMap
- Development.IDE: HiFileResult :: !ModSummary -> !ModIface -> HiFileResult
+ Development.IDE: HiFileResult :: !ModSummary -> !HomeModInfo -> HiFileResult
- Development.IDE: IdeConfiguration :: HashSet NormalizedUri -> IdeConfiguration
+ Development.IDE: IdeConfiguration :: HashSet NormalizedUri -> Hashed (Maybe Value) -> IdeConfiguration
- Development.IDE: PFailed :: (DynFlags -> Messages) -> SrcSpan -> MsgDoc -> ParseResult a
+ Development.IDE: PFailed :: PState -> ParseResult a
- Development.IDE: TcModuleResult :: TypecheckedModule -> HomeModInfo -> !Bool -> TcModuleResult
+ Development.IDE: TcModuleResult :: ParsedModule -> RenamedSource -> TcGblEnv -> !Bool -> TcModuleResult
- Development.IDE: catchSrcErrors :: (HasDynFlags m, ExceptionMonad m) => Text -> m a -> m (Either [FileDiagnostic] a)
+ Development.IDE: catchSrcErrors :: DynFlags -> Text -> IO a -> IO (Either [FileDiagnostic] a)
- Development.IDE: type family RuleResult key :: Type
+ Development.IDE: type family RuleResult key
- Development.IDE.Core.IdeConfiguration: IdeConfiguration :: HashSet NormalizedUri -> IdeConfiguration
+ Development.IDE.Core.IdeConfiguration: IdeConfiguration :: HashSet NormalizedUri -> Hashed (Maybe Value) -> IdeConfiguration
- Development.IDE.Core.RuleTypes: HiFileResult :: !ModSummary -> !ModIface -> HiFileResult
+ Development.IDE.Core.RuleTypes: HiFileResult :: !ModSummary -> !HomeModInfo -> HiFileResult
- Development.IDE.Core.RuleTypes: TcModuleResult :: TypecheckedModule -> HomeModInfo -> !Bool -> TcModuleResult
+ Development.IDE.Core.RuleTypes: TcModuleResult :: ParsedModule -> RenamedSource -> TcGblEnv -> !Bool -> TcModuleResult
- Development.IDE.Core.Shake: type KnownTargets = HashMap ModuleName [NormalizedFilePath]
+ Development.IDE.Core.Shake: type KnownTargets = HashMap Target [NormalizedFilePath]
- Development.IDE.GHC.Compat: ApplicativeArgOne :: XApplicativeArgOne idL -> LPat idL -> LHsExpr idL -> Bool -> ApplicativeArg idL
+ Development.IDE.GHC.Compat: ApplicativeArgOne :: XApplicativeArgOne idL -> LPat idL -> LHsExpr idL -> Bool -> SyntaxExpr idL -> ApplicativeArg idL
- Development.IDE.GHC.Compat: ClassDecl :: XClassDecl pass -> LHsContext pass -> Located (IdP pass) -> LHsQTyVars pass -> LexicalFixity -> [Located (FunDep (Located (IdP pass)))] -> [LSig pass] -> LHsBinds pass -> [LFamilyDecl pass] -> [LTyFamDefltEqn pass] -> [LDocDecl] -> TyClDecl pass
+ Development.IDE.GHC.Compat: ClassDecl :: XClassDecl pass -> LHsContext pass -> Located (IdP pass) -> LHsQTyVars pass -> LexicalFixity -> [LHsFunDep pass] -> [LSig pass] -> LHsBinds pass -> [LFamilyDecl pass] -> [LTyFamDefltDecl pass] -> [LDocDecl] -> TyClDecl pass
- Development.IDE.GHC.Compat: DynFlags :: GhcMode -> GhcLink -> HscTarget -> Settings -> LlvmTargets -> LlvmPasses -> Int -> Int -> Int -> Int -> Int -> Int -> Maybe String -> Maybe String -> [Int] -> Maybe Int -> Bool -> Maybe Int -> Maybe Int -> Maybe Int -> Maybe Int -> Maybe Int -> Int -> Int -> Maybe Int -> Maybe Int -> Int -> Maybe Int -> Maybe Int -> Maybe Int -> Int -> [FilePath] -> Module -> Maybe String -> IntWithInf -> IntWithInf -> InstalledUnitId -> Maybe ComponentId -> Maybe [(ModuleName, Module)] -> [Way] -> String -> Maybe (String, Int) -> Maybe String -> Maybe String -> Maybe String -> Maybe String -> Maybe String -> String -> String -> String -> IORef Bool -> String -> String -> Maybe String -> Maybe String -> Maybe String -> DynLibLoader -> Maybe FilePath -> Maybe FilePath -> [Option] -> IncludeSpecs -> [String] -> [String] -> [String] -> Maybe String -> RtsOptsEnabled -> Bool -> String -> [ModuleName] -> [(ModuleName, String)] -> [String] -> [LoadedPlugin] -> Hooks -> FilePath -> Bool -> [ModuleName] -> [String] -> [PackageDBFlag] -> [IgnorePackageFlag] -> [PackageFlag] -> [PackageFlag] -> [TrustFlag] -> Maybe FilePath -> Maybe [(FilePath, [PackageConfig])] -> PackageState -> IORef FilesToClean -> IORef (Map FilePath FilePath) -> IORef Int -> IORef (Set FilePath) -> EnumSet DumpFlag -> EnumSet GeneralFlag -> EnumSet WarningFlag -> EnumSet WarningFlag -> Maybe Language -> SafeHaskellMode -> Bool -> Bool -> SrcSpan -> SrcSpan -> SrcSpan -> SrcSpan -> SrcSpan -> SrcSpan -> SrcSpan -> SrcSpan -> [OnOff Extension] -> EnumSet Extension -> Int -> Int -> Int -> Int -> Float -> Int -> Bool -> Int -> Int -> LogAction -> FlushOut -> FlushErr -> Maybe FilePath -> Maybe String -> [String] -> Int -> Int -> Bool -> OverridingBool -> Bool -> Scheme -> ProfAuto -> Maybe String -> IORef (ModuleEnv Int) -> Maybe SseVersion -> Maybe BmiVersion -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> IORef (Maybe LinkerInfo) -> IORef (Maybe CompilerInfo) -> Int -> Int -> Int -> Bool -> Maybe Int -> Int -> Int -> DynFlags
+ Development.IDE.GHC.Compat: DynFlags :: GhcMode -> GhcLink -> HscTarget -> {-# UNPACK #-} !GhcNameVersion -> {-# UNPACK #-} !FileSettings -> Platform -> {-# UNPACK #-} !ToolSettings -> {-# UNPACK #-} !PlatformMisc -> PlatformConstants -> [(String, String)] -> IntegerLibrary -> LlvmConfig -> Int -> Int -> Int -> Int -> Int -> Maybe String -> Maybe String -> [Int] -> Maybe Int -> Bool -> Maybe Int -> Maybe Int -> Maybe Int -> Maybe Int -> Maybe Int -> Int -> Int -> Int -> Maybe Int -> Maybe Int -> Int -> Word -> Maybe Int -> Maybe Int -> Maybe Int -> Maybe Int -> Bool -> Maybe Int -> Int -> [FilePath] -> Module -> Maybe String -> IntWithInf -> IntWithInf -> InstalledUnitId -> Maybe ComponentId -> Maybe [(ModuleName, Module)] -> [Way] -> String -> Maybe (String, Int) -> Maybe String -> Maybe String -> Maybe String -> Maybe String -> Maybe String -> Maybe String -> String -> String -> String -> String -> IORef Bool -> String -> String -> Maybe String -> Maybe String -> Maybe String -> DynLibLoader -> Maybe FilePath -> Maybe FilePath -> [Option] -> IncludeSpecs -> [String] -> [String] -> [String] -> Maybe String -> RtsOptsEnabled -> Bool -> String -> [ModuleName] -> [(ModuleName, String)] -> [String] -> [LoadedPlugin] -> [StaticPlugin] -> Hooks -> FilePath -> Bool -> Bool -> [ModuleName] -> [String] -> [PackageDBFlag] -> [IgnorePackageFlag] -> [PackageFlag] -> [PackageFlag] -> [TrustFlag] -> Maybe FilePath -> Maybe [(FilePath, [PackageConfig])] -> PackageState -> IORef FilesToClean -> IORef (Map FilePath FilePath) -> IORef Int -> IORef (Set FilePath) -> EnumSet DumpFlag -> EnumSet GeneralFlag -> EnumSet WarningFlag -> EnumSet WarningFlag -> Maybe Language -> SafeHaskellMode -> Bool -> Bool -> SrcSpan -> SrcSpan -> SrcSpan -> SrcSpan -> SrcSpan -> SrcSpan -> SrcSpan -> SrcSpan -> [OnOff Extension] -> EnumSet Extension -> Int -> Int -> Int -> Int -> Float -> Int -> Bool -> Int -> Int -> LogAction -> FlushOut -> FlushErr -> Maybe FilePath -> Maybe String -> [String] -> Int -> Int -> Bool -> OverridingBool -> Bool -> Scheme -> ProfAuto -> Maybe String -> IORef (ModuleEnv Int) -> Maybe SseVersion -> Maybe BmiVersion -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> IORef (Maybe LinkerInfo) -> IORef (Maybe CompilerInfo) -> Int -> Int -> Int -> Bool -> Maybe Int -> Int -> Int -> CfgWeights -> DynFlags
- Development.IDE.GHC.Compat: ExprWithTySig :: XExprWithTySig p -> LHsExpr p -> HsExpr p
+ Development.IDE.GHC.Compat: ExprWithTySig :: XExprWithTySig p -> LHsExpr p -> LHsSigWcType (NoGhcTc p) -> HsExpr p
- Development.IDE.GHC.Compat: FamEqn :: XCFamEqn pass pats rhs -> Located (IdP pass) -> pats -> LexicalFixity -> rhs -> FamEqn pass pats rhs
+ Development.IDE.GHC.Compat: FamEqn :: XCFamEqn pass rhs -> Located (IdP pass) -> Maybe [LHsTyVarBndr pass] -> HsTyPats pass -> LexicalFixity -> rhs -> FamEqn pass rhs
- Development.IDE.GHC.Compat: HsAppType :: XAppTypeE p -> LHsExpr p -> HsExpr p
+ Development.IDE.GHC.Compat: HsAppType :: XAppTypeE p -> LHsExpr p -> LHsWcType (NoGhcTc p) -> HsExpr p
- Development.IDE.GHC.Compat: HsExplicitListTy :: XExplicitListTy pass -> Promoted -> [LHsType pass] -> HsType pass
+ Development.IDE.GHC.Compat: HsExplicitListTy :: XExplicitListTy pass -> PromotionFlag -> [LHsType pass] -> HsType pass
- Development.IDE.GHC.Compat: HsForAllTy :: XForAllTy pass -> [LHsTyVarBndr pass] -> LHsType pass -> HsType pass
+ Development.IDE.GHC.Compat: HsForAllTy :: XForAllTy pass -> ForallVisFlag -> [LHsTyVarBndr pass] -> LHsType pass -> HsType pass
- Development.IDE.GHC.Compat: HsRecFields :: [LHsRecField p arg] -> Maybe Int -> HsRecFields p arg
+ Development.IDE.GHC.Compat: HsRecFields :: [LHsRecField p arg] -> Maybe (Located Int) -> HsRecFields p arg
- Development.IDE.GHC.Compat: HsRule :: XHsRule pass -> Located (SourceText, RuleName) -> Activation -> [LRuleBndr pass] -> Located (HsExpr pass) -> Located (HsExpr pass) -> RuleDecl pass
+ Development.IDE.GHC.Compat: HsRule :: XHsRule pass -> Located (SourceText, RuleName) -> Activation -> Maybe [LHsTyVarBndr (NoGhcTc pass)] -> [LRuleBndr pass] -> Located (HsExpr pass) -> Located (HsExpr pass) -> RuleDecl pass
- Development.IDE.GHC.Compat: HsTyVar :: XTyVar pass -> Promoted -> Located (IdP pass) -> HsType pass
+ Development.IDE.GHC.Compat: HsTyVar :: XTyVar pass -> PromotionFlag -> Located (IdP pass) -> HsType pass
- Development.IDE.GHC.Compat: ImportDecl :: XCImportDecl pass -> SourceText -> Located ModuleName -> Maybe StringLiteral -> Bool -> Bool -> Bool -> Bool -> Maybe (Located ModuleName) -> Maybe (Bool, Located [LIE pass]) -> ImportDecl pass
+ Development.IDE.GHC.Compat: ImportDecl :: XCImportDecl pass -> SourceText -> Located ModuleName -> Maybe StringLiteral -> Bool -> Bool -> ImportDeclQualifiedStyle -> Bool -> Maybe (Located ModuleName) -> Maybe (Bool, Located [LIE pass]) -> ImportDecl pass
- Development.IDE.GHC.Compat: ModIface :: !Module -> !Maybe Module -> !Fingerprint -> !Fingerprint -> !Fingerprint -> !Fingerprint -> !Fingerprint -> !Fingerprint -> !WhetherHasOrphans -> !WhetherHasFamInst -> !HscSource -> Dependencies -> [Usage] -> ![IfaceExport] -> !Fingerprint -> !Bool -> [(OccName, Fixity)] -> Warnings -> [IfaceAnnotation] -> [(Fingerprint, IfaceDecl)] -> !Maybe GlobalRdrEnv -> [IfaceClsInst] -> [IfaceFamInst] -> [IfaceRule] -> !Fingerprint -> (OccName -> Maybe WarningTxt) -> (OccName -> Maybe Fixity) -> (OccName -> Maybe (OccName, Fingerprint)) -> !AnyHpcUsage -> !IfaceTrustInfo -> !Bool -> [IfaceCompleteMatch] -> Maybe HsDocString -> DeclDocMap -> ArgDocMap -> ModIface
+ Development.IDE.GHC.Compat: ModIface :: !Module -> !Maybe Module -> !HscSource -> Dependencies -> [Usage] -> ![IfaceExport] -> !Bool -> [(OccName, Fixity)] -> Warnings -> [IfaceAnnotation] -> [IfaceDeclExts phase] -> !Maybe GlobalRdrEnv -> [IfaceClsInst] -> [IfaceFamInst] -> [IfaceRule] -> !AnyHpcUsage -> !IfaceTrustInfo -> !Bool -> [IfaceCompleteMatch] -> Maybe HsDocString -> DeclDocMap -> ArgDocMap -> !IfaceBackendExts phase -> ModIface_ (phase :: ModIfacePhase)
- Development.IDE.GHC.Compat: ModSummary :: Module -> HscSource -> ModLocation -> UTCTime -> Maybe UTCTime -> Maybe UTCTime -> [(Maybe FastString, Located ModuleName)] -> [(Maybe FastString, Located ModuleName)] -> Maybe HsParsedModule -> FilePath -> DynFlags -> Maybe StringBuffer -> ModSummary
+ Development.IDE.GHC.Compat: ModSummary :: Module -> HscSource -> ModLocation -> UTCTime -> Maybe UTCTime -> Maybe UTCTime -> Maybe UTCTime -> [(Maybe FastString, Located ModuleName)] -> [(Maybe FastString, Located ModuleName)] -> Maybe HsParsedModule -> FilePath -> DynFlags -> Maybe StringBuffer -> ModSummary
- Development.IDE.GHC.Compat: SigPat :: XSigPat p -> LPat p -> Pat p
+ Development.IDE.GHC.Compat: SigPat :: XSigPat p -> LPat p -> LHsSigWcType (NoGhcTc p) -> Pat p
- Development.IDE.GHC.Compat: Target :: TargetId -> Bool -> Maybe (StringBuffer, UTCTime) -> Target
+ Development.IDE.GHC.Compat: Target :: TargetId -> Bool -> Maybe (InputFileBuffer, UTCTime) -> Target
- Development.IDE.GHC.Compat: TyClGroup :: XCTyClGroup pass -> [LTyClDecl pass] -> [LRoleAnnotDecl pass] -> [LInstDecl pass] -> TyClGroup pass
+ Development.IDE.GHC.Compat: TyClGroup :: XCTyClGroup pass -> [LTyClDecl pass] -> [LRoleAnnotDecl pass] -> [LStandaloneKindSig pass] -> [LInstDecl pass] -> TyClGroup pass
- Development.IDE.GHC.Compat: XFamEqn :: XXFamEqn pass pats rhs -> FamEqn pass pats rhs
+ Development.IDE.GHC.Compat: XFamEqn :: XXFamEqn pass rhs -> FamEqn pass rhs
- Development.IDE.GHC.Compat: [feqn_ext] :: FamEqn pass pats rhs -> XCFamEqn pass pats rhs
+ Development.IDE.GHC.Compat: [feqn_ext] :: FamEqn pass rhs -> XCFamEqn pass rhs
- Development.IDE.GHC.Compat: [feqn_fixity] :: FamEqn pass pats rhs -> LexicalFixity
+ Development.IDE.GHC.Compat: [feqn_fixity] :: FamEqn pass rhs -> LexicalFixity
- Development.IDE.GHC.Compat: [feqn_pats] :: FamEqn pass pats rhs -> pats
+ Development.IDE.GHC.Compat: [feqn_pats] :: FamEqn pass rhs -> HsTyPats pass
- Development.IDE.GHC.Compat: [feqn_rhs] :: FamEqn pass pats rhs -> rhs
+ Development.IDE.GHC.Compat: [feqn_rhs] :: FamEqn pass rhs -> rhs
- Development.IDE.GHC.Compat: [feqn_tycon] :: FamEqn pass pats rhs -> Located (IdP pass)
+ Development.IDE.GHC.Compat: [feqn_tycon] :: FamEqn pass rhs -> Located (IdP pass)
- Development.IDE.GHC.Compat: [ideclQualified] :: ImportDecl pass -> Bool
+ Development.IDE.GHC.Compat: [ideclQualified] :: ImportDecl pass -> ImportDeclQualifiedStyle
- Development.IDE.GHC.Compat: [llvmPasses] :: DynFlags -> LlvmPasses
+ Development.IDE.GHC.Compat: [llvmPasses] :: LlvmConfig -> [(Int, String)]
- Development.IDE.GHC.Compat: [llvmTargets] :: DynFlags -> LlvmTargets
+ Development.IDE.GHC.Compat: [llvmTargets] :: LlvmConfig -> [(String, LlvmTarget)]
- Development.IDE.GHC.Compat: [mi_anns] :: ModIface -> [IfaceAnnotation]
+ Development.IDE.GHC.Compat: [mi_anns] :: ModIface_ (phase :: ModIfacePhase) -> [IfaceAnnotation]
- Development.IDE.GHC.Compat: [mi_arg_docs] :: ModIface -> ArgDocMap
+ Development.IDE.GHC.Compat: [mi_arg_docs] :: ModIface_ (phase :: ModIfacePhase) -> ArgDocMap
- Development.IDE.GHC.Compat: [mi_complete_sigs] :: ModIface -> [IfaceCompleteMatch]
+ Development.IDE.GHC.Compat: [mi_complete_sigs] :: ModIface_ (phase :: ModIfacePhase) -> [IfaceCompleteMatch]
- Development.IDE.GHC.Compat: [mi_decl_docs] :: ModIface -> DeclDocMap
+ Development.IDE.GHC.Compat: [mi_decl_docs] :: ModIface_ (phase :: ModIfacePhase) -> DeclDocMap
- Development.IDE.GHC.Compat: [mi_decls] :: ModIface -> [(Fingerprint, IfaceDecl)]
+ Development.IDE.GHC.Compat: [mi_decls] :: ModIface_ (phase :: ModIfacePhase) -> [IfaceDeclExts phase]
- Development.IDE.GHC.Compat: [mi_deps] :: ModIface -> Dependencies
+ Development.IDE.GHC.Compat: [mi_deps] :: ModIface_ (phase :: ModIfacePhase) -> Dependencies
- Development.IDE.GHC.Compat: [mi_doc_hdr] :: ModIface -> Maybe HsDocString
+ Development.IDE.GHC.Compat: [mi_doc_hdr] :: ModIface_ (phase :: ModIfacePhase) -> Maybe HsDocString
- Development.IDE.GHC.Compat: [mi_exports] :: ModIface -> ![IfaceExport]
+ Development.IDE.GHC.Compat: [mi_exports] :: ModIface_ (phase :: ModIfacePhase) -> ![IfaceExport]
- Development.IDE.GHC.Compat: [mi_fam_insts] :: ModIface -> [IfaceFamInst]
+ Development.IDE.GHC.Compat: [mi_fam_insts] :: ModIface_ (phase :: ModIfacePhase) -> [IfaceFamInst]
- Development.IDE.GHC.Compat: [mi_fixities] :: ModIface -> [(OccName, Fixity)]
+ Development.IDE.GHC.Compat: [mi_fixities] :: ModIface_ (phase :: ModIfacePhase) -> [(OccName, Fixity)]
- Development.IDE.GHC.Compat: [mi_globals] :: ModIface -> !Maybe GlobalRdrEnv
+ Development.IDE.GHC.Compat: [mi_globals] :: ModIface_ (phase :: ModIfacePhase) -> !Maybe GlobalRdrEnv
- Development.IDE.GHC.Compat: [mi_hpc] :: ModIface -> !AnyHpcUsage
+ Development.IDE.GHC.Compat: [mi_hpc] :: ModIface_ (phase :: ModIfacePhase) -> !AnyHpcUsage
- Development.IDE.GHC.Compat: [mi_hsc_src] :: ModIface -> !HscSource
+ Development.IDE.GHC.Compat: [mi_hsc_src] :: ModIface_ (phase :: ModIfacePhase) -> !HscSource
- Development.IDE.GHC.Compat: [mi_insts] :: ModIface -> [IfaceClsInst]
+ Development.IDE.GHC.Compat: [mi_insts] :: ModIface_ (phase :: ModIfacePhase) -> [IfaceClsInst]
- Development.IDE.GHC.Compat: [mi_module] :: ModIface -> !Module
+ Development.IDE.GHC.Compat: [mi_module] :: ModIface_ (phase :: ModIfacePhase) -> !Module
- Development.IDE.GHC.Compat: [mi_rules] :: ModIface -> [IfaceRule]
+ Development.IDE.GHC.Compat: [mi_rules] :: ModIface_ (phase :: ModIfacePhase) -> [IfaceRule]
- Development.IDE.GHC.Compat: [mi_sig_of] :: ModIface -> !Maybe Module
+ Development.IDE.GHC.Compat: [mi_sig_of] :: ModIface_ (phase :: ModIfacePhase) -> !Maybe Module
- Development.IDE.GHC.Compat: [mi_trust] :: ModIface -> !IfaceTrustInfo
+ Development.IDE.GHC.Compat: [mi_trust] :: ModIface_ (phase :: ModIfacePhase) -> !IfaceTrustInfo
- Development.IDE.GHC.Compat: [mi_trust_pkg] :: ModIface -> !Bool
+ Development.IDE.GHC.Compat: [mi_trust_pkg] :: ModIface_ (phase :: ModIfacePhase) -> !Bool
- Development.IDE.GHC.Compat: [mi_usages] :: ModIface -> [Usage]
+ Development.IDE.GHC.Compat: [mi_usages] :: ModIface_ (phase :: ModIfacePhase) -> [Usage]
- Development.IDE.GHC.Compat: [mi_used_th] :: ModIface -> !Bool
+ Development.IDE.GHC.Compat: [mi_used_th] :: ModIface_ (phase :: ModIfacePhase) -> !Bool
- Development.IDE.GHC.Compat: [mi_warns] :: ModIface -> Warnings
+ Development.IDE.GHC.Compat: [mi_warns] :: ModIface_ (phase :: ModIfacePhase) -> Warnings
- Development.IDE.GHC.Compat: [rec_dotdot] :: HsRecFields p arg -> Maybe Int
+ Development.IDE.GHC.Compat: [rec_dotdot] :: HsRecFields p arg -> Maybe (Located Int)
- Development.IDE.GHC.Compat: [targetContents] :: Target -> Maybe (StringBuffer, UTCTime)
+ Development.IDE.GHC.Compat: [targetContents] :: Target -> Maybe (InputFileBuffer, UTCTime)
- Development.IDE.GHC.Compat: [tcdATDefs] :: TyClDecl pass -> [LTyFamDefltEqn pass]
+ Development.IDE.GHC.Compat: [tcdATDefs] :: TyClDecl pass -> [LTyFamDefltDecl pass]
- Development.IDE.GHC.Compat: [tcdFDs] :: TyClDecl pass -> [Located (FunDep (Located (IdP pass)))]
+ Development.IDE.GHC.Compat: [tcdFDs] :: TyClDecl pass -> [LHsFunDep pass]
- Development.IDE.GHC.Compat: addCLoc :: () => Located a -> Located b -> c -> Located c
+ Development.IDE.GHC.Compat: addCLoc :: (HasSrcSpan a, HasSrcSpan b, HasSrcSpan c) => a -> b -> SrcSpanLess c -> c
- Development.IDE.GHC.Compat: annProvenanceName_maybe :: () => AnnProvenance name -> Maybe name
+ Development.IDE.GHC.Compat: annProvenanceName_maybe :: AnnProvenance name -> Maybe name
- Development.IDE.GHC.Compat: appendGroups :: () => HsGroup (GhcPass p) -> HsGroup (GhcPass p) -> HsGroup (GhcPass p)
+ Development.IDE.GHC.Compat: appendGroups :: forall (p :: Pass). HsGroup (GhcPass p) -> HsGroup (GhcPass p) -> HsGroup (GhcPass p)
- Development.IDE.GHC.Compat: chunkify :: () => [a] -> [[a]]
+ Development.IDE.GHC.Compat: chunkify :: [a] -> [[a]]
- Development.IDE.GHC.Compat: cmpLocated :: Ord a => Located a -> Located a -> Ordering
+ Development.IDE.GHC.Compat: cmpLocated :: (HasSrcSpan a, Ord (SrcSpanLess a)) => a -> a -> Ordering
- Development.IDE.GHC.Compat: collectHsBindBinders :: () => HsBindLR idL idR -> [IdP idL]
+ Development.IDE.GHC.Compat: collectHsBindBinders :: (SrcSpanLess (LPat p) ~ Pat p, HasSrcSpan (LPat p)) => HsBindLR p idR -> [IdP p]
- Development.IDE.GHC.Compat: collectHsBindListBinders :: () => [LHsBindLR idL idR] -> [IdP idL]
+ Development.IDE.GHC.Compat: collectHsBindListBinders :: forall (p :: Pass) idR. [LHsBindLR (GhcPass p) idR] -> [IdP (GhcPass p)]
- Development.IDE.GHC.Compat: collectHsBindsBinders :: () => LHsBindsLR idL idR -> [IdP idL]
+ Development.IDE.GHC.Compat: collectHsBindsBinders :: forall (p :: Pass) idR. LHsBindsLR (GhcPass p) idR -> [IdP (GhcPass p)]
- Development.IDE.GHC.Compat: collectHsIdBinders :: () => HsValBindsLR (GhcPass idL) (GhcPass idR) -> [IdP (GhcPass idL)]
+ Development.IDE.GHC.Compat: collectHsIdBinders :: forall (idL :: Pass) (idR :: Pass). HsValBindsLR (GhcPass idL) (GhcPass idR) -> [IdP (GhcPass idL)]
- Development.IDE.GHC.Compat: collectHsValBinders :: () => HsValBindsLR (GhcPass idL) (GhcPass idR) -> [IdP (GhcPass idL)]
+ Development.IDE.GHC.Compat: collectHsValBinders :: forall (idL :: Pass) (idR :: Pass). HsValBindsLR (GhcPass idL) (GhcPass idR) -> [IdP (GhcPass idL)]
- Development.IDE.GHC.Compat: collectLStmtBinders :: () => LStmtLR (GhcPass idL) (GhcPass idR) body -> [IdP (GhcPass idL)]
+ Development.IDE.GHC.Compat: collectLStmtBinders :: forall (idL :: Pass) (idR :: Pass) body. LStmtLR (GhcPass idL) (GhcPass idR) body -> [IdP (GhcPass idL)]
- Development.IDE.GHC.Compat: collectLStmtsBinders :: () => [LStmtLR (GhcPass idL) (GhcPass idR) body] -> [IdP (GhcPass idL)]
+ Development.IDE.GHC.Compat: collectLStmtsBinders :: forall (idL :: Pass) (idR :: Pass) body. [LStmtLR (GhcPass idL) (GhcPass idR) body] -> [IdP (GhcPass idL)]
- Development.IDE.GHC.Compat: collectLocalBinders :: () => HsLocalBindsLR (GhcPass idL) (GhcPass idR) -> [IdP (GhcPass idL)]
+ Development.IDE.GHC.Compat: collectLocalBinders :: forall (idL :: Pass) (idR :: Pass). HsLocalBindsLR (GhcPass idL) (GhcPass idR) -> [IdP (GhcPass idL)]
- Development.IDE.GHC.Compat: collectMethodBinders :: () => LHsBindsLR idL idR -> [Located (IdP idL)]
+ Development.IDE.GHC.Compat: collectMethodBinders :: LHsBindsLR idL idR -> [Located (IdP idL)]
- Development.IDE.GHC.Compat: collectPatBinders :: () => LPat a -> [IdP a]
+ Development.IDE.GHC.Compat: collectPatBinders :: forall (p :: Pass). LPat (GhcPass p) -> [IdP (GhcPass p)]
- Development.IDE.GHC.Compat: collectPatsBinders :: () => [LPat a] -> [IdP a]
+ Development.IDE.GHC.Compat: collectPatsBinders :: forall (p :: Pass). [LPat (GhcPass p)] -> [IdP (GhcPass p)]
- Development.IDE.GHC.Compat: collectRuleBndrSigTys :: () => [RuleBndr pass] -> [LHsSigWcType pass]
+ Development.IDE.GHC.Compat: collectRuleBndrSigTys :: [RuleBndr pass] -> [LHsSigWcType pass]
- Development.IDE.GHC.Compat: collectStmtBinders :: () => StmtLR (GhcPass idL) (GhcPass idR) body -> [IdP (GhcPass idL)]
+ Development.IDE.GHC.Compat: collectStmtBinders :: forall (idL :: Pass) (idR :: Pass) body. StmtLR (GhcPass idL) (GhcPass idR) body -> [IdP (GhcPass idL)]
- Development.IDE.GHC.Compat: collectStmtsBinders :: () => [StmtLR (GhcPass idL) (GhcPass idR) body] -> [IdP (GhcPass idL)]
+ Development.IDE.GHC.Compat: collectStmtsBinders :: forall (idL :: Pass) (idR :: Pass) body. [StmtLR (GhcPass idL) (GhcPass idR) body] -> [IdP (GhcPass idL)]
- Development.IDE.GHC.Compat: combineLocs :: () => Located a -> Located b -> SrcSpan
+ Development.IDE.GHC.Compat: combineLocs :: (HasSrcSpan a, HasSrcSpan b) => a -> b -> SrcSpan
- Development.IDE.GHC.Compat: countTyClDecls :: () => [TyClDecl pass] -> (Int, Int, Int, Int, Int)
+ Development.IDE.GHC.Compat: countTyClDecls :: [TyClDecl pass] -> (Int, Int, Int, Int, Int)
- Development.IDE.GHC.Compat: data FamEqn pass pats rhs
+ Development.IDE.GHC.Compat: data FamEqn pass rhs
- Development.IDE.GHC.Compat: dataConSig :: DataCon -> ([TyVar], ThetaType, [Type], Type)
+ Development.IDE.GHC.Compat: dataConSig :: DataCon -> ([TyCoVar], ThetaType, [Type], Type)
- Development.IDE.GHC.Compat: defaultObjectTarget :: Platform -> HscTarget
+ Development.IDE.GHC.Compat: defaultObjectTarget :: DynFlags -> HscTarget
- Development.IDE.GHC.Compat: derivStrategyName :: () => DerivStrategy a -> SDoc
+ Development.IDE.GHC.Compat: derivStrategyName :: DerivStrategy a -> SDoc
- Development.IDE.GHC.Compat: dropWildCards :: () => LHsSigWcType pass -> LHsSigType pass
+ Development.IDE.GHC.Compat: dropWildCards :: LHsSigWcType pass -> LHsSigType pass
- Development.IDE.GHC.Compat: emptyLHsBinds :: () => LHsBindsLR idL idR
+ Development.IDE.GHC.Compat: emptyLHsBinds :: LHsBindsLR idL idR
- Development.IDE.GHC.Compat: emptyLocalBinds :: () => HsLocalBindsLR (GhcPass a) (GhcPass b)
+ Development.IDE.GHC.Compat: emptyLocalBinds :: forall (a :: Pass) (b :: Pass). HsLocalBindsLR (GhcPass a) (GhcPass b)
- Development.IDE.GHC.Compat: emptyRdrGroup :: () => HsGroup (GhcPass p)
+ Development.IDE.GHC.Compat: emptyRdrGroup :: forall (p :: Pass). HsGroup (GhcPass p)
- Development.IDE.GHC.Compat: emptyRecStmt :: () => StmtLR (GhcPass idL) GhcPs bodyR
+ Development.IDE.GHC.Compat: emptyRecStmt :: forall (idL :: Pass) bodyR. StmtLR (GhcPass idL) GhcPs bodyR
- Development.IDE.GHC.Compat: emptyRecStmtId :: () => StmtLR GhcTc GhcTc bodyR
+ Development.IDE.GHC.Compat: emptyRecStmtId :: StmtLR GhcTc GhcTc bodyR
- Development.IDE.GHC.Compat: emptyRecStmtName :: () => StmtLR GhcRn GhcRn bodyR
+ Development.IDE.GHC.Compat: emptyRecStmtName :: StmtLR GhcRn GhcRn bodyR
- Development.IDE.GHC.Compat: emptyRnGroup :: () => HsGroup (GhcPass p)
+ Development.IDE.GHC.Compat: emptyRnGroup :: forall (p :: Pass). HsGroup (GhcPass p)
- Development.IDE.GHC.Compat: emptyValBindsIn :: () => HsValBindsLR (GhcPass a) (GhcPass b)
+ Development.IDE.GHC.Compat: emptyValBindsIn :: forall (a :: Pass) (b :: Pass). HsValBindsLR (GhcPass a) (GhcPass b)
- Development.IDE.GHC.Compat: emptyValBindsOut :: () => HsValBindsLR (GhcPass a) (GhcPass b)
+ Development.IDE.GHC.Compat: emptyValBindsOut :: forall (a :: Pass) (b :: Pass). HsValBindsLR (GhcPass a) (GhcPass b)
- Development.IDE.GHC.Compat: eqEmptyLocalBinds :: () => HsLocalBindsLR a b -> Bool
+ Development.IDE.GHC.Compat: eqEmptyLocalBinds :: HsLocalBindsLR a b -> Bool
- Development.IDE.GHC.Compat: eqLocated :: Eq a => Located a -> Located a -> Bool
+ Development.IDE.GHC.Compat: eqLocated :: (HasSrcSpan a, Eq (SrcSpanLess a)) => a -> a -> Bool
- Development.IDE.GHC.Compat: flattenRuleDecls :: () => [LRuleDecls pass] -> [LRuleDecl pass]
+ Development.IDE.GHC.Compat: flattenRuleDecls :: [LRuleDecls pass] -> [LRuleDecl pass]
- Development.IDE.GHC.Compat: getBangStrictness :: () => LHsType a -> HsSrcBang
+ Development.IDE.GHC.Compat: getBangStrictness :: LHsType a -> HsSrcBang
- Development.IDE.GHC.Compat: getBangType :: () => LHsType a -> LHsType a
+ Development.IDE.GHC.Compat: getBangType :: LHsType a -> LHsType a
- Development.IDE.GHC.Compat: getConNames :: () => ConDecl pass -> [Located (IdP pass)]
+ Development.IDE.GHC.Compat: getConNames :: forall (p :: Pass). ConDecl (GhcPass p) -> [Located (IdP (GhcPass p))]
- Development.IDE.GHC.Compat: getLHsInstDeclClass_maybe :: () => LHsSigType (GhcPass p) -> Maybe (Located (IdP (GhcPass p)))
+ Development.IDE.GHC.Compat: getLHsInstDeclClass_maybe :: forall (p :: Pass). LHsSigType (GhcPass p) -> Maybe (Located (IdP (GhcPass p)))
- Development.IDE.GHC.Compat: getLHsInstDeclHead :: () => LHsSigType pass -> LHsType pass
+ Development.IDE.GHC.Compat: getLHsInstDeclHead :: forall (p :: Pass). LHsSigType (GhcPass p) -> LHsType (GhcPass p)
- Development.IDE.GHC.Compat: getPatSynBinds :: () => [(RecFlag, LHsBinds id)] -> [PatSynBind id id]
+ Development.IDE.GHC.Compat: getPatSynBinds :: [(RecFlag, LHsBinds id)] -> [PatSynBind id id]
- Development.IDE.GHC.Compat: hsConDeclArgTys :: () => HsConDeclDetails pass -> [LBangType pass]
+ Development.IDE.GHC.Compat: hsConDeclArgTys :: HsConDeclDetails pass -> [LBangType pass]
- Development.IDE.GHC.Compat: hsConDeclTheta :: () => Maybe (LHsContext pass) -> [LHsType pass]
+ Development.IDE.GHC.Compat: hsConDeclTheta :: Maybe (LHsContext pass) -> [LHsType pass]
- Development.IDE.GHC.Compat: hsConPatArgs :: () => HsConPatDetails p -> [LPat p]
+ Development.IDE.GHC.Compat: hsConPatArgs :: HsConPatDetails p -> [LPat p]
- Development.IDE.GHC.Compat: hsDataFamInstBinders :: () => DataFamInstDecl pass -> ([Located (IdP pass)], [LFieldOcc pass])
+ Development.IDE.GHC.Compat: hsDataFamInstBinders :: forall (p :: Pass). DataFamInstDecl (GhcPass p) -> ([Located (IdP (GhcPass p))], [LFieldOcc (GhcPass p)])
- Development.IDE.GHC.Compat: hsExplicitLTyVarNames :: () => LHsQTyVars pass -> [IdP pass]
+ Development.IDE.GHC.Compat: hsExplicitLTyVarNames :: forall (p :: Pass). LHsQTyVars (GhcPass p) -> [IdP (GhcPass p)]
- Development.IDE.GHC.Compat: hsExprNeedsParens :: () => PprPrec -> HsExpr p -> Bool
+ Development.IDE.GHC.Compat: hsExprNeedsParens :: PprPrec -> HsExpr p -> Bool
- Development.IDE.GHC.Compat: hsForeignDeclsBinders :: () => [LForeignDecl pass] -> [Located (IdP pass)]
+ Development.IDE.GHC.Compat: hsForeignDeclsBinders :: [LForeignDecl pass] -> [Located (IdP pass)]
- Development.IDE.GHC.Compat: hsGroupInstDecls :: () => HsGroup id -> [LInstDecl id]
+ Development.IDE.GHC.Compat: hsGroupInstDecls :: HsGroup id -> [LInstDecl id]
- Development.IDE.GHC.Compat: hsImplicitBody :: () => HsImplicitBndrs pass thing -> thing
+ Development.IDE.GHC.Compat: hsImplicitBody :: forall (p :: Pass) thing. HsImplicitBndrs (GhcPass p) thing -> thing
- Development.IDE.GHC.Compat: hsLMatchPats :: () => LMatch id body -> [LPat id]
+ Development.IDE.GHC.Compat: hsLMatchPats :: forall (id :: Pass) body. LMatch (GhcPass id) body -> [LPat (GhcPass id)]
- Development.IDE.GHC.Compat: hsLTyClDeclBinders :: () => Located (TyClDecl pass) -> ([Located (IdP pass)], [LFieldOcc pass])
+ Development.IDE.GHC.Compat: hsLTyClDeclBinders :: forall (p :: Pass). Located (TyClDecl (GhcPass p)) -> ([Located (IdP (GhcPass p))], [LFieldOcc (GhcPass p)])
- Development.IDE.GHC.Compat: hsLTyVarBndrToType :: () => LHsTyVarBndr (GhcPass p) -> LHsType (GhcPass p)
+ Development.IDE.GHC.Compat: hsLTyVarBndrToType :: forall (p :: Pass). LHsTyVarBndr (GhcPass p) -> LHsType (GhcPass p)
- Development.IDE.GHC.Compat: hsLTyVarBndrsToTypes :: () => LHsQTyVars (GhcPass p) -> [LHsType (GhcPass p)]
+ Development.IDE.GHC.Compat: hsLTyVarBndrsToTypes :: forall (p :: Pass). LHsQTyVars (GhcPass p) -> [LHsType (GhcPass p)]
- Development.IDE.GHC.Compat: hsLTyVarLocName :: () => LHsTyVarBndr pass -> Located (IdP pass)
+ Development.IDE.GHC.Compat: hsLTyVarLocName :: forall (p :: Pass). LHsTyVarBndr (GhcPass p) -> Located (IdP (GhcPass p))
- Development.IDE.GHC.Compat: hsLTyVarLocNames :: () => LHsQTyVars pass -> [Located (IdP pass)]
+ Development.IDE.GHC.Compat: hsLTyVarLocNames :: forall (p :: Pass). LHsQTyVars (GhcPass p) -> [Located (IdP (GhcPass p))]
- Development.IDE.GHC.Compat: hsLTyVarName :: () => LHsTyVarBndr pass -> IdP pass
+ Development.IDE.GHC.Compat: hsLTyVarName :: forall (p :: Pass). LHsTyVarBndr (GhcPass p) -> IdP (GhcPass p)
- Development.IDE.GHC.Compat: hsLitNeedsParens :: () => PprPrec -> HsLit x -> Bool
+ Development.IDE.GHC.Compat: hsLitNeedsParens :: PprPrec -> HsLit x -> Bool
- Development.IDE.GHC.Compat: hsOverLitNeedsParens :: () => PprPrec -> HsOverLit x -> Bool
+ Development.IDE.GHC.Compat: hsOverLitNeedsParens :: PprPrec -> HsOverLit x -> Bool
- Development.IDE.GHC.Compat: hsPatSynSelectors :: () => HsValBinds (GhcPass p) -> [IdP (GhcPass p)]
+ Development.IDE.GHC.Compat: hsPatSynSelectors :: forall (p :: Pass). HsValBinds (GhcPass p) -> [IdP (GhcPass p)]
- Development.IDE.GHC.Compat: hsQTvExplicit :: () => LHsQTyVars pass -> [LHsTyVarBndr pass]
+ Development.IDE.GHC.Compat: hsQTvExplicit :: LHsQTyVars pass -> [LHsTyVarBndr pass]
- Development.IDE.GHC.Compat: hsRecFieldId :: () => HsRecField GhcTc arg -> Located Id
+ Development.IDE.GHC.Compat: hsRecFieldId :: HsRecField GhcTc arg -> Located Id
- Development.IDE.GHC.Compat: hsRecFieldSel :: () => HsRecField pass arg -> Located (XCFieldOcc pass)
+ Development.IDE.GHC.Compat: hsRecFieldSel :: HsRecField pass arg -> Located (XCFieldOcc pass)
- Development.IDE.GHC.Compat: hsRecFields :: () => HsRecFields p arg -> [XCFieldOcc p]
+ Development.IDE.GHC.Compat: hsRecFields :: HsRecFields p arg -> [XCFieldOcc p]
- Development.IDE.GHC.Compat: hsRecFieldsArgs :: () => HsRecFields p arg -> [arg]
+ Development.IDE.GHC.Compat: hsRecFieldsArgs :: HsRecFields p arg -> [arg]
- Development.IDE.GHC.Compat: hsRecUpdFieldId :: () => HsRecField' (AmbiguousFieldOcc GhcTc) arg -> Located Id
+ Development.IDE.GHC.Compat: hsRecUpdFieldId :: HsRecField' (AmbiguousFieldOcc GhcTc) arg -> Located Id
- Development.IDE.GHC.Compat: hsRecUpdFieldOcc :: () => HsRecField' (AmbiguousFieldOcc GhcTc) arg -> LFieldOcc GhcTc
+ Development.IDE.GHC.Compat: hsRecUpdFieldOcc :: HsRecField' (AmbiguousFieldOcc GhcTc) arg -> LFieldOcc GhcTc
- Development.IDE.GHC.Compat: hsRecUpdFieldRdr :: () => HsRecUpdField (GhcPass p) -> Located RdrName
+ Development.IDE.GHC.Compat: hsRecUpdFieldRdr :: forall (p :: Pass). HsRecUpdField (GhcPass p) -> Located RdrName
- Development.IDE.GHC.Compat: hsSigDoc :: () => Sig name -> SDoc
+ Development.IDE.GHC.Compat: hsSigDoc :: Sig name -> SDoc
- Development.IDE.GHC.Compat: hsSigType :: () => LHsSigType pass -> LHsType pass
+ Development.IDE.GHC.Compat: hsSigType :: forall (p :: Pass). LHsSigType (GhcPass p) -> LHsType (GhcPass p)
- Development.IDE.GHC.Compat: hsSigWcType :: () => LHsSigWcType pass -> LHsType pass
+ Development.IDE.GHC.Compat: hsSigWcType :: LHsSigWcType pass -> LHsType pass
- Development.IDE.GHC.Compat: hsTvbAllKinded :: () => LHsQTyVars pass -> Bool
+ Development.IDE.GHC.Compat: hsTvbAllKinded :: LHsQTyVars pass -> Bool
- Development.IDE.GHC.Compat: hsTyGetAppHead_maybe :: () => LHsType (GhcPass p) -> Maybe (Located (IdP (GhcPass p)), [LHsType (GhcPass p)])
+ Development.IDE.GHC.Compat: hsTyGetAppHead_maybe :: forall (p :: Pass). LHsType (GhcPass p) -> Maybe (Located (IdP (GhcPass p)))
- Development.IDE.GHC.Compat: hsTyVarName :: () => HsTyVarBndr pass -> IdP pass
+ Development.IDE.GHC.Compat: hsTyVarName :: forall (p :: Pass). HsTyVarBndr (GhcPass p) -> IdP (GhcPass p)
- Development.IDE.GHC.Compat: hsTypeNeedsParens :: () => PprPrec -> HsType pass -> Bool
+ Development.IDE.GHC.Compat: hsTypeNeedsParens :: PprPrec -> HsType pass -> Bool
- Development.IDE.GHC.Compat: hsValBindsImplicits :: () => HsValBindsLR GhcRn (GhcPass idR) -> NameSet
+ Development.IDE.GHC.Compat: hsValBindsImplicits :: forall (idR :: Pass). HsValBindsLR GhcRn (GhcPass idR) -> [(SrcSpan, [Name])]
- Development.IDE.GHC.Compat: ieLWrappedName :: () => LIEWrappedName name -> Located name
+ Development.IDE.GHC.Compat: ieLWrappedName :: LIEWrappedName name -> Located name
- Development.IDE.GHC.Compat: ieName :: () => IE pass -> IdP pass
+ Development.IDE.GHC.Compat: ieName :: forall (p :: Pass). IE (GhcPass p) -> IdP (GhcPass p)
- Development.IDE.GHC.Compat: ieNames :: () => IE pass -> [IdP pass]
+ Development.IDE.GHC.Compat: ieNames :: forall (p :: Pass). IE (GhcPass p) -> [IdP (GhcPass p)]
- Development.IDE.GHC.Compat: ieWrappedName :: () => IEWrappedName name -> name
+ Development.IDE.GHC.Compat: ieWrappedName :: IEWrappedName name -> name
- Development.IDE.GHC.Compat: ignoreParens :: () => LHsType pass -> LHsType pass
+ Development.IDE.GHC.Compat: ignoreParens :: LHsType pass -> LHsType pass
- Development.IDE.GHC.Compat: instDeclDataFamInsts :: () => [LInstDecl pass] -> [DataFamInstDecl pass]
+ Development.IDE.GHC.Compat: instDeclDataFamInsts :: forall (p :: Pass). [LInstDecl (GhcPass p)] -> [DataFamInstDecl (GhcPass p)]
- Development.IDE.GHC.Compat: isAtomicHsExpr :: () => HsExpr id -> Bool
+ Development.IDE.GHC.Compat: isAtomicHsExpr :: HsExpr id -> Bool
- Development.IDE.GHC.Compat: isBangedLPat :: () => LPat p -> Bool
+ Development.IDE.GHC.Compat: isBangedLPat :: forall (p :: Pass). LPat (GhcPass p) -> Bool
- Development.IDE.GHC.Compat: isClassDecl :: () => TyClDecl pass -> Bool
+ Development.IDE.GHC.Compat: isClassDecl :: TyClDecl pass -> Bool
- Development.IDE.GHC.Compat: isClosedTypeFamilyInfo :: () => FamilyInfo pass -> Bool
+ Development.IDE.GHC.Compat: isClosedTypeFamilyInfo :: FamilyInfo pass -> Bool
- Development.IDE.GHC.Compat: isCompleteMatchSig :: () => LSig name -> Bool
+ Development.IDE.GHC.Compat: isCompleteMatchSig :: LSig name -> Bool
- Development.IDE.GHC.Compat: isDataDecl :: () => TyClDecl pass -> Bool
+ Development.IDE.GHC.Compat: isDataDecl :: TyClDecl pass -> Bool
- Development.IDE.GHC.Compat: isDataFamilyDecl :: () => TyClDecl pass -> Bool
+ Development.IDE.GHC.Compat: isDataFamilyDecl :: TyClDecl pass -> Bool
- Development.IDE.GHC.Compat: isEmptyIPBindsPR :: () => HsIPBinds (GhcPass p) -> Bool
+ Development.IDE.GHC.Compat: isEmptyIPBindsPR :: forall (p :: Pass). HsIPBinds (GhcPass p) -> Bool
- Development.IDE.GHC.Compat: isEmptyLHsBinds :: () => LHsBindsLR idL idR -> Bool
+ Development.IDE.GHC.Compat: isEmptyLHsBinds :: LHsBindsLR idL idR -> Bool
- Development.IDE.GHC.Compat: isEmptyLocalBindsPR :: () => HsLocalBindsLR (GhcPass a) (GhcPass b) -> Bool
+ Development.IDE.GHC.Compat: isEmptyLocalBindsPR :: forall (a :: Pass) (b :: Pass). HsLocalBindsLR (GhcPass a) (GhcPass b) -> Bool
- Development.IDE.GHC.Compat: isEmptyLocalBindsTc :: () => HsLocalBindsLR (GhcPass a) GhcTc -> Bool
+ Development.IDE.GHC.Compat: isEmptyLocalBindsTc :: forall (a :: Pass). HsLocalBindsLR (GhcPass a) GhcTc -> Bool
- Development.IDE.GHC.Compat: isEmptyMatchGroup :: () => MatchGroup id body -> Bool
+ Development.IDE.GHC.Compat: isEmptyMatchGroup :: MatchGroup id body -> Bool
- Development.IDE.GHC.Compat: isEmptyValBinds :: () => HsValBindsLR (GhcPass a) (GhcPass b) -> Bool
+ Development.IDE.GHC.Compat: isEmptyValBinds :: forall (a :: Pass) (b :: Pass). HsValBindsLR (GhcPass a) (GhcPass b) -> Bool
- Development.IDE.GHC.Compat: isFamilyDecl :: () => TyClDecl pass -> Bool
+ Development.IDE.GHC.Compat: isFamilyDecl :: TyClDecl pass -> Bool
- Development.IDE.GHC.Compat: isFixityLSig :: () => LSig name -> Bool
+ Development.IDE.GHC.Compat: isFixityLSig :: LSig name -> Bool
- Development.IDE.GHC.Compat: isHsKindedTyVar :: () => HsTyVarBndr pass -> Bool
+ Development.IDE.GHC.Compat: isHsKindedTyVar :: HsTyVarBndr pass -> Bool
- Development.IDE.GHC.Compat: isInfixFunBind :: () => HsBindLR id1 id2 -> Bool
+ Development.IDE.GHC.Compat: isInfixFunBind :: HsBindLR id1 id2 -> Bool
- Development.IDE.GHC.Compat: isInfixMatch :: () => Match id body -> Bool
+ Development.IDE.GHC.Compat: isInfixMatch :: Match id body -> Bool
- Development.IDE.GHC.Compat: isInlineLSig :: () => LSig name -> Bool
+ Development.IDE.GHC.Compat: isInlineLSig :: LSig name -> Bool
- Development.IDE.GHC.Compat: isIrrefutableHsPat :: OutputableBndrId p => LPat p -> Bool
+ Development.IDE.GHC.Compat: isIrrefutableHsPat :: forall (p :: Pass). OutputableBndrId p => LPat (GhcPass p) -> Bool
- Development.IDE.GHC.Compat: isLHsForAllTy :: () => LHsType p -> Bool
+ Development.IDE.GHC.Compat: isLHsForAllTy :: LHsType p -> Bool
- Development.IDE.GHC.Compat: isMinimalLSig :: () => LSig name -> Bool
+ Development.IDE.GHC.Compat: isMinimalLSig :: LSig name -> Bool
- Development.IDE.GHC.Compat: isMonadFailStmtContext :: () => HsStmtContext id -> Bool
+ Development.IDE.GHC.Compat: isMonadFailStmtContext :: HsStmtContext id -> Bool
- Development.IDE.GHC.Compat: isOpenTypeFamilyInfo :: () => FamilyInfo pass -> Bool
+ Development.IDE.GHC.Compat: isOpenTypeFamilyInfo :: FamilyInfo pass -> Bool
- Development.IDE.GHC.Compat: isPatSynCtxt :: () => HsMatchContext id -> Bool
+ Development.IDE.GHC.Compat: isPatSynCtxt :: HsMatchContext id -> Bool
- Development.IDE.GHC.Compat: isPragLSig :: () => LSig name -> Bool
+ Development.IDE.GHC.Compat: isPragLSig :: LSig name -> Bool
- Development.IDE.GHC.Compat: isQuietHsCmd :: () => HsCmd id -> Bool
+ Development.IDE.GHC.Compat: isQuietHsCmd :: HsCmd id -> Bool
- Development.IDE.GHC.Compat: isQuietHsExpr :: () => HsExpr id -> Bool
+ Development.IDE.GHC.Compat: isQuietHsExpr :: HsExpr id -> Bool
- Development.IDE.GHC.Compat: isSCCFunSig :: () => LSig name -> Bool
+ Development.IDE.GHC.Compat: isSCCFunSig :: LSig name -> Bool
- Development.IDE.GHC.Compat: isSingletonMatchGroup :: () => [LMatch id body] -> Bool
+ Development.IDE.GHC.Compat: isSingletonMatchGroup :: [LMatch id body] -> Bool
- Development.IDE.GHC.Compat: isSpecInstLSig :: () => LSig name -> Bool
+ Development.IDE.GHC.Compat: isSpecInstLSig :: LSig name -> Bool
- Development.IDE.GHC.Compat: isSpecLSig :: () => LSig name -> Bool
+ Development.IDE.GHC.Compat: isSpecLSig :: LSig name -> Bool
- Development.IDE.GHC.Compat: isSynDecl :: () => TyClDecl pass -> Bool
+ Development.IDE.GHC.Compat: isSynDecl :: TyClDecl pass -> Bool
- Development.IDE.GHC.Compat: isTypeFamilyDecl :: () => TyClDecl pass -> Bool
+ Development.IDE.GHC.Compat: isTypeFamilyDecl :: TyClDecl pass -> Bool
- Development.IDE.GHC.Compat: isTypeLSig :: () => LSig name -> Bool
+ Development.IDE.GHC.Compat: isTypeLSig :: LSig name -> Bool
- Development.IDE.GHC.Compat: isTypedBracket :: () => HsBracket id -> Bool
+ Development.IDE.GHC.Compat: isTypedBracket :: HsBracket id -> Bool
- Development.IDE.GHC.Compat: isTypedSplice :: () => HsSplice id -> Bool
+ Development.IDE.GHC.Compat: isTypedSplice :: HsSplice id -> Bool
- Development.IDE.GHC.Compat: lPatImplicits :: LPat GhcRn -> NameSet
+ Development.IDE.GHC.Compat: lPatImplicits :: LPat GhcRn -> [(SrcSpan, [Name])]
- Development.IDE.GHC.Compat: lStmtsImplicits :: () => [LStmtLR GhcRn (GhcPass idR) (Located (body (GhcPass idR)))] -> NameSet
+ Development.IDE.GHC.Compat: lStmtsImplicits :: forall (idR :: Pass) body. [LStmtLR GhcRn (GhcPass idR) (Located (body (GhcPass idR)))] -> [(SrcSpan, [Name])]
- Development.IDE.GHC.Compat: looksLazyPatBind :: () => HsBind p -> Bool
+ Development.IDE.GHC.Compat: looksLazyPatBind :: forall (p :: Pass). HsBind (GhcPass p) -> Bool
- Development.IDE.GHC.Compat: matchGroupArity :: () => MatchGroup id body -> Arity
+ Development.IDE.GHC.Compat: matchGroupArity :: forall (id :: Pass) body. MatchGroup (GhcPass id) body -> Arity
- Development.IDE.GHC.Compat: matchSeparator :: () => HsMatchContext id -> SDoc
+ Development.IDE.GHC.Compat: matchSeparator :: HsMatchContext id -> SDoc
- Development.IDE.GHC.Compat: mkBigLHsTup :: () => [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: mkBigLHsTup :: forall (id :: Pass). [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
- Development.IDE.GHC.Compat: mkBigLHsVarTup :: () => [IdP (GhcPass id)] -> LHsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: mkBigLHsVarTup :: forall (id :: Pass). [IdP (GhcPass id)] -> LHsExpr (GhcPass id)
- Development.IDE.GHC.Compat: mkBindStmt :: XBindStmt (GhcPass idL) (GhcPass idR) (Located (bodyR (GhcPass idR))) ~ NoExt => LPat (GhcPass idL) -> Located (bodyR (GhcPass idR)) -> StmtLR (GhcPass idL) (GhcPass idR) (Located (bodyR (GhcPass idR)))
+ Development.IDE.GHC.Compat: mkBindStmt :: forall (idL :: Pass) (idR :: Pass) bodyR. XBindStmt (GhcPass idL) (GhcPass idR) (Located (bodyR (GhcPass idR))) ~ NoExtField => LPat (GhcPass idL) -> Located (bodyR (GhcPass idR)) -> StmtLR (GhcPass idL) (GhcPass idR) (Located (bodyR (GhcPass idR)))
- Development.IDE.GHC.Compat: mkBodyStmt :: () => Located (bodyR GhcPs) -> StmtLR (GhcPass idL) GhcPs (Located (bodyR GhcPs))
+ Development.IDE.GHC.Compat: mkBodyStmt :: forall bodyR (idL :: Pass). Located (bodyR GhcPs) -> StmtLR (GhcPass idL) GhcPs (Located (bodyR GhcPs))
- Development.IDE.GHC.Compat: mkCharLitPat :: () => SourceText -> Char -> OutPat (GhcPass p)
+ Development.IDE.GHC.Compat: mkCharLitPat :: forall (p :: Pass). SourceText -> Char -> OutPat (GhcPass p)
- Development.IDE.GHC.Compat: mkChunkified :: () => ([a] -> a) -> [a] -> a
+ Development.IDE.GHC.Compat: mkChunkified :: ([a] -> a) -> [a] -> a
- Development.IDE.GHC.Compat: mkEmptyImplicitBndrs :: () => thing -> HsImplicitBndrs GhcRn thing
+ Development.IDE.GHC.Compat: mkEmptyImplicitBndrs :: thing -> HsImplicitBndrs GhcRn thing
- Development.IDE.GHC.Compat: mkEmptyWildCardBndrs :: () => thing -> HsWildCardBndrs GhcRn thing
+ Development.IDE.GHC.Compat: mkEmptyWildCardBndrs :: thing -> HsWildCardBndrs GhcRn thing
- Development.IDE.GHC.Compat: mkFunBind :: Located RdrName -> [LMatch GhcPs (LHsExpr GhcPs)] -> HsBind GhcPs
+ Development.IDE.GHC.Compat: mkFunBind :: Origin -> Located RdrName -> [LMatch GhcPs (LHsExpr GhcPs)] -> HsBind GhcPs
- Development.IDE.GHC.Compat: mkGeneralLocated :: () => String -> e -> Located e
+ Development.IDE.GHC.Compat: mkGeneralLocated :: HasSrcSpan e => String -> SrcSpanLess e -> e
- Development.IDE.GHC.Compat: mkHsApp :: () => LHsExpr (GhcPass id) -> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: mkHsApp :: forall (id :: Pass). LHsExpr (GhcPass id) -> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
- Development.IDE.GHC.Compat: mkHsAppTy :: () => LHsType (GhcPass p) -> LHsType (GhcPass p) -> LHsType (GhcPass p)
+ Development.IDE.GHC.Compat: mkHsAppTy :: forall (p :: Pass). LHsType (GhcPass p) -> LHsType (GhcPass p) -> LHsType (GhcPass p)
- Development.IDE.GHC.Compat: mkHsAppType :: XAppTypeE (GhcPass id) ~ LHsWcType GhcRn => LHsExpr (GhcPass id) -> LHsWcType GhcRn -> LHsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: mkHsAppType :: forall (id :: Pass). NoGhcTc (GhcPass id) ~ GhcRn => LHsExpr (GhcPass id) -> LHsWcType GhcRn -> LHsExpr (GhcPass id)
- Development.IDE.GHC.Compat: mkHsAppTys :: () => LHsType (GhcPass p) -> [LHsType (GhcPass p)] -> LHsType (GhcPass p)
+ Development.IDE.GHC.Compat: mkHsAppTys :: forall (p :: Pass). LHsType (GhcPass p) -> [LHsType (GhcPass p)] -> LHsType (GhcPass p)
- Development.IDE.GHC.Compat: mkHsCaseAlt :: () => LPat (GhcPass p) -> Located (body (GhcPass p)) -> LMatch (GhcPass p) (Located (body (GhcPass p)))
+ Development.IDE.GHC.Compat: mkHsCaseAlt :: forall (p :: Pass) body. LPat (GhcPass p) -> Located (body (GhcPass p)) -> LMatch (GhcPass p) (Located (body (GhcPass p)))
- Development.IDE.GHC.Compat: mkHsCmdWrap :: () => HsWrapper -> HsCmd (GhcPass p) -> HsCmd (GhcPass p)
+ Development.IDE.GHC.Compat: mkHsCmdWrap :: forall (p :: Pass). HsWrapper -> HsCmd (GhcPass p) -> HsCmd (GhcPass p)
- Development.IDE.GHC.Compat: mkHsIf :: () => LHsExpr (GhcPass p) -> LHsExpr (GhcPass p) -> LHsExpr (GhcPass p) -> HsExpr (GhcPass p)
+ Development.IDE.GHC.Compat: mkHsIf :: forall (p :: Pass). LHsExpr (GhcPass p) -> LHsExpr (GhcPass p) -> LHsExpr (GhcPass p) -> HsExpr (GhcPass p)
- Development.IDE.GHC.Compat: mkHsImplicitBndrs :: () => thing -> HsImplicitBndrs GhcPs thing
+ Development.IDE.GHC.Compat: mkHsImplicitBndrs :: thing -> HsImplicitBndrs GhcPs thing
- Development.IDE.GHC.Compat: mkHsLam :: [LPat GhcPs] -> LHsExpr GhcPs -> LHsExpr GhcPs
+ Development.IDE.GHC.Compat: mkHsLam :: forall (p :: Pass). XMG (GhcPass p) (LHsExpr (GhcPass p)) ~ NoExtField => [LPat (GhcPass p)] -> LHsExpr (GhcPass p) -> LHsExpr (GhcPass p)
- Development.IDE.GHC.Compat: mkHsOpTy :: () => LHsType (GhcPass p) -> Located (IdP (GhcPass p)) -> LHsType (GhcPass p) -> HsType (GhcPass p)
+ Development.IDE.GHC.Compat: mkHsOpTy :: forall (p :: Pass). LHsType (GhcPass p) -> Located (IdP (GhcPass p)) -> LHsType (GhcPass p) -> HsType (GhcPass p)
- Development.IDE.GHC.Compat: mkHsPar :: () => LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: mkHsPar :: forall (id :: Pass). LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
- Development.IDE.GHC.Compat: mkHsSigEnv :: () => (LSig GhcRn -> Maybe ([Located Name], a)) -> [LSig GhcRn] -> NameEnv a
+ Development.IDE.GHC.Compat: mkHsSigEnv :: (LSig GhcRn -> Maybe ([Located Name], a)) -> [LSig GhcRn] -> NameEnv a
- Development.IDE.GHC.Compat: mkHsString :: () => String -> HsLit (GhcPass p)
+ Development.IDE.GHC.Compat: mkHsString :: forall (p :: Pass). String -> HsLit (GhcPass p)
- Development.IDE.GHC.Compat: mkHsStringPrimLit :: () => FastString -> HsLit (GhcPass p)
+ Development.IDE.GHC.Compat: mkHsStringPrimLit :: forall (p :: Pass). FastString -> HsLit (GhcPass p)
- Development.IDE.GHC.Compat: mkHsWildCardBndrs :: () => thing -> HsWildCardBndrs GhcPs thing
+ Development.IDE.GHC.Compat: mkHsWildCardBndrs :: thing -> HsWildCardBndrs GhcPs thing
- Development.IDE.GHC.Compat: mkHsWrap :: () => HsWrapper -> HsExpr (GhcPass id) -> HsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: mkHsWrap :: forall (id :: Pass). HsWrapper -> HsExpr (GhcPass id) -> HsExpr (GhcPass id)
- Development.IDE.GHC.Compat: mkHsWrapCo :: () => TcCoercionN -> HsExpr (GhcPass id) -> HsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: mkHsWrapCo :: forall (id :: Pass). TcCoercionN -> HsExpr (GhcPass id) -> HsExpr (GhcPass id)
- Development.IDE.GHC.Compat: mkHsWrapCoR :: () => TcCoercionR -> HsExpr (GhcPass id) -> HsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: mkHsWrapCoR :: forall (id :: Pass). TcCoercionR -> HsExpr (GhcPass id) -> HsExpr (GhcPass id)
- Development.IDE.GHC.Compat: mkHsWrapPat :: () => HsWrapper -> Pat (GhcPass id) -> Type -> Pat (GhcPass id)
+ Development.IDE.GHC.Compat: mkHsWrapPat :: forall (id :: Pass). HsWrapper -> Pat (GhcPass id) -> Type -> Pat (GhcPass id)
- Development.IDE.GHC.Compat: mkHsWrapPatCo :: () => TcCoercionN -> Pat (GhcPass id) -> Type -> Pat (GhcPass id)
+ Development.IDE.GHC.Compat: mkHsWrapPatCo :: forall (id :: Pass). TcCoercionN -> Pat (GhcPass id) -> Type -> Pat (GhcPass id)
- Development.IDE.GHC.Compat: mkLHsCmdWrap :: () => HsWrapper -> LHsCmd (GhcPass p) -> LHsCmd (GhcPass p)
+ Development.IDE.GHC.Compat: mkLHsCmdWrap :: forall (p :: Pass). HsWrapper -> LHsCmd (GhcPass p) -> LHsCmd (GhcPass p)
- Development.IDE.GHC.Compat: mkLHsPar :: () => LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: mkLHsPar :: forall (id :: Pass). LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
- Development.IDE.GHC.Compat: mkLHsTupleExpr :: () => [LHsExpr (GhcPass a)] -> LHsExpr (GhcPass a)
+ Development.IDE.GHC.Compat: mkLHsTupleExpr :: forall (a :: Pass). [LHsExpr (GhcPass a)] -> LHsExpr (GhcPass a)
- Development.IDE.GHC.Compat: mkLHsVarTuple :: () => [IdP (GhcPass a)] -> LHsExpr (GhcPass a)
+ Development.IDE.GHC.Compat: mkLHsVarTuple :: forall (a :: Pass). [IdP (GhcPass a)] -> LHsExpr (GhcPass a)
- Development.IDE.GHC.Compat: mkLHsWrap :: () => HsWrapper -> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: mkLHsWrap :: forall (id :: Pass). HsWrapper -> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
- Development.IDE.GHC.Compat: mkLHsWrapCo :: () => TcCoercionN -> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: mkLHsWrapCo :: forall (id :: Pass). TcCoercionN -> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
- Development.IDE.GHC.Compat: mkLastStmt :: () => Located (bodyR (GhcPass idR)) -> StmtLR (GhcPass idL) (GhcPass idR) (Located (bodyR (GhcPass idR)))
+ Development.IDE.GHC.Compat: mkLastStmt :: forall bodyR (idR :: Pass) (idL :: Pass). Located (bodyR (GhcPass idR)) -> StmtLR (GhcPass idL) (GhcPass idR) (Located (bodyR (GhcPass idR)))
- Development.IDE.GHC.Compat: mkMatch :: () => HsMatchContext (NameOrRdrName (IdP (GhcPass p))) -> [LPat (GhcPass p)] -> LHsExpr (GhcPass p) -> Located (HsLocalBinds (GhcPass p)) -> LMatch (GhcPass p) (LHsExpr (GhcPass p))
+ Development.IDE.GHC.Compat: mkMatch :: forall (p :: Pass). HsMatchContext (NameOrRdrName (IdP (GhcPass p))) -> [LPat (GhcPass p)] -> LHsExpr (GhcPass p) -> Located (HsLocalBinds (GhcPass p)) -> LMatch (GhcPass p) (LHsExpr (GhcPass p))
- Development.IDE.GHC.Compat: mkMatchGroup :: XMG name (Located (body name)) ~ NoExt => Origin -> [LMatch name (Located (body name))] -> MatchGroup name (Located (body name))
+ Development.IDE.GHC.Compat: mkMatchGroup :: XMG name (Located (body name)) ~ NoExtField => Origin -> [LMatch name (Located (body name))] -> MatchGroup name (Located (body name))
- Development.IDE.GHC.Compat: mkNilPat :: () => Type -> OutPat p
+ Development.IDE.GHC.Compat: mkNilPat :: forall (p :: Pass). Type -> OutPat (GhcPass p)
- Development.IDE.GHC.Compat: mkParPat :: () => LPat (GhcPass name) -> LPat (GhcPass name)
+ Development.IDE.GHC.Compat: mkParPat :: forall (name :: Pass). LPat (GhcPass name) -> LPat (GhcPass name)
- Development.IDE.GHC.Compat: mkPrefixConPat :: () => DataCon -> [OutPat p] -> [Type] -> OutPat p
+ Development.IDE.GHC.Compat: mkPrefixConPat :: forall (p :: Pass). DataCon -> [OutPat (GhcPass p)] -> [Type] -> OutPat (GhcPass p)
- Development.IDE.GHC.Compat: mkPrefixFunRhs :: () => Located id -> HsMatchContext id
+ Development.IDE.GHC.Compat: mkPrefixFunRhs :: Located id -> HsMatchContext id
- Development.IDE.GHC.Compat: mkRecStmt :: () => [LStmtLR (GhcPass idL) GhcPs bodyR] -> StmtLR (GhcPass idL) GhcPs bodyR
+ Development.IDE.GHC.Compat: mkRecStmt :: forall (idL :: Pass) bodyR. [LStmtLR (GhcPass idL) GhcPs bodyR] -> StmtLR (GhcPass idL) GhcPs bodyR
- Development.IDE.GHC.Compat: mkSimpleMatch :: () => HsMatchContext (NameOrRdrName (IdP (GhcPass p))) -> [LPat (GhcPass p)] -> Located (body (GhcPass p)) -> LMatch (GhcPass p) (Located (body (GhcPass p)))
+ Development.IDE.GHC.Compat: mkSimpleMatch :: forall (p :: Pass) body. HsMatchContext (NameOrRdrName (IdP (GhcPass p))) -> [LPat (GhcPass p)] -> Located (body (GhcPass p)) -> LMatch (GhcPass p) (Located (body (GhcPass p)))
- Development.IDE.GHC.Compat: mkTcBindStmt :: () => LPat GhcTc -> Located (bodyR GhcTc) -> StmtLR GhcTc GhcTc (Located (bodyR GhcTc))
+ Development.IDE.GHC.Compat: mkTcBindStmt :: LPat GhcTc -> Located (bodyR GhcTc) -> StmtLR GhcTc GhcTc (Located (bodyR GhcTc))
- Development.IDE.GHC.Compat: mkVarBind :: () => IdP (GhcPass p) -> LHsExpr (GhcPass p) -> LHsBind (GhcPass p)
+ Development.IDE.GHC.Compat: mkVarBind :: forall (p :: Pass). IdP (GhcPass p) -> LHsExpr (GhcPass p) -> LHsBind (GhcPass p)
- Development.IDE.GHC.Compat: nameModule :: HasDebugCallStack -> Name -> Module
+ Development.IDE.GHC.Compat: nameModule :: HasDebugCallStack => Name -> Module
- Development.IDE.GHC.Compat: nlHsApp :: () => LHsExpr (GhcPass id) -> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: nlHsApp :: forall (id :: Pass). LHsExpr (GhcPass id) -> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
- Development.IDE.GHC.Compat: nlHsAppTy :: () => LHsType (GhcPass p) -> LHsType (GhcPass p) -> LHsType (GhcPass p)
+ Development.IDE.GHC.Compat: nlHsAppTy :: forall (p :: Pass). LHsType (GhcPass p) -> LHsType (GhcPass p) -> LHsType (GhcPass p)
- Development.IDE.GHC.Compat: nlHsApps :: () => IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: nlHsApps :: forall (id :: Pass). IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
- Development.IDE.GHC.Compat: nlHsFunTy :: () => LHsType (GhcPass p) -> LHsType (GhcPass p) -> LHsType (GhcPass p)
+ Development.IDE.GHC.Compat: nlHsFunTy :: forall (p :: Pass). LHsType (GhcPass p) -> LHsType (GhcPass p) -> LHsType (GhcPass p)
- Development.IDE.GHC.Compat: nlHsIf :: () => LHsExpr (GhcPass id) -> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: nlHsIf :: forall (id :: Pass). LHsExpr (GhcPass id) -> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
- Development.IDE.GHC.Compat: nlHsIntLit :: () => Integer -> LHsExpr (GhcPass p)
+ Development.IDE.GHC.Compat: nlHsIntLit :: forall (p :: Pass). Integer -> LHsExpr (GhcPass p)
- Development.IDE.GHC.Compat: nlHsLit :: () => HsLit (GhcPass p) -> LHsExpr (GhcPass p)
+ Development.IDE.GHC.Compat: nlHsLit :: forall (p :: Pass). HsLit (GhcPass p) -> LHsExpr (GhcPass p)
- Development.IDE.GHC.Compat: nlHsPar :: () => LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: nlHsPar :: forall (id :: Pass). LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
- Development.IDE.GHC.Compat: nlHsParTy :: () => LHsType (GhcPass p) -> LHsType (GhcPass p)
+ Development.IDE.GHC.Compat: nlHsParTy :: forall (p :: Pass). LHsType (GhcPass p) -> LHsType (GhcPass p)
- Development.IDE.GHC.Compat: nlHsSyntaxApps :: () => SyntaxExpr (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: nlHsSyntaxApps :: forall (id :: Pass). SyntaxExpr (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
- Development.IDE.GHC.Compat: nlHsTyApp :: () => IdP (GhcPass id) -> [Type] -> LHsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: nlHsTyApp :: forall (id :: Pass). IdP (GhcPass id) -> [Type] -> LHsExpr (GhcPass id)
- Development.IDE.GHC.Compat: nlHsTyApps :: () => IdP (GhcPass id) -> [Type] -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: nlHsTyApps :: forall (id :: Pass). IdP (GhcPass id) -> [Type] -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
- Development.IDE.GHC.Compat: nlHsTyConApp :: () => IdP (GhcPass p) -> [LHsType (GhcPass p)] -> LHsType (GhcPass p)
+ Development.IDE.GHC.Compat: nlHsTyConApp :: forall (p :: Pass). IdP (GhcPass p) -> [LHsType (GhcPass p)] -> LHsType (GhcPass p)
- Development.IDE.GHC.Compat: nlHsTyVar :: () => IdP (GhcPass p) -> LHsType (GhcPass p)
+ Development.IDE.GHC.Compat: nlHsTyVar :: forall (p :: Pass). IdP (GhcPass p) -> LHsType (GhcPass p)
- Development.IDE.GHC.Compat: nlHsVar :: () => IdP (GhcPass id) -> LHsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: nlHsVar :: forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
- Development.IDE.GHC.Compat: nlHsVarApps :: () => IdP (GhcPass id) -> [IdP (GhcPass id)] -> LHsExpr (GhcPass id)
+ Development.IDE.GHC.Compat: nlHsVarApps :: forall (id :: Pass). IdP (GhcPass id) -> [IdP (GhcPass id)] -> LHsExpr (GhcPass id)
- Development.IDE.GHC.Compat: nlNullaryConPat :: () => IdP id -> LPat id
+ Development.IDE.GHC.Compat: nlNullaryConPat :: forall (p :: Pass). IdP (GhcPass p) -> LPat (GhcPass p)
- Development.IDE.GHC.Compat: nlParPat :: () => LPat (GhcPass name) -> LPat (GhcPass name)
+ Development.IDE.GHC.Compat: nlParPat :: forall (name :: Pass). LPat (GhcPass name) -> LPat (GhcPass name)
- Development.IDE.GHC.Compat: nlVarPat :: () => IdP (GhcPass id) -> LPat (GhcPass id)
+ Development.IDE.GHC.Compat: nlVarPat :: forall (id :: Pass). IdP (GhcPass id) -> LPat (GhcPass id)
- Development.IDE.GHC.Compat: noExpr :: () => HsExpr (GhcPass p)
+ Development.IDE.GHC.Compat: noExpr :: forall (p :: Pass). HsExpr (GhcPass p)
- Development.IDE.GHC.Compat: noLoc :: () => e -> Located e
+ Development.IDE.GHC.Compat: noLoc :: HasSrcSpan a => SrcSpanLess a -> a
- Development.IDE.GHC.Compat: noSyntaxExpr :: () => SyntaxExpr (GhcPass p)
+ Development.IDE.GHC.Compat: noSyntaxExpr :: forall (p :: Pass). SyntaxExpr (GhcPass p)
- Development.IDE.GHC.Compat: parenthesizeHsExpr :: () => PprPrec -> LHsExpr (GhcPass p) -> LHsExpr (GhcPass p)
+ Development.IDE.GHC.Compat: parenthesizeHsExpr :: forall (p :: Pass). PprPrec -> LHsExpr (GhcPass p) -> LHsExpr (GhcPass p)
- Development.IDE.GHC.Compat: parenthesizeHsType :: () => PprPrec -> LHsType (GhcPass p) -> LHsType (GhcPass p)
+ Development.IDE.GHC.Compat: parenthesizeHsType :: forall (p :: Pass). PprPrec -> LHsType (GhcPass p) -> LHsType (GhcPass p)
- Development.IDE.GHC.Compat: parenthesizePat :: () => PprPrec -> LPat (GhcPass p) -> LPat (GhcPass p)
+ Development.IDE.GHC.Compat: parenthesizePat :: forall (p :: Pass). PprPrec -> LPat (GhcPass p) -> LPat (GhcPass p)
- Development.IDE.GHC.Compat: patNeedsParens :: () => PprPrec -> Pat p -> Bool
+ Development.IDE.GHC.Compat: patNeedsParens :: PprPrec -> Pat p -> Bool
- Development.IDE.GHC.Compat: plusHsValBinds :: () => HsValBinds (GhcPass a) -> HsValBinds (GhcPass a) -> HsValBinds (GhcPass a)
+ Development.IDE.GHC.Compat: plusHsValBinds :: forall (a :: Pass). HsValBinds (GhcPass a) -> HsValBinds (GhcPass a) -> HsValBinds (GhcPass a)
- Development.IDE.GHC.Compat: pmPprHsLit :: () => HsLit (GhcPass x) -> SDoc
+ Development.IDE.GHC.Compat: pmPprHsLit :: forall (x :: Pass). HsLit (GhcPass x) -> SDoc
- Development.IDE.GHC.Compat: pprBinds :: (OutputableBndrId (GhcPass idL), OutputableBndrId (GhcPass idR)) => HsLocalBindsLR (GhcPass idL) (GhcPass idR) -> SDoc
+ Development.IDE.GHC.Compat: pprBinds :: forall (idL :: Pass) (idR :: Pass). (OutputableBndrId idL, OutputableBndrId idR) => HsLocalBindsLR (GhcPass idL) (GhcPass idR) -> SDoc
- Development.IDE.GHC.Compat: pprCmd :: OutputableBndrId (GhcPass p) => HsCmd (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprCmd :: forall (p :: Pass). OutputableBndrId p => HsCmd (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprCmdArg :: OutputableBndrId (GhcPass p) => HsCmdTop (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprCmdArg :: forall (p :: Pass). OutputableBndrId p => HsCmdTop (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprComp :: (OutputableBndrId (GhcPass p), Outputable body) => [LStmt (GhcPass p) body] -> SDoc
+ Development.IDE.GHC.Compat: pprComp :: forall (p :: Pass) body. (OutputableBndrId p, Outputable body) => [LStmt (GhcPass p) body] -> SDoc
- Development.IDE.GHC.Compat: pprConArgs :: OutputableBndrId (GhcPass p) => HsConPatDetails (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprConArgs :: forall (p :: Pass). OutputableBndrId p => HsConPatDetails (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprConDeclFields :: OutputableBndrId (GhcPass p) => [LConDeclField (GhcPass p)] -> SDoc
+ Development.IDE.GHC.Compat: pprConDeclFields :: forall (p :: Pass). OutputableBndrId p => [LConDeclField (GhcPass p)] -> SDoc
- Development.IDE.GHC.Compat: pprDataFamInstFlavour :: () => DataFamInstDecl (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprDataFamInstFlavour :: forall (p :: Pass). DataFamInstDecl (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprDebugParendExpr :: OutputableBndrId (GhcPass p) => PprPrec -> LHsExpr (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprDebugParendExpr :: forall (p :: Pass). OutputableBndrId p => PprPrec -> LHsExpr (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprDo :: (OutputableBndrId (GhcPass p), Outputable body) => HsStmtContext any -> [LStmt (GhcPass p) body] -> SDoc
+ Development.IDE.GHC.Compat: pprDo :: forall (p :: Pass) body any. (OutputableBndrId p, Outputable body) => HsStmtContext any -> [LStmt (GhcPass p) body] -> SDoc
- Development.IDE.GHC.Compat: pprExpr :: OutputableBndrId (GhcPass p) => HsExpr (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprExpr :: forall (p :: Pass). OutputableBndrId p => HsExpr (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprForAll :: [TyVarBinder] -> SDoc
+ Development.IDE.GHC.Compat: pprForAll :: [TyCoVarBinder] -> SDoc
- Development.IDE.GHC.Compat: pprFunBind :: (OutputableBndrId (GhcPass idR), Outputable body) => MatchGroup (GhcPass idR) body -> SDoc
+ Development.IDE.GHC.Compat: pprFunBind :: forall (idR :: Pass) body. (OutputableBndrId idR, Outputable body) => MatchGroup (GhcPass idR) body -> SDoc
- Development.IDE.GHC.Compat: pprGRHS :: (OutputableBndrId (GhcPass idR), Outputable body) => HsMatchContext idL -> GRHS (GhcPass idR) body -> SDoc
+ Development.IDE.GHC.Compat: pprGRHS :: forall (idR :: Pass) body idL. (OutputableBndrId idR, Outputable body) => HsMatchContext idL -> GRHS (GhcPass idR) body -> SDoc
- Development.IDE.GHC.Compat: pprGRHSs :: (OutputableBndrId (GhcPass idR), Outputable body) => HsMatchContext idL -> GRHSs (GhcPass idR) body -> SDoc
+ Development.IDE.GHC.Compat: pprGRHSs :: forall (idR :: Pass) body idL. (OutputableBndrId idR, Outputable body) => HsMatchContext idL -> GRHSs (GhcPass idR) body -> SDoc
- Development.IDE.GHC.Compat: pprHsBracket :: OutputableBndrId (GhcPass p) => HsBracket (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprHsBracket :: forall (p :: Pass). OutputableBndrId p => HsBracket (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprHsForAll :: OutputableBndrId (GhcPass p) => [LHsTyVarBndr (GhcPass p)] -> LHsContext (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprHsForAll :: forall (p :: Pass). OutputableBndrId p => ForallVisFlag -> [LHsTyVarBndr (GhcPass p)] -> LHsContext (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprHsForAllExtra :: OutputableBndrId (GhcPass p) => Maybe SrcSpan -> [LHsTyVarBndr (GhcPass p)] -> LHsContext (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprHsForAllExtra :: forall (p :: Pass). OutputableBndrId p => Maybe SrcSpan -> ForallVisFlag -> [LHsTyVarBndr (GhcPass p)] -> LHsContext (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprHsType :: OutputableBndrId (GhcPass p) => HsType (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprHsType :: forall (p :: Pass). OutputableBndrId p => HsType (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprLCmd :: OutputableBndrId (GhcPass p) => LHsCmd (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprLCmd :: forall (p :: Pass). OutputableBndrId p => LHsCmd (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprLExpr :: OutputableBndrId (GhcPass p) => LHsExpr (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprLExpr :: forall (p :: Pass). OutputableBndrId p => LHsExpr (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprLHsBinds :: (OutputableBndrId (GhcPass idL), OutputableBndrId (GhcPass idR)) => LHsBindsLR (GhcPass idL) (GhcPass idR) -> SDoc
+ Development.IDE.GHC.Compat: pprLHsBinds :: forall (idL :: Pass) (idR :: Pass). (OutputableBndrId idL, OutputableBndrId idR) => LHsBindsLR (GhcPass idL) (GhcPass idR) -> SDoc
- Development.IDE.GHC.Compat: pprLHsBindsForUser :: (OutputableBndrId (GhcPass idL), OutputableBndrId (GhcPass idR), OutputableBndrId (GhcPass id2)) => LHsBindsLR (GhcPass idL) (GhcPass idR) -> [LSig (GhcPass id2)] -> [SDoc]
+ Development.IDE.GHC.Compat: pprLHsBindsForUser :: forall (idL :: Pass) (idR :: Pass) (id2 :: Pass). (OutputableBndrId idL, OutputableBndrId idR, OutputableBndrId id2) => LHsBindsLR (GhcPass idL) (GhcPass idR) -> [LSig (GhcPass id2)] -> [SDoc]
- Development.IDE.GHC.Compat: pprMatch :: (OutputableBndrId (GhcPass idR), Outputable body) => Match (GhcPass idR) body -> SDoc
+ Development.IDE.GHC.Compat: pprMatch :: forall (idR :: Pass) body. (OutputableBndrId idR, Outputable body) => Match (GhcPass idR) body -> SDoc
- Development.IDE.GHC.Compat: pprMatchInCtxt :: (OutputableBndrId (GhcPass idR), Outputable (NameOrRdrName (NameOrRdrName (IdP (GhcPass idR)))), Outputable body) => Match (GhcPass idR) body -> SDoc
+ Development.IDE.GHC.Compat: pprMatchInCtxt :: forall (idR :: Pass) body. (OutputableBndrId idR, Outputable (NameOrRdrName (NameOrRdrName (IdP (GhcPass idR)))), Outputable body) => Match (GhcPass idR) body -> SDoc
- Development.IDE.GHC.Compat: pprMatches :: (OutputableBndrId (GhcPass idR), Outputable body) => MatchGroup (GhcPass idR) body -> SDoc
+ Development.IDE.GHC.Compat: pprMatches :: forall (idR :: Pass) body. (OutputableBndrId idR, Outputable body) => MatchGroup (GhcPass idR) body -> SDoc
- Development.IDE.GHC.Compat: pprParendExpr :: OutputableBndrId (GhcPass p) => PprPrec -> HsExpr (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprParendExpr :: forall (p :: Pass). OutputableBndrId p => PprPrec -> HsExpr (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprParendLExpr :: OutputableBndrId (GhcPass p) => PprPrec -> LHsExpr (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprParendLExpr :: forall (p :: Pass). OutputableBndrId p => PprPrec -> LHsExpr (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprParendLPat :: OutputableBndrId (GhcPass p) => PprPrec -> LPat (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprParendLPat :: forall (p :: Pass). OutputableBndrId p => PprPrec -> LPat (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprPatBind :: (OutputableBndrId (GhcPass bndr), OutputableBndrId (GhcPass p), Outputable body) => LPat (GhcPass bndr) -> GRHSs (GhcPass p) body -> SDoc
+ Development.IDE.GHC.Compat: pprPatBind :: forall (bndr :: Pass) (p :: Pass) body. (OutputableBndrId bndr, OutputableBndrId p, Outputable body) => LPat (GhcPass bndr) -> GRHSs (GhcPass p) body -> SDoc
- Development.IDE.GHC.Compat: pprPendingSplice :: OutputableBndrId (GhcPass p) => SplicePointName -> LHsExpr (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprPendingSplice :: forall (p :: Pass). OutputableBndrId p => SplicePointName -> LHsExpr (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprQuals :: (OutputableBndrId (GhcPass p), Outputable body) => [LStmt (GhcPass p) body] -> SDoc
+ Development.IDE.GHC.Compat: pprQuals :: forall (p :: Pass) body. (OutputableBndrId p, Outputable body) => [LStmt (GhcPass p) body] -> SDoc
- Development.IDE.GHC.Compat: pprSplice :: OutputableBndrId (GhcPass p) => HsSplice (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprSplice :: forall (p :: Pass). OutputableBndrId p => HsSplice (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: pprSpliceDecl :: OutputableBndrId (GhcPass p) => HsSplice (GhcPass p) -> SpliceExplicitFlag -> SDoc
+ Development.IDE.GHC.Compat: pprSpliceDecl :: forall (p :: Pass). OutputableBndrId p => HsSplice (GhcPass p) -> SpliceExplicitFlag -> SDoc
- Development.IDE.GHC.Compat: pprStmt :: (OutputableBndrId (GhcPass idL), OutputableBndrId (GhcPass idR), Outputable body) => StmtLR (GhcPass idL) (GhcPass idR) body -> SDoc
+ Development.IDE.GHC.Compat: pprStmt :: forall (idL :: Pass) (idR :: Pass) body. (OutputableBndrId idL, OutputableBndrId idR, Outputable body) => StmtLR (GhcPass idL) (GhcPass idR) body -> SDoc
- Development.IDE.GHC.Compat: pprStmtInCtxt :: (OutputableBndrId (GhcPass idL), OutputableBndrId (GhcPass idR), Outputable body) => HsStmtContext (IdP (GhcPass idL)) -> StmtLR (GhcPass idL) (GhcPass idR) body -> SDoc
+ Development.IDE.GHC.Compat: pprStmtInCtxt :: forall (idL :: Pass) (idR :: Pass) body. (OutputableBndrId idL, OutputableBndrId idR, Outputable body) => HsStmtContext (IdP (GhcPass idL)) -> StmtLR (GhcPass idL) (GhcPass idR) body -> SDoc
- Development.IDE.GHC.Compat: pprTransformStmt :: OutputableBndrId (GhcPass p) => [IdP (GhcPass p)] -> LHsExpr (GhcPass p) -> Maybe (LHsExpr (GhcPass p)) -> SDoc
+ Development.IDE.GHC.Compat: pprTransformStmt :: forall (p :: Pass). OutputableBndrId p => [IdP (GhcPass p)] -> LHsExpr (GhcPass p) -> Maybe (LHsExpr (GhcPass p)) -> SDoc
- Development.IDE.GHC.Compat: pprTyClDeclFlavour :: () => TyClDecl (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: pprTyClDeclFlavour :: forall (p :: Pass). TyClDecl (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: ppr_apps :: OutputableBndrId (GhcPass p) => HsExpr (GhcPass p) -> [Either (LHsExpr (GhcPass p)) (XAppTypeE (GhcPass p))] -> SDoc
+ Development.IDE.GHC.Compat: ppr_apps :: forall (p :: Pass). OutputableBndrId p => HsExpr (GhcPass p) -> [Either (LHsExpr (GhcPass p)) (LHsWcType (NoGhcTc (GhcPass p)))] -> SDoc
- Development.IDE.GHC.Compat: ppr_cmd :: OutputableBndrId (GhcPass p) => HsCmd (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: ppr_cmd :: forall (p :: Pass). OutputableBndrId p => HsCmd (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: ppr_do_stmts :: (OutputableBndrId (GhcPass idL), OutputableBndrId (GhcPass idR), Outputable body) => [LStmtLR (GhcPass idL) (GhcPass idR) body] -> SDoc
+ Development.IDE.GHC.Compat: ppr_do_stmts :: forall (idL :: Pass) (idR :: Pass) body. (OutputableBndrId idL, OutputableBndrId idR, Outputable body) => [LStmtLR (GhcPass idL) (GhcPass idR) body] -> SDoc
- Development.IDE.GHC.Compat: ppr_expr :: OutputableBndrId (GhcPass p) => HsExpr (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: ppr_expr :: forall (p :: Pass). OutputableBndrId p => HsExpr (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: ppr_lcmd :: OutputableBndrId (GhcPass p) => LHsCmd (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: ppr_lcmd :: forall (p :: Pass). OutputableBndrId p => LHsCmd (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: ppr_lexpr :: OutputableBndrId (GhcPass p) => LHsExpr (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: ppr_lexpr :: forall (p :: Pass). OutputableBndrId p => LHsExpr (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: ppr_monobind :: (OutputableBndrId (GhcPass idL), OutputableBndrId (GhcPass idR)) => HsBindLR (GhcPass idL) (GhcPass idR) -> SDoc
+ Development.IDE.GHC.Compat: ppr_monobind :: forall (idL :: Pass) (idR :: Pass). (OutputableBndrId idL, OutputableBndrId idR) => HsBindLR (GhcPass idL) (GhcPass idR) -> SDoc
- Development.IDE.GHC.Compat: ppr_sig :: OutputableBndrId (GhcPass p) => Sig (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: ppr_sig :: forall (p :: Pass). OutputableBndrId p => Sig (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: ppr_splice :: OutputableBndrId (GhcPass p) => SDoc -> IdP (GhcPass p) -> LHsExpr (GhcPass p) -> SDoc -> SDoc
+ Development.IDE.GHC.Compat: ppr_splice :: forall (p :: Pass). OutputableBndrId p => SDoc -> IdP (GhcPass p) -> LHsExpr (GhcPass p) -> SDoc -> SDoc
- Development.IDE.GHC.Compat: ppr_splice_decl :: OutputableBndrId (GhcPass p) => HsSplice (GhcPass p) -> SDoc
+ Development.IDE.GHC.Compat: ppr_splice_decl :: forall (p :: Pass). OutputableBndrId p => HsSplice (GhcPass p) -> SDoc
- Development.IDE.GHC.Compat: rdrNameAmbiguousFieldOcc :: () => AmbiguousFieldOcc (GhcPass p) -> RdrName
+ Development.IDE.GHC.Compat: rdrNameAmbiguousFieldOcc :: forall (p :: Pass). AmbiguousFieldOcc (GhcPass p) -> RdrName
- Development.IDE.GHC.Compat: replaceLWrappedName :: () => LIEWrappedName name1 -> name2 -> LIEWrappedName name2
+ Development.IDE.GHC.Compat: replaceLWrappedName :: LIEWrappedName name1 -> name2 -> LIEWrappedName name2
- Development.IDE.GHC.Compat: replaceWrappedName :: () => IEWrappedName name1 -> name2 -> IEWrappedName name2
+ Development.IDE.GHC.Compat: replaceWrappedName :: IEWrappedName name1 -> name2 -> IEWrappedName name2
- Development.IDE.GHC.Compat: resultVariableName :: () => FamilyResultSig a -> Maybe (IdP a)
+ Development.IDE.GHC.Compat: resultVariableName :: forall (a :: Pass). FamilyResultSig (GhcPass a) -> Maybe (IdP (GhcPass a))
- Development.IDE.GHC.Compat: roleAnnotDeclName :: () => RoleAnnotDecl pass -> IdP pass
+ Development.IDE.GHC.Compat: roleAnnotDeclName :: forall (p :: Pass). RoleAnnotDecl (GhcPass p) -> IdP (GhcPass p)
- Development.IDE.GHC.Compat: runGhc :: () => Maybe FilePath -> Ghc a -> IO a
+ Development.IDE.GHC.Compat: runGhc :: Maybe FilePath -> Ghc a -> IO a
- Development.IDE.GHC.Compat: runTcInteractive :: () => HscEnv -> TcRn a -> IO (Messages, Maybe a)
+ Development.IDE.GHC.Compat: runTcInteractive :: HscEnv -> TcRn a -> IO (Messages, Maybe a)
- Development.IDE.GHC.Compat: simpleImportDecl :: () => ModuleName -> ImportDecl (GhcPass p)
+ Development.IDE.GHC.Compat: simpleImportDecl :: forall (p :: Pass). ModuleName -> ImportDecl (GhcPass p)
- Development.IDE.GHC.Compat: splitForAllTys :: Type -> ([TyVar], Type)
+ Development.IDE.GHC.Compat: splitForAllTys :: Type -> ([TyCoVar], Type)
- Development.IDE.GHC.Compat: splitLHsPatSynTy :: () => LHsType pass -> ([LHsTyVarBndr pass], LHsContext pass, [LHsTyVarBndr pass], LHsContext pass, LHsType pass)
+ Development.IDE.GHC.Compat: splitLHsPatSynTy :: LHsType pass -> ([LHsTyVarBndr pass], LHsContext pass, [LHsTyVarBndr pass], LHsContext pass, LHsType pass)
- Development.IDE.GHC.Compat: splitLHsQualTy :: () => LHsType pass -> (LHsContext pass, LHsType pass)
+ Development.IDE.GHC.Compat: splitLHsQualTy :: LHsType pass -> (LHsContext pass, LHsType pass)
- Development.IDE.GHC.Compat: tcdName :: () => TyClDecl pass -> IdP pass
+ Development.IDE.GHC.Compat: tcdName :: forall (p :: Pass). TyClDecl (GhcPass p) -> IdP (GhcPass p)
- Development.IDE.GHC.Compat: tupArgPresent :: () => LHsTupArg id -> Bool
+ Development.IDE.GHC.Compat: tupArgPresent :: LHsTupArg id -> Bool
- Development.IDE.GHC.Compat: tyClDeclLName :: () => TyClDecl pass -> Located (IdP pass)
+ Development.IDE.GHC.Compat: tyClDeclLName :: forall (p :: Pass). TyClDecl (GhcPass p) -> Located (IdP (GhcPass p))
- Development.IDE.GHC.Compat: tyClDeclTyVars :: () => TyClDecl pass -> LHsQTyVars pass
+ Development.IDE.GHC.Compat: tyClDeclTyVars :: TyClDecl pass -> LHsQTyVars pass
- Development.IDE.GHC.Compat: tyClGroupInstDecls :: () => [TyClGroup pass] -> [LInstDecl pass]
+ Development.IDE.GHC.Compat: tyClGroupInstDecls :: [TyClGroup pass] -> [LInstDecl pass]
- Development.IDE.GHC.Compat: tyClGroupRoleDecls :: () => [TyClGroup pass] -> [LRoleAnnotDecl pass]
+ Development.IDE.GHC.Compat: tyClGroupRoleDecls :: [TyClGroup pass] -> [LRoleAnnotDecl pass]
- Development.IDE.GHC.Compat: tyClGroupTyClDecls :: () => [TyClGroup pass] -> [LTyClDecl pass]
+ Development.IDE.GHC.Compat: tyClGroupTyClDecls :: [TyClGroup pass] -> [LTyClDecl pass]
- Development.IDE.GHC.Compat: tyFamInstDeclLName :: () => TyFamInstDecl pass -> Located (IdP pass)
+ Development.IDE.GHC.Compat: tyFamInstDeclLName :: forall (p :: Pass). TyFamInstDecl (GhcPass p) -> Located (IdP (GhcPass p))
- Development.IDE.GHC.Compat: tyFamInstDeclName :: () => TyFamInstDecl pass -> IdP pass
+ Development.IDE.GHC.Compat: tyFamInstDeclName :: forall (p :: Pass). TyFamInstDecl (GhcPass p) -> IdP (GhcPass p)
- Development.IDE.GHC.Compat: type FamInstEqn pass rhs = HsImplicitBndrs pass FamEqn pass HsTyPats pass rhs
+ Development.IDE.GHC.Compat: type FamInstEqn pass rhs = HsImplicitBndrs pass FamEqn pass rhs
- Development.IDE.GHC.Compat: type ForallXExpr (c :: Type -> Constraint) x = (c XVar x, c XUnboundVar x, c XConLikeOut x, c XRecFld x, c XOverLabel x, c XIPVar x, c XOverLitE x, c XLitE x, c XLam x, c XLamCase x, c XApp x, c XAppTypeE x, c XOpApp x, c XNegApp x, c XPar x, c XSectionL x, c XSectionR x, c XExplicitTuple x, c XExplicitSum x, c XCase x, c XIf x, c XMultiIf x, c XLet x, c XDo x, c XExplicitList x, c XRecordCon x, c XRecordUpd x, c XExprWithTySig x, c XArithSeq x, c XSCC x, c XCoreAnn x, c XBracket x, c XRnBracketOut x, c XTcBracketOut x, c XSpliceE x, c XProc x, c XStatic x, c XArrApp x, c XArrForm x, c XTick x, c XBinTick x, c XTickPragma x, c XEWildPat x, c XEAsPat x, c XEViewPat x, c XELazyPat x, c XWrap x, c XXExpr x)
+ Development.IDE.GHC.Compat: type ForallXExpr (c :: Type -> Constraint) x = (c XVar x, c XUnboundVar x, c XConLikeOut x, c XRecFld x, c XOverLabel x, c XIPVar x, c XOverLitE x, c XLitE x, c XLam x, c XLamCase x, c XApp x, c XAppTypeE x, c XOpApp x, c XNegApp x, c XPar x, c XSectionL x, c XSectionR x, c XExplicitTuple x, c XExplicitSum x, c XCase x, c XIf x, c XMultiIf x, c XLet x, c XDo x, c XExplicitList x, c XRecordCon x, c XRecordUpd x, c XExprWithTySig x, c XArithSeq x, c XSCC x, c XCoreAnn x, c XBracket x, c XRnBracketOut x, c XTcBracketOut x, c XSpliceE x, c XProc x, c XStatic x, c XTick x, c XBinTick x, c XTickPragma x, c XWrap x, c XXExpr x)
- Development.IDE.GHC.Compat: type ForallXFamEqn (c :: Type -> Constraint) x p r = (c XCFamEqn x p r, c XXFamEqn x p r)
+ Development.IDE.GHC.Compat: type ForallXFamEqn (c :: Type -> Constraint) x r = (c XCFamEqn x r, c XXFamEqn x r)
- Development.IDE.GHC.Compat: type ForallXHsDecl (c :: Type -> Constraint) x = (c XTyClD x, c XInstD x, c XDerivD x, c XValD x, c XSigD x, c XDefD x, c XForD x, c XWarningD x, c XAnnD x, c XRuleD x, c XSpliceD x, c XDocD x, c XRoleAnnotD x, c XXHsDecl x)
+ Development.IDE.GHC.Compat: type ForallXHsDecl (c :: Type -> Constraint) x = (c XTyClD x, c XInstD x, c XDerivD x, c XValD x, c XSigD x, c XKindSigD x, c XDefD x, c XForD x, c XWarningD x, c XAnnD x, c XRuleD x, c XSpliceD x, c XDocD x, c XRoleAnnotD x, c XXHsDecl x)
- Development.IDE.GHC.Compat: type ForallXType (c :: Type -> Constraint) x = (c XForAllTy x, c XQualTy x, c XTyVar x, c XAppTy x, c XFunTy x, c XListTy x, c XTupleTy x, c XSumTy x, c XOpTy x, c XParTy x, c XIParamTy x, c XStarTy x, c XKindSig x, c XSpliceTy x, c XDocTy x, c XBangTy x, c XRecTy x, c XExplicitListTy x, c XExplicitTupleTy x, c XTyLit x, c XWildCardTy x, c XXType x)
+ Development.IDE.GHC.Compat: type ForallXType (c :: Type -> Constraint) x = (c XForAllTy x, c XQualTy x, c XTyVar x, c XAppTy x, c XAppKindTy x, c XFunTy x, c XListTy x, c XTupleTy x, c XSumTy x, c XOpTy x, c XParTy x, c XIParamTy x, c XStarTy x, c XKindSig x, c XSpliceTy x, c XDocTy x, c XBangTy x, c XRecTy x, c XExplicitListTy x, c XExplicitTupleTy x, c XTyLit x, c XWildCardTy x, c XXType x)
- Development.IDE.GHC.Compat: type GhcPs = GhcPass Parsed
+ Development.IDE.GHC.Compat: type GhcPs = GhcPass 'Parsed
- Development.IDE.GHC.Compat: type GhcRn = GhcPass Renamed
+ Development.IDE.GHC.Compat: type GhcRn = GhcPass 'Renamed
- Development.IDE.GHC.Compat: type GhcTc = GhcPass Typechecked
+ Development.IDE.GHC.Compat: type GhcTc = GhcPass 'Typechecked
- Development.IDE.GHC.Compat: type HsTyPats pass = [LHsType pass]
+ Development.IDE.GHC.Compat: type HsTyPats pass = [LHsTypeArg pass]
- Development.IDE.GHC.Compat: type LPat p = Located Pat p
+ Development.IDE.GHC.Compat: type LPat p = XRec p Pat
- Development.IDE.GHC.Compat: type OutputableBndrId id = (OutputableBndr NameOrRdrName IdP id, OutputableBndr IdP id, OutputableX id)
+ Development.IDE.GHC.Compat: type OutputableBndrId (pass :: Pass) = (OutputableBndr NameOrRdrName IdP GhcPass pass, OutputableBndr IdP GhcPass pass, OutputableBndr NameOrRdrName IdP NoGhcTc GhcPass pass, OutputableBndr IdP NoGhcTc GhcPass pass, NoGhcTc GhcPass pass ~ NoGhcTc NoGhcTc GhcPass pass, OutputableX GhcPass pass, OutputableX NoGhcTc GhcPass pass)
- Development.IDE.GHC.Compat: type OutputableX p = (Outputable XSigPat p, Outputable XSigPat GhcRn, Outputable XIPBinds p, Outputable XExprWithTySig p, Outputable XExprWithTySig GhcRn, Outputable XAppTypeE p, Outputable XAppTypeE GhcRn, Outputable XViaStrategy p, Outputable XViaStrategy GhcRn)
+ Development.IDE.GHC.Compat: type OutputableX p = (Outputable XIPBinds p, Outputable XViaStrategy p, Outputable XViaStrategy GhcRn)
- Development.IDE.GHC.Compat: type family NameOrRdrName id :: Type
+ Development.IDE.GHC.Compat: type family SrcSpanLess a
- Development.IDE.GHC.Compat: unLoc :: () => GenLocated l e -> e
+ Development.IDE.GHC.Compat: unLoc :: HasSrcSpan a => a -> SrcSpanLess a
- Development.IDE.GHC.Compat: unguardedGRHSs :: () => Located (body (GhcPass p)) -> GRHSs (GhcPass p) (Located (body (GhcPass p)))
+ Development.IDE.GHC.Compat: unguardedGRHSs :: forall body (p :: Pass). Located (body (GhcPass p)) -> GRHSs (GhcPass p) (Located (body (GhcPass p)))
- Development.IDE.GHC.Compat: unguardedRHS :: () => SrcSpan -> Located (body (GhcPass p)) -> [LGRHS (GhcPass p) (Located (body (GhcPass p)))]
+ Development.IDE.GHC.Compat: unguardedRHS :: forall body (p :: Pass). SrcSpan -> Located (body (GhcPass p)) -> [LGRHS (GhcPass p) (Located (body (GhcPass p)))]
- Development.IDE.GHC.Error: catchSrcErrors :: (HasDynFlags m, ExceptionMonad m) => Text -> m a -> m (Either [FileDiagnostic] a)
+ Development.IDE.GHC.Error: catchSrcErrors :: DynFlags -> Text -> IO a -> IO (Either [FileDiagnostic] a)
- Development.IDE.GHC.Util: PFailed :: (DynFlags -> Messages) -> SrcSpan -> MsgDoc -> ParseResult a
+ Development.IDE.GHC.Util: PFailed :: PState -> ParseResult a
- Development.IDE.Import.DependencyInformation: NamedModuleDep :: !NormalizedFilePath -> !ModuleName -> !ModLocation -> NamedModuleDep
+ Development.IDE.Import.DependencyInformation: NamedModuleDep :: !NormalizedFilePath -> !ModuleName -> !Maybe ModLocation -> NamedModuleDep
- Development.IDE.Import.DependencyInformation: [nmdModLocation] :: NamedModuleDep -> !ModLocation
+ Development.IDE.Import.DependencyInformation: [nmdModLocation] :: NamedModuleDep -> !Maybe ModLocation
- Development.IDE.Plugin.Completions: getCompletionsLSP :: LspFuncs c -> IdeState -> CompletionParams -> IO (Either ResponseError CompletionResponseResult)
+ Development.IDE.Plugin.Completions: getCompletionsLSP :: LspFuncs cofd -> IdeState -> CompletionParams -> IO (Either ResponseError CompletionResponseResult)

Files

CHANGELOG.md view
@@ -1,3 +1,27 @@+### 0.5.0 (2020-10-08)+* Use implicit-hie-0.1.2.0 (#880) - (Javier Neira)+* Clarify and downgrade implicit-hie message (#883) - (Avi Dessauer)+* Switch back to bytecode (#873) - (wz1000)+* Add code action for remove all redundant imports (#867) - (Potato Hatsue)+* Fix pretty printer for diagnostic ranges (#871) - (Martin Huschenbett)+* Canonicalize import dirs (#870) - (Pepe Iborra)+* Do not show internal hole names (#852) - (Alejandro Serrano)+* Downgrade file watch debug log to logDebug from logInfo (#848) - (Matthew Pickering)+* Pull in local bindings (#845) - (Sandy Maguire)+* Use object code for Template Haskell, emit desugarer warnings (#836) - (wz1000)+* Fix code action for adding missing constraints to type signatures (#839) - (Jan Hrcek)+* Fix duplicated completions (#837) - (Vitalii)+* FileExists: set one watcher instead of thousands (#831) - (Michael Peyton Jones)+* Drop 8.4 support (#834) - (wz1000)+* Add GetHieAsts rule, Replace SpanInfo, add support for DocumentHighlight and scope-aware completions for local variables (#784) - (wz1000)+* Tag unused warning as such (#815) - (Alejandro Serrano)+* Update instructions for stty error in windows (#825) - (Javier Neira)+* Fix docs tooltip for base libraries on Windows (#814) - (Nick Dunets)+* Fix documentation (or source) link when html file is less specific than module (#766) - (Nick Dunets)+* Add completion tests for records. (#804) - (Guru Devanla)+* Restore identifiers missing from hi file (#741) - (maralorn)+* Fix import suggestions when dot is typed (#800) - (Marcelo Lazaroni)+ ### 0.4.0 (2020-09-15) * Fixes for GHC source plugins: dotpreprocessor works now - (srid) * Use implicit-hie when no explicit hie.yaml (#782) - (Javier Neira)
bench/exe/Main.hs view
@@ -45,6 +45,6 @@    output "starting test" -  cleanUp <- setup+  SetupResult{..} <- setup    runBenchmarks experiments `finally` cleanUp
bench/hist/Main.hs view
@@ -2,25 +2,28 @@      A Shake script to analyze the performance of ghcide over the git history of the project -    Driven by a config file `bench/hist.yaml` containing the list of Git references to analyze.+    Driven by a config file `bench/config.yaml` containing the list of Git references to analyze.      Builds each one of them and executes a set of experiments using the ghcide-bench suite.      The results of the benchmarks and the analysis are recorded in the file     system with the following structure: -    bench-hist-    ├── <git-reference>                       - one folder per version-    │   ├── <experiment>.benchmark-gcStats    - RTS -s output-    │   ├── <experiment>.csv                  - stats for the experiment-    │   ├── <experiment>.svg                  - Graph of bytes over elapsed time-    │   ├── <experiment>.diff.svg             - idem, including the previous version-    │   ├── <experiment>.log                  - ghcide-bench output-    │   ├── ghc.path                          - path to ghc used to build the binary-    │   ├── ghcide                            - binary for this version-    │   └── results.csv                       - results of all the experiments for the version+    bench-results+    ├── <git-reference>+    │   ├── ghc.path                          - path to ghc used to build the binary+    │   ├── ghcide                            - binary for this version+    ├─ <example>+    │   ├── results.csv                           - aggregated results for all the versions+    │   └── <git-reference>+    │       ├── <experiment>.benchmark-gcStats    - RTS -s output+    │       ├── <experiment>.csv                  - stats for the experiment+    │       ├── <experiment>.svg                  - Graph of bytes over elapsed time+    │       ├── <experiment>.diff.svg             - idem, including the previous version+    │       ├── <experiment>.log                  - ghcide-bench output+    │       └── results.csv                       - results of all the experiments for the example     ├── results.csv        - aggregated results of all the experiments and versions-    ├── <experiment>.svg   - graph of bytes over elapsed time, for all the included versions+    └── <experiment>.svg   - graph of bytes over elapsed time, for all the included versions     For diff graphs, the "previous version" is the preceding entry in the list of versions    in the config file. A possible improvement is to obtain this info via `git rev-list`.@@ -31,10 +34,11 @@     To build a specific analysis, enumerate the desired file artifacts -   > stack bench --ba "bench-hist/HEAD/results.csv bench-hist/HEAD/edit.diff.svg"-   > cabal bench --benchmark-options "bench-hist/HEAD/results.csv bench-hist/HEAD/edit.diff.svg"+   > stack bench --ba "bench-results/HEAD/results.csv bench-results/HEAD/edit.diff.svg"+   > cabal bench --benchmark-options "bench-results/HEAD/results.csv bench-results/HEAD/edit.diff.svg"   -}+{-# LANGUAGE ApplicativeDo     #-} {-# LANGUAGE DeriveAnyClass    #-} {-# LANGUAGE DerivingStrategies#-} {-# LANGUAGE TypeFamilies      #-}@@ -49,6 +53,7 @@ import Data.Yaml ((.!=), (.:?), FromJSON (..), ToJSON (..), Value (..), decodeFileThrow) import Development.Shake import Development.Shake.Classes (Binary, Hashable, NFData)+import Experiments.Types (getExampleName, exampleToOptions, Example(..)) import GHC.Exts (IsList (..)) import GHC.Generics (Generic) import qualified Graphics.Rendering.Chart.Backend.Diagrams as E@@ -59,32 +64,30 @@ import System.FilePath import qualified Text.ParserCombinators.ReadP as P import Text.Read (Read (..), get, readMaybe, readP_to_Prec)+import GHC.Stack (HasCallStack)+import Data.List (transpose)  config :: FilePath-config = "bench/hist.yaml"+config = "bench/config.yaml"  -- | Read the config without dependency readConfigIO :: FilePath -> IO Config readConfigIO = decodeFileThrow +newtype GetExample = GetExample String deriving newtype (Binary, Eq, Hashable, NFData, Show)+newtype GetExamples = GetExamples () deriving newtype (Binary, Eq, Hashable, NFData, Show) newtype GetSamples = GetSamples () deriving newtype (Binary, Eq, Hashable, NFData, Show)- newtype GetExperiments = GetExperiments () deriving newtype (Binary, Eq, Hashable, NFData, Show)- newtype GetVersions = GetVersions () deriving newtype (Binary, Eq, Hashable, NFData, Show)- newtype GetParent = GetParent Text deriving newtype (Binary, Eq, Hashable, NFData, Show)- newtype GetCommitId = GetCommitId String deriving newtype (Binary, Eq, Hashable, NFData, Show) +type instance RuleResult GetExample = Maybe Example+type instance RuleResult GetExamples = [Example] type instance RuleResult GetSamples = Natural- type instance RuleResult GetExperiments = [Unescaped String]- type instance RuleResult GetVersions = [GitCommit]- type instance RuleResult GetParent = Text- type instance RuleResult GetCommitId = String  main :: IO ()@@ -96,12 +99,16 @@   _ <- addOracle $ \GetSamples {} -> samples <$> readConfig config   _ <- addOracle $ \GetExperiments {} -> experiments <$> readConfig config   _ <- addOracle $ \GetVersions {} -> versions <$> readConfig config+  _ <- addOracle $ \GetExamples{} -> examples <$> readConfig config   _ <- addOracle $ \(GetParent name) -> findPrev name . versions <$> readConfig config+  _ <- addOracle $ \(GetExample name) -> find (\e -> getExampleName e == name) . examples <$> readConfig config    let readVersions = askOracle $ GetVersions ()       readExperiments = askOracle $ GetExperiments ()+      readExamples = askOracle $ GetExamples ()       readSamples = askOracle $ GetSamples ()       getParent = askOracle . GetParent+      getExample = askOracle . GetExample    configStatic <- liftIO $ readConfigIO config   ghcideBenchPath <- ghcideBench <$> liftIO (readConfigIO config)@@ -111,16 +118,16 @@   phony "all" $ do     Config {..} <- readConfig config -    forM_ versions $ \ver ->-      need [build </> T.unpack (humanName ver) </> "results.csv"]-     need $+      [build </> getExampleName e </> "results.csv" | e <- examples ] ++       [build </> "results.csv"]-        ++ [ build </> escaped (escapeExperiment e) <.> "svg"+        ++ [ build </> getExampleName ex </> escaped (escapeExperiment e) <.> "svg"              | e <- experiments+             , ex <- examples            ]-        ++ [ build </> T.unpack (humanName ver) </> escaped (escapeExperiment e) <.> mode <.> "svg"+        ++ [ build </> getExampleName ex </> T.unpack (humanName ver) </> escaped (escapeExperiment e) <.> mode <.> "svg"              | e <- experiments,+               ex <- examples,                ver <- versions,                mode <- ["", "diff"]            ]@@ -135,14 +142,14 @@       Stdout commitid <- command [] "git" ["rev-list", "-n", "1", gitThing]       writeFileChanged out $ init commitid -  priority 10 $ [build -/- "HEAD/ghcide"+  priority 10 $ [ build -/- "HEAD/ghcide"                 , build -/- "HEAD/ghc.path"                 ]     &%> \[out, ghcpath] -> do       liftIO $ createDirectoryIfMissing True $ dropFileName out       need =<< getDirectoryFiles "." ["src//*.hs", "exe//*.hs", "ghcide.cabal"]       cmd_ $ buildGhcide buildSystem (takeDirectory out)-      ghcLoc <- findGhc buildSystem+      ghcLoc <- findGhc "." buildSystem       writeFile' ghcpath ghcLoc    [ build -/- "*/ghcide",@@ -154,12 +161,11 @@       commitid <- readFile' $ b </> ver </> "commitid"       cmd_ $ "git worktree add bench-temp " ++ commitid       flip actionFinally (cmd_ (s "git worktree remove bench-temp --force")) $ do-        ghcLoc <- findGhc buildSystem+        ghcLoc <- findGhc "bench-temp" buildSystem         cmd_ [Cwd "bench-temp"] $ buildGhcide buildSystem (".." </> takeDirectory out)         writeFile' ghcpath ghcLoc -  priority 8000 $-    build -/- "*/results.csv" %> \out -> do+  build -/- "*/*/results.csv" %> \out -> do       experiments <- readExperiments        let allResultFiles = [takeDirectory out </> escaped (escapeExperiment e) <.> "csv" | e <- experiments]@@ -172,16 +178,17 @@   ghcideBenchResource <- newResource "ghcide-bench" 1    priority 0 $-    [ build -/- "*/*.csv",-      build -/- "*/*.benchmark-gcStats",-      build -/- "*/*.log"+    [ build -/- "*/*/*.csv",+      build -/- "*/*/*.benchmark-gcStats",+      build -/- "*/*/*.log"     ]       &%> \[outcsv, _outGc, outLog] -> do-        let [_, _, exp] = splitDirectories outcsv+        let [_, exampleName, ver, exp] = splitDirectories outcsv+        example <- fromMaybe (error $ "Unknown example " <> exampleName) <$> getExample exampleName         samples <- readSamples         liftIO $ createDirectoryIfMissing True $ dropFileName outcsv-        let ghcide = dropFileName outcsv </> "ghcide"-            ghcpath = dropFileName outcsv </> "ghc.path"+        let ghcide = build </> ver </> "ghcide"+            ghcpath = build </> ver </> "ghc.path"         need [ghcide, ghcpath]         ghcPath <- readFile' ghcpath         withResource ghcideBenchResource 1 $ do@@ -197,58 +204,71 @@                 "-v",                 "--samples=" <> show samples,                 "--csv=" <> outcsv,-                "--example-package-version=3.0.0.0",                 "--ghcide-options= +RTS -I0.5 -RTS",                 "--ghcide=" <> ghcide,                 "--select",                 unescaped (unescapeExperiment (Escaped $ dropExtension exp))               ] +++              exampleToOptions example ++               [ "--stack" | Stack == buildSystem]           cmd_ Shell $ "mv *.benchmark-gcStats " <> dropFileName outcsv    build -/- "results.csv" %> \out -> do-    versions <- readVersions-    let allResultFiles =-          [build </> T.unpack (humanName v) </> "results.csv" | v <- versions]+    examples <- map getExampleName <$> readExamples+    let allResultFiles = [build </> e </> "results.csv" | e <- examples] -    need [build </> T.unpack (humanName v) </> "ghcide" | v <- versions]+    allResults <- traverse readFileLines allResultFiles +    let header = head $ head allResults+        results = map tail allResults+        header' = "example, " <> header+        results' = zipWith (\e -> map (\l -> e <> ", " <> l)) examples results++    writeFileChanged out $ unlines $ header' : concat results'++  build -/- "*/results.csv" %> \out -> do+    versions <- map (T.unpack . humanName) <$> readVersions+    let example = takeFileName $ takeDirectory out+        allResultFiles =+          [build </> example </> v </> "results.csv" | v <- versions]+     allResults <- traverse readFileLines allResultFiles      let header = head $ head allResults         results = map tail allResults         header' = "version, " <> header-        results' = zipWith (\v -> map (\l -> T.unpack (humanName v) <> ", " <> l)) versions results+        results' = zipWith (\v -> map (\l -> v <> ", " <> l)) versions results -    writeFileChanged out $ unlines $ header' : concat results'+    writeFileChanged out $ unlines $ header' : interleave results'    priority 2 $-    build -/- "*/*.diff.svg" %> \out -> do-      let [b, ver, exp_] = splitDirectories out+    build -/- "*/*/*.diff.svg" %> \out -> do+      let [b, example, ver, exp_] = splitDirectories out           exp = Escaped $ dropExtension $ dropExtension exp_       prev <- getParent $ T.pack ver -      runLog <- loadRunLog b exp ver-      runLogPrev <- loadRunLog b exp $ T.unpack prev+      runLog <- loadRunLog b example exp ver+      runLogPrev <- loadRunLog b example exp $ T.unpack prev        let diagram = Diagram Live [runLog, runLogPrev] title           title = show (unescapeExperiment exp) <> " - live bytes over time compared"       plotDiagram True diagram out    priority 1 $-    build -/- "*/*.svg" %> \out -> do-      let [b, ver, exp] = splitDirectories out-      runLog <- loadRunLog b (Escaped $ dropExtension exp) ver+    build -/- "*/*/*.svg" %> \out -> do+      let [b, example, ver, exp] = splitDirectories out+      runLog <- loadRunLog b example (Escaped $ dropExtension exp) ver       let diagram = Diagram Live [runLog] title           title = ver <> " live bytes over time"       plotDiagram True diagram out -  build -/- "*.svg" %> \out -> do+  build -/- "*/*.svg" %> \out -> do     let exp = Escaped $ dropExtension $ takeFileName out+        example = takeFileName $ takeDirectory out     versions <- readVersions      runLogs <- forM (filter include versions) $ \v -> do-      loadRunLog build exp $ T.unpack $ humanName v+      loadRunLog build example exp $ T.unpack $ humanName v      let diagram = Diagram Live runLogs title         title = show (unescapeExperiment exp) <> " - live bytes over time"@@ -270,17 +290,18 @@         <> " build ghcide:ghcide --copy-bins --ghc-options -rtsopts"  -findGhc :: BuildSystem -> Action FilePath-findGhc Cabal =+findGhc :: FilePath -> BuildSystem -> Action FilePath+findGhc _cwd Cabal =     liftIO $ fromMaybe (error "ghc is not in the PATH") <$> findExecutable "ghc"-findGhc Stack = do-    Stdout ghcLoc <- cmd (s "stack exec which ghc")+findGhc cwd Stack = do+    Stdout ghcLoc <- cmd [Cwd cwd] (s "stack exec which ghc")     return ghcLoc  --------------------------------------------------------------------------------  data Config = Config   { experiments :: [Unescaped String],+    examples :: [Example],     samples :: Natural,     versions :: [GitCommit],     -- | Path to the ghcide-bench binary for the experiments@@ -290,7 +311,7 @@     buildTool :: BuildSystem   }   deriving (Generic, Show)-  deriving anyclass (FromJSON, ToJSON)+  deriving anyclass (FromJSON)  data GitCommit = GitCommit   { -- | A git hash, tag or branch name (e.g. v0.1.0)@@ -399,14 +420,15 @@ -- | A file path containing the output of -S for a given run data RunLog = RunLog   { runVersion :: !String,+    _runExample :: !String,     _runExperiment :: !String,     runFrames :: ![Frame],     runSuccess :: !Bool   } -loadRunLog :: FilePath -> Escaped FilePath -> FilePath -> Action RunLog-loadRunLog buildF exp ver = do-  let log_fp = buildF </> ver </> escaped exp <.> "benchmark-gcStats"+loadRunLog :: HasCallStack => FilePath -> String -> Escaped FilePath -> FilePath -> Action RunLog+loadRunLog buildF example exp ver = do+  let log_fp = buildF </> example </> ver </> escaped exp <.> "benchmark-gcStats"       csv_fp = replaceExtension log_fp "csv"   log <- readFileLines log_fp   csv <- readFileLines csv_fp@@ -420,7 +442,7 @@       success = case map (T.split (== ',') . T.pack) csv of           [_header, _name:s:_] | Just s <- readMaybe (T.unpack s) -> s           _ -> error $ "Cannot parse: " <> csv_fp-  return $ RunLog ver (dropExtension $ escaped exp) frames success+  return $ RunLog ver example (dropExtension $ escaped exp) frames success  plotDiagram :: Bool -> Diagram -> FilePath -> Action () plotDiagram includeFailed t@Diagram {traceMetric, runLogs} out = do@@ -460,6 +482,9 @@   where     f '_' = ' '     f other = other++interleave :: [[a]] -> [a]+interleave = concat . transpose  myColors :: [E.AlphaColour Double] myColors = map E.opaque
bench/lib/Experiments.hs view
@@ -1,6 +1,8 @@+{-# LANGUAGE RankNTypes #-} {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE ExistentialQuantification #-} {-# LANGUAGE ImplicitParams #-}+{-# LANGUAGE ImpredicativeTypes #-}  module Experiments ( Bench(..)@@ -8,78 +10,79 @@ , Config(..) , Verbosity(..) , CabalStack(..)+, SetupResult(..)+, Example(..) , experiments , configP , defConfig , output , setup , runBench-, runBenchmarks+, exampleToOptions ) where import Control.Applicative.Combinators (skipManyTill) import Control.Concurrent import Control.Exception.Safe import Control.Monad.Extra import Control.Monad.IO.Class+import Data.Aeson (Value(Null)) import Data.Char (isDigit) import Data.List import Data.Maybe+import qualified Data.Text as T import Data.Version+import Development.IDE.Plugin.Test+import Experiments.Types import Language.Haskell.LSP.Test import Language.Haskell.LSP.Types import Language.Haskell.LSP.Types.Capabilities import Numeric.Natural import Options.Applicative import System.Directory+import System.Environment.Blank (getEnv) import System.FilePath ((</>)) import System.Process import System.Time.Extra import Text.ParserCombinators.ReadP (readP_to_S)-import System.Environment.Blank (getEnv) --- Points to a string in the target file,--- convenient for hygienic edits-hygienicP :: Position-hygienicP = Position 854 23--hygienicEdit :: TextDocumentContentChangeEvent+hygienicEdit :: (?hygienicP :: Position) => TextDocumentContentChangeEvent hygienicEdit =     TextDocumentContentChangeEvent-    { _range = Just (Range hygienicP hygienicP),+    { _range = Just (Range ?hygienicP ?hygienicP),         _rangeLength = Nothing,         _text = " "     } -breakingEdit :: TextDocumentContentChangeEvent+breakingEdit :: (?identifierP :: Position) => TextDocumentContentChangeEvent breakingEdit =     TextDocumentContentChangeEvent-    { _range = Just (Range identifierP identifierP),+    { _range = Just (Range ?identifierP ?identifierP),         _rangeLength = Nothing,         _text = "a"     } --- Points to the middle of an identifier,--- convenient for requesting goto-def, hover and completions-identifierP :: Position-identifierP = Position 853 12+-- | Experiments have access to these special positions:+-- - hygienicP points to a string in the target file, convenient for hygienic edits+-- - identifierP points to the middle of an identifier, convenient for goto-def, hover and completions+type HasPositions = (?hygienicP :: Position, ?identifierP :: Position)  experiments :: [Bench] experiments =     [ ---------------------------------------------------------------------------------------       bench "hover" 10 $ \doc ->-        isJust <$> getHover doc identifierP,+        isJust <$> getHover doc ?identifierP,       ---------------------------------------------------------------------------------------       bench "edit" 10 $ \doc -> do         changeDoc doc [hygienicEdit]-        void (skipManyTill anyMessage message :: Session WorkDoneProgressEndNotification)+        waitForProgressDone         return True,       ---------------------------------------------------------------------------------------       bench "hover after edit" 10 $ \doc -> do         changeDoc doc [hygienicEdit]-        isJust <$> getHover doc identifierP,+        isJust <$> getHover doc ?identifierP,       ---------------------------------------------------------------------------------------       bench "getDefinition" 10 $ \doc ->-        not . null <$> getDefinitions doc identifierP,+        not . null <$> getDefinitions doc ?identifierP,       ---------------------------------------------------------------------------------------       bench "documentSymbols" 100 $         fmap (either (not . null) (not . null)) . getDocumentSymbols,@@ -90,15 +93,15 @@       ---------------------------------------------------------------------------------------       bench "completions after edit" 10 $ \doc -> do         changeDoc doc [hygienicEdit]-        not . null <$> getCompletions doc identifierP,+        not . null <$> getCompletions doc ?identifierP,       ---------------------------------------------------------------------------------------       benchWithSetup         "code actions"         10         ( \doc -> do             changeDoc doc [breakingEdit]-            void (skipManyTill anyMessage message :: Session WorkDoneProgressEndNotification)-            return identifierP+            waitForProgressDone+            return ?identifierP         )         ( \p doc -> do             not . null <$> getCodeActions doc (Range p p)@@ -109,7 +112,7 @@         10         ( \doc -> do             changeDoc doc [breakingEdit]-            return identifierP+            return ?identifierP         )         ( \p doc -> do             changeDoc doc [hygienicEdit]@@ -120,40 +123,12 @@  --------------------------------------------------------------------------------------------- -examplePackageName :: HasConfig => String-examplePackageName = name-  where-      (name, _, _) = examplePackageUsed ?config--examplePackage :: HasConfig => String-examplePackage = name <> "-" <> showVersion version-  where-      (name, version, _) = examplePackageUsed ?config- exampleModulePath :: HasConfig => FilePath-exampleModulePath = path-  where-      (_,_, path) = examplePackageUsed ?config+exampleModulePath = exampleModule (example ?config)  examplesPath :: FilePath examplesPath = "bench/example" -data Verbosity = Quiet | Normal | All-  deriving (Eq, Show)-data Config = Config-  { verbosity :: !Verbosity,-    -- For some reason, the Shake profile files are truncated and won't load-    shakeProfiling :: !(Maybe FilePath),-    outputCSV :: !FilePath,-    buildTool :: !CabalStack,-    ghcideOptions :: ![String],-    matches :: ![String],-    repetitions :: Maybe Natural,-    ghcide :: FilePath,-    timeoutLsp :: Int,-    examplePackageUsed :: (String, Version, String)-  }-  deriving (Eq, Show)  defConfig :: Config Success defConfig = execParserPure defaultPrefs (info configP fullDesc) []@@ -162,9 +137,6 @@ verbose = (== All) . verbosity quiet   = (== Quiet) . verbosity -data CabalStack = Cabal | Stack-  deriving (Eq, Show)- type HasConfig = (?config :: Config)  configP :: Parser Config@@ -182,9 +154,15 @@     <*> optional (option auto (long "samples" <> metavar "NAT" <> help "override sampling count"))     <*> strOption (long "ghcide" <> metavar "PATH" <> help "path to ghcide" <> value "ghcide")     <*> option auto (long "timeout" <> value 60 <> help "timeout for waiting for a ghcide response")-    <*> ( (,,) <$> strOption (long "example-package-name" <> value "Cabal")+    <*> ( GetPackage <$> strOption (long "example-package-name" <> value "Cabal")+               <*> moduleOption                <*> option versionP (long "example-package-version" <> value (makeVersion [3,2,0,0]))-               <*> strOption (long "example-package-module" <> metavar "PATH" <> value "Distribution/Simple.hs"))+         <|>+          UsePackage <$> strOption (long "example-path")+                     <*> moduleOption+         )+  where+      moduleOption = strOption (long "example-module" <> metavar "PATH" <> value "Distribution/Simple.hs")  versionP :: ReadM Version versionP = maybeReader $ extract . readP_to_S parseVersion@@ -203,8 +181,8 @@   { name :: !String,     enabled :: !Bool,     samples :: !Natural,-    benchSetup :: TextDocumentIdentifier -> Session setup,-    experiment :: setup -> Experiment+    benchSetup :: HasPositions => TextDocumentIdentifier -> Session setup,+    experiment :: HasPositions => setup -> Experiment   }  select :: HasConfig => Bench -> Bool@@ -216,38 +194,51 @@ benchWithSetup ::   String ->   Natural ->-  (TextDocumentIdentifier -> Session p) ->-  (p -> Experiment) ->+  (HasPositions => TextDocumentIdentifier -> Session p) ->+  (HasPositions => p -> Experiment) ->   Bench benchWithSetup name samples benchSetup experiment = Bench {..}   where     enabled = True -bench :: String -> Natural -> Experiment -> Bench+bench :: String -> Natural -> (HasPositions => Experiment) -> Bench bench name defSamples userExperiment =   benchWithSetup name defSamples (const $ pure ()) experiment   where     experiment () = userExperiment -runBenchmarks :: HasConfig => [Bench] -> IO ()-runBenchmarks allBenchmarks = do+runBenchmarksFun :: HasConfig => FilePath -> [Bench] -> IO ()+runBenchmarksFun dir allBenchmarks = do   let benchmarks = [ b{samples = fromMaybe (samples b) (repetitions ?config) }                    | b <- allBenchmarks                    , select b ]   results <- forM benchmarks $ \b@Bench{name} ->-                let run dir = runSessionWithConfig conf (cmd name dir) lspTestCaps dir+                let run = runSessionWithConfig conf (cmd name dir) lspTestCaps dir                 in (b,) <$> runBench run b    -- output raw data as CSV-  let headers = ["name", "success", "samples", "startup", "setup", "experiment", "maxResidency"]+  let headers =+        [ "name"+        , "success"+        , "samples"+        , "startup"+        , "setup"+        , "userTime"+        , "delayedTime"+        , "totalTime"+        , "maxResidency"+        , "allocatedBytes"]       rows =         [ [ name,             show success,             show samples,             show startup,             show runSetup',+            show userWaits,+            show delayedWork,             show runExperiment,-            showMB maxResidency+            show maxResidency,+            show allocations           ]           | (Bench {name, samples}, BenchRun {..}) <- results,             let runSetup' = if runSetup < 0.01 then 0 else runSetup@@ -265,8 +256,11 @@             show samples,             showDuration startup,             showDuration runSetup',+            showDuration userWaits,+            showDuration delayedWork,             showDuration runExperiment,-            showMB maxResidency+            showMB maxResidency,+            showMB allocations           ]           | (Bench {name, samples}, BenchRun {..}) <- results,             let runSetup' = if runSetup < 0.01 then 0 else runSetup@@ -280,6 +274,7 @@       unwords $         [ ghcide ?config,           "--lsp",+          "--test",           "--cwd",           dir,           "+RTS",@@ -288,9 +283,9 @@         ]           ++ ghcideOptions ?config           ++ concat-            [ ["--shake-profiling", path]-              | Just path <- [shakeProfiling ?config]+            [ ["--shake-profiling", path] | Just path <- [shakeProfiling ?config]             ]+          ++ ["--verbose" | verbose ?config]     lspTestCaps =       fullCaps {_window = Just $ WindowClientCapabilities $ Just True}     conf =@@ -305,108 +300,164 @@   { startup :: !Seconds,     runSetup :: !Seconds,     runExperiment :: !Seconds,+    userWaits :: !Seconds,+    delayedWork :: !Seconds,     success :: !Bool,-    maxResidency :: !Int+    maxResidency :: !Int,+    allocations :: !Int   }  badRun :: BenchRun-badRun = BenchRun 0 0 0 False 0+badRun = BenchRun 0 0 0 0 0 False 0 0  waitForProgressDone :: Session () waitForProgressDone =       void(skipManyTill anyMessage message :: Session WorkDoneProgressEndNotification) -runBench :: (?config::Config) => (String -> Session BenchRun -> IO BenchRun) -> Bench -> IO BenchRun-runBench runSess Bench {..} = handleAny (\e -> print e >> return badRun)-  $ runSess dir+runBench ::+  (?config :: Config) =>+  (Session BenchRun -> IO BenchRun) ->+  (HasPositions => Bench) ->+  IO BenchRun+runBench runSess b = handleAny (\e -> print e >> return badRun)+  $ runSess   $ do     doc <- openDoc exampleModulePath "haskell"-    (startup, _) <- duration $ do-      waitForProgressDone-      -- wait again, as the progress is restarted once while loading the cradle-      -- make an edit, to ensure this doesn't block-      changeDoc doc [hygienicEdit]-      waitForProgressDone +    -- Setup the special positions used by the experiments+    lastLine <- length . T.lines <$> documentContents doc+    changeDoc doc [TextDocumentContentChangeEvent+        { _range = Just (Range (Position lastLine 0) (Position lastLine 0))+        , _rangeLength = Nothing+        , _text = T.unlines+               [ "_hygienic = \"hygienic\""+               , "_identifier = _hygienic"+               ]+        }]+    let+      -- Points to a string in the target file,+      -- convenient for hygienic edits+      ?hygienicP = Position lastLine 15+    let+      -- Points to the middle of an identifier,+      -- convenient for requesting goto-def, hover and completions+      ?identifierP = Position (lastLine+1) 15 -    liftIO $ output $ "Running " <> name <> " benchmark"-    (runSetup, userState) <- duration $ benchSetup doc-    let loop 0 = return True-        loop n = do-          (t, res) <- duration $ experiment userState doc-          if not res-            then return False-            else do-              output (showDuration t)-              loop (n -1)+    case b of+     Bench{..} -> do+      (startup, _) <- duration $ do+        waitForProgressDone+        -- wait again, as the progress is restarted once while loading the cradle+        -- make an edit, to ensure this doesn't block+        changeDoc doc [hygienicEdit]+        waitForProgressDone -    (runExperiment, success) <- duration $ loop samples+      liftIO $ output $ "Running " <> name <> " benchmark"+      (runSetup, userState) <- duration $ benchSetup doc+      let loop !userWaits !delayedWork 0 = return $ Just (userWaits, delayedWork)+          loop !userWaits !delayedWork n = do+            (t, res) <- duration $ experiment userState doc+            if not res+              then return Nothing+              else do+                output (showDuration t)+                -- Wait for the delayed actions to finish+                waitId <- sendRequest (CustomClientMethod "test") WaitForShakeQueue+                (td, resp) <- duration $ skipManyTill anyMessage $ responseForId waitId+                case resp of+                    ResponseMessage{_result=Right Null} -> do+                      loop (userWaits+t) (delayedWork+td) (n -1)+                    _ ->+                    -- Assume a ghcide build lacking the WaitForShakeQueue command+                      loop (userWaits+t) delayedWork (n -1) -    -- sleep to give ghcide a chance to GC-    liftIO $ threadDelay 1100000+      (runExperiment, result) <- duration $ loop 0 0 samples+      let success = isJust result+          (userWaits, delayedWork) = fromMaybe (0,0) result+          gcStats = escapeSpaces (name <> ".benchmark-gcStats") -    maxResidency <- liftIO $-        ifM (doesFileExist gcStats)-            (parseMaxResidency <$> readFile gcStats)-            (pure 0)+      -- sleep to give ghcide a chance to GC+      liftIO $ threadDelay 1100000 -    return BenchRun {..}-  where-    dir = "bench/example/" <> examplePackage-    gcStats = escapeSpaces (name <> ".benchmark-gcStats")+      (maxResidency, allocations) <- liftIO $+          ifM (doesFileExist gcStats)+              (parseMaxResidencyAndAllocations <$> readFile gcStats)+              (pure (0,0)) -setup :: HasConfig => IO (IO ())+      return BenchRun {..}++data SetupResult = SetupResult {+    runBenchmarks :: [Bench] -> IO (),+    -- | Path to the setup benchmark example+    benchDir :: FilePath,+    cleanUp :: IO ()+}++setup :: HasConfig => IO SetupResult setup = do   alreadyExists <- doesDirectoryExist examplesPath   when alreadyExists $ removeDirectoryRecursive examplesPath-  let path = examplesPath </> examplePackage-  case buildTool ?config of-      Cabal -> do-        callCommand $ "cabal get -v0 " <> examplePackage <> " -d " <> examplesPath-        writeFile-            (path </> "hie.yaml")-            ("cradle: {cabal: {component: " <> show examplePackageName <> "}}")-        -- Need this in case there is a parent cabal.project somewhere-        writeFile-            (path </> "cabal.project")-            "packages: ."-        writeFile-            (path </> "cabal.project.local")-            ""-      Stack -> do-        callCommand $ "stack --silent unpack " <> examplePackage <> " --to " <> examplesPath-        -- Generate the stack descriptor to match the one used to build ghcide-        stack_yaml <- fromMaybe "stack.yaml" <$> getEnv "STACK_YAML"-        stack_yaml_lines <- lines <$> readFile stack_yaml-        writeFile (path </> stack_yaml)-                  (unlines $-                   "packages: [.]" :-                    [ l-                    | l <- stack_yaml_lines-                    , any (`isPrefixOf` l)-                        ["resolver"-                        ,"allow-newer"-                        ,"compiler"]-                    ]-                  )+  benchDir <- case example ?config of+      UsePackage{..} -> return examplePath+      GetPackage{..} -> do+        let path = examplesPath </> package+            package = exampleName <> "-" <> showVersion exampleVersion+        case buildTool ?config of+            Cabal -> do+                callCommand $ "cabal get -v0 " <> package <> " -d " <> examplesPath+                writeFile+                    (path </> "hie.yaml")+                    ("cradle: {cabal: {component: " <> exampleName <> "}}")+                -- Need this in case there is a parent cabal.project somewhere+                writeFile+                    (path </> "cabal.project")+                    "packages: ."+                writeFile+                    (path </> "cabal.project.local")+                    ""+            Stack -> do+                callCommand $ "stack --silent unpack " <> package <> " --to " <> examplesPath+                -- Generate the stack descriptor to match the one used to build ghcide+                stack_yaml <- fromMaybe "stack.yaml" <$> getEnv "STACK_YAML"+                stack_yaml_lines <- lines <$> readFile stack_yaml+                writeFile (path </> stack_yaml)+                        (unlines $+                        "packages: [.]" :+                            [ l+                            | l <- stack_yaml_lines+                            , any (`isPrefixOf` l)+                                ["resolver"+                                ,"allow-newer"+                                ,"compiler"]+                            ]+                        ) -        writeFile-            (path </> "hie.yaml")-            ("cradle: {stack: {component: " <> show (examplePackageName <> ":lib") <> "}}")+                writeFile+                    (path </> "hie.yaml")+                    ("cradle: {stack: {component: " <> show (exampleName <> ":lib") <> "}}")+        return path    whenJust (shakeProfiling ?config) $ createDirectoryIfMissing True -  return $ removeDirectoryRecursive examplesPath+  let cleanUp = case example ?config of+        GetPackage{} -> removeDirectoryRecursive examplesPath+        UsePackage{} -> return () ---------------------------------------------------------------------------------------------+      runBenchmarks = runBenchmarksFun benchDir --- Parse the max residency in RTS -s output-parseMaxResidency :: String -> Int-parseMaxResidency input =-  case find ("maximum residency" `isInfixOf`) (reverse $ lines input) of-    Just l -> read $ filter isDigit $ head (words l)-    Nothing -> -1+  return SetupResult{..} +--------------------------------------------------------------------------------------------++-- Parse the max residency and allocations in RTS -s output+parseMaxResidencyAndAllocations :: String -> (Int, Int)+parseMaxResidencyAndAllocations input =+    (f "maximum residency", f "bytes allocated in the heap")+  where+    inps = reverse $ lines input+    f label = case find (label `isInfixOf`) inps of+        Just l -> read $ filter isDigit $ head $ words l+        Nothing -> -1  escapeSpaces :: String -> String escapeSpaces = map f
+ bench/lib/Experiments/Types.hs view
@@ -0,0 +1,67 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DerivingStrategies #-}+module Experiments.Types where++import Data.Aeson+import Data.Version+import Numeric.Natural+import System.FilePath (isPathSeparator)+import Development.Shake.Classes+import GHC.Generics++data CabalStack = Cabal | Stack+  deriving (Eq, Show)++data Verbosity = Quiet | Normal | All+  deriving (Eq, Show)+data Config = Config+  { verbosity :: !Verbosity,+    -- For some reason, the Shake profile files are truncated and won't load+    shakeProfiling :: !(Maybe FilePath),+    outputCSV :: !FilePath,+    buildTool :: !CabalStack,+    ghcideOptions :: ![String],+    matches :: ![String],+    repetitions :: Maybe Natural,+    ghcide :: FilePath,+    timeoutLsp :: Int,+    example :: Example+  }+  deriving (Eq, Show)++data Example+    = GetPackage {exampleName, exampleModule :: String, exampleVersion :: Version}+    | UsePackage {examplePath :: FilePath, exampleModule :: String}+  deriving (Eq, Generic, Show)+  deriving anyclass (Binary, Hashable, NFData)++getExampleName :: Example -> String+getExampleName UsePackage{examplePath} = map replaceSeparator examplePath+  where+      replaceSeparator x+        | isPathSeparator x = '_'+        | otherwise = x+getExampleName GetPackage{exampleName, exampleVersion} =+    exampleName <> "-" <> showVersion exampleVersion++instance FromJSON Example where+    parseJSON = withObject "example" $ \x -> do+        exampleModule <- x .: "module"+        path <- x .:? "path"+        case path of+            Just examplePath -> return UsePackage{..}+            Nothing -> do+                exampleName <- x .: "name"+                exampleVersion <- x .: "version"+                return GetPackage {..}++exampleToOptions :: Example -> [String]+exampleToOptions GetPackage{..} =+    ["--example-package-name", exampleName+    ,"--example-package-version", showVersion exampleVersion+    ,"--example-module", exampleModule+    ]+exampleToOptions UsePackage{..} =+    ["--example-path", examplePath+    ,"--example-module", exampleModule+    ]
ghcide.cabal view
@@ -2,7 +2,7 @@ build-type:         Simple category:           Development name:               ghcide-version:            0.4.0+version:            0.5.0 license:            Apache-2.0 license-file:       LICENSE author:             Digital Asset and Ghcide contributors@@ -13,7 +13,7 @@     A library for building Haskell IDE's on top of the GHC API. homepage:           https://github.com/haskell/ghcide#readme bug-reports:        https://github.com/haskell/ghcide/issues-tested-with:        GHC>=8.4.4+tested-with:        GHC>=8.6.5 extra-source-files: include/ghc-api-version.h README.md CHANGELOG.md                     test/data/hover/*.hs                     test/data/multi/cabal.project@@ -48,10 +48,13 @@         extra,         fuzzy,         filepath,+        fingertree,+        Glob,         haddock-library >= 1.8,         hashable,         haskell-lsp-types == 0.22.*,         haskell-lsp == 0.22.*,+        hie-compat,         mtl,         network-uri,         prettyprinter-ansi-terminal,@@ -80,14 +83,14 @@       build-depends:         ghc-boot-th,         ghc-boot,-        ghc >= 8.4,+        ghc >= 8.6,         -- These dependencies are used by Development.IDE.Session and are         -- Haskell specific. So don't use them when building with -fghc-lib!         ghc-check >=0.5.0.1,         ghc-paths,         cryptohash-sha1 >=0.11.100 && <0.12,         hie-bios >= 0.7.1 && < 0.8.0,-        implicit-hie-cradle >= 0.2.0.0 && < 0.3,+        implicit-hie-cradle >= 0.2.0.1 && < 0.3,         base16-bytestring >=0.1.1 && <0.2     if os(windows)       build-depends:@@ -126,12 +129,14 @@         Development.IDE.Core.IdeConfiguration         Development.IDE.Core.OfInterest         Development.IDE.Core.PositionMapping+        Development.IDE.Core.Preprocessor         Development.IDE.Core.Rules         Development.IDE.Core.RuleTypes         Development.IDE.Core.Service         Development.IDE.Core.Shake         Development.IDE.GHC.Compat         Development.IDE.GHC.Error+        Development.IDE.GHC.Orphans         Development.IDE.GHC.Util         Development.IDE.Import.DependencyInformation         Development.IDE.LSP.HoverDefinition@@ -140,6 +145,8 @@         Development.IDE.LSP.Protocol         Development.IDE.LSP.Server         Development.IDE.Spans.Common+        Development.IDE.Spans.AtPoint+        Development.IDE.Spans.LocalBindings         Development.IDE.Types.Diagnostics         Development.IDE.Types.Exports         Development.IDE.Types.Location@@ -165,42 +172,18 @@         Development.IDE.Session.VersionCheck     other-modules:         Development.IDE.Core.Compile-        Development.IDE.Core.Preprocessor         Development.IDE.Core.FileExists         Development.IDE.GHC.CPP-        Development.IDE.GHC.Orphans         Development.IDE.GHC.Warnings-        Development.IDE.GHC.WithDynFlags         Development.IDE.Import.FindImports         Development.IDE.LSP.Notifications-        Development.IDE.Spans.AtPoint-        Development.IDE.Spans.Calculate         Development.IDE.Spans.Documentation-        Development.IDE.Spans.Type         Development.IDE.Plugin.CodeAction.PositionIndexed         Development.IDE.Plugin.CodeAction.Rules         Development.IDE.Plugin.CodeAction.RuleTypes         Development.IDE.Plugin.Completions.Logic         Development.IDE.Plugin.Completions.Types         Development.IDE.Types.Action-    if (impl(ghc > 8.5) && impl(ghc < 8.7)) && !flag(ghc-lib)-      hs-source-dirs: src-ghc86-      other-modules:-        Development.IDE.GHC.HieAst-        Development.IDE.GHC.HieBin-        Development.IDE.GHC.HieTypes-        Development.IDE.GHC.HieDebug-        Development.IDE.GHC.HieUtils-    if (impl(ghc > 8.7) && impl(ghc < 8.10)) || flag(ghc-lib)-      hs-source-dirs: src-ghc88-      other-modules:-        Development.IDE.GHC.HieAst-        Development.IDE.GHC.HieBin-    if (impl(ghc > 8.9))-      hs-source-dirs: src-ghc810-      other-modules:-        Development.IDE.GHC.HieAst-        Development.IDE.GHC.HieBin     ghc-options: -Wall -Wno-name-shadowing -Wincomplete-uni-patterns  executable ghcide-test-preprocessor@@ -215,7 +198,9 @@     type: exitcode-stdio-1.0     default-language: Haskell2010     ghc-options: -Wall -Wno-name-shadowing -threaded-    main-is: bench/hist/Main.hs+    main-is: Main.hs+    hs-source-dirs: bench/hist bench/lib+    other-modules: Experiments.Types     build-tool-depends:         ghcide:ghcide,         ghcide:ghcide-bench@@ -335,7 +320,7 @@         haskell-lsp-types,         network-uri,         lens,-        lsp-test >= 0.11.0.5 && < 0.12,+        lsp-test >= 0.11.0.6 && < 0.12,         optparse-applicative,         process,         QuickCheck,@@ -362,6 +347,7 @@         Development.IDE.Test         Development.IDE.Test.Runfiles         Experiments+        Experiments.Types     default-extensions:         BangPatterns         DeriveFunctor@@ -394,13 +380,16 @@         lsp-test >= 0.11.0.2 && < 0.12,         optparse-applicative,         process,-        safe-exceptions+        safe-exceptions,+        shake,+        text     hs-source-dirs: bench/lib bench/exe     include-dirs: include     ghc-options: -threaded -Wall -Wno-name-shadowing     main-is: Main.hs     other-modules:         Experiments+        Experiments.Types     default-extensions:         BangPatterns         DeriveFunctor
session-loader/Development/IDE/Session.hs view
@@ -34,7 +34,8 @@ import Development.IDE.Core.OfInterest import Development.IDE.Core.Shake import Development.IDE.Core.RuleTypes-import Development.IDE.GHC.Compat+import Development.IDE.GHC.Compat hiding (Target, TargetModule, TargetFile)+import qualified Development.IDE.GHC.Compat as GHC import Development.IDE.GHC.Util import Development.IDE.Session.VersionCheck import Development.IDE.Types.Diagnostics@@ -58,14 +59,12 @@ import System.IO  import GHCi-import DynFlags-import HscTypes+import HscTypes (ic_dflags, hsc_IC, hsc_dflags, hsc_NC) import Linker import Module import NameCache import Packages import Control.Exception (evaluate)-import Data.Char  -- | Given a root directory, return a Shake 'Action' which setups an -- 'IdeGhcSession' given a file.@@ -111,15 +110,19 @@     IdeOptions{ optTesting = IdeTesting optTesting               , optCheckProject = CheckProject checkProject               , optCustomDynFlags+              , optExtensions               } <- getIdeOptions          -- populate the knownTargetsVar with all the         -- files in the project so that `knownFiles` can learn about them and         -- we can generate a complete module graph     let extendKnownTargets newTargets = do-          knownTargets <- forM newTargets $ \TargetDetails{..} -> do-            found <- filterM (IO.doesFileExist . fromNormalizedFilePath) targetLocations-            return (targetModule, found)+          knownTargets <- forM newTargets $ \TargetDetails{..} ->+            case targetTarget of+              TargetFile f -> pure (targetTarget, [f])+              TargetModule _ -> do+                found <- filterM (IO.doesFileExist . fromNormalizedFilePath) targetLocations+                return (targetTarget, found)           modifyVar_ knownTargetsVar $ traverseHashed $ \known -> do             let known' = HM.unionWith (<>) known $ HM.fromList knownTargets             when (known /= known') $@@ -198,7 +201,7 @@       let session :: (Maybe FilePath, NormalizedFilePath, ComponentOptions, FilePath)-                -> IO ([NormalizedFilePath],(IdeResult HscEnvEq,[FilePath]))+                -> IO (IdeResult HscEnvEq,[FilePath])         session args@(hieYaml, _cfp, _opts, _libDir) = do           (hscEnv, new, old_deps) <- packageSetup args @@ -227,7 +230,7 @@            -- New HscEnv for the component in question, returns the new HscEnvEq and           -- a mapping from FilePath to the newly created HscEnvEq.-          let new_cache = newComponentCache logger hieYaml hscEnv uids+          let new_cache = newComponentCache logger optExtensions hieYaml _cfp hscEnv uids           (cs, res) <- new_cache new           -- Modified cache targets for everything else in the hie.yaml file           -- which now uses the same EPS and so on@@ -244,11 +247,21 @@           invalidateShakeCache           restartShakeSession [kick] -          let resultCachedTargets = concatMap targetLocations all_targets+          -- Typecheck all files in the project on startup+          unless (null cs || not checkProject) $ do+                cfps' <- liftIO $ filterM (IO.doesFileExist . fromNormalizedFilePath) (concatMap targetLocations cs)+                void $ shakeEnqueue extras $ mkDelayedAction "InitialLoad" Debug $ void $ do+                    mmt <- uses GetModificationTime cfps'+                    let cs_exist = catMaybes (zipWith (<$) cfps' mmt)+                    modIfaces <- uses GetModIface cs_exist+                    -- update exports map+                    extras <- getShakeExtras+                    let !exportsMap' = createExportsMap $ mapMaybe (fmap hirModIface) modIfaces+                    liftIO $ modifyVar_ (exportsMap extras) $ evaluate . (exportsMap' <>) -          return (resultCachedTargets, second Map.keys res)+          return (second Map.keys res) -    let consultCradle :: Maybe FilePath -> FilePath -> IO ([NormalizedFilePath], (IdeResult HscEnvEq, [FilePath]))+    let consultCradle :: Maybe FilePath -> FilePath -> IO (IdeResult HscEnvEq, [FilePath])         consultCradle hieYaml cfp = do            lfp <- flip makeRelative cfp <$> getCurrentDirectory            logInfo logger $ T.pack ("Consulting the cradle for " <> show lfp)@@ -275,7 +288,7 @@                  InstallationNotFound{..} ->                      error $ "GHC installation not found in libdir: " <> libdir                  InstallationMismatch{..} ->-                     return ([],(([renderPackageSetupException cfp GhcVersionMismatch{..}], Nothing),[]))+                     return (([renderPackageSetupException cfp GhcVersionMismatch{..}], Nothing),[])                  InstallationChecked _compileTime _ghcLibCheck ->                    session (hieYaml, toNormalizedFilePath' cfp, opts, libDir)              -- Failure case, either a cradle error or the none cradle@@ -285,12 +298,12 @@                let res = (map (renderCradleError ncfp) err, Nothing)                modifyVar_ fileToFlags $ \var -> do                  pure $ Map.insertWith HM.union hieYaml (HM.singleton ncfp (res, dep_info)) var-               return ([ncfp],(res,[]))+               return (res,[])      -- This caches the mapping from hie.yaml + Mod.hs -> [String]     -- Returns the Ghc session and the cradle dependencies     let sessionOpts :: (Maybe FilePath, FilePath)-                    -> IO ([NormalizedFilePath], (IdeResult HscEnvEq, [FilePath]))+                    -> IO (IdeResult HscEnvEq, [FilePath])         sessionOpts (hieYaml, file) = do           v <- fromMaybe HM.empty . Map.lookup hieYaml <$> readVar fileToFlags           cfp <- canonicalizePath file@@ -305,37 +318,25 @@                   -- Keep the same name cache                   modifyVar_ hscEnvs (return . Map.adjust (\(h, _) -> (h, [])) hieYaml )                   consultCradle hieYaml cfp-                else return (HM.keys v, (opts, Map.keys old_di))+                else return (opts, Map.keys old_di)             Nothing -> consultCradle hieYaml cfp      -- The main function which gets options for a file. We only want one of these running     -- at a time. Therefore the IORef contains the currently running cradle, if we try     -- to get some more options then we wait for the currently running action to finish     -- before attempting to do so.-    let getOptions :: FilePath -> IO ([NormalizedFilePath],(IdeResult HscEnvEq, [FilePath]))+    let getOptions :: FilePath -> IO (IdeResult HscEnvEq, [FilePath])         getOptions file = do             hieYaml <- cradleLoc file             sessionOpts (hieYaml, file) `catch` \e ->-                return ([],(([renderPackageSetupException file e], Nothing),[]))+                return (([renderPackageSetupException file e], Nothing),[])      returnWithVersion $ \file -> do-      (cs, opts) <- liftIO $ join $ mask_ $ modifyVar runningCradle $ \as -> do+      opts <- liftIO $ join $ mask_ $ modifyVar runningCradle $ \as -> do         -- If the cradle is not finished, then wait for it to finish.         void $ wait as         as <- async $ getOptions file-        return (fmap snd as, wait as)-      unless (null cs) $ do-        cfps' <- liftIO $ filterM (IO.doesFileExist . fromNormalizedFilePath) cs-        -- Typecheck all files in the project on startup-        void $ shakeEnqueue extras $ mkDelayedAction "InitialLoad" Debug $ void $ do-          when checkProject $ do-            mmt <- uses GetModificationTime cfps'-            let cs_exist = catMaybes (zipWith (<$) cfps' mmt)-            modIfaces <- uses GetModIface cs_exist-            -- update xports map-            extras <- getShakeExtras-            let !exportsMap' = createExportsMap $ mapMaybe (fmap hirModIface) modIfaces-            liftIO $ modifyVar_ (exportsMap extras) $ evaluate . (exportsMap' <>)+        return (as, wait as)       pure opts  -- | Run the specific cradle on a specific FilePath via hie-bios.@@ -369,42 +370,35 @@ emptyHscEnv nc libDir = do     env <- runGhc (Just libDir) getSession     initDynLinker env-    pure $ setNameCache nc env+    pure $ setNameCache nc env{ hsc_dflags = (hsc_dflags env){useUnicode = True } }  data TargetDetails = TargetDetails   {-      targetModule :: !ModuleName,+      targetTarget :: !Target,       targetEnv :: !(IdeResult HscEnvEq),       targetDepends :: !DependencyInfo,       targetLocations :: ![NormalizedFilePath]   }  fromTargetId :: [FilePath]          -- ^ import paths+             -> [String]            -- ^ extensions to consider              -> TargetId              -> IdeResult HscEnvEq              -> DependencyInfo              -> IO [TargetDetails] -- For a target module we consider all the import paths-fromTargetId is (TargetModule mod) env dep = do-    let fps = [i </> moduleNameSlashes mod -<.> ext | ext <- exts, i <- is ]-        exts = ["hs", "hs-boot", "lhs"]+fromTargetId is exts (GHC.TargetModule mod) env dep = do+    let fps = [i </> moduleNameSlashes mod -<.> ext <> boot+              | ext <- exts+              , i <- is+              , boot <- ["", "-boot"]+              ]     locs <- mapM (fmap toNormalizedFilePath' . canonicalizePath) fps-    return [TargetDetails mod env dep locs]+    return [TargetDetails (TargetModule mod) env dep locs] -- For a 'TargetFile' we consider all the possible module names-fromTargetId _ (TargetFile f _) env deps = do+fromTargetId _ _ (GHC.TargetFile f _) env deps = do     nf <- toNormalizedFilePath' <$> canonicalizePath f-    return [TargetDetails m env deps [nf] | m <- moduleNames f]---- >>> moduleNames "src/A/B.hs"--- [A.B,B]-moduleNames :: FilePath -> [ModuleName]-moduleNames f = map (mkModuleName .intercalate ".") $ init $ tails nameSegments-    where-        nameSegments = reverse-                     $ takeWhile (isUpper . head)-                     $ reverse-                     $ splitDirectories-                     $ dropExtension f+    return [TargetDetails (TargetFile nf) env deps [nf]]  toFlagsMap :: TargetDetails -> [(NormalizedFilePath, (IdeResult HscEnvEq, DependencyInfo))] toFlagsMap TargetDetails{..} =@@ -417,12 +411,14 @@ -- | Create a mapping from FilePaths to HscEnvEqs newComponentCache          :: Logger+         -> [String]       -- File extensions to consider          -> Maybe FilePath -- Path to cradle+         -> NormalizedFilePath -- Path to file that caused the creation of this component          -> HscEnv          -> [(InstalledUnitId, DynFlags)]          -> ComponentInfo          -> IO ( [TargetDetails], (IdeResult HscEnvEq, DependencyInfo))-newComponentCache logger cradlePath hsc_env uids ci = do+newComponentCache logger exts cradlePath cfp hsc_env uids ci = do     let df = componentDynFlags ci     let hscEnv' = hsc_env { hsc_dflags = df                           , hsc_IC = (hsc_IC hsc_env) { ic_dflags = df } }@@ -434,7 +430,7 @@         res = (targetEnv, targetDepends)     logDebug logger ("New Component Cache HscEnvEq: " <> T.pack (show res)) -    let mk t = fromTargetId (importPaths df) (targetId t) targetEnv targetDepends+    let mk t = fromTargetId (importPaths df) exts (targetId t) targetEnv targetDepends     ctargets <- concatMapM mk (componentTargets ci)      -- A special target for the file which caused this wonderful@@ -442,7 +438,7 @@     -- the component, in which case things will be horribly broken anyway.     -- Otherwise, we will immediately attempt to reload this module which     -- causes an infinite loop and high CPU usage.-    let special_target = TargetDetails (mkModuleName "special") targetEnv targetDepends [componentFP ci]+    let special_target = TargetDetails (TargetFile cfp) targetEnv targetDepends [componentFP ci]     return (special_target:ctargets, res)  {- Note [Avoiding bad interface files]@@ -507,6 +503,7 @@     pure $ dflags           & setHiDir cacheDir           & setHieDir cacheDir+          & setODir cacheDir   renderCradleError :: NormalizedFilePath -> CradleError -> FileDiagnostic@@ -525,7 +522,7 @@   -- We do not want to use them unprocessed.   , rawComponentDynFlags :: DynFlags   -- | All targets of this components.-  , rawComponentTargets :: [Target]+  , rawComponentTargets :: [GHC.Target]   -- | Filepath which caused the creation of this component   , rawComponentFP :: NormalizedFilePath   -- | Component Options used to load the component.@@ -546,7 +543,7 @@   -- ComponentOptions.   , _componentInternalUnits :: [InstalledUnitId]   -- | All targets of this components.-  , componentTargets :: [Target]+  , componentTargets :: [GHC.Target]   -- | Filepath which caused the creation of this component   , componentFP :: NormalizedFilePath   -- | Component Options used to load the component.@@ -619,7 +616,7 @@             Just res -> return (mp, res)  -- | Throws if package flags are unsatisfiable-setOptions :: GhcMonad m => ComponentOptions -> DynFlags -> m (DynFlags, [Target])+setOptions :: GhcMonad m => ComponentOptions -> DynFlags -> m (DynFlags, [GHC.Target]) setOptions (ComponentOptions theOpts compRoot _) dflags = do     (dflags', targets) <- addCmdOpts theOpts dflags     let dflags'' =@@ -663,6 +660,11 @@     -- override user settings to avoid conflicts leading to recompilation     d { hiDir      = Just f} +setODir :: FilePath -> DynFlags -> DynFlags+setODir f d =+    -- override user settings to avoid conflicts leading to recompilation+    d { objectDir = Just f}+ getCacheDir :: String -> [String] -> IO FilePath getCacheDir prefix opts = getXdgDirectory XdgCache (cacheDir </> prefix ++ "-" ++ opts_hash)     where@@ -677,10 +679,11 @@ notifyUserImplicitCradle:: FilePath -> FromServerMessage notifyUserImplicitCradle fp =     NotShowMessage $-    NotificationMessage "2.0" WindowShowMessage $ ShowMessageParams MtWarning $+    NotificationMessage "2.0" WindowShowMessage $ ShowMessageParams MtInfo $       "No [cradle](https://github.com/mpickering/hie-bios#hie-bios) found for "       <> T.pack fp <>-      ".\n Proceeding with [implicit cradle](https://hackage.haskell.org/package/implicit-hie)"+      ".\n Proceeding with [implicit cradle](https://hackage.haskell.org/package/implicit-hie).\n\+      \You should ignore this message, unless you see a 'Multi Cradle: No prefixes matched' error."  notifyCradleLoaded :: FilePath -> FromServerMessage notifyCradleLoaded fp =
− src-ghc810/Development/IDE/GHC/HieAst.hs
@@ -1,1928 +0,0 @@-{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}--{--Forked from GHC v8.10.1 to work around the readFile side effect in mkHiefile--Main functions for .hie file generation--}-{- HLINT ignore -}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE TypeSynonymInstances #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE TypeApplications #-}-{-# LANGUAGE AllowAmbiguousTypes #-}-{-# LANGUAGE ViewPatterns #-}-{-# LANGUAGE DeriveDataTypeable #-}-module Development.IDE.GHC.HieAst ( mkHieFile ) where--import GhcPrelude--import Avail                      ( Avails )-import Bag                        ( Bag, bagToList )-import BasicTypes-import BooleanFormula-import Class                      ( FunDep )-import CoreUtils                  ( exprType )-import ConLike                    ( conLikeName )-import Desugar                    ( deSugarExpr )-import FieldLabel-import GHC.Hs-import HscTypes-import Module                     ( ModuleName, ml_hs_file )-import MonadUtils                 ( concatMapM, liftIO )-import Name                       ( Name, nameSrcSpan, setNameLoc )-import NameEnv                    ( NameEnv, emptyNameEnv, extendNameEnv, lookupNameEnv )-import SrcLoc-import TcHsSyn                    ( hsLitType, hsPatType )-import Type                       ( mkVisFunTys, Type )-import TysWiredIn                 ( mkListTy, mkSumTy )-import Var                        ( Id, Var, setVarName, varName, varType )-import TcRnTypes-import MkIface                    ( mkIfaceExports )-import Panic--import HieTypes-import HieUtils--import qualified Data.Array as A-import qualified Data.ByteString as BS-import qualified Data.Map as M-import qualified Data.Set as S-import Data.Data                  ( Data, Typeable )-import Data.List                  ( foldl1' )-import Data.Maybe                 ( listToMaybe )-import Control.Monad.Trans.Reader-import Control.Monad.Trans.Class  ( lift )--{- Note [Updating HieAst for changes in the GHC AST]--When updating the code in this file for changes in the GHC AST, you-need to pay attention to the following things:--1) Symbols (Names/Vars/Modules) in the following categories:--   a) Symbols that appear in the source file that directly correspond to-   something the user typed-   b) Symbols that don't appear in the source, but should be in some sense-   "visible" to a user, particularly via IDE tooling or the like. This-   includes things like the names introduced by RecordWildcards (We record-   all the names introduced by a (..) in HIE files), and will include implicit-   parameters and evidence variables after one of my pending MRs lands.--2) Subtrees that may contain such symbols, or correspond to a SrcSpan in-   the file. This includes all `Located` things--For 1), you need to call `toHie` for one of the following instances--instance ToHie (Context (Located Name)) where ...-instance ToHie (Context (Located Var)) where ...-instance ToHie (IEContext (Located ModuleName)) where ...--`Context` is a data type that looks like:--data Context a = C ContextInfo a -- Used for names and bindings--`ContextInfo` is defined in `HieTypes`, and looks like--data ContextInfo-  = Use                -- ^ regular variable-  | MatchBind-  | IEThing IEType     -- ^ import/export-  | TyDecl-  -- | Value binding-  | ValBind-      BindType     -- ^ whether or not the binding is in an instance-      Scope        -- ^ scope over which the value is bound-      (Maybe Span) -- ^ span of entire binding-  ...--It is used to annotate symbols in the .hie files with some extra information on-the context in which they occur and should be fairly self explanatory. You need-to select one that looks appropriate for the symbol usage. In very rare cases,-you might need to extend this sum type if none of the cases seem appropriate.--So, given a `Located Name` that is just being "used", and not defined at a-particular location, you would do the following:--   toHie $ C Use located_name--If you select one that corresponds to a binding site, you will need to-provide a `Scope` and a `Span` for your binding. Both of these are basically-`SrcSpans`.--The `SrcSpan` in the `Scope` is supposed to span over the part of the source-where the symbol can be legally allowed to occur. For more details on how to-calculate this, see Note [Capturing Scopes and other non local information]-in HieAst.--The binding `Span` is supposed to be the span of the entire binding for-the name.--For a function definition `foo`:--foo x = x + y-  where y = x^2--The binding `Span` is the span of the entire function definition from `foo x`-to `x^2`.  For a class definition, this is the span of the entire class, and-so on.  If this isn't well defined for your bit of syntax (like a variable-bound by a lambda), then you can just supply a `Nothing`--There is a test that checks that all symbols in the resulting HIE file-occur inside their stated `Scope`. This can be turned on by passing the--fvalidate-ide-info flag to ghc along with -fwrite-ide-info to generate the-.hie file.--You may also want to provide a test in testsuite/test/hiefile that includes-a file containing your new construction, and tests that the calculated scope-is valid (by using -fvalidate-ide-info)--For subtrees in the AST that may contain symbols, the procedure is fairly-straightforward.  If you are extending the GHC AST, you will need to provide a-`ToHie` instance for any new types you may have introduced in the AST.--Here are is an extract from the `ToHie` instance for (LHsExpr (GhcPass p)):--  toHie e@(L mspan oexpr) = concatM $ getTypeNode e : case oexpr of-      HsVar _ (L _ var) ->-        [ toHie $ C Use (L mspan var)-             -- Patch up var location since typechecker removes it-        ]-      HsConLikeOut _ con ->-        [ toHie $ C Use $ L mspan $ conLikeName con-        ]-      ...-      HsApp _ a b ->-        [ toHie a-        , toHie b-        ]--If your subtree is `Located` or has a `SrcSpan` available, the output list-should contain a HieAst `Node` corresponding to the subtree. You can use-either `makeNode` or `getTypeNode` for this purpose, depending on whether it-makes sense to assign a `Type` to the subtree. After this, you just need-to concatenate the result of calling `toHie` on all subexpressions and-appropriately annotated symbols contained in the subtree.--The code above from the ToHie instance of `LhsExpr (GhcPass p)` is supposed-to work for both the renamed and typechecked source. `getTypeNode` is from-the `HasType` class defined in this file, and it has different instances-for `GhcTc` and `GhcRn` that allow it to access the type of the expression-when given a typechecked AST:--class Data a => HasType a where-  getTypeNode :: a -> HieM [HieAST Type]-instance HasType (LHsExpr GhcTc) where-  getTypeNode e@(L spn e') = ... -- Actually get the type for this expression-instance HasType (LHsExpr GhcRn) where-  getTypeNode (L spn e) = makeNode e spn -- Fallback to a regular `makeNode` without recording the type--If your subtree doesn't have a span available, you can omit the `makeNode`-call and just recurse directly in to the subexpressions.---}---- These synonyms match those defined in main/GHC.hs-type RenamedSource     = ( HsGroup GhcRn, [LImportDecl GhcRn]-                         , Maybe [(LIE GhcRn, Avails)]-                         , Maybe LHsDocString )-type TypecheckedSource = LHsBinds GhcTc---{- Note [Name Remapping]-The Typechecker introduces new names for mono names in AbsBinds.-We don't care about the distinction between mono and poly bindings,-so we replace all occurrences of the mono name with the poly name.--}-newtype HieState = HieState-  { name_remapping :: NameEnv Id-  }--initState :: HieState-initState = HieState emptyNameEnv--class ModifyState a where -- See Note [Name Remapping]-  addSubstitution :: a -> a -> HieState -> HieState--instance ModifyState Name where-  addSubstitution _ _ hs = hs--instance ModifyState Id where-  addSubstitution mono poly hs =-    hs{name_remapping = extendNameEnv (name_remapping hs) (varName mono) poly}--modifyState :: ModifyState (IdP p) => [ABExport p] -> HieState -> HieState-modifyState = foldr go id-  where-    go ABE{abe_poly=poly,abe_mono=mono} f = addSubstitution mono poly . f-    go _ f = f--type HieM = ReaderT HieState Hsc---- | Construct an 'HieFile' from the outputs of the typechecker.-mkHieFile :: ModSummary-          -> TcGblEnv-          -> RenamedSource-          -> BS.ByteString -> Hsc HieFile-mkHieFile ms ts rs src = do-  let tc_binds = tcg_binds ts-  (asts', arr) <- getCompressedAsts tc_binds rs-  let Just src_file = ml_hs_file $ ms_location ms-  return $ HieFile-      { hie_hs_file = src_file-      , hie_module = ms_mod ms-      , hie_types = arr-      , hie_asts = asts'-      -- mkIfaceExports sorts the AvailInfos for stability-      , hie_exports = mkIfaceExports (tcg_exports ts)-      , hie_hs_src = src-      }--getCompressedAsts :: TypecheckedSource -> RenamedSource-  -> Hsc (HieASTs TypeIndex, A.Array TypeIndex HieTypeFlat)-getCompressedAsts ts rs = do-  asts <- enrichHie ts rs-  return $ compressTypes asts--enrichHie :: TypecheckedSource -> RenamedSource -> Hsc (HieASTs Type)-enrichHie ts (hsGrp, imports, exports, _) = flip runReaderT initState $ do-    tasts <- toHie $ fmap (BC RegularBind ModuleScope) ts-    rasts <- processGrp hsGrp-    imps <- toHie $ filter (not . ideclImplicit . unLoc) imports-    exps <- toHie $ fmap (map $ IEC Export . fst) exports-    let spanFile children = case children of-          [] -> mkRealSrcSpan (mkRealSrcLoc "" 1 1) (mkRealSrcLoc "" 1 1)-          _ -> mkRealSrcSpan (realSrcSpanStart $ nodeSpan $ head children)-                             (realSrcSpanEnd   $ nodeSpan $ last children)--        modulify xs =-          Node (simpleNodeInfo "Module" "Module") (spanFile xs) xs--        asts = HieASTs-          $ resolveTyVarScopes-          $ M.map (modulify . mergeSortAsts)-          $ M.fromListWith (++)-          $ map (\x -> (srcSpanFile (nodeSpan x),[x])) flat_asts--        flat_asts = concat-          [ tasts-          , rasts-          , imps-          , exps-          ]-    return asts-  where-    processGrp grp = concatM-      [ toHie $ fmap (RS ModuleScope ) hs_valds grp-      , toHie $ hs_splcds grp-      , toHie $ hs_tyclds grp-      , toHie $ hs_derivds grp-      , toHie $ hs_fixds grp-      , toHie $ hs_defds grp-      , toHie $ hs_fords grp-      , toHie $ hs_warnds grp-      , toHie $ hs_annds grp-      , toHie $ hs_ruleds grp-      ]--getRealSpan :: SrcSpan -> Maybe Span-getRealSpan (RealSrcSpan sp) = Just sp-getRealSpan _ = Nothing--grhss_span :: GRHSs p body -> SrcSpan-grhss_span (GRHSs _ xs bs) = foldl' combineSrcSpans (getLoc bs) (map getLoc xs)-grhss_span (XGRHSs _) = panic "XGRHS has no span"--bindingsOnly :: [Context Name] -> [HieAST a]-bindingsOnly [] = []-bindingsOnly (C c n : xs) = case nameSrcSpan n of-  RealSrcSpan span -> Node nodeinfo span [] : bindingsOnly xs-    where nodeinfo = NodeInfo S.empty [] (M.singleton (Right n) info)-          info = mempty{identInfo = S.singleton c}-  _ -> bindingsOnly xs--concatM :: Monad m => [m [a]] -> m [a]-concatM xs = concat <$> sequence xs--{- Note [Capturing Scopes and other non local information]-toHie is a local tranformation, but scopes of bindings cannot be known locally,-hence we have to push the relevant info down into the binding nodes.-We use the following types (*Context and *Scoped) to wrap things and-carry the required info-(Maybe Span) always carries the span of the entire binding, including rhs--}-data Context a = C ContextInfo a -- Used for names and bindings--data RContext a = RC RecFieldContext a-data RFContext a = RFC RecFieldContext (Maybe Span) a--- ^ context for record fields--data IEContext a = IEC IEType a--- ^ context for imports/exports--data BindContext a = BC BindType Scope a--- ^ context for imports/exports--data PatSynFieldContext a = PSC (Maybe Span) a--- ^ context for pattern synonym fields.--data SigContext a = SC SigInfo a--- ^ context for type signatures--data SigInfo = SI SigType (Maybe Span)--data SigType = BindSig | ClassSig | InstSig--data RScoped a = RS Scope a--- ^ Scope spans over everything to the right of a, (mostly) not--- including a itself--- (Includes a in a few special cases like recursive do bindings) or--- let/where bindings---- | Pattern scope-data PScoped a = PS (Maybe Span)-                    Scope       -- ^ use site of the pattern-                    Scope       -- ^ pattern to the right of a, not including a-                    a-  deriving (Typeable, Data) -- Pattern Scope--{- Note [TyVar Scopes]-Due to -XScopedTypeVariables, type variables can be in scope quite far from-their original binding. We resolve the scope of these type variables-in a separate pass--}-data TScoped a = TS TyVarScope a -- TyVarScope--data TVScoped a = TVS TyVarScope Scope a -- TyVarScope--- ^ First scope remains constant--- Second scope is used to build up the scope of a tyvar over--- things to its right, ala RScoped---- | Each element scopes over the elements to the right-listScopes :: Scope -> [Located a] -> [RScoped (Located a)]-listScopes _ [] = []-listScopes rhsScope [pat] = [RS rhsScope pat]-listScopes rhsScope (pat : pats) = RS sc pat : pats'-  where-    pats'@((RS scope p):_) = listScopes rhsScope pats-    sc = combineScopes scope $ mkScope $ getLoc p---- | 'listScopes' specialised to 'PScoped' things-patScopes-  :: Maybe Span-  -> Scope-  -> Scope-  -> [LPat (GhcPass p)]-  -> [PScoped (LPat (GhcPass p))]-patScopes rsp useScope patScope xs =-  map (\(RS sc a) -> PS rsp useScope sc (composeSrcSpan a)) $-    listScopes patScope (map dL xs)---- | 'listScopes' specialised to 'TVScoped' things-tvScopes-  :: TyVarScope-  -> Scope-  -> [LHsTyVarBndr a]-  -> [TVScoped (LHsTyVarBndr a)]-tvScopes tvScope rhsScope xs =-  map (\(RS sc a)-> TVS tvScope sc a) $ listScopes rhsScope xs--{- Note [Scoping Rules for SigPat]-Explicitly quantified variables in pattern type signatures are not-brought into scope in the rhs, but implicitly quantified variables-are (HsWC and HsIB).-This is unlike other signatures, where explicitly quantified variables-are brought into the RHS Scope-For example-foo :: forall a. ...;-foo = ... -- a is in scope here--bar (x :: forall a. a -> a) = ... -- a is not in scope here---   ^ a is in scope here (pattern body)--bax (x :: a) = ... -- a is in scope here-Because of HsWC and HsIB pass on their scope to their children-we must wrap the LHsType in pattern signatures in a-Shielded explictly, so that the HsWC/HsIB scope is not passed-on the the LHsType--}--data Shielded a = SH Scope a -- Ignores its TScope, uses its own scope instead--type family ProtectedSig a where-  ProtectedSig GhcRn = HsWildCardBndrs GhcRn (HsImplicitBndrs-                                                GhcRn-                                                (Shielded (LHsType GhcRn)))-  ProtectedSig GhcTc = NoExtField--class ProtectSig a where-  protectSig :: Scope -> LHsSigWcType (NoGhcTc a) -> ProtectedSig a--instance (HasLoc a) => HasLoc (Shielded a) where-  loc (SH _ a) = loc a--instance (ToHie (TScoped a)) => ToHie (TScoped (Shielded a)) where-  toHie (TS _ (SH sc a)) = toHie (TS (ResolvedScopes [sc]) a)--instance ProtectSig GhcTc where-  protectSig _ _ = noExtField--instance ProtectSig GhcRn where-  protectSig sc (HsWC a (HsIB b sig)) =-    HsWC a (HsIB b (SH sc sig))-  protectSig _ (HsWC _ (XHsImplicitBndrs nec)) = noExtCon nec-  protectSig _ (XHsWildCardBndrs nec) = noExtCon nec--class HasLoc a where-  -- ^ defined so that HsImplicitBndrs and HsWildCardBndrs can-  -- know what their implicit bindings are scoping over-  loc :: a -> SrcSpan--instance HasLoc thing => HasLoc (TScoped thing) where-  loc (TS _ a) = loc a--instance HasLoc thing => HasLoc (PScoped thing) where-  loc (PS _ _ _ a) = loc a--instance HasLoc (LHsQTyVars GhcRn) where-  loc (HsQTvs _ vs) = loc vs-  loc _ = noSrcSpan--instance HasLoc thing => HasLoc (HsImplicitBndrs a thing) where-  loc (HsIB _ a) = loc a-  loc _ = noSrcSpan--instance HasLoc thing => HasLoc (HsWildCardBndrs a thing) where-  loc (HsWC _ a) = loc a-  loc _ = noSrcSpan--instance HasLoc (Located a) where-  loc (L l _) = l--instance HasLoc a => HasLoc [a] where-  loc [] = noSrcSpan-  loc xs = foldl1' combineSrcSpans $ map loc xs--instance HasLoc a => HasLoc (FamEqn s a) where-  loc (FamEqn _ a Nothing b _ c) = foldl1' combineSrcSpans [loc a, loc b, loc c]-  loc (FamEqn _ a (Just tvs) b _ c) = foldl1' combineSrcSpans-                                              [loc a, loc tvs, loc b, loc c]-  loc _ = noSrcSpan-instance (HasLoc tm, HasLoc ty) => HasLoc (HsArg tm ty) where-  loc (HsValArg tm) = loc tm-  loc (HsTypeArg _ ty) = loc ty-  loc (HsArgPar sp)  = sp--instance HasLoc (HsDataDefn GhcRn) where-  loc def@(HsDataDefn{}) = loc $ dd_cons def-    -- Only used for data family instances, so we only need rhs-    -- Most probably the rest will be unhelpful anyway-  loc _ = noSrcSpan--{- Note [Real DataCon Name]-The typechecker subtitutes the conLikeWrapId for the name, but we don't want-this showing up in the hieFile, so we replace the name in the Id with the-original datacon name-See also Note [Data Constructor Naming]--}-class HasRealDataConName p where-  getRealDataCon :: XRecordCon p -> Located (IdP p) -> Located (IdP p)--instance HasRealDataConName GhcRn where-  getRealDataCon _ n = n-instance HasRealDataConName GhcTc where-  getRealDataCon RecordConTc{rcon_con_like = con} (L sp var) =-    L sp (setVarName var (conLikeName con))---- | The main worker class--- See Note [Updating HieAst for changes in the GHC AST] for more information--- on how to add/modify instances for this.-class ToHie a where-  toHie :: a -> HieM [HieAST Type]---- | Used to collect type info-class Data a => HasType a where-  getTypeNode :: a -> HieM [HieAST Type]--instance (ToHie a) => ToHie [a] where-  toHie = concatMapM toHie--instance (ToHie a) => ToHie (Bag a) where-  toHie = toHie . bagToList--instance (ToHie a) => ToHie (Maybe a) where-  toHie = maybe (pure []) toHie--instance ToHie (Context (Located NoExtField)) where-  toHie _ = pure []--instance ToHie (TScoped NoExtField) where-  toHie _ = pure []--instance ToHie (IEContext (Located ModuleName)) where-  toHie (IEC c (L (RealSrcSpan span) mname)) =-      pure $ [Node (NodeInfo S.empty [] idents) span []]-    where details = mempty{identInfo = S.singleton (IEThing c)}-          idents = M.singleton (Left mname) details-  toHie _ = pure []--instance ToHie (Context (Located Var)) where-  toHie c = case c of-      C context (L (RealSrcSpan span) name')-        -> do-        m <- asks name_remapping-        let name = case lookupNameEnv m (varName name') of-              Just var -> var-              Nothing-> name'-        pure-          [Node-            (NodeInfo S.empty [] $-              M.singleton (Right $ varName name)-                          (IdentifierDetails (Just $ varType name')-                                             (S.singleton context)))-            span-            []]-      _ -> pure []--instance ToHie (Context (Located Name)) where-  toHie c = case c of-      C context (L (RealSrcSpan span) name') -> do-        m <- asks name_remapping-        let name = case lookupNameEnv m name' of-              Just var -> varName var-              Nothing -> name'-        pure-          [Node-            (NodeInfo S.empty [] $-              M.singleton (Right name)-                          (IdentifierDetails Nothing-                                             (S.singleton context)))-            span-            []]-      _ -> pure []---- | Dummy instances - never called-instance ToHie (TScoped (LHsSigWcType GhcTc)) where-  toHie _ = pure []-instance ToHie (TScoped (LHsWcType GhcTc)) where-  toHie _ = pure []-instance ToHie (SigContext (LSig GhcTc)) where-  toHie _ = pure []-instance ToHie (TScoped Type) where-  toHie _ = pure []--instance HasType (LHsBind GhcRn) where-  getTypeNode (L spn bind) = makeNode bind spn--instance HasType (LHsBind GhcTc) where-  getTypeNode (L spn bind) = case bind of-      FunBind{fun_id = name} -> makeTypeNode bind spn (varType $ unLoc name)-      _ -> makeNode bind spn--instance HasType (Located (Pat GhcRn)) where-  getTypeNode (dL -> L spn pat) = makeNode pat spn--instance HasType (Located (Pat GhcTc)) where-  getTypeNode (dL -> L spn opat) = makeTypeNode opat spn (hsPatType opat)--instance HasType (LHsExpr GhcRn) where-  getTypeNode (L spn e) = makeNode e spn---- | This instance tries to construct 'HieAST' nodes which include the type of--- the expression. It is not yet possible to do this efficiently for all--- expression forms, so we skip filling in the type for those inputs.------ 'HsApp', for example, doesn't have any type information available directly on--- the node. Our next recourse would be to desugar it into a 'CoreExpr' then--- query the type of that. Yet both the desugaring call and the type query both--- involve recursive calls to the function and argument! This is particularly--- problematic when you realize that the HIE traversal will eventually visit--- those nodes too and ask for their types again.------ Since the above is quite costly, we just skip cases where computing the--- expression's type is going to be expensive.------ See #16233-instance HasType (LHsExpr GhcTc) where-  getTypeNode e@(L spn e') = lift $-    -- Some expression forms have their type immediately available-    let tyOpt = case e' of-          HsLit _ l -> Just (hsLitType l)-          HsOverLit _ o -> Just (overLitType o)--          HsLam     _ (MG { mg_ext = groupTy }) -> Just (matchGroupType groupTy)-          HsLamCase _ (MG { mg_ext = groupTy }) -> Just (matchGroupType groupTy)-          HsCase _  _ (MG { mg_ext = groupTy }) -> Just (mg_res_ty groupTy)--          ExplicitList  ty _ _   -> Just (mkListTy ty)-          ExplicitSum   ty _ _ _ -> Just (mkSumTy ty)-          HsDo          ty _ _   -> Just ty-          HsMultiIf     ty _     -> Just ty--          _ -> Nothing--    in-    case tyOpt of-      Just t -> makeTypeNode e' spn t-      Nothing-        | skipDesugaring e' -> fallback-        | otherwise -> do-            hs_env <- Hsc $ \e w -> return (e,w)-            (_,mbe) <- liftIO $ deSugarExpr hs_env e-            maybe fallback (makeTypeNode e' spn . exprType) mbe-    where-      fallback = makeNode e' spn--      matchGroupType :: MatchGroupTc -> Type-      matchGroupType (MatchGroupTc args res) = mkVisFunTys args res--      -- | Skip desugaring of these expressions for performance reasons.-      ---      -- See impact on Haddock output (esp. missing type annotations or links)-      -- before marking more things here as 'False'. See impact on Haddock-      -- performance before marking more things as 'True'.-      skipDesugaring :: HsExpr a -> Bool-      skipDesugaring e = case e of-        HsVar{}        -> False-        HsUnboundVar{} -> False-        HsConLikeOut{} -> False-        HsRecFld{}     -> False-        HsOverLabel{}  -> False-        HsIPVar{}      -> False-        HsWrap{}       -> False-        _              -> True--instance ( ToHie (Context (Located (IdP a)))-         , ToHie (MatchGroup a (LHsExpr a))-         , ToHie (PScoped (LPat a))-         , ToHie (GRHSs a (LHsExpr a))-         , ToHie (LHsExpr a)-         , ToHie (Located (PatSynBind a a))-         , HasType (LHsBind a)-         , ModifyState (IdP a)-         , Data (HsBind a)-         ) => ToHie (BindContext (LHsBind a)) where-  toHie (BC context scope b@(L span bind)) =-    concatM $ getTypeNode b : case bind of-      FunBind{fun_id = name, fun_matches = matches} ->-        [ toHie $ C (ValBind context scope $ getRealSpan span) name-        , toHie matches-        ]-      PatBind{pat_lhs = lhs, pat_rhs = rhs} ->-        [ toHie $ PS (getRealSpan span) scope NoScope lhs-        , toHie rhs-        ]-      VarBind{var_rhs = expr} ->-        [ toHie expr-        ]-      AbsBinds{abs_exports = xs, abs_binds = binds} ->-        [ local (modifyState xs) $ -- Note [Name Remapping]-            toHie $ fmap (BC context scope) binds-        ]-      PatSynBind _ psb ->-        [ toHie $ L span psb -- PatSynBinds only occur at the top level-        ]-      XHsBindsLR _ -> []--instance ( ToHie (LMatch a body)-         ) => ToHie (MatchGroup a body) where-  toHie mg = concatM $ case mg of-    MG{ mg_alts = (L span alts) , mg_origin = FromSource } ->-      [ pure $ locOnly span-      , toHie alts-      ]-    MG{} -> []-    XMatchGroup _ -> []--instance ( ToHie (Context (Located (IdP a)))-         , ToHie (PScoped (LPat a))-         , ToHie (HsPatSynDir a)-         ) => ToHie (Located (PatSynBind a a)) where-    toHie (L sp psb) = concatM $ case psb of-      PSB{psb_id=var, psb_args=dets, psb_def=pat, psb_dir=dir} ->-        [ toHie $ C (Decl PatSynDec $ getRealSpan sp) var-        , toHie $ toBind dets-        , toHie $ PS Nothing lhsScope NoScope pat-        , toHie dir-        ]-        where-          lhsScope = combineScopes varScope detScope-          varScope = mkLScope var-          detScope = case dets of-            (PrefixCon args) -> foldr combineScopes NoScope $ map mkLScope args-            (InfixCon a b) -> combineScopes (mkLScope a) (mkLScope b)-            (RecCon r) -> foldr go NoScope r-          go (RecordPatSynField a b) c = combineScopes c-            $ combineScopes (mkLScope a) (mkLScope b)-          detSpan = case detScope of-            LocalScope a -> Just a-            _ -> Nothing-          toBind (PrefixCon args) = PrefixCon $ map (C Use) args-          toBind (InfixCon a b) = InfixCon (C Use a) (C Use b)-          toBind (RecCon r) = RecCon $ map (PSC detSpan) r-      XPatSynBind _ -> []--instance ( ToHie (MatchGroup a (LHsExpr a))-         ) => ToHie (HsPatSynDir a) where-  toHie dir = case dir of-    ExplicitBidirectional mg -> toHie mg-    _ -> pure []--instance ( a ~ GhcPass p-         , ToHie body-         , ToHie (HsMatchContext (NameOrRdrName (IdP a)))-         , ToHie (PScoped (LPat a))-         , ToHie (GRHSs a body)-         , Data (Match a body)-         ) => ToHie (LMatch (GhcPass p) body) where-  toHie (L span m ) = concatM $ makeNode m span : case m of-    Match{m_ctxt=mctx, m_pats = pats, m_grhss =  grhss } ->-      [ toHie mctx-      , let rhsScope = mkScope $ grhss_span grhss-          in toHie $ patScopes Nothing rhsScope NoScope pats-      , toHie grhss-      ]-    XMatch _ -> []--instance ( ToHie (Context (Located a))-         ) => ToHie (HsMatchContext a) where-  toHie (FunRhs{mc_fun=name}) = toHie $ C MatchBind name-  toHie (StmtCtxt a) = toHie a-  toHie _ = pure []--instance ( ToHie (HsMatchContext a)-         ) => ToHie (HsStmtContext a) where-  toHie (PatGuard a) = toHie a-  toHie (ParStmtCtxt a) = toHie a-  toHie (TransStmtCtxt a) = toHie a-  toHie _ = pure []--instance ( a ~ GhcPass p-         , ToHie (Context (Located (IdP a)))-         , ToHie (RContext (HsRecFields a (PScoped (LPat a))))-         , ToHie (LHsExpr a)-         , ToHie (TScoped (LHsSigWcType a))-         , ProtectSig a-         , ToHie (TScoped (ProtectedSig a))-         , HasType (LPat a)-         , Data (HsSplice a)-         ) => ToHie (PScoped (Located (Pat (GhcPass p)))) where-  toHie (PS rsp scope pscope lpat@(dL -> L ospan opat)) =-    concatM $ getTypeNode lpat : case opat of-      WildPat _ ->-        []-      VarPat _ lname ->-        [ toHie $ C (PatternBind scope pscope rsp) lname-        ]-      LazyPat _ p ->-        [ toHie $ PS rsp scope pscope p-        ]-      AsPat _ lname pat ->-        [ toHie $ C (PatternBind scope-                                 (combineScopes (mkLScope (dL pat)) pscope)-                                 rsp)-                    lname-        , toHie $ PS rsp scope pscope pat-        ]-      ParPat _ pat ->-        [ toHie $ PS rsp scope pscope pat-        ]-      BangPat _ pat ->-        [ toHie $ PS rsp scope pscope pat-        ]-      ListPat _ pats ->-        [ toHie $ patScopes rsp scope pscope pats-        ]-      TuplePat _ pats _ ->-        [ toHie $ patScopes rsp scope pscope pats-        ]-      SumPat _ pat _ _ ->-        [ toHie $ PS rsp scope pscope pat-        ]-      ConPatIn c dets ->-        [ toHie $ C Use c-        , toHie $ contextify dets-        ]-      ConPatOut {pat_con = con, pat_args = dets}->-        [ toHie $ C Use $ fmap conLikeName con-        , toHie $ contextify dets-        ]-      ViewPat _ expr pat ->-        [ toHie expr-        , toHie $ PS rsp scope pscope pat-        ]-      SplicePat _ sp ->-        [ toHie $ L ospan sp-        ]-      LitPat _ _ ->-        []-      NPat _ _ _ _ ->-        []-      NPlusKPat _ n _ _ _ _ ->-        [ toHie $ C (PatternBind scope pscope rsp) n-        ]-      SigPat _ pat sig ->-        [ toHie $ PS rsp scope pscope pat-        , let cscope = mkLScope (dL pat) in-            toHie $ TS (ResolvedScopes [cscope, scope, pscope])-                       (protectSig @a cscope sig)-              -- See Note [Scoping Rules for SigPat]-        ]-      CoPat _ _ _ _ ->-        []-      XPat _ -> []-    where-      contextify (PrefixCon args) = PrefixCon $ patScopes rsp scope pscope args-      contextify (InfixCon a b) = InfixCon a' b'-        where [a', b'] = patScopes rsp scope pscope [a,b]-      contextify (RecCon r) = RecCon $ RC RecFieldMatch $ contextify_rec r-      contextify_rec (HsRecFields fds a) = HsRecFields (map go scoped_fds) a-        where-          go (RS fscope (L spn (HsRecField lbl pat pun))) =-            L spn $ HsRecField lbl (PS rsp scope fscope pat) pun-          scoped_fds = listScopes pscope fds--instance ( ToHie body-         , ToHie (LGRHS a body)-         , ToHie (RScoped (LHsLocalBinds a))-         ) => ToHie (GRHSs a body) where-  toHie grhs = concatM $ case grhs of-    GRHSs _ grhss binds ->-     [ toHie grhss-     , toHie $ RS (mkScope $ grhss_span grhs) binds-     ]-    XGRHSs _ -> []--instance ( ToHie (Located body)-         , ToHie (RScoped (GuardLStmt a))-         , Data (GRHS a (Located body))-         ) => ToHie (LGRHS a (Located body)) where-  toHie (L span g) = concatM $ makeNode g span : case g of-    GRHS _ guards body ->-      [ toHie $ listScopes (mkLScope body) guards-      , toHie body-      ]-    XGRHS _ -> []--instance ( a ~ GhcPass p-         , ToHie (Context (Located (IdP a)))-         , HasType (LHsExpr a)-         , ToHie (PScoped (LPat a))-         , ToHie (MatchGroup a (LHsExpr a))-         , ToHie (LGRHS a (LHsExpr a))-         , ToHie (RContext (HsRecordBinds a))-         , ToHie (RFContext (Located (AmbiguousFieldOcc a)))-         , ToHie (ArithSeqInfo a)-         , ToHie (LHsCmdTop a)-         , ToHie (RScoped (GuardLStmt a))-         , ToHie (RScoped (LHsLocalBinds a))-         , ToHie (TScoped (LHsWcType (NoGhcTc a)))-         , ToHie (TScoped (LHsSigWcType (NoGhcTc a)))-         , Data (HsExpr a)-         , Data (HsSplice a)-         , Data (HsTupArg a)-         , Data (AmbiguousFieldOcc a)-         , (HasRealDataConName a)-         ) => ToHie (LHsExpr (GhcPass p)) where-  toHie e@(L mspan oexpr) = concatM $ getTypeNode e : case oexpr of-      HsVar _ (L _ var) ->-        [ toHie $ C Use (L mspan var)-             -- Patch up var location since typechecker removes it-        ]-      HsUnboundVar _ _ ->-        []-      HsConLikeOut _ con ->-        [ toHie $ C Use $ L mspan $ conLikeName con-        ]-      HsRecFld _ fld ->-        [ toHie $ RFC RecFieldOcc Nothing (L mspan fld)-        ]-      HsOverLabel _ _ _ -> []-      HsIPVar _ _ -> []-      HsOverLit _ _ -> []-      HsLit _ _ -> []-      HsLam _ mg ->-        [ toHie mg-        ]-      HsLamCase _ mg ->-        [ toHie mg-        ]-      HsApp _ a b ->-        [ toHie a-        , toHie b-        ]-      HsAppType _ expr sig ->-        [ toHie expr-        , toHie $ TS (ResolvedScopes []) sig-        ]-      OpApp _ a b c ->-        [ toHie a-        , toHie b-        , toHie c-        ]-      NegApp _ a _ ->-        [ toHie a-        ]-      HsPar _ a ->-        [ toHie a-        ]-      SectionL _ a b ->-        [ toHie a-        , toHie b-        ]-      SectionR _ a b ->-        [ toHie a-        , toHie b-        ]-      ExplicitTuple _ args _ ->-        [ toHie args-        ]-      ExplicitSum _ _ _ expr ->-        [ toHie expr-        ]-      HsCase _ expr matches ->-        [ toHie expr-        , toHie matches-        ]-      HsIf _ _ a b c ->-        [ toHie a-        , toHie b-        , toHie c-        ]-      HsMultiIf _ grhss ->-        [ toHie grhss-        ]-      HsLet _ binds expr ->-        [ toHie $ RS (mkLScope expr) binds-        , toHie expr-        ]-      HsDo _ _ (L ispan stmts) ->-        [ pure $ locOnly ispan-        , toHie $ listScopes NoScope stmts-        ]-      ExplicitList _ _ exprs ->-        [ toHie exprs-        ]-      RecordCon {rcon_ext = mrealcon, rcon_con_name = name, rcon_flds = binds} ->-        [ toHie $ C Use (getRealDataCon @a mrealcon name)-            -- See Note [Real DataCon Name]-        , toHie $ RC RecFieldAssign $ binds-        ]-      RecordUpd {rupd_expr = expr, rupd_flds = upds}->-        [ toHie expr-        , toHie $ map (RC RecFieldAssign) upds-        ]-      ExprWithTySig _ expr sig ->-        [ toHie expr-        , toHie $ TS (ResolvedScopes [mkLScope expr]) sig-        ]-      ArithSeq _ _ info ->-        [ toHie info-        ]-      HsSCC _ _ _ expr ->-        [ toHie expr-        ]-      HsCoreAnn _ _ _ expr ->-        [ toHie expr-        ]-      HsProc _ pat cmdtop ->-        [ toHie $ PS Nothing (mkLScope cmdtop) NoScope pat-        , toHie cmdtop-        ]-      HsStatic _ expr ->-        [ toHie expr-        ]-      HsTick _ _ expr ->-        [ toHie expr-        ]-      HsBinTick _ _ _ expr ->-        [ toHie expr-        ]-      HsTickPragma _ _ _ _ expr ->-        [ toHie expr-        ]-      HsWrap _ _ a ->-        [ toHie $ L mspan a-        ]-      HsBracket _ b ->-        [ toHie b-        ]-      HsRnBracketOut _ b p ->-        [ toHie b-        , toHie p-        ]-      HsTcBracketOut _ b p ->-        [ toHie b-        , toHie p-        ]-      HsSpliceE _ x ->-        [ toHie $ L mspan x-        ]-      XExpr _ -> []--instance ( a ~ GhcPass p-         , ToHie (LHsExpr a)-         , Data (HsTupArg a)-         ) => ToHie (LHsTupArg (GhcPass p)) where-  toHie (L span arg) = concatM $ makeNode arg span : case arg of-    Present _ expr ->-      [ toHie expr-      ]-    Missing _ -> []-    XTupArg _ -> []--instance ( a ~ GhcPass p-         , ToHie (PScoped (LPat a))-         , ToHie (LHsExpr a)-         , ToHie (SigContext (LSig a))-         , ToHie (RScoped (LHsLocalBinds a))-         , ToHie (RScoped (ApplicativeArg a))-         , ToHie (Located body)-         , Data (StmtLR a a (Located body))-         , Data (StmtLR a a (Located (HsExpr a)))-         ) => ToHie (RScoped (LStmt (GhcPass p) (Located body))) where-  toHie (RS scope (L span stmt)) = concatM $ makeNode stmt span : case stmt of-      LastStmt _ body _ _ ->-        [ toHie body-        ]-      BindStmt _ pat body _ _ ->-        [ toHie $ PS (getRealSpan $ getLoc body) scope NoScope pat-        , toHie body-        ]-      ApplicativeStmt _ stmts _ ->-        [ concatMapM (toHie . RS scope . snd) stmts-        ]-      BodyStmt _ body _ _ ->-        [ toHie body-        ]-      LetStmt _ binds ->-        [ toHie $ RS scope binds-        ]-      ParStmt _ parstmts _ _ ->-        [ concatMapM (\(ParStmtBlock _ stmts _ _) ->-                          toHie $ listScopes NoScope stmts)-                     parstmts-        ]-      TransStmt {trS_stmts = stmts, trS_using = using, trS_by = by} ->-        [ toHie $ listScopes scope stmts-        , toHie using-        , toHie by-        ]-      RecStmt {recS_stmts = stmts} ->-        [ toHie $ map (RS $ combineScopes scope (mkScope span)) stmts-        ]-      XStmtLR _ -> []--instance ( ToHie (LHsExpr a)-         , ToHie (PScoped (LPat a))-         , ToHie (BindContext (LHsBind a))-         , ToHie (SigContext (LSig a))-         , ToHie (RScoped (HsValBindsLR a a))-         , Data (HsLocalBinds a)-         ) => ToHie (RScoped (LHsLocalBinds a)) where-  toHie (RS scope (L sp binds)) = concatM $ makeNode binds sp : case binds of-      EmptyLocalBinds _ -> []-      HsIPBinds _ _ -> []-      HsValBinds _ valBinds ->-        [ toHie $ RS (combineScopes scope $ mkScope sp)-                      valBinds-        ]-      XHsLocalBindsLR _ -> []--instance ( ToHie (BindContext (LHsBind a))-         , ToHie (SigContext (LSig a))-         , ToHie (RScoped (XXValBindsLR a a))-         ) => ToHie (RScoped (HsValBindsLR a a)) where-  toHie (RS sc v) = concatM $ case v of-    ValBinds _ binds sigs ->-      [ toHie $ fmap (BC RegularBind sc) binds-      , toHie $ fmap (SC (SI BindSig Nothing)) sigs-      ]-    XValBindsLR x -> [ toHie $ RS sc x ]--instance ToHie (RScoped (NHsValBindsLR GhcTc)) where-  toHie (RS sc (NValBinds binds sigs)) = concatM $-    [ toHie (concatMap (map (BC RegularBind sc) . bagToList . snd) binds)-    , toHie $ fmap (SC (SI BindSig Nothing)) sigs-    ]-instance ToHie (RScoped (NHsValBindsLR GhcRn)) where-  toHie (RS sc (NValBinds binds sigs)) = concatM $-    [ toHie (concatMap (map (BC RegularBind sc) . bagToList . snd) binds)-    , toHie $ fmap (SC (SI BindSig Nothing)) sigs-    ]--instance ( ToHie (RContext (LHsRecField a arg))-         ) => ToHie (RContext (HsRecFields a arg)) where-  toHie (RC c (HsRecFields fields _)) = toHie $ map (RC c) fields--instance ( ToHie (RFContext (Located label))-         , ToHie arg-         , HasLoc arg-         , Data label-         , Data arg-         ) => ToHie (RContext (LHsRecField' label arg)) where-  toHie (RC c (L span recfld)) = concatM $ makeNode recfld span : case recfld of-    HsRecField label expr _ ->-      [ toHie $ RFC c (getRealSpan $ loc expr) label-      , toHie expr-      ]--removeDefSrcSpan :: Name -> Name-removeDefSrcSpan n = setNameLoc n noSrcSpan--instance ToHie (RFContext (LFieldOcc GhcRn)) where-  toHie (RFC c rhs (L nspan f)) = concatM $ case f of-    FieldOcc name _ ->-      [ toHie $ C (RecField c rhs) (L nspan $ removeDefSrcSpan name)-      ]-    XFieldOcc _ -> []--instance ToHie (RFContext (LFieldOcc GhcTc)) where-  toHie (RFC c rhs (L nspan f)) = concatM $ case f of-    FieldOcc var _ ->-      let var' = setVarName var (removeDefSrcSpan $ varName var)-      in [ toHie $ C (RecField c rhs) (L nspan var')-         ]-    XFieldOcc _ -> []--instance ToHie (RFContext (Located (AmbiguousFieldOcc GhcRn))) where-  toHie (RFC c rhs (L nspan afo)) = concatM $ case afo of-    Unambiguous name _ ->-      [ toHie $ C (RecField c rhs) $ L nspan $ removeDefSrcSpan name-      ]-    Ambiguous _name _ ->-      [ ]-    XAmbiguousFieldOcc _ -> []--instance ToHie (RFContext (Located (AmbiguousFieldOcc GhcTc))) where-  toHie (RFC c rhs (L nspan afo)) = concatM $ case afo of-    Unambiguous var _ ->-      let var' = setVarName var (removeDefSrcSpan $ varName var)-      in [ toHie $ C (RecField c rhs) (L nspan var')-         ]-    Ambiguous var _ ->-      let var' = setVarName var (removeDefSrcSpan $ varName var)-      in [ toHie $ C (RecField c rhs) (L nspan var')-         ]-    XAmbiguousFieldOcc _ -> []--instance ( a ~ GhcPass p-         , ToHie (PScoped (LPat a))-         , ToHie (BindContext (LHsBind a))-         , ToHie (LHsExpr a)-         , ToHie (SigContext (LSig a))-         , ToHie (RScoped (HsValBindsLR a a))-         , Data (StmtLR a a (Located (HsExpr a)))-         , Data (HsLocalBinds a)-         ) => ToHie (RScoped (ApplicativeArg (GhcPass p))) where-  toHie (RS sc (ApplicativeArgOne _ pat expr _ _)) = concatM-    [ toHie $ PS Nothing sc NoScope pat-    , toHie expr-    ]-  toHie (RS sc (ApplicativeArgMany _ stmts _ pat)) = concatM-    [ toHie $ listScopes NoScope stmts-    , toHie $ PS Nothing sc NoScope pat-    ]-  toHie (RS _ (XApplicativeArg _)) = pure []--instance (ToHie arg, ToHie rec) => ToHie (HsConDetails arg rec) where-  toHie (PrefixCon args) = toHie args-  toHie (RecCon rec) = toHie rec-  toHie (InfixCon a b) = concatM [ toHie a, toHie b]--instance ( ToHie (LHsCmd a)-         , Data  (HsCmdTop a)-         ) => ToHie (LHsCmdTop a) where-  toHie (L span top) = concatM $ makeNode top span : case top of-    HsCmdTop _ cmd ->-      [ toHie cmd-      ]-    XCmdTop _ -> []--instance ( a ~ GhcPass p-         , ToHie (PScoped (LPat a))-         , ToHie (BindContext (LHsBind a))-         , ToHie (LHsExpr a)-         , ToHie (MatchGroup a (LHsCmd a))-         , ToHie (SigContext (LSig a))-         , ToHie (RScoped (HsValBindsLR a a))-         , Data (HsCmd a)-         , Data (HsCmdTop a)-         , Data (StmtLR a a (Located (HsCmd a)))-         , Data (HsLocalBinds a)-         , Data (StmtLR a a (Located (HsExpr a)))-         ) => ToHie (LHsCmd (GhcPass p)) where-  toHie (L span cmd) = concatM $ makeNode cmd span : case cmd of-      HsCmdArrApp _ a b _ _ ->-        [ toHie a-        , toHie b-        ]-      HsCmdArrForm _ a _ _ cmdtops ->-        [ toHie a-        , toHie cmdtops-        ]-      HsCmdApp _ a b ->-        [ toHie a-        , toHie b-        ]-      HsCmdLam _ mg ->-        [ toHie mg-        ]-      HsCmdPar _ a ->-        [ toHie a-        ]-      HsCmdCase _ expr alts ->-        [ toHie expr-        , toHie alts-        ]-      HsCmdIf _ _ a b c ->-        [ toHie a-        , toHie b-        , toHie c-        ]-      HsCmdLet _ binds cmd' ->-        [ toHie $ RS (mkLScope cmd') binds-        , toHie cmd'-        ]-      HsCmdDo _ (L ispan stmts) ->-        [ pure $ locOnly ispan-        , toHie $ listScopes NoScope stmts-        ]-      HsCmdWrap _ _ _ -> []-      XCmd _ -> []--instance ToHie (TyClGroup GhcRn) where-  toHie TyClGroup{ group_tyclds = classes-                 , group_roles  = roles-                 , group_kisigs = sigs-                 , group_instds = instances } =-    concatM-    [ toHie classes-    , toHie sigs-    , toHie roles-    , toHie instances-    ]-  toHie (XTyClGroup _) = pure []--instance ToHie (LTyClDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      FamDecl {tcdFam = fdecl} ->-        [ toHie (L span fdecl)-        ]-      SynDecl {tcdLName = name, tcdTyVars = vars, tcdRhs = typ} ->-        [ toHie $ C (Decl SynDec $ getRealSpan span) name-        , toHie $ TS (ResolvedScopes [mkScope $ getLoc typ]) vars-        , toHie typ-        ]-      DataDecl {tcdLName = name, tcdTyVars = vars, tcdDataDefn = defn} ->-        [ toHie $ C (Decl DataDec $ getRealSpan span) name-        , toHie $ TS (ResolvedScopes [quant_scope, rhs_scope]) vars-        , toHie defn-        ]-        where-          quant_scope = mkLScope $ dd_ctxt defn-          rhs_scope = sig_sc `combineScopes` con_sc `combineScopes` deriv_sc-          sig_sc = maybe NoScope mkLScope $ dd_kindSig defn-          con_sc = foldr combineScopes NoScope $ map mkLScope $ dd_cons defn-          deriv_sc = mkLScope $ dd_derivs defn-      ClassDecl { tcdCtxt = context-                , tcdLName = name-                , tcdTyVars = vars-                , tcdFDs = deps-                , tcdSigs = sigs-                , tcdMeths = meths-                , tcdATs = typs-                , tcdATDefs = deftyps-                } ->-        [ toHie $ C (Decl ClassDec $ getRealSpan span) name-        , toHie context-        , toHie $ TS (ResolvedScopes [context_scope, rhs_scope]) vars-        , toHie deps-        , toHie $ map (SC $ SI ClassSig $ getRealSpan span) sigs-        , toHie $ fmap (BC InstanceBind ModuleScope) meths-        , toHie typs-        , concatMapM (pure . locOnly . getLoc) deftyps-        , toHie deftyps-        ]-        where-          context_scope = mkLScope context-          rhs_scope = foldl1' combineScopes $ map mkScope-            [ loc deps, loc sigs, loc (bagToList meths), loc typs, loc deftyps]-      XTyClDecl _ -> []--instance ToHie (LFamilyDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      FamilyDecl _ info name vars _ sig inj ->-        [ toHie $ C (Decl FamDec $ getRealSpan span) name-        , toHie $ TS (ResolvedScopes [rhsSpan]) vars-        , toHie info-        , toHie $ RS injSpan sig-        , toHie inj-        ]-        where-          rhsSpan = sigSpan `combineScopes` injSpan-          sigSpan = mkScope $ getLoc sig-          injSpan = maybe NoScope (mkScope . getLoc) inj-      XFamilyDecl _ -> []--instance ToHie (FamilyInfo GhcRn) where-  toHie (ClosedTypeFamily (Just eqns)) = concatM $-    [ concatMapM (pure . locOnly . getLoc) eqns-    , toHie $ map go eqns-    ]-    where-      go (L l ib) = TS (ResolvedScopes [mkScope l]) ib-  toHie _ = pure []--instance ToHie (RScoped (LFamilyResultSig GhcRn)) where-  toHie (RS sc (L span sig)) = concatM $ makeNode sig span : case sig of-      NoSig _ ->-        []-      KindSig _ k ->-        [ toHie k-        ]-      TyVarSig _ bndr ->-        [ toHie $ TVS (ResolvedScopes [sc]) NoScope bndr-        ]-      XFamilyResultSig _ -> []--instance ToHie (Located (FunDep (Located Name))) where-  toHie (L span fd@(lhs, rhs)) = concatM $-    [ makeNode fd span-    , toHie $ map (C Use) lhs-    , toHie $ map (C Use) rhs-    ]--instance (ToHie rhs, HasLoc rhs)-    => ToHie (TScoped (FamEqn GhcRn rhs)) where-  toHie (TS _ f) = toHie f--instance (ToHie rhs, HasLoc rhs)-    => ToHie (FamEqn GhcRn rhs) where-  toHie fe@(FamEqn _ var tybndrs pats _ rhs) = concatM $-    [ toHie $ C (Decl InstDec $ getRealSpan $ loc fe) var-    , toHie $ fmap (tvScopes (ResolvedScopes []) scope) tybndrs-    , toHie pats-    , toHie rhs-    ]-    where scope = combineScopes patsScope rhsScope-          patsScope = mkScope (loc pats)-          rhsScope = mkScope (loc rhs)-  toHie (XFamEqn _) = pure []--instance ToHie (LInjectivityAnn GhcRn) where-  toHie (L span ann) = concatM $ makeNode ann span : case ann of-      InjectivityAnn lhs rhs ->-        [ toHie $ C Use lhs-        , toHie $ map (C Use) rhs-        ]--instance ToHie (HsDataDefn GhcRn) where-  toHie (HsDataDefn _ _ ctx _ mkind cons derivs) = concatM-    [ toHie ctx-    , toHie mkind-    , toHie cons-    , toHie derivs-    ]-  toHie (XHsDataDefn _) = pure []--instance ToHie (HsDeriving GhcRn) where-  toHie (L span clauses) = concatM-    [ pure $ locOnly span-    , toHie clauses-    ]--instance ToHie (LHsDerivingClause GhcRn) where-  toHie (L span cl) = concatM $ makeNode cl span : case cl of-      HsDerivingClause _ strat (L ispan tys) ->-        [ toHie strat-        , pure $ locOnly ispan-        , toHie $ map (TS (ResolvedScopes [])) tys-        ]-      XHsDerivingClause _ -> []--instance ToHie (Located (DerivStrategy GhcRn)) where-  toHie (L span strat) = concatM $ makeNode strat span : case strat of-      StockStrategy -> []-      AnyclassStrategy -> []-      NewtypeStrategy -> []-      ViaStrategy s -> [ toHie $ TS (ResolvedScopes []) s ]--instance ToHie (Located OverlapMode) where-  toHie (L span _) = pure $ locOnly span--instance ToHie (LConDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      ConDeclGADT { con_names = names, con_qvars = qvars-                  , con_mb_cxt = ctx, con_args = args, con_res_ty = typ } ->-        [ toHie $ map (C (Decl ConDec $ getRealSpan span)) names-        , toHie $ TS (ResolvedScopes [ctxScope, rhsScope]) qvars-        , toHie ctx-        , toHie args-        , toHie typ-        ]-        where-          rhsScope = combineScopes argsScope tyScope-          ctxScope = maybe NoScope mkLScope ctx-          argsScope = condecl_scope args-          tyScope = mkLScope typ-      ConDeclH98 { con_name = name, con_ex_tvs = qvars-                 , con_mb_cxt = ctx, con_args = dets } ->-        [ toHie $ C (Decl ConDec $ getRealSpan span) name-        , toHie $ tvScopes (ResolvedScopes []) rhsScope qvars-        , toHie ctx-        , toHie dets-        ]-        where-          rhsScope = combineScopes ctxScope argsScope-          ctxScope = maybe NoScope mkLScope ctx-          argsScope = condecl_scope dets-      XConDecl _ -> []-    where condecl_scope args = case args of-            PrefixCon xs -> foldr combineScopes NoScope $ map mkLScope xs-            InfixCon a b -> combineScopes (mkLScope a) (mkLScope b)-            RecCon x -> mkLScope x--instance ToHie (Located [LConDeclField GhcRn]) where-  toHie (L span decls) = concatM $-    [ pure $ locOnly span-    , toHie decls-    ]--instance ( HasLoc thing-         , ToHie (TScoped thing)-         ) => ToHie (TScoped (HsImplicitBndrs GhcRn thing)) where-  toHie (TS sc (HsIB ibrn a)) = concatM $-      [ pure $ bindingsOnly $ map (C $ TyVarBind (mkScope span) sc) ibrn-      , toHie $ TS sc a-      ]-    where span = loc a-  toHie (TS _ (XHsImplicitBndrs _)) = pure []--instance ( HasLoc thing-         , ToHie (TScoped thing)-         ) => ToHie (TScoped (HsWildCardBndrs GhcRn thing)) where-  toHie (TS sc (HsWC names a)) = concatM $-      [ pure $ bindingsOnly $ map (C $ TyVarBind (mkScope span) sc) names-      , toHie $ TS sc a-      ]-    where span = loc a-  toHie (TS _ (XHsWildCardBndrs _)) = pure []--instance ToHie (LStandaloneKindSig GhcRn) where-  toHie (L sp sig) = concatM [makeNode sig sp, toHie sig]--instance ToHie (StandaloneKindSig GhcRn) where-  toHie sig = concatM $ case sig of-    StandaloneKindSig _ name typ ->-      [ toHie $ C TyDecl name-      , toHie $ TS (ResolvedScopes []) typ-      ]-    XStandaloneKindSig _ -> []--instance ToHie (SigContext (LSig GhcRn)) where-  toHie (SC (SI styp msp) (L sp sig)) = concatM $ makeNode sig sp : case sig of-      TypeSig _ names typ ->-        [ toHie $ map (C TyDecl) names-        , toHie $ TS (UnresolvedScope (map unLoc names) Nothing) typ-        ]-      PatSynSig _ names typ ->-        [ toHie $ map (C TyDecl) names-        , toHie $ TS (UnresolvedScope (map unLoc names) Nothing) typ-        ]-      ClassOpSig _ _ names typ ->-        [ case styp of-            ClassSig -> toHie $ map (C $ ClassTyDecl $ getRealSpan sp) names-            _  -> toHie $ map (C $ TyDecl) names-        , toHie $ TS (UnresolvedScope (map unLoc names) msp) typ-        ]-      IdSig _ _ -> []-      FixSig _ fsig ->-        [ toHie $ L sp fsig-        ]-      InlineSig _ name _ ->-        [ toHie $ (C Use) name-        ]-      SpecSig _ name typs _ ->-        [ toHie $ (C Use) name-        , toHie $ map (TS (ResolvedScopes [])) typs-        ]-      SpecInstSig _ _ typ ->-        [ toHie $ TS (ResolvedScopes []) typ-        ]-      MinimalSig _ _ form ->-        [ toHie form-        ]-      SCCFunSig _ _ name mtxt ->-        [ toHie $ (C Use) name-        , pure $ maybe [] (locOnly . getLoc) mtxt-        ]-      CompleteMatchSig _ _ (L ispan names) typ ->-        [ pure $ locOnly ispan-        , toHie $ map (C Use) names-        , toHie $ fmap (C Use) typ-        ]-      XSig _ -> []--instance ToHie (LHsType GhcRn) where-  toHie x = toHie $ TS (ResolvedScopes []) x--instance ToHie (TScoped (LHsType GhcRn)) where-  toHie (TS tsc (L span t)) = concatM $ makeNode t span : case t of-      HsForAllTy _ _ bndrs body ->-        [ toHie $ tvScopes tsc (mkScope $ getLoc body) bndrs-        , toHie body-        ]-      HsQualTy _ ctx body ->-        [ toHie ctx-        , toHie body-        ]-      HsTyVar _ _ var ->-        [ toHie $ C Use var-        ]-      HsAppTy _ a b ->-        [ toHie a-        , toHie b-        ]-      HsAppKindTy _ ty ki ->-        [ toHie ty-        , toHie $ TS (ResolvedScopes []) ki-        ]-      HsFunTy _ a b ->-        [ toHie a-        , toHie b-        ]-      HsListTy _ a ->-        [ toHie a-        ]-      HsTupleTy _ _ tys ->-        [ toHie tys-        ]-      HsSumTy _ tys ->-        [ toHie tys-        ]-      HsOpTy _ a op b ->-        [ toHie a-        , toHie $ C Use op-        , toHie b-        ]-      HsParTy _ a ->-        [ toHie a-        ]-      HsIParamTy _ ip ty ->-        [ toHie ip-        , toHie ty-        ]-      HsKindSig _ a b ->-        [ toHie a-        , toHie b-        ]-      HsSpliceTy _ a ->-        [ toHie $ L span a-        ]-      HsDocTy _ a _ ->-        [ toHie a-        ]-      HsBangTy _ _ ty ->-        [ toHie ty-        ]-      HsRecTy _ fields ->-        [ toHie fields-        ]-      HsExplicitListTy _ _ tys ->-        [ toHie tys-        ]-      HsExplicitTupleTy _ tys ->-        [ toHie tys-        ]-      HsTyLit _ _ -> []-      HsWildCardTy _ -> []-      HsStarTy _ _ -> []-      XHsType _ -> []--instance (ToHie tm, ToHie ty) => ToHie (HsArg tm ty) where-  toHie (HsValArg tm) = toHie tm-  toHie (HsTypeArg _ ty) = toHie ty-  toHie (HsArgPar sp) = pure $ locOnly sp--instance ToHie (TVScoped (LHsTyVarBndr GhcRn)) where-  toHie (TVS tsc sc (L span bndr)) = concatM $ makeNode bndr span : case bndr of-      UserTyVar _ var ->-        [ toHie $ C (TyVarBind sc tsc) var-        ]-      KindedTyVar _ var kind ->-        [ toHie $ C (TyVarBind sc tsc) var-        , toHie kind-        ]-      XTyVarBndr _ -> []--instance ToHie (TScoped (LHsQTyVars GhcRn)) where-  toHie (TS sc (HsQTvs implicits vars)) = concatM $-    [ pure $ bindingsOnly bindings-    , toHie $ tvScopes sc NoScope vars-    ]-    where-      varLoc = loc vars-      bindings = map (C $ TyVarBind (mkScope varLoc) sc) implicits-  toHie (TS _ (XLHsQTyVars _)) = pure []--instance ToHie (LHsContext GhcRn) where-  toHie (L span tys) = concatM $-      [ pure $ locOnly span-      , toHie tys-      ]--instance ToHie (LConDeclField GhcRn) where-  toHie (L span field) = concatM $ makeNode field span : case field of-      ConDeclField _ fields typ _ ->-        [ toHie $ map (RFC RecFieldDecl (getRealSpan $ loc typ)) fields-        , toHie typ-        ]-      XConDeclField _ -> []--instance ToHie (LHsExpr a) => ToHie (ArithSeqInfo a) where-  toHie (From expr) = toHie expr-  toHie (FromThen a b) = concatM $-    [ toHie a-    , toHie b-    ]-  toHie (FromTo a b) = concatM $-    [ toHie a-    , toHie b-    ]-  toHie (FromThenTo a b c) = concatM $-    [ toHie a-    , toHie b-    , toHie c-    ]--instance ToHie (LSpliceDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      SpliceDecl _ splice _ ->-        [ toHie splice-        ]-      XSpliceDecl _ -> []--instance ToHie (HsBracket a) where-  toHie _ = pure []--instance ToHie PendingRnSplice where-  toHie _ = pure []--instance ToHie PendingTcSplice where-  toHie _ = pure []--instance ToHie (LBooleanFormula (Located Name)) where-  toHie (L span form) = concatM $ makeNode form span : case form of-      Var a ->-        [ toHie $ C Use a-        ]-      And forms ->-        [ toHie forms-        ]-      Or forms ->-        [ toHie forms-        ]-      Parens f ->-        [ toHie f-        ]--instance ToHie (Located HsIPName) where-  toHie (L span e) = makeNode e span--instance ( ToHie (LHsExpr a)-         , Data (HsSplice a)-         ) => ToHie (Located (HsSplice a)) where-  toHie (L span sp) = concatM $ makeNode sp span : case sp of-      HsTypedSplice _ _ _ expr ->-        [ toHie expr-        ]-      HsUntypedSplice _ _ _ expr ->-        [ toHie expr-        ]-      HsQuasiQuote _ _ _ ispan _ ->-        [ pure $ locOnly ispan-        ]-      HsSpliced _ _ _ ->-        []-      HsSplicedT _ ->-        []-      XSplice _ -> []--instance ToHie (LRoleAnnotDecl GhcRn) where-  toHie (L span annot) = concatM $ makeNode annot span : case annot of-      RoleAnnotDecl _ var roles ->-        [ toHie $ C Use var-        , concatMapM (pure . locOnly . getLoc) roles-        ]-      XRoleAnnotDecl _ -> []--instance ToHie (LInstDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      ClsInstD _ d ->-        [ toHie $ L span d-        ]-      DataFamInstD _ d ->-        [ toHie $ L span d-        ]-      TyFamInstD _ d ->-        [ toHie $ L span d-        ]-      XInstDecl _ -> []--instance ToHie (LClsInstDecl GhcRn) where-  toHie (L span decl) = concatM-    [ toHie $ TS (ResolvedScopes [mkScope span]) $ cid_poly_ty decl-    , toHie $ fmap (BC InstanceBind ModuleScope) $ cid_binds decl-    , toHie $ map (SC $ SI InstSig $ getRealSpan span) $ cid_sigs decl-    , pure $ concatMap (locOnly . getLoc) $ cid_tyfam_insts decl-    , toHie $ cid_tyfam_insts decl-    , pure $ concatMap (locOnly . getLoc) $ cid_datafam_insts decl-    , toHie $ cid_datafam_insts decl-    , toHie $ cid_overlap_mode decl-    ]--instance ToHie (LDataFamInstDecl GhcRn) where-  toHie (L sp (DataFamInstDecl d)) = toHie $ TS (ResolvedScopes [mkScope sp]) d--instance ToHie (LTyFamInstDecl GhcRn) where-  toHie (L sp (TyFamInstDecl d)) = toHie $ TS (ResolvedScopes [mkScope sp]) d--instance ToHie (Context a)-         => ToHie (PatSynFieldContext (RecordPatSynField a)) where-  toHie (PSC sp (RecordPatSynField a b)) = concatM $-    [ toHie $ C (RecField RecFieldDecl sp) a-    , toHie $ C Use b-    ]--instance ToHie (LDerivDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      DerivDecl _ typ strat overlap ->-        [ toHie $ TS (ResolvedScopes []) typ-        , toHie strat-        , toHie overlap-        ]-      XDerivDecl _ -> []--instance ToHie (LFixitySig GhcRn) where-  toHie (L span sig) = concatM $ makeNode sig span : case sig of-      FixitySig _ vars _ ->-        [ toHie $ map (C Use) vars-        ]-      XFixitySig _ -> []--instance ToHie (LDefaultDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      DefaultDecl _ typs ->-        [ toHie typs-        ]-      XDefaultDecl _ -> []--instance ToHie (LForeignDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      ForeignImport {fd_name = name, fd_sig_ty = sig, fd_fi = fi} ->-        [ toHie $ C (ValBind RegularBind ModuleScope $ getRealSpan span) name-        , toHie $ TS (ResolvedScopes []) sig-        , toHie fi-        ]-      ForeignExport {fd_name = name, fd_sig_ty = sig, fd_fe = fe} ->-        [ toHie $ C Use name-        , toHie $ TS (ResolvedScopes []) sig-        , toHie fe-        ]-      XForeignDecl _ -> []--instance ToHie ForeignImport where-  toHie (CImport (L a _) (L b _) _ _ (L c _)) = pure $ concat $-    [ locOnly a-    , locOnly b-    , locOnly c-    ]--instance ToHie ForeignExport where-  toHie (CExport (L a _) (L b _)) = pure $ concat $-    [ locOnly a-    , locOnly b-    ]--instance ToHie (LWarnDecls GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      Warnings _ _ warnings ->-        [ toHie warnings-        ]-      XWarnDecls _ -> []--instance ToHie (LWarnDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      Warning _ vars _ ->-        [ toHie $ map (C Use) vars-        ]-      XWarnDecl _ -> []--instance ToHie (LAnnDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      HsAnnotation _ _ prov expr ->-        [ toHie prov-        , toHie expr-        ]-      XAnnDecl _ -> []--instance ToHie (Context (Located a)) => ToHie (AnnProvenance a) where-  toHie (ValueAnnProvenance a) = toHie $ C Use a-  toHie (TypeAnnProvenance a) = toHie $ C Use a-  toHie ModuleAnnProvenance = pure []--instance ToHie (LRuleDecls GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      HsRules _ _ rules ->-        [ toHie rules-        ]-      XRuleDecls _ -> []--instance ToHie (LRuleDecl GhcRn) where-  toHie (L _ (XRuleDecl _)) = pure []-  toHie (L span r@(HsRule _ rname _ tybndrs bndrs exprA exprB)) = concatM-        [ makeNode r span-        , pure $ locOnly $ getLoc rname-        , toHie $ fmap (tvScopes (ResolvedScopes []) scope) tybndrs-        , toHie $ map (RS $ mkScope span) bndrs-        , toHie exprA-        , toHie exprB-        ]-    where scope = bndrs_sc `combineScopes` exprA_sc `combineScopes` exprB_sc-          bndrs_sc = maybe NoScope mkLScope (listToMaybe bndrs)-          exprA_sc = mkLScope exprA-          exprB_sc = mkLScope exprB--instance ToHie (RScoped (LRuleBndr GhcRn)) where-  toHie (RS sc (L span bndr)) = concatM $ makeNode bndr span : case bndr of-      RuleBndr _ var ->-        [ toHie $ C (ValBind RegularBind sc Nothing) var-        ]-      RuleBndrSig _ var typ ->-        [ toHie $ C (ValBind RegularBind sc Nothing) var-        , toHie $ TS (ResolvedScopes [sc]) typ-        ]-      XRuleBndr _ -> []--instance ToHie (LImportDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      ImportDecl { ideclName = name, ideclAs = as, ideclHiding = hidden } ->-        [ toHie $ IEC Import name-        , toHie $ fmap (IEC ImportAs) as-        , maybe (pure []) goIE hidden-        ]-      XImportDecl _ -> []-    where-      goIE (hiding, (L sp liens)) = concatM $-        [ pure $ locOnly sp-        , toHie $ map (IEC c) liens-        ]-        where-         c = if hiding then ImportHiding else Import--instance ToHie (IEContext (LIE GhcRn)) where-  toHie (IEC c (L span ie)) = concatM $ makeNode ie span : case ie of-      IEVar _ n ->-        [ toHie $ IEC c n-        ]-      IEThingAbs _ n ->-        [ toHie $ IEC c n-        ]-      IEThingAll _ n ->-        [ toHie $ IEC c n-        ]-      IEThingWith _ n _ ns flds ->-        [ toHie $ IEC c n-        , toHie $ map (IEC c) ns-        , toHie $ map (IEC c) flds-        ]-      IEModuleContents _ n ->-        [ toHie $ IEC c n-        ]-      IEGroup _ _ _ -> []-      IEDoc _ _ -> []-      IEDocNamed _ _ -> []-      XIE _ -> []--instance ToHie (IEContext (LIEWrappedName Name)) where-  toHie (IEC c (L span iewn)) = concatM $ makeNode iewn span : case iewn of-      IEName n ->-        [ toHie $ C (IEThing c) n-        ]-      IEPattern p ->-        [ toHie $ C (IEThing c) p-        ]-      IEType n ->-        [ toHie $ C (IEThing c) n-        ]--instance ToHie (IEContext (Located (FieldLbl Name))) where-  toHie (IEC c (L span lbl)) = concatM $ makeNode lbl span : case lbl of-      FieldLabel _ _ n ->-        [ toHie $ C (IEThing c) $ L span n-        ]
− src-ghc810/Development/IDE/GHC/HieBin.hs
@@ -1,399 +0,0 @@-{--Binary serialization for .hie files.--}-{- HLINT ignore -}-{-# LANGUAGE ScopedTypeVariables #-}-module Development.IDE.GHC.HieBin ( readHieFile, readHieFileWithVersion, HieHeader, writeHieFile, HieName(..), toHieName, HieFileResult(..), hieMagic, hieNameOcc,NameCacheUpdater(..)) where--import GHC.Settings               ( maybeRead )--import Config                     ( cProjectVersion )-import Binary-import BinIface                   ( getDictFastString )-import FastMutInt-import FastString                 ( FastString )-import Module                     ( Module )-import Name-import NameCache-import Outputable-import PrelInfo-import SrcLoc-import UniqSupply                 ( takeUniqFromSupply )-import Unique-import UniqFM-import IfaceEnv--import qualified Data.Array as A-import Data.IORef-import Data.ByteString            ( ByteString )-import qualified Data.ByteString  as BS-import qualified Data.ByteString.Char8 as BSC-import Data.List                  ( mapAccumR )-import Data.Word                  ( Word8, Word32 )-import Control.Monad              ( replicateM, when )-import System.Directory           ( createDirectoryIfMissing )-import System.FilePath            ( takeDirectory )--import HieTypes---- | `Name`'s get converted into `HieName`'s before being written into @.hie@--- files. See 'toHieName' and 'fromHieName' for logic on how to convert between--- these two types.-data HieName-  = ExternalName !Module !OccName !SrcSpan-  | LocalName !OccName !SrcSpan-  | KnownKeyName !Unique-  deriving (Eq)--instance Ord HieName where-  compare (ExternalName a b c) (ExternalName d e f) = compare (a,b,c) (d,e,f)-  compare (LocalName a b) (LocalName c d) = compare (a,b) (c,d)-  compare (KnownKeyName a) (KnownKeyName b) = nonDetCmpUnique a b-    -- Not actually non determinstic as it is a KnownKey-  compare ExternalName{} _ = LT-  compare LocalName{} ExternalName{} = GT-  compare LocalName{} _ = LT-  compare KnownKeyName{} _ = GT--instance Outputable HieName where-  ppr (ExternalName m n sp) = text "ExternalName" <+> ppr m <+> ppr n <+> ppr sp-  ppr (LocalName n sp) = text "LocalName" <+> ppr n <+> ppr sp-  ppr (KnownKeyName u) = text "KnownKeyName" <+> ppr u--hieNameOcc :: HieName -> OccName-hieNameOcc (ExternalName _ occ _) = occ-hieNameOcc (LocalName occ _) = occ-hieNameOcc (KnownKeyName u) =-  case lookupKnownKeyName u of-    Just n -> nameOccName n-    Nothing -> pprPanic "hieNameOcc:unknown known-key unique"-                        (ppr (unpkUnique u))---data HieSymbolTable = HieSymbolTable-  { hie_symtab_next :: !FastMutInt-  , hie_symtab_map  :: !(IORef (UniqFM (Int, HieName)))-  }--data HieDictionary = HieDictionary-  { hie_dict_next :: !FastMutInt -- The next index to use-  , hie_dict_map  :: !(IORef (UniqFM (Int,FastString))) -- indexed by FastString-  }--initBinMemSize :: Int-initBinMemSize = 1024*1024---- | The header for HIE files - Capital ASCII letters "HIE".-hieMagic :: [Word8]-hieMagic = [72,73,69]--hieMagicLen :: Int-hieMagicLen = length hieMagic--ghcVersion :: ByteString-ghcVersion = BSC.pack cProjectVersion--putBinLine :: BinHandle -> ByteString -> IO ()-putBinLine bh xs = do-  mapM_ (putByte bh) $ BS.unpack xs-  putByte bh 10 -- newline char---- | Write a `HieFile` to the given `FilePath`, with a proper header and--- symbol tables for `Name`s and `FastString`s-writeHieFile :: FilePath -> HieFile -> IO ()-writeHieFile hie_file_path hiefile = do-  bh0 <- openBinMem initBinMemSize--  -- Write the header: hieHeader followed by the-  -- hieVersion and the GHC version used to generate this file-  mapM_ (putByte bh0) hieMagic-  putBinLine bh0 $ BSC.pack $ show hieVersion-  putBinLine bh0 $ ghcVersion--  -- remember where the dictionary pointer will go-  dict_p_p <- tellBin bh0-  put_ bh0 dict_p_p--  -- remember where the symbol table pointer will go-  symtab_p_p <- tellBin bh0-  put_ bh0 symtab_p_p--  -- Make some intial state-  symtab_next <- newFastMutInt-  writeFastMutInt symtab_next 0-  symtab_map <- newIORef emptyUFM-  let hie_symtab = HieSymbolTable {-                      hie_symtab_next = symtab_next,-                      hie_symtab_map  = symtab_map }-  dict_next_ref <- newFastMutInt-  writeFastMutInt dict_next_ref 0-  dict_map_ref <- newIORef emptyUFM-  let hie_dict = HieDictionary {-                      hie_dict_next = dict_next_ref,-                      hie_dict_map  = dict_map_ref }--  -- put the main thing-  let bh = setUserData bh0 $ newWriteState (putName hie_symtab)-                                           (putName hie_symtab)-                                           (putFastString hie_dict)-  put_ bh hiefile--  -- write the symtab pointer at the front of the file-  symtab_p <- tellBin bh-  putAt bh symtab_p_p symtab_p-  seekBin bh symtab_p--  -- write the symbol table itself-  symtab_next' <- readFastMutInt symtab_next-  symtab_map'  <- readIORef symtab_map-  putSymbolTable bh symtab_next' symtab_map'--  -- write the dictionary pointer at the front of the file-  dict_p <- tellBin bh-  putAt bh dict_p_p dict_p-  seekBin bh dict_p--  -- write the dictionary itself-  dict_next <- readFastMutInt dict_next_ref-  dict_map  <- readIORef dict_map_ref-  putDictionary bh dict_next dict_map--  -- and send the result to the file-  createDirectoryIfMissing True (takeDirectory hie_file_path)-  writeBinMem bh hie_file_path-  return ()--data HieFileResult-  = HieFileResult-  { hie_file_result_version :: Integer-  , hie_file_result_ghc_version :: ByteString-  , hie_file_result :: HieFile-  }--type HieHeader = (Integer, ByteString)---- | Read a `HieFile` from a `FilePath`. Can use--- an existing `NameCache`. Allows you to specify--- which versions of hieFile to attempt to read.--- `Left` case returns the failing header versions.-readHieFileWithVersion :: (HieHeader -> Bool) -> NameCacheUpdater -> FilePath -> IO (Either HieHeader HieFileResult)-readHieFileWithVersion readVersion ncu file = do-  bh0 <- readBinMem file--  (hieVersion, ghcVersion) <- readHieFileHeader file bh0--  if readVersion (hieVersion, ghcVersion)-  then do-    hieFile <- readHieFileContents bh0 ncu-    return $ Right (HieFileResult hieVersion ghcVersion hieFile)-  else return $ Left (hieVersion, ghcVersion)----- | Read a `HieFile` from a `FilePath`. Can use--- an existing `NameCache`.-readHieFile :: NameCacheUpdater -> FilePath -> IO HieFileResult-readHieFile ncu file = do--  bh0 <- readBinMem file--  (readHieVersion, ghcVersion) <- readHieFileHeader file bh0--  -- Check if the versions match-  when (readHieVersion /= hieVersion) $-    panic $ unwords ["readHieFile: hie file versions don't match for file:"-                    , file-                    , "Expected"-                    , show hieVersion-                    , "but got", show readHieVersion-                    ]-  hieFile <- readHieFileContents bh0 ncu-  return $ HieFileResult hieVersion ghcVersion hieFile--readBinLine :: BinHandle -> IO ByteString-readBinLine bh = BS.pack . reverse <$> loop []-  where-    loop acc = do-      char <- get bh :: IO Word8-      if char == 10 -- ASCII newline '\n'-      then return acc-      else loop (char : acc)--readHieFileHeader :: FilePath -> BinHandle -> IO HieHeader-readHieFileHeader file bh0 = do-  -- Read the header-  magic <- replicateM hieMagicLen (get bh0)-  version <- BSC.unpack <$> readBinLine bh0-  case maybeRead version of-    Nothing ->-      panic $ unwords ["readHieFileHeader: hieVersion isn't an Integer:"-                      , show version-                      ]-    Just readHieVersion -> do-      ghcVersion <- readBinLine bh0--      -- Check if the header is valid-      when (magic /= hieMagic) $-        panic $ unwords ["readHieFileHeader: headers don't match for file:"-                        , file-                        , "Expected"-                        , show hieMagic-                        , "but got", show magic-                        ]-      return (readHieVersion, ghcVersion)--readHieFileContents :: BinHandle -> NameCacheUpdater -> IO HieFile-readHieFileContents bh0 ncu = do--  dict  <- get_dictionary bh0--  -- read the symbol table so we are capable of reading the actual data-  bh1 <- do-      let bh1 = setUserData bh0 $ newReadState (error "getSymtabName")-                                               (getDictFastString dict)-      symtab <- get_symbol_table bh1-      let bh1' = setUserData bh1-               $ newReadState (getSymTabName symtab)-                              (getDictFastString dict)-      return bh1'--  -- load the actual data-  hiefile <- get bh1-  return hiefile-  where-    get_dictionary bin_handle = do-      dict_p <- get bin_handle-      data_p <- tellBin bin_handle-      seekBin bin_handle dict_p-      dict <- getDictionary bin_handle-      seekBin bin_handle data_p-      return dict--    get_symbol_table bh1 = do-      symtab_p <- get bh1-      data_p'  <- tellBin bh1-      seekBin bh1 symtab_p-      symtab <- getSymbolTable bh1 ncu-      seekBin bh1 data_p'-      return symtab--putFastString :: HieDictionary -> BinHandle -> FastString -> IO ()-putFastString HieDictionary { hie_dict_next = j_r,-                              hie_dict_map  = out_r}  bh f-  = do-    out <- readIORef out_r-    let unique = getUnique f-    case lookupUFM out unique of-        Just (j, _)  -> put_ bh (fromIntegral j :: Word32)-        Nothing -> do-           j <- readFastMutInt j_r-           put_ bh (fromIntegral j :: Word32)-           writeFastMutInt j_r (j + 1)-           writeIORef out_r $! addToUFM out unique (j, f)--putSymbolTable :: BinHandle -> Int -> UniqFM (Int,HieName) -> IO ()-putSymbolTable bh next_off symtab = do-  put_ bh next_off-  let names = A.elems (A.array (0,next_off-1) (nonDetEltsUFM symtab))-  mapM_ (putHieName bh) names--getSymbolTable :: BinHandle -> NameCacheUpdater -> IO SymbolTable-getSymbolTable bh ncu = do-  sz <- get bh-  od_names <- replicateM sz (getHieName bh)-  updateNameCache ncu $ \nc ->-    let arr = A.listArray (0,sz-1) names-        (nc', names) = mapAccumR fromHieName nc od_names-        in (nc',arr)--getSymTabName :: SymbolTable -> BinHandle -> IO Name-getSymTabName st bh = do-  i :: Word32 <- get bh-  return $ st A.! (fromIntegral i)--putName :: HieSymbolTable -> BinHandle -> Name -> IO ()-putName (HieSymbolTable next ref) bh name = do-  symmap <- readIORef ref-  case lookupUFM symmap name of-    Just (off, ExternalName mod occ (UnhelpfulSpan _))-      | isGoodSrcSpan (nameSrcSpan name) -> do-      let hieName = ExternalName mod occ (nameSrcSpan name)-      writeIORef ref $! addToUFM symmap name (off, hieName)-      put_ bh (fromIntegral off :: Word32)-    Just (off, LocalName _occ span)-      | notLocal (toHieName name) || nameSrcSpan name /= span -> do-      writeIORef ref $! addToUFM symmap name (off, toHieName name)-      put_ bh (fromIntegral off :: Word32)-    Just (off, _) -> put_ bh (fromIntegral off :: Word32)-    Nothing -> do-        off <- readFastMutInt next-        writeFastMutInt next (off+1)-        writeIORef ref $! addToUFM symmap name (off, toHieName name)-        put_ bh (fromIntegral off :: Word32)--  where-    notLocal :: HieName -> Bool-    notLocal LocalName{} = False-    notLocal _ = True----- ** Converting to and from `HieName`'s--toHieName :: Name -> HieName-toHieName name-  | isKnownKeyName name = KnownKeyName (nameUnique name)-  | isExternalName name = ExternalName (nameModule name)-                                       (nameOccName name)-                                       (nameSrcSpan name)-  | otherwise = LocalName (nameOccName name) (nameSrcSpan name)--fromHieName :: NameCache -> HieName -> (NameCache, Name)-fromHieName nc (ExternalName mod occ span) =-    let cache = nsNames nc-    in case lookupOrigNameCache cache mod occ of-         Just name-           | nameSrcSpan name == span -> (nc, name)-           | otherwise ->-             let name' = setNameLoc name span-                 new_cache = extendNameCache cache mod occ name'-             in ( nc{ nsNames = new_cache }, name' )-         Nothing ->-           let (uniq, us) = takeUniqFromSupply (nsUniqs nc)-               name       = mkExternalName uniq mod occ span-               new_cache  = extendNameCache cache mod occ name-           in ( nc{ nsUniqs = us, nsNames = new_cache }, name )-fromHieName nc (LocalName occ span) =-    let (uniq, us) = takeUniqFromSupply (nsUniqs nc)-        name       = mkInternalName uniq occ span-    in ( nc{ nsUniqs = us }, name )-fromHieName nc (KnownKeyName u) = case lookupKnownKeyName u of-    Nothing -> pprPanic "fromHieName:unknown known-key unique"-                        (ppr (unpkUnique u))-    Just n -> (nc, n)---- ** Reading and writing `HieName`'s--putHieName :: BinHandle -> HieName -> IO ()-putHieName bh (ExternalName mod occ span) = do-  putByte bh 0-  put_ bh (mod, occ, span)-putHieName bh (LocalName occName span) = do-  putByte bh 1-  put_ bh (occName, span)-putHieName bh (KnownKeyName uniq) = do-  putByte bh 2-  put_ bh $ unpkUnique uniq--getHieName :: BinHandle -> IO HieName-getHieName bh = do-  t <- getByte bh-  case t of-    0 -> do-      (modu, occ, span) <- get bh-      return $ ExternalName modu occ span-    1 -> do-      (occ, span) <- get bh-      return $ LocalName occ span-    2 -> do-      (c,i) <- get bh-      return $ KnownKeyName $ mkUnique c i-    _ -> panic "HieBin.getHieName: invalid tag"
− src-ghc86/Development/IDE/GHC/HieAst.hs
@@ -1,1784 +0,0 @@-{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}-{--Forked from GHC v8.8.1 to work around the readFile side effect in mkHiefile--Main functions for .hie file generation--}-{- HLINT ignore -}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE TypeSynonymInstances #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE TypeApplications #-}-{-# LANGUAGE AllowAmbiguousTypes #-}-{-# LANGUAGE ViewPatterns #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE DataKinds #-}-module Development.IDE.GHC.HieAst ( mkHieFile ) where--import Avail                      ( Avails )-import Bag                        ( Bag, bagToList )-import BasicTypes-import BooleanFormula-import Class                      ( FunDep )-import CoreUtils                  ( exprType )-import ConLike                    ( conLikeName )-import Desugar                    ( deSugarExpr )-import FieldLabel-import HsSyn-import HscTypes-import Module                     ( ModuleName, ml_hs_file )-import MonadUtils                 ( concatMapM, liftIO )-import Name                       ( Name, nameSrcSpan, setNameLoc )-import SrcLoc-import TcHsSyn                    ( hsLitType, hsPatType )-import Type                       ( mkFunTys, Type )-import TysWiredIn                 ( mkListTy, mkSumTy )-import Var                        ( Id, Var, setVarName, varName, varType )-import TcRnTypes-import MkIface                    ( mkIfaceExports )--import Development.IDE.GHC.HieTypes-import Development.IDE.GHC.HieUtils--import qualified Data.Array as A-import qualified Data.ByteString as BS-import qualified Data.Map as M-import qualified Data.Set as S-import Data.Data                  ( Data, Typeable )-import Data.List                  (foldl',  foldl1' )-import Control.Monad.Trans.Reader-import Control.Monad.Trans.Class  ( lift )---- These synonyms match those defined in main/GHC.hs-type RenamedSource     = ( HsGroup GhcRn, [LImportDecl GhcRn]-                         , Maybe [(LIE GhcRn, Avails)]-                         , Maybe LHsDocString )-type TypecheckedSource = LHsBinds GhcTc---- | Marks that a field uses the GhcRn variant even when the pass--- parameter is GhcTc. Useful for storing HsTypes in HsExprs, say, because--- HsType GhcTc should never occur.-type family NoGhcTc (p :: *) where-    -- this way, GHC can figure out that the result is a GhcPass-  NoGhcTc (GhcPass pass) = GhcPass (NoGhcTcPass pass)-  NoGhcTc other          = other--type family NoGhcTcPass (p :: Pass) :: Pass where-  NoGhcTcPass 'Typechecked = 'Renamed-  NoGhcTcPass other        = other--{- Note [Name Remapping]-The Typechecker introduces new names for mono names in AbsBinds.-We don't care about the distinction between mono and poly bindings,-so we replace all occurrences of the mono name with the poly name.--}-newtype HieState = HieState-  { name_remapping :: M.Map Name Id-  }--initState :: HieState-initState = HieState M.empty--class ModifyState a where -- See Note [Name Remapping]-  addSubstitution :: a -> a -> HieState -> HieState--instance ModifyState Name where-  addSubstitution _ _ hs = hs--instance ModifyState Id where-  addSubstitution mono poly hs =-    hs{name_remapping = M.insert (varName mono) poly (name_remapping hs)}--modifyState :: ModifyState (IdP p) => [ABExport p] -> HieState -> HieState-modifyState = foldr go id-  where-    go ABE{abe_poly=poly,abe_mono=mono} f = addSubstitution mono poly . f-    go _ f = f--type HieM = ReaderT HieState Hsc---- | Construct an 'HieFile' from the outputs of the typechecker.-mkHieFile :: ModSummary-          -> TcGblEnv-          -> RenamedSource-          -> BS.ByteString-          -> Hsc HieFile-mkHieFile ms ts rs src = do-  let tc_binds = tcg_binds ts-  (asts', arr) <- getCompressedAsts tc_binds rs-  let Just src_file = ml_hs_file $ ms_location ms-  return $ HieFile-      { hie_hs_file = src_file-      , hie_module = ms_mod ms-      , hie_types = arr-      , hie_asts = asts'-      -- mkIfaceExports sorts the AvailInfos for stability-      , hie_exports = mkIfaceExports (tcg_exports ts)-      , hie_hs_src = src-      }--getCompressedAsts :: TypecheckedSource -> RenamedSource-  -> Hsc (HieASTs TypeIndex, A.Array TypeIndex HieTypeFlat)-getCompressedAsts ts rs = do-  asts <- enrichHie ts rs-  return $ compressTypes asts--enrichHie :: TypecheckedSource -> RenamedSource -> Hsc (HieASTs Type)-enrichHie ts (hsGrp, imports, exports, _) = flip runReaderT initState $ do-    tasts <- toHie $ fmap (BC RegularBind ModuleScope) ts-    rasts <- processGrp hsGrp-    imps <- toHie $ filter (not . ideclImplicit . unLoc) imports-    exps <- toHie $ fmap (map $ IEC Export . fst) exports-    let spanFile children = case children of-          [] -> mkRealSrcSpan (mkRealSrcLoc "" 1 1) (mkRealSrcLoc "" 1 1)-          _ -> mkRealSrcSpan (realSrcSpanStart $ nodeSpan $ head children)-                             (realSrcSpanEnd   $ nodeSpan $ last children)--        modulify xs =-          Node (simpleNodeInfo "Module" "Module") (spanFile xs) xs--        asts = HieASTs-          $ resolveTyVarScopes-          $ M.map (modulify . mergeSortAsts)-          $ M.fromListWith (++)-          $ map (\x -> (srcSpanFile (nodeSpan x),[x])) flat_asts--        flat_asts = concat-          [ tasts-          , rasts-          , imps-          , exps-          ]-    return asts-  where-    processGrp grp = concatM-      [ toHie $ fmap (RS ModuleScope ) hs_valds grp-      , toHie $ hs_splcds grp-      , toHie $ hs_tyclds grp-      , toHie $ hs_derivds grp-      , toHie $ hs_fixds grp-      , toHie $ hs_defds grp-      , toHie $ hs_fords grp-      , toHie $ hs_warnds grp-      , toHie $ hs_annds grp-      , toHie $ hs_ruleds grp-      ]--getRealSpan :: SrcSpan -> Maybe Span-getRealSpan (RealSrcSpan sp) = Just sp-getRealSpan _ = Nothing--grhss_span :: GRHSs p body -> SrcSpan-grhss_span (GRHSs _ xs bs) = foldl' combineSrcSpans (getLoc bs) (map getLoc xs)-grhss_span (XGRHSs _) = error "XGRHS has no span"--bindingsOnly :: [Context Name] -> [HieAST a]-bindingsOnly [] = []-bindingsOnly (C c n : xs) = case nameSrcSpan n of-  RealSrcSpan span -> Node nodeinfo span [] : bindingsOnly xs-    where nodeinfo = NodeInfo S.empty [] (M.singleton (Right n) info)-          info = mempty{identInfo = S.singleton c}-  _ -> bindingsOnly xs--concatM :: Monad m => [m [a]] -> m [a]-concatM xs = concat <$> sequence xs--{- Note [Capturing Scopes and other non local information]-toHie is a local tranformation, but scopes of bindings cannot be known locally,-hence we have to push the relevant info down into the binding nodes.-We use the following types (*Context and *Scoped) to wrap things and-carry the required info-(Maybe Span) always carries the span of the entire binding, including rhs--}-data Context a = C ContextInfo a -- Used for names and bindings--data RContext a = RC RecFieldContext a-data RFContext a = RFC RecFieldContext (Maybe Span) a--- ^ context for record fields--data IEContext a = IEC IEType a--- ^ context for imports/exports--data BindContext a = BC BindType Scope a--- ^ context for imports/exports--data PatSynFieldContext a = PSC (Maybe Span) a--- ^ context for pattern synonym fields.--data SigContext a = SC SigInfo a--- ^ context for type signatures--data SigInfo = SI SigType (Maybe Span)--data SigType = BindSig | ClassSig | InstSig--data RScoped a = RS Scope a--- ^ Scope spans over everything to the right of a, (mostly) not--- including a itself--- (Includes a in a few special cases like recursive do bindings) or--- let/where bindings---- | Pattern scope-data PScoped a = PS (Maybe Span)-                    Scope       -- ^ use site of the pattern-                    Scope       -- ^ pattern to the right of a, not including a-                    a-  deriving (Typeable, Data) -- Pattern Scope--{- Note [TyVar Scopes]-Due to -XScopedTypeVariables, type variables can be in scope quite far from-their original binding. We resolve the scope of these type variables-in a separate pass--}-data TScoped a = TS TyVarScope a -- TyVarScope--data TVScoped a = TVS TyVarScope Scope a -- TyVarScope--- ^ First scope remains constant--- Second scope is used to build up the scope of a tyvar over--- things to its right, ala RScoped---- | Each element scopes over the elements to the right-listScopes :: Scope -> [Located a] -> [RScoped (Located a)]-listScopes _ [] = []-listScopes rhsScope [pat] = [RS rhsScope pat]-listScopes rhsScope (pat : pats) = RS sc pat : pats'-  where-    pats'@((RS scope p):_) = listScopes rhsScope pats-    sc = combineScopes scope $ mkScope $ getLoc p---- | 'listScopes' specialised to 'PScoped' things-patScopes-  :: Maybe Span-  -> Scope-  -> Scope-  -> [LPat (GhcPass p)]-  -> [PScoped (LPat (GhcPass p))]-patScopes rsp useScope patScope xs =-  map (\(RS sc a) -> PS rsp useScope sc a) $-    listScopes patScope xs---- | 'listScopes' specialised to 'TVScoped' things-tvScopes-  :: TyVarScope-  -> Scope-  -> [LHsTyVarBndr a]-  -> [TVScoped (LHsTyVarBndr a)]-tvScopes tvScope rhsScope xs =-  map (\(RS sc a)-> TVS tvScope sc a) $ listScopes rhsScope xs--{- Note [Scoping Rules for SigPat]-Explicitly quantified variables in pattern type signatures are not-brought into scope in the rhs, but implicitly quantified variables-are (HsWC and HsIB).-This is unlike other signatures, where explicitly quantified variables-are brought into the RHS Scope-For example-foo :: forall a. ...;-foo = ... -- a is in scope here--bar (x :: forall a. a -> a) = ... -- a is not in scope here---   ^ a is in scope here (pattern body)--bax (x :: a) = ... -- a is in scope here-Because of HsWC and HsIB pass on their scope to their children-we must wrap the LHsType in pattern signatures in a-Shielded explictly, so that the HsWC/HsIB scope is not passed-on the the LHsType--}--data Shielded a = SH Scope a -- Ignores its TScope, uses its own scope instead--type family ProtectedSig a where-  ProtectedSig GhcRn = HsWildCardBndrs GhcRn (HsImplicitBndrs-                                                GhcRn-                                                (Shielded (LHsType GhcRn)))-  ProtectedSig GhcTc = NoExt--class ProtectSig a where-  protectSig :: Scope -> XSigPat a -> ProtectedSig a--instance (HasLoc a) => HasLoc (Shielded a) where-  loc (SH _ a) = loc a--instance (ToHie (TScoped a)) => ToHie (TScoped (Shielded a)) where-  toHie (TS _ (SH sc a)) = toHie (TS (ResolvedScopes [sc]) a)--instance ProtectSig GhcTc where-  protectSig _ _ = NoExt--instance ProtectSig GhcRn where-  protectSig sc (HsWC a (HsIB b sig)) =-    HsWC a (HsIB b (SH sc sig))-  protectSig _ _ = error "protectSig not given HsWC (HsIB)"--class HasLoc a where-  -- ^ defined so that HsImplicitBndrs and HsWildCardBndrs can-  -- know what their implicit bindings are scoping over-  loc :: a -> SrcSpan--instance HasLoc thing => HasLoc (TScoped thing) where-  loc (TS _ a) = loc a--instance HasLoc thing => HasLoc (PScoped thing) where-  loc (PS _ _ _ a) = loc a--instance HasLoc (LHsQTyVars GhcRn) where-  loc (HsQTvs _ vs) = loc vs-  loc _ = noSrcSpan--instance HasLoc thing => HasLoc (HsImplicitBndrs a thing) where-  loc (HsIB _ a) = loc a-  loc _ = noSrcSpan--instance HasLoc thing => HasLoc (HsWildCardBndrs a thing) where-  loc (HsWC _ a) = loc a-  loc _ = noSrcSpan--instance HasLoc (Located a) where-  loc (L l _) = l--instance HasLoc a => HasLoc [a] where-  loc [] = noSrcSpan-  loc xs = foldl1' combineSrcSpans $ map loc xs--instance (HasLoc a, HasLoc b) => HasLoc (FamEqn s a b) where-  loc (FamEqn _ a b _ c) = foldl1' combineSrcSpans [loc a, loc b, loc c]-  loc _ = noSrcSpan-{--instance (HasLoc tm, HasLoc ty) => HasLoc (HsArg tm ty) where-  loc (HsValArg tm) = loc tm-  loc (HsTypeArg _ ty) = loc ty-  loc (HsArgPar sp)  = sp--}--instance HasLoc (HsDataDefn GhcRn) where-  loc def@(HsDataDefn{}) = loc $ dd_cons def-    -- Only used for data family instances, so we only need rhs-    -- Most probably the rest will be unhelpful anyway-  loc _ = noSrcSpan---- | The main worker class-class ToHie a where-  toHie :: a -> HieM [HieAST Type]---- | Used to collect type info-class Data a => HasType a where-  getTypeNode :: a -> HieM [HieAST Type]--instance (ToHie a) => ToHie [a] where-  toHie = concatMapM toHie--instance (ToHie a) => ToHie (Bag a) where-  toHie = toHie . bagToList--instance (ToHie a) => ToHie (Maybe a) where-  toHie = maybe (pure []) toHie--instance ToHie (Context (Located NoExt)) where-  toHie _ = pure []--instance ToHie (TScoped NoExt) where-  toHie _ = pure []--instance ToHie (IEContext (Located ModuleName)) where-  toHie (IEC c (L (RealSrcSpan span) mname)) =-      pure $ [Node (NodeInfo S.empty [] idents) span []]-    where details = mempty{identInfo = S.singleton (IEThing c)}-          idents = M.singleton (Left mname) details-  toHie _ = pure []--instance ToHie (Context (Located Var)) where-  toHie c = case c of-      C context (L (RealSrcSpan span) name')-        -> do-        m <- asks name_remapping-        let name = M.findWithDefault name' (varName name') m-        pure-          [Node-            (NodeInfo S.empty [] $-              M.singleton (Right $ varName name)-                          (IdentifierDetails (Just $ varType name')-                                             (S.singleton context)))-            span-            []]-      _ -> pure []--instance ToHie (Context (Located Name)) where-  toHie c = case c of-      C context (L (RealSrcSpan span) name') -> do-        m <- asks name_remapping-        let name = case M.lookup name' m of-              Just var -> varName var-              Nothing -> name'-        pure-          [Node-            (NodeInfo S.empty [] $-              M.singleton (Right name)-                          (IdentifierDetails Nothing-                                             (S.singleton context)))-            span-            []]-      _ -> pure []---- | Dummy instances - never called-instance ToHie (TScoped (LHsSigWcType GhcTc)) where-  toHie _ = pure []-instance ToHie (TScoped (LHsWcType GhcTc)) where-  toHie _ = pure []-instance ToHie (SigContext (LSig GhcTc)) where-  toHie _ = pure []-instance ToHie (TScoped Type) where-  toHie _ = pure []--instance HasType (LHsBind GhcRn) where-  getTypeNode (L spn bind) = makeNode bind spn--instance HasType (LHsBind GhcTc) where-  getTypeNode (L spn bind) = case bind of-      FunBind{fun_id = name} -> makeTypeNode bind spn (varType $ unLoc name)-      _ -> makeNode bind spn--instance HasType (LPat GhcRn) where-  getTypeNode (L spn pat) = makeNode pat spn--instance HasType (LPat GhcTc) where-  getTypeNode (L spn opat) = makeTypeNode opat spn (hsPatType opat)--instance HasType (LHsExpr GhcRn) where-  getTypeNode (L spn e) = makeNode e spn---- | This instance tries to construct 'HieAST' nodes which include the type of--- the expression. It is not yet possible to do this efficiently for all--- expression forms, so we skip filling in the type for those inputs.------ 'HsApp', for example, doesn't have any type information available directly on--- the node. Our next recourse would be to desugar it into a 'CoreExpr' then--- query the type of that. Yet both the desugaring call and the type query both--- involve recursive calls to the function and argument! This is particularly--- problematic when you realize that the HIE traversal will eventually visit--- those nodes too and ask for their types again.------ Since the above is quite costly, we just skip cases where computing the--- expression's type is going to be expensive.------ See #16233-instance HasType (LHsExpr GhcTc) where-  getTypeNode e@(L spn e') = lift $-    -- Some expression forms have their type immediately available-    let tyOpt = case e' of-          HsLit _ l -> Just (hsLitType l)-          HsOverLit _ o -> Just (overLitType o)--          HsLam     _ (MG { mg_ext = groupTy }) -> Just (matchGroupType groupTy)-          HsLamCase _ (MG { mg_ext = groupTy }) -> Just (matchGroupType groupTy)-          HsCase _  _ (MG { mg_ext = groupTy }) -> Just (mg_res_ty groupTy)--          ExplicitList  ty _ _   -> Just (mkListTy ty)-          ExplicitSum   ty _ _ _ -> Just (mkSumTy ty)-          HsDo          ty _ _   -> Just ty-          HsMultiIf     ty _     -> Just ty--          _ -> Nothing--    in-    case tyOpt of-      _ | skipDesugaring e' -> fallback-        | otherwise -> do-            hs_env <- Hsc $ \e w -> return (e,w)-            (_,mbe) <- liftIO $ deSugarExpr hs_env e-            maybe fallback (makeTypeNode e' spn . exprType) mbe-    where-      fallback = makeNode e' spn--      matchGroupType :: MatchGroupTc -> Type-      matchGroupType (MatchGroupTc args res) = mkFunTys args res--      -- | Skip desugaring of these expressions for performance reasons.-      ---      -- See impact on Haddock output (esp. missing type annotations or links)-      -- before marking more things here as 'False'. See impact on Haddock-      -- performance before marking more things as 'True'.-      skipDesugaring :: HsExpr a -> Bool-      skipDesugaring e = case e of-        HsVar{}        -> False-        HsUnboundVar{} -> False-        HsConLikeOut{} -> False-        HsRecFld{}     -> False-        HsOverLabel{}  -> False-        HsIPVar{}      -> False-        HsWrap{}       -> False-        _              -> True--instance ( ToHie (Context (Located (IdP a)))-         , ToHie (MatchGroup a (LHsExpr a))-         , ToHie (PScoped (LPat a))-         , ToHie (GRHSs a (LHsExpr a))-         , ToHie (LHsExpr a)-         , ToHie (Located (PatSynBind a a))-         , HasType (LHsBind a)-         , ModifyState (IdP a)-         , Data (HsBind a)-         ) => ToHie (BindContext (LHsBind a)) where-  toHie (BC context scope b@(L span bind)) =-    concatM $ getTypeNode b : case bind of-      FunBind{fun_id = name, fun_matches = matches} ->-        [ toHie $ C (ValBind context scope $ getRealSpan span) name-        , toHie matches-        ]-      PatBind{pat_lhs = lhs, pat_rhs = rhs} ->-        [ toHie $ PS (getRealSpan span) scope NoScope lhs-        , toHie rhs-        ]-      VarBind{var_rhs = expr} ->-        [ toHie expr-        ]-      AbsBinds{abs_exports = xs, abs_binds = binds} ->-        [ local (modifyState xs) $ -- Note [Name Remapping]-            toHie $ fmap (BC context scope) binds-        ]-      PatSynBind _ psb ->-        [ toHie $ L span psb -- PatSynBinds only occur at the top level-        ]-      XHsBindsLR _ -> []--instance ( ToHie (LMatch a body)-         ) => ToHie (MatchGroup a body) where-  toHie mg = concatM $ case mg of-    MG{ mg_alts = (L span alts) , mg_origin = FromSource } ->-      [ pure $ locOnly span-      , toHie alts-      ]-    MG{} -> []-    XMatchGroup _ -> []--instance ( ToHie (Context (Located (IdP a)))-         , ToHie (PScoped (LPat a))-         , ToHie (HsPatSynDir a)-         ) => ToHie (Located (PatSynBind a a)) where-    toHie (L sp psb) = concatM $ case psb of-      PSB{psb_id=var, psb_args=dets, psb_def=pat, psb_dir=dir} ->-        [ toHie $ C (Decl PatSynDec $ getRealSpan sp) var-        , toHie $ toBind dets-        , toHie $ PS Nothing lhsScope NoScope pat-        , toHie dir-        ]-        where-          lhsScope = combineScopes varScope detScope-          varScope = mkLScope var-          detScope = case dets of-            (PrefixCon args) -> foldr combineScopes NoScope $ map mkLScope args-            (InfixCon a b) -> combineScopes (mkLScope a) (mkLScope b)-            (RecCon r) -> foldr go NoScope r-          go (RecordPatSynField a b) c = combineScopes c-            $ combineScopes (mkLScope a) (mkLScope b)-          detSpan = case detScope of-            LocalScope a -> Just a-            _ -> Nothing-          toBind (PrefixCon args) = PrefixCon $ map (C Use) args-          toBind (InfixCon a b) = InfixCon (C Use a) (C Use b)-          toBind (RecCon r) = RecCon $ map (PSC detSpan) r-      XPatSynBind _ -> []--instance ( ToHie (MatchGroup a (LHsExpr a))-         ) => ToHie (HsPatSynDir a) where-  toHie dir = case dir of-    ExplicitBidirectional mg -> toHie mg-    _ -> pure []--instance ( a ~ GhcPass p-         , ToHie body-         , ToHie (HsMatchContext (NameOrRdrName (IdP a)))-         , ToHie (PScoped (LPat a))-         , ToHie (GRHSs a body)-         , Data (Match a body)-         ) => ToHie (LMatch (GhcPass p) body) where-  toHie (L span m ) = concatM $ makeNode m span : case m of-    Match{m_ctxt=mctx, m_pats = pats, m_grhss =  grhss } ->-      [ toHie mctx-      , let rhsScope = mkScope $ grhss_span grhss-          in toHie $ patScopes Nothing rhsScope NoScope pats-      , toHie grhss-      ]-    XMatch _ -> []--instance ( ToHie (Context (Located a))-         ) => ToHie (HsMatchContext a) where-  toHie (FunRhs{mc_fun=name}) = toHie $ C MatchBind name-  toHie (StmtCtxt a) = toHie a-  toHie _ = pure []--instance ( ToHie (HsMatchContext a)-         ) => ToHie (HsStmtContext a) where-  toHie (PatGuard a) = toHie a-  toHie (ParStmtCtxt a) = toHie a-  toHie (TransStmtCtxt a) = toHie a-  toHie _ = pure []--instance ( a ~ GhcPass p-         , ToHie (Context (Located (IdP a)))-         , ToHie (RContext (HsRecFields a (PScoped (LPat a))))-         , ToHie (LHsExpr a)-         , ToHie (TScoped (LHsSigWcType a))-         , ProtectSig a-         , ToHie (TScoped (ProtectedSig a))-         , HasType (LPat a)-         , Data (HsSplice a)-         ) => ToHie (PScoped (LPat (GhcPass p))) where-  toHie (PS rsp scope pscope lpat@(L ospan opat)) =-    concatM $ getTypeNode lpat : case opat of-      WildPat _ ->-        []-      VarPat _ lname ->-        [ toHie $ C (PatternBind scope pscope rsp) lname-        ]-      LazyPat _ p ->-        [ toHie $ PS rsp scope pscope p-        ]-      AsPat _ lname pat ->-        [ toHie $ C (PatternBind scope-                                 (combineScopes (mkLScope pat) pscope)-                                 rsp)-                    lname-        , toHie $ PS rsp scope pscope pat-        ]-      ParPat _ pat ->-        [ toHie $ PS rsp scope pscope pat-        ]-      BangPat _ pat ->-        [ toHie $ PS rsp scope pscope pat-        ]-      ListPat _ pats ->-        [ toHie $ patScopes rsp scope pscope pats-        ]-      TuplePat _ pats _ ->-        [ toHie $ patScopes rsp scope pscope pats-        ]-      SumPat _ pat _ _ ->-        [ toHie $ PS rsp scope pscope pat-        ]-      ConPatIn c dets ->-        [ toHie $ C Use c-        , toHie $ contextify dets-        ]-      ConPatOut {pat_con = con, pat_args = dets}->-        [ toHie $ C Use $ fmap conLikeName con-        , toHie $ contextify dets-        ]-      ViewPat _ expr pat ->-        [ toHie expr-        , toHie $ PS rsp scope pscope pat-        ]-      SplicePat _ sp ->-        [ toHie $ L ospan sp-        ]-      LitPat _ _ ->-        []-      NPat _ _ _ _ ->-        []-      NPlusKPat _ n _ _ _ _ ->-        [ toHie $ C (PatternBind scope pscope rsp) n-        ]-      SigPat sig pat ->-        [ toHie $ PS rsp scope pscope pat-        , let cscope = mkLScope pat in-            toHie $ TS (ResolvedScopes [cscope, scope, pscope])-                       (protectSig @a cscope sig)-              -- See Note [Scoping Rules for SigPat]-        ]-      CoPat _ _ _ _ ->-        []-      XPat _ -> []-    where-      contextify (PrefixCon args) = PrefixCon $ patScopes rsp scope pscope args-      contextify (InfixCon a b) = InfixCon a' b'-        where [a', b'] = patScopes rsp scope pscope [a,b]-      contextify (RecCon r) = RecCon $ RC RecFieldMatch $ contextify_rec r-      contextify_rec (HsRecFields fds a) = HsRecFields (map go scoped_fds) a-        where-          go (RS fscope (L spn (HsRecField lbl pat pun))) =-            L spn $ HsRecField lbl (PS rsp scope fscope pat) pun-          scoped_fds = listScopes pscope fds--instance ( ToHie body-         , ToHie (LGRHS a body)-         , ToHie (RScoped (LHsLocalBinds a))-         ) => ToHie (GRHSs a body) where-  toHie grhs = concatM $ case grhs of-    GRHSs _ grhss binds ->-     [ toHie grhss-     , toHie $ RS (mkScope $ grhss_span grhs) binds-     ]-    XGRHSs _ -> []--instance ( ToHie (Located body)-         , ToHie (RScoped (GuardLStmt a))-         , Data (GRHS a (Located body))-         ) => ToHie (LGRHS a (Located body)) where-  toHie (L span g) = concatM $ makeNode g span : case g of-    GRHS _ guards body ->-      [ toHie $ listScopes (mkLScope body) guards-      , toHie body-      ]-    XGRHS _ -> []--instance ( a ~ GhcPass p-         , ToHie (Context (Located (IdP a)))-         , HasType (LHsExpr a)-         , ToHie (PScoped (LPat a))-         , ToHie (MatchGroup a (LHsExpr a))-         , ToHie (LGRHS a (LHsExpr a))-         , ToHie (RContext (HsRecordBinds a))-         , ToHie (RFContext (Located (AmbiguousFieldOcc a)))-         , ToHie (ArithSeqInfo a)-         , ToHie (LHsCmdTop a)-         , ToHie (RScoped (GuardLStmt a))-         , ToHie (RScoped (LHsLocalBinds a))-         , ToHie (TScoped (LHsWcType (NoGhcTc a)))-         , ToHie (TScoped (LHsSigWcType (NoGhcTc a)))-         , Data (HsExpr a)-         , Data (HsSplice a)-         , Data (HsTupArg a)-         , Data (AmbiguousFieldOcc a)-         ) => ToHie (LHsExpr (GhcPass p)) where-  toHie e@(L mspan oexpr) = concatM $ getTypeNode e : case oexpr of-      HsVar _ (L _ var) ->-        [ toHie $ C Use (L mspan var)-             -- Patch up var location since typechecker removes it-        ]-      HsUnboundVar _ _ ->-        []-      HsConLikeOut _ con ->-        [ toHie $ C Use $ L mspan $ conLikeName con-        ]-      HsRecFld _ fld ->-        [ toHie $ RFC RecFieldOcc Nothing (L mspan fld)-        ]-      HsOverLabel _ _ _ -> []-      HsIPVar _ _ -> []-      HsOverLit _ _ -> []-      HsLit _ _ -> []-      HsLam _ mg ->-        [ toHie mg-        ]-      HsLamCase _ mg ->-        [ toHie mg-        ]-      HsApp _ a b ->-        [ toHie a-        , toHie b-        ]-      HsAppType _sig expr ->-        [ toHie expr-        -- , toHie $ TS (ResolvedScopes []) sig-        ]-      OpApp _ a b c ->-        [ toHie a-        , toHie b-        , toHie c-        ]-      NegApp _ a _ ->-        [ toHie a-        ]-      HsPar _ a ->-        [ toHie a-        ]-      SectionL _ a b ->-        [ toHie a-        , toHie b-        ]-      SectionR _ a b ->-        [ toHie a-        , toHie b-        ]-      ExplicitTuple _ args _ ->-        [ toHie args-        ]-      ExplicitSum _ _ _ expr ->-        [ toHie expr-        ]-      HsCase _ expr matches ->-        [ toHie expr-        , toHie matches-        ]-      HsIf _ _ a b c ->-        [ toHie a-        , toHie b-        , toHie c-        ]-      HsMultiIf _ grhss ->-        [ toHie grhss-        ]-      HsLet _ binds expr ->-        [ toHie $ RS (mkLScope expr) binds-        , toHie expr-        ]-      HsDo _ _ (L ispan stmts) ->-        [ pure $ locOnly ispan-        , toHie $ listScopes NoScope stmts-        ]-      ExplicitList _ _ exprs ->-        [ toHie exprs-        ]-      RecordCon {rcon_con_name = name, rcon_flds = binds}->-        [ toHie $ C Use name-        , toHie $ RC RecFieldAssign $ binds-        ]-      RecordUpd {rupd_expr = expr, rupd_flds = upds}->-        [ toHie expr-        , toHie $ map (RC RecFieldAssign) upds-        ]-      ExprWithTySig _ expr ->-        [ toHie expr-        -- , toHie $ TS (ResolvedScopes [mkLScope expr]) sig-        ]-      ArithSeq _ _ info ->-        [ toHie info-        ]-      HsSCC _ _ _ expr ->-        [ toHie expr-        ]-      HsCoreAnn _ _ _ expr ->-        [ toHie expr-        ]-      HsProc _ pat cmdtop ->-        [ toHie $ PS Nothing (mkLScope cmdtop) NoScope pat-        , toHie cmdtop-        ]-      HsStatic _ expr ->-        [ toHie expr-        ]-      HsArrApp _ a b _ _ ->-        [ toHie a-        , toHie b-        ]-      HsArrForm _ expr _ cmds ->-        [ toHie expr-        , toHie cmds-        ]-      HsTick _ _ expr ->-        [ toHie expr-        ]-      HsBinTick _ _ _ expr ->-        [ toHie expr-        ]-      HsTickPragma _ _ _ _ expr ->-        [ toHie expr-        ]-      HsWrap _ _ a ->-        [ toHie $ L mspan a-        ]-      HsBracket _ b ->-        [ toHie b-        ]-      HsRnBracketOut _ b p ->-        [ toHie b-        , toHie p-        ]-      HsTcBracketOut _ b p ->-        [ toHie b-        , toHie p-        ]-      HsSpliceE _ x ->-        [ toHie $ L mspan x-        ]-      EWildPat _ -> []-      EAsPat _ a b ->-        [ toHie $ C Use a-        , toHie b-        ]-      EViewPat _ a b ->-        [ toHie a-        , toHie b-        ]-      ELazyPat _ a ->-        [ toHie a-        ]-      XExpr _ -> []--instance ( a ~ GhcPass p-         , ToHie (LHsExpr a)-         , Data (HsTupArg a)-         ) => ToHie (LHsTupArg (GhcPass p)) where-  toHie (L span arg) = concatM $ makeNode arg span : case arg of-    Present _ expr ->-      [ toHie expr-      ]-    Missing _ -> []-    XTupArg _ -> []--instance ( a ~ GhcPass p-         , ToHie (PScoped (LPat a))-         , ToHie (LHsExpr a)-         , ToHie (SigContext (LSig a))-         , ToHie (RScoped (LHsLocalBinds a))-         , ToHie (RScoped (ApplicativeArg a))-         , ToHie (Located body)-         , Data (StmtLR a a (Located body))-         , Data (StmtLR a a (Located (HsExpr a)))-         ) => ToHie (RScoped (LStmt (GhcPass p) (Located body))) where-  toHie (RS scope (L span stmt)) = concatM $ makeNode stmt span : case stmt of-      LastStmt _ body _ _ ->-        [ toHie body-        ]-      BindStmt _ pat body _ _ ->-        [ toHie $ PS (getRealSpan $ getLoc body) scope NoScope pat-        , toHie body-        ]-      ApplicativeStmt _ stmts _ ->-        [ concatMapM (toHie . RS scope . snd) stmts-        ]-      BodyStmt _ body _ _ ->-        [ toHie body-        ]-      LetStmt _ binds ->-        [ toHie $ RS scope binds-        ]-      ParStmt _ parstmts _ _ ->-        [ concatMapM (\(ParStmtBlock _ stmts _ _) ->-                          toHie $ listScopes NoScope stmts)-                     parstmts-        ]-      TransStmt {trS_stmts = stmts, trS_using = using, trS_by = by} ->-        [ toHie $ listScopes scope stmts-        , toHie using-        , toHie by-        ]-      RecStmt {recS_stmts = stmts} ->-        [ toHie $ map (RS $ combineScopes scope (mkScope span)) stmts-        ]-      XStmtLR _ -> []--instance ( ToHie (LHsExpr a)-         , ToHie (PScoped (LPat a))-         , ToHie (BindContext (LHsBind a))-         , ToHie (SigContext (LSig a))-         , ToHie (RScoped (HsValBindsLR a a))-         , Data (HsLocalBinds a)-         ) => ToHie (RScoped (LHsLocalBinds a)) where-  toHie (RS scope (L sp binds)) = concatM $ makeNode binds sp : case binds of-      EmptyLocalBinds _ -> []-      HsIPBinds _ _ -> []-      HsValBinds _ valBinds ->-        [ toHie $ RS (combineScopes scope $ mkScope sp)-                      valBinds-        ]-      XHsLocalBindsLR _ -> []--instance ( ToHie (BindContext (LHsBind a))-         , ToHie (SigContext (LSig a))-         , ToHie (RScoped (XXValBindsLR a a))-         ) => ToHie (RScoped (HsValBindsLR a a)) where-  toHie (RS sc v) = concatM $ case v of-    ValBinds _ binds sigs ->-      [ toHie $ fmap (BC RegularBind sc) binds-      , toHie $ fmap (SC (SI BindSig Nothing)) sigs-      ]-    XValBindsLR x -> [ toHie $ RS sc x ]--instance ToHie (RScoped (NHsValBindsLR GhcTc)) where-  toHie (RS sc (NValBinds binds sigs)) = concatM $-    [ toHie (concatMap (map (BC RegularBind sc) . bagToList . snd) binds)-    , toHie $ fmap (SC (SI BindSig Nothing)) sigs-    ]-instance ToHie (RScoped (NHsValBindsLR GhcRn)) where-  toHie (RS sc (NValBinds binds sigs)) = concatM $-    [ toHie (concatMap (map (BC RegularBind sc) . bagToList . snd) binds)-    , toHie $ fmap (SC (SI BindSig Nothing)) sigs-    ]--instance ( ToHie (RContext (LHsRecField a arg))-         ) => ToHie (RContext (HsRecFields a arg)) where-  toHie (RC c (HsRecFields fields _)) = toHie $ map (RC c) fields--instance ( ToHie (RFContext (Located label))-         , ToHie arg-         , HasLoc arg-         , Data label-         , Data arg-         ) => ToHie (RContext (LHsRecField' label arg)) where-  toHie (RC c (L span recfld)) = concatM $ makeNode recfld span : case recfld of-    HsRecField label expr _ ->-      [ toHie $ RFC c (getRealSpan $ loc expr) label-      , toHie expr-      ]--removeDefSrcSpan :: Name -> Name-removeDefSrcSpan n = setNameLoc n noSrcSpan--instance ToHie (RFContext (LFieldOcc GhcRn)) where-  toHie (RFC c rhs (L nspan f)) = concatM $ case f of-    FieldOcc name _ ->-      [ toHie $ C (RecField c rhs) (L nspan $ removeDefSrcSpan name)-      ]-    XFieldOcc _ -> []--instance ToHie (RFContext (LFieldOcc GhcTc)) where-  toHie (RFC c rhs (L nspan f)) = concatM $ case f of-    FieldOcc var _ ->-      let var' = setVarName var (removeDefSrcSpan $ varName var)-      in [ toHie $ C (RecField c rhs) (L nspan var')-         ]-    XFieldOcc _ -> []--instance ToHie (RFContext (Located (AmbiguousFieldOcc GhcRn))) where-  toHie (RFC c rhs (L nspan afo)) = concatM $ case afo of-    Unambiguous name _ ->-      [ toHie $ C (RecField c rhs) $ L nspan $ removeDefSrcSpan name-      ]-    Ambiguous _name _ ->-      [ ]-    XAmbiguousFieldOcc _ -> []--instance ToHie (RFContext (Located (AmbiguousFieldOcc GhcTc))) where-  toHie (RFC c rhs (L nspan afo)) = concatM $ case afo of-    Unambiguous var _ ->-      let var' = setVarName var (removeDefSrcSpan $ varName var)-      in [ toHie $ C (RecField c rhs) (L nspan var')-         ]-    Ambiguous var _ ->-      let var' = setVarName var (removeDefSrcSpan $ varName var)-      in [ toHie $ C (RecField c rhs) (L nspan var')-         ]-    XAmbiguousFieldOcc _ -> []--instance ( a ~ GhcPass p-         , ToHie (PScoped (LPat a))-         , ToHie (BindContext (LHsBind a))-         , ToHie (LHsExpr a)-         , ToHie (SigContext (LSig a))-         , ToHie (RScoped (HsValBindsLR a a))-         , Data (StmtLR a a (Located (HsExpr a)))-         , Data (HsLocalBinds a)-         ) => ToHie (RScoped (ApplicativeArg (GhcPass p))) where-  toHie (RS sc (ApplicativeArgOne _ pat expr _)) = concatM-    [ toHie $ PS Nothing sc NoScope pat-    , toHie expr-    ]-  toHie (RS sc (ApplicativeArgMany _ stmts _ pat)) = concatM-    [ toHie $ listScopes NoScope stmts-    , toHie $ PS Nothing sc NoScope pat-    ]-  toHie (RS _ (XApplicativeArg _)) = pure []--instance (ToHie arg, ToHie rec) => ToHie (HsConDetails arg rec) where-  toHie (PrefixCon args) = toHie args-  toHie (RecCon rec) = toHie rec-  toHie (InfixCon a b) = concatM [ toHie a, toHie b]--instance ( ToHie (LHsCmd a)-         , Data  (HsCmdTop a)-         ) => ToHie (LHsCmdTop a) where-  toHie (L span top) = concatM $ makeNode top span : case top of-    HsCmdTop _ cmd ->-      [ toHie cmd-      ]-    XCmdTop _ -> []--instance ( a ~ GhcPass p-         , ToHie (PScoped (LPat a))-         , ToHie (BindContext (LHsBind a))-         , ToHie (LHsExpr a)-         , ToHie (MatchGroup a (LHsCmd a))-         , ToHie (SigContext (LSig a))-         , ToHie (RScoped (HsValBindsLR a a))-         , Data (HsCmd a)-         , Data (HsCmdTop a)-         , Data (StmtLR a a (Located (HsCmd a)))-         , Data (HsLocalBinds a)-         , Data (StmtLR a a (Located (HsExpr a)))-         ) => ToHie (LHsCmd (GhcPass p)) where-  toHie (L span cmd) = concatM $ makeNode cmd span : case cmd of-      HsCmdArrApp _ a b _ _ ->-        [ toHie a-        , toHie b-        ]-      HsCmdArrForm _ a _ _ cmdtops ->-        [ toHie a-        , toHie cmdtops-        ]-      HsCmdApp _ a b ->-        [ toHie a-        , toHie b-        ]-      HsCmdLam _ mg ->-        [ toHie mg-        ]-      HsCmdPar _ a ->-        [ toHie a-        ]-      HsCmdCase _ expr alts ->-        [ toHie expr-        , toHie alts-        ]-      HsCmdIf _ _ a b c ->-        [ toHie a-        , toHie b-        , toHie c-        ]-      HsCmdLet _ binds cmd' ->-        [ toHie $ RS (mkLScope cmd') binds-        , toHie cmd'-        ]-      HsCmdDo _ (L ispan stmts) ->-        [ pure $ locOnly ispan-        , toHie $ listScopes NoScope stmts-        ]-      HsCmdWrap _ _ _ -> []-      XCmd _ -> []--instance ToHie (TyClGroup GhcRn) where-  toHie (TyClGroup _ classes roles instances) = concatM-    [ toHie classes-    , toHie roles-    , toHie instances-    ]-  toHie (XTyClGroup _) = pure []--instance ToHie (LTyClDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      FamDecl {tcdFam = fdecl} ->-        [ toHie (L span fdecl)-        ]-      SynDecl {tcdLName = name, tcdTyVars = vars, tcdRhs = typ} ->-        [ toHie $ C (Decl SynDec $ getRealSpan span) name-        , toHie $ TS (ResolvedScopes [mkScope $ getLoc typ]) vars-        , toHie typ-        ]-      DataDecl {tcdLName = name, tcdTyVars = vars, tcdDataDefn = defn} ->-        [ toHie $ C (Decl DataDec $ getRealSpan span) name-        , toHie $ TS (ResolvedScopes [quant_scope, rhs_scope]) vars-        , toHie defn-        ]-        where-          quant_scope = mkLScope $ dd_ctxt defn-          rhs_scope = sig_sc `combineScopes` con_sc `combineScopes` deriv_sc-          sig_sc = maybe NoScope mkLScope $ dd_kindSig defn-          con_sc = foldr combineScopes NoScope $ map mkLScope $ dd_cons defn-          deriv_sc = mkLScope $ dd_derivs defn-      ClassDecl { tcdCtxt = context-                , tcdLName = name-                , tcdTyVars = vars-                , tcdFDs = deps-                , tcdSigs = sigs-                , tcdMeths = meths-                , tcdATs = typs-                , tcdATDefs = deftyps-                } ->-        [ toHie $ C (Decl ClassDec $ getRealSpan span) name-        , toHie context-        , toHie $ TS (ResolvedScopes [context_scope, rhs_scope]) vars-        , toHie deps-        , toHie $ map (SC $ SI ClassSig $ getRealSpan span) sigs-        , toHie $ fmap (BC InstanceBind ModuleScope) meths-        , toHie typs-        , concatMapM (pure . locOnly . getLoc) deftyps-        , toHie $ map (go . unLoc) deftyps-        ]-        where-          context_scope = mkLScope context-          rhs_scope = foldl1' combineScopes $ map mkScope-            [ loc deps, loc sigs, loc (bagToList meths), loc typs, loc deftyps]--          go :: TyFamDefltEqn GhcRn-             -> FamEqn GhcRn (TScoped (LHsQTyVars GhcRn)) (LHsType GhcRn)-          go (FamEqn a var pat b rhs) =-             FamEqn a var (TS (ResolvedScopes [mkLScope rhs]) pat) b rhs-          go (XFamEqn NoExt) = XFamEqn NoExt-      XTyClDecl _ -> []--instance ToHie (LFamilyDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      FamilyDecl _ info name vars _ sig inj ->-        [ toHie $ C (Decl FamDec $ getRealSpan span) name-        , toHie $ TS (ResolvedScopes [rhsSpan]) vars-        , toHie info-        , toHie $ RS injSpan sig-        , toHie inj-        ]-        where-          rhsSpan = sigSpan `combineScopes` injSpan-          sigSpan = mkScope $ getLoc sig-          injSpan = maybe NoScope (mkScope . getLoc) inj-      XFamilyDecl _ -> []--instance ToHie (FamilyInfo GhcRn) where-  toHie (ClosedTypeFamily (Just eqns)) = concatM $-    [ concatMapM (pure . locOnly . getLoc) eqns-    , toHie $ map go eqns-    ]-    where-      go (L l ib) = TS (ResolvedScopes [mkScope l]) ib-  toHie _ = pure []--instance ToHie (RScoped (LFamilyResultSig GhcRn)) where-  toHie (RS sc (L span sig)) = concatM $ makeNode sig span : case sig of-      NoSig _ ->-        []-      KindSig _ k ->-        [ toHie k-        ]-      TyVarSig _ bndr ->-        [ toHie $ TVS (ResolvedScopes [sc]) NoScope bndr-        ]-      XFamilyResultSig _ -> []--instance ToHie (Located (FunDep (Located Name))) where-  toHie (L span fd@(lhs, rhs)) = concatM $-    [ makeNode fd span-    , toHie $ map (C Use) lhs-    , toHie $ map (C Use) rhs-    ]--instance (ToHie pats, ToHie rhs, HasLoc pats, HasLoc rhs)-    => ToHie (TScoped (FamEqn GhcRn pats rhs)) where-  toHie (TS _ f) = toHie f--instance ( ToHie pats-         , ToHie rhs-         , HasLoc pats-         , HasLoc rhs-         ) => ToHie (FamEqn GhcRn pats rhs) where-  toHie fe@(FamEqn _ var pats _ rhs) = concatM $-    [ toHie $ C (Decl InstDec $ getRealSpan $ loc fe) var-    , toHie pats-    , toHie rhs-    ]-  toHie (XFamEqn _) = pure []--instance ToHie (LInjectivityAnn GhcRn) where-  toHie (L span ann) = concatM $ makeNode ann span : case ann of-      InjectivityAnn lhs rhs ->-        [ toHie $ C Use lhs-        , toHie $ map (C Use) rhs-        ]--instance ToHie (HsDataDefn GhcRn) where-  toHie (HsDataDefn _ _ ctx _ mkind cons derivs) = concatM-    [ toHie ctx-    , toHie mkind-    , toHie cons-    , toHie derivs-    ]-  toHie (XHsDataDefn _) = pure []--instance ToHie (HsDeriving GhcRn) where-  toHie (L span clauses) = concatM-    [ pure $ locOnly span-    , toHie clauses-    ]--instance ToHie (LHsDerivingClause GhcRn) where-  toHie (L span cl) = concatM $ makeNode cl span : case cl of-      HsDerivingClause _ strat (L ispan tys) ->-        [ toHie strat-        , pure $ locOnly ispan-        , toHie $ map (TS (ResolvedScopes [])) tys-        ]-      XHsDerivingClause _ -> []--instance ToHie (Located (DerivStrategy GhcRn)) where-  toHie (L span strat) = concatM $ makeNode strat span : case strat of-      StockStrategy -> []-      AnyclassStrategy -> []-      NewtypeStrategy -> []-      ViaStrategy s -> [ toHie $ TS (ResolvedScopes []) s ]--instance ToHie (Located OverlapMode) where-  toHie (L span _) = pure $ locOnly span--instance ToHie (LConDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      ConDeclGADT { con_names = names, con_qvars = qvars-                  , con_mb_cxt = ctx, con_args = args, con_res_ty = typ } ->-        [ toHie $ map (C (Decl ConDec $ getRealSpan span)) names-        , toHie $ TS (ResolvedScopes [ctxScope, rhsScope]) qvars-        , toHie ctx-        , toHie args-        , toHie typ-        ]-        where-          rhsScope = combineScopes argsScope tyScope-          ctxScope = maybe NoScope mkLScope ctx-          argsScope = condecl_scope args-          tyScope = mkLScope typ-      ConDeclH98 { con_name = name, con_ex_tvs = qvars-                 , con_mb_cxt = ctx, con_args = dets } ->-        [ toHie $ C (Decl ConDec $ getRealSpan span) name-        , toHie $ tvScopes (ResolvedScopes []) rhsScope qvars-        , toHie ctx-        , toHie dets-        ]-        where-          rhsScope = combineScopes ctxScope argsScope-          ctxScope = maybe NoScope mkLScope ctx-          argsScope = condecl_scope dets-      XConDecl _ -> []-    where condecl_scope args = case args of-            PrefixCon xs -> foldr combineScopes NoScope $ map mkLScope xs-            InfixCon a b -> combineScopes (mkLScope a) (mkLScope b)-            RecCon x -> mkLScope x--instance ToHie (Located [LConDeclField GhcRn]) where-  toHie (L span decls) = concatM $-    [ pure $ locOnly span-    , toHie decls-    ]--instance ( HasLoc thing-         , ToHie (TScoped thing)-         ) => ToHie (TScoped (HsImplicitBndrs GhcRn thing)) where-  toHie (TS sc (HsIB ibrn a)) = concatM $-      [ pure $ bindingsOnly $ map (C $ TyVarBind (mkScope span) sc) $ (hsib_vars ibrn)-      , toHie $ TS sc a-      ]-    where span = loc a-  toHie (TS _ (XHsImplicitBndrs _)) = pure []--instance ( HasLoc thing-         , ToHie (TScoped thing)-         ) => ToHie (TScoped (HsWildCardBndrs GhcRn thing)) where-  toHie (TS sc (HsWC names a)) = concatM $-      [ pure $ bindingsOnly $ map (C $ TyVarBind (mkScope span) sc) names-      , toHie $ TS sc a-      ]-    where span = loc a-  toHie (TS _ (XHsWildCardBndrs _)) = pure []--instance ToHie (SigContext (LSig GhcRn)) where-  toHie (SC (SI styp msp) (L sp sig)) = concatM $ makeNode sig sp : case sig of-      TypeSig _ names typ ->-        [ toHie $ map (C TyDecl) names-        , toHie $ TS (UnresolvedScope (map unLoc names) Nothing) typ-        ]-      PatSynSig _ names typ ->-        [ toHie $ map (C TyDecl) names-        , toHie $ TS (UnresolvedScope (map unLoc names) Nothing) typ-        ]-      ClassOpSig _ _ names typ ->-        [ case styp of-            ClassSig -> toHie $ map (C $ ClassTyDecl $ getRealSpan sp) names-            _  -> toHie $ map (C $ TyDecl) names-        , toHie $ TS (UnresolvedScope (map unLoc names) msp) typ-        ]-      IdSig _ _ -> []-      FixSig _ fsig ->-        [ toHie $ L sp fsig-        ]-      InlineSig _ name _ ->-        [ toHie $ (C Use) name-        ]-      SpecSig _ name typs _ ->-        [ toHie $ (C Use) name-        , toHie $ map (TS (ResolvedScopes [])) typs-        ]-      SpecInstSig _ _ typ ->-        [ toHie $ TS (ResolvedScopes []) typ-        ]-      MinimalSig _ _ form ->-        [ toHie form-        ]-      SCCFunSig _ _ name mtxt ->-        [ toHie $ (C Use) name-        , pure $ maybe [] (locOnly . getLoc) mtxt-        ]-      CompleteMatchSig _ _ (L ispan names) typ ->-        [ pure $ locOnly ispan-        , toHie $ map (C Use) names-        , toHie $ fmap (C Use) typ-        ]-      XSig _ -> []--instance ToHie (LHsType GhcRn) where-  toHie x = toHie $ TS (ResolvedScopes []) x--instance ToHie (TScoped (LHsType GhcRn)) where-  toHie (TS tsc (L span t)) = concatM $ makeNode t span : case t of-      HsForAllTy _ bndrs body ->-        [ toHie $ tvScopes tsc (mkScope $ getLoc body) bndrs-        , toHie body-        ]-      HsQualTy _ ctx body ->-        [ toHie ctx-        , toHie body-        ]-      HsTyVar _ _ var ->-        [ toHie $ C Use var-        ]-      HsAppTy _ a b ->-        [ toHie a-        , toHie b-        ]-      HsFunTy _ a b ->-        [ toHie a-        , toHie b-        ]-      HsListTy _ a ->-        [ toHie a-        ]-      HsTupleTy _ _ tys ->-        [ toHie tys-        ]-      HsSumTy _ tys ->-        [ toHie tys-        ]-      HsOpTy _ a op b ->-        [ toHie a-        , toHie $ C Use op-        , toHie b-        ]-      HsParTy _ a ->-        [ toHie a-        ]-      HsIParamTy _ ip ty ->-        [ toHie ip-        , toHie ty-        ]-      HsKindSig _ a b ->-        [ toHie a-        , toHie b-        ]-      HsSpliceTy _ a ->-        [ toHie $ L span a-        ]-      HsDocTy _ a _ ->-        [ toHie a-        ]-      HsBangTy _ _ ty ->-        [ toHie ty-        ]-      HsRecTy _ fields ->-        [ toHie fields-        ]-      HsExplicitListTy _ _ tys ->-        [ toHie tys-        ]-      HsExplicitTupleTy _ tys ->-        [ toHie tys-        ]-      HsTyLit _ _ -> []-      HsWildCardTy _ -> []-      HsStarTy _ _ -> []-      XHsType _ -> []--{--instance (ToHie tm, ToHie ty) => ToHie (HsArg tm ty) where-  toHie (HsValArg tm) = toHie tm-  toHie (HsTypeArg _ ty) = toHie ty-  toHie (HsArgPar sp) = pure $ locOnly sp--}--instance ToHie (TVScoped (LHsTyVarBndr GhcRn)) where-  toHie (TVS tsc sc (L span bndr)) = concatM $ makeNode bndr span : case bndr of-      UserTyVar _ var ->-        [ toHie $ C (TyVarBind sc tsc) var-        ]-      KindedTyVar _ var kind ->-        [ toHie $ C (TyVarBind sc tsc) var-        , toHie kind-        ]-      XTyVarBndr _ -> []--instance ToHie (TScoped (LHsQTyVars GhcRn)) where-  toHie (TS sc (HsQTvs (HsQTvsRn implicits _) vars)) = concatM $-    [ pure $ bindingsOnly bindings-    , toHie $ tvScopes sc NoScope vars-    ]-    where-      varLoc = loc vars-      bindings = map (C $ TyVarBind (mkScope varLoc) sc) implicits-  toHie (TS _ (XLHsQTyVars _)) = pure []--instance ToHie (LHsContext GhcRn) where-  toHie (L span tys) = concatM $-      [ pure $ locOnly span-      , toHie tys-      ]--instance ToHie (LConDeclField GhcRn) where-  toHie (L span field) = concatM $ makeNode field span : case field of-      ConDeclField _ fields typ _ ->-        [ toHie $ map (RFC RecFieldDecl (getRealSpan $ loc typ)) fields-        , toHie typ-        ]-      XConDeclField _ -> []--instance ToHie (LHsExpr a) => ToHie (ArithSeqInfo a) where-  toHie (From expr) = toHie expr-  toHie (FromThen a b) = concatM $-    [ toHie a-    , toHie b-    ]-  toHie (FromTo a b) = concatM $-    [ toHie a-    , toHie b-    ]-  toHie (FromThenTo a b c) = concatM $-    [ toHie a-    , toHie b-    , toHie c-    ]--instance ToHie (LSpliceDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      SpliceDecl _ splice _ ->-        [ toHie splice-        ]-      XSpliceDecl _ -> []--instance ToHie (HsBracket a) where-  toHie _ = pure []--instance ToHie PendingRnSplice where-  toHie _ = pure []--instance ToHie PendingTcSplice where-  toHie _ = pure []--instance ToHie (LBooleanFormula (Located Name)) where-  toHie (L span form) = concatM $ makeNode form span : case form of-      Var a ->-        [ toHie $ C Use a-        ]-      And forms ->-        [ toHie forms-        ]-      Or forms ->-        [ toHie forms-        ]-      Parens f ->-        [ toHie f-        ]--instance ToHie (Located HsIPName) where-  toHie (L span e) = makeNode e span--instance ( ToHie (LHsExpr a)-         , Data (HsSplice a)-         ) => ToHie (Located (HsSplice a)) where-  toHie (L span sp) = concatM $ makeNode sp span : case sp of-      HsTypedSplice _ _ _ expr ->-        [ toHie expr-        ]-      HsUntypedSplice _ _ _ expr ->-        [ toHie expr-        ]-      HsQuasiQuote _ _ _ ispan _ ->-        [ pure $ locOnly ispan-        ]-      HsSpliced _ _ _ ->-        []-      XSplice _ -> []--instance ToHie (LRoleAnnotDecl GhcRn) where-  toHie (L span annot) = concatM $ makeNode annot span : case annot of-      RoleAnnotDecl _ var roles ->-        [ toHie $ C Use var-        , concatMapM (pure . locOnly . getLoc) roles-        ]-      XRoleAnnotDecl _ -> []--instance ToHie (LInstDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      ClsInstD _ d ->-        [ toHie $ L span d-        ]-      DataFamInstD _ d ->-        [ toHie $ L span d-        ]-      TyFamInstD _ d ->-        [ toHie $ L span d-        ]-      XInstDecl _ -> []--instance ToHie (LClsInstDecl GhcRn) where-  toHie (L span decl) = concatM-    [ toHie $ TS (ResolvedScopes [mkScope span]) $ cid_poly_ty decl-    , toHie $ fmap (BC InstanceBind ModuleScope) $ cid_binds decl-    , toHie $ map (SC $ SI InstSig $ getRealSpan span) $ cid_sigs decl-    , pure $ concatMap (locOnly . getLoc) $ cid_tyfam_insts decl-    , toHie $ cid_tyfam_insts decl-    , pure $ concatMap (locOnly . getLoc) $ cid_datafam_insts decl-    , toHie $ cid_datafam_insts decl-    , toHie $ cid_overlap_mode decl-    ]--instance ToHie (LDataFamInstDecl GhcRn) where-  toHie (L sp (DataFamInstDecl d)) = toHie $ TS (ResolvedScopes [mkScope sp]) d--instance ToHie (LTyFamInstDecl GhcRn) where-  toHie (L sp (TyFamInstDecl d)) = toHie $ TS (ResolvedScopes [mkScope sp]) d--instance ToHie (Context a)-         => ToHie (PatSynFieldContext (RecordPatSynField a)) where-  toHie (PSC sp (RecordPatSynField a b)) = concatM $-    [ toHie $ C (RecField RecFieldDecl sp) a-    , toHie $ C Use b-    ]--instance ToHie (LDerivDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      DerivDecl _ typ strat overlap ->-        [ toHie $ TS (ResolvedScopes []) typ-        , toHie strat-        , toHie overlap-        ]-      XDerivDecl _ -> []--instance ToHie (LFixitySig GhcRn) where-  toHie (L span sig) = concatM $ makeNode sig span : case sig of-      FixitySig _ vars _ ->-        [ toHie $ map (C Use) vars-        ]-      XFixitySig _ -> []--instance ToHie (LDefaultDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      DefaultDecl _ typs ->-        [ toHie typs-        ]-      XDefaultDecl _ -> []--instance ToHie (LForeignDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      ForeignImport {fd_name = name, fd_sig_ty = sig, fd_fi = fi} ->-        [ toHie $ C (ValBind RegularBind ModuleScope $ getRealSpan span) name-        , toHie $ TS (ResolvedScopes []) sig-        , toHie fi-        ]-      ForeignExport {fd_name = name, fd_sig_ty = sig, fd_fe = fe} ->-        [ toHie $ C Use name-        , toHie $ TS (ResolvedScopes []) sig-        , toHie fe-        ]-      XForeignDecl _ -> []--instance ToHie ForeignImport where-  toHie (CImport (L a _) (L b _) _ _ (L c _)) = pure $ concat $-    [ locOnly a-    , locOnly b-    , locOnly c-    ]--instance ToHie ForeignExport where-  toHie (CExport (L a _) (L b _)) = pure $ concat $-    [ locOnly a-    , locOnly b-    ]--instance ToHie (LWarnDecls GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      Warnings _ _ warnings ->-        [ toHie warnings-        ]-      XWarnDecls _ -> []--instance ToHie (LWarnDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      Warning _ vars _ ->-        [ toHie $ map (C Use) vars-        ]-      XWarnDecl _ -> []--instance ToHie (LAnnDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      HsAnnotation _ _ prov expr ->-        [ toHie prov-        , toHie expr-        ]-      XAnnDecl _ -> []--instance ToHie (Context (Located a)) => ToHie (AnnProvenance a) where-  toHie (ValueAnnProvenance a) = toHie $ C Use a-  toHie (TypeAnnProvenance a) = toHie $ C Use a-  toHie ModuleAnnProvenance = pure []--instance ToHie (LRuleDecls GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      HsRules _ _ rules ->-        [ toHie rules-        ]-      XRuleDecls _ -> []--instance ToHie (LRuleDecl GhcRn) where-  toHie (L _ (XRuleDecl _)) = pure []-  toHie (L span r@(HsRule _ rname _ bndrs exprA exprB)) = concatM-        [ makeNode r span-        , pure $ locOnly $ getLoc rname-        , toHie $ map (RS $ mkScope span) bndrs-        , toHie exprA-        , toHie exprB-        ]--instance ToHie (RScoped (LRuleBndr GhcRn)) where-  toHie (RS sc (L span bndr)) = concatM $ makeNode bndr span : case bndr of-      RuleBndr _ var ->-        [ toHie $ C (ValBind RegularBind sc Nothing) var-        ]-      RuleBndrSig _ var typ ->-        [ toHie $ C (ValBind RegularBind sc Nothing) var-        , toHie $ TS (ResolvedScopes [sc]) typ-        ]-      XRuleBndr _ -> []--instance ToHie (LImportDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      ImportDecl { ideclName = name, ideclAs = as, ideclHiding = hidden } ->-        [ toHie $ IEC Import name-        , toHie $ fmap (IEC ImportAs) as-        , maybe (pure []) goIE hidden-        ]-      XImportDecl _ -> []-    where-      goIE (hiding, (L sp liens)) = concatM $-        [ pure $ locOnly sp-        , toHie $ map (IEC c) liens-        ]-        where-         c = if hiding then ImportHiding else Import--instance ToHie (IEContext (LIE GhcRn)) where-  toHie (IEC c (L span ie)) = concatM $ makeNode ie span : case ie of-      IEVar _ n ->-        [ toHie $ IEC c n-        ]-      IEThingAbs _ n ->-        [ toHie $ IEC c n-        ]-      IEThingAll _ n ->-        [ toHie $ IEC c n-        ]-      IEThingWith _ n _ ns flds ->-        [ toHie $ IEC c n-        , toHie $ map (IEC c) ns-        , toHie $ map (IEC c) flds-        ]-      IEModuleContents _ n ->-        [ toHie $ IEC c n-        ]-      IEGroup _ _ _ -> []-      IEDoc _ _ -> []-      IEDocNamed _ _ -> []-      XIE _ -> []--instance ToHie (IEContext (LIEWrappedName Name)) where-  toHie (IEC c (L span iewn)) = concatM $ makeNode iewn span : case iewn of-      IEName n ->-        [ toHie $ C (IEThing c) n-        ]-      IEPattern p ->-        [ toHie $ C (IEThing c) p-        ]-      IEType n ->-        [ toHie $ C (IEThing c) n-        ]--instance ToHie (IEContext (Located (FieldLbl Name))) where-  toHie (IEC c (L span lbl)) = concatM $ makeNode lbl span : case lbl of-      FieldLabel _ _ n ->-        [ toHie $ C (IEThing c) $ L span n-        ]-
− src-ghc86/Development/IDE/GHC/HieBin.hs
@@ -1,388 +0,0 @@-{--Binary serialization for .hie files.--}-{-# LANGUAGE ScopedTypeVariables #-}-module Development.IDE.GHC.HieBin ( readHieFile, readHieFileWithVersion, HieHeader, writeHieFile, HieName(..), toHieName, HieFileResult(..), hieMagic,NameCacheUpdater(..)) where--import Config                     ( cProjectVersion )-import Binary-import BinIface                   ( getDictFastString )-import FastMutInt-import FastString                 ( FastString )-import Module                     ( Module )-import Name-import NameCache-import Outputable-import PrelInfo-import SrcLoc-import UniqSupply                 ( takeUniqFromSupply )-import Util                       ( maybeRead )-import Unique-import UniqFM-import IfaceEnv--import qualified Data.Array as A-import Data.IORef-import Data.ByteString            ( ByteString )-import qualified Data.ByteString  as BS-import qualified Data.ByteString.Char8 as BSC-import Data.List                  ( mapAccumR )-import Data.Word                  ( Word8, Word32 )-import Control.Monad              ( replicateM, when )-import System.Directory           ( createDirectoryIfMissing )-import System.FilePath            ( takeDirectory )--import Development.IDE.GHC.HieTypes---- | `Name`'s get converted into `HieName`'s before being written into @.hie@--- files. See 'toHieName' and 'fromHieName' for logic on how to convert between--- these two types.-data HieName-  = ExternalName !Module !OccName !SrcSpan-  | LocalName !OccName !SrcSpan-  | KnownKeyName !Unique-  deriving (Eq)--instance Ord HieName where-  compare (ExternalName a b c) (ExternalName d e f) = compare (a,b,c) (d,e,f)-  compare (LocalName a b) (LocalName c d) = compare (a,b) (c,d)-  compare (KnownKeyName a) (KnownKeyName b) = nonDetCmpUnique a b-    -- Not actually non determinstic as it is a KnownKey-  compare ExternalName{} _ = LT-  compare LocalName{} ExternalName{} = GT-  compare LocalName{} _ = LT-  compare KnownKeyName{} _ = GT--instance Outputable HieName where-  ppr (ExternalName m n sp) = text "ExternalName" <+> ppr m <+> ppr n <+> ppr sp-  ppr (LocalName n sp) = text "LocalName" <+> ppr n <+> ppr sp-  ppr (KnownKeyName u) = text "KnownKeyName" <+> ppr u---data HieSymbolTable = HieSymbolTable-  { hie_symtab_next :: !FastMutInt-  , hie_symtab_map  :: !(IORef (UniqFM (Int, HieName)))-  }--data HieDictionary = HieDictionary-  { hie_dict_next :: !FastMutInt -- The next index to use-  , hie_dict_map  :: !(IORef (UniqFM (Int,FastString))) -- indexed by FastString-  }--initBinMemSize :: Int-initBinMemSize = 1024*1024---- | The header for HIE files - Capital ASCII letters "HIE".-hieMagic :: [Word8]-hieMagic = [72,73,69]--hieMagicLen :: Int-hieMagicLen = length hieMagic--ghcVersion :: ByteString-ghcVersion = BSC.pack cProjectVersion--putBinLine :: BinHandle -> ByteString -> IO ()-putBinLine bh xs = do-  mapM_ (putByte bh) $ BS.unpack xs-  putByte bh 10 -- newline char---- | Write a `HieFile` to the given `FilePath`, with a proper header and--- symbol tables for `Name`s and `FastString`s-writeHieFile :: FilePath -> HieFile -> IO ()-writeHieFile hie_file_path hiefile = do-  bh0 <- openBinMem initBinMemSize--  -- Write the header: hieHeader followed by the-  -- hieVersion and the GHC version used to generate this file-  mapM_ (putByte bh0) hieMagic-  putBinLine bh0 $ BSC.pack $ show hieVersion-  putBinLine bh0 $ ghcVersion--  -- remember where the dictionary pointer will go-  dict_p_p <- tellBin bh0-  put_ bh0 dict_p_p--  -- remember where the symbol table pointer will go-  symtab_p_p <- tellBin bh0-  put_ bh0 symtab_p_p--  -- Make some intial state-  symtab_next <- newFastMutInt-  writeFastMutInt symtab_next 0-  symtab_map <- newIORef emptyUFM-  let hie_symtab = HieSymbolTable {-                      hie_symtab_next = symtab_next,-                      hie_symtab_map  = symtab_map }-  dict_next_ref <- newFastMutInt-  writeFastMutInt dict_next_ref 0-  dict_map_ref <- newIORef emptyUFM-  let hie_dict = HieDictionary {-                      hie_dict_next = dict_next_ref,-                      hie_dict_map  = dict_map_ref }--  -- put the main thing-  let bh = setUserData bh0 $ newWriteState (putName hie_symtab)-                                           (putName hie_symtab)-                                           (putFastString hie_dict)-  put_ bh hiefile--  -- write the symtab pointer at the front of the file-  symtab_p <- tellBin bh-  putAt bh symtab_p_p symtab_p-  seekBin bh symtab_p--  -- write the symbol table itself-  symtab_next' <- readFastMutInt symtab_next-  symtab_map'  <- readIORef symtab_map-  putSymbolTable bh symtab_next' symtab_map'--  -- write the dictionary pointer at the front of the file-  dict_p <- tellBin bh-  putAt bh dict_p_p dict_p-  seekBin bh dict_p--  -- write the dictionary itself-  dict_next <- readFastMutInt dict_next_ref-  dict_map  <- readIORef dict_map_ref-  putDictionary bh dict_next dict_map--  -- and send the result to the file-  createDirectoryIfMissing True (takeDirectory hie_file_path)-  writeBinMem bh hie_file_path-  return ()--data HieFileResult-  = HieFileResult-  { hie_file_result_version :: Integer-  , hie_file_result_ghc_version :: ByteString-  , hie_file_result :: HieFile-  }--type HieHeader = (Integer, ByteString)---- | Read a `HieFile` from a `FilePath`. Can use--- an existing `NameCache`. Allows you to specify--- which versions of hieFile to attempt to read.--- `Left` case returns the failing header versions.-readHieFileWithVersion :: (HieHeader -> Bool) -> NameCacheUpdater -> FilePath -> IO (Either HieHeader HieFileResult)-readHieFileWithVersion readVersion ncu file = do-  bh0 <- readBinMem file--  (hieVersion, ghcVersion) <- readHieFileHeader file bh0--  if readVersion (hieVersion, ghcVersion)-  then do-    hieFile <- readHieFileContents bh0 ncu-    return $ Right (HieFileResult hieVersion ghcVersion hieFile)-  else return $ Left (hieVersion, ghcVersion)----- | Read a `HieFile` from a `FilePath`. Can use--- an existing `NameCache`.-readHieFile :: NameCacheUpdater -> FilePath -> IO HieFileResult-readHieFile ncu file = do--  bh0 <- readBinMem file--  (readHieVersion, ghcVersion) <- readHieFileHeader file bh0--  -- Check if the versions match-  when (readHieVersion /= hieVersion) $-    panic $ unwords ["readHieFile: hie file versions don't match for file:"-                    , file-                    , "Expected"-                    , show hieVersion-                    , "but got", show readHieVersion-                    ]-  hieFile <- readHieFileContents bh0 ncu-  return $ HieFileResult hieVersion ghcVersion hieFile--readBinLine :: BinHandle -> IO ByteString-readBinLine bh = BS.pack . reverse <$> loop []-  where-    loop acc = do-      char <- get bh :: IO Word8-      if char == 10 -- ASCII newline '\n'-      then return acc-      else loop (char : acc)--readHieFileHeader :: FilePath -> BinHandle -> IO HieHeader-readHieFileHeader file bh0 = do-  -- Read the header-  magic <- replicateM hieMagicLen (get bh0)-  version <- BSC.unpack <$> readBinLine bh0-  case maybeRead version of-    Nothing ->-      panic $ unwords ["readHieFileHeader: hieVersion isn't an Integer:"-                      , show version-                      ]-    Just readHieVersion -> do-      ghcVersion <- readBinLine bh0--      -- Check if the header is valid-      when (magic /= hieMagic) $-        panic $ unwords ["readHieFileHeader: headers don't match for file:"-                        , file-                        , "Expected"-                        , show hieMagic-                        , "but got", show magic-                        ]-      return (readHieVersion, ghcVersion)--readHieFileContents :: BinHandle -> NameCacheUpdater -> IO HieFile-readHieFileContents bh0 ncu = do--  dict  <- get_dictionary bh0--  -- read the symbol table so we are capable of reading the actual data-  bh1 <- do-      let bh1 = setUserData bh0 $ newReadState (error "getSymtabName")-                                               (getDictFastString dict)-      symtab <- get_symbol_table bh1-      let bh1' = setUserData bh1-               $ newReadState (getSymTabName symtab)-                              (getDictFastString dict)-      return bh1'--  -- load the actual data-  hiefile <- get bh1-  return hiefile-  where-    get_dictionary bin_handle = do-      dict_p <- get bin_handle-      data_p <- tellBin bin_handle-      seekBin bin_handle dict_p-      dict <- getDictionary bin_handle-      seekBin bin_handle data_p-      return dict--    get_symbol_table bh1 = do-      symtab_p <- get bh1-      data_p'  <- tellBin bh1-      seekBin bh1 symtab_p-      symtab <- getSymbolTable bh1 ncu-      seekBin bh1 data_p'-      return symtab--putFastString :: HieDictionary -> BinHandle -> FastString -> IO ()-putFastString HieDictionary { hie_dict_next = j_r,-                              hie_dict_map  = out_r}  bh f-  = do-    out <- readIORef out_r-    let unique = getUnique f-    case lookupUFM out unique of-        Just (j, _)  -> put_ bh (fromIntegral j :: Word32)-        Nothing -> do-           j <- readFastMutInt j_r-           put_ bh (fromIntegral j :: Word32)-           writeFastMutInt j_r (j + 1)-           writeIORef out_r $! addToUFM out unique (j, f)--putSymbolTable :: BinHandle -> Int -> UniqFM (Int,HieName) -> IO ()-putSymbolTable bh next_off symtab = do-  put_ bh next_off-  let names = A.elems (A.array (0,next_off-1) (nonDetEltsUFM symtab))-  mapM_ (putHieName bh) names--getSymbolTable :: BinHandle -> NameCacheUpdater -> IO SymbolTable-getSymbolTable bh ncu = do-  sz <- get bh-  od_names <- replicateM sz (getHieName bh)-  updateNameCache ncu $ \nc ->-    let arr = A.listArray (0,sz-1) names-        (nc', names) = mapAccumR fromHieName nc od_names-        in (nc',arr)--getSymTabName :: SymbolTable -> BinHandle -> IO Name-getSymTabName st bh = do-  i :: Word32 <- get bh-  return $ st A.! (fromIntegral i)--putName :: HieSymbolTable -> BinHandle -> Name -> IO ()-putName (HieSymbolTable next ref) bh name = do-  symmap <- readIORef ref-  case lookupUFM symmap name of-    Just (off, ExternalName mod occ (UnhelpfulSpan _))-      | isGoodSrcSpan (nameSrcSpan name) -> do-      let hieName = ExternalName mod occ (nameSrcSpan name)-      writeIORef ref $! addToUFM symmap name (off, hieName)-      put_ bh (fromIntegral off :: Word32)-    Just (off, LocalName _occ span)-      | notLocal (toHieName name) || nameSrcSpan name /= span -> do-      writeIORef ref $! addToUFM symmap name (off, toHieName name)-      put_ bh (fromIntegral off :: Word32)-    Just (off, _) -> put_ bh (fromIntegral off :: Word32)-    Nothing -> do-        off <- readFastMutInt next-        writeFastMutInt next (off+1)-        writeIORef ref $! addToUFM symmap name (off, toHieName name)-        put_ bh (fromIntegral off :: Word32)--  where-    notLocal :: HieName -> Bool-    notLocal LocalName{} = False-    notLocal _ = True----- ** Converting to and from `HieName`'s--toHieName :: Name -> HieName-toHieName name-  | isKnownKeyName name = KnownKeyName (nameUnique name)-  | isExternalName name = ExternalName (nameModule name)-                                       (nameOccName name)-                                       (nameSrcSpan name)-  | otherwise = LocalName (nameOccName name) (nameSrcSpan name)--fromHieName :: NameCache -> HieName -> (NameCache, Name)-fromHieName nc (ExternalName mod occ span) =-    let cache = nsNames nc-    in case lookupOrigNameCache cache mod occ of-         Just name-           | nameSrcSpan name == span -> (nc, name)-           | otherwise ->-             let name' = setNameLoc name span-                 new_cache = extendNameCache cache mod occ name'-             in ( nc{ nsNames = new_cache }, name' )-         Nothing ->-           let (uniq, us) = takeUniqFromSupply (nsUniqs nc)-               name       = mkExternalName uniq mod occ span-               new_cache  = extendNameCache cache mod occ name-           in ( nc{ nsUniqs = us, nsNames = new_cache }, name )-fromHieName nc (LocalName occ span) =-    let (uniq, us) = takeUniqFromSupply (nsUniqs nc)-        name       = mkInternalName uniq occ span-    in ( nc{ nsUniqs = us }, name )-fromHieName nc (KnownKeyName u) = case lookupKnownKeyName u of-    Nothing -> pprPanic "fromHieName:unknown known-key unique"-                        (ppr (unpkUnique u))-    Just n -> (nc, n)---- ** Reading and writing `HieName`'s--putHieName :: BinHandle -> HieName -> IO ()-putHieName bh (ExternalName mod occ span) = do-  putByte bh 0-  put_ bh (mod, occ, span)-putHieName bh (LocalName occName span) = do-  putByte bh 1-  put_ bh (occName, span)-putHieName bh (KnownKeyName uniq) = do-  putByte bh 2-  put_ bh $ unpkUnique uniq--getHieName :: BinHandle -> IO HieName-getHieName bh = do-  t <- getByte bh-  case t of-    0 -> do-      (modu, occ, span) <- get bh-      return $ ExternalName modu occ span-    1 -> do-      (occ, span) <- get bh-      return $ LocalName occ span-    2 -> do-      (c,i) <- get bh-      return $ KnownKeyName $ mkUnique c i-    _ -> panic "HieBin.getHieName: invalid tag"
− src-ghc86/Development/IDE/GHC/HieDebug.hs
@@ -1,145 +0,0 @@-{--Functions to validate and check .hie file ASTs generated by GHC.--}-{-# LANGUAGE StandaloneDeriving #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE FlexibleContexts #-}-module Development.IDE.GHC.HieDebug where--import Prelude hiding ((<>))-import SrcLoc-import Module-import FastString-import Outputable--import Development.IDE.GHC.HieTypes-import Development.IDE.GHC.HieBin-import Development.IDE.GHC.HieUtils--import qualified Data.Map as M-import qualified Data.Set as S-import Data.Function    ( on )-import Data.List        ( sortOn )-import Data.Foldable    ( toList )--ppHies :: Outputable a => (HieASTs a) -> SDoc-ppHies (HieASTs asts) = M.foldrWithKey go "" asts-  where-    go k a rest = vcat $-      [ "File: " <> ppr k-      , ppHie a-      , rest-      ]--ppHie :: Outputable a => HieAST a -> SDoc-ppHie = go 0-  where-    go n (Node inf sp children) = hang header n rest-      where-        rest = vcat $ map (go (n+2)) children-        header = hsep-          [ "Node"-          , ppr sp-          , ppInfo inf-          ]--ppInfo :: Outputable a => NodeInfo a -> SDoc-ppInfo ni = hsep-  [ ppr $ toList $ nodeAnnotations ni-  , ppr $ nodeType ni-  , ppr $ M.toList $ nodeIdentifiers ni-  ]--type Diff a = a -> a -> [SDoc]--diffFile :: Diff HieFile-diffFile = diffAsts eqDiff `on` (getAsts . hie_asts)--diffAsts :: (Outputable a, Eq a) => Diff a -> Diff (M.Map FastString (HieAST a))-diffAsts f = diffList (diffAst f) `on` M.elems--diffAst :: (Outputable a, Eq a) => Diff a -> Diff (HieAST a)-diffAst diffType (Node info1 span1 xs1) (Node info2 span2 xs2) =-    infoDiff ++ spanDiff ++ diffList (diffAst diffType) xs1 xs2-  where-    spanDiff-      | span1 /= span2 = [hsep ["Spans", ppr span1, "and", ppr span2, "differ"]]-      | otherwise = []-    infoDiff-      = (diffList eqDiff `on` (S.toAscList . nodeAnnotations)) info1 info2-     ++ (diffList diffType `on` nodeType) info1 info2-     ++ (diffIdents `on` nodeIdentifiers) info1 info2-    diffIdents a b = (diffList diffIdent `on` normalizeIdents) a b-    diffIdent (a,b) (c,d) = diffName a c-                         ++ eqDiff b d-    diffName (Right a) (Right b) = case (a,b) of-      (ExternalName m o _, ExternalName m' o' _) -> eqDiff (m,o) (m',o')-      (LocalName o _, ExternalName _ o' _) -> eqDiff o o'-      _ -> eqDiff a b-    diffName a b = eqDiff a b--type DiffIdent = Either ModuleName HieName--normalizeIdents :: NodeIdentifiers a -> [(DiffIdent,IdentifierDetails a)]-normalizeIdents = sortOn fst . map (first toHieName) . M.toList-  where-    first f (a,b) = (fmap f a, b)--diffList :: Diff a -> Diff [a]-diffList f xs ys-  | length xs == length ys = concat $ zipWith f xs ys-  | otherwise = ["length of lists doesn't match"]--eqDiff :: (Outputable a, Eq a) => Diff a-eqDiff a b-  | a == b = []-  | otherwise = [hsep [ppr a, "and", ppr b, "do not match"]]--validAst :: HieAST a -> Either SDoc ()-validAst (Node _ span children) = do-  checkContainment children-  checkSorted children-  mapM_ validAst children-  where-    checkSorted [] = return ()-    checkSorted [_] = return ()-    checkSorted (x:y:xs)-      | nodeSpan x `leftOf` nodeSpan y = checkSorted (y:xs)-      | otherwise = Left $ hsep-          [ ppr $ nodeSpan x-          , "is not to the left of"-          , ppr $ nodeSpan y-          ]-    checkContainment [] = return ()-    checkContainment (x:xs)-      | span `containsSpan` (nodeSpan x) = checkContainment xs-      | otherwise = Left $ hsep-          [ ppr $ span-          , "does not contain"-          , ppr $ nodeSpan x-          ]---- | Look for any identifiers which occur outside of their supposed scopes.--- Returns a list of error messages.-validateScopes :: M.Map FastString (HieAST a) -> [SDoc]-validateScopes asts = M.foldrWithKey (\k a b -> valid k a ++ b) [] refMap-  where-    refMap = generateReferencesMap asts-    valid (Left _) _ = []-    valid (Right n) refs = concatMap inScope refs-      where-        mapRef = foldMap getScopeFromContext . identInfo . snd-        scopes = case foldMap mapRef refs of-          Just xs -> xs-          Nothing -> []-        inScope (sp, dets)-          |  definedInAsts asts n-          && any isOccurrence (identInfo dets)-            = case scopes of-              [] -> []-              _ -> if any (`scopeContainsSpan` sp) scopes-                   then []-                   else return $ hsep $-                     [ "Name", ppr n, "at position", ppr sp-                     , "doesn't occur in calculated scope", ppr scopes]-          | otherwise = []
− src-ghc86/Development/IDE/GHC/HieTypes.hs
@@ -1,534 +0,0 @@-{--Types for the .hie file format are defined here.--For more information see https://gitlab.haskell.org/ghc/ghc/wikis/hie-files--}-{-# LANGUAGE DeriveTraversable #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE TypeSynonymInstances #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# OPTIONS_GHC -Wno-orphans #-}-module Development.IDE.GHC.HieTypes where--import Config-import Binary-import FastString                 ( FastString )-import IfaceType-import Module                     ( ModuleName, Module )-import Name                       ( Name )-import Outputable hiding ( (<>) )-import SrcLoc-import Avail--import qualified Data.Array as A-import qualified Data.Map as M-import qualified Data.Set as S-import Data.ByteString            ( ByteString )-import Data.Data                  ( Typeable, Data )-import Data.Semigroup             ( Semigroup(..) )-import Data.Word                  ( Word8 )-import Control.Applicative        ( (<|>) )--type Span = RealSrcSpan--instance Binary RealSrcSpan where-  put_ bh ss = do-            put_ bh (srcSpanFile ss)-            put_ bh (srcSpanStartLine ss)-            put_ bh (srcSpanStartCol ss)-            put_ bh (srcSpanEndLine ss)-            put_ bh (srcSpanEndCol ss)--  get bh = do-            f <- get bh-            sl <- get bh-            sc <- get bh-            el <- get bh-            ec <- get bh-            return (mkRealSrcSpan (mkRealSrcLoc f sl sc)-                                  (mkRealSrcLoc f el ec))--instance (A.Ix a, Binary a, Binary b) => Binary (A.Array a b) where-    put_ bh arr = do-        put_ bh $ A.bounds arr-        put_ bh $ A.elems arr-    get bh = do-        bounds <- get bh-        xs <- get bh-        return $ A.listArray bounds xs---- | Current version of @.hie@ files-hieVersion :: Integer-hieVersion = read (cProjectVersionInt ++ cProjectPatchLevel) :: Integer--{- |-GHC builds up a wealth of information about Haskell source as it compiles it.-@.hie@ files are a way of persisting some of this information to disk so that-external tools that need to work with haskell source don't need to parse,-typecheck, and rename all over again. These files contain:--  * a simplified AST--       * nodes are annotated with source positions and types-       * identifiers are annotated with scope information--  * the raw bytes of the initial Haskell source--Besides saving compilation cycles, @.hie@ files also offer a more stable-interface than the GHC API.--}-data HieFile = HieFile-    { hie_hs_file :: FilePath-    -- ^ Initial Haskell source file path--    , hie_module :: Module-    -- ^ The module this HIE file is for--    , hie_types :: A.Array TypeIndex HieTypeFlat-    -- ^ Types referenced in the 'hie_asts'.-    ---    -- See Note [Efficient serialization of redundant type info]--    , hie_asts :: HieASTs TypeIndex-    -- ^ Type-annotated abstract syntax trees--    , hie_exports :: [AvailInfo]-    -- ^ The names that this module exports--    , hie_hs_src :: ByteString-    -- ^ Raw bytes of the initial Haskell source-    }-instance Binary HieFile where-  put_ bh hf = do-    put_ bh $ hie_hs_file hf-    put_ bh $ hie_module hf-    put_ bh $ hie_types hf-    put_ bh $ hie_asts hf-    put_ bh $ hie_exports hf-    put_ bh $ hie_hs_src hf--  get bh = HieFile-    <$> get bh-    <*> get bh-    <*> get bh-    <*> get bh-    <*> get bh-    <*> get bh---{--Note [Efficient serialization of redundant type info]-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--The type information in .hie files is highly repetitive and redundant. For-example, consider the expression--    const True 'a'--There is a lot of shared structure between the types of subterms:--  * const True 'a' ::                 Bool-  * const True     ::         Char -> Bool-  * const          :: Bool -> Char -> Bool--Since all 3 of these types need to be stored in the .hie file, it is worth-making an effort to deduplicate this shared structure. The trick is to define-a new data type that is a flattened version of 'Type':--    data HieType a = HAppTy a a  -- data Type = AppTy Type Type-                   | HFunTy a a  --           | FunTy Type Type-                   | ...--    type TypeIndex = Int--Types in the final AST are stored in an 'A.Array TypeIndex (HieType TypeIndex)',-where the 'TypeIndex's in the 'HieType' are references to other elements of the-array. Types recovered from GHC are deduplicated and stored in this compressed-form with sharing of subtrees.--}--type TypeIndex = Int---- | A flattened version of 'Type'.------ See Note [Efficient serialization of redundant type info]-data HieType a-  = HTyVarTy Name-  | HAppTy a a-  | HTyConApp IfaceTyCon (HieArgs a)-  | HForAllTy ((Name, a),ArgFlag) a-  | HFunTy  a a-  | HQualTy a a           -- ^ type with constraint: @t1 => t2@ (see 'IfaceDFunTy')-  | HLitTy IfaceTyLit-  | HCastTy a-  | HCoercionTy-    deriving (Functor, Foldable, Traversable, Eq)--type HieTypeFlat = HieType TypeIndex---- | Roughly isomorphic to the original core 'Type'.-newtype HieTypeFix = Roll (HieType (HieTypeFix))--instance Binary (HieType TypeIndex) where-  put_ bh (HTyVarTy n) = do-    putByte bh 0-    put_ bh n-  put_ bh (HAppTy a b) = do-    putByte bh 1-    put_ bh a-    put_ bh b-  put_ bh (HTyConApp n xs) = do-    putByte bh 2-    put_ bh n-    put_ bh xs-  put_ bh (HForAllTy bndr a) = do-    putByte bh 3-    put_ bh bndr-    put_ bh a-  put_ bh (HFunTy a b) = do-    putByte bh 4-    put_ bh a-    put_ bh b-  put_ bh (HQualTy a b) = do-    putByte bh 5-    put_ bh a-    put_ bh b-  put_ bh (HLitTy l) = do-    putByte bh 6-    put_ bh l-  put_ bh (HCastTy a) = do-    putByte bh 7-    put_ bh a-  put_ bh (HCoercionTy) = putByte bh 8--  get bh = do-    (t :: Word8) <- get bh-    case t of-      0 -> HTyVarTy <$> get bh-      1 -> HAppTy <$> get bh <*> get bh-      2 -> HTyConApp <$> get bh <*> get bh-      3 -> HForAllTy <$> get bh <*> get bh-      4 -> HFunTy <$> get bh <*> get bh-      5 -> HQualTy <$> get bh <*> get bh-      6 -> HLitTy <$> get bh-      7 -> HCastTy <$> get bh-      8 -> return HCoercionTy-      _ -> panic "Binary (HieArgs Int): invalid tag"----- | A list of type arguments along with their respective visibilities (ie. is--- this an argument that would return 'True' for 'isVisibleArgFlag'?).-newtype HieArgs a = HieArgs [(Bool,a)]-  deriving (Functor, Foldable, Traversable, Eq)--instance Binary (HieArgs TypeIndex) where-  put_ bh (HieArgs xs) = put_ bh xs-  get bh = HieArgs <$> get bh---- | Mapping from filepaths (represented using 'FastString') to the--- corresponding AST-newtype HieASTs a = HieASTs { getAsts :: (M.Map FastString (HieAST a)) }-  deriving (Functor, Foldable, Traversable)--instance Binary (HieASTs TypeIndex) where-  put_ bh asts = put_ bh $ M.toAscList $ getAsts asts-  get bh = HieASTs <$> fmap M.fromDistinctAscList (get bh)---data HieAST a =-  Node-    { nodeInfo :: NodeInfo a-    , nodeSpan :: Span-    , nodeChildren :: [HieAST a]-    } deriving (Functor, Foldable, Traversable)--instance Binary (HieAST TypeIndex) where-  put_ bh ast = do-    put_ bh $ nodeInfo ast-    put_ bh $ nodeSpan ast-    put_ bh $ nodeChildren ast--  get bh = Node-    <$> get bh-    <*> get bh-    <*> get bh----- | The information stored in one AST node.------ The type parameter exists to provide flexibility in representation of types--- (see Note [Efficient serialization of redundant type info]).-data NodeInfo a = NodeInfo-    { nodeAnnotations :: S.Set (FastString,FastString)-    -- ^ (name of the AST node constructor, name of the AST node Type)--    , nodeType :: [a]-    -- ^ The Haskell types of this node, if any.--    , nodeIdentifiers :: NodeIdentifiers a-    -- ^ All the identifiers and their details-    } deriving (Functor, Foldable, Traversable)--instance Binary (NodeInfo TypeIndex) where-  put_ bh ni = do-    put_ bh $ S.toAscList $ nodeAnnotations ni-    put_ bh $ nodeType ni-    put_ bh $ M.toList $ nodeIdentifiers ni-  get bh = NodeInfo-    <$> fmap (S.fromDistinctAscList) (get bh)-    <*> get bh-    <*> fmap (M.fromList) (get bh)--type Identifier = Either ModuleName Name--type NodeIdentifiers a = M.Map Identifier (IdentifierDetails a)---- | Information associated with every identifier------ We need to include types with identifiers because sometimes multiple--- identifiers occur in the same span(Overloaded Record Fields and so on)-data IdentifierDetails a = IdentifierDetails-  { identType :: Maybe a-  , identInfo :: S.Set ContextInfo-  } deriving (Eq, Functor, Foldable, Traversable)--instance Outputable a => Outputable (IdentifierDetails a) where-  ppr x = text "IdentifierDetails" <+> ppr (identType x) <+> ppr (identInfo x)--instance Semigroup (IdentifierDetails a) where-  d1 <> d2 = IdentifierDetails (identType d1 <|> identType d2)-                               (S.union (identInfo d1) (identInfo d2))--instance Monoid (IdentifierDetails a) where-  mempty = IdentifierDetails Nothing S.empty--instance Binary (IdentifierDetails TypeIndex) where-  put_ bh dets = do-    put_ bh $ identType dets-    put_ bh $ S.toAscList $ identInfo dets-  get bh =  IdentifierDetails-    <$> get bh-    <*> fmap (S.fromDistinctAscList) (get bh)----- | Different contexts under which identifiers exist-data ContextInfo-  = Use                -- ^ regular variable-  | MatchBind-  | IEThing IEType     -- ^ import/export-  | TyDecl--  -- | Value binding-  | ValBind-      BindType     -- ^ whether or not the binding is in an instance-      Scope        -- ^ scope over which the value is bound-      (Maybe Span) -- ^ span of entire binding--  -- | Pattern binding-  ---  -- This case is tricky because the bound identifier can be used in two-  -- distinct scopes. Consider the following example (with @-XViewPatterns@)-  ---  -- @-  -- do (b, a, (a -> True)) <- bar-  --    foo a-  -- @-  ---  -- The identifier @a@ has two scopes: in the view pattern @(a -> True)@ and-  -- in the rest of the @do@-block in @foo a@.-  | PatternBind-      Scope        -- ^ scope /in the pattern/ (the variable bound can be used-                   -- further in the pattern)-      Scope        -- ^ rest of the scope outside the pattern-      (Maybe Span) -- ^ span of entire binding--  | ClassTyDecl (Maybe Span)--  -- | Declaration-  | Decl-      DeclType     -- ^ type of declaration-      (Maybe Span) -- ^ span of entire binding--  -- | Type variable-  | TyVarBind Scope TyVarScope--  -- | Record field-  | RecField RecFieldContext (Maybe Span)-    deriving (Eq, Ord, Show)--instance Outputable ContextInfo where-  ppr = text . show--instance Binary ContextInfo where-  put_ bh Use = putByte bh 0-  put_ bh (IEThing t) = do-    putByte bh 1-    put_ bh t-  put_ bh TyDecl = putByte bh 2-  put_ bh (ValBind bt sc msp) = do-    putByte bh 3-    put_ bh bt-    put_ bh sc-    put_ bh msp-  put_ bh (PatternBind a b c) = do-    putByte bh 4-    put_ bh a-    put_ bh b-    put_ bh c-  put_ bh (ClassTyDecl sp) = do-    putByte bh 5-    put_ bh sp-  put_ bh (Decl a b) = do-    putByte bh 6-    put_ bh a-    put_ bh b-  put_ bh (TyVarBind a b) = do-    putByte bh 7-    put_ bh a-    put_ bh b-  put_ bh (RecField a b) = do-    putByte bh 8-    put_ bh a-    put_ bh b-  put_ bh MatchBind = putByte bh 9--  get bh = do-    (t :: Word8) <- get bh-    case t of-      0 -> return Use-      1 -> IEThing <$> get bh-      2 -> return TyDecl-      3 -> ValBind <$> get bh <*> get bh <*> get bh-      4 -> PatternBind <$> get bh <*> get bh <*> get bh-      5 -> ClassTyDecl <$> get bh-      6 -> Decl <$> get bh <*> get bh-      7 -> TyVarBind <$> get bh <*> get bh-      8 -> RecField <$> get bh <*> get bh-      9 -> return MatchBind-      _ -> panic "Binary ContextInfo: invalid tag"----- | Types of imports and exports-data IEType-  = Import-  | ImportAs-  | ImportHiding-  | Export-    deriving (Eq, Enum, Ord, Show)--instance Binary IEType where-  put_ bh b = putByte bh (fromIntegral (fromEnum b))-  get bh = do x <- getByte bh; pure $! (toEnum (fromIntegral x))---data RecFieldContext-  = RecFieldDecl-  | RecFieldAssign-  | RecFieldMatch-  | RecFieldOcc-    deriving (Eq, Enum, Ord, Show)--instance Binary RecFieldContext where-  put_ bh b = putByte bh (fromIntegral (fromEnum b))-  get bh = do x <- getByte bh; pure $! (toEnum (fromIntegral x))---data BindType-  = RegularBind-  | InstanceBind-    deriving (Eq, Ord, Show, Enum)--instance Binary BindType where-  put_ bh b = putByte bh (fromIntegral (fromEnum b))-  get bh = do x <- getByte bh; pure $! (toEnum (fromIntegral x))---data DeclType-  = FamDec     -- ^ type or data family-  | SynDec     -- ^ type synonym-  | DataDec    -- ^ data declaration-  | ConDec     -- ^ constructor declaration-  | PatSynDec  -- ^ pattern synonym-  | ClassDec   -- ^ class declaration-  | InstDec    -- ^ instance declaration-    deriving (Eq, Ord, Show, Enum)--instance Binary DeclType where-  put_ bh b = putByte bh (fromIntegral (fromEnum b))-  get bh = do x <- getByte bh; pure $! (toEnum (fromIntegral x))---data Scope-  = NoScope-  | LocalScope Span-  | ModuleScope-    deriving (Eq, Ord, Show, Typeable, Data)--instance Outputable Scope where-  ppr NoScope = text "NoScope"-  ppr (LocalScope sp) = text "LocalScope" <+> ppr sp-  ppr ModuleScope = text "ModuleScope"--instance Binary Scope where-  put_ bh NoScope = putByte bh 0-  put_ bh (LocalScope span) = do-    putByte bh 1-    put_ bh span-  put_ bh ModuleScope = putByte bh 2--  get bh = do-    (t :: Word8) <- get bh-    case t of-      0 -> return NoScope-      1 -> LocalScope <$> get bh-      2 -> return ModuleScope-      _ -> panic "Binary Scope: invalid tag"----- | Scope of a type variable.------ This warrants a data type apart from 'Scope' because of complexities--- introduced by features like @-XScopedTypeVariables@ and @-XInstanceSigs@. For--- example, consider:------ @--- foo, bar, baz :: forall a. a -> a--- @------ Here @a@ is in scope in all the definitions of @foo@, @bar@, and @baz@, so we--- need a list of scopes to keep track of this. Furthermore, this list cannot be--- computed until we resolve the binding sites of @foo@, @bar@, and @baz@.------ Consequently, @a@ starts with an @'UnresolvedScope' [foo, bar, baz] Nothing@--- which later gets resolved into a 'ResolvedScopes'.-data TyVarScope-  = ResolvedScopes [Scope]--  -- | Unresolved scopes should never show up in the final @.hie@ file-  | UnresolvedScope-        [Name]        -- ^ names of the definitions over which the scope spans-        (Maybe Span)  -- ^ the location of the instance/class declaration for-                      -- the case where the type variable is declared in a-                      -- method type signature-    deriving (Eq, Ord)--instance Show TyVarScope where-  show (ResolvedScopes sc) = show sc-  show _ = error "UnresolvedScope"--instance Binary TyVarScope where-  put_ bh (ResolvedScopes xs) = do-    putByte bh 0-    put_ bh xs-  put_ bh (UnresolvedScope ns span) = do-    putByte bh 1-    put_ bh ns-    put_ bh span--  get bh = do-    (t :: Word8) <- get bh-    case t of-      0 -> ResolvedScopes <$> get bh-      1 -> UnresolvedScope <$> get bh <*> get bh-      _ -> panic "Binary TyVarScope: invalid tag"
− src-ghc86/Development/IDE/GHC/HieUtils.hs
@@ -1,451 +0,0 @@-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TupleSections #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE FlexibleInstances #-}-module Development.IDE.GHC.HieUtils where--import CoreMap-import DynFlags                   ( DynFlags )-import FastString                 ( FastString, mkFastString )-import IfaceType-import Name hiding (varName)-import Outputable                 ( renderWithStyle, ppr, defaultUserStyle )-import SrcLoc-import ToIface-import TyCon-import TyCoRep-import Type-import Var-import VarEnv--import Development.IDE.GHC.HieTypes--import qualified Data.Map as M-import qualified Data.Set as S-import qualified Data.IntMap.Strict as IM-import qualified Data.Array as A-import Data.Data                  ( typeOf, typeRepTyCon, Data(toConstr) )-import Data.Maybe                 ( maybeToList )-import Data.Monoid-import Data.Traversable           ( for )-import Control.Monad.Trans.State.Strict hiding (get)---generateReferencesMap-  :: Foldable f-  => f (HieAST a)-  -> M.Map Identifier [(Span, IdentifierDetails a)]-generateReferencesMap = foldr (\ast m -> M.unionWith (++) (go ast) m) M.empty-  where-    go ast = M.unionsWith (++) (this : map go (nodeChildren ast))-      where-        this = fmap (pure . (nodeSpan ast,)) $ nodeIdentifiers $ nodeInfo ast--renderHieType :: DynFlags -> HieTypeFix -> String-renderHieType df ht = renderWithStyle df (ppr $ hieTypeToIface ht) sty-  where sty = defaultUserStyle df--resolveVisibility :: Type -> [Type] -> [(Bool,Type)]-resolveVisibility kind ty_args-  = go (mkEmptyTCvSubst in_scope) kind ty_args-  where-    in_scope = mkInScopeSet (tyCoVarsOfTypes ty_args)--    go _   _                   []     = []-    go env ty                  ts-      | Just ty' <- coreView ty-      = go env ty' ts-    go env (ForAllTy (TvBndr tv vis) res) (t:ts)-      | isVisibleArgFlag vis = (True , t) : ts'-      | otherwise            = (False, t) : ts'-      where-        ts' = go (extendTvSubst env tv t) res ts--    go env (FunTy _ res) (t:ts) -- No type-class args in tycon apps-      = (True,t) : (go env res ts)--    go env (TyVarTy tv) ts-      | Just ki <- lookupTyVar env tv = go env ki ts-    go env kind (t:ts) = (True, t) : (go env kind ts) -- Ill-kinded--foldType :: (HieType a -> a) -> HieTypeFix -> a-foldType f (Roll t) = f $ fmap (foldType f) t--hieTypeToIface :: HieTypeFix -> IfaceType-hieTypeToIface = foldType go-  where-    go (HTyVarTy n) = IfaceTyVar $ occNameFS $ getOccName n-    go (HAppTy a b) = IfaceAppTy a b-    go (HLitTy l) = IfaceLitTy l-    go (HForAllTy ((n,k),af) t) = let b = (occNameFS $ getOccName n, k)-                                  in IfaceForAllTy (TvBndr b af) t-    go (HFunTy a b) = IfaceFunTy a b-    go (HQualTy pred b) = IfaceDFunTy pred b-    go (HCastTy a) = a-    go HCoercionTy = IfaceTyVar "<coercion type>"-    go (HTyConApp a xs) = IfaceTyConApp a (hieToIfaceArgs xs)--    -- This isn't fully faithful - we can't produce the 'Inferred' case-    hieToIfaceArgs :: HieArgs IfaceType -> IfaceTcArgs-    hieToIfaceArgs (HieArgs xs) = go' xs-      where-        go' [] = ITC_Nil-        go' ((True ,x):xs) = ITC_Vis x $ go' xs-        go' ((False,x):xs) = ITC_Invis x $ go' xs--data HieTypeState-  = HTS-    { tyMap      :: !(TypeMap TypeIndex)-    , htyTable   :: !(IM.IntMap HieTypeFlat)-    , freshIndex :: !TypeIndex-    }--initialHTS :: HieTypeState-initialHTS = HTS emptyTypeMap IM.empty 0--freshTypeIndex :: State HieTypeState TypeIndex-freshTypeIndex = do-  index <- gets freshIndex-  modify' $ \hts -> hts { freshIndex = index+1 }-  return index--compressTypes-  :: HieASTs Type-  -> (HieASTs TypeIndex, A.Array TypeIndex HieTypeFlat)-compressTypes asts = (a, arr)-  where-    (a, (HTS _ m i)) = flip runState initialHTS $-      for asts $ \typ -> do-        i <- getTypeIndex typ-        return i-    arr = A.array (0,i-1) (IM.toList m)--recoverFullType :: TypeIndex -> A.Array TypeIndex HieTypeFlat -> HieTypeFix-recoverFullType i m = go i-  where-    go i = Roll $ fmap go (m A.! i)--getTypeIndex :: Type -> State HieTypeState TypeIndex-getTypeIndex t-  | otherwise = do-      tm <- gets tyMap-      case lookupTypeMap tm t of-        Just i -> return i-        Nothing -> do-          ht <- go t-          extendHTS t ht-  where-    extendHTS t ht = do-      i <- freshTypeIndex-      modify' $ \(HTS tm tt fi) ->-        HTS (extendTypeMap tm t i) (IM.insert i ht tt) fi-      return i--    go (TyVarTy v) = return $ HTyVarTy $ varName v-    go (AppTy a b) = do-      ai <- getTypeIndex a-      bi <- getTypeIndex b-      return $ HAppTy ai bi-    go (TyConApp f xs) = do-      let visArgs = HieArgs $ resolveVisibility (tyConKind f) xs-      is <- mapM getTypeIndex visArgs-      return $ HTyConApp (toIfaceTyCon f) is-    go (ForAllTy (TvBndr v a) t) = do-      k <- getTypeIndex (varType v)-      i <- getTypeIndex t-      return $ HForAllTy ((varName v,k),a) i-    go (FunTy a b) = do-      ai <- getTypeIndex a-      bi <- getTypeIndex b-      return $ if isPredTy a-                  then HQualTy ai bi-                  else HFunTy ai bi-    go (LitTy a) = return $ HLitTy $ toIfaceTyLit a-    go (CastTy t _) = do-      i <- getTypeIndex t-      return $ HCastTy i-    go (CoercionTy _) = return HCoercionTy--resolveTyVarScopes :: M.Map FastString (HieAST a) -> M.Map FastString (HieAST a)-resolveTyVarScopes asts = M.map go asts-  where-    go ast = resolveTyVarScopeLocal ast asts--resolveTyVarScopeLocal :: HieAST a -> M.Map FastString (HieAST a) -> HieAST a-resolveTyVarScopeLocal ast asts = go ast-  where-    resolveNameScope dets = dets{identInfo =-      S.map resolveScope (identInfo dets)}-    resolveScope (TyVarBind sc (UnresolvedScope names Nothing)) =-      TyVarBind sc $ ResolvedScopes-        [ LocalScope binding-        | name <- names-        , Just binding <- [getNameBinding name asts]-        ]-    resolveScope (TyVarBind sc (UnresolvedScope names (Just sp))) =-      TyVarBind sc $ ResolvedScopes-        [ LocalScope binding-        | name <- names-        , Just binding <- [getNameBindingInClass name sp asts]-        ]-    resolveScope scope = scope-    go (Node info span children) = Node info' span $ map go children-      where-        info' = info { nodeIdentifiers = idents }-        idents = M.map resolveNameScope $ nodeIdentifiers info--getNameBinding :: Name -> M.Map FastString (HieAST a) -> Maybe Span-getNameBinding n asts = do-  (_,msp) <- getNameScopeAndBinding n asts-  msp--getNameScope :: Name -> M.Map FastString (HieAST a) -> Maybe [Scope]-getNameScope n asts = do-  (scopes,_) <- getNameScopeAndBinding n asts-  return scopes--getNameBindingInClass-  :: Name-  -> Span-  -> M.Map FastString (HieAST a)-  -> Maybe Span-getNameBindingInClass n sp asts = do-  ast <- M.lookup (srcSpanFile sp) asts-  getFirst $ foldMap First $ do-    child <- flattenAst ast-    dets <- maybeToList-      $ M.lookup (Right n) $ nodeIdentifiers $ nodeInfo child-    let binding = foldMap (First . getBindSiteFromContext) (identInfo dets)-    return (getFirst binding)--getNameScopeAndBinding-  :: Name-  -> M.Map FastString (HieAST a)-  -> Maybe ([Scope], Maybe Span)-getNameScopeAndBinding n asts = case nameSrcSpan n of-  RealSrcSpan sp -> do -- @Maybe-    ast <- M.lookup (srcSpanFile sp) asts-    defNode <- selectLargestContainedBy sp ast-    getFirst $ foldMap First $ do -- @[]-      node <- flattenAst defNode-      dets <- maybeToList-        $ M.lookup (Right n) $ nodeIdentifiers $ nodeInfo node-      scopes <- maybeToList $ foldMap getScopeFromContext (identInfo dets)-      let binding = foldMap (First . getBindSiteFromContext) (identInfo dets)-      return $ Just (scopes, getFirst binding)-  _ -> Nothing--getScopeFromContext :: ContextInfo -> Maybe [Scope]-getScopeFromContext (ValBind _ sc _) = Just [sc]-getScopeFromContext (PatternBind a b _) = Just [a, b]-getScopeFromContext (ClassTyDecl _) = Just [ModuleScope]-getScopeFromContext (Decl _ _) = Just [ModuleScope]-getScopeFromContext (TyVarBind a (ResolvedScopes xs)) = Just $ a:xs-getScopeFromContext (TyVarBind a _) = Just [a]-getScopeFromContext _ = Nothing--getBindSiteFromContext :: ContextInfo -> Maybe Span-getBindSiteFromContext (ValBind _ _ sp) = sp-getBindSiteFromContext (PatternBind _ _ sp) = sp-getBindSiteFromContext _ = Nothing--flattenAst :: HieAST a -> [HieAST a]-flattenAst n =-  n : concatMap flattenAst (nodeChildren n)--smallestContainingSatisfying-  :: Span-  -> (HieAST a -> Bool)-  -> HieAST a-  -> Maybe (HieAST a)-smallestContainingSatisfying sp cond node-  | nodeSpan node `containsSpan` sp = getFirst $ mconcat-      [ foldMap (First . smallestContainingSatisfying sp cond) $-          nodeChildren node-      , First $ if cond node then Just node else Nothing-      ]-  | sp `containsSpan` nodeSpan node = Nothing-  | otherwise = Nothing--selectLargestContainedBy :: Span -> HieAST a -> Maybe (HieAST a)-selectLargestContainedBy sp node-  | sp `containsSpan` nodeSpan node = Just node-  | nodeSpan node `containsSpan` sp =-      getFirst $ foldMap (First . selectLargestContainedBy sp) $-        nodeChildren node-  | otherwise = Nothing--selectSmallestContaining :: Span -> HieAST a -> Maybe (HieAST a)-selectSmallestContaining sp node-  | nodeSpan node `containsSpan` sp = getFirst $ mconcat-      [ foldMap (First . selectSmallestContaining sp) $ nodeChildren node-      , First (Just node)-      ]-  | sp `containsSpan` nodeSpan node = Nothing-  | otherwise = Nothing--definedInAsts :: M.Map FastString (HieAST a) -> Name -> Bool-definedInAsts asts n = case nameSrcSpan n of-  RealSrcSpan sp -> srcSpanFile sp `elem` M.keys asts-  _ -> False--isOccurrence :: ContextInfo -> Bool-isOccurrence Use = True-isOccurrence _ = False--scopeContainsSpan :: Scope -> Span -> Bool-scopeContainsSpan NoScope _ = False-scopeContainsSpan ModuleScope _ = True-scopeContainsSpan (LocalScope a) b = a `containsSpan` b---- | One must contain the other. Leaf nodes cannot contain anything-combineAst :: HieAST Type -> HieAST Type -> HieAST Type-combineAst a@(Node aInf aSpn xs) b@(Node bInf bSpn ys)-  | aSpn == bSpn = Node (aInf `combineNodeInfo` bInf) aSpn (mergeAsts xs ys)-  | aSpn `containsSpan` bSpn = combineAst b a-combineAst a (Node xs span children) = Node xs span (insertAst a children)---- | Insert an AST in a sorted list of disjoint Asts-insertAst :: HieAST Type -> [HieAST Type] -> [HieAST Type]-insertAst x = mergeAsts [x]---- | Merge two nodes together.------ Precondition and postcondition: elements in 'nodeType' are ordered.-combineNodeInfo :: NodeInfo Type -> NodeInfo Type -> NodeInfo Type-(NodeInfo as ai ad) `combineNodeInfo` (NodeInfo bs bi bd) =-  NodeInfo (S.union as bs) (mergeSorted ai bi) (M.unionWith (<>) ad bd)-  where-    mergeSorted :: [Type] -> [Type] -> [Type]-    mergeSorted la@(a:as) lb@(b:bs) = case nonDetCmpType a b of-                                        LT -> a : mergeSorted as lb-                                        EQ -> a : mergeSorted as bs-                                        GT -> b : mergeSorted la bs-    mergeSorted as [] = as-    mergeSorted [] bs = bs---{- | Merge two sorted, disjoint lists of ASTs, combining when necessary.--In the absence of position-altering pragmas (ex: @# line "file.hs" 3@),-different nodes in an AST tree should either have disjoint spans (in-which case you can say for sure which one comes first) or one span-should be completely contained in the other (in which case the contained-span corresponds to some child node).--However, since Haskell does have position-altering pragmas it /is/-possible for spans to be overlapping. Here is an example of a source file-in which @foozball@ and @quuuuuux@ have overlapping spans:--@-module Baz where--# line 3 "Baz.hs"-foozball :: Int-foozball = 0--# line 3 "Baz.hs"-bar, quuuuuux :: Int-bar = 1-quuuuuux = 2-@--In these cases, we just do our best to produce sensible `HieAST`'s. The blame-should be laid at the feet of whoever wrote the line pragmas in the first place-(usually the C preprocessor...).--}-mergeAsts :: [HieAST Type] -> [HieAST Type] -> [HieAST Type]-mergeAsts xs [] = xs-mergeAsts [] ys = ys-mergeAsts xs@(a:as) ys@(b:bs)-  | span_a `containsSpan`   span_b = mergeAsts (combineAst a b : as) bs-  | span_b `containsSpan`   span_a = mergeAsts as (combineAst a b : bs)-  | span_a `rightOf`        span_b = b : mergeAsts xs bs-  | span_a `leftOf`         span_b = a : mergeAsts as ys--  -- These cases are to work around ASTs that are not fully disjoint-  | span_a `startsRightOf`  span_b = b : mergeAsts as ys-  | otherwise                      = a : mergeAsts as ys-  where-    span_a = nodeSpan a-    span_b = nodeSpan b--rightOf :: Span -> Span -> Bool-rightOf s1 s2-  = (srcSpanStartLine s1, srcSpanStartCol s1)-       >= (srcSpanEndLine s2, srcSpanEndCol s2)-    && (srcSpanFile s1 == srcSpanFile s2)--leftOf :: Span -> Span -> Bool-leftOf s1 s2-  = (srcSpanEndLine s1, srcSpanEndCol s1)-       <= (srcSpanStartLine s2, srcSpanStartCol s2)-    && (srcSpanFile s1 == srcSpanFile s2)--startsRightOf :: Span -> Span -> Bool-startsRightOf s1 s2-  = (srcSpanStartLine s1, srcSpanStartCol s1)-       >= (srcSpanStartLine s2, srcSpanStartCol s2)---- | combines and sorts ASTs using a merge sort-mergeSortAsts :: [HieAST Type] -> [HieAST Type]-mergeSortAsts = go . map pure-  where-    go [] = []-    go [xs] = xs-    go xss = go (mergePairs xss)-    mergePairs [] = []-    mergePairs [xs] = [xs]-    mergePairs (xs:ys:xss) = mergeAsts xs ys : mergePairs xss--simpleNodeInfo :: FastString -> FastString -> NodeInfo a-simpleNodeInfo cons typ = NodeInfo (S.singleton (cons, typ)) [] M.empty--locOnly :: SrcSpan -> [HieAST a]-locOnly (RealSrcSpan span) =-  [Node e span []]-    where e = NodeInfo S.empty [] M.empty-locOnly _ = []--mkScope :: SrcSpan -> Scope-mkScope (RealSrcSpan sp) = LocalScope sp-mkScope _ = NoScope--mkLScope :: Located a -> Scope-mkLScope = mkScope . getLoc--combineScopes :: Scope -> Scope -> Scope-combineScopes ModuleScope _ = ModuleScope-combineScopes _ ModuleScope = ModuleScope-combineScopes NoScope x = x-combineScopes x NoScope = x-combineScopes (LocalScope a) (LocalScope b) =-  mkScope $ combineSrcSpans (RealSrcSpan a) (RealSrcSpan b)--{-# INLINEABLE makeNode #-}-makeNode-  :: (Applicative m, Data a)-  => a                       -- ^ helps fill in 'nodeAnnotations' (with 'Data')-  -> SrcSpan                 -- ^ return an empty list if this is unhelpful-  -> m [HieAST b]-makeNode x spn = pure $ case spn of-  RealSrcSpan span -> [Node (simpleNodeInfo cons typ) span []]-  _ -> []-  where-    cons = mkFastString . show . toConstr $ x-    typ = mkFastString . show . typeRepTyCon . typeOf $ x--{-# INLINEABLE makeTypeNode #-}-makeTypeNode-  :: (Applicative m, Data a)-  => a                       -- ^ helps fill in 'nodeAnnotations' (with 'Data')-  -> SrcSpan                 -- ^ return an empty list if this is unhelpful-  -> Type                    -- ^ type to associate with the node-  -> m [HieAST Type]-makeTypeNode x spn etyp = pure $ case spn of-  RealSrcSpan span ->-    [Node (NodeInfo (S.singleton (cons,typ)) [etyp] M.empty) span []]-  _ -> []-  where-    cons = mkFastString . show . toConstr $ x-    typ = mkFastString . show . typeRepTyCon . typeOf $ x
− src-ghc88/Development/IDE/GHC/HieAst.hs
@@ -1,1789 +0,0 @@-{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}-{--Forked from GHC v8.8.1 to work around the readFile side effect in mkHiefile--Main functions for .hie file generation--}-{- HLINT ignore -}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE TypeSynonymInstances #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE TypeApplications #-}-{-# LANGUAGE AllowAmbiguousTypes #-}-{-# LANGUAGE ViewPatterns #-}-{-# LANGUAGE DeriveDataTypeable #-}-module Development.IDE.GHC.HieAst ( mkHieFile ) where--import Avail                      ( Avails )-import Bag                        ( Bag, bagToList )-import BasicTypes-import BooleanFormula-import Class                      ( FunDep )-import CoreUtils                  ( exprType )-import ConLike                    ( conLikeName )-import Desugar                    ( deSugarExpr )-import FieldLabel-import HsSyn-import HscTypes-import Module                     ( ModuleName, ml_hs_file )-import MonadUtils                 ( concatMapM, liftIO )-import Name                       ( Name, nameSrcSpan, setNameLoc )-import SrcLoc-import TcHsSyn                    ( hsLitType, hsPatType )-import Type                       ( mkFunTys, Type )-import TysWiredIn                 ( mkListTy, mkSumTy )-import Var                        ( Id, Var, setVarName, varName, varType )-import TcRnTypes-import MkIface                    ( mkIfaceExports )--import HieTypes-import HieUtils--import qualified Data.Array as A-import qualified Data.ByteString as BS-import qualified Data.Map as M-import qualified Data.Set as S-import Data.Data                  ( Data, Typeable )-import Data.List                  (foldl',  foldl1' )-import Data.Maybe                 ( listToMaybe )-import Control.Monad.Trans.Reader-import Control.Monad.Trans.Class  ( lift )---- These synonyms match those defined in main/GHC.hs-type RenamedSource     = ( HsGroup GhcRn, [LImportDecl GhcRn]-                         , Maybe [(LIE GhcRn, Avails)]-                         , Maybe LHsDocString )-type TypecheckedSource = LHsBinds GhcTc---{- Note [Name Remapping]-The Typechecker introduces new names for mono names in AbsBinds.-We don't care about the distinction between mono and poly bindings,-so we replace all occurrences of the mono name with the poly name.--}-newtype HieState = HieState-  { name_remapping :: M.Map Name Id-  }--initState :: HieState-initState = HieState M.empty--class ModifyState a where -- See Note [Name Remapping]-  addSubstitution :: a -> a -> HieState -> HieState--instance ModifyState Name where-  addSubstitution _ _ hs = hs--instance ModifyState Id where-  addSubstitution mono poly hs =-    hs{name_remapping = M.insert (varName mono) poly (name_remapping hs)}--modifyState :: ModifyState (IdP p) => [ABExport p] -> HieState -> HieState-modifyState = foldr go id-  where-    go ABE{abe_poly=poly,abe_mono=mono} f = addSubstitution mono poly . f-    go _ f = f--type HieM = ReaderT HieState Hsc---- | Construct an 'HieFile' from the outputs of the typechecker.-mkHieFile :: ModSummary-          -> TcGblEnv-          -> RenamedSource-          -> BS.ByteString-          -> Hsc HieFile-mkHieFile ms ts rs src = do-  let tc_binds = tcg_binds ts-  (asts', arr) <- getCompressedAsts tc_binds rs-  let Just src_file = ml_hs_file $ ms_location ms-  return $ HieFile-      { hie_hs_file = src_file-      , hie_module = ms_mod ms-      , hie_types = arr-      , hie_asts = asts'-      -- mkIfaceExports sorts the AvailInfos for stability-      , hie_exports = mkIfaceExports (tcg_exports ts)-      , hie_hs_src = src-      }--getCompressedAsts :: TypecheckedSource -> RenamedSource-  -> Hsc (HieASTs TypeIndex, A.Array TypeIndex HieTypeFlat)-getCompressedAsts ts rs = do-  asts <- enrichHie ts rs-  return $ compressTypes asts--enrichHie :: TypecheckedSource -> RenamedSource -> Hsc (HieASTs Type)-enrichHie ts (hsGrp, imports, exports, _) = flip runReaderT initState $ do-    tasts <- toHie $ fmap (BC RegularBind ModuleScope) ts-    rasts <- processGrp hsGrp-    imps <- toHie $ filter (not . ideclImplicit . unLoc) imports-    exps <- toHie $ fmap (map $ IEC Export . fst) exports-    let spanFile children = case children of-          [] -> mkRealSrcSpan (mkRealSrcLoc "" 1 1) (mkRealSrcLoc "" 1 1)-          _ -> mkRealSrcSpan (realSrcSpanStart $ nodeSpan $ head children)-                             (realSrcSpanEnd   $ nodeSpan $ last children)--        modulify xs =-          Node (simpleNodeInfo "Module" "Module") (spanFile xs) xs--        asts = HieASTs-          $ resolveTyVarScopes-          $ M.map (modulify . mergeSortAsts)-          $ M.fromListWith (++)-          $ map (\x -> (srcSpanFile (nodeSpan x),[x])) flat_asts--        flat_asts = concat-          [ tasts-          , rasts-          , imps-          , exps-          ]-    return asts-  where-    processGrp grp = concatM-      [ toHie $ fmap (RS ModuleScope ) hs_valds grp-      , toHie $ hs_splcds grp-      , toHie $ hs_tyclds grp-      , toHie $ hs_derivds grp-      , toHie $ hs_fixds grp-      , toHie $ hs_defds grp-      , toHie $ hs_fords grp-      , toHie $ hs_warnds grp-      , toHie $ hs_annds grp-      , toHie $ hs_ruleds grp-      ]--getRealSpan :: SrcSpan -> Maybe Span-getRealSpan (RealSrcSpan sp) = Just sp-getRealSpan _ = Nothing--grhss_span :: GRHSs p body -> SrcSpan-grhss_span (GRHSs _ xs bs) = foldl' combineSrcSpans (getLoc bs) (map getLoc xs)-grhss_span (XGRHSs _) = error "XGRHS has no span"--bindingsOnly :: [Context Name] -> [HieAST a]-bindingsOnly [] = []-bindingsOnly (C c n : xs) = case nameSrcSpan n of-  RealSrcSpan span -> Node nodeinfo span [] : bindingsOnly xs-    where nodeinfo = NodeInfo S.empty [] (M.singleton (Right n) info)-          info = mempty{identInfo = S.singleton c}-  _ -> bindingsOnly xs--concatM :: Monad m => [m [a]] -> m [a]-concatM xs = concat <$> sequence xs--{- Note [Capturing Scopes and other non local information]-toHie is a local tranformation, but scopes of bindings cannot be known locally,-hence we have to push the relevant info down into the binding nodes.-We use the following types (*Context and *Scoped) to wrap things and-carry the required info-(Maybe Span) always carries the span of the entire binding, including rhs--}-data Context a = C ContextInfo a -- Used for names and bindings--data RContext a = RC RecFieldContext a-data RFContext a = RFC RecFieldContext (Maybe Span) a--- ^ context for record fields--data IEContext a = IEC IEType a--- ^ context for imports/exports--data BindContext a = BC BindType Scope a--- ^ context for imports/exports--data PatSynFieldContext a = PSC (Maybe Span) a--- ^ context for pattern synonym fields.--data SigContext a = SC SigInfo a--- ^ context for type signatures--data SigInfo = SI SigType (Maybe Span)--data SigType = BindSig | ClassSig | InstSig--data RScoped a = RS Scope a--- ^ Scope spans over everything to the right of a, (mostly) not--- including a itself--- (Includes a in a few special cases like recursive do bindings) or--- let/where bindings---- | Pattern scope-data PScoped a = PS (Maybe Span)-                    Scope       -- ^ use site of the pattern-                    Scope       -- ^ pattern to the right of a, not including a-                    a-  deriving (Typeable, Data) -- Pattern Scope--{- Note [TyVar Scopes]-Due to -XScopedTypeVariables, type variables can be in scope quite far from-their original binding. We resolve the scope of these type variables-in a separate pass--}-data TScoped a = TS TyVarScope a -- TyVarScope--data TVScoped a = TVS TyVarScope Scope a -- TyVarScope--- ^ First scope remains constant--- Second scope is used to build up the scope of a tyvar over--- things to its right, ala RScoped---- | Each element scopes over the elements to the right-listScopes :: Scope -> [Located a] -> [RScoped (Located a)]-listScopes _ [] = []-listScopes rhsScope [pat] = [RS rhsScope pat]-listScopes rhsScope (pat : pats) = RS sc pat : pats'-  where-    pats'@((RS scope p):_) = listScopes rhsScope pats-    sc = combineScopes scope $ mkScope $ getLoc p---- | 'listScopes' specialised to 'PScoped' things-patScopes-  :: Maybe Span-  -> Scope-  -> Scope-  -> [LPat (GhcPass p)]-  -> [PScoped (LPat (GhcPass p))]-patScopes rsp useScope patScope xs =-  map (\(RS sc a) -> PS rsp useScope sc (unLoc a)) $-    listScopes patScope (map dL xs)---- | 'listScopes' specialised to 'TVScoped' things-tvScopes-  :: TyVarScope-  -> Scope-  -> [LHsTyVarBndr a]-  -> [TVScoped (LHsTyVarBndr a)]-tvScopes tvScope rhsScope xs =-  map (\(RS sc a)-> TVS tvScope sc a) $ listScopes rhsScope xs--{- Note [Scoping Rules for SigPat]-Explicitly quantified variables in pattern type signatures are not-brought into scope in the rhs, but implicitly quantified variables-are (HsWC and HsIB).-This is unlike other signatures, where explicitly quantified variables-are brought into the RHS Scope-For example-foo :: forall a. ...;-foo = ... -- a is in scope here--bar (x :: forall a. a -> a) = ... -- a is not in scope here---   ^ a is in scope here (pattern body)--bax (x :: a) = ... -- a is in scope here-Because of HsWC and HsIB pass on their scope to their children-we must wrap the LHsType in pattern signatures in a-Shielded explictly, so that the HsWC/HsIB scope is not passed-on the the LHsType--}--data Shielded a = SH Scope a -- Ignores its TScope, uses its own scope instead--type family ProtectedSig a where-  ProtectedSig GhcRn = HsWildCardBndrs GhcRn (HsImplicitBndrs-                                                GhcRn-                                                (Shielded (LHsType GhcRn)))-  ProtectedSig GhcTc = NoExt--class ProtectSig a where-  protectSig :: Scope -> LHsSigWcType (NoGhcTc a) -> ProtectedSig a--instance (HasLoc a) => HasLoc (Shielded a) where-  loc (SH _ a) = loc a--instance (ToHie (TScoped a)) => ToHie (TScoped (Shielded a)) where-  toHie (TS _ (SH sc a)) = toHie (TS (ResolvedScopes [sc]) a)--instance ProtectSig GhcTc where-  protectSig _ _ = NoExt--instance ProtectSig GhcRn where-  protectSig sc (HsWC a (HsIB b sig)) =-    HsWC a (HsIB b (SH sc sig))-  protectSig _ _ = error "protectSig not given HsWC (HsIB)"--class HasLoc a where-  -- ^ defined so that HsImplicitBndrs and HsWildCardBndrs can-  -- know what their implicit bindings are scoping over-  loc :: a -> SrcSpan--instance HasLoc thing => HasLoc (TScoped thing) where-  loc (TS _ a) = loc a--instance HasLoc thing => HasLoc (PScoped thing) where-  loc (PS _ _ _ a) = loc a--instance HasLoc (LHsQTyVars GhcRn) where-  loc (HsQTvs _ vs) = loc vs-  loc _ = noSrcSpan--instance HasLoc thing => HasLoc (HsImplicitBndrs a thing) where-  loc (HsIB _ a) = loc a-  loc _ = noSrcSpan--instance HasLoc thing => HasLoc (HsWildCardBndrs a thing) where-  loc (HsWC _ a) = loc a-  loc _ = noSrcSpan--instance HasLoc (Located a) where-  loc (L l _) = l--instance HasLoc a => HasLoc [a] where-  loc [] = noSrcSpan-  loc xs = foldl1' combineSrcSpans $ map loc xs--instance (HasLoc a, HasLoc b) => HasLoc (FamEqn s a b) where-  loc (FamEqn _ a Nothing b _ c) = foldl1' combineSrcSpans [loc a, loc b, loc c]-  loc (FamEqn _ a (Just tvs) b _ c) = foldl1' combineSrcSpans-                                              [loc a, loc tvs, loc b, loc c]-  loc _ = noSrcSpan-instance (HasLoc tm, HasLoc ty) => HasLoc (HsArg tm ty) where-  loc (HsValArg tm) = loc tm-  loc (HsTypeArg _ ty) = loc ty-  loc (HsArgPar sp)  = sp--instance HasLoc (HsDataDefn GhcRn) where-  loc def@(HsDataDefn{}) = loc $ dd_cons def-    -- Only used for data family instances, so we only need rhs-    -- Most probably the rest will be unhelpful anyway-  loc _ = noSrcSpan--instance HasLoc (Pat (GhcPass a)) where-  loc (dL -> L l _) = l---- | The main worker class-class ToHie a where-  toHie :: a -> HieM [HieAST Type]---- | Used to collect type info-class Data a => HasType a where-  getTypeNode :: a -> HieM [HieAST Type]--instance (ToHie a) => ToHie [a] where-  toHie = concatMapM toHie--instance (ToHie a) => ToHie (Bag a) where-  toHie = toHie . bagToList--instance (ToHie a) => ToHie (Maybe a) where-  toHie = maybe (pure []) toHie--instance ToHie (Context (Located NoExt)) where-  toHie _ = pure []--instance ToHie (TScoped NoExt) where-  toHie _ = pure []--instance ToHie (IEContext (Located ModuleName)) where-  toHie (IEC c (L (RealSrcSpan span) mname)) =-      pure $ [Node (NodeInfo S.empty [] idents) span []]-    where details = mempty{identInfo = S.singleton (IEThing c)}-          idents = M.singleton (Left mname) details-  toHie _ = pure []--instance ToHie (Context (Located Var)) where-  toHie c = case c of-      C context (L (RealSrcSpan span) name')-        -> do-        m <- asks name_remapping-        let name = M.findWithDefault name' (varName name') m-        pure-          [Node-            (NodeInfo S.empty [] $-              M.singleton (Right $ varName name)-                          (IdentifierDetails (Just $ varType name')-                                             (S.singleton context)))-            span-            []]-      _ -> pure []--instance ToHie (Context (Located Name)) where-  toHie c = case c of-      C context (L (RealSrcSpan span) name') -> do-        m <- asks name_remapping-        let name = case M.lookup name' m of-              Just var -> varName var-              Nothing -> name'-        pure-          [Node-            (NodeInfo S.empty [] $-              M.singleton (Right name)-                          (IdentifierDetails Nothing-                                             (S.singleton context)))-            span-            []]-      _ -> pure []---- | Dummy instances - never called-instance ToHie (TScoped (LHsSigWcType GhcTc)) where-  toHie _ = pure []-instance ToHie (TScoped (LHsWcType GhcTc)) where-  toHie _ = pure []-instance ToHie (SigContext (LSig GhcTc)) where-  toHie _ = pure []-instance ToHie (TScoped Type) where-  toHie _ = pure []--instance HasType (LHsBind GhcRn) where-  getTypeNode (L spn bind) = makeNode bind spn--instance HasType (LHsBind GhcTc) where-  getTypeNode (L spn bind) = case bind of-      FunBind{fun_id = name} -> makeTypeNode bind spn (varType $ unLoc name)-      _ -> makeNode bind spn--instance HasType (LPat GhcRn) where-  getTypeNode (dL -> L spn pat) = makeNode pat spn--instance HasType (LPat GhcTc) where-  getTypeNode (dL -> L spn opat) = makeTypeNode opat spn (hsPatType opat)--instance HasType (LHsExpr GhcRn) where-  getTypeNode (L spn e) = makeNode e spn---- | This instance tries to construct 'HieAST' nodes which include the type of--- the expression. It is not yet possible to do this efficiently for all--- expression forms, so we skip filling in the type for those inputs.------ 'HsApp', for example, doesn't have any type information available directly on--- the node. Our next recourse would be to desugar it into a 'CoreExpr' then--- query the type of that. Yet both the desugaring call and the type query both--- involve recursive calls to the function and argument! This is particularly--- problematic when you realize that the HIE traversal will eventually visit--- those nodes too and ask for their types again.------ Since the above is quite costly, we just skip cases where computing the--- expression's type is going to be expensive.------ See #16233-instance HasType (LHsExpr GhcTc) where-  getTypeNode e@(L spn e') = lift $-    -- Some expression forms have their type immediately available-    let tyOpt = case e' of-          HsLit _ l -> Just (hsLitType l)-          HsOverLit _ o -> Just (overLitType o)--          HsLam     _ (MG { mg_ext = groupTy }) -> Just (matchGroupType groupTy)-          HsLamCase _ (MG { mg_ext = groupTy }) -> Just (matchGroupType groupTy)-          HsCase _  _ (MG { mg_ext = groupTy }) -> Just (mg_res_ty groupTy)--          ExplicitList  ty _ _   -> Just (mkListTy ty)-          ExplicitSum   ty _ _ _ -> Just (mkSumTy ty)-          HsDo          ty _ _   -> Just ty-          HsMultiIf     ty _     -> Just ty--          _ -> Nothing--    in-    case tyOpt of-      _ | skipDesugaring e' -> fallback-        | otherwise -> do-            hs_env <- Hsc $ \e w -> return (e,w)-            (_,mbe) <- liftIO $ deSugarExpr hs_env e-            maybe fallback (makeTypeNode e' spn . exprType) mbe-    where-      fallback = makeNode e' spn--      matchGroupType :: MatchGroupTc -> Type-      matchGroupType (MatchGroupTc args res) = mkFunTys args res--      -- | Skip desugaring of these expressions for performance reasons.-      ---      -- See impact on Haddock output (esp. missing type annotations or links)-      -- before marking more things here as 'False'. See impact on Haddock-      -- performance before marking more things as 'True'.-      skipDesugaring :: HsExpr a -> Bool-      skipDesugaring e = case e of-        HsVar{}        -> False-        HsUnboundVar{} -> False-        HsConLikeOut{} -> False-        HsRecFld{}     -> False-        HsOverLabel{}  -> False-        HsIPVar{}      -> False-        HsWrap{}       -> False-        _              -> True--instance ( ToHie (Context (Located (IdP a)))-         , ToHie (MatchGroup a (LHsExpr a))-         , ToHie (PScoped (LPat a))-         , ToHie (GRHSs a (LHsExpr a))-         , ToHie (LHsExpr a)-         , ToHie (Located (PatSynBind a a))-         , HasType (LHsBind a)-         , ModifyState (IdP a)-         , Data (HsBind a)-         ) => ToHie (BindContext (LHsBind a)) where-  toHie (BC context scope b@(L span bind)) =-    concatM $ getTypeNode b : case bind of-      FunBind{fun_id = name, fun_matches = matches} ->-        [ toHie $ C (ValBind context scope $ getRealSpan span) name-        , toHie matches-        ]-      PatBind{pat_lhs = lhs, pat_rhs = rhs} ->-        [ toHie $ PS (getRealSpan span) scope NoScope lhs-        , toHie rhs-        ]-      VarBind{var_rhs = expr} ->-        [ toHie expr-        ]-      AbsBinds{abs_exports = xs, abs_binds = binds} ->-        [ local (modifyState xs) $ -- Note [Name Remapping]-            toHie $ fmap (BC context scope) binds-        ]-      PatSynBind _ psb ->-        [ toHie $ L span psb -- PatSynBinds only occur at the top level-        ]-      XHsBindsLR _ -> []--instance ( ToHie (LMatch a body)-         ) => ToHie (MatchGroup a body) where-  toHie mg = concatM $ case mg of-    MG{ mg_alts = (L span alts) , mg_origin = FromSource } ->-      [ pure $ locOnly span-      , toHie alts-      ]-    MG{} -> []-    XMatchGroup _ -> []--instance ( ToHie (Context (Located (IdP a)))-         , ToHie (PScoped (LPat a))-         , ToHie (HsPatSynDir a)-         ) => ToHie (Located (PatSynBind a a)) where-    toHie (L sp psb) = concatM $ case psb of-      PSB{psb_id=var, psb_args=dets, psb_def=pat, psb_dir=dir} ->-        [ toHie $ C (Decl PatSynDec $ getRealSpan sp) var-        , toHie $ toBind dets-        , toHie $ PS Nothing lhsScope NoScope pat-        , toHie dir-        ]-        where-          lhsScope = combineScopes varScope detScope-          varScope = mkLScope var-          detScope = case dets of-            (PrefixCon args) -> foldr combineScopes NoScope $ map mkLScope args-            (InfixCon a b) -> combineScopes (mkLScope a) (mkLScope b)-            (RecCon r) -> foldr go NoScope r-          go (RecordPatSynField a b) c = combineScopes c-            $ combineScopes (mkLScope a) (mkLScope b)-          detSpan = case detScope of-            LocalScope a -> Just a-            _ -> Nothing-          toBind (PrefixCon args) = PrefixCon $ map (C Use) args-          toBind (InfixCon a b) = InfixCon (C Use a) (C Use b)-          toBind (RecCon r) = RecCon $ map (PSC detSpan) r-      XPatSynBind _ -> []--instance ( ToHie (MatchGroup a (LHsExpr a))-         ) => ToHie (HsPatSynDir a) where-  toHie dir = case dir of-    ExplicitBidirectional mg -> toHie mg-    _ -> pure []--instance ( a ~ GhcPass p-         , ToHie body-         , ToHie (HsMatchContext (NameOrRdrName (IdP a)))-         , ToHie (PScoped (LPat a))-         , ToHie (GRHSs a body)-         , Data (Match a body)-         ) => ToHie (LMatch (GhcPass p) body) where-  toHie (L span m ) = concatM $ makeNode m span : case m of-    Match{m_ctxt=mctx, m_pats = pats, m_grhss =  grhss } ->-      [ toHie mctx-      , let rhsScope = mkScope $ grhss_span grhss-          in toHie $ patScopes Nothing rhsScope NoScope pats-      , toHie grhss-      ]-    XMatch _ -> []--instance ( ToHie (Context (Located a))-         ) => ToHie (HsMatchContext a) where-  toHie (FunRhs{mc_fun=name}) = toHie $ C MatchBind name-  toHie (StmtCtxt a) = toHie a-  toHie _ = pure []--instance ( ToHie (HsMatchContext a)-         ) => ToHie (HsStmtContext a) where-  toHie (PatGuard a) = toHie a-  toHie (ParStmtCtxt a) = toHie a-  toHie (TransStmtCtxt a) = toHie a-  toHie _ = pure []--instance ( a ~ GhcPass p-         , ToHie (Context (Located (IdP a)))-         , ToHie (RContext (HsRecFields a (PScoped (LPat a))))-         , ToHie (LHsExpr a)-         , ToHie (TScoped (LHsSigWcType a))-         , ProtectSig a-         , ToHie (TScoped (ProtectedSig a))-         , HasType (LPat a)-         , Data (HsSplice a)-         ) => ToHie (PScoped (LPat (GhcPass p))) where-  toHie (PS rsp scope pscope lpat@(dL -> L ospan opat)) =-    concatM $ getTypeNode lpat : case opat of-      WildPat _ ->-        []-      VarPat _ lname ->-        [ toHie $ C (PatternBind scope pscope rsp) lname-        ]-      LazyPat _ p ->-        [ toHie $ PS rsp scope pscope p-        ]-      AsPat _ lname pat ->-        [ toHie $ C (PatternBind scope-                                 (combineScopes (mkLScope (dL pat)) pscope)-                                 rsp)-                    lname-        , toHie $ PS rsp scope pscope pat-        ]-      ParPat _ pat ->-        [ toHie $ PS rsp scope pscope pat-        ]-      BangPat _ pat ->-        [ toHie $ PS rsp scope pscope pat-        ]-      ListPat _ pats ->-        [ toHie $ patScopes rsp scope pscope pats-        ]-      TuplePat _ pats _ ->-        [ toHie $ patScopes rsp scope pscope pats-        ]-      SumPat _ pat _ _ ->-        [ toHie $ PS rsp scope pscope pat-        ]-      ConPatIn c dets ->-        [ toHie $ C Use c-        , toHie $ contextify dets-        ]-      ConPatOut {pat_con = con, pat_args = dets}->-        [ toHie $ C Use $ fmap conLikeName con-        , toHie $ contextify dets-        ]-      ViewPat _ expr pat ->-        [ toHie expr-        , toHie $ PS rsp scope pscope pat-        ]-      SplicePat _ sp ->-        [ toHie $ L ospan sp-        ]-      LitPat _ _ ->-        []-      NPat _ _ _ _ ->-        []-      NPlusKPat _ n _ _ _ _ ->-        [ toHie $ C (PatternBind scope pscope rsp) n-        ]-      SigPat _ pat sig ->-        [ toHie $ PS rsp scope pscope pat-        , let cscope = mkLScope (dL pat) in-            toHie $ TS (ResolvedScopes [cscope, scope, pscope])-                       (protectSig @a cscope sig)-              -- See Note [Scoping Rules for SigPat]-        ]-      CoPat _ _ _ _ ->-        []-      XPat _ -> []-    where-      contextify (PrefixCon args) = PrefixCon $ patScopes rsp scope pscope args-      contextify (InfixCon a b) = InfixCon a' b'-        where [a', b'] = patScopes rsp scope pscope [a,b]-      contextify (RecCon r) = RecCon $ RC RecFieldMatch $ contextify_rec r-      contextify_rec (HsRecFields fds a) = HsRecFields (map go scoped_fds) a-        where-          go (RS fscope (L spn (HsRecField lbl pat pun))) =-            L spn $ HsRecField lbl (PS rsp scope fscope pat) pun-          scoped_fds = listScopes pscope fds--instance ( ToHie body-         , ToHie (LGRHS a body)-         , ToHie (RScoped (LHsLocalBinds a))-         ) => ToHie (GRHSs a body) where-  toHie grhs = concatM $ case grhs of-    GRHSs _ grhss binds ->-     [ toHie grhss-     , toHie $ RS (mkScope $ grhss_span grhs) binds-     ]-    XGRHSs _ -> []--instance ( ToHie (Located body)-         , ToHie (RScoped (GuardLStmt a))-         , Data (GRHS a (Located body))-         ) => ToHie (LGRHS a (Located body)) where-  toHie (L span g) = concatM $ makeNode g span : case g of-    GRHS _ guards body ->-      [ toHie $ listScopes (mkLScope body) guards-      , toHie body-      ]-    XGRHS _ -> []--instance ( a ~ GhcPass p-         , ToHie (Context (Located (IdP a)))-         , HasType (LHsExpr a)-         , ToHie (PScoped (LPat a))-         , ToHie (MatchGroup a (LHsExpr a))-         , ToHie (LGRHS a (LHsExpr a))-         , ToHie (RContext (HsRecordBinds a))-         , ToHie (RFContext (Located (AmbiguousFieldOcc a)))-         , ToHie (ArithSeqInfo a)-         , ToHie (LHsCmdTop a)-         , ToHie (RScoped (GuardLStmt a))-         , ToHie (RScoped (LHsLocalBinds a))-         , ToHie (TScoped (LHsWcType (NoGhcTc a)))-         , ToHie (TScoped (LHsSigWcType (NoGhcTc a)))-         , Data (HsExpr a)-         , Data (HsSplice a)-         , Data (HsTupArg a)-         , Data (AmbiguousFieldOcc a)-         ) => ToHie (LHsExpr (GhcPass p)) where-  toHie e@(L mspan oexpr) = concatM $ getTypeNode e : case oexpr of-      HsVar _ (L _ var) ->-        [ toHie $ C Use (L mspan var)-             -- Patch up var location since typechecker removes it-        ]-      HsUnboundVar _ _ ->-        []-      HsConLikeOut _ con ->-        [ toHie $ C Use $ L mspan $ conLikeName con-        ]-      HsRecFld _ fld ->-        [ toHie $ RFC RecFieldOcc Nothing (L mspan fld)-        ]-      HsOverLabel _ _ _ -> []-      HsIPVar _ _ -> []-      HsOverLit _ _ -> []-      HsLit _ _ -> []-      HsLam _ mg ->-        [ toHie mg-        ]-      HsLamCase _ mg ->-        [ toHie mg-        ]-      HsApp _ a b ->-        [ toHie a-        , toHie b-        ]-      HsAppType _ expr sig ->-        [ toHie expr-        , toHie $ TS (ResolvedScopes []) sig-        ]-      OpApp _ a b c ->-        [ toHie a-        , toHie b-        , toHie c-        ]-      NegApp _ a _ ->-        [ toHie a-        ]-      HsPar _ a ->-        [ toHie a-        ]-      SectionL _ a b ->-        [ toHie a-        , toHie b-        ]-      SectionR _ a b ->-        [ toHie a-        , toHie b-        ]-      ExplicitTuple _ args _ ->-        [ toHie args-        ]-      ExplicitSum _ _ _ expr ->-        [ toHie expr-        ]-      HsCase _ expr matches ->-        [ toHie expr-        , toHie matches-        ]-      HsIf _ _ a b c ->-        [ toHie a-        , toHie b-        , toHie c-        ]-      HsMultiIf _ grhss ->-        [ toHie grhss-        ]-      HsLet _ binds expr ->-        [ toHie $ RS (mkLScope expr) binds-        , toHie expr-        ]-      HsDo _ _ (L ispan stmts) ->-        [ pure $ locOnly ispan-        , toHie $ listScopes NoScope stmts-        ]-      ExplicitList _ _ exprs ->-        [ toHie exprs-        ]-      RecordCon {rcon_con_name = name, rcon_flds = binds}->-        [ toHie $ C Use name-        , toHie $ RC RecFieldAssign $ binds-        ]-      RecordUpd {rupd_expr = expr, rupd_flds = upds}->-        [ toHie expr-        , toHie $ map (RC RecFieldAssign) upds-        ]-      ExprWithTySig _ expr sig ->-        [ toHie expr-        , toHie $ TS (ResolvedScopes [mkLScope expr]) sig-        ]-      ArithSeq _ _ info ->-        [ toHie info-        ]-      HsSCC _ _ _ expr ->-        [ toHie expr-        ]-      HsCoreAnn _ _ _ expr ->-        [ toHie expr-        ]-      HsProc _ pat cmdtop ->-        [ toHie $ PS Nothing (mkLScope cmdtop) NoScope pat-        , toHie cmdtop-        ]-      HsStatic _ expr ->-        [ toHie expr-        ]-      HsArrApp _ a b _ _ ->-        [ toHie a-        , toHie b-        ]-      HsArrForm _ expr _ cmds ->-        [ toHie expr-        , toHie cmds-        ]-      HsTick _ _ expr ->-        [ toHie expr-        ]-      HsBinTick _ _ _ expr ->-        [ toHie expr-        ]-      HsTickPragma _ _ _ _ expr ->-        [ toHie expr-        ]-      HsWrap _ _ a ->-        [ toHie $ L mspan a-        ]-      HsBracket _ b ->-        [ toHie b-        ]-      HsRnBracketOut _ b p ->-        [ toHie b-        , toHie p-        ]-      HsTcBracketOut _ b p ->-        [ toHie b-        , toHie p-        ]-      HsSpliceE _ x ->-        [ toHie $ L mspan x-        ]-      EWildPat _ -> []-      EAsPat _ a b ->-        [ toHie $ C Use a-        , toHie b-        ]-      EViewPat _ a b ->-        [ toHie a-        , toHie b-        ]-      ELazyPat _ a ->-        [ toHie a-        ]-      XExpr _ -> []--instance ( a ~ GhcPass p-         , ToHie (LHsExpr a)-         , Data (HsTupArg a)-         ) => ToHie (LHsTupArg (GhcPass p)) where-  toHie (L span arg) = concatM $ makeNode arg span : case arg of-    Present _ expr ->-      [ toHie expr-      ]-    Missing _ -> []-    XTupArg _ -> []--instance ( a ~ GhcPass p-         , ToHie (PScoped (LPat a))-         , ToHie (LHsExpr a)-         , ToHie (SigContext (LSig a))-         , ToHie (RScoped (LHsLocalBinds a))-         , ToHie (RScoped (ApplicativeArg a))-         , ToHie (Located body)-         , Data (StmtLR a a (Located body))-         , Data (StmtLR a a (Located (HsExpr a)))-         ) => ToHie (RScoped (LStmt (GhcPass p) (Located body))) where-  toHie (RS scope (L span stmt)) = concatM $ makeNode stmt span : case stmt of-      LastStmt _ body _ _ ->-        [ toHie body-        ]-      BindStmt _ pat body _ _ ->-        [ toHie $ PS (getRealSpan $ getLoc body) scope NoScope pat-        , toHie body-        ]-      ApplicativeStmt _ stmts _ ->-        [ concatMapM (toHie . RS scope . snd) stmts-        ]-      BodyStmt _ body _ _ ->-        [ toHie body-        ]-      LetStmt _ binds ->-        [ toHie $ RS scope binds-        ]-      ParStmt _ parstmts _ _ ->-        [ concatMapM (\(ParStmtBlock _ stmts _ _) ->-                          toHie $ listScopes NoScope stmts)-                     parstmts-        ]-      TransStmt {trS_stmts = stmts, trS_using = using, trS_by = by} ->-        [ toHie $ listScopes scope stmts-        , toHie using-        , toHie by-        ]-      RecStmt {recS_stmts = stmts} ->-        [ toHie $ map (RS $ combineScopes scope (mkScope span)) stmts-        ]-      XStmtLR _ -> []--instance ( ToHie (LHsExpr a)-         , ToHie (PScoped (LPat a))-         , ToHie (BindContext (LHsBind a))-         , ToHie (SigContext (LSig a))-         , ToHie (RScoped (HsValBindsLR a a))-         , Data (HsLocalBinds a)-         ) => ToHie (RScoped (LHsLocalBinds a)) where-  toHie (RS scope (L sp binds)) = concatM $ makeNode binds sp : case binds of-      EmptyLocalBinds _ -> []-      HsIPBinds _ _ -> []-      HsValBinds _ valBinds ->-        [ toHie $ RS (combineScopes scope $ mkScope sp)-                      valBinds-        ]-      XHsLocalBindsLR _ -> []--instance ( ToHie (BindContext (LHsBind a))-         , ToHie (SigContext (LSig a))-         , ToHie (RScoped (XXValBindsLR a a))-         ) => ToHie (RScoped (HsValBindsLR a a)) where-  toHie (RS sc v) = concatM $ case v of-    ValBinds _ binds sigs ->-      [ toHie $ fmap (BC RegularBind sc) binds-      , toHie $ fmap (SC (SI BindSig Nothing)) sigs-      ]-    XValBindsLR x -> [ toHie $ RS sc x ]--instance ToHie (RScoped (NHsValBindsLR GhcTc)) where-  toHie (RS sc (NValBinds binds sigs)) = concatM $-    [ toHie (concatMap (map (BC RegularBind sc) . bagToList . snd) binds)-    , toHie $ fmap (SC (SI BindSig Nothing)) sigs-    ]-instance ToHie (RScoped (NHsValBindsLR GhcRn)) where-  toHie (RS sc (NValBinds binds sigs)) = concatM $-    [ toHie (concatMap (map (BC RegularBind sc) . bagToList . snd) binds)-    , toHie $ fmap (SC (SI BindSig Nothing)) sigs-    ]--instance ( ToHie (RContext (LHsRecField a arg))-         ) => ToHie (RContext (HsRecFields a arg)) where-  toHie (RC c (HsRecFields fields _)) = toHie $ map (RC c) fields--instance ( ToHie (RFContext (Located label))-         , ToHie arg-         , HasLoc arg-         , Data label-         , Data arg-         ) => ToHie (RContext (LHsRecField' label arg)) where-  toHie (RC c (L span recfld)) = concatM $ makeNode recfld span : case recfld of-    HsRecField label expr _ ->-      [ toHie $ RFC c (getRealSpan $ loc expr) label-      , toHie expr-      ]--removeDefSrcSpan :: Name -> Name-removeDefSrcSpan n = setNameLoc n noSrcSpan--instance ToHie (RFContext (LFieldOcc GhcRn)) where-  toHie (RFC c rhs (L nspan f)) = concatM $ case f of-    FieldOcc name _ ->-      [ toHie $ C (RecField c rhs) (L nspan $ removeDefSrcSpan name)-      ]-    XFieldOcc _ -> []--instance ToHie (RFContext (LFieldOcc GhcTc)) where-  toHie (RFC c rhs (L nspan f)) = concatM $ case f of-    FieldOcc var _ ->-      let var' = setVarName var (removeDefSrcSpan $ varName var)-      in [ toHie $ C (RecField c rhs) (L nspan var')-         ]-    XFieldOcc _ -> []--instance ToHie (RFContext (Located (AmbiguousFieldOcc GhcRn))) where-  toHie (RFC c rhs (L nspan afo)) = concatM $ case afo of-    Unambiguous name _ ->-      [ toHie $ C (RecField c rhs) $ L nspan $ removeDefSrcSpan name-      ]-    Ambiguous _name _ ->-      [ ]-    XAmbiguousFieldOcc _ -> []--instance ToHie (RFContext (Located (AmbiguousFieldOcc GhcTc))) where-  toHie (RFC c rhs (L nspan afo)) = concatM $ case afo of-    Unambiguous var _ ->-      let var' = setVarName var (removeDefSrcSpan $ varName var)-      in [ toHie $ C (RecField c rhs) (L nspan var')-         ]-    Ambiguous var _ ->-      let var' = setVarName var (removeDefSrcSpan $ varName var)-      in [ toHie $ C (RecField c rhs) (L nspan var')-         ]-    XAmbiguousFieldOcc _ -> []--instance ( a ~ GhcPass p-         , ToHie (PScoped (LPat a))-         , ToHie (BindContext (LHsBind a))-         , ToHie (LHsExpr a)-         , ToHie (SigContext (LSig a))-         , ToHie (RScoped (HsValBindsLR a a))-         , Data (StmtLR a a (Located (HsExpr a)))-         , Data (HsLocalBinds a)-         ) => ToHie (RScoped (ApplicativeArg (GhcPass p))) where-  toHie (RS sc (ApplicativeArgOne _ pat expr _)) = concatM-    [ toHie $ PS Nothing sc NoScope pat-    , toHie expr-    ]-  toHie (RS sc (ApplicativeArgMany _ stmts _ pat)) = concatM-    [ toHie $ listScopes NoScope stmts-    , toHie $ PS Nothing sc NoScope pat-    ]-  toHie (RS _ (XApplicativeArg _)) = pure []--instance (ToHie arg, ToHie rec) => ToHie (HsConDetails arg rec) where-  toHie (PrefixCon args) = toHie args-  toHie (RecCon rec) = toHie rec-  toHie (InfixCon a b) = concatM [ toHie a, toHie b]--instance ( ToHie (LHsCmd a)-         , Data  (HsCmdTop a)-         ) => ToHie (LHsCmdTop a) where-  toHie (L span top) = concatM $ makeNode top span : case top of-    HsCmdTop _ cmd ->-      [ toHie cmd-      ]-    XCmdTop _ -> []--instance ( a ~ GhcPass p-         , ToHie (PScoped (LPat a))-         , ToHie (BindContext (LHsBind a))-         , ToHie (LHsExpr a)-         , ToHie (MatchGroup a (LHsCmd a))-         , ToHie (SigContext (LSig a))-         , ToHie (RScoped (HsValBindsLR a a))-         , Data (HsCmd a)-         , Data (HsCmdTop a)-         , Data (StmtLR a a (Located (HsCmd a)))-         , Data (HsLocalBinds a)-         , Data (StmtLR a a (Located (HsExpr a)))-         ) => ToHie (LHsCmd (GhcPass p)) where-  toHie (L span cmd) = concatM $ makeNode cmd span : case cmd of-      HsCmdArrApp _ a b _ _ ->-        [ toHie a-        , toHie b-        ]-      HsCmdArrForm _ a _ _ cmdtops ->-        [ toHie a-        , toHie cmdtops-        ]-      HsCmdApp _ a b ->-        [ toHie a-        , toHie b-        ]-      HsCmdLam _ mg ->-        [ toHie mg-        ]-      HsCmdPar _ a ->-        [ toHie a-        ]-      HsCmdCase _ expr alts ->-        [ toHie expr-        , toHie alts-        ]-      HsCmdIf _ _ a b c ->-        [ toHie a-        , toHie b-        , toHie c-        ]-      HsCmdLet _ binds cmd' ->-        [ toHie $ RS (mkLScope cmd') binds-        , toHie cmd'-        ]-      HsCmdDo _ (L ispan stmts) ->-        [ pure $ locOnly ispan-        , toHie $ listScopes NoScope stmts-        ]-      HsCmdWrap _ _ _ -> []-      XCmd _ -> []--instance ToHie (TyClGroup GhcRn) where-  toHie (TyClGroup _ classes roles instances) = concatM-    [ toHie classes-    , toHie roles-    , toHie instances-    ]-  toHie (XTyClGroup _) = pure []--instance ToHie (LTyClDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      FamDecl {tcdFam = fdecl} ->-        [ toHie (L span fdecl)-        ]-      SynDecl {tcdLName = name, tcdTyVars = vars, tcdRhs = typ} ->-        [ toHie $ C (Decl SynDec $ getRealSpan span) name-        , toHie $ TS (ResolvedScopes [mkScope $ getLoc typ]) vars-        , toHie typ-        ]-      DataDecl {tcdLName = name, tcdTyVars = vars, tcdDataDefn = defn} ->-        [ toHie $ C (Decl DataDec $ getRealSpan span) name-        , toHie $ TS (ResolvedScopes [quant_scope, rhs_scope]) vars-        , toHie defn-        ]-        where-          quant_scope = mkLScope $ dd_ctxt defn-          rhs_scope = sig_sc `combineScopes` con_sc `combineScopes` deriv_sc-          sig_sc = maybe NoScope mkLScope $ dd_kindSig defn-          con_sc = foldr combineScopes NoScope $ map mkLScope $ dd_cons defn-          deriv_sc = mkLScope $ dd_derivs defn-      ClassDecl { tcdCtxt = context-                , tcdLName = name-                , tcdTyVars = vars-                , tcdFDs = deps-                , tcdSigs = sigs-                , tcdMeths = meths-                , tcdATs = typs-                , tcdATDefs = deftyps-                } ->-        [ toHie $ C (Decl ClassDec $ getRealSpan span) name-        , toHie context-        , toHie $ TS (ResolvedScopes [context_scope, rhs_scope]) vars-        , toHie deps-        , toHie $ map (SC $ SI ClassSig $ getRealSpan span) sigs-        , toHie $ fmap (BC InstanceBind ModuleScope) meths-        , toHie typs-        , concatMapM (pure . locOnly . getLoc) deftyps-        , toHie $ map (go . unLoc) deftyps-        ]-        where-          context_scope = mkLScope context-          rhs_scope = foldl1' combineScopes $ map mkScope-            [ loc deps, loc sigs, loc (bagToList meths), loc typs, loc deftyps]--          go :: TyFamDefltEqn GhcRn-             -> FamEqn GhcRn (TScoped (LHsQTyVars GhcRn)) (LHsType GhcRn)-          go (FamEqn a var bndrs pat b rhs) =-             FamEqn a var bndrs (TS (ResolvedScopes [mkLScope rhs]) pat) b rhs-          go (XFamEqn NoExt) = XFamEqn NoExt-      XTyClDecl _ -> []--instance ToHie (LFamilyDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      FamilyDecl _ info name vars _ sig inj ->-        [ toHie $ C (Decl FamDec $ getRealSpan span) name-        , toHie $ TS (ResolvedScopes [rhsSpan]) vars-        , toHie info-        , toHie $ RS injSpan sig-        , toHie inj-        ]-        where-          rhsSpan = sigSpan `combineScopes` injSpan-          sigSpan = mkScope $ getLoc sig-          injSpan = maybe NoScope (mkScope . getLoc) inj-      XFamilyDecl _ -> []--instance ToHie (FamilyInfo GhcRn) where-  toHie (ClosedTypeFamily (Just eqns)) = concatM $-    [ concatMapM (pure . locOnly . getLoc) eqns-    , toHie $ map go eqns-    ]-    where-      go (L l ib) = TS (ResolvedScopes [mkScope l]) ib-  toHie _ = pure []--instance ToHie (RScoped (LFamilyResultSig GhcRn)) where-  toHie (RS sc (L span sig)) = concatM $ makeNode sig span : case sig of-      NoSig _ ->-        []-      KindSig _ k ->-        [ toHie k-        ]-      TyVarSig _ bndr ->-        [ toHie $ TVS (ResolvedScopes [sc]) NoScope bndr-        ]-      XFamilyResultSig _ -> []--instance ToHie (Located (FunDep (Located Name))) where-  toHie (L span fd@(lhs, rhs)) = concatM $-    [ makeNode fd span-    , toHie $ map (C Use) lhs-    , toHie $ map (C Use) rhs-    ]--instance (ToHie pats, ToHie rhs, HasLoc pats, HasLoc rhs)-    => ToHie (TScoped (FamEqn GhcRn pats rhs)) where-  toHie (TS _ f) = toHie f--instance ( ToHie pats-         , ToHie rhs-         , HasLoc pats-         , HasLoc rhs-         ) => ToHie (FamEqn GhcRn pats rhs) where-  toHie fe@(FamEqn _ var tybndrs pats _ rhs) = concatM $-    [ toHie $ C (Decl InstDec $ getRealSpan $ loc fe) var-    , toHie $ fmap (tvScopes (ResolvedScopes []) scope) tybndrs-    , toHie pats-    , toHie rhs-    ]-    where scope = combineScopes patsScope rhsScope-          patsScope = mkScope (loc pats)-          rhsScope = mkScope (loc rhs)-  toHie (XFamEqn _) = pure []--instance ToHie (LInjectivityAnn GhcRn) where-  toHie (L span ann) = concatM $ makeNode ann span : case ann of-      InjectivityAnn lhs rhs ->-        [ toHie $ C Use lhs-        , toHie $ map (C Use) rhs-        ]--instance ToHie (HsDataDefn GhcRn) where-  toHie (HsDataDefn _ _ ctx _ mkind cons derivs) = concatM-    [ toHie ctx-    , toHie mkind-    , toHie cons-    , toHie derivs-    ]-  toHie (XHsDataDefn _) = pure []--instance ToHie (HsDeriving GhcRn) where-  toHie (L span clauses) = concatM-    [ pure $ locOnly span-    , toHie clauses-    ]--instance ToHie (LHsDerivingClause GhcRn) where-  toHie (L span cl) = concatM $ makeNode cl span : case cl of-      HsDerivingClause _ strat (L ispan tys) ->-        [ toHie strat-        , pure $ locOnly ispan-        , toHie $ map (TS (ResolvedScopes [])) tys-        ]-      XHsDerivingClause _ -> []--instance ToHie (Located (DerivStrategy GhcRn)) where-  toHie (L span strat) = concatM $ makeNode strat span : case strat of-      StockStrategy -> []-      AnyclassStrategy -> []-      NewtypeStrategy -> []-      ViaStrategy s -> [ toHie $ TS (ResolvedScopes []) s ]--instance ToHie (Located OverlapMode) where-  toHie (L span _) = pure $ locOnly span--instance ToHie (LConDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      ConDeclGADT { con_names = names, con_qvars = qvars-                  , con_mb_cxt = ctx, con_args = args, con_res_ty = typ } ->-        [ toHie $ map (C (Decl ConDec $ getRealSpan span)) names-        , toHie $ TS (ResolvedScopes [ctxScope, rhsScope]) qvars-        , toHie ctx-        , toHie args-        , toHie typ-        ]-        where-          rhsScope = combineScopes argsScope tyScope-          ctxScope = maybe NoScope mkLScope ctx-          argsScope = condecl_scope args-          tyScope = mkLScope typ-      ConDeclH98 { con_name = name, con_ex_tvs = qvars-                 , con_mb_cxt = ctx, con_args = dets } ->-        [ toHie $ C (Decl ConDec $ getRealSpan span) name-        , toHie $ tvScopes (ResolvedScopes []) rhsScope qvars-        , toHie ctx-        , toHie dets-        ]-        where-          rhsScope = combineScopes ctxScope argsScope-          ctxScope = maybe NoScope mkLScope ctx-          argsScope = condecl_scope dets-      XConDecl _ -> []-    where condecl_scope args = case args of-            PrefixCon xs -> foldr combineScopes NoScope $ map mkLScope xs-            InfixCon a b -> combineScopes (mkLScope a) (mkLScope b)-            RecCon x -> mkLScope x--instance ToHie (Located [LConDeclField GhcRn]) where-  toHie (L span decls) = concatM $-    [ pure $ locOnly span-    , toHie decls-    ]--instance ( HasLoc thing-         , ToHie (TScoped thing)-         ) => ToHie (TScoped (HsImplicitBndrs GhcRn thing)) where-  toHie (TS sc (HsIB ibrn a)) = concatM $-      [ pure $ bindingsOnly $ map (C $ TyVarBind (mkScope span) sc) ibrn-      , toHie $ TS sc a-      ]-    where span = loc a-  toHie (TS _ (XHsImplicitBndrs _)) = pure []--instance ( HasLoc thing-         , ToHie (TScoped thing)-         ) => ToHie (TScoped (HsWildCardBndrs GhcRn thing)) where-  toHie (TS sc (HsWC names a)) = concatM $-      [ pure $ bindingsOnly $ map (C $ TyVarBind (mkScope span) sc) names-      , toHie $ TS sc a-      ]-    where span = loc a-  toHie (TS _ (XHsWildCardBndrs _)) = pure []--instance ToHie (SigContext (LSig GhcRn)) where-  toHie (SC (SI styp msp) (L sp sig)) = concatM $ makeNode sig sp : case sig of-      TypeSig _ names typ ->-        [ toHie $ map (C TyDecl) names-        , toHie $ TS (UnresolvedScope (map unLoc names) Nothing) typ-        ]-      PatSynSig _ names typ ->-        [ toHie $ map (C TyDecl) names-        , toHie $ TS (UnresolvedScope (map unLoc names) Nothing) typ-        ]-      ClassOpSig _ _ names typ ->-        [ case styp of-            ClassSig -> toHie $ map (C $ ClassTyDecl $ getRealSpan sp) names-            _  -> toHie $ map (C $ TyDecl) names-        , toHie $ TS (UnresolvedScope (map unLoc names) msp) typ-        ]-      IdSig _ _ -> []-      FixSig _ fsig ->-        [ toHie $ L sp fsig-        ]-      InlineSig _ name _ ->-        [ toHie $ (C Use) name-        ]-      SpecSig _ name typs _ ->-        [ toHie $ (C Use) name-        , toHie $ map (TS (ResolvedScopes [])) typs-        ]-      SpecInstSig _ _ typ ->-        [ toHie $ TS (ResolvedScopes []) typ-        ]-      MinimalSig _ _ form ->-        [ toHie form-        ]-      SCCFunSig _ _ name mtxt ->-        [ toHie $ (C Use) name-        , pure $ maybe [] (locOnly . getLoc) mtxt-        ]-      CompleteMatchSig _ _ (L ispan names) typ ->-        [ pure $ locOnly ispan-        , toHie $ map (C Use) names-        , toHie $ fmap (C Use) typ-        ]-      XSig _ -> []--instance ToHie (LHsType GhcRn) where-  toHie x = toHie $ TS (ResolvedScopes []) x--instance ToHie (TScoped (LHsType GhcRn)) where-  toHie (TS tsc (L span t)) = concatM $ makeNode t span : case t of-      HsForAllTy _ bndrs body ->-        [ toHie $ tvScopes tsc (mkScope $ getLoc body) bndrs-        , toHie body-        ]-      HsQualTy _ ctx body ->-        [ toHie ctx-        , toHie body-        ]-      HsTyVar _ _ var ->-        [ toHie $ C Use var-        ]-      HsAppTy _ a b ->-        [ toHie a-        , toHie b-        ]-      HsAppKindTy _ ty ki ->-        [ toHie ty-        , toHie $ TS (ResolvedScopes []) ki-        ]-      HsFunTy _ a b ->-        [ toHie a-        , toHie b-        ]-      HsListTy _ a ->-        [ toHie a-        ]-      HsTupleTy _ _ tys ->-        [ toHie tys-        ]-      HsSumTy _ tys ->-        [ toHie tys-        ]-      HsOpTy _ a op b ->-        [ toHie a-        , toHie $ C Use op-        , toHie b-        ]-      HsParTy _ a ->-        [ toHie a-        ]-      HsIParamTy _ ip ty ->-        [ toHie ip-        , toHie ty-        ]-      HsKindSig _ a b ->-        [ toHie a-        , toHie b-        ]-      HsSpliceTy _ a ->-        [ toHie $ L span a-        ]-      HsDocTy _ a _ ->-        [ toHie a-        ]-      HsBangTy _ _ ty ->-        [ toHie ty-        ]-      HsRecTy _ fields ->-        [ toHie fields-        ]-      HsExplicitListTy _ _ tys ->-        [ toHie tys-        ]-      HsExplicitTupleTy _ tys ->-        [ toHie tys-        ]-      HsTyLit _ _ -> []-      HsWildCardTy _ -> []-      HsStarTy _ _ -> []-      XHsType _ -> []--instance (ToHie tm, ToHie ty) => ToHie (HsArg tm ty) where-  toHie (HsValArg tm) = toHie tm-  toHie (HsTypeArg _ ty) = toHie ty-  toHie (HsArgPar sp) = pure $ locOnly sp--instance ToHie (TVScoped (LHsTyVarBndr GhcRn)) where-  toHie (TVS tsc sc (L span bndr)) = concatM $ makeNode bndr span : case bndr of-      UserTyVar _ var ->-        [ toHie $ C (TyVarBind sc tsc) var-        ]-      KindedTyVar _ var kind ->-        [ toHie $ C (TyVarBind sc tsc) var-        , toHie kind-        ]-      XTyVarBndr _ -> []--instance ToHie (TScoped (LHsQTyVars GhcRn)) where-  toHie (TS sc (HsQTvs (HsQTvsRn implicits _) vars)) = concatM $-    [ pure $ bindingsOnly bindings-    , toHie $ tvScopes sc NoScope vars-    ]-    where-      varLoc = loc vars-      bindings = map (C $ TyVarBind (mkScope varLoc) sc) implicits-  toHie (TS _ (XLHsQTyVars _)) = pure []--instance ToHie (LHsContext GhcRn) where-  toHie (L span tys) = concatM $-      [ pure $ locOnly span-      , toHie tys-      ]--instance ToHie (LConDeclField GhcRn) where-  toHie (L span field) = concatM $ makeNode field span : case field of-      ConDeclField _ fields typ _ ->-        [ toHie $ map (RFC RecFieldDecl (getRealSpan $ loc typ)) fields-        , toHie typ-        ]-      XConDeclField _ -> []--instance ToHie (LHsExpr a) => ToHie (ArithSeqInfo a) where-  toHie (From expr) = toHie expr-  toHie (FromThen a b) = concatM $-    [ toHie a-    , toHie b-    ]-  toHie (FromTo a b) = concatM $-    [ toHie a-    , toHie b-    ]-  toHie (FromThenTo a b c) = concatM $-    [ toHie a-    , toHie b-    , toHie c-    ]--instance ToHie (LSpliceDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      SpliceDecl _ splice _ ->-        [ toHie splice-        ]-      XSpliceDecl _ -> []--instance ToHie (HsBracket a) where-  toHie _ = pure []--instance ToHie PendingRnSplice where-  toHie _ = pure []--instance ToHie PendingTcSplice where-  toHie _ = pure []--instance ToHie (LBooleanFormula (Located Name)) where-  toHie (L span form) = concatM $ makeNode form span : case form of-      Var a ->-        [ toHie $ C Use a-        ]-      And forms ->-        [ toHie forms-        ]-      Or forms ->-        [ toHie forms-        ]-      Parens f ->-        [ toHie f-        ]--instance ToHie (Located HsIPName) where-  toHie (L span e) = makeNode e span--instance ( ToHie (LHsExpr a)-         , Data (HsSplice a)-         ) => ToHie (Located (HsSplice a)) where-  toHie (L span sp) = concatM $ makeNode sp span : case sp of-      HsTypedSplice _ _ _ expr ->-        [ toHie expr-        ]-      HsUntypedSplice _ _ _ expr ->-        [ toHie expr-        ]-      HsQuasiQuote _ _ _ ispan _ ->-        [ pure $ locOnly ispan-        ]-      HsSpliced _ _ _ ->-        []-      HsSplicedT _ ->-        []-      XSplice _ -> []--instance ToHie (LRoleAnnotDecl GhcRn) where-  toHie (L span annot) = concatM $ makeNode annot span : case annot of-      RoleAnnotDecl _ var roles ->-        [ toHie $ C Use var-        , concatMapM (pure . locOnly . getLoc) roles-        ]-      XRoleAnnotDecl _ -> []--instance ToHie (LInstDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      ClsInstD _ d ->-        [ toHie $ L span d-        ]-      DataFamInstD _ d ->-        [ toHie $ L span d-        ]-      TyFamInstD _ d ->-        [ toHie $ L span d-        ]-      XInstDecl _ -> []--instance ToHie (LClsInstDecl GhcRn) where-  toHie (L span decl) = concatM-    [ toHie $ TS (ResolvedScopes [mkScope span]) $ cid_poly_ty decl-    , toHie $ fmap (BC InstanceBind ModuleScope) $ cid_binds decl-    , toHie $ map (SC $ SI InstSig $ getRealSpan span) $ cid_sigs decl-    , pure $ concatMap (locOnly . getLoc) $ cid_tyfam_insts decl-    , toHie $ cid_tyfam_insts decl-    , pure $ concatMap (locOnly . getLoc) $ cid_datafam_insts decl-    , toHie $ cid_datafam_insts decl-    , toHie $ cid_overlap_mode decl-    ]--instance ToHie (LDataFamInstDecl GhcRn) where-  toHie (L sp (DataFamInstDecl d)) = toHie $ TS (ResolvedScopes [mkScope sp]) d--instance ToHie (LTyFamInstDecl GhcRn) where-  toHie (L sp (TyFamInstDecl d)) = toHie $ TS (ResolvedScopes [mkScope sp]) d--instance ToHie (Context a)-         => ToHie (PatSynFieldContext (RecordPatSynField a)) where-  toHie (PSC sp (RecordPatSynField a b)) = concatM $-    [ toHie $ C (RecField RecFieldDecl sp) a-    , toHie $ C Use b-    ]--instance ToHie (LDerivDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      DerivDecl _ typ strat overlap ->-        [ toHie $ TS (ResolvedScopes []) typ-        , toHie strat-        , toHie overlap-        ]-      XDerivDecl _ -> []--instance ToHie (LFixitySig GhcRn) where-  toHie (L span sig) = concatM $ makeNode sig span : case sig of-      FixitySig _ vars _ ->-        [ toHie $ map (C Use) vars-        ]-      XFixitySig _ -> []--instance ToHie (LDefaultDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      DefaultDecl _ typs ->-        [ toHie typs-        ]-      XDefaultDecl _ -> []--instance ToHie (LForeignDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      ForeignImport {fd_name = name, fd_sig_ty = sig, fd_fi = fi} ->-        [ toHie $ C (ValBind RegularBind ModuleScope $ getRealSpan span) name-        , toHie $ TS (ResolvedScopes []) sig-        , toHie fi-        ]-      ForeignExport {fd_name = name, fd_sig_ty = sig, fd_fe = fe} ->-        [ toHie $ C Use name-        , toHie $ TS (ResolvedScopes []) sig-        , toHie fe-        ]-      XForeignDecl _ -> []--instance ToHie ForeignImport where-  toHie (CImport (L a _) (L b _) _ _ (L c _)) = pure $ concat $-    [ locOnly a-    , locOnly b-    , locOnly c-    ]--instance ToHie ForeignExport where-  toHie (CExport (L a _) (L b _)) = pure $ concat $-    [ locOnly a-    , locOnly b-    ]--instance ToHie (LWarnDecls GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      Warnings _ _ warnings ->-        [ toHie warnings-        ]-      XWarnDecls _ -> []--instance ToHie (LWarnDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      Warning _ vars _ ->-        [ toHie $ map (C Use) vars-        ]-      XWarnDecl _ -> []--instance ToHie (LAnnDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      HsAnnotation _ _ prov expr ->-        [ toHie prov-        , toHie expr-        ]-      XAnnDecl _ -> []--instance ToHie (Context (Located a)) => ToHie (AnnProvenance a) where-  toHie (ValueAnnProvenance a) = toHie $ C Use a-  toHie (TypeAnnProvenance a) = toHie $ C Use a-  toHie ModuleAnnProvenance = pure []--instance ToHie (LRuleDecls GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      HsRules _ _ rules ->-        [ toHie rules-        ]-      XRuleDecls _ -> []--instance ToHie (LRuleDecl GhcRn) where-  toHie (L _ (XRuleDecl _)) = pure []-  toHie (L span r@(HsRule _ rname _ tybndrs bndrs exprA exprB)) = concatM-        [ makeNode r span-        , pure $ locOnly $ getLoc rname-        , toHie $ fmap (tvScopes (ResolvedScopes []) scope) tybndrs-        , toHie $ map (RS $ mkScope span) bndrs-        , toHie exprA-        , toHie exprB-        ]-    where scope = bndrs_sc `combineScopes` exprA_sc `combineScopes` exprB_sc-          bndrs_sc = maybe NoScope mkLScope (listToMaybe bndrs)-          exprA_sc = mkLScope exprA-          exprB_sc = mkLScope exprB--instance ToHie (RScoped (LRuleBndr GhcRn)) where-  toHie (RS sc (L span bndr)) = concatM $ makeNode bndr span : case bndr of-      RuleBndr _ var ->-        [ toHie $ C (ValBind RegularBind sc Nothing) var-        ]-      RuleBndrSig _ var typ ->-        [ toHie $ C (ValBind RegularBind sc Nothing) var-        , toHie $ TS (ResolvedScopes [sc]) typ-        ]-      XRuleBndr _ -> []--instance ToHie (LImportDecl GhcRn) where-  toHie (L span decl) = concatM $ makeNode decl span : case decl of-      ImportDecl { ideclName = name, ideclAs = as, ideclHiding = hidden } ->-        [ toHie $ IEC Import name-        , toHie $ fmap (IEC ImportAs) as-        , maybe (pure []) goIE hidden-        ]-      XImportDecl _ -> []-    where-      goIE (hiding, (L sp liens)) = concatM $-        [ pure $ locOnly sp-        , toHie $ map (IEC c) liens-        ]-        where-         c = if hiding then ImportHiding else Import--instance ToHie (IEContext (LIE GhcRn)) where-  toHie (IEC c (L span ie)) = concatM $ makeNode ie span : case ie of-      IEVar _ n ->-        [ toHie $ IEC c n-        ]-      IEThingAbs _ n ->-        [ toHie $ IEC c n-        ]-      IEThingAll _ n ->-        [ toHie $ IEC c n-        ]-      IEThingWith _ n _ ns flds ->-        [ toHie $ IEC c n-        , toHie $ map (IEC c) ns-        , toHie $ map (IEC c) flds-        ]-      IEModuleContents _ n ->-        [ toHie $ IEC c n-        ]-      IEGroup _ _ _ -> []-      IEDoc _ _ -> []-      IEDocNamed _ _ -> []-      XIE _ -> []--instance ToHie (IEContext (LIEWrappedName Name)) where-  toHie (IEC c (L span iewn)) = concatM $ makeNode iewn span : case iewn of-      IEName n ->-        [ toHie $ C (IEThing c) n-        ]-      IEPattern p ->-        [ toHie $ C (IEThing c) p-        ]-      IEType n ->-        [ toHie $ C (IEThing c) n-        ]--instance ToHie (IEContext (Located (FieldLbl Name))) where-  toHie (IEC c (L span lbl)) = concatM $ makeNode lbl span : case lbl of-      FieldLabel _ _ n ->-        [ toHie $ C (IEThing c) $ L span n-        ]-
− src-ghc88/Development/IDE/GHC/HieBin.hs
@@ -1,389 +0,0 @@-{--Binary serialization for .hie files.--}-{- HLINT ignore -}-{-# LANGUAGE ScopedTypeVariables #-}-module Development.IDE.GHC.HieBin ( readHieFile, readHieFileWithVersion, HieHeader, writeHieFile, HieName(..), toHieName, HieFileResult(..), hieMagic,NameCacheUpdater(..)) where--import Config                     ( cProjectVersion )-import Binary-import BinIface                   ( getDictFastString )-import FastMutInt-import FastString                 ( FastString )-import Module                     ( Module )-import Name-import NameCache-import Outputable-import PrelInfo-import SrcLoc-import UniqSupply                 ( takeUniqFromSupply )-import Util                       ( maybeRead )-import Unique-import UniqFM-import IfaceEnv--import qualified Data.Array as A-import Data.IORef-import Data.ByteString            ( ByteString )-import qualified Data.ByteString  as BS-import qualified Data.ByteString.Char8 as BSC-import Data.List                  ( mapAccumR )-import Data.Word                  ( Word8, Word32 )-import Control.Monad              ( replicateM, when )-import System.Directory           ( createDirectoryIfMissing )-import System.FilePath            ( takeDirectory )--import HieTypes---- | `Name`'s get converted into `HieName`'s before being written into @.hie@--- files. See 'toHieName' and 'fromHieName' for logic on how to convert between--- these two types.-data HieName-  = ExternalName !Module !OccName !SrcSpan-  | LocalName !OccName !SrcSpan-  | KnownKeyName !Unique-  deriving (Eq)--instance Ord HieName where-  compare (ExternalName a b c) (ExternalName d e f) = compare (a,b,c) (d,e,f)-  compare (LocalName a b) (LocalName c d) = compare (a,b) (c,d)-  compare (KnownKeyName a) (KnownKeyName b) = nonDetCmpUnique a b-    -- Not actually non determinstic as it is a KnownKey-  compare ExternalName{} _ = LT-  compare LocalName{} ExternalName{} = GT-  compare LocalName{} _ = LT-  compare KnownKeyName{} _ = GT--instance Outputable HieName where-  ppr (ExternalName m n sp) = text "ExternalName" <+> ppr m <+> ppr n <+> ppr sp-  ppr (LocalName n sp) = text "LocalName" <+> ppr n <+> ppr sp-  ppr (KnownKeyName u) = text "KnownKeyName" <+> ppr u---data HieSymbolTable = HieSymbolTable-  { hie_symtab_next :: !FastMutInt-  , hie_symtab_map  :: !(IORef (UniqFM (Int, HieName)))-  }--data HieDictionary = HieDictionary-  { hie_dict_next :: !FastMutInt -- The next index to use-  , hie_dict_map  :: !(IORef (UniqFM (Int,FastString))) -- indexed by FastString-  }--initBinMemSize :: Int-initBinMemSize = 1024*1024---- | The header for HIE files - Capital ASCII letters "HIE".-hieMagic :: [Word8]-hieMagic = [72,73,69]--hieMagicLen :: Int-hieMagicLen = length hieMagic--ghcVersion :: ByteString-ghcVersion = BSC.pack cProjectVersion--putBinLine :: BinHandle -> ByteString -> IO ()-putBinLine bh xs = do-  mapM_ (putByte bh) $ BS.unpack xs-  putByte bh 10 -- newline char---- | Write a `HieFile` to the given `FilePath`, with a proper header and--- symbol tables for `Name`s and `FastString`s-writeHieFile :: FilePath -> HieFile -> IO ()-writeHieFile hie_file_path hiefile = do-  bh0 <- openBinMem initBinMemSize--  -- Write the header: hieHeader followed by the-  -- hieVersion and the GHC version used to generate this file-  mapM_ (putByte bh0) hieMagic-  putBinLine bh0 $ BSC.pack $ show hieVersion-  putBinLine bh0 $ ghcVersion--  -- remember where the dictionary pointer will go-  dict_p_p <- tellBin bh0-  put_ bh0 dict_p_p--  -- remember where the symbol table pointer will go-  symtab_p_p <- tellBin bh0-  put_ bh0 symtab_p_p--  -- Make some intial state-  symtab_next <- newFastMutInt-  writeFastMutInt symtab_next 0-  symtab_map <- newIORef emptyUFM-  let hie_symtab = HieSymbolTable {-                      hie_symtab_next = symtab_next,-                      hie_symtab_map  = symtab_map }-  dict_next_ref <- newFastMutInt-  writeFastMutInt dict_next_ref 0-  dict_map_ref <- newIORef emptyUFM-  let hie_dict = HieDictionary {-                      hie_dict_next = dict_next_ref,-                      hie_dict_map  = dict_map_ref }--  -- put the main thing-  let bh = setUserData bh0 $ newWriteState (putName hie_symtab)-                                           (putName hie_symtab)-                                           (putFastString hie_dict)-  put_ bh hiefile--  -- write the symtab pointer at the front of the file-  symtab_p <- tellBin bh-  putAt bh symtab_p_p symtab_p-  seekBin bh symtab_p--  -- write the symbol table itself-  symtab_next' <- readFastMutInt symtab_next-  symtab_map'  <- readIORef symtab_map-  putSymbolTable bh symtab_next' symtab_map'--  -- write the dictionary pointer at the front of the file-  dict_p <- tellBin bh-  putAt bh dict_p_p dict_p-  seekBin bh dict_p--  -- write the dictionary itself-  dict_next <- readFastMutInt dict_next_ref-  dict_map  <- readIORef dict_map_ref-  putDictionary bh dict_next dict_map--  -- and send the result to the file-  createDirectoryIfMissing True (takeDirectory hie_file_path)-  writeBinMem bh hie_file_path-  return ()--data HieFileResult-  = HieFileResult-  { hie_file_result_version :: Integer-  , hie_file_result_ghc_version :: ByteString-  , hie_file_result :: HieFile-  }--type HieHeader = (Integer, ByteString)---- | Read a `HieFile` from a `FilePath`. Can use--- an existing `NameCache`. Allows you to specify--- which versions of hieFile to attempt to read.--- `Left` case returns the failing header versions.-readHieFileWithVersion :: (HieHeader -> Bool) -> NameCacheUpdater -> FilePath -> IO (Either HieHeader HieFileResult)-readHieFileWithVersion readVersion ncu file = do-  bh0 <- readBinMem file--  (hieVersion, ghcVersion) <- readHieFileHeader file bh0--  if readVersion (hieVersion, ghcVersion)-  then do-    hieFile <- readHieFileContents bh0 ncu-    return $ Right (HieFileResult hieVersion ghcVersion hieFile)-  else return $ Left (hieVersion, ghcVersion)----- | Read a `HieFile` from a `FilePath`. Can use--- an existing `NameCache`.-readHieFile :: NameCacheUpdater -> FilePath -> IO HieFileResult-readHieFile ncu file = do--  bh0 <- readBinMem file--  (readHieVersion, ghcVersion) <- readHieFileHeader file bh0--  -- Check if the versions match-  when (readHieVersion /= hieVersion) $-    panic $ unwords ["readHieFile: hie file versions don't match for file:"-                    , file-                    , "Expected"-                    , show hieVersion-                    , "but got", show readHieVersion-                    ]-  hieFile <- readHieFileContents bh0 ncu-  return $ HieFileResult hieVersion ghcVersion hieFile--readBinLine :: BinHandle -> IO ByteString-readBinLine bh = BS.pack . reverse <$> loop []-  where-    loop acc = do-      char <- get bh :: IO Word8-      if char == 10 -- ASCII newline '\n'-      then return acc-      else loop (char : acc)--readHieFileHeader :: FilePath -> BinHandle -> IO HieHeader-readHieFileHeader file bh0 = do-  -- Read the header-  magic <- replicateM hieMagicLen (get bh0)-  version <- BSC.unpack <$> readBinLine bh0-  case maybeRead version of-    Nothing ->-      panic $ unwords ["readHieFileHeader: hieVersion isn't an Integer:"-                      , show version-                      ]-    Just readHieVersion -> do-      ghcVersion <- readBinLine bh0--      -- Check if the header is valid-      when (magic /= hieMagic) $-        panic $ unwords ["readHieFileHeader: headers don't match for file:"-                        , file-                        , "Expected"-                        , show hieMagic-                        , "but got", show magic-                        ]-      return (readHieVersion, ghcVersion)--readHieFileContents :: BinHandle -> NameCacheUpdater -> IO HieFile-readHieFileContents bh0 ncu = do--  dict  <- get_dictionary bh0--  -- read the symbol table so we are capable of reading the actual data-  bh1 <- do-      let bh1 = setUserData bh0 $ newReadState (error "getSymtabName")-                                               (getDictFastString dict)-      symtab <- get_symbol_table bh1-      let bh1' = setUserData bh1-               $ newReadState (getSymTabName symtab)-                              (getDictFastString dict)-      return bh1'--  -- load the actual data-  hiefile <- get bh1-  return hiefile-  where-    get_dictionary bin_handle = do-      dict_p <- get bin_handle-      data_p <- tellBin bin_handle-      seekBin bin_handle dict_p-      dict <- getDictionary bin_handle-      seekBin bin_handle data_p-      return dict--    get_symbol_table bh1 = do-      symtab_p <- get bh1-      data_p'  <- tellBin bh1-      seekBin bh1 symtab_p-      symtab <- getSymbolTable bh1 ncu-      seekBin bh1 data_p'-      return symtab--putFastString :: HieDictionary -> BinHandle -> FastString -> IO ()-putFastString HieDictionary { hie_dict_next = j_r,-                              hie_dict_map  = out_r}  bh f-  = do-    out <- readIORef out_r-    let unique = getUnique f-    case lookupUFM out unique of-        Just (j, _)  -> put_ bh (fromIntegral j :: Word32)-        Nothing -> do-           j <- readFastMutInt j_r-           put_ bh (fromIntegral j :: Word32)-           writeFastMutInt j_r (j + 1)-           writeIORef out_r $! addToUFM out unique (j, f)--putSymbolTable :: BinHandle -> Int -> UniqFM (Int,HieName) -> IO ()-putSymbolTable bh next_off symtab = do-  put_ bh next_off-  let names = A.elems (A.array (0,next_off-1) (nonDetEltsUFM symtab))-  mapM_ (putHieName bh) names--getSymbolTable :: BinHandle -> NameCacheUpdater -> IO SymbolTable-getSymbolTable bh ncu = do-  sz <- get bh-  od_names <- replicateM sz (getHieName bh)-  updateNameCache ncu $ \nc ->-    let arr = A.listArray (0,sz-1) names-        (nc', names) = mapAccumR fromHieName nc od_names-        in (nc',arr)--getSymTabName :: SymbolTable -> BinHandle -> IO Name-getSymTabName st bh = do-  i :: Word32 <- get bh-  return $ st A.! (fromIntegral i)--putName :: HieSymbolTable -> BinHandle -> Name -> IO ()-putName (HieSymbolTable next ref) bh name = do-  symmap <- readIORef ref-  case lookupUFM symmap name of-    Just (off, ExternalName mod occ (UnhelpfulSpan _))-      | isGoodSrcSpan (nameSrcSpan name) -> do-      let hieName = ExternalName mod occ (nameSrcSpan name)-      writeIORef ref $! addToUFM symmap name (off, hieName)-      put_ bh (fromIntegral off :: Word32)-    Just (off, LocalName _occ span)-      | notLocal (toHieName name) || nameSrcSpan name /= span -> do-      writeIORef ref $! addToUFM symmap name (off, toHieName name)-      put_ bh (fromIntegral off :: Word32)-    Just (off, _) -> put_ bh (fromIntegral off :: Word32)-    Nothing -> do-        off <- readFastMutInt next-        writeFastMutInt next (off+1)-        writeIORef ref $! addToUFM symmap name (off, toHieName name)-        put_ bh (fromIntegral off :: Word32)--  where-    notLocal :: HieName -> Bool-    notLocal LocalName{} = False-    notLocal _ = True----- ** Converting to and from `HieName`'s--toHieName :: Name -> HieName-toHieName name-  | isKnownKeyName name = KnownKeyName (nameUnique name)-  | isExternalName name = ExternalName (nameModule name)-                                       (nameOccName name)-                                       (nameSrcSpan name)-  | otherwise = LocalName (nameOccName name) (nameSrcSpan name)--fromHieName :: NameCache -> HieName -> (NameCache, Name)-fromHieName nc (ExternalName mod occ span) =-    let cache = nsNames nc-    in case lookupOrigNameCache cache mod occ of-         Just name-           | nameSrcSpan name == span -> (nc, name)-           | otherwise ->-             let name' = setNameLoc name span-                 new_cache = extendNameCache cache mod occ name'-             in ( nc{ nsNames = new_cache }, name' )-         Nothing ->-           let (uniq, us) = takeUniqFromSupply (nsUniqs nc)-               name       = mkExternalName uniq mod occ span-               new_cache  = extendNameCache cache mod occ name-           in ( nc{ nsUniqs = us, nsNames = new_cache }, name )-fromHieName nc (LocalName occ span) =-    let (uniq, us) = takeUniqFromSupply (nsUniqs nc)-        name       = mkInternalName uniq occ span-    in ( nc{ nsUniqs = us }, name )-fromHieName nc (KnownKeyName u) = case lookupKnownKeyName u of-    Nothing -> pprPanic "fromHieName:unknown known-key unique"-                        (ppr (unpkUnique u))-    Just n -> (nc, n)---- ** Reading and writing `HieName`'s--putHieName :: BinHandle -> HieName -> IO ()-putHieName bh (ExternalName mod occ span) = do-  putByte bh 0-  put_ bh (mod, occ, span)-putHieName bh (LocalName occName span) = do-  putByte bh 1-  put_ bh (occName, span)-putHieName bh (KnownKeyName uniq) = do-  putByte bh 2-  put_ bh $ unpkUnique uniq--getHieName :: BinHandle -> IO HieName-getHieName bh = do-  t <- getByte bh-  case t of-    0 -> do-      (modu, occ, span) <- get bh-      return $ ExternalName modu occ span-    1 -> do-      (occ, span) <- get bh-      return $ LocalName occ span-    2 -> do-      (c,i) <- get bh-      return $ KnownKeyName $ mkUnique c i-    _ -> panic "HieBin.getHieName: invalid tag"
src/Development/IDE/Core/Compile.hs view
@@ -2,6 +2,7 @@ -- SPDX-License-Identifier: Apache-2.0  {-# LANGUAGE RankNTypes #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE CPP #-} #include "ghc-api-version.h" @@ -12,19 +13,20 @@   , RunSimplifier(..)   , compileModule   , parseModule-  , parseHeader   , typecheckModule   , computePackageDeps   , addRelativeImport-  , mkTcModuleResult+  , mkHiFileResultCompile+  , mkHiFileResultNoCompile+  , generateObjectCode   , generateByteCode-  , generateAndWriteHieFile+  , generateHieAsts+  , writeHieFile   , writeHiFile   , getModSummaryFromImports   , loadHieFile   , loadInterface-  , loadDepModule-  , loadModuleHome+  , loadModulesHome   , setupFinderCache   , getDocsBatch   , lookupName@@ -38,32 +40,35 @@ import Development.IDE.Types.Diagnostics import Development.IDE.GHC.Orphans() import Development.IDE.GHC.Util-import qualified GHC.LanguageExtensions.Type as GHC import Development.IDE.Types.Options import Development.IDE.Types.Location -#if MIN_GHC_API_VERSION(8,6,0)+import Language.Haskell.LSP.Types (DiagnosticTag(..))+ import LoadIface (loadModuleInterface)-#endif+import DriverPhases+import HscTypes+import DriverPipeline hiding (unP)  import qualified Parser import           Lexer #if MIN_GHC_API_VERSION(8,10,0)+import Control.DeepSeq (force, rnf) #else+import Control.DeepSeq (rnf) import ErrUtils #endif  import           Finder-import           Development.IDE.GHC.Compat hiding (parseModule, typecheckModule)+import           Development.IDE.GHC.Compat hiding (parseModule, typecheckModule, writeHieFile) import qualified Development.IDE.GHC.Compat     as GHC import qualified Development.IDE.GHC.Compat     as Compat import           GhcMonad import           GhcPlugins                     as GHC hiding (fst3, (<>))-import qualified HeaderInfo                     as Hdr-import           HscMain                        (hscInteractive, hscSimplify)+import           HscMain                        (makeSimpleDetails, hscDesugar, hscTypecheckRename, hscSimplify, hscGenHardCode, hscInteractive) import           MkIface import           StringBuffer                   as SB-import           TcRnMonad (tct_id, TcTyThing(AGlobal, ATcId), initTc, initIfaceLoad, tcg_th_coreplugins)+import           TcRnMonad import           TcIface                        (typecheckIface) import           TidyPgm @@ -81,28 +86,27 @@ import           System.FilePath import           System.Directory import           System.IO.Extra-import Control.DeepSeq (rnf) import Control.Exception (evaluate)-import Exception (ExceptionMonad) import TcEnv (tcLookup)-import Data.Time (UTCTime)-+import Data.Time (UTCTime, getCurrentTime)+import Linker (unload)+import qualified GHC.LanguageExtensions as LangExt+import PrelNames+import HeaderInfo+import Maybes (orElse)  -- | Given a string buffer, return the string (after preprocessing) and the 'ParsedModule'. parseModule     :: IdeOptions     -> HscEnv-    -> [PackageName]     -> FilePath-    -> UTCTime-    -> Maybe SB.StringBuffer-    -> IO (IdeResult (StringBuffer, ParsedModule))-parseModule IdeOptions{..} env comp_pkgs filename modTime mbContents =+    -> ModSummary+    -> IO (IdeResult ParsedModule)+parseModule IdeOptions{..} env filename ms =     fmap (either (, Nothing) id) $-    evalGhcEnv env $ runExceptT $ do-        (contents, dflags) <- preprocessor env filename mbContents-        (diag, modu) <- parseFileContents env optPreprocessor dflags comp_pkgs filename modTime contents-        return (diag, Just (contents, modu))+    runExceptT $ do+        (diag, modu) <- parseFileContents env optPreprocessor filename ms+        return (diag, Just modu)   -- | Given a package identifier, what packages does it depend on@@ -119,37 +123,99 @@  typecheckModule :: IdeDefer                 -> HscEnv+                -> [Linkable] -- ^ linkables not to unload                 -> ParsedModule-                -> IO (IdeResult (HscEnv, TcModuleResult))-typecheckModule (IdeDefer defer) hsc pm = do-    fmap (either (, Nothing) (second Just . sequence) . sequence) $-      runGhcEnv hsc $-      catchSrcErrors "typecheck" $ do+                -> IO (IdeResult TcModuleResult)+typecheckModule (IdeDefer defer) hsc keep_lbls pm = do+    fmap (either (,Nothing) id) $+      catchSrcErrors (hsc_dflags hsc) "typecheck" $ do          let modSummary = pm_mod_summary pm             dflags = ms_hspp_opts modSummary -        modSummary' <- initPlugins modSummary+        modSummary' <- initPlugins hsc modSummary         (warnings, tcm) <- withWarnings "typecheck" $ \tweak ->-            GHC.typecheckModule $ enableTopLevelWarnings-                                $ demoteIfDefer pm{pm_mod_summary = tweak modSummary'}-        let errorPipeline = unDefer . hideDiag dflags+            tcRnModule hsc keep_lbls $ enableTopLevelWarnings+                                     $ enableUnnecessaryAndDeprecationWarnings+                                     $ demoteIfDefer pm{pm_mod_summary = tweak modSummary'}+        let errorPipeline = unDefer . hideDiag dflags . tagDiag             diags = map errorPipeline warnings-        tcm2 <- mkTcModuleResult tcm (any fst diags)-        return (map snd diags, tcm2)+            deferedError = any fst diags+        return (map snd diags, Just $ tcm{tmrDeferedError = deferedError})     where         demoteIfDefer = if defer then demoteTypeErrorsToWarnings else id -initPlugins :: GhcMonad m => ModSummary -> m ModSummary-initPlugins modSummary = do-#if MIN_GHC_API_VERSION(8,6,0)-    session <- getSession-    dflags <- liftIO $ initializePlugins session (ms_hspp_opts modSummary)-    return modSummary{ms_hspp_opts = dflags}+tcRnModule :: HscEnv -> [Linkable] -> ParsedModule -> IO TcModuleResult+tcRnModule hsc_env keep_lbls pmod = do+  let ms = pm_mod_summary pmod+      hsc_env_tmp = hsc_env { hsc_dflags = ms_hspp_opts ms }++  unload hsc_env_tmp keep_lbls+  (tc_gbl_env, mrn_info) <-+      hscTypecheckRename hsc_env_tmp ms $+                HsParsedModule { hpm_module = parsedSource pmod,+                                 hpm_src_files = pm_extra_src_files pmod,+                                 hpm_annotations = pm_annotations pmod }+  let rn_info = case mrn_info of+        Just x -> x+        Nothing -> error "no renamed info tcRnModule"+  pure (TcModuleResult pmod rn_info tc_gbl_env False)++mkHiFileResultNoCompile :: HscEnv -> TcModuleResult -> IO HiFileResult+mkHiFileResultNoCompile session tcm = do+  let hsc_env_tmp = session { hsc_dflags = ms_hspp_opts ms }+      ms = pm_mod_summary $ tmrParsed tcm+      tcGblEnv = tmrTypechecked tcm+  details <- makeSimpleDetails hsc_env_tmp tcGblEnv+  sf <- finalSafeMode (ms_hspp_opts ms) tcGblEnv+#if MIN_GHC_API_VERSION(8,10,0)+  iface <- mkIfaceTc session sf details tcGblEnv #else-    return modSummary+  (iface, _) <- mkIfaceTc session Nothing sf details tcGblEnv #endif+  let mod_info = HomeModInfo iface details Nothing+  pure $! HiFileResult ms mod_info +mkHiFileResultCompile+    :: HscEnv+    -> TcModuleResult+    -> ModGuts+    -> LinkableType -- ^ use object code or byte code?+    -> IO (IdeResult HiFileResult)+mkHiFileResultCompile session' tcm simplified_guts ltype = catchErrs $ do+  let session = session' { hsc_dflags = ms_hspp_opts ms }+      ms = pm_mod_summary $ tmrParsed tcm+  -- give variables unique OccNames+  (guts, details) <- tidyProgram session simplified_guts++  let genLinkable = case ltype of+        ObjectLinkable -> generateObjectCode+        BCOLinkable -> generateByteCode++  (diags, linkable) <- genLinkable session ms guts+#if MIN_GHC_API_VERSION(8,10,0)+  let !partial_iface = force (mkPartialIface session details simplified_guts)+  final_iface <- mkFullIface session partial_iface+#else+  (final_iface,_) <- mkIface session Nothing details simplified_guts+#endif+  let mod_info = HomeModInfo final_iface details linkable+  pure (diags, Just $! HiFileResult ms mod_info)++  where+    dflags = hsc_dflags session'+    source = "compile"+    catchErrs x = x `catches`+      [ Handler $ return . (,Nothing) . diagFromGhcException source dflags+      , Handler $ return . (,Nothing) . diagFromString source DsError (noSpan "<internal>")+      . (("Error during " ++ T.unpack source) ++) . show @SomeException+      ]++initPlugins :: HscEnv -> ModSummary -> IO ModSummary+initPlugins session modSummary = do+    dflags <- liftIO $ initializePlugins session $ ms_hspp_opts modSummary+    return modSummary{ms_hspp_opts = dflags}+ -- | Whether we should run the -O0 simplifier when generating core. -- -- This is required for template Haskell to work but we disable this in DAML.@@ -161,51 +227,70 @@ compileModule     :: RunSimplifier     -> HscEnv-    -> [(ModSummary, HomeModInfo)]-    -> TcModuleResult-    -> IO (IdeResult (SafeHaskellMode, CgGuts, ModDetails))-compileModule (RunSimplifier simplify) packageState deps tmr =+    -> ModSummary+    -> TcGblEnv+    -> IO (IdeResult ModGuts)+compileModule (RunSimplifier simplify) session ms tcg =     fmap (either (, Nothing) (second Just)) $-    evalGhcEnv packageState $-        catchSrcErrors "compile" $ do-            setupEnv (deps ++ [(tmrModSummary tmr, tmrModInfo tmr)])+        catchSrcErrors (hsc_dflags session) "compile" $ do+            (warnings,desugared_guts) <- withWarnings "compile" $ \tweak -> do+               let ms' = tweak ms+                   session' = session{ hsc_dflags = ms_hspp_opts ms'}+               desugar <- hscDesugar session' ms' tcg+               if simplify+               then do+                 plugins <- readIORef (tcg_th_coreplugins tcg)+                 hscSimplify session' plugins desugar+               else pure desugar+            return (map snd warnings, desugared_guts) -            let tm = tmrModule tmr-            session <- getSession-            (warnings,desugar) <- withWarnings "compile" $ \tweak -> do-                let pm = tm_parsed_module tm-                let pm' = pm{pm_mod_summary = tweak $ pm_mod_summary pm}-                let tm' = tm{tm_parsed_module  = pm'}-                GHC.dm_core_module <$> GHC.desugarModule tm'-            let tc_result = fst (tm_internals_ (tmrModule tmr))-            desugared_guts <--                if simplify-                    then do-                        plugins <- liftIO $ readIORef (tcg_th_coreplugins tc_result)-                        liftIO $ hscSimplify session plugins desugar-                    else pure desugar-            -- give variables unique OccNames-            (guts, details) <- liftIO $ tidyProgram session desugared_guts-            return (map snd warnings, (mg_safe_haskell desugar, guts, details))+generateObjectCode :: HscEnv -> ModSummary -> CgGuts -> IO (IdeResult Linkable)+generateObjectCode session summary guts = do+    fmap (either (, Nothing) (second Just)) $+          catchSrcErrors (hsc_dflags session) "object" $ do+              let dot_o =  ml_obj_file (ms_location summary)+                  mod = ms_mod summary+                  fp = replaceExtension dot_o "s"+              createDirectoryIfMissing True (takeDirectory fp)+              (warnings, dot_o_fp) <-+                withWarnings "object" $ \_tweak -> do+                      let summary' = _tweak summary+                          session' = session { hsc_dflags = (ms_hspp_opts summary') { outputFile = Just dot_o }}+                      (outputFilename, _mStub, _foreign_files) <- hscGenHardCode session' guts+#if MIN_GHC_API_VERSION(8,10,0)+                                (ms_location summary')+#else+                                summary'+#endif+                                fp+                      compileFile session' StopLn (outputFilename, Just (As False))+              let unlinked = DotO dot_o_fp+              -- Need time to be the modification time for recompilation checking+              t <- liftIO $ getModificationTime dot_o_fp+              let linkable = LM t mod [unlinked] -generateByteCode :: HscEnv -> [(ModSummary, HomeModInfo)] -> TcModuleResult -> CgGuts -> IO (IdeResult Linkable)-generateByteCode hscEnv deps tmr guts =+              pure (map snd warnings, linkable)++generateByteCode :: HscEnv -> ModSummary -> CgGuts -> IO (IdeResult Linkable)+generateByteCode hscEnv summary guts = do     fmap (either (, Nothing) (second Just)) $-    evalGhcEnv hscEnv $-      catchSrcErrors "bytecode" $ do-          setupEnv (deps ++ [(tmrModSummary tmr, tmrModInfo tmr)])-          session <- getSession-          (warnings, (_, bytecode, sptEntries)) <- withWarnings "bytecode" $ \tweak ->+          catchSrcErrors (hsc_dflags hscEnv) "bytecode" $ do+              (warnings, (_, bytecode, sptEntries)) <-+                withWarnings "bytecode" $ \_tweak -> do+                      let summary' = _tweak summary+                          session = hscEnv { hsc_dflags = ms_hspp_opts summary' }+                      hscInteractive session guts #if MIN_GHC_API_VERSION(8,10,0)-                liftIO $ hscInteractive session guts (GHC.ms_location $ tweak $ GHC.pm_mod_summary $ GHC.tm_parsed_module $ tmrModule tmr)+                                (ms_location summary') #else-                liftIO $ hscInteractive session guts (tweak $ GHC.pm_mod_summary $ GHC.tm_parsed_module $ tmrModule tmr)+                                summary' #endif-          let summary = pm_mod_summary $ tm_parsed_module $ tmrModule tmr-          let unlinked = BCOs bytecode sptEntries-          let linkable = LM (ms_hs_date summary) (ms_mod summary) [unlinked]-          pure (map snd warnings, linkable)+              let unlinked = BCOs bytecode sptEntries+              time <- liftIO getCurrentTime+              let linkable = LM time (ms_mod summary) [unlinked] +              pure (map snd warnings, linkable)+ demoteTypeErrorsToWarnings :: ParsedModule -> ParsedModule demoteTypeErrorsToWarnings =   (update_pm_mod_summary . update_hspp_opts) demoteTEsToWarns where@@ -247,32 +332,59 @@   warn2err = T.intercalate ": error:" . T.splitOn ": warning:"  hideDiag :: DynFlags -> (WarnReason, FileDiagnostic) -> (WarnReason, FileDiagnostic)-hideDiag originalFlags (Reason warning, (nfp, _sh, fd))-  | not (wopt warning originalFlags) = (Reason warning, (nfp, HideDiag, fd))+hideDiag originalFlags (Reason warning, (nfp, sh, fd))+  | not (wopt warning originalFlags)+  = if null (_tags fd)+       then (Reason warning, (nfp, HideDiag, fd))+            -- keep the diagnostic if it has an associated tag+       else (Reason warning, (nfp, sh, fd{_severity = Just DsInfo})) hideDiag _originalFlags t = t -addRelativeImport :: NormalizedFilePath -> ModuleName -> DynFlags -> DynFlags-addRelativeImport fp modu dflags = dflags-    {importPaths = nubOrd $ maybeToList (moduleImportPath fp modu) ++ importPaths dflags}+enableUnnecessaryAndDeprecationWarnings :: ParsedModule -> ParsedModule+enableUnnecessaryAndDeprecationWarnings =+  (update_pm_mod_summary . update_hspp_opts)+  (foldr (.) id [(`wopt_set` flag) | flag <- unnecessaryDeprecationWarningFlags]) -mkTcModuleResult-    :: GhcMonad m-    => TypecheckedModule-    -> Bool-    -> m TcModuleResult-mkTcModuleResult tcm upgradedError = do-    session <- getSession-    let sf = modInfoSafe (tm_checked_module_info tcm)+-- | Warnings which lead to a diagnostic tag+unnecessaryDeprecationWarningFlags :: [WarningFlag]+unnecessaryDeprecationWarningFlags+  = [ Opt_WarnUnusedTopBinds+    , Opt_WarnUnusedLocalBinds+    , Opt_WarnUnusedPatternBinds+    , Opt_WarnUnusedImports+    , Opt_WarnUnusedMatches+    , Opt_WarnUnusedTypePatterns+    , Opt_WarnUnusedForalls #if MIN_GHC_API_VERSION(8,10,0)-    iface <- liftIO $ mkIfaceTc session sf details tcGblEnv-#else-    (iface, _) <- liftIO $ mkIfaceTc session Nothing sf details tcGblEnv+    , Opt_WarnUnusedRecordWildcards #endif-    let mod_info = HomeModInfo iface details Nothing-    return $ TcModuleResult tcm mod_info upgradedError+    , Opt_WarnInaccessibleCode+    , Opt_WarnWarningsDeprecations+    ]++-- | Add a unnecessary/deprecated tag to the required diagnostics.+tagDiag :: (WarnReason, FileDiagnostic) -> (WarnReason, FileDiagnostic)+tagDiag (Reason warning, (nfp, sh, fd))+  | Just tag <- requiresTag warning+  = (Reason warning, (nfp, sh, fd { _tags = addTag tag (_tags fd) }))   where-    (tcGblEnv, details) = tm_internals_ tcm+    requiresTag :: WarningFlag -> Maybe DiagnosticTag+    requiresTag Opt_WarnWarningsDeprecations+      = Just DtDeprecated+    requiresTag wflag  -- deprecation was already considered above+      | wflag `elem` unnecessaryDeprecationWarningFlags+      = Just DtUnnecessary+    requiresTag _ = Nothing+    addTag :: DiagnosticTag -> Maybe (List DiagnosticTag) -> Maybe (List DiagnosticTag)+    addTag t Nothing          = Just (List [t])+    addTag t (Just (List ts)) = Just (List (t : ts))+-- other diagnostics are left unaffected+tagDiag t = t +addRelativeImport :: NormalizedFilePath -> ModuleName -> DynFlags -> DynFlags+addRelativeImport fp modu dflags = dflags+    {importPaths = nubOrd $ maybeToList (moduleImportPath fp modu) ++ importPaths dflags}+ atomicFileWrite :: FilePath -> (FilePath -> IO a) -> IO () atomicFileWrite targetPath write = do   let dir = takeDirectory targetPath@@ -280,30 +392,32 @@   (tempFilePath, cleanUp) <- newTempFileWithin dir   (write tempFilePath >> renameFile tempFilePath targetPath) `onException` cleanUp -generateAndWriteHieFile :: HscEnv -> TypecheckedModule -> BS.ByteString -> IO [FileDiagnostic]-generateAndWriteHieFile hscEnv tcm source =-  handleGenerationErrors dflags "extended interface generation" $ do-    case tm_renamed_source tcm of-      Just rnsrc -> do-        hf <- runHsc hscEnv $-          GHC.mkHieFile mod_summary (fst $ tm_internals_ tcm) rnsrc source-        atomicFileWrite targetPath $ flip GHC.writeHieFile hf-      _ ->-        return ()+generateHieAsts :: HscEnv -> TcModuleResult -> IO ([FileDiagnostic], Maybe (HieASTs Type))+generateHieAsts hscEnv tcm =+  handleGenerationErrors' dflags "extended interface generation" $ runHsc hscEnv $+    Just <$> GHC.enrichHie (tcg_binds $ tmrTypechecked tcm) (tmrRenamed tcm)   where+    dflags = hsc_dflags hscEnv++writeHieFile :: HscEnv -> ModSummary -> [GHC.AvailInfo] -> HieASTs Type -> BS.ByteString -> IO [FileDiagnostic]+writeHieFile hscEnv mod_summary exports ast source =+  handleGenerationErrors dflags "extended interface write/compression" $ do+    hf <- runHsc hscEnv $+      GHC.mkHieFile' mod_summary exports ast source+    atomicFileWrite targetPath $ flip GHC.writeHieFile hf+  where     dflags       = hsc_dflags hscEnv-    mod_summary  = pm_mod_summary $ tm_parsed_module tcm     mod_location = ms_location mod_summary     targetPath   = Compat.ml_hie_file mod_location -writeHiFile :: HscEnv -> TcModuleResult -> IO [FileDiagnostic]+writeHiFile :: HscEnv -> HiFileResult -> IO [FileDiagnostic] writeHiFile hscEnv tc =   handleGenerationErrors dflags "interface generation" $ do     atomicFileWrite targetPath $ \fp ->       writeIfaceFile dflags fp modIface   where-    modIface = hm_iface $ tmrModInfo tc-    targetPath = ml_hi_file $ ms_location $ tmrModSummary tc+    modIface = hm_iface $ hirHomeMod tc+    targetPath = ml_hi_file $ ms_location $ hirModSummary tc     dflags = hsc_dflags hscEnv  handleGenerationErrors :: DynFlags -> T.Text -> IO () -> IO [FileDiagnostic]@@ -314,168 +428,108 @@     . (("Error during " ++ T.unpack source) ++) . show @SomeException     ] ---- | Setup the environment that GHC needs according to our--- best understanding (!)------ This involves setting up the finder cache and populating the--- HPT.-setupEnv :: GhcMonad m => [(ModSummary, HomeModInfo)] -> m ()-setupEnv tms = do-    setupFinderCache (map fst tms)-    -- load dependent modules, which must be in topological order.-    modifySession $ \e ->-      foldl' (\e (_, hmi) -> loadModuleHome hmi e) e tms+handleGenerationErrors' :: DynFlags -> T.Text -> IO (Maybe a) -> IO ([FileDiagnostic], Maybe a)+handleGenerationErrors' dflags source action =+  fmap ([],) action `catches`+    [ Handler $ return . (,Nothing) . diagFromGhcException source dflags+    , Handler $ return . (,Nothing) . diagFromString source DsError (noSpan "<internal>")+    . (("Error during " ++ T.unpack source) ++) . show @SomeException+    ]  -- | Initialise the finder cache, dependencies should be topologically -- sorted.-setupFinderCache :: GhcMonad m => [ModSummary] -> m ()-setupFinderCache mss = do-    session <- getSession--    -- set the target and module graph in the session-    let graph = mkModuleGraph mss-    setSession session { hsc_mod_graph = graph }+setupFinderCache :: [ModSummary] -> HscEnv -> IO HscEnv+setupFinderCache mss session = do      -- Make modules available for others that import them,     -- by putting them in the finder cache.     let ims  = map (InstalledModule (thisInstalledUnitId $ hsc_dflags session) . moduleName . ms_mod) mss         ifrs = zipWith (\ms -> InstalledFound (ms_location ms)) mss ims+    -- set the target and module graph in the session+        graph = mkModuleGraph mss+     -- We have to create a new IORef here instead of modifying the existing IORef as     -- it is shared between concurrent compilations.-    prevFinderCache <- liftIO $ readIORef $ hsc_FC session+    prevFinderCache <- readIORef $ hsc_FC session     let newFinderCache =             foldl'                 (\fc (im, ifr) -> GHC.extendInstalledModuleEnv fc im ifr) prevFinderCache                 $ zip ims ifrs-    newFinderCacheVar <- liftIO $ newIORef $! newFinderCache-    modifySession $ \s -> s { hsc_FC = newFinderCacheVar }+    newFinderCacheVar <- newIORef $! newFinderCache +    pure $ session { hsc_FC = newFinderCacheVar, hsc_mod_graph = graph } --- | Load a module, quickly. Input doesn't need to be desugared.++-- | Load modules, quickly. Input doesn't need to be desugared. -- A module must be loaded before dependent modules can be typechecked. -- This variant of loadModuleHome will *never* cause recompilation, it just -- modifies the session.--- -- The order modules are loaded is important when there are hs-boot files. -- In particular you should make sure to load the .hs version of a file after the -- .hs-boot version.-loadModuleHome-    :: HomeModInfo+loadModulesHome+    :: [HomeModInfo]     -> HscEnv     -> HscEnv-loadModuleHome mod_info e =-    e { hsc_HPT = addToHpt (hsc_HPT e) mod_name mod_info }-    where-      mod_name = moduleName $ mi_module $ hm_iface mod_info---- | Load module interface.-loadDepModuleIO :: ModIface -> Maybe Linkable -> HscEnv -> IO HscEnv-loadDepModuleIO iface linkable hsc = do-    details <- liftIO $ fixIO $ \details -> do-        let hsc' = hsc { hsc_HPT = addToHpt (hsc_HPT hsc) mod (HomeModInfo iface details linkable) }-        initIfaceLoad hsc' (typecheckIface iface)-    let mod_info = HomeModInfo iface details linkable-    return $ loadModuleHome mod_info hsc+loadModulesHome mod_infos e =+    e { hsc_HPT = addListToHpt (hsc_HPT e) [(mod_name x, x) | x <- mod_infos]+      , hsc_type_env_var = Nothing }     where-      mod = moduleName $ mi_module iface--loadDepModule :: GhcMonad m => ModIface -> Maybe Linkable -> m ()-loadDepModule iface linkable = do-  e <- getSession-  e' <- liftIO $ loadDepModuleIO iface linkable e-  setSession e'---- | GhcMonad function to chase imports of a module given as a StringBuffer. Returns given module's--- name and its imports.-getImportsParsed ::  DynFlags ->-               GHC.ParsedSource ->-               Either [FileDiagnostic] (GHC.ModuleName, [(Bool, (Maybe FastString, Located GHC.ModuleName))])-getImportsParsed dflags (L loc parsed) = do-  let modName = maybe (GHC.mkModuleName "Main") GHC.unLoc $ GHC.hsmodName parsed--  -- most of these corner cases are also present in https://hackage.haskell.org/package/ghc-8.6.1/docs/src/HeaderInfo.html#getImports-  -- but we want to avoid parsing the module twice-  let implicit_prelude = xopt GHC.ImplicitPrelude dflags-      implicit_imports = Hdr.mkPrelImports modName loc implicit_prelude $ GHC.hsmodImports parsed--  -- filter out imports that come from packages-  return (modName, [(ideclSource i, (fmap sl_fs $ ideclPkgQual i, ideclName i))-    | i <- map GHC.unLoc $ implicit_imports ++ GHC.hsmodImports parsed-    , GHC.moduleNameString (GHC.unLoc $ ideclName i) /= "GHC.Prim"-    ])+      mod_name = moduleName . mi_module . hm_iface  withBootSuffix :: HscSource -> ModLocation -> ModLocation withBootSuffix HsBootFile = addBootSuffixLocnOut withBootSuffix _ = id --- | Produce a module summary from a StringBuffer.-getModSummaryFromBuffer-    :: GhcMonad m-    => FilePath-    -> UTCTime-    -> DynFlags-    -> GHC.ParsedSource-    -> StringBuffer-    -> ExceptT [FileDiagnostic] m ModSummary-getModSummaryFromBuffer fp modTime dflags parsed contents = do-  (modName, imports) <- liftEither $ getImportsParsed dflags parsed--  modLoc <- liftIO $ mkHomeModLocation dflags modName fp-  let InstalledUnitId unitId = thisInstalledUnitId dflags-  return $ ModSummary-    { ms_mod          = mkModule (fsToUnitId unitId) modName-    , ms_location     = withBootSuffix sourceType modLoc-    , ms_hs_date      = modTime-    , ms_textual_imps = [imp | (False, imp) <- imports]-    , ms_hspp_file    = fp-    , ms_hspp_opts    = dflags-        -- NOTE: It's /vital/ we set the 'StringBuffer' here, to give any-        -- registered GHC plugins access to the /updated/ in-memory content-        -- of a module being edited. Without this line, any plugin wishing to-        -- parse an input module and perform operations on the /current/ state-        -- of a file wouldn't work properly, as it would \"see\" a stale view of-        -- the file (i.e., the on-disk content of the latter).-    , ms_hspp_buf     = Just contents--    -- defaults:-    , ms_hsc_src      = sourceType-    , ms_obj_date     = Nothing-    , ms_iface_date   = Nothing-#if MIN_GHC_API_VERSION(8,8,0)-    , ms_hie_date     = Nothing-#endif-    , ms_srcimps      = [imp | (True, imp) <- imports]-    , ms_parsed_mod   = Nothing-    }-    where-      sourceType = if "-boot" `isSuffixOf` takeExtension fp then HsBootFile else HsSrcFile- -- | Given a buffer, env and filepath, produce a module summary by parsing only the imports. --   Runs preprocessors as needed. getModSummaryFromImports-  :: (HasDynFlags m, ExceptionMonad m, MonadIO m)-  => HscEnv+  :: HscEnv   -> FilePath   -> UTCTime   -> Maybe SB.StringBuffer-  -> ExceptT [FileDiagnostic] m ModSummary+  -> ExceptT [FileDiagnostic] IO (ModSummary,[LImportDecl GhcPs]) getModSummaryFromImports env fp modTime contents = do     (contents, dflags) <- preprocessor env fp contents-    (srcImports, textualImports, L _ moduleName) <--        ExceptT $ liftIO $ first (diagFromErrMsgs "parser" dflags) <$> GHC.getHeaderImports dflags contents fp fp +    -- The warns will hopefully be reported when we actually parse the module+    (_warns, L main_loc hsmod) <- parseHeader dflags fp contents++    -- Copied from `HeaderInfo.getImports`, but we also need to keep the parsed imports+    let mb_mod = hsmodName hsmod+        imps = hsmodImports hsmod++        mod = fmap unLoc mb_mod `orElse` mAIN_NAME++        (src_idecls, ord_idecls) = partition (ideclSource.unLoc) imps++        -- GHC.Prim doesn't exist physically, so don't go looking for it.+        ordinary_imps = filter ((/= moduleName gHC_PRIM) . unLoc+                                . ideclName . unLoc)+                               ord_idecls++        implicit_prelude = xopt LangExt.ImplicitPrelude dflags+        implicit_imports = mkPrelImports mod main_loc+                                         implicit_prelude imps+        convImport (L _ i) = (fmap sl_fs (ideclPkgQual i)+                                         , ideclName i)++        srcImports = map convImport src_idecls+        textualImports = map convImport (implicit_imports ++ ordinary_imps)++        allImps = implicit_imports ++ imps+     -- Force bits that might keep the string buffer and DynFlags alive unnecessarily     liftIO $ evaluate $ rnf srcImports     liftIO $ evaluate $ rnf textualImports -    modLoc <- liftIO $ mkHomeModLocation dflags moduleName fp+    modLoc <- liftIO $ mkHomeModLocation dflags mod fp -    let mod = mkModule (thisPackage dflags) moduleName+    let modl = mkModule (thisPackage dflags) mod         sourceType = if "-boot" `isSuffixOf` takeExtension fp then HsBootFile else HsSrcFile         summary =             ModSummary-                { ms_mod          = mod+                { ms_mod          = modl #if MIN_GHC_API_VERSION(8,8,0)                 , ms_hie_date     = Nothing #endif@@ -492,11 +546,11 @@                 , ms_srcimps      = srcImports                 , ms_textual_imps = textualImports                 }-    return summary+    return (summary, allImps)  -- | Parse only the module header parseHeader-       :: GhcMonad m+       :: Monad m        => DynFlags -- ^ flags to use        -> FilePath  -- ^ the filename (for source locations)        -> SB.StringBuffer -- ^ Haskell module source text (full Unicode is supported)@@ -530,18 +584,17 @@  -- | Given a buffer, flags, and file path, produce a -- parsed module (or errors) and any parse warnings. Does not run any preprocessors+-- ModSummary must contain the (preprocessed) contents of the buffer parseFileContents-       :: GhcMonad m-       => HscEnv+       :: HscEnv        -> (GHC.ParsedSource -> IdePreprocessedSource)-       -> DynFlags -- ^ flags to use-       -> [PackageName] -- ^ The package imports to ignore        -> FilePath  -- ^ the filename (for source locations)-       -> UTCTime   -- ^ the modification timestamp-       -> SB.StringBuffer -- ^ Haskell module source text (full Unicode is supported)-       -> ExceptT [FileDiagnostic] m ([FileDiagnostic], ParsedModule)-parseFileContents env customPreprocessor dflags comp_pkgs filename modTime contents = do+       -> ModSummary+       -> ExceptT [FileDiagnostic] IO ([FileDiagnostic], ParsedModule)+parseFileContents env customPreprocessor filename ms = do    let loc  = mkRealSrcLoc (mkFastString filename) 1 1+       dflags = ms_hspp_opts ms+       contents = fromJust $ ms_hspp_buf ms    case unP Parser.parseModule (mkPState dflags contents loc) of #if MIN_GHC_API_VERSION(8,10,0)      PFailed pst -> throwE $ diagFromErrMsgs "parser" dflags $ getErrorMessages pst dflags@@ -571,35 +624,49 @@                 -- Ok, we got here. It's safe to continue.                let IdePreprocessedSource preproc_warns errs parsed = customPreprocessor rdr_module-               unless (null errs) $ throwE $ diagFromStrings "parser" DsError errs-               let parsed' = removePackageImports comp_pkgs parsed++               unless (null errs) $+                  throwE $ diagFromStrings "parser" DsError errs+                let preproc_warnings = diagFromStrings "parser" DsWarning preproc_warns-               ms <- getModSummaryFromBuffer filename modTime dflags parsed' contents-               parsed'' <- liftIO $ applyPluginsParsedResultAction env dflags ms hpm_annotations parsed+               parsed' <- liftIO $ applyPluginsParsedResultAction env dflags ms hpm_annotations parsed++               -- To get the list of extra source files, we take the list+               -- that the parser gave us,+               --   - eliminate files beginning with '<'.  gcc likes to use+               --     pseudo-filenames like "<built-in>" and "<command-line>"+               --   - normalise them (eliminate differences between ./f and f)+               --   - filter out the preprocessed source file+               --   - filter out anything beginning with tmpdir+               --   - remove duplicates+               --   - filter out the .hs/.lhs source filename if we have one+               --+               let n_hspp  = normalise filename+                   srcs0 = nubOrd $ filter (not . (tmpDir dflags `isPrefixOf`))+                                  $ filter (/= n_hspp)+                                  $ map normalise+                                  $ filter (not . isPrefixOf "<")+                                  $ map unpackFS+                                  $ srcfiles pst+                   srcs1 = case ml_hs_file (ms_location ms) of+                             Just f  -> filter (/= normalise f) srcs0+                             Nothing -> srcs0++               -- sometimes we see source files from earlier+               -- preprocessing stages that cannot be found, so just+               -- filter them out:+               srcs2 <- liftIO $ filterM doesFileExist srcs1+                let pm =                      ParsedModule {                          pm_mod_summary = ms-                       , pm_parsed_source = parsed''-                       , pm_extra_src_files=[] -- src imports not allowed+                       , pm_parsed_source = parsed'+                       , pm_extra_src_files = srcs2                        , pm_annotations = hpm_annotations                       }                    warnings = diagFromErrMsgs "parser" dflags warns                pure (warnings ++ preproc_warnings, pm) --- | After parsing the module remove all package imports referring to--- these packages as we have already dealt with what they map to.-removePackageImports :: [PackageName] -> GHC.ParsedSource -> GHC.ParsedSource-removePackageImports pkgs (L l h@HsModule {hsmodImports} ) = L l (h { hsmodImports = imports' })-  where-    imports' = map do_one_import hsmodImports-    do_one_import (L l i@ImportDecl{ideclPkgQual}) =-      case PackageName . sl_fs <$> ideclPkgQual of-        Just pn | pn `elem` pkgs -> L l (i { ideclPkgQual = Nothing })-        _ -> L l i-#if MIN_GHC_API_VERSION(8,6,0)-    do_one_import l = l-#endif- loadHieFile :: Compat.NameCacheUpdater -> FilePath -> IO GHC.HieFile loadHieFile ncu f = do   GHC.hie_file_result <$> GHC.readHieFile ncu f@@ -611,12 +678,13 @@   :: MonadIO m => HscEnv   -> ModSummary   -> SourceModified-  -> m ([FileDiagnostic], Maybe HiFileResult) -- ^ Action to regenerate an interface+  -> Maybe LinkableType+  -> (Maybe LinkableType -> m ([FileDiagnostic], Maybe HiFileResult)) -- ^ Action to regenerate an interface   -> m ([FileDiagnostic], Maybe HiFileResult)-loadInterface session ms sourceMod regen = do+loadInterface session ms sourceMod linkableNeeded regen = do     res <- liftIO $ checkOldIface session ms sourceMod Nothing     case res of-          (UpToDate, Just x)+          (UpToDate, Just iface)             -- If the module used TH splices when it was last             -- compiled, then the recompilation check is not             -- accurate enough (https://gitlab.haskell.org/ghc/ghc/-/issues/481)@@ -631,20 +699,39 @@             -- nothing at all has changed. Stability is just             -- the same check that make is doing for us in             -- one-shot mode.-            | not (mi_used_th x) || SourceUnmodifiedAndStable == sourceMod-            -> return ([], Just $ HiFileResult ms x)-          (_reason, _) -> regen+            | not (mi_used_th iface) || SourceUnmodifiedAndStable == sourceMod+            -> do+             linkable <- case linkableNeeded of+               Just ObjectLinkable -> liftIO $ findObjectLinkableMaybe (ms_mod ms) (ms_location ms)+               _ -> pure Nothing +             -- We don't need to regenerate if the object is up do date, or we don't need one+             let objUpToDate = isNothing linkableNeeded || case linkable of+                   Nothing -> False+                   Just (LM obj_time _ _) -> obj_time > ms_hs_date ms+             if objUpToDate+             then do+               hmi <- liftIO $ mkDetailsFromIface session iface linkable+               return ([], Just $ HiFileResult ms hmi)+             else regen linkableNeeded+          (_reason, _) -> regen linkableNeeded++mkDetailsFromIface :: HscEnv -> ModIface -> Maybe Linkable -> IO HomeModInfo+mkDetailsFromIface session iface linkable = do+  details <- liftIO $ fixIO $ \details -> do+    let hsc' = session { hsc_HPT = addToHpt (hsc_HPT session) (moduleName $ mi_module iface) (HomeModInfo iface details linkable) }+    initIfaceLoad hsc' (typecheckIface iface)+  return (HomeModInfo iface details linkable)+ -- | Non-interactive, batch version of 'InteractiveEval.getDocs'. --   The interactive paths create problems in ghc-lib builds --- and leads to fun errors like "Cannot continue after interface file error".-getDocsBatch :: GhcMonad m-        => Module  -- ^ a moudle where the names are in scope-        -> [Name]-        -> m [Either String (Maybe HsDocString, Map.Map Int HsDocString)]-getDocsBatch _mod _names =-#if MIN_GHC_API_VERSION(8,6,0)-  withSession $ \hsc_env -> liftIO $ do+getDocsBatch+  :: HscEnv+  -> Module  -- ^ a moudle where the names are in scope+  -> [Name]+  -> IO [Either String (Maybe HsDocString, Map.Map Int HsDocString)]+getDocsBatch hsc_env _mod _names = do     ((_warns,errs), res) <- initTc hsc_env HsSrcFile False _mod fakeSpan $ forM _names $ \name ->         case nameModule_maybe name of             Nothing -> return (Left $ NameHasNoModule name)@@ -667,9 +754,6 @@       case nameSrcLoc n of         RealSrcLoc {} -> False         UnhelpfulLoc {} -> True-#else-    return []-#endif  fakeSpan :: RealSrcSpan fakeSpan = realSrcLocSpan $ mkRealSrcLoc (fsLit "<ghcide>") 1 1@@ -677,11 +761,11 @@ -- | Non-interactive, batch version of 'InteractiveEval.lookupNames'. --   The interactive paths create problems in ghc-lib builds --- and leads to fun errors like "Cannot continue after interface file error".-lookupName :: GhcMonad m-           => Module -- ^ A module where the Names are in scope+lookupName :: HscEnv+           -> Module -- ^ A module where the Names are in scope            -> Name-           -> m (Maybe TyThing)-lookupName mod name = withSession $ \hsc_env -> liftIO $ do+           -> IO (Maybe TyThing)+lookupName hsc_env mod name = do     (_messages, res) <- initTc hsc_env HsSrcFile False mod fakeSpan $ do         tcthing <- tcLookup name         case tcthing of
src/Development/IDE/Core/FileExists.hs view
@@ -5,36 +5,75 @@   ( fileExistsRules   , modifyFileExists   , getFileExists+  , watchedGlobs   ) where  import           Control.Concurrent.Extra import           Control.Exception import           Control.Monad.Extra-import qualified Data.Aeson                    as A import           Data.Binary import qualified Data.ByteString               as BS-import Data.HashMap.Strict (HashMap)+import           Data.HashMap.Strict (HashMap) import qualified Data.HashMap.Strict as HashMap import           Data.Maybe-import qualified Data.Text                     as T import           Development.IDE.Core.FileStore import           Development.IDE.Core.IdeConfiguration import           Development.IDE.Core.Shake import           Development.IDE.Types.Location-import           Development.IDE.Types.Logger+import           Development.IDE.Types.Options import           Development.Shake import           Development.Shake.Classes import           GHC.Generics-import           Language.Haskell.LSP.Messages-import           Language.Haskell.LSP.Types import           Language.Haskell.LSP.Types.Capabilities import qualified System.Directory as Dir+import qualified System.FilePath.Glob as Glob --- | A map for tracking the file existence+{- Note [File existence cache and LSP file watchers]+Some LSP servers provide the ability to register file watches with the client, which will then notify+us of file changes. Some clients can do this more efficiently than us, or generally it's a tricky+problem++Here we use this to maintain a quick lookup cache of file existence. How this works is:+- On startup, if the client supports it we ask it to watch some files (see below).+- When those files are created or deleted (we can also see change events, but we don't+care since we're only caching existence here) we get a notification from the client.+- The notification handler calls 'modifyFileExists' to update our cache.++This means that the cache will only ever work for the files we have set up a watcher for.+So we pick the set that we mostly care about and which are likely to change existence+most often: the source files of the project (as determined by the source extensions+we're configured to care about).++For all other files we fall back to the slow path.++There are a few failure modes to think about:++1. The client doesn't send us the notifications we asked for.++There's not much we can do in this case: the whole point is to rely on the client so+we don't do the checking ourselves. If the client lets us down, we will just be wrong.++2. Races between registering watchers, getting notifications, and file changes.++If a file changes status between us asking for notifications and the client actually+setting up the notifications, we might not get told about it. But this is a relatively+small race window around startup, so we just don't worry about it.++3. Using the fast path for files that we aren't watching.++In this case we will fall back to the slow path, but cache that result forever (since+it won't get invalidated by a client notification). To prevent this we guard the+fast path by a check that the path also matches our watching patterns.+-}++-- See Note [File existence cache and LSP file watchers]+-- | A map for tracking the file existence.+-- If a path maps to 'True' then it exists; if it maps to 'False' then it doesn't exist'; and+-- if it's not in the map then we don't know. type FileExistsMap = (HashMap NormalizedFilePath Bool) --- | A wrapper around a mutable 'FileExistsMap'+-- | A wrapper around a mutable 'FileExistsState' newtype FileExistsMapVar = FileExistsMapVar (Var FileExistsMap)  instance IsIdeGlobal FileExistsMapVar@@ -45,22 +84,16 @@   FileExistsMapVar v <- getIdeGlobalAction   liftIO $ readVar v --- | Modify the global store of file exists-modifyFileExistsAction :: (FileExistsMap -> IO FileExistsMap) -> Action ()-modifyFileExistsAction f = do-  FileExistsMapVar var <- getIdeGlobalAction-  liftIO $ modifyVar_ var f---- | Modify the global store of file exists+-- | Modify the global store of file exists. modifyFileExists :: IdeState -> [(NormalizedFilePath, Bool)] -> IO () modifyFileExists state changes = do   FileExistsMapVar var <- getIdeGlobalState state   changesMap           <- evaluate $ HashMap.fromList changes-   -- Masked to ensure that the previous values are flushed together with the map update   mask $ \_ -> do     -- update the map     modifyVar_ var $ evaluate . HashMap.union changesMap+    -- See Note [Invalidating file existence results]     -- flush previous values     mapM_ (deleteValue state GetFileExists . fst) changes @@ -87,86 +120,101 @@ getFileExists :: NormalizedFilePath -> Action Bool getFileExists fp = use_ GetFileExists fp +{- Note [Which files should we watch?]+The watcher system gives us a lot of flexibility: we can set multiple watchers, and they can all watch on glob+patterns.++We used to have a quite precise system, where we would register a watcher for a single file path only (and always)+when we actually looked to see if it existed. The downside of this is that it sends a *lot* of notifications+to the client (thousands on a large project), and this could lock up some clients like emacs+(https://github.com/emacs-lsp/lsp-mode/issues/2165).++Now we take the opposite approach: we register a single, quite general watcher that looks for all files+with a predefined set of extensions. The consequences are:+- The client will have to watch more files. This is usually not too bad, since the pattern is a single glob,+and the clients typically call out to an optimized implementation of file watching that understands globs.+- The client will send us a lot more notifications. This isn't too bad in practice, since although+we're watching a lot of files in principle, they don't get created or destroyed that often.+- We won't ever hit the fast lookup path for files which aren't in our watch pattern, since the only way+files get into our map is when the client sends us a notification about them because we're watching them.+This is fine so long as we're watching the files we check most often, i.e. source files.+-}++-- | The list of file globs that we ask the client to watch.+watchedGlobs :: IdeOptions -> [String]+watchedGlobs opts = [ "**/*." ++ extIncBoot | ext <- optExtensions opts, extIncBoot <- [ext, ext ++ "-boot"]]+ -- | Installs the 'getFileExists' rules. --   Provides a fast implementation if client supports dynamic watched files. --   Creates a global state as a side effect in that case.-fileExistsRules :: IO LspId -> ClientCapabilities -> VFSHandle -> Rules ()-fileExistsRules getLspId ClientCapabilities{_workspace} vfs = do+fileExistsRules :: ClientCapabilities -> VFSHandle -> Rules ()+fileExistsRules ClientCapabilities{_workspace} vfs = do   -- Create the global always, although it should only be used if we have fast rules.   -- But there's a chance someone will send unexpected notifications anyway,   -- e.g. https://github.com/digital-asset/ghcide/issues/599   addIdeGlobal . FileExistsMapVar =<< liftIO (newVar [])++  extras <- getShakeExtrasRules+  opts <- liftIO $ getIdeOptionsIO extras+  let globs = watchedGlobs opts+   case () of     _ | Just WorkspaceClientCapabilities{_didChangeWatchedFiles} <- _workspace       , Just DidChangeWatchedFilesClientCapabilities{_dynamicRegistration} <- _didChangeWatchedFiles       , Just True <- _dynamicRegistration-        -> fileExistsRulesFast getLspId vfs-      | otherwise -> do-        logger <- logger <$> getShakeExtrasRules-        liftIO $ logDebug logger "Warning: Client does not support watched files. Falling back to OS polling"-        fileExistsRulesSlow vfs+        -> fileExistsRulesFast globs vfs+      | otherwise -> fileExistsRulesSlow vfs ---   Requires an lsp client that provides WatchedFiles notifications.-fileExistsRulesFast :: IO LspId -> VFSHandle -> Rules ()-fileExistsRulesFast getLspId vfs =-  defineEarlyCutoff $ \GetFileExists file -> do-    isWf <- isWorkspaceFile file-    if isWf-        then fileExistsFast getLspId vfs file-        else fileExistsSlow vfs file+-- Requires an lsp client that provides WatchedFiles notifications, but assumes that this has already been checked.+fileExistsRulesFast :: [String] -> VFSHandle -> Rules ()+fileExistsRulesFast globs vfs =+    let patterns = fmap Glob.compile globs+        fpMatches fp = any (\p -> Glob.match p fp) patterns+    in defineEarlyCutoff $ \GetFileExists file -> do+        isWf <- isWorkspaceFile file+        if isWf && fpMatches (fromNormalizedFilePath file)+            then fileExistsFast vfs file+            else fileExistsSlow vfs file -fileExistsFast :: IO LspId -> VFSHandle -> NormalizedFilePath -> Action (Maybe BS.ByteString, ([a], Maybe Bool))-fileExistsFast getLspId vfs file = do-    fileExistsMap <- getFileExistsMapUntracked-    let mbFilesWatched = HashMap.lookup file fileExistsMap-    case mbFilesWatched of-      Just fv -> pure (summarizeExists fv, ([], Just fv))-      Nothing -> do-        exist                   <- liftIO $ getFileExistsVFS vfs file-        ShakeExtras { eventer } <- getShakeExtras+{- Note [Invalidating file existence results]+We have two mechanisms for getting file existence information:+- The file existence cache+- The VFS lookup -        -- add a listener for VFS Create/Delete file events,-        -- taking the FileExistsMap lock to prevent race conditions-        -- that would lead to multiple listeners for the same path-        modifyFileExistsAction $ \x -> do-          case HashMap.alterF (,Just exist) file x of-            (Nothing, x') -> do-            -- if the listener addition fails, we never recover. This is a bug.-              addListener eventer file-              return x'-            (Just _, _) ->-              -- if the key was already there, do nothing-              return x+Both of these affect the results of the 'GetFileExists' rule, so we need to make sure it+is invalidated properly when things change. -        pure (summarizeExists exist, ([], Just exist))- where-  addListener eventer fp = do-    reqId <- getLspId-    let-      req = RequestMessage "2.0" reqId ClientRegisterCapability regParams-      fpAsId       = T.pack $ fromNormalizedFilePath fp-      regParams    = RegistrationParams (List [registration])-      registration = Registration fpAsId-                                  WorkspaceDidChangeWatchedFiles-                                  (Just (A.toJSON regOptions))-      regOptions =-        DidChangeWatchedFilesRegistrationOptions { _watchers = List [watcher] }-      watchKind = WatchKind { _watchCreate = True, _watchChange = False, _watchDelete = True}-      watcher = FileSystemWatcher { _globPattern = fromNormalizedFilePath fp-                                  , _kind        = Just watchKind-                                  }+For the file existence cache, we manually flush the results of 'GetFileExists' when we+modify it (i.e. when a notification comes from the client). This is faster than using+'alwaysRerun' in the 'fileExistsFast', and we need it to be as fast as possible. -    eventer $ ReqRegisterCapability req+For the VFS lookup, however, we won't get prompted to flush the result, so instead+we use 'alwaysRerun'.+-} +fileExistsFast :: VFSHandle -> NormalizedFilePath -> Action (Maybe BS.ByteString, ([a], Maybe Bool))+fileExistsFast vfs file = do+    -- Could in principle use 'alwaysRerun' here, but it's too slwo, See Note [Invalidating file existence results]+    mp <- getFileExistsMapUntracked++    let mbFilesWatched = HashMap.lookup file mp+    exist <- case mbFilesWatched of+      Just exist -> pure exist+      -- We don't know about it: use the slow route.+      -- Note that we do *not* call 'fileExistsSlow', as that would trigger 'alwaysRerun'.+      Nothing -> liftIO $ getFileExistsVFS vfs file+    pure (summarizeExists exist, ([], Just exist))+ summarizeExists :: Bool -> Maybe BS.ByteString summarizeExists x = Just $ if x then BS.singleton 1 else BS.empty -fileExistsRulesSlow:: VFSHandle -> Rules ()+fileExistsRulesSlow :: VFSHandle -> Rules () fileExistsRulesSlow vfs =   defineEarlyCutoff $ \GetFileExists file -> fileExistsSlow vfs file  fileExistsSlow :: VFSHandle -> NormalizedFilePath -> Action (Maybe BS.ByteString, ([a], Maybe Bool)) fileExistsSlow vfs file = do+    -- See Note [Invalidating file existence results]     alwaysRerun     exist <- liftIO $ getFileExistsVFS vfs file     pure (summarizeExists exist, ([], Just exist))
src/Development/IDE/Core/FileStore.hs view
@@ -236,7 +236,7 @@  typecheckParentsAction :: NormalizedFilePath -> Action () typecheckParentsAction nfp = do-    revs <- reverseDependencies nfp <$> useNoFile_ GetModuleGraph+    revs <- transitiveReverseDependencies nfp <$> useNoFile_ GetModuleGraph     logger <- logger <$> getShakeExtras     let log = L.logInfo logger . T.pack     liftIO $ do
src/Development/IDE/Core/IdeConfiguration.hs view
@@ -2,17 +2,22 @@ module Development.IDE.Core.IdeConfiguration   ( IdeConfiguration(..)   , registerIdeConfiguration+  , getIdeConfiguration   , parseConfiguration   , parseWorkspaceFolder   , isWorkspaceFile   , modifyWorkspaceFolders+  , modifyClientSettings+  , getClientSettings   ) where  import           Control.Concurrent.Extra import           Control.Monad+import           Data.Hashable                  (Hashed, hashed, unhashed) import           Data.HashSet                   (HashSet, singleton) import           Data.Text                      (Text, isPrefixOf)+import           Data.Aeson.Types               (Value) import           Development.IDE.Core.Shake import           Development.IDE.Types.Location import           Development.Shake@@ -22,6 +27,7 @@ -- | Lsp client relevant configuration details data IdeConfiguration = IdeConfiguration   { workspaceFolders :: HashSet NormalizedUri+  , clientSettings :: Hashed (Maybe Value)   }   deriving (Show) @@ -39,13 +45,14 @@  parseConfiguration :: InitializeParams -> IdeConfiguration parseConfiguration InitializeParams {..} =-  IdeConfiguration { .. }+  IdeConfiguration {..}  where   workspaceFolders =     foldMap (singleton . toNormalizedUri) _rootUri       <> (foldMap . foldMap)            (singleton . parseWorkspaceFolder)            _workspaceFolders+  clientSettings = hashed _initializationOptions  parseWorkspaceFolder :: WorkspaceFolder -> NormalizedUri parseWorkspaceFolder =@@ -53,10 +60,20 @@  modifyWorkspaceFolders   :: IdeState -> (HashSet NormalizedUri -> HashSet NormalizedUri) -> IO ()-modifyWorkspaceFolders ide f = do+modifyWorkspaceFolders ide f = modifyIdeConfiguration ide f'+  where f' (IdeConfiguration ws initOpts) = IdeConfiguration (f ws) initOpts++modifyClientSettings+  :: IdeState -> (Maybe Value -> Maybe Value) -> IO ()+modifyClientSettings ide f = modifyIdeConfiguration ide f'+  where f' (IdeConfiguration ws clientSettings) =+            IdeConfiguration ws (hashed . f . unhashed $ clientSettings)++modifyIdeConfiguration+  :: IdeState -> (IdeConfiguration -> IdeConfiguration) -> IO ()+modifyIdeConfiguration ide f = do   IdeConfigurationVar var <- getIdeGlobalState ide-  IdeConfiguration    ws  <- readVar var-  writeVar var (IdeConfiguration (f ws))+  modifyVar_ var (pure . f)  isWorkspaceFile :: NormalizedFilePath -> Action Bool isWorkspaceFile file =@@ -69,3 +86,6 @@         any           (\root -> toText root `isPrefixOf` toText (filePathToUri' file))           workspaceFolders++getClientSettings :: Action (Maybe Value)+getClientSettings = unhashed . clientSettings <$> getIdeConfiguration
src/Development/IDE/Core/OfInterest.hs view
@@ -25,14 +25,14 @@ import qualified Data.Text as T import Data.Tuple.Extra import Development.Shake+import Control.Monad (void)  import Development.IDE.Types.Exports import Development.IDE.Types.Location import Development.IDE.Types.Logger import Development.IDE.Core.RuleTypes import Development.IDE.Core.Shake-import Data.Maybe (mapMaybe)-import GhcPlugins (HomeModInfo(hm_iface))+import Data.Maybe (catMaybes)  newtype OfInterestVar = OfInterestVar (Var (HashMap NormalizedFilePath FileOfInterestStatus)) instance IsIdeGlobal OfInterestVar@@ -90,15 +90,15 @@ --   Could be improved kick :: DelayedAction () kick = mkDelayedAction "kick" Debug $ do-    files <- getFilesOfInterest+    files <- HashMap.keys <$> getFilesOfInterest     ShakeExtras{progressUpdate} <- getShakeExtras     liftIO $ progressUpdate KickStarted      -- Update the exports map for the project-    results <-  uses TypeCheck $ HashMap.keys files+    (results, ()) <- par (uses GenerateCore files) (void $ uses GetHieAst files)     ShakeExtras{exportsMap} <- getShakeExtras-    let modIfaces = mapMaybe (fmap (hm_iface . tmrModInfo)) results-        !exportsMap' = createExportsMap modIfaces+    let mguts = catMaybes results+        !exportsMap' = createExportsMapMg mguts     liftIO $ modifyVar_ exportsMap $ evaluate . (exportsMap' <>)      liftIO $ progressUpdate KickCompleted
src/Development/IDE/Core/PositionMapping.hs view
@@ -74,7 +74,6 @@ -- a specific version newtype PositionMapping = PositionMapping PositionDelta - toCurrentRange :: PositionMapping -> Range -> Maybe Range toCurrentRange mapping (Range a b) =     Range <$> toCurrentPosition mapping a <*> toCurrentPosition mapping b@@ -121,7 +120,7 @@     | line > endLine || line == endLine && column >= endColumn =       -- Position is after the change so increase line and column number       -- as necessary.-      PositionExact $ Position newLine newColumn+      PositionExact $ newLine `seq` newColumn `seq` Position newLine newColumn     | otherwise = PositionRange start end     -- Position is in the region that was changed.     where@@ -131,10 +130,10 @@         newEndColumn           | linesNew == 0 = startColumn + T.length t           | otherwise = T.length $ T.takeWhileEnd (/= '\n') t-        !newColumn+        newColumn           | line == endLine = column + newEndColumn - endColumn           | otherwise = column-        !newLine = line + lineDiff+        newLine = line + lineDiff  fromCurrent :: Range -> T.Text -> Position -> PositionResult Position fromCurrent (Range start@(Position startLine startColumn) end@(Position endLine endColumn)) t (Position line column)@@ -144,7 +143,7 @@     | line > newEndLine || line == newEndLine && column >= newEndColumn =       -- Position is after the change so increase line and column number       -- as necessary.-      PositionExact $ Position newLine newColumn+      PositionExact $ newLine `seq` newColumn `seq` Position newLine newColumn     | otherwise = PositionRange start end     -- Position is in the region that was changed.     where@@ -155,7 +154,7 @@         newEndColumn           | linesNew == 0 = startColumn + T.length t           | otherwise = T.length $ T.takeWhileEnd (/= '\n') t-        !newColumn+        newColumn           | line == newEndLine = column - (newEndColumn - endColumn)           | otherwise = column-        !newLine = line - lineDiff+        newLine = line - lineDiff
src/Development/IDE/Core/Preprocessor.hs view
@@ -15,7 +15,6 @@ import System.FilePath import System.IO.Extra import Data.Char-import DynFlags import qualified HeaderInfo as Hdr import Development.IDE.Types.Diagnostics import Development.IDE.Types.Location@@ -31,18 +30,17 @@ import Outputable (showSDoc) import Control.DeepSeq (NFData(rnf)) import Control.Exception (evaluate)-import Control.Monad.IO.Class (MonadIO)-import Exception (ExceptionMonad)+import HscTypes (HscEnv(hsc_dflags))   -- | Given a file and some contents, apply any necessary preprocessors, --   e.g. unlit/cpp. Return the resulting buffer and the DynFlags it implies.-preprocessor :: (ExceptionMonad m, HasDynFlags m, MonadIO m) => HscEnv -> FilePath -> Maybe StringBuffer -> ExceptT [FileDiagnostic] m (StringBuffer, DynFlags)+preprocessor :: HscEnv -> FilePath -> Maybe StringBuffer -> ExceptT [FileDiagnostic] IO (StringBuffer, DynFlags) preprocessor env filename mbContents = do     -- Perform unlit     (isOnDisk, contents) <-         if isLiterate filename then do-            dflags <- getDynFlags+            let dflags = hsc_dflags env             newcontent <- liftIO $ runLhs dflags filename mbContents             return (False, newcontent)         else do@@ -58,7 +56,6 @@         else do             cppLogs <- liftIO $ newIORef []             contents <- ExceptT-                        $ liftIO                         $ (Right <$> (runCpp dflags {log_action = logAction cppLogs} filename                                        $ if isOnDisk then Nothing else Just contents))                             `catch`@@ -133,21 +130,20 @@  -- | This reads the pragma information directly from the provided buffer. parsePragmasIntoDynFlags-    :: (ExceptionMonad m, HasDynFlags m, MonadIO m)-    => HscEnv+    :: HscEnv     -> FilePath     -> SB.StringBuffer-    -> m (Either [FileDiagnostic] DynFlags)-parsePragmasIntoDynFlags env fp contents = catchSrcErrors "pragmas" $ do-    dflags0  <- getDynFlags+    -> IO (Either [FileDiagnostic] DynFlags)+parsePragmasIntoDynFlags env fp contents = catchSrcErrors dflags0 "pragmas" $ do     let opts = Hdr.getOptions dflags0 contents fp      -- Force bits that might keep the dflags and stringBuffer alive unnecessarily-    liftIO $ evaluate $ rnf opts+    evaluate $ rnf opts      (dflags, _, _) <- parseDynamicFilePragma dflags0 opts-    dflags' <- liftIO $ initializePlugins env dflags+    dflags' <- initializePlugins env dflags     return $ disableWarningsAsErrors dflags'+  where dflags0 = hsc_dflags env  -- | Run (unlit) literate haskell preprocessor on a file, or buffer if set runLhs :: DynFlags -> FilePath -> Maybe SB.StringBuffer -> IO SB.StringBuffer
src/Development/IDE/Core/RuleTypes.hs view
@@ -2,7 +2,8 @@ -- SPDX-License-Identifier: Apache-2.0  {-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE TypeFamilies               #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE DerivingStrategies #-}  -- | A Shake implementation of the compiler service, built --   using the "Shaker" abstraction layer for in-memory use.@@ -12,24 +13,32 @@     ) where  import           Control.DeepSeq+import Data.Aeson.Types (Value) import Data.Binary import           Development.IDE.Import.DependencyInformation-import Development.IDE.GHC.Compat+import Development.IDE.GHC.Compat hiding (HieFileResult) import Development.IDE.GHC.Util import Development.IDE.Core.Shake (KnownTargets) import           Data.Hashable import           Data.Typeable import qualified Data.Set as S+import qualified Data.Map as M import           Development.Shake import           GHC.Generics                             (Generic)  import Module (InstalledUnitId)-import HscTypes (hm_iface, CgGuts, Linkable, HomeModInfo, ModDetails)+import HscTypes (ModGuts, hm_iface, HomeModInfo, hm_linkable) -import           Development.IDE.Spans.Type+import           Development.IDE.Spans.Common+import           Development.IDE.Spans.LocalBindings import           Development.IDE.Import.FindImports (ArtifactsLocation) import Data.ByteString (ByteString)+import Language.Haskell.LSP.Types (NormalizedFilePath)+import TcRnMonad (TcGblEnv)+import qualified Data.ByteString.Char8 as BS +data LinkableType = ObjectLinkable | BCOLinkable+  deriving (Eq,Ord,Show)  -- NOTATION --   Foo+ means Foo for the dependencies@@ -56,40 +65,62 @@ instance Binary   GetKnownTargets type instance RuleResult GetKnownTargets = KnownTargets +-- | Convert to Core, requires TypeCheck*+type instance RuleResult GenerateCore = ModGuts++data GenerateCore = GenerateCore+    deriving (Eq, Show, Typeable, Generic)+instance Hashable GenerateCore+instance NFData   GenerateCore+instance Binary   GenerateCore++data GetImportMap = GetImportMap+    deriving (Eq, Show, Typeable, Generic)+instance Hashable GetImportMap+instance NFData   GetImportMap+instance Binary   GetImportMap++type instance RuleResult GetImportMap = ImportMap+newtype ImportMap = ImportMap+  { importMap :: M.Map ModuleName NormalizedFilePath -- ^ Where are the modules imported by this file located?+  } deriving stock Show+    deriving newtype NFData+ -- | Contains the typechecked module and the OrigNameCache entry for -- that module. data TcModuleResult = TcModuleResult-    { tmrModule     :: TypecheckedModule-    -- ^ warning, the ModIface in the tm_checked_module_info of the-    -- TypecheckedModule will always be Nothing, use the ModIface in the-    -- HomeModInfo instead-    , tmrModInfo    :: HomeModInfo+    { tmrParsed :: ParsedModule+    , tmrRenamed :: RenamedSource+    , tmrTypechecked :: TcGblEnv     , tmrDeferedError :: !Bool -- ^ Did we defer any type errors for this module?     } instance Show TcModuleResult where-    show = show . pm_mod_summary . tm_parsed_module . tmrModule+    show = show . pm_mod_summary . tmrParsed  instance NFData TcModuleResult where     rnf = rwhnf  tmrModSummary :: TcModuleResult -> ModSummary-tmrModSummary = pm_mod_summary . tm_parsed_module . tmrModule+tmrModSummary = pm_mod_summary . tmrParsed  data HiFileResult = HiFileResult     { hirModSummary :: !ModSummary     -- Bang patterns here are important to stop the result retaining     -- a reference to a typechecked module-    , hirModIface :: !ModIface+    , hirHomeMod :: !HomeModInfo+    -- ^ Includes the Linkable iff we need object files     } -tmr_hiFileResult :: TcModuleResult -> HiFileResult-tmr_hiFileResult tmr = HiFileResult modSummary modIface+hiFileFingerPrint :: HiFileResult -> ByteString+hiFileFingerPrint hfr = ifaceBS <> linkableBS   where-    modIface = hm_iface . tmrModInfo $ tmr-    modSummary = tmrModSummary tmr+    ifaceBS = fingerprintToBS . getModuleHash . hirModIface $ hfr -- will always be two bytes+    linkableBS = case hm_linkable $ hirHomeMod hfr of+      Nothing -> ""+      Just l -> BS.pack $ show $ linkableTime l -hiFileFingerPrint :: HiFileResult -> ByteString-hiFileFingerPrint = fingerprintToBS . getModuleHash . hirModIface+hirModIface :: HiFileResult -> ModIface+hirModIface = hm_iface . hirHomeMod  instance NFData HiFileResult where     rnf = rwhnf@@ -97,18 +128,41 @@ instance Show HiFileResult where     show = show . hirModSummary +-- | Save the uncompressed AST here, we compress it just before writing to disk+data HieAstResult+  = HAR+  { hieModule :: Module+  , hieAst :: !(HieASTs Type)+  , refMap :: RefMap+  -- ^ Lazy because its value only depends on the hieAst, which is bundled in this type+  -- Lazyness can't cause leaks here because the lifetime of `refMap` will be the same+  -- as that of `hieAst`+  }+ +instance NFData HieAstResult where+    rnf (HAR m hf _rm) = rnf m `seq` rwhnf hf+ +instance Show HieAstResult where+    show = show . hieModule+ -- | The type checked version of this file, requires TypeCheck+ type instance RuleResult TypeCheck = TcModuleResult --- | Information about what spans occur where, requires TypeCheck-type instance RuleResult GetSpanInfo = SpansInfo+-- | The uncompressed HieAST+type instance RuleResult GetHieAst = HieAstResult --- | Convert to Core, requires TypeCheck*-type instance RuleResult GenerateCore = (SafeHaskellMode, CgGuts, ModDetails)+-- | A IntervalMap telling us what is in scope at each point+type instance RuleResult GetBindings = Bindings --- | Generate byte code for template haskell.-type instance RuleResult GenerateByteCode = Linkable+data DocAndKindMap = DKMap {getDocMap :: !DocMap, getKindMap :: !KindMap}+instance NFData DocAndKindMap where+    rnf (DKMap a b) = rwhnf a `seq` rwhnf b +instance Show DocAndKindMap where+    show = const "docmap"++type instance RuleResult GetDocMap = DocAndKindMap+ -- | A GHC session that we reuse. type instance RuleResult GhcSession = HscEnvEq @@ -131,6 +185,10 @@ -- | Get a module interface details, either from an interface file or a typechecked module type instance RuleResult GetModIface = HiFileResult +-- | Get a module interface details, without the Linkable+-- For better early cuttoff+type instance RuleResult GetModIfaceWithoutLinkable = HiFileResult+ data FileOfInterestStatus = OnDisk | Modified   deriving (Eq, Show, Typeable, Generic) instance Hashable FileOfInterestStatus@@ -147,11 +205,11 @@  -- | Generate a ModSummary that has enough information to be used to get .hi and .hie files. -- without needing to parse the entire source-type instance RuleResult GetModSummary = ModSummary+type instance RuleResult GetModSummary = (ModSummary,[LImportDecl GhcPs])  -- | Generate a ModSummary with the timestamps elided, --   for more successful early cutoff-type instance RuleResult GetModSummaryWithoutTimestamps = ModSummary+type instance RuleResult GetModSummaryWithoutTimestamps = (ModSummary,[LImportDecl GhcPs])  data GetParsedModule = GetParsedModule     deriving (Eq, Show, Typeable, Generic)@@ -165,6 +223,15 @@ instance NFData   GetLocatedImports instance Binary   GetLocatedImports +-- | Does this module need to be compiled?+type instance RuleResult NeedsCompilation = Bool++data NeedsCompilation = NeedsCompilation+    deriving (Eq, Show, Typeable, Generic)+instance Hashable NeedsCompilation+instance NFData   NeedsCompilation+instance Binary   NeedsCompilation+ data GetDependencyInformation = GetDependencyInformation     deriving (Eq, Show, Typeable, Generic) instance Hashable GetDependencyInformation@@ -195,23 +262,23 @@ instance NFData   TypeCheck instance Binary   TypeCheck -data GetSpanInfo = GetSpanInfo+data GetDocMap = GetDocMap     deriving (Eq, Show, Typeable, Generic)-instance Hashable GetSpanInfo-instance NFData   GetSpanInfo-instance Binary   GetSpanInfo+instance Hashable GetDocMap+instance NFData   GetDocMap+instance Binary   GetDocMap -data GenerateCore = GenerateCore+data GetHieAst = GetHieAst     deriving (Eq, Show, Typeable, Generic)-instance Hashable GenerateCore-instance NFData   GenerateCore-instance Binary   GenerateCore+instance Hashable GetHieAst+instance NFData   GetHieAst+instance Binary   GetHieAst -data GenerateByteCode = GenerateByteCode-   deriving (Eq, Show, Typeable, Generic)-instance Hashable GenerateByteCode-instance NFData   GenerateByteCode-instance Binary   GenerateByteCode+data GetBindings = GetBindings+    deriving (Eq, Show, Typeable, Generic)+instance Hashable GetBindings+instance NFData   GetBindings+instance Binary   GetBindings  data GhcSession = GhcSession     deriving (Eq, Show, Typeable, Generic)@@ -236,6 +303,12 @@ instance NFData   GetModIface instance Binary   GetModIface +data GetModIfaceWithoutLinkable = GetModIfaceWithoutLinkable+    deriving (Eq, Show, Typeable, Generic)+instance Hashable GetModIfaceWithoutLinkable+instance NFData   GetModIfaceWithoutLinkable+instance Binary   GetModIfaceWithoutLinkable+ data IsFileOfInterest = IsFileOfInterest     deriving (Eq, Show, Typeable, Generic) instance Hashable IsFileOfInterest@@ -253,3 +326,12 @@ instance Hashable GetModSummary instance NFData   GetModSummary instance Binary   GetModSummary++-- | Get the vscode client settings stored in the ide state+data GetClientSettings = GetClientSettings+    deriving (Eq, Show, Typeable, Generic)+instance Hashable GetClientSettings+instance NFData   GetClientSettings+instance Binary   GetClientSettings++type instance RuleResult GetClientSettings = Hashed (Maybe Value)
src/Development/IDE/Core/Rules.hs view
@@ -12,7 +12,7 @@ -- module Development.IDE.Core.Rules(     IdeState, GetDependencies(..), GetParsedModule(..), TransitiveDependencies(..),-    Priority(..), GhcSessionIO(..),+    Priority(..), GhcSessionIO(..), GetClientSettings(..),     priorityTypeCheck,     priorityGenerateCore,     priorityFilesOfInterest,@@ -24,9 +24,9 @@     getAtPoint,     getDefinition,     getTypeDefinition,+    highlightAtPoint,     getDependencies,     getParsedModule,-    generateCore,     ) where  import Fingerprint@@ -39,16 +39,16 @@ import Development.IDE.Core.Compile import Development.IDE.Core.OfInterest import Development.IDE.Types.Options-import Development.IDE.Spans.Calculate+import Development.IDE.Spans.Documentation+import Development.IDE.Spans.LocalBindings import Development.IDE.Import.DependencyInformation import Development.IDE.Import.FindImports import           Development.IDE.Core.FileExists import           Development.IDE.Core.FileStore        (modificationTime, getFileContents) import           Development.IDE.Types.Diagnostics as Diag import Development.IDE.Types.Location-import Development.IDE.GHC.Compat hiding (parseModule, typecheckModule)+import Development.IDE.GHC.Compat hiding (parseModule, typecheckModule, writeHieFile, TargetModule, TargetFile) import Development.IDE.GHC.Util-import Development.IDE.GHC.WithDynFlags import Data.Either.Extra import qualified Development.IDE.Types.Logger as L import Data.Maybe@@ -57,22 +57,22 @@ import Data.IntMap.Strict (IntMap) import Data.List import qualified Data.Set                                 as Set+import qualified Data.Map as M import qualified Data.Text                                as T import qualified Data.Text.Encoding                       as T import           Development.IDE.GHC.Error import           Development.Shake                        hiding (Diagnostic) import Development.IDE.Core.RuleTypes-import Development.IDE.Spans.Type import qualified Data.ByteString.Char8 as BS import Development.IDE.Core.PositionMapping+import           Language.Haskell.LSP.Types (DocumentHighlight (..))  import qualified GHC.LanguageExtensions as LangExt-import HscTypes-import PackageConfig-import DynFlags (gopt_set, xopt)+import HscTypes hiding (TargetModule, TargetFile) import GHC.Generics(Generic)  import qualified Development.IDE.Spans.AtPoint as AtPoint+import Development.IDE.Core.IdeConfiguration import Development.IDE.Core.Service import Development.IDE.Core.Shake import Development.Shake.Classes hiding (get, put)@@ -91,6 +91,10 @@ import Data.Hashable import qualified Data.HashSet as HashSet import qualified Data.HashMap.Strict as HM+import TcRnMonad (tcg_dependent_files)+import Data.IORef+import Control.Concurrent.Extra+import Module  -- | This is useful for rules to convert rules that can only produce errors or -- a result into the more general IdeResult type that supports producing@@ -133,27 +137,37 @@ getAtPoint file pos = fmap join $ runMaybeT $ do   ide <- ask   opts <- liftIO $ getIdeOptionsIO ide-  (spans, mapping) <- useE  GetSpanInfo file++  (hieAst -> hf, mapping) <- useE GetHieAst file+  dkMap <- lift $ maybe (DKMap mempty mempty) fst <$> (runMaybeT $ useE GetDocMap file)+   !pos' <- MaybeT (return $ fromCurrentPosition mapping pos)-  return $ AtPoint.atPoint opts spans pos'+  return $ AtPoint.atPoint opts hf dkMap pos'  -- | Goto Definition. getDefinition :: NormalizedFilePath -> Position -> IdeAction (Maybe Location) getDefinition file pos = runMaybeT $ do     ide <- ask     opts <- liftIO $ getIdeOptionsIO ide-    (spans,mapping) <- useE GetSpanInfo file+    (HAR _ hf _ , mapping) <- useE GetHieAst file+    (ImportMap imports, _) <- useE GetImportMap file     !pos' <- MaybeT (return $ fromCurrentPosition mapping pos)-    AtPoint.gotoDefinition (getHieFile ide file) opts (spansExprs spans) pos'+    AtPoint.gotoDefinition (getHieFile ide file) opts imports hf pos'  getTypeDefinition :: NormalizedFilePath -> Position -> IdeAction (Maybe [Location]) getTypeDefinition file pos = runMaybeT $ do     ide <- ask     opts <- liftIO $ getIdeOptionsIO ide-    (spans,mapping) <- useE GetSpanInfo file+    (hieAst -> hf, mapping) <- useE GetHieAst file     !pos' <- MaybeT (return $ fromCurrentPosition mapping pos)-    AtPoint.gotoTypeDefinition (getHieFile ide file) opts (spansExprs spans) pos'+    AtPoint.gotoTypeDefinition (getHieFile ide file) opts hf pos' +highlightAtPoint :: NormalizedFilePath -> Position -> IdeAction (Maybe [DocumentHighlight])+highlightAtPoint file pos = runMaybeT $ do+    (HAR _ hf rf,mapping) <- useE GetHieAst file+    !pos' <- MaybeT (return $ fromCurrentPosition mapping pos)+    AtPoint.documentHighlight hf rf pos'+ getHieFile   :: ShakeExtras   -> NormalizedFilePath -- ^ file we're editing@@ -170,7 +184,7 @@  getHomeHieFile :: NormalizedFilePath -> MaybeT IdeAction HieFile getHomeHieFile f = do-  ms <- fst <$> useE GetModSummaryWithoutTimestamps f+  ms <- fst . fst <$> useE GetModSummaryWithoutTimestamps f   let normal_hie_f = toNormalizedFilePath' hie_f       hie_f = ml_hie_file $ ms_location ms @@ -190,8 +204,8 @@       wait <- lift $ delayedAction $ mkDelayedAction "OutOfDateHie" L.Info $ do         hsc <- hscEnv <$> use_ GhcSession f         pm <- use_ GetParsedModule f-        source <- getSourceFileSource f-        typeCheckRuleDefinition hsc pm NotFOI (Just source)+        (_, mtm)<- typeCheckRuleDefinition hsc pm+        mapM_ (getHieAstRuleDefinition f hsc) mtm -- Write the HiFile to disk       _ <- MaybeT $ liftIO $ timeout 1 wait       ncu <- mkUpdater       liftIO $ loadHieFile ncu hie_f@@ -250,23 +264,20 @@ -- and https://github.com/mpickering/ghcide/pull/22#issuecomment-625070490 getParsedModuleRule :: Rules () getParsedModuleRule = defineEarlyCutoff $ \GetParsedModule file -> do+    (ms, _) <- use_ GetModSummary file     sess <- use_ GhcSession file     let hsc = hscEnv sess-        -- These packages are used when removing PackageImports from a-        -- parsed module-        comp_pkgs = mapMaybe (fmap fst . mkImportDirs (hsc_dflags hsc)) (deps sess)     opt <- getIdeOptions-    (modTime, contents) <- getFileContents file -    let dflags    = hsc_dflags hsc-        mainParse = getParsedModuleDefinition hsc opt comp_pkgs file modTime contents+    let dflags    = ms_hspp_opts ms+        mainParse = getParsedModuleDefinition hsc opt file ms      -- Parse again (if necessary) to capture Haddock parse errors-    if gopt Opt_Haddock dflags+    res@(_, (_,pmod)) <- if gopt Opt_Haddock dflags         then             liftIO mainParse         else do-            let haddockParse = getParsedModuleDefinition (withOptHaddock hsc) opt comp_pkgs file modTime contents+            let haddockParse = getParsedModuleDefinition hsc opt file (withOptHaddock ms)              -- parse twice, with and without Haddocks, concurrently             -- we cannot ignore Haddock parse errors because files of@@ -288,10 +299,12 @@               -- This seems to be the correct behaviour because the Haddock flag is added               -- by us and not the user, so our IDE shouldn't stop working because of it.               _ -> pure (fp, (diagsM, res))-+    -- Add dependencies on included files+    _ <- uses GetModificationTime $ map toNormalizedFilePath' (maybe [] pm_extra_src_files pmod)+    pure res -withOptHaddock :: HscEnv -> HscEnv-withOptHaddock hsc = hsc{hsc_dflags = gopt_set (hsc_dflags hsc) Opt_Haddock}+withOptHaddock :: ModSummary -> ModSummary+withOptHaddock ms = ms{ms_hspp_opts= gopt_set (ms_hspp_opts ms) Opt_Haddock}   -- | Given some normal parse errors (first) and some from Haddock (second), merge them.@@ -306,23 +319,20 @@     fixMessage x | "parse error " `T.isPrefixOf` x = "Haddock " <> x                  | otherwise = "Haddock: " <> x -getParsedModuleDefinition :: HscEnv -> IdeOptions -> [PackageName] -> NormalizedFilePath -> UTCTime -> Maybe T.Text -> IO (Maybe ByteString, ([FileDiagnostic], Maybe ParsedModule))-getParsedModuleDefinition packageState opt comp_pkgs file modTime contents = do+getParsedModuleDefinition :: HscEnv -> IdeOptions -> NormalizedFilePath -> ModSummary -> IO (Maybe ByteString, ([FileDiagnostic], Maybe ParsedModule))+getParsedModuleDefinition packageState opt file ms = do     let fp = fromNormalizedFilePath file-        buffer = textToStringBuffer <$> contents-    (diag, res) <- parseModule opt packageState comp_pkgs fp modTime buffer+    (diag, res) <- parseModule opt packageState fp ms     case res of         Nothing -> pure (Nothing, (diag, Nothing))-        Just (contents, modu) -> do-            mbFingerprint <- if isNothing $ optShakeFiles opt-                then pure Nothing-                else Just . fingerprintToBS <$> fingerprintFromStringBuffer contents+        Just modu -> do+            mbFingerprint <- traverse (fmap fingerprintToBS . fingerprintFromStringBuffer) (ms_hspp_buf ms)             pure (mbFingerprint, (diag, Just modu))  getLocatedImportsRule :: Rules () getLocatedImportsRule =     define $ \GetLocatedImports file -> do-        ms <- use_ GetModSummaryWithoutTimestamps file+        (ms,_) <- use_ GetModSummaryWithoutTimestamps file         targets <- useNoFile_ GetKnownTargets         let imports = [(False, imp) | imp <- ms_textual_imps ms] ++ [(True, imp) | imp <- ms_srcimps ms]         env_eq <- use_ GhcSession file@@ -336,7 +346,9 @@         opt <- getIdeOptions         let getTargetExists modName nfp                 | isImplicitCradle = getFileExists nfp-                | HM.member modName targets = getFileExists nfp+                | HM.member (TargetModule modName) targets+                || HM.member (TargetFile nfp) targets+                = getFileExists nfp                 | otherwise = return False         (diags, imports') <- fmap unzip $ forM imports $ \(isSource, (mbPkgName, modName)) -> do             diagOrImp <- locateModule dflags import_dirs (optExtensions opt) getTargetExists modName mbPkgName isSource@@ -377,7 +389,8 @@       -- If we have, just return its Id but don't update any of the state.       -- Otherwise, we need to process its imports.       checkAlreadyProcessed f $ do-          al <- lift $ modSummaryToArtifactsLocation f <$> use_ GetModSummaryWithoutTimestamps f+          msum <- lift $ fmap fst <$> use GetModSummaryWithoutTimestamps f+          let al =  modSummaryToArtifactsLocation f msum           -- Get a fresh FilePathId for the new file           fId <- getFreshFid al           -- Adding an edge to the bootmap so we can make sure to@@ -442,15 +455,14 @@     updateBootMap pm boot_mod_id ArtifactsLocation{..} bm =       if not artifactIsSource         then-          let msource_mod_id = lookupPathToId (rawPathIdMap pm) (toNormalizedFilePath' $ dropBootSuffix artifactModLocation)+          let msource_mod_id = lookupPathToId (rawPathIdMap pm) (toNormalizedFilePath' $ dropBootSuffix $ fromNormalizedFilePath artifactFilePath)           in case msource_mod_id of                Just source_mod_id -> insertBootId source_mod_id (FilePathId boot_mod_id) bm                Nothing -> bm         else bm -    dropBootSuffix :: ModLocation -> FilePath-    dropBootSuffix (ModLocation (Just hs_src) _ _) = reverse . drop (length @[] "-boot") . reverse $ hs_src-    dropBootSuffix _ = error "dropBootSuffix"+    dropBootSuffix :: FilePath -> FilePath+    dropBootSuffix hs_src = reverse . drop (length @[] "-boot") . reverse $ hs_src  getDependencyInformationRule :: Rules () getDependencyInformationRule =@@ -488,7 +500,7 @@             where rng = fromMaybe noRange $ srcSpanToRange (getLoc imp)                   fp = toNormalizedFilePath' $ fromMaybe noFilePath $ srcSpanToFilename (getLoc imp)           getModuleName file = do-           ms <- use_ GetModSummaryWithoutTimestamps file+           ms <- fst <$> use_ GetModSummaryWithoutTimestamps file            pure (moduleNameString . moduleName . ms_mod $ ms)           showCycle mods  = T.intercalate ", " (map T.pack mods) @@ -504,38 +516,66 @@         let mbFingerprints = map (fingerprintString . fromNormalizedFilePath) allFiles <$ optShakeFiles opts         return (fingerprintToBS . fingerprintFingerprints <$> mbFingerprints, ([], transitiveDeps depInfo file)) --- Source SpanInfo is used by AtPoint and Goto Definition.-getSpanInfoRule :: Rules ()-getSpanInfoRule =-    define $ \GetSpanInfo file -> do-        tc <- use_ TypeCheck file-        packageState <- hscEnv <$> use_ GhcSessionDeps file+getHieAstsRule :: Rules ()+getHieAstsRule =+    define $ \GetHieAst f -> do+      tmr <- use_ TypeCheck f+      hsc <- hscEnv <$> use_ GhcSession f+      getHieAstRuleDefinition f hsc tmr +getHieAstRuleDefinition :: NormalizedFilePath -> HscEnv -> TcModuleResult -> Action (IdeResult HieAstResult)+getHieAstRuleDefinition f hsc tmr = do+  (diags, masts) <- liftIO $ generateHieAsts hsc tmr++  isFoi <- use_ IsFileOfInterest f+  diagsWrite <- case isFoi of+    IsFOI Modified -> pure []+    _ | Just asts <- masts -> do+          source <- getSourceFileSource f+          liftIO $ writeHieFile hsc (tmrModSummary tmr) (tcg_exports $ tmrTypechecked tmr) asts source+    _ -> pure []++  let refmap = generateReferencesMap . getAsts <$> masts+  pure (diags <> diagsWrite, HAR (ms_mod  $ tmrModSummary tmr) <$> masts <*> refmap)++getImportMapRule :: Rules()+getImportMapRule = define $ \GetImportMap f -> do+  im <- use GetLocatedImports f+  let mkImports (fileImports, _) = M.fromList $ mapMaybe (\(m, mfp) -> (unLoc m,) . artifactFilePath <$> mfp) fileImports+  pure ([], ImportMap . mkImports <$> im)++getBindingsRule :: Rules ()+getBindingsRule =+  define $ \GetBindings f -> do+    har <- use_ GetHieAst f+    pure ([], Just $ bindings $ refMap har)++getDocMapRule :: Rules ()+getDocMapRule =+    define $ \GetDocMap file -> do+      (tmrTypechecked -> tc,_) <- useWithStale_ TypeCheck file+      (hscEnv -> hsc,_) <-useWithStale_ GhcSessionDeps file+      (refMap -> rf, _) <- useWithStale_ GetHieAst file+ -- When possible, rely on the haddocks embedded in our interface files -- This creates problems on ghc-lib, see comment on 'getDocumentationTryGhc'-#if MIN_GHC_API_VERSION(8,6,0) && !defined(GHC_LIB)-        let parsedDeps = []+#if !defined(GHC_LIB)+      let parsedDeps = [] #else-        deps <- maybe (TransitiveDependencies [] [] []) fst <$> useWithStale GetDependencies file-        let tdeps = transitiveModuleDeps deps-        parsedDeps <- mapMaybe (fmap fst) <$> usesWithStale GetParsedModule tdeps+      deps <- maybe (TransitiveDependencies [] [] []) fst <$> useWithStale GetDependencies file+      let tdeps = transitiveModuleDeps deps+      parsedDeps <- uses_ GetParsedModule tdeps #endif -        (fileImports, _) <- use_ GetLocatedImports file-        let imports = second (fmap artifactFilePath) <$> fileImports-        x <- liftIO $ getSrcSpanInfos packageState imports tc parsedDeps-        return ([], Just x)+      dkMap <- liftIO $ mkDocMap hsc parsedDeps rf tc+      return ([],Just dkMap)  -- Typechecks a module. typeCheckRule :: Rules () typeCheckRule = define $ \TypeCheck file -> do     pm <- use_ GetParsedModule file     hsc  <- hscEnv <$> use_ GhcSessionDeps file-    -- do not generate interface files as this rule is called-    -- for files of interest on every keystroke-    source <- getSourceFileSource file-    isFoi <- use_ IsFileOfInterest file-    typeCheckRuleDefinition hsc pm isFoi (Just source)+    typeCheckRuleDefinition hsc pm  knownFilesRule :: Rules () knownFilesRule = defineEarlyCutOffNoFile $ \GetKnownTargets -> do@@ -556,64 +596,33 @@ typeCheckRuleDefinition     :: HscEnv     -> ParsedModule-    -> IsFileOfInterestResult -- ^ Should generate .hi and .hie files ?-    -> Maybe BS.ByteString     -> Action (IdeResult TcModuleResult)-typeCheckRuleDefinition hsc pm isFoi source = do+typeCheckRuleDefinition hsc pm = do   setPriority priorityTypeCheck   IdeOptions { optDefer = defer } <- getIdeOptions -  addUsageDependencies $ liftIO $ do-    res <- typecheckModule defer hsc pm-    case res of-      (diags, Just (hsc,tcm)) -> do-        case isFoi of-          IsFOI Modified -> return (diags, Just tcm)-          _ -> do -- If the file is saved on disk, or is not a FOI, we write out ifaces-            diagsHie <- generateAndWriteHieFile hsc (tmrModule tcm) (fromMaybe "" source)-            -- Don't save interface files for modules that compiled due to defering-            -- type errors, as we won't get proper diagnostics if we load these from-            -- disk-            diagsHi  <- if not $ tmrDeferedError tcm-                        then writeHiFile hsc tcm-                        else pure mempty-            return (diags <> diagsHi <> diagsHie, Just tcm)-      (diags, res) ->-        return (diags, snd <$> res)- where-  addUsageDependencies :: Action (a, Maybe TcModuleResult) -> Action (a, Maybe TcModuleResult)-  addUsageDependencies a = do-    r@(_, mtc) <- a-    forM_ mtc $ \tc -> do-      let used_files = mapMaybe udep (mi_usages (hm_iface (tmrModInfo tc)))-          udep (UsageFile fp _h) = Just fp-          udep _ = Nothing-      -- Add a dependency on these files which are added by things like-      -- qAddDependentFile-      void $ uses_ GetModificationTime (map toNormalizedFilePath' used_files)-    return r---generateCore :: RunSimplifier -> NormalizedFilePath -> Action (IdeResult (SafeHaskellMode, CgGuts, ModDetails))-generateCore runSimplifier file = do-    deps <- use_ GetDependencies file-    (tm:tms) <- uses_ TypeCheck (file:transitiveModuleDeps deps)-    setPriority priorityGenerateCore-    packageState <- hscEnv <$> use_ GhcSession file-    liftIO $ compileModule runSimplifier packageState [(tmrModSummary x, tmrModInfo x) | x <- tms] tm+  linkables_to_keep <- currentLinkables -generateCoreRule :: Rules ()-generateCoreRule =-    define $ \GenerateCore -> generateCore (RunSimplifier True)+  addUsageDependencies $ liftIO $+    typecheckModule defer hsc linkables_to_keep pm+  where+    addUsageDependencies :: Action (a, Maybe TcModuleResult) -> Action (a, Maybe TcModuleResult)+    addUsageDependencies a = do+      r@(_, mtc) <- a+      forM_ mtc $ \tc -> do+        used_files <- liftIO $ readIORef $ tcg_dependent_files $ tmrTypechecked tc+        void $ uses_ GetModificationTime (map toNormalizedFilePath' used_files)+      return r -generateByteCodeRule :: Rules ()-generateByteCodeRule =-    define $ \GenerateByteCode file -> do-      deps <- use_ GetDependencies file-      (tm : tms) <- uses_ TypeCheck (file: transitiveModuleDeps deps)-      session <- hscEnv <$> use_ GhcSession file-      (_, guts, _) <- use_ GenerateCore file-      liftIO $ generateByteCode session [(tmrModSummary x, tmrModInfo x) | x <- tms] tm guts+-- | Get all the linkables stored in the graph, i.e. the ones we *do not* need to unload.+-- Doesn't actually contain the code, since we don't need it to unload+currentLinkables :: Action [Linkable]+currentLinkables = do+    compiledLinkables <- getCompiledLinkables <$> getIdeGlobalAction+    hm <- liftIO $ readVar compiledLinkables+    pure $ map go $ moduleEnvToList hm+  where+    go (mod, time) = LM time mod []  -- A local rule type to get caching. We want to use newCache, but it has -- thread killed exception issues, so we lift it to a full rule.@@ -663,48 +672,38 @@  ghcSessionDepsDefinition :: NormalizedFilePath -> Action (IdeResult HscEnvEq) ghcSessionDepsDefinition file = do-        hsc <- hscEnv <$> use_ GhcSession file-        (ms,_) <- useWithStale_ GetModSummaryWithoutTimestamps file+        env <- use_ GhcSession file+        let hsc = hscEnv env+        ((ms,_),_) <- useWithStale_ GetModSummaryWithoutTimestamps file         (deps,_) <- useWithStale_ GetDependencies file         let tdeps = transitiveModuleDeps deps-        ifaces <- uses_ GetModIface tdeps--        -- Figure out whether we need TemplateHaskell or QuasiQuotes support-        let graph_needs_th_qq = needsTemplateHaskellOrQQ $ hsc_mod_graph hsc-            file_uses_th_qq   = uses_th_qq $ ms_hspp_opts ms-            any_uses_th_qq    = graph_needs_th_qq || file_uses_th_qq--        bytecodes <- if any_uses_th_qq-            then -- If we use TH or QQ, we must obtain the bytecode-            fmap Just <$> uses_ GenerateByteCode (transitiveModuleDeps deps)-            else-            pure $ repeat Nothing+            uses_th_qq =+              xopt LangExt.TemplateHaskell dflags || xopt LangExt.QuasiQuotes dflags+            dflags = ms_hspp_opts ms+        ifaces <- if uses_th_qq+                  then uses_ GetModIface tdeps+                  else uses_ GetModIfaceWithoutLinkable tdeps          -- Currently GetDependencies returns things in topological order so A comes before B if A imports B.         -- We need to reverse this as GHC gets very unhappy otherwise and complains about broken interfaces.         -- Long-term we might just want to change the order returned by GetDependencies-        let inLoadOrder = reverse (zipWith unpack ifaces bytecodes)+        let inLoadOrder = reverse (map hirHomeMod ifaces) -        (session',_) <- liftIO $ runGhcEnv hsc $ do-            setupFinderCache (map hirModSummary ifaces)-            mapM_ (uncurry loadDepModule) inLoadOrder+        session' <- liftIO $ loadModulesHome inLoadOrder <$> setupFinderCache (map hirModSummary ifaces) hsc -        res <- liftIO $ newHscEnvEq "" session' []+        res <- liftIO $ newHscEnvEqWithImportPaths (envImportPaths env) session' []         return ([], Just res)- where-  unpack HiFileResult{..} bc = (hirModIface, bc)-  uses_th_qq dflags =-    xopt LangExt.TemplateHaskell dflags || xopt LangExt.QuasiQuotes dflags  getModIfaceFromDiskRule :: Rules () getModIfaceFromDiskRule = defineEarlyCutoff $ \GetModIfaceFromDisk f -> do-  ms <- use_ GetModSummary f+  (ms,_) <- use_ GetModSummary f   (diags_session, mb_session) <- ghcSessionDepsDefinition f   case mb_session of       Nothing -> return (Nothing, (diags_session, Nothing))       Just session -> do         sourceModified <- use_ IsHiFileStable f-        r <- loadInterface (hscEnv session) ms sourceModified (regenerateHiFile session f)+        linkableType <- getLinkableType f+        r <- loadInterface (hscEnv session) ms sourceModified linkableType (regenerateHiFile session f ms)         case r of             (diags, Just x) -> do                 let fp = Just (hiFileFingerPrint x)@@ -712,8 +711,8 @@             (diags, Nothing) -> return (Nothing, (diags ++ diags_session, Nothing))  isHiFileStableRule :: Rules ()-isHiFileStableRule = define $ \IsHiFileStable f -> do-    ms <- use_ GetModSummaryWithoutTimestamps f+isHiFileStableRule = defineEarlyCutoff $ \IsHiFileStable f -> do+    (ms,_) <- use_ GetModSummaryWithoutTimestamps f     let hiFile = toNormalizedFilePath'                 $ ml_hi_file $ ms_location ms     mbHiVersion <- use  GetModificationTime_{missingFileDiagnostics=False} hiFile@@ -728,9 +727,9 @@                     let imports = fmap artifactFilePath . snd <$> fileImports                     deps <- uses_ IsHiFileStable (catMaybes imports)                     pure $ if all (== SourceUnmodifiedAndStable) deps-                        then SourceUnmodifiedAndStable-                        else SourceUnmodified-    return ([], Just sourceModified)+                           then SourceUnmodifiedAndStable+                           else SourceUnmodified+    return (Just (BS.pack $ show sourceModified), ([], Just sourceModified))  getModSummaryRule :: Rules () getModSummaryRule = do@@ -739,23 +738,23 @@         let dflags = hsc_dflags session         (modTime, mFileContent) <- getFileContents f         let fp = fromNormalizedFilePath f-        modS <- liftIO $ evalWithDynFlags dflags $ runExceptT $+        modS <- liftIO $ runExceptT $                 getModSummaryFromImports session fp modTime (textToStringBuffer <$> mFileContent)         case modS of-            Right ms -> do+            Right res@(ms,_) -> do                 let fingerPrint = hash (computeFingerprint f dflags ms, hashUTC modTime)-                return ( Just (BS.pack $ show fingerPrint) , ([], Just ms))+                return ( Just (BS.pack $ show fingerPrint) , ([], Just res))             Left diags -> return (Nothing, (diags, Nothing))      defineEarlyCutoff $ \GetModSummaryWithoutTimestamps f -> do         ms <- use GetModSummary f         case ms of-            Just msWithTimestamps -> do+            Just res@(msWithTimestamps,_) -> do                 let ms = msWithTimestamps { ms_hs_date = error "use GetModSummary instead of GetModSummaryWithoutTimestamps" }                 dflags <- hsc_dflags . hscEnv <$> use_ GhcSession f                 -- include the mod time in the fingerprint                 let fp = BS.pack $ show $ hash (computeFingerprint f dflags ms)-                return (Just fp, ([], Just ms))+                return (Just fp, ([], Just res))             Nothing -> return (Nothing, ([], Nothing))     where         -- Compute a fingerprint from the contents of `ModSummary`,@@ -775,81 +774,179 @@          hashUTC UTCTime{..} = (fromEnum utctDay, fromEnum utctDayTime) ++generateCore :: RunSimplifier -> NormalizedFilePath -> Action (IdeResult ModGuts)+generateCore runSimplifier file = do+    packageState <- hscEnv <$> use_ GhcSessionDeps file+    tm <- use_ TypeCheck file+    setPriority priorityGenerateCore+    liftIO $ compileModule runSimplifier packageState (tmrModSummary tm) (tmrTypechecked tm)++generateCoreRule :: Rules ()+generateCoreRule =+    define $ \GenerateCore -> generateCore (RunSimplifier True)+ getModIfaceRule :: Rules () getModIfaceRule = defineEarlyCutoff $ \GetModIface f -> do-#if MIN_GHC_API_VERSION(8,6,0) && !defined(GHC_LIB)+#if !defined(GHC_LIB)   fileOfInterest <- use_ IsFileOfInterest f-  case fileOfInterest of-    IsFOI _ -> do+  res@(_,(_,mhmi)) <- case fileOfInterest of+    IsFOI status -> do       -- Never load from disk for files of interest-      tmr <- use TypeCheck f-      let !hiFile = extractHiFileResult tmr+      tmr <- use_ TypeCheck f+      linkableType <- getLinkableType f+      hsc <- hscEnv <$> use_ GhcSessionDeps f+      let compile = fmap ([],) $ use GenerateCore f+      (diags, !hiFile) <- compileToObjCodeIfNeeded hsc linkableType compile tmr       let fp = hiFileFingerPrint <$> hiFile-      return (fp, ([], hiFile))+      hiDiags <- case hiFile of+        Just hiFile+          | OnDisk <- status+          , not (tmrDeferedError tmr) -> liftIO $ writeHiFile hsc hiFile+        _ -> pure []+      return (fp, (diags++hiDiags, hiFile))     NotFOI -> do       hiFile <- use GetModIfaceFromDisk f       let fp = hiFileFingerPrint <$> hiFile       return (fp, ([], hiFile))++  -- Record the linkable so we know not to unload it+  whenJust (hm_linkable . hirHomeMod =<< mhmi) $ \(LM time mod _) -> do+      compiledLinkables <- getCompiledLinkables <$> getIdeGlobalAction+      liftIO $ modifyVar_ compiledLinkables $ \old -> pure $ extendModuleEnv old mod time+  pure res #else-    tm <- use TypeCheck f-    let !hiFile = extractHiFileResult tm+    tm <- use_ TypeCheck f+    hsc <- hscEnv <$> use_ GhcSessionDeps f+    (diags, !hiFile) <- liftIO $ compileToObjCodeIfNeeded hsc Nothing (error "can't compile with ghc-lib") tm     let fp = hiFileFingerPrint <$> hiFile-    return (fp, ([], tmr_hiFileResult <$> tm))+    return (fp, (diags, hiFile)) #endif -regenerateHiFile :: HscEnvEq -> NormalizedFilePath -> Action ([FileDiagnostic], Maybe HiFileResult)-regenerateHiFile sess f = do+getModIfaceWithoutLinkableRule :: Rules ()+getModIfaceWithoutLinkableRule = defineEarlyCutoff $ \GetModIfaceWithoutLinkable f -> do+  mhfr <- use GetModIface f+  let mhfr' = fmap (\x -> x{ hirHomeMod = (hirHomeMod x){ hm_linkable = Just (error msg) } }) mhfr+      msg = "tried to look at linkable for GetModIfaceWithoutLinkable for " ++ show f+  pure (fingerprintToBS . getModuleHash . hirModIface <$> mhfr', ([],mhfr'))++regenerateHiFile :: HscEnvEq -> NormalizedFilePath -> ModSummary -> Maybe LinkableType -> Action ([FileDiagnostic], Maybe HiFileResult)+regenerateHiFile sess f ms compNeeded = do     let hsc = hscEnv sess-        -- After parsing the module remove all package imports referring to-        -- these packages as we have already dealt with what they map to.-        comp_pkgs = mapMaybe (fmap fst . mkImportDirs (hsc_dflags hsc)) (deps sess)     opt <- getIdeOptions-    (modTime, contents) <- getFileContents f      -- Embed haddocks in the interface file-    (_, (diags, mb_pm)) <- liftIO $ getParsedModuleDefinition (withOptHaddock hsc) opt comp_pkgs f modTime contents+    (_, (diags, mb_pm)) <- liftIO $ getParsedModuleDefinition hsc opt f (withOptHaddock ms)     (diags, mb_pm) <- case mb_pm of         Just _ -> return (diags, mb_pm)         Nothing -> do             -- if parsing fails, try parsing again with Haddock turned off-            (_, (diagsNoHaddock, mb_pm)) <- liftIO $ getParsedModuleDefinition hsc opt comp_pkgs f modTime contents+            (_, (diagsNoHaddock, mb_pm)) <- liftIO $ getParsedModuleDefinition hsc opt f ms             return (mergeParseErrorsHaddock diagsNoHaddock diags, mb_pm)     case mb_pm of         Nothing -> return (diags, Nothing)         Just pm -> do-            source <- getSourceFileSource f             -- Invoke typechecking directly to update it without incurring a dependency             -- on the parsed module and the typecheck rules-            (diags', tmr) <- typeCheckRuleDefinition hsc pm NotFOI (Just source)-            -- Bang pattern is important to avoid leaking 'tmr'-            let !res = extractHiFileResult tmr-            return (diags <> diags', res)+            (diags', mtmr) <- typeCheckRuleDefinition hsc pm+            case mtmr of+              Nothing -> pure (diags', Nothing)+              Just tmr -> do -extractHiFileResult :: Maybe TcModuleResult -> Maybe HiFileResult-extractHiFileResult Nothing = Nothing-extractHiFileResult (Just tmr) =-    -- Bang patterns are important to force the inner fields-    Just $! tmr_hiFileResult tmr+                -- compile writes .o file+                let compile = compileModule (RunSimplifier True) hsc (pm_mod_summary pm) $ tmrTypechecked tmr +                -- Bang pattern is important to avoid leaking 'tmr'+                (diags'', !res) <- liftIO $ compileToObjCodeIfNeeded hsc compNeeded compile tmr++                -- Write hi file+                hiDiags <- case res of+                  Just hiFile+                    | not $ tmrDeferedError tmr ->+                      liftIO $ writeHiFile hsc hiFile+                  _ -> pure []++                -- Write hie file+                (gDiags, masts) <- liftIO $ generateHieAsts hsc tmr+                source <- getSourceFileSource f+                wDiags <- forM masts $ \asts ->+                  liftIO $ writeHieFile hsc (tmrModSummary tmr) (tcg_exports $ tmrTypechecked tmr) asts source++                return (diags <> diags' <> diags'' <> hiDiags <> gDiags <> concat wDiags, res)+++type CompileMod m = m (IdeResult ModGuts)++-- | HscEnv should have deps included already+compileToObjCodeIfNeeded :: MonadIO m => HscEnv -> Maybe LinkableType -> CompileMod m -> TcModuleResult -> m (IdeResult HiFileResult)+compileToObjCodeIfNeeded hsc Nothing _ tmr = liftIO $ do+  res <- mkHiFileResultNoCompile hsc tmr+  pure ([], Just $! res)+compileToObjCodeIfNeeded hsc (Just linkableType) getGuts tmr = do+  (diags, mguts) <- getGuts+  case mguts of+    Nothing -> pure (diags, Nothing)+    Just guts -> do+      (diags', !res) <- liftIO $ mkHiFileResultCompile hsc tmr guts linkableType+      pure (diags++diags', res)++getClientSettingsRule :: Rules ()+getClientSettingsRule = defineEarlyCutOffNoFile $ \GetClientSettings -> do+  alwaysRerun+  settings <- clientSettings <$> getIdeConfiguration+  return (BS.pack . show . hash $ settings, settings)++-- | For now we always use bytecode+getLinkableType :: NormalizedFilePath -> Action (Maybe LinkableType)+getLinkableType f = do+  needsComp <- use_ NeedsCompilation f+  pure $ if needsComp then Just BCOLinkable else Nothing++needsCompilationRule :: Rules ()+needsCompilationRule = defineEarlyCutoff $ \NeedsCompilation file -> do+  ((ms,_),_) <- useWithStale_ GetModSummaryWithoutTimestamps file+  -- A file needs object code if it uses TH or any file that depends on it uses TH+  res <-+    if uses_th_qq ms+    then pure True+    -- Treat as False if some reverse dependency header fails to parse+    else anyM (fmap (fromMaybe False) . use NeedsCompilation) . maybe [] (immediateReverseDependencies file)+           =<< useNoFile GetModuleGraph+  pure (Just $ BS.pack $ show $ hash res, ([], Just res))+  where+    uses_th_qq (ms_hspp_opts -> dflags) =+      xopt LangExt.TemplateHaskell dflags || xopt LangExt.QuasiQuotes dflags++-- | Tracks which linkables are current, so we don't need to unload them+newtype CompiledLinkables = CompiledLinkables { getCompiledLinkables :: Var (ModuleEnv UTCTime) }+instance IsIdeGlobal CompiledLinkables+ -- | A rule that wires per-file rules together mainRule :: Rules () mainRule = do+    linkables <- liftIO $ newVar emptyModuleEnv+    addIdeGlobal $ CompiledLinkables linkables     getParsedModuleRule     getLocatedImportsRule     getDependencyInformationRule     reportImportCyclesRule     getDependenciesRule     typeCheckRule-    getSpanInfoRule-    generateCoreRule-    generateByteCodeRule+    getDocMapRule     loadGhcSession     getModIfaceFromDiskRule     getModIfaceRule+    getModIfaceWithoutLinkableRule     getModSummaryRule     isHiFileStableRule     getModuleGraphRule     knownFilesRule+    getClientSettingsRule+    getHieAstsRule+    getBindingsRule+    needsCompilationRule+    generateCoreRule+    getImportMapRule  -- | Given the path to a module src file, this rule returns True if the -- corresponding `.hi` file is stable, that is, if it is newer
src/Development/IDE/Core/Service.hs view
@@ -68,7 +68,7 @@             addIdeGlobal $ GlobalIdeOptions options             fileStoreRules vfs             ofInterestRules-            fileExistsRules getLspId caps vfs+            fileExistsRules caps vfs             mainRule  writeProfile :: IdeState -> FilePath -> IO ()
src/Development/IDE/Core/Shake.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DerivingStrategies #-} -- Copyright (c) 2019 The DAML Authors. All rights reserved. -- SPDX-License-Identifier: Apache-2.0 @@ -24,7 +26,7 @@ module Development.IDE.Core.Shake(     IdeState, shakeExtras,     ShakeExtras(..), getShakeExtras, getShakeExtrasRules,-    KnownTargets, toKnownFiles,+    KnownTargets, Target(..), toKnownFiles,     IdeRule, IdeResult,     GetModificationTime(GetModificationTime, GetModificationTime_, missingFileDiagnostics),     shakeOpen, shakeShut,@@ -165,8 +167,12 @@     }  -- | A mapping of module name to known files-type KnownTargets = HashMap ModuleName [NormalizedFilePath]+type KnownTargets = HashMap Target [NormalizedFilePath] +data Target = TargetModule ModuleName | TargetFile NormalizedFilePath+  deriving ( Eq, Generic, Show )+  deriving anyclass (Hashable, NFData)+ toKnownFiles :: KnownTargets -> HashSet NormalizedFilePath toKnownFiles = HSet.fromList . concat . HMap.elems @@ -556,15 +562,15 @@     withMVar'         shakeSession         (\runner -> do-              (stopTime,queue) <- duration (cancelShakeSession runner)+              (stopTime,()) <- duration (cancelShakeSession runner)               res <- shakeDatabaseProfile shakeProfileDir shakeDb               let profile = case res of                       Just fp -> ", profile saved at " <> fp                       _ -> ""-              logDebug (logger shakeExtras) $ T.pack $-                  "Restarting build session (aborting the previous one took " ++-                  showDuration stopTime ++ profile ++ ")"-              return queue+              let msg = T.pack $ "Restarting build session (aborting the previous one took "+                              ++ showDuration stopTime ++ profile ++ ")"+              logDebug (logger shakeExtras) msg+              notifyTestingLogMessage shakeExtras msg         )         -- It is crucial to be masked here, otherwise we can get killed         -- between spawning the new thread and updating shakeSession.@@ -572,6 +578,14 @@         (\() -> do           (,()) <$> newSession shakeExtras shakeDb acts) +notifyTestingLogMessage :: ShakeExtras -> T.Text -> IO ()+notifyTestingLogMessage extras msg = do+    (IdeTesting isTestMode) <- optTesting <$> getIdeOptionsIO extras+    let notif = LSP.NotLogMessage $ LSP.NotificationMessage "2.0" LSP.WindowLogMessage+                                  $ LSP.LogMessageParams LSP.MtLog msg+    when isTestMode $ eventer extras notif++ -- | Enqueue an action in the existing 'ShakeSession'. --   Returns a computation to block until the action is run, propagating exceptions. --   Assumes a 'ShakeSession' is available.@@ -597,7 +611,7 @@ -- | Set up a new 'ShakeSession' with a set of initial actions --   Will crash if there is an existing 'ShakeSession' running. newSession :: ShakeExtras -> ShakeDatabase -> [DelayedActionInternal] -> IO ShakeSession-newSession ShakeExtras{..} shakeDb acts = do+newSession extras@ShakeExtras{..} shakeDb acts = do     reenqueued <- atomically $ peekInProgress actionQueue     let         -- A daemon-like action used to inject additional work@@ -611,19 +625,22 @@             getAction d             liftIO $ atomically $ doneQueue d actionQueue             runTime <- liftIO start-            liftIO $ logPriority logger (actionPriority d) $ T.pack $-                "finish: " ++ actionName d ++ " (took " ++ showDuration runTime ++ ")"+            let msg = T.pack $ "finish: " ++ actionName d+                            ++ " (took " ++ showDuration runTime ++ ")"+            liftIO $ do+                logPriority logger (actionPriority d) msg+                notifyTestingLogMessage extras msg          workRun restore = do-          let acts' = pumpActionThread : map getAction (reenqueued ++ acts)-          res <- try @SomeException-                 (restore $ shakeRunDatabase shakeDb acts')+          let acts' = pumpActionThread : map run (reenqueued ++ acts)+          res <- try @SomeException (restore $ shakeRunDatabase shakeDb acts')           let res' = case res of                       Left e -> "exception: " <> displayException e                       Right _ -> "completed"--          let wrapUp = logDebug logger $ T.pack $ "Finishing build session(" ++ res' ++ ")"-          return wrapUp+          let msg = T.pack $ "Finishing build session(" ++ res' ++ ")"+          return $ do+              logDebug logger msg+              notifyTestingLogMessage extras msg      -- Do the work in a background thread     workThread <- asyncWithUnmask workRun@@ -652,8 +669,8 @@         alreadyDone <- liftIO $ isJust <$> waitBarrierMaybe b         unless alreadyDone $ do           x <- actionCatch @SomeException (Right <$> a) (pure . Left)-          liftIO $ do-            signalBarrier b x+          -- ignore exceptions if the barrier has been filled concurrently+          liftIO $ void $ try @SomeException $ signalBarrier b x       d' = DelayedAction (Just u) s p a'   return (b, d') @@ -720,7 +737,7 @@         Just v -> return v  newtype IdeAction a = IdeAction { runIdeActionT  :: (ReaderT ShakeExtras IO) a }-    deriving (MonadReader ShakeExtras, MonadIO, Functor, Applicative, Monad)+    deriving newtype (MonadReader ShakeExtras, MonadIO, Functor, Applicative, Monad)  -- | IdeActions are used when we want to return a result immediately, even if it -- is stale Useful for UI actions like hover, completion where we don't want to@@ -802,7 +819,7 @@     | otherwise = False  newtype Q k = Q (k, NormalizedFilePath)-    deriving (Eq,Hashable,NFData, Generic)+    deriving newtype (Eq, Hashable, NFData)  instance Binary k => Binary (Q k) where     put (Q (k, fp)) = put (k, fp)
src/Development/IDE/GHC/CPP.hs view
@@ -26,7 +26,6 @@ import Packages import SysTools import Module-import DynFlags import Panic import FileCleanup #if MIN_GHC_API_VERSION(8,8,2)
src/Development/IDE/GHC/Compat.hs view
@@ -5,17 +5,19 @@ {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE PatternSynonyms #-}-{-# OPTIONS -Wno-dodgy-imports #-}+{-# OPTIONS -Wno-dodgy-imports -Wno-incomplete-uni-patterns #-} #include "ghc-api-version.h"  -- | Attempt at hiding the GHC version differences we can. module Development.IDE.GHC.Compat(-    getHeaderImports,     HieFileResult(..),     HieFile(..),     NameCacheUpdater(..),     hieExportNames,     mkHieFile,+    mkHieFile',+    enrichHie,+    RefMap,     writeHieFile,     readHieFile,     supportsHieFiles,@@ -26,125 +28,91 @@     addBootSuffixLocnOut, #endif     hPutStringBuffer,-    includePathsGlobal,-    includePathsQuote,     addIncludePathsQuote,     getModuleHash,     getPackageName,     setUpTypedHoles,-    pattern DerivD,-    pattern ForD,-    pattern InstD,-    pattern TyClD,-    pattern ValD,-    pattern SigD,-    pattern TypeSig,-    pattern ClassOpSig,-    pattern IEThingAll,-    pattern IEThingWith,-    pattern VarPat,-    pattern PatSynBind,-    pattern ValBinds,-    pattern HsValBinds,     GHC.ModLocation,     Module.addBootSuffix,     pattern ModLocation,-    getConArgs,+    pattern ExposePackage,     HasSrcSpan,     getLoc,     upNameCache,     disableWarningsAsErrors,+    AvailInfo,+    tcg_exports, +#if MIN_GHC_API_VERSION(8,10,0)+    module GHC.Hs.Extension,+    module LinkerTypes,+#else+    module HsExtension,+    noExtField,+    linkableTime,+#endif+     module GHC,+    module DynFlags,     initializePlugins,     applyPluginsParsedResultAction,-#if MIN_GHC_API_VERSION(8,6,0)+    module Compat.HieTypes,+    module Compat.HieUtils, -#if MIN_GHC_API_VERSION(8,8,0)-    module HieTypes,-    module HieUtils,-#else-    module Development.IDE.GHC.HieTypes,-    module Development.IDE.GHC.HieUtils,-#endif+    ) where +#if MIN_GHC_API_VERSION(8,10,0)+import LinkerTypes #endif-    ) where  import StringBuffer-import DynFlags-import FieldLabel+import qualified DynFlags+import DynFlags hiding (ExposePackage) import Fingerprint (Fingerprint) import qualified Module import Packages import Data.IORef import HscTypes import NameCache+import qualified Data.ByteString as BS+import MkIface+import TcRnTypes+import Compat.HieAst (mkHieFile,enrichHie)+import Compat.HieBin+import Compat.HieTypes+import Compat.HieUtils +#if MIN_GHC_API_VERSION(8,10,0)+import GHC.Hs.Extension+#else+import HsExtension+#endif+ import qualified GHC import GHC hiding (-      ClassOpSig,-      DerivD,-      ForD,-      IEThingAll,-      IEThingWith,-      InstD,-      TyClD,-      ValD,-      SigD,-      TypeSig,-      VarPat,       ModLocation,       HasSrcSpan,-      PatSynBind,-      ValBinds,-      HsValBinds,       lookupName,       getLoc-#if MIN_GHC_API_VERSION(8,6,0)-    , getConArgs-#endif     )-import qualified HeaderInfo as Hdr import Avail+#if MIN_GHC_API_VERSION(8,8,0) import Data.List (foldl')-import ErrUtils (ErrorMessages)-import FastString (FastString)+#else+import Data.List (foldl', isSuffixOf)+#endif -#if MIN_GHC_API_VERSION(8,6,0)-import Development.IDE.GHC.HieAst (mkHieFile)-import Development.IDE.GHC.HieBin-import qualified DynamicLoading+import DynamicLoading import Plugins (Plugin(parsedResultAction), withPlugins)+import Data.Map.Strict (Map) -#if MIN_GHC_API_VERSION(8,8,0)-import HieUtils-import HieTypes-#else-import Development.IDE.GHC.HieUtils-import Development.IDE.GHC.HieTypes+#if !MIN_GHC_API_VERSION(8,8,0) import System.FilePath ((-<.>)) #endif -#endif- #if !MIN_GHC_API_VERSION(8,8,0) import qualified EnumSet -#if MIN_GHC_API_VERSION(8,6,0)-import GhcPlugins (srcErrorMessages)-import Data.List (isSuffixOf)-#else-import System.IO.Error-import IfaceEnv-import Binary-import Data.ByteString (ByteString)-import GhcPlugins (Hsc, srcErrorMessages)-import TcRnTypes-import MkIface-#endif--import Control.Exception (catch) import System.IO import Foreign.ForeignPtr @@ -156,7 +124,11 @@  #endif -#if MIN_GHC_API_VERSION(8,6,0)+#if !MIN_GHC_API_VERSION(8,10,0)+noExtField :: NoExt+noExtField = noExt+#endif+ supportsHieFiles :: Bool supportsHieFiles = True @@ -170,8 +142,6 @@   | otherwise  = ml_hi_file ml -<.> ".hie" #endif -#endif- upNameCache :: IORef NameCache -> (NameCache -> (NameCache, c)) -> IO c #if !MIN_GHC_API_VERSION(8,8,0) upNameCache ref upd_fn@@ -179,93 +149,32 @@ #else upNameCache = updNameCache #endif-#if !MIN_GHC_API_VERSION(8,6,0)-includePathsGlobal, includePathsQuote :: [String] -> [String]-includePathsGlobal = id-includePathsQuote = const []-#endif  +type RefMap = Map Identifier [(Span, IdentifierDetails Type)]++mkHieFile' :: ModSummary+           -> [AvailInfo]+           -> HieASTs Type+           -> BS.ByteString+           -> Hsc HieFile+mkHieFile' ms exports asts src = do+  let Just src_file = ml_hs_file $ ms_location ms+      (asts',arr) = compressTypes asts+  return $ HieFile+      { hie_hs_file = src_file+      , hie_module = ms_mod ms+      , hie_types = arr+      , hie_asts = asts'+      -- mkIfaceExports sorts the AvailInfos for stability+      , hie_exports = mkIfaceExports exports+      , hie_hs_src = src+      }+ addIncludePathsQuote :: FilePath -> DynFlags -> DynFlags-#if MIN_GHC_API_VERSION(8,6,0) addIncludePathsQuote path x = x{includePaths = f $ includePaths x}     where f i = i{includePathsQuote = path : includePathsQuote i}-#else-addIncludePathsQuote path x = x{includePaths = path : includePaths x}-#endif -pattern DerivD :: DerivDecl p -> HsDecl p-pattern DerivD x <--#if MIN_GHC_API_VERSION(8,6,0)-    GHC.DerivD _ x-#else-    GHC.DerivD x-#endif--pattern ForD :: ForeignDecl p -> HsDecl p-pattern ForD x <--#if MIN_GHC_API_VERSION(8,6,0)-    GHC.ForD _ x-#else-    GHC.ForD x-#endif--pattern ValD :: HsBind p -> HsDecl p-pattern ValD x <--#if MIN_GHC_API_VERSION(8,6,0)-    GHC.ValD _ x-#else-    GHC.ValD x-#endif--pattern InstD :: InstDecl p -> HsDecl p-pattern InstD x <--#if MIN_GHC_API_VERSION(8,6,0)-    GHC.InstD _ x-#else-    GHC.InstD x-#endif--pattern TyClD :: TyClDecl p -> HsDecl p-pattern TyClD x <--#if MIN_GHC_API_VERSION(8,6,0)-    GHC.TyClD _ x-#else-    GHC.TyClD x-#endif--pattern SigD :: Sig p -> HsDecl p-pattern SigD x <--#if MIN_GHC_API_VERSION(8,6,0)-    GHC.SigD _ x-#else-    GHC.SigD x-#endif--pattern TypeSig :: [Located (IdP p)] -> LHsSigWcType p -> Sig p-pattern TypeSig x y <--#if MIN_GHC_API_VERSION(8,6,0)-    GHC.TypeSig _ x y-#else-    GHC.TypeSig x y-#endif--pattern ClassOpSig :: Bool -> [Located (IdP pass)] -> LHsSigType pass -> Sig pass-pattern ClassOpSig a b c <--#if MIN_GHC_API_VERSION(8,6,0)-    GHC.ClassOpSig _ a b c-#else-    GHC.ClassOpSig a b c-#endif--pattern IEThingWith :: LIEWrappedName (IdP pass) -> IEWildcard -> [LIEWrappedName (IdP pass)] -> [Located (FieldLbl (IdP pass))] -> IE pass-pattern IEThingWith a b c d <--#if MIN_GHC_API_VERSION(8,6,0)-    GHC.IEThingWith _ a b c d-#else-    GHC.IEThingWith a b c d-#endif- pattern ModLocation :: Maybe FilePath -> FilePath -> FilePath -> GHC.ModLocation pattern ModLocation a b c <- #if MIN_GHC_API_VERSION(8,8,0)@@ -274,46 +183,6 @@     GHC.ModLocation a b c where ModLocation a b c = GHC.ModLocation a b c #endif -pattern IEThingAll :: LIEWrappedName (IdP pass) -> IE pass-pattern IEThingAll a <--#if MIN_GHC_API_VERSION(8,6,0)-    GHC.IEThingAll _ a-#else-    GHC.IEThingAll a-#endif--pattern VarPat :: Located (IdP p) -> Pat p-pattern VarPat x <--#if MIN_GHC_API_VERSION(8,6,0)-    GHC.VarPat _ x-#else-    GHC.VarPat x-#endif--pattern PatSynBind :: GHC.PatSynBind p p -> HsBind p-pattern PatSynBind x <--#if MIN_GHC_API_VERSION(8,6,0)-    GHC.PatSynBind _ x-#else-    GHC.PatSynBind x-#endif--pattern ValBinds :: LHsBinds p -> [LSig p] -> HsValBindsLR p p-pattern ValBinds b s <--#if MIN_GHC_API_VERSION(8,6,0)-    GHC.ValBinds _ b s-#else-    GHC.ValBindsIn b s-#endif--pattern HsValBinds :: HsValBindsLR p p -> HsLocalBindsLR p p-pattern HsValBinds b <--#if MIN_GHC_API_VERSION(8,6,0)-    GHC.HsValBinds _ b-#else-    GHC.HsValBinds b-#endif- setHieDir :: FilePath -> DynFlags -> DynFlags setHieDir _f d = #if MIN_GHC_API_VERSION(8,8,0)@@ -331,7 +200,6 @@ #endif  setUpTypedHoles ::DynFlags -> DynFlags-#if MIN_GHC_API_VERSION(8,6,0) setUpTypedHoles df   = flip gopt_unset Opt_AbstractRefHoleFits    -- too spammy #if MIN_GHC_API_VERSION(8,8,0)@@ -350,74 +218,13 @@   , maxRefHoleFits   = Just 10  -- quantity does not impact speed   , maxValidHoleFits = Nothing  -- quantity does not impact speed   }-#else-setUpTypedHoles = id-#endif   nameListFromAvails :: [AvailInfo] -> [(SrcSpan, Name)] nameListFromAvails as =   map (\n -> (nameSrcSpan n, n)) (concatMap availNames as) -#if !MIN_GHC_API_VERSION(8,6,0)--- Reimplementations of functions for HIE files for GHC 8.6--mkHieFile :: ModSummary -> TcGblEnv -> RenamedSource -> ByteString -> Hsc HieFile-mkHieFile ms ts _ _ = return (HieFile (ms_mod ms) es)-  where-    es = nameListFromAvails (mkIfaceExports (tcg_exports ts))--ml_hie_file :: GHC.ModLocation -> FilePath-ml_hie_file ml = ml_hi_file ml ++ ".hie"--data HieFile = HieFile {hie_module :: Module, hie_exports :: [(SrcSpan, Name)]}--hieExportNames :: HieFile -> [(SrcSpan, Name)]-hieExportNames = hie_exports--instance Binary HieFile where-  put_ bh (HieFile m es) = do-    put_ bh m-    put_ bh es--  get bh = do-    mod <- get bh-    es <- get bh-    return (HieFile mod es)--data HieFileResult = HieFileResult { hie_file_result :: HieFile }--writeHieFile :: FilePath -> HieFile -> IO ()-readHieFile :: NameCacheUpdater -> FilePath -> IO HieFileResult-supportsHieFiles :: Bool--#if MIN_GHC_API_VERSION(8,4,0)--supportsHieFiles = False--writeHieFile _ _ = return ()--readHieFile _ fp = ioError $ mkIOError doesNotExistErrorType "" Nothing (Just fp)--#endif--#endif--getHeaderImports-  :: DynFlags-  -> StringBuffer-  -> FilePath-  -> FilePath-  -> IO-       ( Either-           ErrorMessages-           ( [(Maybe FastString, Located ModuleName)]-           , [(Maybe FastString, Located ModuleName)]-           , Located ModuleName-           )-       ) #if MIN_GHC_API_VERSION(8,8,0)-getHeaderImports = Hdr.getImports  type HasSrcSpan = GHC.HasSrcSpan getLoc :: HasSrcSpan a => a -> SrcSpan@@ -432,10 +239,6 @@ instance HasSrcSpan (GenLocated SrcSpan a) where     getLoc = GHC.getLoc -getHeaderImports a b c d =-    catch (Right <$> Hdr.getImports a b c d)-          (return . Left . srcErrorMessages)- -- | Add the @-boot@ suffix to all output file paths associated with the -- module, not including the input file itself addBootSuffixLocnOut :: GHC.ModLocation -> GHC.ModLocation@@ -452,13 +255,6 @@ getModuleHash = mi_mod_hash #endif -getConArgs :: ConDecl pass -> HsConDeclDetails pass-#if MIN_GHC_API_VERSION(8,6,0)-getConArgs = GHC.getConArgs-#else-getConArgs = GHC.getConDetails-#endif- getPackageName :: DynFlags -> Module.InstalledUnitId -> Maybe PackageName getPackageName dfs i = packageName <$> lookupPackage dfs (Module.DefiniteUnitId (Module.DefUnitId i)) @@ -472,26 +268,18 @@     = dfs { fatalWarningFlags = EnumSet.delete f (fatalWarningFlags dfs) } #endif -#if MIN_GHC_API_VERSION(8,6,0)-initializePlugins :: HscEnv -> DynFlags -> IO DynFlags-initializePlugins env dflags = do-    DynamicLoading.initializePlugins env dflags- applyPluginsParsedResultAction :: HscEnv -> DynFlags -> ModSummary -> ApiAnns -> ParsedSource -> IO ParsedSource applyPluginsParsedResultAction env dflags ms hpm_annotations parsed = do   -- Apply parsedResultAction of plugins   let applyPluginAction p opts = parsedResultAction p opts ms-  fmap hpm_module $ -    runHsc env $ withPlugins dflags applyPluginAction +  fmap hpm_module $+    runHsc env $ withPlugins dflags applyPluginAction       (HsParsedModule parsed [] hpm_annotations) +pattern ExposePackage :: String -> PackageArg -> ModRenaming -> PackageFlag+-- https://github.com/facebook/fbghc+#ifdef __FACEBOOK_HASKELL__+pattern ExposePackage s a mr <- DynFlags.ExposePackage s a _ mr #else-initializePlugins :: HscEnv -> DynFlags -> IO DynFlags-initializePlugins _env dflags = do-    return dflags--applyPluginsParsedResultAction :: HscEnv -> DynFlags -> ModSummary -> ApiAnns -> ParsedSource -> IO ParsedSource-applyPluginsParsedResultAction _env _dflags _ms _hpm_annotations parsed =-    return parsed+pattern ExposePackage s a mr = DynFlags.ExposePackage s a mr #endif-
src/Development/IDE/GHC/Error.hs view
@@ -14,6 +14,7 @@   , srcSpanToLocation   , srcSpanToRange   , realSrcSpanToRange+  , realSrcLocToPosition   , srcSpanToFilename   , zeroSpan   , realSpan@@ -32,13 +33,11 @@ import qualified FastString as FS import           GHC import           Bag-import DynFlags import HscTypes import Panic import           ErrUtils import           SrcLoc import qualified Outputable                 as Out-import Exception (ExceptionMonad)   @@ -72,9 +71,13 @@  realSrcSpanToRange :: RealSrcSpan -> Range realSrcSpanToRange real =-  Range (Position (srcSpanStartLine real - 1) (srcSpanStartCol real - 1))-            (Position (srcSpanEndLine real - 1) (srcSpanEndCol real - 1))+  Range (realSrcLocToPosition $ realSrcSpanStart real)+        (realSrcLocToPosition $ realSrcSpanEnd   real) +realSrcLocToPosition :: RealSrcLoc -> Position+realSrcLocToPosition real =+  Position (srcLocLine real - 1) (srcLocCol real - 1)+ -- | Extract a file name from a GHC SrcSpan (use message for unhelpful ones) -- FIXME This may not be an _absolute_ file name, needs fixing. srcSpanToFilename :: SrcSpan -> Maybe FilePath@@ -132,14 +135,14 @@   UnhelpfulSpan _ -> Nothing  --- | Run something in a Ghc monad and catch the errors (SourceErrors and--- compiler-internal exceptions like Panic or InstallationError).-catchSrcErrors :: (HasDynFlags m, ExceptionMonad m) => T.Text -> m a -> m (Either [FileDiagnostic] a)-catchSrcErrors fromWhere ghcM = do-      dflags <- getDynFlags-      handleGhcException (ghcExceptionToDiagnostics dflags) $-        handleSourceError (sourceErrorToDiagnostics dflags) $-        Right <$> ghcM+-- | Catch the errors thrown by GHC (SourceErrors and+-- compiler-internal exceptions like Panic or InstallationError), and turn them into+-- diagnostics+catchSrcErrors :: DynFlags -> T.Text -> IO a -> IO (Either [FileDiagnostic] a)+catchSrcErrors dflags fromWhere ghcM = do+    handleGhcException (ghcExceptionToDiagnostics dflags) $+      handleSourceError (sourceErrorToDiagnostics dflags) $+      Right <$> ghcM     where         ghcExceptionToDiagnostics dflags = return . Left . diagFromGhcException fromWhere dflags         sourceErrorToDiagnostics dflags = return . Left . diagFromErrMsgs fromWhere dflags . srcErrorMessages
src/Development/IDE/GHC/Orphans.hs view
@@ -10,13 +10,14 @@ --   Note that the 'NFData' instances may not be law abiding. module Development.IDE.GHC.Orphans() where -import GHC-import GhcPlugins-import Development.IDE.GHC.Compat-import qualified StringBuffer as SB-import Control.DeepSeq-import Data.Hashable-import Development.IDE.GHC.Util+import           Bag+import           Control.DeepSeq+import           Data.Hashable+import           Development.IDE.GHC.Compat+import           Development.IDE.GHC.Util+import           GHC                        ()+import           GhcPlugins+import qualified StringBuffer               as SB   -- Orphan instances for types from the GHC API.@@ -29,6 +30,11 @@ instance NFData SafeHaskellMode where rnf = rwhnf instance Show Linkable where show = prettyPrint instance NFData Linkable where rnf = rwhnf+instance Show PackageFlag where show = prettyPrint+instance Show InteractiveImport where show = prettyPrint+instance Show ComponentId  where show = prettyPrint+instance Show PackageName  where show = prettyPrint+instance Show SourcePackageId  where show = prettyPrint  instance Show InstalledUnitId where     show = installedUnitIdString@@ -40,7 +46,7 @@ instance Show Module where     show = moduleNameString . moduleName -instance Show (GenLocated SrcSpan ModuleName) where show = prettyPrint+instance Outputable a => Show (GenLocated SrcSpan a) where show = prettyPrint  instance (NFData l, NFData e) => NFData (GenLocated l e) where     rnf (L l e) = rnf l `seq` rnf e@@ -80,3 +86,27 @@     show = moduleNameString instance Hashable ModuleName where     hashWithSalt salt = hashWithSalt salt . show+++instance NFData a => NFData (IdentifierDetails a) where+    rnf (IdentifierDetails a b) = rnf a `seq` rnf (length b)++instance NFData RealSrcSpan where+    rnf = rwhnf++instance NFData Type where+    rnf = rwhnf++instance Show a => Show (Bag a) where+    show = show . bagToList++instance NFData HsDocString where+    rnf = rwhnf++instance Show ModGuts where+    show _ = "modguts"+instance NFData ModGuts where+    rnf = rwhnf++instance NFData (ImportDecl GhcPs) where+    rnf = rwhnf
src/Development/IDE/GHC/Util.hs view
@@ -10,7 +10,6 @@     envImportPaths,     modifyDynFlags,     evalGhcEnv,-    runGhcEnv,     deps,     -- * GHC wrappers     prettyPrint,@@ -31,7 +30,8 @@     setHieDir,     dontWriteHieFiles,     disableWarningsAsErrors,-    newHscEnvEqPreserveImportPaths) where+    newHscEnvEqPreserveImportPaths,+    newHscEnvEqWithImportPaths) where  import Control.Concurrent import Data.List.Extra@@ -68,13 +68,13 @@ import Packages (getPackageConfigMap, lookupPackage') import SrcLoc (mkRealSrcLoc) import FastString (mkFastString)-import DynFlags (emptyFilesToClean, unsafeGlobalDynFlags) import Module (moduleNameSlashes, InstalledUnitId) import OccName (parenSymOcc) import RdrName (nameRdrName, rdrNameOcc)  import Development.IDE.GHC.Compat as GHC import Development.IDE.Types.Location+import System.Directory (canonicalizePath)   ----------------------------------------------------------------------@@ -188,9 +188,19 @@ newHscEnvEq :: FilePath -> HscEnv -> [(InstalledUnitId, DynFlags)] -> IO HscEnvEq newHscEnvEq cradlePath hscEnv0 deps = do     envUnique <- newUnique-    let envImportPaths = Just $ relativeToCradle <$> importPaths (hsc_dflags hscEnv0)-        relativeToCradle = (takeDirectory cradlePath </>)+    let relativeToCradle = (takeDirectory cradlePath </>)         hscEnv = removeImportPaths hscEnv0++    -- Canonicalize import paths since we also canonicalize targets+    importPathsCanon <-+      mapM canonicalizePath $ relativeToCradle <$> importPaths (hsc_dflags hscEnv0)+    let envImportPaths = Just importPathsCanon++    return HscEnvEq{..}++newHscEnvEqWithImportPaths :: Maybe [String] -> HscEnv -> [(InstalledUnitId, DynFlags)] -> IO HscEnvEq+newHscEnvEqWithImportPaths envImportPaths hscEnv deps = do+    envUnique <- newUnique     return HscEnvEq{..}  -- | Wrap an 'HscEnv' into an 'HscEnvEq'.
src/Development/IDE/GHC/Warnings.hs view
@@ -3,16 +3,13 @@  module Development.IDE.GHC.Warnings(withWarnings) where -import GhcMonad import ErrUtils import GhcPlugins as GHC hiding (Var)  import           Control.Concurrent.Extra-import           Control.Monad.Extra import qualified           Data.Text as T  import           Development.IDE.Types.Diagnostics-import Development.IDE.GHC.Util import           Development.IDE.GHC.Error  @@ -25,19 +22,13 @@ --   https://github.com/ghc/ghc/blob/5f1d949ab9e09b8d95319633854b7959df06eb58/compiler/main/GHC.hs#L623-L640 --   which basically says that log_action is taken from the ModSummary when GHC feels like it. --   The given argument lets you refresh a ModSummary log_action-withWarnings :: GhcMonad m => T.Text -> ((ModSummary -> ModSummary) -> m a) -> m ([(WarnReason, FileDiagnostic)], a)+withWarnings :: T.Text -> ((ModSummary -> ModSummary) -> IO a) -> IO ([(WarnReason, FileDiagnostic)], a) withWarnings diagSource action = do-  warnings <- liftIO $ newVar []-  oldFlags <- getDynFlags+  warnings <- newVar []   let newAction :: DynFlags -> WarnReason -> Severity -> SrcSpan -> PprStyle -> SDoc -> IO ()       newAction dynFlags wr _ loc style msg = do         let wr_d = fmap (wr,) $ diagFromErrMsg diagSource dynFlags $ mkWarnMsg dynFlags loc (queryQual style) msg         modifyVar_ warnings $ return . (wr_d:)-  setLogAction newAction   res <- action $ \x -> x{ms_hspp_opts = (ms_hspp_opts x){log_action = newAction}}-  setLogAction $ log_action oldFlags-  warns <- liftIO $ readVar warnings+  warns <- readVar warnings   return (reverse $ concat warns, res)--setLogAction :: GhcMonad m => LogAction -> m ()-setLogAction act = void $ modifyDynFlags $ \dyn -> dyn{log_action = act}
− src/Development/IDE/GHC/WithDynFlags.hs
@@ -1,30 +0,0 @@-module Development.IDE.GHC.WithDynFlags-( WithDynFlags-, evalWithDynFlags-) where--import Control.Monad.Trans.Reader (ask, ReaderT(..))-import GHC (DynFlags)-import Control.Monad.IO.Class (MonadIO)-import Exception (ExceptionMonad(..))-import Control.Monad.Trans.Class (MonadTrans(..))-import GhcPlugins (HasDynFlags(..))---- | A monad transformer implementing the 'HasDynFlags' effect-newtype WithDynFlags m a = WithDynFlags {withDynFlags :: ReaderT DynFlags m a}-  deriving (Applicative, Functor, Monad, MonadIO, MonadTrans)--evalWithDynFlags :: DynFlags -> WithDynFlags m a -> m a-evalWithDynFlags dflags = flip runReaderT dflags . withDynFlags--instance Monad m => HasDynFlags (WithDynFlags m) where-    getDynFlags = WithDynFlags ask--instance ExceptionMonad m => ExceptionMonad (WithDynFlags m) where-    gmask f = WithDynFlags $ ReaderT $ \env ->-        gmask $ \restore ->-            let restore' = lift . restore . flip runReaderT env . withDynFlags-            in runReaderT (withDynFlags $ f restore') env--    gcatch (WithDynFlags act) handle = WithDynFlags $ ReaderT $ \env ->-        gcatch (runReaderT act env) (flip runReaderT env . withDynFlags . handle)
src/Development/IDE/Import/DependencyInformation.hs view
@@ -21,7 +21,8 @@   , reachableModules   , processDependencyInformation   , transitiveDeps-  , reverseDependencies+  , transitiveReverseDependencies+  , immediateReverseDependencies    , BootIdMap   , insertBootId@@ -316,8 +317,8 @@ partitionSCC []                  = ([], [])  -- | Transitive reverse dependencies of a file-reverseDependencies :: NormalizedFilePath -> DependencyInformation -> [NormalizedFilePath]-reverseDependencies file DependencyInformation{..} =+transitiveReverseDependencies :: NormalizedFilePath -> DependencyInformation -> [NormalizedFilePath]+transitiveReverseDependencies file DependencyInformation{..} =   let FilePathId cur_id = pathToId depPathIdMap file   in map (idToPath depPathIdMap . FilePathId) (IntSet.toList (go cur_id IntSet.empty))   where@@ -328,6 +329,12 @@           new = IntSet.difference i outwards       in IntSet.foldr go res new +-- | Immediate reverse dependencies of a file+immediateReverseDependencies :: NormalizedFilePath -> DependencyInformation -> [NormalizedFilePath]+immediateReverseDependencies file DependencyInformation{..} =+  let FilePathId cur_id = pathToId depPathIdMap file+  in map (idToPath depPathIdMap . FilePathId) (maybe mempty IntSet.toList (IntMap.lookup cur_id depReverseModuleDeps))+ transitiveDeps :: DependencyInformation -> NormalizedFilePath -> Maybe TransitiveDependencies transitiveDeps DependencyInformation{..} file = do   let !fileId = pathToId depPathIdMap file@@ -378,7 +385,7 @@ data NamedModuleDep = NamedModuleDep {   nmdFilePath :: !NormalizedFilePath,   nmdModuleName :: !ModuleName,-  nmdModLocation :: !ModLocation+  nmdModLocation :: !(Maybe ModLocation)   }   deriving Generic 
src/Development/IDE/Import/FindImports.hs view
@@ -32,6 +32,7 @@ import           System.FilePath import DriverPhases import Data.Maybe+import Data.List (isSuffixOf)  data Import   = FileImport !ArtifactsLocation@@ -40,7 +41,7 @@  data ArtifactsLocation = ArtifactsLocation   { artifactFilePath    :: !NormalizedFilePath-  , artifactModLocation :: !ModLocation+  , artifactModLocation :: !(Maybe ModLocation)   , artifactIsSource    :: !Bool          -- ^ True if a module is a source input   }     deriving (Show)@@ -55,12 +56,14 @@   rnf (FileImport x) = rnf x   rnf (PackageImport x) = rnf x -modSummaryToArtifactsLocation :: NormalizedFilePath -> ModSummary -> ArtifactsLocation-modSummaryToArtifactsLocation nfp ms = ArtifactsLocation nfp (ms_location ms) (isSource (ms_hsc_src ms))+modSummaryToArtifactsLocation :: NormalizedFilePath -> Maybe ModSummary -> ArtifactsLocation+modSummaryToArtifactsLocation nfp ms = ArtifactsLocation nfp (ms_location <$> ms) source   where     isSource HsSrcFile = True     isSource _ = False-+    source = case ms of+      Nothing -> "-boot" `isSuffixOf` fromNormalizedFilePath nfp+      Just ms -> isSource (ms_hsc_src ms)  -- | locate a module in the file system. Where we go from *daml to Haskell locateModuleFile :: MonadIO m@@ -123,7 +126,7 @@     import_paths = mapMaybe (mkImportDirs dflags) comp_info     toModLocation file = liftIO $ do         loc <- mkHomeModLocation dflags (unLoc modName) (fromNormalizedFilePath file)-        return $ Right $ FileImport $ ArtifactsLocation file loc (not isSource)+        return $ Right $ FileImport $ ArtifactsLocation file (Just loc) (not isSource)      lookupLocal dirs = do       mbFile <- locateModuleFile dirs exts doesExist isSource $ unLoc modName@@ -155,14 +158,12 @@              { fr_pkgs_hidden = map (moduleUnitId . fst) pkg_hiddens              , fr_mods_hidden = map (moduleUnitId . fst) mod_hiddens              }-#if MIN_GHC_API_VERSION(8,6,0)         LookupUnusable unusable ->           let unusables' = map get_unusable unusable               get_unusable (m, ModUnusable r) = (moduleUnitId m, r)               get_unusable (_, r) =                 pprPanic "findLookupResult: unexpected origin" (ppr r)            in notFound {fr_unusables = unusables'}-#endif         LookupNotFound suggest ->           notFound {fr_suggestions = suggest} @@ -172,8 +173,6 @@   , fr_pkg = Nothing   , fr_pkgs_hidden = []   , fr_mods_hidden = []-#if MIN_GHC_API_VERSION(8,6,0)   , fr_unusables = []-#endif   , fr_suggestions = []   }
src/Development/IDE/LSP/HoverDefinition.hs view
@@ -7,6 +7,7 @@     ( setHandlersHover     , setHandlersDefinition     , setHandlersTypeDefinition+    , setHandlersDocHighlight     -- * For haskell-language-server     , hover     , gotoDefinition@@ -27,21 +28,25 @@ gotoDefinition :: IdeState -> TextDocumentPositionParams -> IO (Either ResponseError LocationResponseParams) hover          :: IdeState -> TextDocumentPositionParams -> IO (Either ResponseError (Maybe Hover)) gotoTypeDefinition :: IdeState -> TextDocumentPositionParams -> IO (Either ResponseError LocationResponseParams)+documentHighlight :: IdeState -> TextDocumentPositionParams -> IO (Either ResponseError (List DocumentHighlight)) gotoDefinition = request "Definition" getDefinition (MultiLoc []) SingleLoc gotoTypeDefinition = request "TypeDefinition" getTypeDefinition (MultiLoc []) MultiLoc hover          = request "Hover"      getAtPoint     Nothing      foundHover+documentHighlight = request "DocumentHighlight" highlightAtPoint (List []) List  foundHover :: (Maybe Range, [T.Text]) -> Maybe Hover foundHover (mbRange, contents) =   Just $ Hover (HoverContents $ MarkupContent MkMarkdown $ T.intercalate sectionSeparator contents) mbRange -setHandlersDefinition, setHandlersHover, setHandlersTypeDefinition :: PartialHandlers c+setHandlersDefinition, setHandlersHover, setHandlersTypeDefinition, setHandlersDocHighlight :: PartialHandlers c setHandlersDefinition = PartialHandlers $ \WithMessage{..} x ->   return x{LSP.definitionHandler = withResponse RspDefinition $ const gotoDefinition} setHandlersTypeDefinition = PartialHandlers $ \WithMessage{..} x ->   return x{LSP.typeDefinitionHandler = withResponse RspDefinition $ const gotoTypeDefinition} setHandlersHover      = PartialHandlers $ \WithMessage{..} x ->   return x{LSP.hoverHandler      = withResponse RspHover      $ const hover}+setHandlersDocHighlight = PartialHandlers $ \WithMessage{..} x ->+  return x{LSP.documentHighlightHandler = withResponse RspDocumentHighlights $ const documentHighlight}  -- | Respond to and log a hover or go-to-definition request request
src/Development/IDE/LSP/LanguageServer.hs view
@@ -106,6 +106,7 @@             initializeRequestHandler <>             setHandlersIgnore <> -- least important             setHandlersDefinition <> setHandlersHover <> setHandlersTypeDefinition <>+            setHandlersDocHighlight <>             setHandlersOutline <>             userHandlers <>             setHandlersNotifications <> -- absolutely critical, join them with user notifications@@ -204,14 +205,16 @@     -> IdeState     -> InitializeParams     -> IO ()-initHandler _ ide params = registerIdeConfiguration (shakeExtras ide) (parseConfiguration params)+initHandler _ ide params = do+    let initConfig = parseConfiguration params+    logInfo (ideLogger ide) $ T.pack $ "Registering ide configuration: " <> show initConfig+    registerIdeConfiguration (shakeExtras ide) initConfig  -- | Things that get sent to us, but we don't deal with. --   Set them to avoid a warning in VS Code output. setHandlersIgnore :: PartialHandlers config setHandlersIgnore = PartialHandlers $ \_ x -> return x-    {LSP.initializedHandler = none-    ,LSP.responseHandler = none+    {LSP.responseHandler = none     }     where none = Just $ const $ return () 
src/Development/IDE/LSP/Notifications.hs view
@@ -12,6 +12,8 @@ import qualified Language.Haskell.LSP.Core        as LSP import           Language.Haskell.LSP.Types import qualified Language.Haskell.LSP.Types       as LSP+import qualified Language.Haskell.LSP.Messages    as LSP+import qualified Language.Haskell.LSP.Types.Capabilities as LSP  import           Development.IDE.Core.IdeConfiguration import           Development.IDE.Core.Service@@ -21,6 +23,7 @@ import           Development.IDE.Types.Options  import           Control.Monad.Extra+import qualified Data.Aeson                       as A import           Data.Foldable                    as F import           Data.Maybe import qualified Data.HashMap.Strict              as M@@ -28,7 +31,7 @@ import qualified Data.Text                        as Text  import           Development.IDE.Core.FileStore   (setSomethingModified, setFileModified, typecheckParents)-import           Development.IDE.Core.FileExists  (modifyFileExists)+import           Development.IDE.Core.FileExists  (modifyFileExists, watchedGlobs) import           Development.IDE.Core.OfInterest  @@ -72,6 +75,8 @@                 logInfo (ideLogger ide) $ "Closed text document: " <> getUri _uri     ,LSP.didChangeWatchedFilesNotificationHandler = withNotification (LSP.didChangeWatchedFilesNotificationHandler x) $         \_ ide (DidChangeWatchedFilesParams fileEvents) -> do+            -- See Note [File existence cache and LSP file watchers] which explains why we get these notifications and+            -- what we do with them             let events =                     mapMaybe                         (\(FileEvent uri ev) ->@@ -80,7 +85,7 @@                         )                         ( F.toList fileEvents )             let msg = Text.pack $ show events-            logInfo (ideLogger ide) $ "Files created or deleted: " <> msg+            logDebug (ideLogger ide) $ "Files created or deleted: " <> msg             modifyFileExists ide events             setSomethingModified ide @@ -91,4 +96,52 @@             modifyWorkspaceFolders ide               $ add       (foldMap (S.singleton . parseWorkspaceFolder) (_added   events))               . substract (foldMap (S.singleton . parseWorkspaceFolder) (_removed events))++    ,LSP.didChangeConfigurationParamsHandler = withNotification (LSP.didChangeConfigurationParamsHandler x) $+        \_ ide (DidChangeConfigurationParams cfg) -> do+            let msg = Text.pack $ show cfg+            logInfo (ideLogger ide) $ "Configuration changed: " <> msg+            modifyClientSettings ide (const $ Just cfg)+            setSomethingModified ide++    -- Initialized handler, good time to dynamically register capabilities+    ,LSP.initializedHandler = withNotification (LSP.initializedHandler x) $ \lsp@LSP.LspFuncs{..} ide _ -> do+        let watchSupported = case () of+              _ | LSP.ClientCapabilities{_workspace} <- clientCapabilities+                , Just LSP.WorkspaceClientCapabilities{_didChangeWatchedFiles} <- _workspace+                , Just LSP.DidChangeWatchedFilesClientCapabilities{_dynamicRegistration} <- _didChangeWatchedFiles+                , Just True <- _dynamicRegistration+                  -> True+                | otherwise -> False++        if watchSupported+        then registerWatcher lsp ide+        else logDebug (ideLogger ide) "Warning: Client does not support watched files. Falling back to OS polling"+     }+    where+        registerWatcher LSP.LspFuncs{..} ide = do+            lspId <- getNextReqId+            opts <- getIdeOptionsIO $ shakeExtras ide+            let+              req = RequestMessage "2.0" lspId ClientRegisterCapability regParams+              regParams    = RegistrationParams (List [registration])+              -- The registration ID is arbitrary and is only used in case we want to deregister (which we won't).+              -- We could also use something like a random UUID, as some other servers do, but this works for+              -- our purposes.+              registration = Registration "globalFileWatches"+                                          WorkspaceDidChangeWatchedFiles+                                          (Just (A.toJSON regOptions))+              regOptions =+                DidChangeWatchedFilesRegistrationOptions { _watchers = List watchers }+              -- See Note [File existence cache and LSP file watchers] for why this exists, and the choice of watch kind+              watchKind = WatchKind { _watchCreate = True, _watchChange = False, _watchDelete = True}+              -- See Note [Which files should we watch?] for an explanation of why the pattern is the way that it is+              -- The patterns will be something like "**/.hs", i.e. "any number of directory segments,+              -- followed by a file with an extension 'hs'.+              watcher glob = FileSystemWatcher { _globPattern = glob, _kind = Just watchKind }+              -- We use multiple watchers instead of one using '{}' because lsp-test doesn't+              -- support that: https://github.com/bubba/lsp-test/issues/77+              watchers = [ watcher glob | glob <- watchedGlobs opts ]++            sendFunc $ LSP.ReqRegisterCapability req
src/Development/IDE/LSP/Outline.hs view
@@ -70,7 +70,7 @@     Nothing -> pure $ Right $ DSDocumentSymbols (List [])  documentSymbolForDecl :: Located (HsDecl GhcPs) -> Maybe DocumentSymbol-documentSymbolForDecl (L (RealSrcSpan l) (TyClD FamDecl { tcdFam = FamilyDecl { fdLName = L _ n, fdInfo, fdTyVars } }))+documentSymbolForDecl (L (RealSrcSpan l) (TyClD _ FamDecl { tcdFam = FamilyDecl { fdLName = L _ n, fdInfo, fdTyVars } }))   = Just (defDocumentSymbol l :: DocumentSymbol)     { _name   = showRdrName n                   <> (case pprText fdTyVars of@@ -80,7 +80,7 @@     , _detail = Just $ pprText fdInfo     , _kind   = SkClass     }-documentSymbolForDecl (L (RealSrcSpan l) (TyClD ClassDecl { tcdLName = L _ name, tcdSigs, tcdTyVars }))+documentSymbolForDecl (L (RealSrcSpan l) (TyClD _ ClassDecl { tcdLName = L _ name, tcdSigs, tcdTyVars }))   = Just (defDocumentSymbol l :: DocumentSymbol)     { _name     = showRdrName name                     <> (case pprText tcdTyVars of@@ -96,11 +96,11 @@             , _kind           = SkMethod             , _selectionRange = realSrcSpanToRange l'             }-        | L (RealSrcSpan l)  (ClassOpSig False names _) <- tcdSigs+        | L (RealSrcSpan l)  (ClassOpSig _ False names _) <- tcdSigs         , L (RealSrcSpan l') n                            <- names         ]     }-documentSymbolForDecl (L (RealSrcSpan l) (TyClD DataDecl { tcdLName = L _ name, tcdDataDefn = HsDataDefn { dd_cons } }))+documentSymbolForDecl (L (RealSrcSpan l) (TyClD _ DataDecl { tcdLName = L _ name, tcdDataDefn = HsDataDefn { dd_cons } }))   = Just (defDocumentSymbol l :: DocumentSymbol)     { _name     = showRdrName name     , _kind     = SkStruct@@ -127,59 +127,55 @@       , L (RealSrcSpan l) n <- rdrNameFieldOcc . unLoc <$> cd_fld_names cdf       ]     conArgRecordFields _ = Nothing-documentSymbolForDecl (L (RealSrcSpan l) (TyClD SynDecl { tcdLName = L (RealSrcSpan l') n })) = Just+documentSymbolForDecl (L (RealSrcSpan l) (TyClD _ SynDecl { tcdLName = L (RealSrcSpan l') n })) = Just   (defDocumentSymbol l :: DocumentSymbol) { _name           = showRdrName n                                           , _kind           = SkTypeParameter                                           , _selectionRange = realSrcSpanToRange l'                                           }-documentSymbolForDecl (L (RealSrcSpan l) (InstD ClsInstD { cid_inst = ClsInstDecl { cid_poly_ty } }))+documentSymbolForDecl (L (RealSrcSpan l) (InstD _ ClsInstD { cid_inst = ClsInstDecl { cid_poly_ty } }))   = Just (defDocumentSymbol l :: DocumentSymbol) { _name = pprText cid_poly_ty                                                  , _kind = SkInterface                                                  }-documentSymbolForDecl (L (RealSrcSpan l) (InstD DataFamInstD { dfid_inst = DataFamInstDecl HsIB { hsib_body = FamEqn { feqn_tycon, feqn_pats } } }))+documentSymbolForDecl (L (RealSrcSpan l) (InstD _ DataFamInstD { dfid_inst = DataFamInstDecl HsIB { hsib_body = FamEqn { feqn_tycon, feqn_pats } } }))   = Just (defDocumentSymbol l :: DocumentSymbol)     { _name = showRdrName (unLoc feqn_tycon) <> " " <> T.unwords                 (map pprText feqn_pats)     , _kind = SkInterface     }-documentSymbolForDecl (L (RealSrcSpan l) (InstD TyFamInstD { tfid_inst = TyFamInstDecl HsIB { hsib_body = FamEqn { feqn_tycon, feqn_pats } } }))+documentSymbolForDecl (L (RealSrcSpan l) (InstD _ TyFamInstD { tfid_inst = TyFamInstDecl HsIB { hsib_body = FamEqn { feqn_tycon, feqn_pats } } }))   = Just (defDocumentSymbol l :: DocumentSymbol)     { _name = showRdrName (unLoc feqn_tycon) <> " " <> T.unwords                 (map pprText feqn_pats)     , _kind = SkInterface     }-documentSymbolForDecl (L (RealSrcSpan l) (DerivD DerivDecl { deriv_type })) =+documentSymbolForDecl (L (RealSrcSpan l) (DerivD _ DerivDecl { deriv_type })) =   gfindtype deriv_type <&> \(L (_ :: SrcSpan) name) ->     (defDocumentSymbol l :: DocumentSymbol) { _name = pprText @(HsType GhcPs)                                               name                                             , _kind = SkInterface                                             }-documentSymbolForDecl (L (RealSrcSpan l) (ValD FunBind{fun_id = L _ name})) = Just+documentSymbolForDecl (L (RealSrcSpan l) (ValD _ FunBind{fun_id = L _ name})) = Just     (defDocumentSymbol l :: DocumentSymbol)       { _name   = showRdrName name       , _kind   = SkFunction       }-documentSymbolForDecl (L (RealSrcSpan l) (ValD PatBind{pat_lhs})) = Just+documentSymbolForDecl (L (RealSrcSpan l) (ValD _ PatBind{pat_lhs})) = Just     (defDocumentSymbol l :: DocumentSymbol)       { _name   = pprText pat_lhs       , _kind   = SkFunction       } -documentSymbolForDecl (L (RealSrcSpan l) (ForD x)) = Just+documentSymbolForDecl (L (RealSrcSpan l) (ForD _ x)) = Just   (defDocumentSymbol l :: DocumentSymbol)     { _name   = case x of                   ForeignImport{} -> name                   ForeignExport{} -> name-#if MIN_GHC_API_VERSION(8,6,0)                   XForeignDecl{}  -> "?"-#endif     , _kind   = SkObject     , _detail = case x of                   ForeignImport{} -> Just "import"                   ForeignExport{} -> Just "export"-#if MIN_GHC_API_VERSION(8,6,0)                   XForeignDecl{}  -> Nothing-#endif     }   where name = showRdrName $ unLoc $ fd_name x 
src/Development/IDE/Plugin/CodeAction.hs view
@@ -54,7 +54,6 @@ import Parser import Text.Regex.TDFA (mrAfter, (=~), (=~~)) import Outputable (ppr, showSDocUnsafe)-import DynFlags (xFlags, FlagSpec(..)) import GHC.LanguageExtensions.Type (Extension) import Data.Function import Control.Arrow ((>>>))@@ -90,7 +89,8 @@     contents <- LSP.getVirtualFileFunc lsp $ toNormalizedUri uri     let text = Rope.toText . (_text :: VirtualFile -> Rope.Rope) <$> contents         mbFile = toNormalizedFilePath' <$> uriToFilePath uri-    (ideOptions, parsedModule, join -> env) <- runAction "CodeAction" state $+    diag <- fmap (\(_, _, d) -> d) . filter (\(p, _, _) -> mbFile == Just p) <$> getDiagnostics state+    (ideOptions, join -> parsedModule, join -> env) <- runAction "CodeAction" state $       (,,) <$> getIdeOptions             <*> getParsedModule `traverse` mbFile             <*> use GhcSession `traverse` mbFile@@ -99,11 +99,11 @@     localExports <- readVar (exportsMap $ shakeExtras state)     let exportsMap = localExports <> fromMaybe mempty pkgExports     let dflags = hsc_dflags . hscEnv <$> env-    pure $ Right+    pure . Right $         [ CACodeAction $ CodeAction title (Just CodeActionQuickFix) (Just $ List [x]) (Just edit) Nothing-        | x <- xs, (title, tedit) <- suggestAction dflags exportsMap ideOptions ( join parsedModule ) text x+        | x <- xs, (title, tedit) <- suggestAction dflags exportsMap ideOptions parsedModule text x         , let edit = WorkspaceEdit (Just $ Map.singleton uri $ List tedit) Nothing-        ]+        ] <> caRemoveRedundantImports parsedModule text diag xs uri  -- | Generate code lenses. codeLens@@ -168,12 +168,11 @@     , suggestFixConstructorImport text diag     , suggestModuleTypo diag     , suggestReplaceIdentifier text diag-    , suggestConstraint text diag     , removeRedundantConstraints text diag     , suggestAddTypeAnnotationToSatisfyContraints text diag     ] ++ concat-    [  suggestNewDefinition ideOptions pm text diag-    ++ suggestRemoveRedundantImport pm text diag+    [  suggestConstraint pm text diag+    ++ suggestNewDefinition ideOptions pm text diag     ++ suggestNewImport packageExports pm diag     ++ suggestDeleteUnusedBinding pm text diag     ++ suggestExportUnusedTopBinding text pm diag@@ -201,6 +200,35 @@         = [("Remove import", [TextEdit (extendToWholeLineIfPossible contents _range) ""])]     | otherwise = [] +caRemoveRedundantImports :: Maybe ParsedModule -> Maybe T.Text -> [Diagnostic] -> [Diagnostic] -> Uri -> [CAResult]+caRemoveRedundantImports m contents digs ctxDigs uri+  | Just pm <- m,+    r <- join $ map (\d -> repeat d `zip` suggestRemoveRedundantImport pm contents d) digs,+    allEdits <- [ e | (_, (_, edits)) <- r, e <- edits],+    caRemoveAll <- removeAll allEdits,+    ctxEdits <- [ x | x@(d, _) <- r, d `elem` ctxDigs],+    not $ null ctxEdits,+    caRemoveCtx <- map (\(d, (title, tedit)) -> removeSingle title tedit d) ctxEdits+      = caRemoveCtx ++ [caRemoveAll]+  | otherwise = []+  where+    removeSingle title tedit diagnostic = CACodeAction CodeAction{..} where+        _changes = Just $ Map.singleton uri $ List tedit+        _title = title+        _kind = Just CodeActionQuickFix+        _diagnostics = Just $ List [diagnostic]+        _documentChanges = Nothing+        _edit = Just WorkspaceEdit{..}+        _command = Nothing+    removeAll tedit = CACodeAction CodeAction {..} where+        _changes = Just $ Map.singleton uri $ List tedit+        _title = "Remove all redundant imports"+        _kind = Just CodeActionQuickFix+        _diagnostics = Nothing+        _documentChanges = Nothing+        _edit = Just WorkspaceEdit{..}+        _command = Nothing+ suggestDeleteUnusedBinding :: ParsedModule -> Maybe T.Text -> Diagnostic -> [(T.Text, [TextEdit])] suggestDeleteUnusedBinding   ParsedModule{pm_parsed_source = L _ HsModule{hsmodDecls}}@@ -222,10 +250,10 @@       findRelatedSpans         indexedContent         name-        (L (RealSrcSpan l) (ValD (extractNameAndMatchesFromFunBind -> Just (lname, matches)))) =+        (L (RealSrcSpan l) (ValD _ (extractNameAndMatchesFromFunBind -> Just (lname, matches)))) =         case lname of           (L nLoc _name) | isTheBinding nLoc ->-            let findSig (L (RealSrcSpan l) (SigD sig)) = findRelatedSigSpan indexedContent name l sig+            let findSig (L (RealSrcSpan l) (SigD _ sig)) = findRelatedSigSpan indexedContent name l sig                 findSig _ = []             in               [extendForSpaces indexedContent $ toRange l]@@ -253,7 +281,7 @@        -- Second of the tuple means there is only one match       findRelatedSigSpan1 :: String -> Sig GhcPs -> Maybe (SrcSpan, Bool)-      findRelatedSigSpan1 name (TypeSig lnames _) =+      findRelatedSigSpan1 name (TypeSig _ lnames _) =         let maybeIdx = findIndex (\(L _ id) -> isSameName id name) lnames         in case maybeIdx of             Nothing -> Nothing@@ -282,14 +310,12 @@         name         (L _ Match{m_grhss=GRHSs{grhssLocalBinds}}) = do         case grhssLocalBinds of-          (L _ (HsValBinds (ValBinds bag lsigs))) ->+          (L _ (HsValBinds _ (ValBinds _ bag lsigs))) ->             if isEmptyBag bag             then []             else concatMap (findRelatedSpanForHsBind indexedContent name lsigs) bag           _ -> []-#if MIN_GHC_API_VERSION(8,6,0)       findRelatedSpanForMatch _ _ _ = []-#endif        findRelatedSpanForHsBind         :: PositionIndexedString@@ -368,12 +394,12 @@     isTopLevel l = (_character . _start) l == 0      exportsAs :: HsDecl p -> Maybe (ExportsAs, Located (IdP p))-    exportsAs (ValD FunBind {fun_id})          = Just (ExportName, fun_id)-    exportsAs (ValD (PatSynBind PSB {psb_id})) = Just (ExportPattern, psb_id)-    exportsAs (TyClD SynDecl{tcdLName})      = Just (ExportName, tcdLName)-    exportsAs (TyClD DataDecl{tcdLName})     = Just (ExportAll, tcdLName)-    exportsAs (TyClD ClassDecl{tcdLName})    = Just (ExportAll, tcdLName)-    exportsAs (TyClD FamDecl{tcdFam})        = Just (ExportAll, fdLName tcdFam)+    exportsAs (ValD _ FunBind {fun_id})          = Just (ExportName, fun_id)+    exportsAs (ValD _ (PatSynBind _ PSB {psb_id})) = Just (ExportPattern, psb_id)+    exportsAs (TyClD _ SynDecl{tcdLName})      = Just (ExportName, tcdLName)+    exportsAs (TyClD _ DataDecl{tcdLName})     = Just (ExportAll, tcdLName)+    exportsAs (TyClD _ ClassDecl{tcdLName})    = Just (ExportAll, tcdLName)+    exportsAs (TyClD _ FamDecl{tcdFam})        = Just (ExportAll, fdLName tcdFam)     exportsAs _                                = Nothing  suggestAddTypeAnnotationToSatisfyContraints :: Maybe T.Text -> Diagnostic -> [(T.Text, [TextEdit])]@@ -664,14 +690,14 @@ suggestSignature _ _ = []  -- | Suggests a constraint for a declaration for which a constraint is missing.-suggestConstraint :: Maybe T.Text -> Diagnostic -> [(T.Text, [TextEdit])]-suggestConstraint mContents diag@Diagnostic {..}+suggestConstraint :: ParsedModule -> Maybe T.Text -> Diagnostic -> [(T.Text, [TextEdit])]+suggestConstraint parsedModule mContents diag@Diagnostic {..}   | Just contents <- mContents   , Just missingConstraint <- findMissingConstraint _message   = let codeAction = if _message =~ ("the type signature for:" :: String)-                        then suggestFunctionConstraint-                        else suggestInstanceConstraint-     in codeAction contents diag missingConstraint+                        then suggestFunctionConstraint parsedModule+                        else suggestInstanceConstraint contents+     in codeAction diag missingConstraint   | otherwise = []     where       findMissingConstraint :: T.Text -> Maybe T.Text@@ -744,10 +770,9 @@ findTypeSignatureLine contents typeSignatureName =   T.splitOn (typeSignatureName <> " :: ") contents & head & T.lines & length --- | Suggests a constraint for a type signature for which a constraint is missing.-suggestFunctionConstraint :: T.Text -> Diagnostic -> T.Text -> [(T.Text, [TextEdit])]-suggestFunctionConstraint contents Diagnostic{..} missingConstraint--- Suggests a constraint for a type signature with any number of existing constraints.+-- | Suggests a constraint for a type signature with any number of existing constraints.+suggestFunctionConstraint :: ParsedModule -> Diagnostic -> T.Text -> [(T.Text, [TextEdit])]+suggestFunctionConstraint ParsedModule{pm_parsed_source = L _ HsModule{hsmodDecls}} Diagnostic{..} missingConstraint -- • No instance for (Eq a) arising from a use of ‘==’ --   Possible fix: --     add (Eq a) to the context of@@ -772,15 +797,28 @@   | Just typeSignatureName <- findTypeSignatureName _message   = let mExistingConstraints = findExistingConstraints _message         newConstraint = buildNewConstraints missingConstraint mExistingConstraints-        typeSignatureLine = findTypeSignatureLine contents typeSignatureName-        typeSignatureFirstChar = T.length $ typeSignatureName <> " :: "-        startOfConstraint = Position typeSignatureLine typeSignatureFirstChar-        endOfConstraint = Position typeSignatureLine $-          typeSignatureFirstChar + maybe 0 T.length mExistingConstraints-        range = Range startOfConstraint endOfConstraint-     in [(actionTitle missingConstraint typeSignatureName, [TextEdit range newConstraint])]+     in case findRangeOfContextForFunctionNamed typeSignatureName of+       Just range -> [(actionTitle missingConstraint typeSignatureName, [TextEdit range newConstraint])]+       Nothing -> []   | otherwise = []     where+      findRangeOfContextForFunctionNamed :: T.Text -> Maybe Range+      findRangeOfContextForFunctionNamed typeSignatureName = do+          locatedType <- listToMaybe+              [ locatedType+              | L _ (SigD _ (TypeSig _ identifiers (HsWC _ (HsIB _ locatedType)))) <- hsmodDecls+              , any (`isSameName` T.unpack typeSignatureName) $ fmap unLoc identifiers+              ]+          srcSpanToRange $ case splitLHsQualTy locatedType of+            (L contextSrcSpan _ , _) ->+              if isGoodSrcSpan contextSrcSpan+                then contextSrcSpan -- The type signature has explicit context+                else -- No explicit context, return SrcSpan at the start of type sig where we can write context+                     let start = srcSpanStart $ getLoc locatedType in mkSrcSpan start start++      isSameName :: IdP GhcPs -> String -> Bool+      isSameName x name = showSDocUnsafe (ppr x) == name+       findExistingConstraints :: T.Text -> Maybe T.Text       findExistingConstraints message =         if message =~ ("from the context:" :: String)@@ -1039,8 +1077,8 @@ rangesForBinding' :: String -> LIE GhcPs -> [SrcSpan] rangesForBinding' b (L l x@IEVar{}) | showSDocUnsafe (ppr x) == b = [l] rangesForBinding' b (L l x@IEThingAbs{}) | showSDocUnsafe (ppr x) == b = [l]-rangesForBinding' b (L l (IEThingAll x)) | showSDocUnsafe (ppr x) == b = [l]-rangesForBinding' b (L l (IEThingWith thing _  inners labels))+rangesForBinding' b (L l (IEThingAll _ x)) | showSDocUnsafe (ppr x) == b = [l]+rangesForBinding' b (L l (IEThingWith _ thing _  inners labels))     | showSDocUnsafe (ppr thing) == b = [l]     | otherwise =         [ l' | L l' x <- inners, showSDocUnsafe (ppr x) == b] ++
src/Development/IDE/Plugin/Completions.hs view
@@ -8,7 +8,6 @@     , getCompletionsLSP     ) where -import Control.Applicative import Language.Haskell.LSP.Messages import Language.Haskell.LSP.Types import qualified Language.Haskell.LSP.Core as LSP@@ -20,30 +19,25 @@  import Development.IDE.Plugin import Development.IDE.Core.Service+import Development.IDE.Core.PositionMapping import Development.IDE.Plugin.Completions.Logic import Development.IDE.Types.Location-import Development.IDE.Types.Options-import Development.IDE.Core.Compile-import Development.IDE.Core.PositionMapping import Development.IDE.Core.RuleTypes import Development.IDE.Core.Shake-import Development.IDE.GHC.Compat (hsmodExports, ParsedModule(..), ModSummary (ms_hspp_buf))+import Development.IDE.GHC.Compat  import Development.IDE.GHC.Util import Development.IDE.LSP.Server-import Control.Monad.Trans.Except (runExceptT)-import HscTypes (HscEnv(hsc_dflags))+import TcRnDriver (tcRnImportDecls) import Data.Maybe-import Data.Functor ((<&>)) -#if !MIN_GHC_API_VERSION(8,6,0) || defined(GHC_LIB)+#if defined(GHC_LIB) import Development.IDE.Import.DependencyInformation #endif  plugin :: Plugin c plugin = Plugin produceCompletions setHandlersCompletion - produceCompletions :: Rules () produceCompletions = do     define $ \ProduceCompletions file -> do@@ -67,7 +61,7 @@  -- When possible, rely on the haddocks embedded in our interface files -- This creates problems on ghc-lib, see comment on 'getDocumentationTryGhc'-#if MIN_GHC_API_VERSION(8,6,0) && !defined(GHC_LIB)+#if !defined(GHC_LIB)         let parsedDeps = [] #else         deps <- maybe (TransitiveDependencies [] [] []) fst <$> useWithStale GetDependencies file@@ -75,34 +69,15 @@ #endif          case (ms, sess) of-            (Just ms, Just sess) -> do-                -- After parsing the module remove all package imports referring to-                -- these packages as we have already dealt with what they map to.-                let env = hscEnv sess-                    buf = fromJust $ ms_hspp_buf ms-                    f = fromNormalizedFilePath file-                    dflags = hsc_dflags env-                pm <- liftIO $ evalGhcEnv env $ runExceptT $ parseHeader dflags f buf-                case pm of-                    Right (_diags, hsMod) -> do-                        let hsModNoExports = hsMod <&> \x -> x{hsmodExports = Nothing}-                            pm = ParsedModule-                                    { pm_mod_summary = ms-                                    , pm_parsed_source = hsModNoExports-                                    , pm_extra_src_files = [] -- src imports not allowed-                                    , pm_annotations = mempty-                                    }-                        tm <- liftIO $ typecheckModule (IdeDefer True) env pm-                        case tm of-                            (_, Just (_,TcModuleResult{..})) -> do-                                cdata <- liftIO $ cacheDataProducer env tmrModule parsedDeps-                                -- Do not return diags from parsing as they would duplicate-                                -- the diagnostics from typechecking-                                return ([], Just cdata)-                            (_diag, _) ->-                                return ([], Nothing)-                    Left _diag ->-                        return ([], Nothing)+            (Just (ms,imps), Just sess) -> do+              let env = hscEnv sess+              res <- liftIO $ tcRnImportDecls env imps+              case res of+                  (_, Just rdrEnv) -> do+                      cdata <- liftIO $ cacheDataProducer env (ms_mod ms) rdrEnv imps parsedDeps+                      return ([], Just cdata)+                  (_diag, _) ->+                      return ([], Nothing)             _ -> return ([], Nothing)  -- | Produce completions info for a file@@ -128,10 +103,9 @@ instance NFData   NonLocalCompletions instance Binary   NonLocalCompletions - -- | Generate code actions. getCompletionsLSP-    :: LSP.LspFuncs c+    :: LSP.LspFuncs cofd     -> IdeState     -> CompletionParams     -> IO (Either ResponseError CompletionResponseResult)@@ -147,18 +121,18 @@             opts <- liftIO $ getIdeOptionsIO $ shakeExtras ide             compls <- useWithStaleFast ProduceCompletions npath             pm <- useWithStaleFast GetParsedModule npath-            pure (opts, liftA2 (,) compls pm)+            binds <- fromMaybe (mempty, zeroMapping) <$> useWithStaleFast GetBindings npath+            pure (opts, fmap (,pm,binds) compls )         case compls of-          Just ((cci', _), (pm, mapping)) -> do-            let !position' = fromCurrentPosition mapping position-            pfix <- maybe (return Nothing) (flip VFS.getCompletionPrefix cnts) position'+          Just ((cci', _), parsedMod, bindMap) -> do+            pfix <- VFS.getCompletionPrefix position cnts             case (pfix, completionContext) of               (Just (VFS.PosPrefixInfo _ "" _ _), Just CompletionContext { _triggerCharacter = Just "."})                 -> return (Completions $ List [])               (Just pfix', _) -> do                   -- TODO pass the real capabilities here (or remove the logic for snippets)                 let fakeClientCapabilities = ClientCapabilities Nothing Nothing Nothing Nothing-                Completions . List <$> getCompletions ideOpts cci' pm pfix' fakeClientCapabilities (WithSnippets True)+                Completions . List <$> getCompletions ideOpts cci' parsedMod bindMap pfix' fakeClientCapabilities (WithSnippets True)               _ -> return (Completions $ List [])           _ -> return (Completions $ List [])       _ -> return (Completions $ List [])
src/Development/IDE/Plugin/Completions/Logic.hs view
@@ -10,23 +10,19 @@ ) where  import Control.Applicative-import Data.Char (isSpace, isUpper)+import Data.Char (isUpper) import Data.Generics import Data.List.Extra as List hiding (stripPrefix) import qualified Data.Map  as Map import Data.Maybe (fromMaybe, mapMaybe)-import qualified Data.Maybe as UnsafeMaybe (fromJust) import qualified Data.Text as T import qualified Text.Fuzzy as Fuzzy  import HscTypes import Name import RdrName-import TcRnTypes import Type-import Var import Packages-import DynFlags #if MIN_GHC_API_VERSION(8,10,0) import Predicate (isDictTy) import GHC.Platform@@ -38,8 +34,10 @@ import Language.Haskell.LSP.Types.Capabilities import qualified Language.Haskell.LSP.VFS as VFS import Development.IDE.Core.Compile+import Development.IDE.Core.PositionMapping import Development.IDE.Plugin.Completions.Types import Development.IDE.Spans.Documentation+import Development.IDE.Spans.LocalBindings import Development.IDE.GHC.Compat as GHC import Development.IDE.GHC.Error import Development.IDE.Types.Options@@ -146,14 +144,17 @@     Nothing Nothing Nothing Nothing (Just insertText) (Just Snippet)     Nothing Nothing Nothing Nothing Nothing   where kind = Just compKind-        docs' = ("*Defined in '" <> importedFrom <> "'*\n") : spanDocToMarkdown docs+        docs' = imported : spanDocToMarkdown docs+        imported = case importedFrom of+          Left pos -> "*Defined at '" <> ppr pos <> "'*\n'"+          Right mod -> "*Defined in '" <> mod <> "'*\n"         colon = if optNewColonConvention then ": " else ":: "  mkNameCompItem :: Name -> ModuleName -> Maybe Type -> Maybe Backtick -> SpanDoc -> CompItem mkNameCompItem origName origMod thingType isInfix docs = CI{..}   where     compKind = occNameToComKind typeText $ occName origName-    importedFrom = showModName origMod+    importedFrom = Right $ showModName origMod     isTypeCompl = isTcOcc $ occName origName     label = T.pack $ showGhc origName     insertText = case isInfix of@@ -228,13 +229,10 @@     Nothing Nothing Nothing Nothing Nothing (Just insertText) (Just Snippet)     Nothing Nothing Nothing Nothing Nothing -cacheDataProducer :: HscEnv -> TypecheckedModule -> [ParsedModule] -> IO CachedCompletions-cacheDataProducer packageState tm deps = do-  let parsedMod = tm_parsed_module tm-      dflags = hsc_dflags packageState-      curMod = ms_mod $ pm_mod_summary parsedMod+cacheDataProducer :: HscEnv -> Module -> GlobalRdrEnv -> [LImportDecl GhcPs] -> [ParsedModule] -> IO CachedCompletions+cacheDataProducer packageState curMod rdrEnv limports deps = do+  let dflags = hsc_dflags packageState       curModName = moduleName curMod-      (_,limports,_,_) = UnsafeMaybe.fromJust $ tm_renamed_source tm -- safe because we always save the typechecked source        iDeclToModName :: ImportDecl name -> ModuleName       iDeclToModName = unLoc . ideclName@@ -250,8 +248,6 @@       -- The given namespaces for the imported modules (ie. full name, or alias if used)       allModNamesAsNS = map (showModName . asNamespace) importDeclerations -      typeEnv = tcg_type_env $ fst $ tm_internals_ tm-      rdrEnv = tcg_rdr_env $ fst $ tm_internals_ tm       rdrElts = globalRdrEnvElts rdrEnv        foldMapM :: (Foldable f, Monad m, Monoid b) => (a -> m b) -> f a -> m b@@ -263,11 +259,7 @@        getComplsForOne :: GlobalRdrElt -> IO ([CompItem],QualCompls)       getComplsForOne (GRE n _ True _) =-        case lookupTypeEnv typeEnv n of-          Just tt -> case safeTyThingId tt of-            Just var -> (\x -> ([x],mempty)) <$> varToCompl var-            Nothing -> (\x -> ([x],mempty)) <$> toCompItem curMod curModName n-          Nothing -> (\x -> ([x],mempty)) <$> toCompItem curMod curModName n+        (\x -> ([x],mempty)) <$> toCompItem curMod curModName n       getComplsForOne (GRE n _ False prov) =         flip foldMapM (map is_decl prov) $ \spec -> do           compItem <- toCompItem curMod (is_mod spec) n@@ -281,18 +273,11 @@               origMod = showModName (is_mod spec)           return (unqual,QualCompls qual) -      varToCompl :: Var -> IO CompItem-      varToCompl var = do-        let typ = Just $ varType var-            name = Var.varName var-        docs <- evalGhcEnv packageState $ getDocumentationTryGhc curMod (tm_parsed_module tm : deps) name-        return $ mkNameCompItem name curModName typ Nothing docs-       toCompItem :: Module -> ModuleName -> Name -> IO CompItem       toCompItem m mn n = do-        docs <- evalGhcEnv packageState $ getDocumentationTryGhc curMod (tm_parsed_module tm : deps) n-        ty <- evalGhcEnv packageState $ catchSrcErrors "completion" $ do-                name' <- lookupName m n+        docs <- getDocumentationTryGhc packageState curMod deps n+        ty <- catchSrcErrors (hsc_dflags packageState) "completion" $ do+                name' <- lookupName packageState m n                 return $ name' >>= safeTyThingType         return $ mkNameCompItem n mn (either (const Nothing) id ty) Nothing docs @@ -316,49 +301,49 @@   where     typeSigIds = Set.fromList         [ id-            | L _ (SigD (TypeSig ids _)) <- hsmodDecls+            | L _ (SigD _ (TypeSig _ ids _)) <- hsmodDecls             , L _ id <- ids             ]     hasTypeSig = (`Set.member` typeSigIds) . unLoc      compls = concat         [ case decl of-            SigD (TypeSig ids typ) ->+            SigD _ (TypeSig _ ids typ) ->                 [mkComp id CiFunction (Just $ ppr typ) | id <- ids]-            ValD FunBind{fun_id} ->+            ValD _ FunBind{fun_id} ->                 [ mkComp fun_id CiFunction Nothing                 | not (hasTypeSig fun_id)                 ]-            ValD PatBind{pat_lhs} ->+            ValD _ PatBind{pat_lhs} ->                 [mkComp id CiVariable Nothing-                | VarPat id <- listify (\(_ :: Pat GhcPs) -> True) pat_lhs]-            TyClD ClassDecl{tcdLName, tcdSigs} ->+                | VarPat _ id <- listify (\(_ :: Pat GhcPs) -> True) pat_lhs]+            TyClD _ ClassDecl{tcdLName, tcdSigs} ->                 mkComp tcdLName CiClass Nothing :                 [ mkComp id CiFunction (Just $ ppr typ)-                | L _ (TypeSig ids typ) <- tcdSigs+                | L _ (TypeSig _ ids typ) <- tcdSigs                 , id <- ids]-            TyClD x ->+            TyClD _ x ->                 [mkComp id cl Nothing                 | id <- listify (\(_ :: Located(IdP GhcPs)) -> True) x                 , let cl = occNameToComKind Nothing (rdrNameOcc $ unLoc id)]-            ForD ForeignImport{fd_name,fd_sig_ty} ->+            ForD _ ForeignImport{fd_name,fd_sig_ty} ->                 [mkComp fd_name CiVariable (Just $ ppr fd_sig_ty)]-            ForD ForeignExport{fd_name,fd_sig_ty} ->+            ForD _ ForeignExport{fd_name,fd_sig_ty} ->                 [mkComp fd_name CiVariable (Just $ ppr fd_sig_ty)]             _ -> []             | L _ decl <- hsmodDecls         ]      mkComp n ctyp ty =-        CI ctyp pn thisModName ty pn Nothing doc (ctyp `elem` [CiStruct, CiClass])+        CI ctyp pn (Right thisModName) ty pn Nothing doc (ctyp `elem` [CiStruct, CiClass])       where         pn = ppr n         doc = SpanDocText (getDocumentation [pm] n) (SpanDocUris Nothing Nothing)      thisModName = ppr hsmodName -    ppr :: Outputable a => a -> T.Text-    ppr = T.pack . prettyPrint+ppr :: Outputable a => a -> T.Text+ppr = T.pack . prettyPrint  newtype WithSnippets = WithSnippets Bool @@ -371,10 +356,18 @@   where supported = Just True == (_textDocument >>= _completion >>= _completionItem >>= _snippetSupport)  -- | Returns the cached completions for the given module and position.-getCompletions :: IdeOptions -> CachedCompletions -> ParsedModule -> VFS.PosPrefixInfo -> ClientCapabilities -> WithSnippets -> IO [CompletionItem]-getCompletions ideOpts CC { allModNamesAsNS, unqualCompls, qualCompls, importableModules }-               pm prefixInfo caps withSnippets = do-  let VFS.PosPrefixInfo { VFS.fullLine, VFS.prefixModule, VFS.prefixText } = prefixInfo+getCompletions+    :: IdeOptions+    -> CachedCompletions+    -> Maybe (ParsedModule, PositionMapping)+    -> (Bindings, PositionMapping)+    -> VFS.PosPrefixInfo+    -> ClientCapabilities+    -> WithSnippets+    -> IO [CompletionItem]+getCompletions ideOpts CC { allModNamesAsNS, unqualCompls, qualCompls, importableModules}+               maybe_parsed (localBindings, bmapping) prefixInfo caps withSnippets = do+  let VFS.PosPrefixInfo { fullLine, prefixModule, prefixText } = prefixInfo       enteredQual = if T.null prefixModule then "" else prefixModule <> "."       fullPrefix  = enteredQual <> prefixText @@ -383,19 +376,7 @@           to                             'foo :: Int -> String ->    '                                                               ^       -}-      pos =-        let Position l c = VFS.cursorPos prefixInfo-            typeStuff = [isSpace, (`elem` (">-." :: String))]-            stripTypeStuff = T.dropWhileEnd (\x -> any (\f -> f x) typeStuff)-            -- if oldPos points to-            -- foo -> bar -> baz-            --    ^-            -- Then only take the line up to there, discard '-> bar -> baz'-            partialLine = T.take c fullLine-            -- drop characters used when writing incomplete type sigs-            -- like '-> '-            d = T.length fullLine - T.length (stripTypeStuff partialLine)-        in Position l (c - d)+      pos = VFS.cursorPos prefixInfo        filtModNameCompls =         map mkModCompl@@ -404,8 +385,18 @@        filtCompls = map Fuzzy.original $ Fuzzy.filter prefixText ctxCompls "" "" label False         where++          mcc = case maybe_parsed of+            Nothing -> Nothing+            Just (pm, pmapping) ->+              let PositionMapping pDelta = pmapping+                  position' = fromDelta pDelta pos+                  lpos = lowerRange position'+                  hpos = upperRange position'+              in getCContext lpos pm <|> getCContext hpos pm+           -- completions specific to the current context-          ctxCompls' = case getCContext pos pm of+          ctxCompls' = case mcc of                         Nothing -> compls                         Just TypeContext -> filter isTypeCompl compls                         Just ValueContext -> filter (not . isTypeCompl) compls@@ -414,10 +405,26 @@           ctxCompls = map (\comp -> comp { isInfix = infixCompls }) ctxCompls'            infixCompls :: Maybe Backtick-          infixCompls = isUsedAsInfix fullLine prefixModule prefixText (VFS.cursorPos prefixInfo)+          infixCompls = isUsedAsInfix fullLine prefixModule prefixText pos +          PositionMapping bDelta = bmapping+          oldPos = fromDelta bDelta $ VFS.cursorPos prefixInfo+          startLoc = lowerRange oldPos+          endLoc = upperRange oldPos+          localCompls = map (uncurry localBindsToCompItem) $ getFuzzyScope localBindings startLoc endLoc+          localBindsToCompItem :: Name -> Maybe Type -> CompItem+          localBindsToCompItem name typ = CI ctyp pn thisModName ty pn Nothing emptySpanDoc (not $ isValOcc occ)+            where+              occ = nameOccName name+              ctyp = occNameToComKind Nothing occ+              pn = ppr name+              ty = ppr <$> typ+              thisModName = case nameModule_maybe name of+                Nothing -> Left $ nameSrcSpan name+                Just m -> Right $ ppr m+           compls = if T.null prefixModule-            then unqualCompls+            then localCompls ++ unqualCompls             else Map.findWithDefault [] prefixModule $ getQualCompls qualCompls        filtListWith f list =@@ -455,18 +462,20 @@         | "{-# " `T.isPrefixOf` fullLine         = filtPragmaCompls (pragmaSuffix fullLine)         | otherwise-        = filtModNameCompls ++ map (toggleSnippets caps withSnippets-                                      . mkCompl ideOpts . stripAutoGenerated) filtCompls-                            ++ filtKeywordCompls+        = let uniqueFiltCompls = nubOrdOn insertText filtCompls+          in filtModNameCompls ++ map (toggleSnippets caps withSnippets+                                         . mkCompl ideOpts . stripAutoGenerated) uniqueFiltCompls+                               ++ filtKeywordCompls    return result + -- The supported languages and extensions languagesAndExts :: [T.Text] #if MIN_GHC_API_VERSION(8,10,0)-languagesAndExts = map T.pack $ DynFlags.supportedLanguagesAndExtensions ( PlatformMini ArchUnknown OSUnknown )+languagesAndExts = map T.pack $ GHC.supportedLanguagesAndExtensions ( PlatformMini ArchUnknown OSUnknown ) #else-languagesAndExts = map T.pack DynFlags.supportedLanguagesAndExtensions+languagesAndExts = map T.pack GHC.supportedLanguagesAndExtensions #endif  -- ---------------------------------------------------------------------
src/Development/IDE/Plugin/Completions/Types.hs view
@@ -5,6 +5,7 @@ import           Control.DeepSeq import qualified Data.Map  as Map import qualified Data.Text as T+import SrcLoc  import Development.IDE.Spans.Common import Language.Haskell.LSP.Types (CompletionItemKind)@@ -17,7 +18,7 @@ data CompItem = CI   { compKind     :: CompletionItemKind   , insertText   :: T.Text         -- ^ Snippet for the completion-  , importedFrom :: T.Text         -- ^ From where this item is imported from.+  , importedFrom :: Either SrcSpan T.Text         -- ^ From where this item is imported from.   , typeText     :: Maybe T.Text   -- ^ Available type information.   , label        :: T.Text         -- ^ Label to display to the user.   , isInfix      :: Maybe Backtick -- ^ Did the completion happen
src/Development/IDE/Plugin/Test.hs view
@@ -20,11 +20,14 @@ import Language.Haskell.LSP.Types import System.Time.Extra import Development.IDE.Core.RuleTypes+import Control.Monad  data TestRequest     = BlockSeconds Seconds           -- ^ :: Null     | GetInterfaceFilesDir FilePath  -- ^ :: String     | GetShakeSessionQueueCount      -- ^ :: Number+    | WaitForShakeQueue+      -- ^ Block until the Shake queue is empty. Returns Null     deriving Generic     deriving anyclass (FromJSON, ToJSON) @@ -61,4 +64,9 @@ requestHandler _ s GetShakeSessionQueueCount = do     n <- atomically $ countQueue $ actionQueue $ shakeExtras s     return $ Right (toJSON n)+requestHandler _ s WaitForShakeQueue = do+    atomically $ do+        n <- countQueue $ actionQueue $ shakeExtras s+        when (n>0) retry+    return $ Right Null 
src/Development/IDE/Spans/AtPoint.hs view
@@ -7,26 +7,32 @@     atPoint   , gotoDefinition   , gotoTypeDefinition+  , documentHighlight+  , pointCommand   ) where  import           Development.IDE.GHC.Error import Development.IDE.GHC.Orphans() import Development.IDE.Types.Location+import           Language.Haskell.LSP.Types  -- DAML compiler and infrastructure import Development.IDE.GHC.Compat import Development.IDE.Types.Options-import Development.IDE.Spans.Type as SpanInfo-import Development.IDE.Spans.Common (showName, spanDocToMarkdown)+import Development.IDE.Spans.Common+import Development.IDE.Core.RuleTypes  -- GHC API imports import FastString import Name import Outputable hiding ((<>)) import SrcLoc-import Type-import VarSet+import TyCoRep+import TyCon+import qualified Var+import NameEnv +import Control.Applicative import Control.Monad.Extra import Control.Monad.Trans.Maybe import Control.Monad.Trans.Class@@ -34,102 +40,96 @@ import           Data.Maybe import           Data.List import qualified Data.Text as T+import qualified Data.Map as M +import Data.Either+import Data.List.Extra (dropEnd1)++documentHighlight+  :: Monad m+  => HieASTs Type+  -> RefMap+  -> Position+  -> MaybeT m [DocumentHighlight]+documentHighlight hf rf pos = MaybeT $ pure (Just highlights)+  where+    ns = concat $ pointCommand hf pos (rights . M.keys . nodeIdentifiers . nodeInfo)+    highlights = do+      n <- ns+      ref <- maybe [] id (M.lookup (Right n) rf)+      pure $ makeHighlight ref+    makeHighlight (sp,dets) =+      DocumentHighlight (realSrcSpanToRange sp) (Just $ highlightType $ identInfo dets)+    highlightType s =+      if any (isJust . getScopeFromContext) s+        then HkWrite+        else HkRead+ gotoTypeDefinition   :: MonadIO m   => (Module -> MaybeT m (HieFile, FilePath))   -> IdeOptions-  -> [SpanInfo]+  -> HieASTs Type   -> Position   -> MaybeT m [Location] gotoTypeDefinition getHieFile ideOpts srcSpans pos-  = typeLocationsAtPoint getHieFile ideOpts pos srcSpans+  = lift $ typeLocationsAtPoint getHieFile ideOpts pos srcSpans  -- | Locate the definition of the name at a given position. gotoDefinition   :: MonadIO m   => (Module -> MaybeT m (HieFile, FilePath))   -> IdeOptions-  -> [SpanInfo]+  -> M.Map ModuleName NormalizedFilePath+  -> HieASTs Type   -> Position   -> MaybeT m Location-gotoDefinition getHieFile ideOpts srcSpans pos =-  MaybeT . pure . listToMaybe =<< locationsAtPoint getHieFile ideOpts pos srcSpans+gotoDefinition getHieFile ideOpts imports srcSpans pos+  = MaybeT $ fmap listToMaybe $ locationsAtPoint getHieFile ideOpts imports pos srcSpans  -- | Synopsis for the name at a given position. atPoint   :: IdeOptions-  -> SpansInfo+  -> HieASTs Type+  -> DocAndKindMap   -> Position   -> Maybe (Maybe Range, [T.Text])-atPoint IdeOptions{..} (SpansInfo srcSpans cntsSpans) pos = do-    firstSpan <- listToMaybe $ deEmpasizeGeneratedEqShow $ spansAtPoint pos srcSpans-    let constraintsAtPoint = mapMaybe spaninfoType (spansAtPoint pos cntsSpans)-        -- Filter out the empty lines so we don't end up with a bunch of-        -- horizontal separators with nothing inside of them-        text = filter (not . T.null) $ hoverInfo firstSpan constraintsAtPoint-    return (Just (range firstSpan), text)+atPoint IdeOptions{} hf (DKMap dm km) pos = listToMaybe $ pointCommand hf pos hoverInfo   where-    -- Hover info for types, classes, type variables-    hoverInfo SpanInfo{spaninfoType = Nothing , spaninfoDocs = docs ,  ..} _ =-       (wrapLanguageSyntax <$> name) <> location <> spanDocToMarkdown docs-     where-       name     = [maybe shouldNotHappen showName  mbName]-       location = [maybe shouldNotHappen definedAt mbName]-       shouldNotHappen = "ghcide: did not expect a type level component without a name"-       mbName = getNameM spaninfoSource-     -- Hover info for values/data-    hoverInfo SpanInfo{spaninfoType = (Just typ), spaninfoDocs = docs , ..} cnts =-       (wrapLanguageSyntax <$> nameOrSource) <> location <> spanDocToMarkdown docs-     where-       mbName = getNameM spaninfoSource-       expr = case spaninfoSource of-                Named n -> qualifyNameIfPossible n-                Lit   l -> crop $ T.pack l-                _       -> ""-       nameOrSource   = [expr <> "\n" <> typeAnnotation]-       qualifyNameIfPossible name' = modulePrefix <> showName name'-         where modulePrefix = maybe "" (<> ".") (getModuleNameAsText name')-       location = [maybe "" definedAt mbName]--       thisFVs = tyCoVarsOfType typ-       constraintsOverFVs = filter (\cnt -> not (tyCoVarsOfType cnt `disjointVarSet` thisFVs)) cnts-       constraintsT = T.intercalate ", " (map showName constraintsOverFVs)--       typeAnnotation = case constraintsOverFVs of-                          []  -> colon <> showName typ-                          [_] -> colon <> constraintsT <> "\n=> " <> showName typ-                          _   -> colon <> "(" <> constraintsT <> ")\n=> " <> showName typ--    definedAt name = "*Defined " <> T.pack (showSDocUnsafe $ pprNameDefnLoc name) <> "*\n"--    crop txt-      | T.length txt > 50 = T.take 46 txt <> " ..."-      | otherwise         = txt+    hoverInfo ast =+      (Just range, prettyNames ++ pTypes)+      where+        pTypes+          | length names == 1 = dropEnd1 $ map wrapHaskell prettyTypes+          | otherwise = map wrapHaskell prettyTypes -    range SpanInfo{..} = Range-      (Position spaninfoStartLine spaninfoStartCol)-      (Position spaninfoEndLine spaninfoEndCol)+        range = realSrcSpanToRange $ nodeSpan ast -    colon = if optNewColonConvention then ": " else ":: "-    wrapLanguageSyntax x = T.unlines [ "```" <> T.pack optLanguageSyntax, x, "```"]+        wrapHaskell x = "\n```haskell\n"<>x<>"\n```\n"+        info = nodeInfo ast+        names = M.assocs $ nodeIdentifiers info+        types = nodeType info -    -- NOTE(RJR): This is a bit hacky.-    -- We don't want to show the user type signatures generated from Eq and Show-    -- instances, as they do not appear in the source program.-    -- However the user could have written an `==` or `show` function directly,-    -- in which case we still want to show information for that.-    -- Hence we just move such information later in the list of spans.-    deEmpasizeGeneratedEqShow :: [SpanInfo] -> [SpanInfo]-    deEmpasizeGeneratedEqShow = uncurry (++) . partition (not . isTypeclassDeclSpan)-    isTypeclassDeclSpan :: SpanInfo -> Bool-    isTypeclassDeclSpan spanInfo =-      case getNameM (spaninfoSource spanInfo) of-        Just name -> any (`isInfixOf` getOccString name) ["==", "showsPrec"]-        Nothing -> False+        prettyNames :: [T.Text]+        prettyNames = map prettyName names+        prettyName (Right n, dets) = T.unlines $+          wrapHaskell (showNameWithoutUniques n <> maybe "" ((" :: " <>) . prettyType) (identType dets <|> maybeKind))+          : definedAt n+          ++ catMaybes [ T.unlines . spanDocToMarkdown <$> lookupNameEnv dm n+                      ]+          where maybeKind = safeTyThingType =<< lookupNameEnv km n+        prettyName (Left m,_) = showName m +        prettyTypes = map (("_ :: "<>) . prettyType) types+        prettyType t = showName t +        definedAt name =+          -- do not show "at <no location info>" and similar messages+          -- see the code of 'pprNameDefnLoc' for more information+          case nameSrcLoc name of+            UnhelpfulLoc {} | isInternalName name || isSystemName name -> []+            _ -> ["*Defined " <> T.pack (showSDocUnsafe $ pprNameDefnLoc name) <> "*"]  typeLocationsAtPoint   :: forall m@@ -137,50 +137,40 @@   => (Module -> MaybeT m (HieFile, FilePath))   -> IdeOptions   -> Position-  -> [SpanInfo]-  -> MaybeT m [Location]-typeLocationsAtPoint getHieFile = querySpanInfoAt getTypeSpan-  where getTypeSpan :: SpanInfo -> m (Maybe SrcSpan)-        getTypeSpan SpanInfo { spaninfoType = Just t } =-          case splitTyConApp_maybe t of-            Nothing -> return Nothing-            Just (getName -> name, _) ->-              nameToLocation getHieFile name-        getTypeSpan _ = return Nothing+  -> HieASTs Type+  -> m [Location]+typeLocationsAtPoint getHieFile _ideOptions pos ast =+  let ts = concat $ pointCommand ast pos (nodeType . nodeInfo)+      ns = flip mapMaybe ts $ \case+        TyConApp tc _ -> Just $ tyConName tc+        TyVarTy n -> Just $ Var.varName n+        _ -> Nothing+    in mapMaybeM (nameToLocation getHieFile) ns  locationsAtPoint   :: forall m    . MonadIO m   => (Module -> MaybeT m (HieFile, FilePath))   -> IdeOptions-  -> Position-  -> [SpanInfo]-  -> MaybeT m [Location]-locationsAtPoint getHieFile = querySpanInfoAt (getSpan . spaninfoSource)-  where getSpan :: SpanSource -> m (Maybe SrcSpan)-        getSpan NoSource = pure Nothing-        getSpan (SpanS sp) = pure $ Just sp-        getSpan (Lit _) = pure Nothing-        getSpan (Named name) = nameToLocation getHieFile name--querySpanInfoAt :: forall m-   . MonadIO m-  => (SpanInfo -> m (Maybe SrcSpan))-  -> IdeOptions+  -> M.Map ModuleName NormalizedFilePath   -> Position-  -> [SpanInfo]-  -> MaybeT m [Location]-querySpanInfoAt getSpan _ideOptions pos =-    lift . fmap (mapMaybe srcSpanToLocation) . mapMaybeM getSpan . spansAtPoint pos+  -> HieASTs Type+  -> m [Location]+locationsAtPoint getHieFile _ideOptions imports pos ast =+  let ns = concat $ pointCommand ast pos (M.keys . nodeIdentifiers . nodeInfo)+      zeroPos = Position 0 0+      zeroRange = Range zeroPos zeroPos+      modToLocation m = fmap (\fs -> Location (fromNormalizedUri $ filePathToUri' fs) zeroRange) $ M.lookup m imports+    in mapMaybeM (either (pure . modToLocation) $ nameToLocation getHieFile) ns  -- | Given a 'Name' attempt to find the location where it is defined.-nameToLocation :: Monad f => (Module -> MaybeT f (HieFile, String)) -> Name -> f (Maybe SrcSpan)-nameToLocation getHieFile name =+nameToLocation :: Monad f => (Module -> MaybeT f (HieFile, String)) -> Name -> f (Maybe Location)+nameToLocation getHieFile name = fmap (srcSpanToLocation =<<) $   case nameSrcSpan name of     sp@(RealSrcSpan _) -> pure $ Just sp     sp@(UnhelpfulSpan _) -> runMaybeT $ do       guard (sp /= wiredInSrcSpan)-      -- This case usually arises when the definition is in an external package (DAML only).+      -- This case usually arises when the definition is in an external package.       -- In this case the interface files contain garbage source spans       -- so we instead read the .hie files to get useful source spans.       mod <- MaybeT $ return $ nameModule_maybe name@@ -198,24 +188,16 @@     setFileName f (RealSrcSpan span) = RealSrcSpan (span { srcSpanFile = mkFastString f })     setFileName _ span@(UnhelpfulSpan _) = span --- | Filter out spans which do not enclose a given point-spansAtPoint :: Position -> [SpanInfo] -> [SpanInfo]-spansAtPoint pos = filter atp where-  line = _line pos-  cha = _character pos-  atp SpanInfo{..} =-      startsBeforePosition && endsAfterPosition-    where-      startLineCmp = compare spaninfoStartLine line-      endLineCmp   = compare spaninfoEndLine   line--      startsBeforePosition = startLineCmp == LT || (startLineCmp == EQ && spaninfoStartCol <= cha)-                                              -- The end col points to the column after the-                                              -- last character so we use > instead of >=-      endsAfterPosition = endLineCmp == GT || (endLineCmp == EQ && spaninfoEndCol > cha)+pointCommand :: HieASTs Type -> Position -> (HieAST Type -> a) -> [a]+pointCommand hf pos k =+    catMaybes $ M.elems $ flip M.mapWithKey (getAsts hf) $ \fs ast ->+      case selectSmallestContaining (sp fs) ast of+        Nothing -> Nothing+        Just ast' -> Just $ k ast'+ where+   sloc fs = mkRealSrcLoc fs (line+1) (cha+1)+   sp fs = mkRealSrcSpan (sloc fs) (sloc fs)+   line = _line pos+   cha = _character pos  -getModuleNameAsText :: Name -> Maybe T.Text-getModuleNameAsText n = do-  m <- nameModule_maybe n-  return . T.pack . moduleNameString $ moduleName m
− src/Development/IDE/Spans/Calculate.hs
@@ -1,268 +0,0 @@--- Copyright (c) 2019 The DAML Authors. All rights reserved.--- SPDX-License-Identifier: Apache-2.0---- ORIGINALLY COPIED FROM https://github.com/commercialhaskell/intero--{-# LANGUAGE CPP #-}-{-# LANGUAGE RankNTypes #-}-#include "ghc-api-version.h"---- | Get information on modules, identifiers, etc.--module Development.IDE.Spans.Calculate(getSrcSpanInfos) where--import           ConLike-import           Control.Monad-import qualified CoreUtils-import           Data.List-import           Data.Maybe-import           DataCon-import           Desugar-import           GhcMonad-import           HscTypes-import           FastString (mkFastString)-import           OccName-import           Development.IDE.Types.Location-import           Development.IDE.Spans.Type-import           Development.IDE.GHC.Error (zeroSpan, catchSrcErrors)-import           Prelude hiding (mod)-import           TcHsSyn-import           Var-import Development.IDE.Core.Compile-import qualified Development.IDE.GHC.Compat as Compat-import Development.IDE.GHC.Compat-import Development.IDE.GHC.Util-import Development.IDE.Spans.Common-import Development.IDE.Spans.Documentation-import Data.List.Extra (nubOrd)-import qualified Data.Map.Strict as Map---- A lot of things gained an extra X argument in GHC 8.6, which we mostly ignore--- this U ignores that arg in 8.6, but is hidden in 8.4-#if MIN_GHC_API_VERSION(8,6,0)-#define U _-#else-#define U-#endif---- | Get source span info, used for e.g. AtPoint and Goto Definition.-getSrcSpanInfos-    :: HscEnv-    -> [(Located ModuleName, Maybe NormalizedFilePath)] -- ^ Dependencies in topological order-    -> TcModuleResult-    -> [ParsedModule]   -- ^ Dependencies parsed, optional if the 'HscEnv' already contains docs-    -> IO SpansInfo-getSrcSpanInfos env imports tc parsedDeps =-    evalGhcEnv env $-        getSpanInfo imports tc parsedDeps---- | Get ALL source spans in the module.-getSpanInfo :: GhcMonad m-            => [(Located ModuleName, Maybe NormalizedFilePath)] -- ^ imports-            -> TcModuleResult-            -> [ParsedModule]-            -> m SpansInfo-getSpanInfo mods TcModuleResult{tmrModInfo, tmrModule = tcm@TypecheckedModule{..}} parsedDeps =-  do let tcs = tm_typechecked_source-         bs  = listifyAllSpans  tcs :: [LHsBind GhcTc]-         es  = listifyAllSpans  tcs :: [LHsExpr GhcTc]-         ps  = listifyAllSpans' tcs :: [Pat GhcTc]-         ts  = listifyAllSpans tm_renamed_source :: [LHsType GhcRn]-         allModules = tm_parsed_module : parsedDeps-         funBinds = funBindMap tm_parsed_module-         thisMod = ms_mod $ pm_mod_summary tm_parsed_module-         modIface = hm_iface tmrModInfo--     -- Load this module in HPT to make its interface documentation available-     modifySession (loadModuleHome $ HomeModInfo modIface (snd tm_internals_) Nothing)--     bts <- mapM (getTypeLHsBind funBinds) bs   -- binds-     ets <- mapM getTypeLHsExpr es -- expressions-     pts <- mapM getTypeLPat  ps -- patterns-     tts <- concat <$> mapM getLHsType ts -- types--     -- Batch extraction of kinds-     let typeNames = nubOrd [ n | (Named n, _) <- tts]-     kinds <- Map.fromList . zip typeNames  <$> mapM (lookupKind thisMod) typeNames-     let withKind (Named n, x) =-            (Named n, x, join $ Map.lookup n kinds)-         withKind (other, x) =-            (other, x, Nothing)-     tts <- pure $ map withKind tts--     let imports = importInfo mods-     let exports = getExports tcm-     let exprs = addEmptyInfo exports ++ addEmptyInfo imports ++ concat bts ++ tts ++ catMaybes (ets ++ pts)-     let constraints = map constraintToInfo (concatMap getConstraintsLHsBind bs)-         sortedExprs = sortBy cmp exprs-         sortedConstraints = sortBy cmp constraints--    -- Batch extraction of Haddocks-     let names = nubOrd [ s | (Named s,_,_) <- sortedExprs ++ sortedConstraints]-     docs <- Map.fromList . zip names <$> getDocumentationsTryGhc thisMod allModules names-     let withDocs (Named n, x, y) = (Named n, x, y, Map.findWithDefault emptySpanDoc n docs)-         withDocs (other, x, y) = (other, x, y, emptySpanDoc)--     return $ SpansInfo (mapMaybe (toSpanInfo . withDocs) sortedExprs)-                        (mapMaybe (toSpanInfo . withDocs) sortedConstraints)-  where cmp (_,a,_) (_,b,_)-          | a `isSubspanOf` b = LT-          | b `isSubspanOf` a = GT-          | otherwise         = compare (srcSpanStart a) (srcSpanStart b)--        addEmptyInfo = map (\(a,b) -> (a,b,Nothing))-        constraintToInfo (sp, ty) = (SpanS sp, sp, Just ty)--lookupKind :: GhcMonad m => Module -> Name -> m (Maybe Type)-lookupKind mod =-    fmap (either (const Nothing) (safeTyThingType =<<)) . catchSrcErrors "span" . lookupName mod--- | The locations in the typechecked module are slightly messed up in some cases (e.g. HsMatchContext always--- points to the first match) whereas the parsed module has the correct locations.--- Therefore we build up a map from OccName to the corresponding definition in the parsed module--- to lookup precise locations for things like multi-clause function definitions.------ For now this only contains FunBinds.-funBindMap :: ParsedModule -> OccEnv (HsBind GhcPs)-funBindMap pm = mkOccEnv $ [ (occName $ unLoc f, bnd) | L _ (Compat.ValD bnd@FunBind{fun_id = f}) <- hsmodDecls $ unLoc $ pm_parsed_source pm ]--getExports :: TypecheckedModule -> [(SpanSource, SrcSpan)]-getExports m-    | Just (_, _, Just exports, _) <- renamedSource m =-    [ (Named $ unLoc n, getLoc n)-    | (e, _) <- exports-    , n <- ieLNames $ unLoc e-    ]-getExports _ = []---- | Variant of GHC's ieNames that produces LIdP instead of IdP-ieLNames :: IE pass -> [Located (IdP pass)]-ieLNames (IEVar       U n   )     = [ieLWrappedName n]-ieLNames (IEThingAbs  U n   )     = [ieLWrappedName n]-ieLNames (IEThingAll    n   )     = [ieLWrappedName n]-ieLNames (IEThingWith   n _ ns _) = ieLWrappedName n : map ieLWrappedName ns-ieLNames _ = []---- | Get the name and type of a binding.-getTypeLHsBind :: (Monad m)-               => OccEnv (HsBind GhcPs)-               -> LHsBind GhcTc-               -> m [(SpanSource, SrcSpan, Maybe Type)]-getTypeLHsBind funBinds (L _spn FunBind{fun_id = pid})-  | Just FunBind {fun_matches = MG{mg_alts=L _ matches}} <- lookupOccEnv funBinds (occName $ unLoc pid) = do-  let name = getName (unLoc pid)-  return [(Named name, getLoc mc_fun, Just (varType (unLoc pid))) | match <- matches, FunRhs{mc_fun = mc_fun} <- [m_ctxt $ unLoc match] ]--- In theory this shouldn’t ever fail but if it does, we can at least show the first clause.-getTypeLHsBind _ (L _spn FunBind{fun_id = pid,fun_matches = MG{}}) = do-  let name = getName (unLoc pid)-  return [(Named name, getLoc pid, Just (varType (unLoc pid)))]-getTypeLHsBind _ _ = return []---- | Get information about constraints-getConstraintsLHsBind :: LHsBind GhcTc-                      -> [(SrcSpan, Type)]-getConstraintsLHsBind (L spn AbsBinds { abs_ev_vars = vars })-  = map (\v -> (spn, varType v)) vars-getConstraintsLHsBind _ = []---- | Get the name and type of an expression.-getTypeLHsExpr :: (GhcMonad m)-               => LHsExpr GhcTc-               -> m (Maybe (SpanSource, SrcSpan, Maybe Type))-getTypeLHsExpr e = do-  hs_env <- getSession-  (_, mbe) <- liftIO (deSugarExpr hs_env e)-  case mbe of-    Just expr -> do-      let ss = getSpanSource (unLoc e)-      return $ Just (ss, getLoc e, Just (CoreUtils.exprType expr))-    Nothing -> return Nothing-  where-    getSpanSource :: HsExpr GhcTc -> SpanSource-    getSpanSource xpr | isLit xpr = Lit (showGhc xpr)-    getSpanSource (HsVar U (L _ i)) = Named (getName i)-    getSpanSource (HsConLikeOut U (RealDataCon dc)) = Named (dataConName dc)-    getSpanSource RecordCon {rcon_con_name} = Named (getName rcon_con_name)-    getSpanSource (HsWrap U _ xpr) = getSpanSource xpr-    getSpanSource (HsPar U xpr) = getSpanSource (unLoc xpr)-    getSpanSource _ = NoSource--    isLit :: HsExpr GhcTc -> Bool-    isLit (HsLit U _) = True-    isLit (HsOverLit U _) = True-    isLit (ExplicitTuple U args _) = all (isTupLit . unLoc) args-#if MIN_GHC_API_VERSION(8,6,0)-    isLit (ExplicitSum  U _ _ xpr) = isLitChild (unLoc xpr)-    isLit (ExplicitList U _ xprs) = all (isLitChild . unLoc) xprs-#else-    isLit (ExplicitSum  _ _ xpr _) = isLitChild (unLoc xpr)-    isLit (ExplicitList _ _ xprs) = all (isLitChild . unLoc) xprs-#endif-    isLit _ = False--    isTupLit (Present U xpr) = isLitChild (unLoc xpr)-    isTupLit _               = False--    -- We need special treatment for children so things like [(1)] are still treated-    -- as a list literal while not treating (1) as a literal.-    isLitChild (HsWrap U _ xpr) = isLitChild xpr-    isLitChild (HsPar U xpr)    = isLitChild (unLoc xpr)-#if MIN_GHC_API_VERSION(8,8,0)-    isLitChild (ExprWithTySig U xpr _) = isLitChild (unLoc xpr)-#elif MIN_GHC_API_VERSION(8,6,0)-    isLitChild (ExprWithTySig U xpr) = isLitChild (unLoc xpr)-#else-    isLitChild (ExprWithTySigOut xpr _) = isLitChild (unLoc xpr)-    isLitChild (ExprWithTySig xpr _) = isLitChild (unLoc xpr)-#endif-    isLitChild e = isLit e---- | Get the name and type of a pattern.-getTypeLPat :: (Monad m)-            => Pat GhcTc-            -> m (Maybe (SpanSource, SrcSpan, Maybe Type))-getTypeLPat pat = do-  let (src, spn) = getSpanSource pat-  return $ Just (src, spn, Just (hsPatType pat))-  where-    getSpanSource :: Pat GhcTc -> (SpanSource, SrcSpan)-    getSpanSource (VarPat (L spn vid)) = (Named (getName vid), spn)-    getSpanSource (ConPatOut (L spn (RealDataCon dc)) _ _ _ _ _ _) =-      (Named (dataConName dc), spn)-    getSpanSource _ = (NoSource, noSrcSpan)--getLHsType-    :: Monad m-    => LHsType GhcRn-    -> m [(SpanSource, SrcSpan)]-getLHsType (L spn (HsTyVar U _ v)) = do-  let n = unLoc v-  pure [(Named n, spn)]-getLHsType _ = pure []--importInfo :: [(Located ModuleName, Maybe NormalizedFilePath)]-           -> [(SpanSource, SrcSpan)]-importInfo = mapMaybe (uncurry wrk) where-  wrk :: Located ModuleName -> Maybe NormalizedFilePath -> Maybe (SpanSource, SrcSpan)-  wrk modName = \case-    Nothing -> Nothing-    Just fp -> Just (fpToSpanSource $ fromNormalizedFilePath fp, getLoc modName)--  -- TODO make this point to the module name-  fpToSpanSource :: FilePath -> SpanSource-  fpToSpanSource fp = SpanS $ RealSrcSpan $ zeroSpan $ mkFastString fp---- | Pretty print the types into a 'SpanInfo'.-toSpanInfo :: (SpanSource, SrcSpan, Maybe Type, SpanDoc) -> Maybe SpanInfo-toSpanInfo (name,mspan,typ,docs) =-  case mspan of-    RealSrcSpan spn ->-      -- GHC’s line and column numbers are 1-based while LSP’s line and column-      -- numbers are 0-based.-      Just (SpanInfo (srcSpanStartLine spn - 1)-                     (srcSpanStartCol spn - 1)-                     (srcSpanEndLine spn - 1)-                     (srcSpanEndCol spn - 1)-                     typ-                     name-                     docs)-    _ -> Nothing
src/Development/IDE/Spans/Common.hs view
@@ -1,11 +1,12 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DerivingStrategies #-}+{-# LANGUAGE DeriveAnyClass #-} #include "ghc-api-version.h"  module Development.IDE.Spans.Common (   showGhc , showName-, listifyAllSpans-, listifyAllSpans'+, showNameWithoutUniques , safeTyThingId , safeTyThingType , SpanDoc(..)@@ -13,24 +14,31 @@ , emptySpanDoc , spanDocToMarkdown , spanDocToMarkdownForTest+, DocMap+, KindMap ) where -import Data.Data-import qualified Data.Generics import Data.Maybe import qualified Data.Text as T import Data.List.Extra+import Control.DeepSeq+import GHC.Generics  import GHC import Outputable hiding ((<>))-import DynFlags import ConLike import DataCon import Var+import NameEnv  import qualified Documentation.Haddock.Parser as H import qualified Documentation.Haddock.Types as H+import Development.IDE.GHC.Compat+import Development.IDE.GHC.Orphans () +type DocMap = NameEnv SpanDoc+type KindMap = NameEnv TyThing+ showGhc :: Outputable a => a -> String showGhc = showPpr unsafeGlobalDynFlags @@ -40,17 +48,12 @@     prettyprint x = renderWithStyle unsafeGlobalDynFlags (ppr x) style     style = mkUserStyle unsafeGlobalDynFlags neverQualify AllTheWay --- | Get ALL source spans in the source.-listifyAllSpans :: (Typeable a, Data m) => m -> [Located a]-listifyAllSpans tcs =-  Data.Generics.listify p tcs-  where p (L spn _) = isGoodSrcSpan spn--- This is a version of `listifyAllSpans` specialized on picking out--- patterns.  It comes about since GHC now defines `type LPat p = Pat--- p` (no top-level locations).-listifyAllSpans' :: Typeable a-                   => TypecheckedSource -> [Pat a]-listifyAllSpans' tcs = Data.Generics.listify (const True) tcs+showNameWithoutUniques :: Outputable a => a -> T.Text+showNameWithoutUniques = T.pack . prettyprint+  where+    dyn = unsafeGlobalDynFlags `gopt_set` Opt_SuppressUniques+    prettyprint x = renderWithStyle dyn (ppr x) style+    style = mkUserStyle dyn neverQualify AllTheWay  -- From haskell-ide-engine/src/Haskell/Ide/Engine/Support/HieExtras.hs safeTyThingType :: TyThing -> Maybe Type@@ -68,28 +71,25 @@ data SpanDoc   = SpanDocString HsDocString SpanDocUris   | SpanDocText   [T.Text] SpanDocUris-  deriving (Eq, Show)+  deriving stock (Eq, Show, Generic)+  deriving anyclass NFData  data SpanDocUris =   SpanDocUris   { spanDocUriDoc :: Maybe T.Text -- ^ The haddock html page   , spanDocUriSrc :: Maybe T.Text -- ^ The hyperlinked source html page-  } deriving (Eq, Show)+  } deriving stock (Eq, Show, Generic)+    deriving anyclass NFData  emptySpanDoc :: SpanDoc emptySpanDoc = SpanDocText [] (SpanDocUris Nothing Nothing)  spanDocToMarkdown :: SpanDoc -> [T.Text]-#if MIN_GHC_API_VERSION(8,6,0) spanDocToMarkdown (SpanDocString docs uris)   = [T.pack $ haddockToMarkdown $ H.toRegular $ H._doc $ H.parseParas Nothing $ unpackHDS docs]     <> ["\n"] <> spanDocUrisToMarkdown uris   -- Append the extra newlines since this is markdown --- to get a visible newline,   -- you need to have two newlines-#else-spanDocToMarkdown (SpanDocString _ uris)-  = spanDocUrisToMarkdown uris-#endif spanDocToMarkdown (SpanDocText txt uris) = txt <> ["\n"] <> spanDocUrisToMarkdown uris  spanDocUrisToMarkdown :: SpanDocUris -> [T.Text]
src/Development/IDE/Spans/Documentation.hs view
@@ -9,20 +9,24 @@     getDocumentation   , getDocumentationTryGhc   , getDocumentationsTryGhc+  , DocMap+  , mkDocMap   ) where  import           Control.Monad+import           Control.Monad.Extra (findM)+import           Data.Either import           Data.Foldable import           Data.List.Extra import qualified Data.Map as M+import qualified Data.Set as S import           Data.Maybe import qualified Data.Text as T-#if MIN_GHC_API_VERSION(8,6,0) import           Development.IDE.Core.Compile-#endif import           Development.IDE.GHC.Compat import           Development.IDE.GHC.Error import           Development.IDE.Spans.Common+import           Development.IDE.Core.RuleTypes import           System.Directory import           System.FilePath @@ -32,34 +36,62 @@ import           Packages import           Name import           Language.Haskell.LSP.Types (getUri, filePathToUri)+import           TcRnTypes+import           ExtractDocs+import           NameEnv+import HscTypes (HscEnv(hsc_dflags)) -getDocumentationTryGhc :: GhcMonad m => Module -> [ParsedModule] -> Name -> m SpanDoc-getDocumentationTryGhc mod deps n = head <$> getDocumentationsTryGhc mod deps [n]+mkDocMap+  :: HscEnv+  -> [ParsedModule]+  -> RefMap+  -> TcGblEnv+  -> IO DocAndKindMap+mkDocMap env sources rm this_mod =+  do let (_ , DeclDocMap this_docs, _) = extractDocs this_mod+     d <- foldrM getDocs (mkNameEnv $ M.toList $ fmap (`SpanDocString` SpanDocUris Nothing Nothing) this_docs) names+     k <- foldrM getType (tcg_type_env this_mod) names+     pure $ DKMap d k+  where+    getDocs n map+      | maybe True (mod ==) $ nameModule_maybe n = pure map -- we already have the docs in this_docs, or they do not exist+      | otherwise = do+      doc <- getDocumentationTryGhc env mod sources n+      pure $ extendNameEnv map n doc+    getType n map+      | isTcOcc $ occName n = do+        kind <- lookupKind env mod n+        pure $ maybe map (extendNameEnv map n) kind+      | otherwise = pure map+    names = rights $ S.toList idents+    idents = M.keysSet rm+    mod = tcg_mod this_mod -getDocumentationsTryGhc :: GhcMonad m => Module -> [ParsedModule] -> [Name] -> m [SpanDoc]+lookupKind :: HscEnv -> Module -> Name -> IO (Maybe TyThing)+lookupKind env mod =+    fmap (either (const Nothing) id) . catchSrcErrors (hsc_dflags env) "span" . lookupName env mod +getDocumentationTryGhc :: HscEnv -> Module -> [ParsedModule] -> Name -> IO SpanDoc+getDocumentationTryGhc env mod deps n = head <$> getDocumentationsTryGhc env mod deps [n]++getDocumentationsTryGhc :: HscEnv -> Module -> [ParsedModule] -> [Name] -> IO [SpanDoc] -- Interfaces are only generated for GHC >= 8.6. -- In older versions, interface files do not embed Haddocks anyway-#if MIN_GHC_API_VERSION(8,6,0)-getDocumentationsTryGhc mod sources names = do-  res <- catchSrcErrors "docs" $ getDocsBatch mod names+getDocumentationsTryGhc env mod sources names = do+  res <- catchSrcErrors (hsc_dflags env) "docs" $ getDocsBatch env mod names   case res of       Left _ -> mapM mkSpanDocText names       Right res -> zipWithM unwrap res names   where-    unwrap (Right (Just docs, _)) n = SpanDocString <$> pure docs <*> getUris n+    unwrap (Right (Just docs, _)) n = SpanDocString docs <$> getUris n     unwrap _ n = mkSpanDocText n -#else-getDocumentationsTryGhc _ sources names = mapM mkSpanDocText names-  where-#endif     mkSpanDocText name =       pure (SpanDocText (getDocumentation sources name)) <*> getUris name         -- Get the uris to the documentation and source html pages if they exist     getUris name = do-      df <- getSessionDynFlags+      let df = hsc_dflags env       (docFu, srcFu) <-         case nameModule_maybe name of           Just mod -> liftIO $ do@@ -97,7 +129,7 @@    -- Top level names bound by the module   let bs = [ n | let L _ HsModule{hsmodDecls} = pm_parsed_source tc-           , L _ (ValD hsbind) <- hsmodDecls+           , L _ (ValD _ hsbind) <- hsmodDecls            , Just n <- [name_of_bind hsbind]            ]   -- Sort the names' source spans.@@ -170,15 +202,25 @@  lookupHtmlForModule :: (FilePath -> FilePath -> FilePath) -> DynFlags -> Module -> IO (Maybe FilePath) lookupHtmlForModule mkDocPath df m = do-  let mfs = go <$> (listToMaybe =<< lookupHtmls df ui)-  htmls <- filterM doesFileExist (concat . maybeToList $ mfs)-  return $ listToMaybe htmls+  -- try all directories+  let mfs = fmap (concatMap go) (lookupHtmls df ui)+  html <- findM doesFileExist (concat . maybeToList $ mfs)+  -- canonicalize located html to remove /../ indirection which can break some clients+  -- (vscode on Windows at least)+  traverse canonicalizePath html   where-    -- The file might use "." or "-" as separator-    go pkgDocDir = [mkDocPath pkgDocDir mn | mn <- [mndot,mndash]]+    go pkgDocDir = map (mkDocPath pkgDocDir) mns     ui = moduleUnitId m-    mndash = map (\x -> if x == '.' then '-' else x) mndot-    mndot = moduleNameString $ moduleName m+    -- try to locate html file from most to least specific name e.g.+    --  first Language.Haskell.LSP.Types.Uri.html and Language-Haskell-LSP-Types-Uri.html+    --  then Language.Haskell.LSP.Types.html and Language-Haskell-LSP-Types.html etc.+    mns = do+      chunks <- (reverse . drop1 . inits . splitOn ".") $ (moduleNameString . moduleName) m+      -- The file might use "." or "-" as separator+      map (`intercalate` chunks) [".", "-"]  lookupHtmls :: DynFlags -> UnitId -> Maybe [FilePath]-lookupHtmls df ui = haddockHTMLs <$> lookupPackage df ui+lookupHtmls df ui =+  -- use haddockInterfaces instead of haddockHTMLs: GHC treats haddockHTMLs as URL not path +  -- and therefore doesn't expand $topdir on Windows+  map takeDirectory . haddockInterfaces <$> lookupPackage df ui
+ src/Development/IDE/Spans/LocalBindings.hs view
@@ -0,0 +1,134 @@+{-# LANGUAGE DerivingStrategies #-}++module Development.IDE.Spans.LocalBindings+  ( Bindings+  , getLocalScope+  , getFuzzyScope+  , getDefiningBindings+  , getFuzzyDefiningBindings+  , bindings+  ) where++import           Control.DeepSeq+import           Control.Monad+import           Data.Bifunctor+import           Data.IntervalMap.FingerTree (IntervalMap, Interval (..))+import qualified Data.IntervalMap.FingerTree as IM+import qualified Data.List as L+import qualified Data.Map as M+import qualified Data.Set as S+import           Development.IDE.GHC.Compat (RefMap, identType, identInfo, getScopeFromContext, getBindSiteFromContext, Scope(..), Name, Type)+import           Development.IDE.GHC.Error+import           Development.IDE.Types.Location+import           NameEnv+import           SrcLoc++------------------------------------------------------------------------------+-- | Turn a 'RealSrcSpan' into an 'Interval'.+realSrcSpanToInterval :: RealSrcSpan -> Interval Position+realSrcSpanToInterval rss =+  Interval+    (realSrcLocToPosition $ realSrcSpanStart rss)+    (realSrcLocToPosition $ realSrcSpanEnd   rss)++bindings :: RefMap -> Bindings+bindings = uncurry Bindings . localBindings++------------------------------------------------------------------------------+-- | Compute which identifiers are in scope at every point in the AST. Use+-- 'getLocalScope' to find the results.+localBindings+    :: RefMap+    -> ( IntervalMap Position (NameEnv (Name, Maybe Type))+       , IntervalMap Position (NameEnv (Name, Maybe Type))+       )+localBindings refmap = bimap mk mk $ unzip $ do+  (ident, refs)      <- M.toList refmap+  Right name         <- pure ident+  (_, ident_details) <- refs+  let ty = identType ident_details+  info <- S.toList $ identInfo ident_details+  pure+    ( do+        Just scopes <- pure $ getScopeFromContext info+        scope <- scopes >>= \case+          LocalScope scope -> pure $ realSrcSpanToInterval scope+          _ -> []+        pure ( scope+            , unitNameEnv name (name,ty)+            )+    , do+        Just scope <- pure $ getBindSiteFromContext info+        pure ( realSrcSpanToInterval scope+            , unitNameEnv name (name,ty)+            )+    )+  where+    mk = L.foldl' (flip (uncurry IM.insert)) mempty . join++------------------------------------------------------------------------------+-- | The available bindings at every point in a Haskell tree.+data Bindings = Bindings+  { getLocalBindings+        :: IntervalMap Position (NameEnv (Name, Maybe Type))+  , getBindingSites+        :: IntervalMap Position (NameEnv (Name, Maybe Type))+  }++instance Semigroup Bindings where+  Bindings a1 b1 <> Bindings a2 b2+    = Bindings (a1 <> a2) (b1 <> b2)++instance Monoid Bindings where+  mempty = Bindings mempty mempty++instance NFData Bindings where+    rnf = rwhnf++instance Show Bindings where+    show _ = "<bindings>"+++------------------------------------------------------------------------------+-- | Given a 'Bindings' get every identifier in scope at the given+-- 'RealSrcSpan',+getLocalScope :: Bindings -> RealSrcSpan -> [(Name, Maybe Type)]+getLocalScope bs rss+  = nameEnvElts+  $ foldMap snd+  $ IM.dominators (realSrcSpanToInterval rss)+  $ getLocalBindings bs++------------------------------------------------------------------------------+-- | Given a 'Bindings', get every binding currently active at a given+-- 'RealSrcSpan',+getDefiningBindings :: Bindings -> RealSrcSpan -> [(Name, Maybe Type)]+getDefiningBindings bs rss+  = nameEnvElts+  $ foldMap snd+  $ IM.dominators (realSrcSpanToInterval rss)+  $ getBindingSites bs+++-- | Lookup all names in scope in any span that intersects the interval+-- defined by the two positions.+-- This is meant for use with the fuzzy `PositionRange` returned by `PositionMapping`+getFuzzyScope :: Bindings -> Position -> Position -> [(Name, Maybe Type)]+getFuzzyScope bs a b+  = nameEnvElts+  $ foldMap snd+  $ IM.intersections (Interval a b)+  $ getLocalBindings bs++------------------------------------------------------------------------------+-- | Given a 'Bindings', get every binding that intersects the interval defined+-- by the two positions.+-- This is meant for use with the fuzzy `PositionRange` returned by+-- `PositionMapping`+getFuzzyDefiningBindings :: Bindings -> Position -> Position -> [(Name, Maybe Type)]+getFuzzyDefiningBindings bs a b+  = nameEnvElts+  $ foldMap snd+  $ IM.intersections (Interval a b)+  $ getBindingSites bs+
− src/Development/IDE/Spans/Type.hs
@@ -1,77 +0,0 @@--- Copyright (c) 2019 The DAML Authors. All rights reserved.--- SPDX-License-Identifier: Apache-2.0---- ORIGINALLY COPIED FROM https://github.com/commercialhaskell/intero---- | Types used separate to GHCi vanilla.--module Development.IDE.Spans.Type(-    SpansInfo(..)-  , SpanInfo(..)-  , SpanSource(..)-  , getNameM-  ) where--import GHC-import Control.DeepSeq-import OccName-import Development.IDE.GHC.Util-import Development.IDE.Spans.Common--data SpansInfo =-  SpansInfo { spansExprs       :: [SpanInfo]-            , spansConstraints :: [SpanInfo] }-  deriving Show--instance NFData SpansInfo where-  rnf (SpansInfo e c) = liftRnf rnf e `seq` liftRnf rnf c---- | Type of some span of source code. Most of these fields are--- unboxed but Haddock doesn't show that.-data SpanInfo =-  SpanInfo {spaninfoStartLine :: {-# UNPACK #-} !Int-            -- ^ Start line of the span, zero-based.-           ,spaninfoStartCol :: {-# UNPACK #-} !Int-            -- ^ Start column of the span, zero-based.-           ,spaninfoEndLine :: {-# UNPACK #-} !Int-            -- ^ End line of the span (absolute), zero-based.-           ,spaninfoEndCol :: {-# UNPACK #-} !Int-            -- ^ End column of the span (absolute), zero-based.-           ,spaninfoType :: !(Maybe Type)-            -- ^ A pretty-printed representation for the type.-           ,spaninfoSource :: !SpanSource-           -- ^ The actutal 'Name' associated with the span, if-            -- any. This can be useful for accessing a variety of-            -- information about the identifier such as module,-            -- locality, definition location, etc.-           ,spaninfoDocs :: !SpanDoc-           -- ^ Documentation for the element-           }-instance Show SpanInfo where-  show (SpanInfo sl sc el ec t n docs) =-    unwords ["(SpanInfo", show sl, show sc, show el, show ec-            , show $ maybe "NoType" prettyPrint t, "(" <> show n <> "))"-            , "docs(" <> show docs <> ")"]--instance NFData SpanInfo where-    rnf = rwhnf----- we don't always get a name out so sometimes manually annotating source is more appropriate-data SpanSource = Named Name-                | SpanS SrcSpan-                | Lit String-                | NoSource-  deriving (Eq)--instance Show SpanSource where-  show = \case-    Named n -> "Named " ++ occNameString (occName n)-    SpanS sp -> "Span " ++ show sp-    Lit lit -> "Lit " ++ lit-    NoSource -> "NoSource"--getNameM :: SpanSource -> Maybe Name-getNameM = \case-  Named name -> Just name-  _ -> Nothing
src/Development/IDE/Types/Diagnostics.hs view
@@ -89,7 +89,7 @@  prettyRange :: Range -> Doc Terminal.AnsiStyle prettyRange Range{..} = f _start <> "-" <> f _end-    where f Position{..} = pretty (_line+1) <> colon <> pretty _character+    where f Position{..} = pretty (_line+1) <> colon <> pretty (_character+1)  stringParagraphs :: T.Text -> Doc a stringParagraphs = vcat . map (fillSep . map pretty . T.words) . T.lines
src/Development/IDE/Types/Exports.hs view
@@ -5,6 +5,8 @@     IdentInfo(..),     ExportsMap(..),     createExportsMap,+    createExportsMapMg,+    createExportsMapTc ) where  import Avail (AvailInfo(..))@@ -17,11 +19,12 @@ import Name import FieldLabel (flSelector) import qualified Data.HashMap.Strict as Map-import GhcPlugins (IfaceExport)+import GhcPlugins (IfaceExport, ModGuts(..)) import Data.HashSet (HashSet) import qualified Data.HashSet as Set import Data.Bifunctor (Bifunctor(second)) import Data.Hashable (Hashable)+import TcRnTypes(TcGblEnv(..))  newtype ExportsMap = ExportsMap     {getExportsMap :: HashMap IdentifierText (HashSet (IdentInfo,ModuleNameText))}@@ -68,6 +71,20 @@     doOne mi = concatMap (fmap (second Set.fromList) . unpackAvail mn) (mi_exports mi)       where         mn = moduleName $ mi_module mi++createExportsMapMg :: [ModGuts] -> ExportsMap+createExportsMapMg = ExportsMap . Map.fromListWith (<>) . concatMap doOne+  where+    doOne mi = concatMap (fmap (second Set.fromList) . unpackAvail mn) (mg_exports mi)+      where+        mn = moduleName $ mg_module mi++createExportsMapTc :: [TcGblEnv] -> ExportsMap+createExportsMapTc = ExportsMap . Map.fromListWith (<>) . concatMap doOne+  where+    doOne mi = concatMap (fmap (second Set.fromList) . unpackAvail mn) (tcg_exports mi)+      where+        mn = moduleName $ tcg_mod mi  unpackAvail :: ModuleName -> IfaceExport -> [(Text, [(IdentInfo, Text)])] unpackAvail mod =
test/data/hover/GotoHover.hs view
@@ -48,10 +48,13 @@ listOfInt = [ 8391 :: Int, 6268 ]  outer :: Bool-outer = undefined where+outer = undefined inner where    inner :: Char   inner = undefined  imported :: Bar imported = foo++hole :: Int+hole = _
test/exe/Main.hs view
@@ -15,7 +15,7 @@ import qualified Control.Lens as Lens import Control.Monad import Control.Monad.IO.Class (liftIO)-import Data.Aeson (FromJSON, Value)+import Data.Aeson (FromJSON, Value, toJSON) import qualified Data.Binary as Binary import Data.Foldable import Data.List.Extra@@ -30,6 +30,7 @@ import Development.IDE.Spans.Common import Development.IDE.Test import Development.IDE.Test.Runfiles+import qualified Development.IDE.Types.Diagnostics as Diagnostics import Development.IDE.Types.Location import Development.Shake (getDirectoryFilesIO) import qualified Experiments as Bench@@ -47,6 +48,7 @@ import System.Directory import System.Exit (ExitCode(ExitSuccess)) import System.Process.Extra (readCreateProcessWithExitCode, CreateProcess(cwd), proc)+import System.Info.Extra (isWindows) import Test.QuickCheck import Test.QuickCheck.Instances () import Test.Tasty@@ -61,7 +63,6 @@ main :: IO () main = do   -- We mess with env vars so run single-threaded.-  setEnv "TASTY_NUM_THREADS" "1" True   defaultMainWithRerun $ testGroup "ghcide"     [ testSession "open close" $ do         doc <- createDoc "Testing.hs" "haskell" ""@@ -76,6 +77,7 @@     , codeActionTests     , codeLensesTests     , outlineTests+    , highlightTests     , findDefinitionAndHoverTests     , pluginSimpleTests     , pluginParsedResultTests@@ -94,6 +96,7 @@     , bootTests     , rootUriTests     , asyncTests+    , clientSettingsTest     ]  initializeResponseTests :: TestTree@@ -117,7 +120,7 @@     -- for now     , chk "NO goto implementation"  _implementationProvider (Just $ GotoOptionsStatic True)     , chk "NO find references"          _referencesProvider  Nothing-    , chk "NO doc highlight"     _documentHighlightProvider  Nothing+    , chk "   doc highlight"     _documentHighlightProvider  (Just True)     , chk "   doc symbol"           _documentSymbolProvider  (Just True)     , chk "NO workspace symbol"    _workspaceSymbolProvider  Nothing     , chk "   code action"             _codeActionProvider $ Just $ CodeActionOptionsStatic True@@ -196,15 +199,15 @@       let content = T.unlines             [ "module Testing where"             , "foo :: Int -> Int -> Int"-            , "foo a b = a + ab"+            , "foo a _b = a + ab"             , "bar :: Int -> Int -> Int"-            , "bar a b = cd + b"+            , "bar _a b = cd + b"             ]       _ <- createDoc "Testing.hs" "haskell" content       expectDiagnostics         [ ( "Testing.hs"-          , [ (DsError, (2, 14), "Variable not in scope: ab")-            , (DsError, (4, 10), "Variable not in scope: cd")+          , [ (DsError, (2, 15), "Variable not in scope: ab")+            , (DsError, (4, 11), "Variable not in scope: cd")             ]           )         ]@@ -240,7 +243,7 @@           , "a = " <> a]         sourceB = T.unlines           [ "module B where"-          , "import A"+          , "import A ()"           , "b :: Float"           , "b = True"]         bMessage = "Couldn't match expected type 'Float' with actual type 'Bool'"@@ -275,23 +278,24 @@   , testSessionWait "add missing module" $ do       let contentB = T.unlines             [ "module ModuleB where"-            , "import ModuleA"+            , "import ModuleA ()"             ]       _ <- createDoc "ModuleB.hs" "haskell" contentB       expectDiagnostics [("ModuleB.hs", [(DsError, (1, 7), "Could not find module")])]       let contentA = T.unlines [ "module ModuleA where" ]       _ <- createDoc "ModuleA.hs" "haskell" contentA       expectDiagnostics [("ModuleB.hs", [])]-  , testSessionWait "add missing module (non workspace)" $ do+  , ignoreInWindowsBecause "Broken in windows" $ testSessionWait "add missing module (non workspace)" $ do+      tmpDir <- liftIO getTemporaryDirectory       let contentB = T.unlines             [ "module ModuleB where"-            , "import ModuleA"+            , "import ModuleA ()"             ]-      _ <- createDoc "/tmp/ModuleB.hs" "haskell" contentB-      expectDiagnostics [("/tmp/ModuleB.hs", [(DsError, (1, 7), "Could not find module")])]+      _ <- createDoc (tmpDir </> "ModuleB.hs") "haskell" contentB+      expectDiagnostics [(tmpDir </> "ModuleB.hs", [(DsError, (1, 7), "Could not find module")])]       let contentA = T.unlines [ "module ModuleA where" ]-      _ <- createDoc "/tmp/ModuleA.hs" "haskell" contentA-      expectDiagnostics [("/tmp/ModuleB.hs", [])]+      _ <- createDoc (tmpDir </> "ModuleA.hs") "haskell" contentA+      expectDiagnostics [(tmpDir </> "ModuleB.hs", [])]   , testSessionWait "cyclic module dependency" $ do       let contentA = T.unlines             [ "module ModuleA where"@@ -326,7 +330,14 @@       _ <- createDoc "ModuleA.hs" "haskell" contentA       _ <- createDoc "ModuleB.hs" "haskell" contentB       _ <- createDoc "ModuleB.hs-boot" "haskell" contentBboot-      expectDiagnostics []+      expectDiagnosticsWithTags+        [ ( "ModuleA.hs"+          , [(DsInfo, (1, 0), "The import of 'ModuleB'", Just DtUnnecessary)]+          )+        , ( "ModuleB.hs"+          , [(DsInfo, (1, 0), "The import of 'ModuleA'", Just DtUnnecessary)]+          )+        ]   , testSessionWait "correct reference used with hs-boot" $ do       let contentB = T.unlines             [ "module ModuleB where"@@ -361,11 +372,25 @@             ]       _ <- createDoc "ModuleA.hs" "haskell" contentA       _ <- createDoc "ModuleB.hs" "haskell" contentB-      expectDiagnostics+      expectDiagnosticsWithTags         [ ( "ModuleB.hs"-          , [(DsWarning, (2, 0), "The import of 'ModuleA' is redundant")]+          , [(DsWarning, (2, 0), "The import of 'ModuleA' is redundant", Just DtUnnecessary)]           )         ]+  , testSessionWait "redundant import even without warning" $ do+      let contentA = T.unlines ["module ModuleA where"]+      let contentB = T.unlines+            [ "{-# OPTIONS_GHC -Wno-unused-imports #-}"+            , "module ModuleB where"+            , "import ModuleA"+            ]+      _ <- createDoc "ModuleA.hs" "haskell" contentA+      _ <- createDoc "ModuleB.hs" "haskell" contentB+      expectDiagnosticsWithTags+        [ ( "ModuleB.hs"+          , [(DsInfo, (2, 0), "The import of 'ModuleA' is redundant", Just DtUnnecessary)]+          )+        ]   , testSessionWait "package imports" $ do       let thisDataListContent = T.unlines             [ "module Data.List where"@@ -396,7 +421,7 @@             [ "{-# OPTIONS_GHC -Wredundant-constraints #-}"             , "module Foo where"             , "foo :: Ord a => a -> Int"-            , "foo a = 1"+            , "foo _a = 1"             ]       _ <- createDoc "Foo.hs" "haskell" fooContent       expectDiagnostics@@ -512,8 +537,11 @@      bdoc <- createDoc bPath "haskell" bSource     _pdoc <- createDoc pPath "haskell" pSource-    expectDiagnostics [("P.hs", [(DsWarning,(4,0), "Top-level binding")]) -- So that we know P has been loaded-                      ]+    expectDiagnosticsWithTags+      [("P.hs", [(DsWarning,(4,0), "Top-level binding", Nothing)]) -- So that we know P has been loaded+      ,("P.hs", [(DsInfo,(2,0), "The import of", Just DtUnnecessary)])+      ,("P.hs", [(DsInfo,(4,0), "Defined but not used", Just DtUnnecessary)])+      ]      -- Change y from Int to B which introduces a type error in A (imported from P)     changeDoc bdoc [TextDocumentContentChangeEvent Nothing Nothing $@@ -557,24 +585,17 @@       _doc <- createDoc "A.hs" "haskell" "{-#LANGUAGE NoImplicitPrelude #-}\nmodule A where\nimport WatchedFilesMissingModule"       watchedFileRegs <- getWatchedFilesSubscriptionsUntil @PublishDiagnosticsNotification -      -- Expect 4 subscriptions (A does not get any because it's VFS):-      --  - /path-to-workspace/hie.yaml-      --  - /path-to-workspace/WatchedFilesMissingModule.hs-      --  - /path-to-workspace/WatchedFilesMissingModule.lhs-      --  - /path-to-workspace/src/WatchedFilesMissingModule.hs-      --  - /path-to-workspace/src/WatchedFilesMissingModule.lhs-      liftIO $ length watchedFileRegs @?= 5+      -- Expect 1 subscription: we only ever send one+      liftIO $ length watchedFileRegs @?= 1    , testSession' "non workspace file" $ \sessionDir -> do-      liftIO $ writeFile (sessionDir </> "hie.yaml") "cradle: {direct: {arguments: [\"-i/tmp\", \"A\", \"WatchedFilesMissingModule\"]}}"+      tmpDir <- liftIO getTemporaryDirectory+      liftIO $ writeFile (sessionDir </> "hie.yaml") ("cradle: {direct: {arguments: [\"-i" <> tmpDir <> "\", \"A\", \"WatchedFilesMissingModule\"]}}")       _doc <- createDoc "A.hs" "haskell" "{-# LANGUAGE NoImplicitPrelude#-}\nmodule A where\nimport WatchedFilesMissingModule"       watchedFileRegs <- getWatchedFilesSubscriptionsUntil @PublishDiagnosticsNotification -      -- Expect 2 subscriptions (/tmp does not get any as it is out of the workspace):-      --  - /path-to-workspace/hie.yaml-      --  - /path-to-workspace/WatchedFilesMissingModule.hs-      --  - /path-to-workspace/WatchedFilesMissingModule.lhs-      liftIO $ length watchedFileRegs @?= 3+      -- Expect 1 subscription: we only ever send one+      liftIO $ length watchedFileRegs @?= 1    -- TODO add a test for didChangeWorkspaceFolder   ]@@ -736,7 +757,7 @@             ]       docB <- createDoc "ModuleB.hs" "haskell" contentB       _ <- waitForDiagnostics-      [CACodeAction action@CodeAction { _title = actionTitle }]+      [CACodeAction action@CodeAction { _title = actionTitle }, _]           <- getCodeActions docB (Range (Position 2 0) (Position 2 5))       liftIO $ "Remove import" @=? actionTitle       executeCodeAction action@@ -762,7 +783,7 @@             ]       docB <- createDoc "ModuleB.hs" "haskell" contentB       _ <- waitForDiagnostics-      [CACodeAction action@CodeAction { _title = actionTitle }]+      [CACodeAction action@CodeAction { _title = actionTitle }, _]           <- getCodeActions docB (Range (Position 2 0) (Position 2 5))       liftIO $ "Remove import" @=? actionTitle       executeCodeAction action@@ -791,7 +812,7 @@             ]       docB <- createDoc "ModuleB.hs" "haskell" contentB       _ <- waitForDiagnostics-      [CACodeAction action@CodeAction { _title = actionTitle }]+      [CACodeAction action@CodeAction { _title = actionTitle }, _]           <- getCodeActions docB (Range (Position 2 0) (Position 2 5))       liftIO $ "Remove stuffA, stuffC from import" @=? actionTitle       executeCodeAction action@@ -806,8 +827,8 @@   , testSession "redundant operator" $ do       let contentA = T.unlines             [ "module ModuleA where"-            , "a !! b = a"-            , "a <?> b = a"+            , "a !! _b = a"+            , "a <?> _b = a"             , "stuffB :: Integer"             , "stuffB = 123"             ]@@ -820,7 +841,7 @@             ]       docB <- createDoc "ModuleB.hs" "haskell" contentB       _ <- waitForDiagnostics-      [CACodeAction action@CodeAction { _title = actionTitle }]+      [CACodeAction action@CodeAction { _title = actionTitle }, _]           <- getCodeActions docB (Range (Position 2 0) (Position 2 5))       liftIO $ "Remove !!, <?> from import" @=? actionTitle       executeCodeAction action@@ -848,7 +869,7 @@             ]       docB <- createDoc "ModuleB.hs" "haskell" contentB       _ <- waitForDiagnostics-      [CACodeAction action@CodeAction { _title = actionTitle }]+      [CACodeAction action@CodeAction { _title = actionTitle }, _]           <- getCodeActions docB (Range (Position 2 0) (Position 2 5))       liftIO $ "Remove A from import" @=? actionTitle       executeCodeAction action@@ -875,7 +896,7 @@             ]       docB <- createDoc "ModuleB.hs" "haskell" contentB       _ <- waitForDiagnostics-      [CACodeAction action@CodeAction { _title = actionTitle }]+      [CACodeAction action@CodeAction { _title = actionTitle }, _]           <- getCodeActions docB (Range (Position 2 0) (Position 2 5))       liftIO $ "Remove A, E, F from import" @=? actionTitle       executeCodeAction action@@ -899,7 +920,7 @@             ]       docB <- createDoc "ModuleB.hs" "haskell" contentB       _ <- waitForDiagnostics-      [CACodeAction action@CodeAction { _title = actionTitle }]+      [CACodeAction action@CodeAction { _title = actionTitle }, _]           <- getCodeActions docB (Range (Position 2 0) (Position 2 5))       liftIO $ "Remove import" @=? actionTitle       executeCodeAction action@@ -909,6 +930,38 @@             , "module ModuleB where"             ]       liftIO $ expectedContentAfterAction @=? contentAfterAction+  , testSession "remove all" $ do+      let content = T.unlines+            [ "{-# OPTIONS_GHC -Wunused-imports #-}"+            , "module ModuleA where"+            , "import Data.Function (fix, (&))"+            , "import qualified Data.Functor.Const"+            , "import Data.Functor.Identity"+            , "import Data.Functor.Sum (Sum (InL, InR))"+            , "import qualified Data.Kind as K (Constraint, Type)"+            , "x = InL (Identity 123)"+            , "y = fix id"+            , "type T = K.Type"+            ]+      doc <- createDoc "ModuleC.hs" "haskell" content+      _ <- waitForDiagnostics+      [_, _, _, _, CACodeAction action@CodeAction { _title = actionTitle }]+          <- getCodeActions doc (Range (Position 2 0) (Position 2 5))+      liftIO $ "Remove all redundant imports" @=? actionTitle+      executeCodeAction action+      contentAfterAction <- documentContents doc+      let expectedContentAfterAction = T.unlines+            [ "{-# OPTIONS_GHC -Wunused-imports #-}"+            , "module ModuleA where"+            , "import Data.Function (fix)"+            , "import Data.Functor.Identity"+            , "import Data.Functor.Sum (Sum (InL))"+            , "import qualified Data.Kind as K (Type)"+            , "x = InL (Identity 123)"+            , "y = fix id"+            , "type T = K.Type"+            ]+      liftIO $ expectedContentAfterAction @=? contentAfterAction   ]  extendImportTests :: TestTree@@ -1095,7 +1148,7 @@     test' waitForCheckProject wanted imps def other newImp = testSessionWithExtraFiles "hover" (T.unpack def) $ \dir -> do       let before = T.unlines $ "module A where" : ["import " <> x | x <- imps] ++ def : other           after  = T.unlines $ "module A where" : ["import " <> x | x <- imps] ++ [newImp] ++ def : other-          cradle = "cradle: {direct: {arguments: [-hide-all-packages, -package, base, -package, text, -package-env, -, A, Bar, Foo, GotoHover]}}"+          cradle = "cradle: {direct: {arguments: [-hide-all-packages, -package, base, -package, text, -package-env, -, A, Bar, Foo]}}"       liftIO $ writeFileUTF8 (dir </> "hie.yaml") cradle       doc <- createDoc "Test.hs" "haskell" before       void (skipManyTill anyMessage message :: Session WorkDoneProgressEndNotification)@@ -1376,14 +1429,14 @@     testSession "add default type to satisfy one contraint" $     testFor     (T.unlines [ "{-# OPTIONS_GHC -Wtype-defaults #-}"-               , "module A () where"+               , "module A (f) where"                , ""                , "f = 1"                ])     [ (DsWarning, (3, 4), "Defaulting the following constraint") ]     "Add type annotation ‘Integer’ to ‘1’"     (T.unlines [ "{-# OPTIONS_GHC -Wtype-defaults #-}"-               , "module A () where"+               , "module A (f) where"                , ""                , "f = (1 :: Integer)"                ])@@ -1392,7 +1445,7 @@     testFor     (T.unlines [ "{-# OPTIONS_GHC -Wtype-defaults #-}"                , "{-# LANGUAGE OverloadedStrings #-}"-               , "module A () where"+               , "module A (f) where"                , ""                , "import Debug.Trace"                , ""@@ -1404,7 +1457,7 @@     "Add type annotation ‘[Char]’ to ‘\"debug\"’"     (T.unlines [ "{-# OPTIONS_GHC -Wtype-defaults #-}"                , "{-# LANGUAGE OverloadedStrings #-}"-               , "module A () where"+               , "module A (f) where"                , ""                , "import Debug.Trace"                , ""@@ -1414,7 +1467,7 @@     testFor     (T.unlines [ "{-# OPTIONS_GHC -Wtype-defaults #-}"                , "{-# LANGUAGE OverloadedStrings #-}"-               , "module A () where"+               , "module A (f) where"                , ""                , "import Debug.Trace"                , ""@@ -1424,7 +1477,7 @@     "Add type annotation ‘[Char]’ to ‘\"debug\"’"     (T.unlines [ "{-# OPTIONS_GHC -Wtype-defaults #-}"                , "{-# LANGUAGE OverloadedStrings #-}"-               , "module A () where"+               , "module A (f) where"                , ""                , "import Debug.Trace"                , ""@@ -1434,7 +1487,7 @@     testFor     (T.unlines [ "{-# OPTIONS_GHC -Wtype-defaults #-}"                , "{-# LANGUAGE OverloadedStrings #-}"-               , "module A () where"+               , "module A (f) where"                , ""                , "import Debug.Trace"                , ""@@ -1444,7 +1497,7 @@     "Add type annotation ‘[Char]’ to ‘\"debug\"’"     (T.unlines [ "{-# OPTIONS_GHC -Wtype-defaults #-}"                , "{-# LANGUAGE OverloadedStrings #-}"-               , "module A () where"+               , "module A (f) where"                , ""                , "import Debug.Trace"                , ""@@ -1565,11 +1618,9 @@           "_"             "n" "n"           "globalConvert" "n" "n" -#if MIN_GHC_API_VERSION(8,6,0)   , check "replace _convertme with localConvert"           "_convertme"   "n" "n"           "localConvert" "n" "n"-#endif    , check "replace _b with globalInt"           "_a" "_b"        "_c"@@ -1579,14 +1630,12 @@           "_a" "_b"        "_c"           "_a" "_b" "globalInt" -#if MIN_GHC_API_VERSION(8,6,0)   , check "replace _c with parameterInt"           "_a" "_b" "_c"           "_a" "_b"  "parameterInt"   , check "replace _ with foo _"           "_" "n" "n"           "(foo _)" "n" "n"-#endif   ]  addInstanceConstraintTests :: TestTree@@ -1654,20 +1703,18 @@  addFunctionConstraintTests :: TestTree addFunctionConstraintTests = let-  missingConstraintSourceCode :: Maybe T.Text -> T.Text-  missingConstraintSourceCode mConstraint =-    let constraint = maybe "" (<> " => ") mConstraint-     in T.unlines+  missingConstraintSourceCode :: T.Text -> T.Text+  missingConstraintSourceCode constraint =+    T.unlines     [ "module Testing where"     , ""     , "eq :: " <> constraint <> "a -> a -> Bool"     , "eq x y = x == y"     ] -  incompleteConstraintSourceCode :: Maybe T.Text -> T.Text-  incompleteConstraintSourceCode mConstraint =-    let constraint = maybe "Eq a" (\c -> "(Eq a, " <> c <> ")") mConstraint-     in T.unlines+  incompleteConstraintSourceCode :: T.Text -> T.Text+  incompleteConstraintSourceCode constraint =+    T.unlines     [ "module Testing where"     , ""     , "data Pair a b = Pair a b"@@ -1676,10 +1723,9 @@     , "eq (Pair x y) (Pair x' y') = x == x' && y == y'"     ] -  incompleteConstraintSourceCode2 :: Maybe T.Text -> T.Text-  incompleteConstraintSourceCode2 mConstraint =-    let constraint = maybe "(Eq a, Eq b)" (\c -> "(Eq a, Eq b, " <> c <> ")") mConstraint-     in T.unlines+  incompleteConstraintSourceCode2 :: T.Text -> T.Text+  incompleteConstraintSourceCode2 constraint =+    T.unlines     [ "module Testing where"     , ""     , "data Three a b c = Three a b c"@@ -1688,6 +1734,28 @@     , "eq (Three x y z) (Three x' y' z') = x == x' && y == y' && z == z'"     ] +  incompleteConstraintSourceCodeWithExtraCharsInContext :: T.Text -> T.Text+  incompleteConstraintSourceCodeWithExtraCharsInContext constraint =+    T.unlines+    [ "module Testing where"+    , ""+    , "data Pair a b = Pair a b"+    , ""+    , "eq :: " <> constraint <> " => Pair a b -> Pair a b -> Bool"+    , "eq (Pair x y) (Pair x' y') = x == x' && y == y'"+    ]++  incompleteConstraintSourceCodeWithNewlinesInTypeSignature :: T.Text -> T.Text+  incompleteConstraintSourceCodeWithNewlinesInTypeSignature constraint =+    T.unlines+    [ "module Testing where"+    , "data Pair a b = Pair a b"+    , "eq "+    , "    :: " <> constraint+    , "    => Pair a b -> Pair a b -> Bool"+    , "eq (Pair x y) (Pair x' y') = x == x' && y == y'"+    ]+   check :: T.Text -> T.Text -> T.Text -> TestTree   check actionTitle originalCode expectedCode = testSession (T.unpack actionTitle) $ do     doc <- createDoc "Testing.hs" "haskell" originalCode@@ -1701,16 +1769,24 @@   in testGroup "add function constraint"   [ check     "Add `Eq a` to the context of the type signature for `eq`"-    (missingConstraintSourceCode Nothing)-    (missingConstraintSourceCode $ Just "Eq a")+    (missingConstraintSourceCode "")+    (missingConstraintSourceCode "Eq a => ")   , check     "Add `Eq b` to the context of the type signature for `eq`"-    (incompleteConstraintSourceCode Nothing)-    (incompleteConstraintSourceCode $ Just "Eq b")+    (incompleteConstraintSourceCode "Eq a")+    (incompleteConstraintSourceCode "(Eq a, Eq b)")   , check     "Add `Eq c` to the context of the type signature for `eq`"-    (incompleteConstraintSourceCode2 Nothing)-    (incompleteConstraintSourceCode2 $ Just "Eq c")+    (incompleteConstraintSourceCode2 "(Eq a, Eq b)")+    (incompleteConstraintSourceCode2 "(Eq a, Eq b, Eq c)")+  , check+    "Add `Eq b` to the context of the type signature for `eq`"+    (incompleteConstraintSourceCodeWithExtraCharsInContext "( Eq a )")+    (incompleteConstraintSourceCodeWithExtraCharsInContext "(Eq a, Eq b)")+  , check+    "Add `Eq b` to the context of the type signature for `eq`"+    (incompleteConstraintSourceCodeWithNewlinesInTypeSignature "(Eq a)")+    (incompleteConstraintSourceCodeWithNewlinesInTypeSignature "(Eq a, Eq b)")   ]  removeRedundantConstraintsTests :: TestTree@@ -2090,6 +2166,7 @@       closeDoc fooDoc      doc <- openTestDataDoc (dir </> sourceFilePath)+    void (skipManyTill anyMessage message :: Session WorkDoneProgressEndNotification)     found <- get doc pos     check found targetRange @@ -2101,7 +2178,7 @@     check expected =       case hover of         Nothing -> unless (expected == ExpectNoHover) $ liftIO $ assertFailure "no hover found"-        Just Hover{_contents = (HoverContents MarkupContent{_value = msg})+        Just Hover{_contents = (HoverContents MarkupContent{_value = standardizeQuotes -> msg})                   ,_range    = rangeInHover } ->           case expected of             ExpectRange  expectedRange -> checkHoverRange expectedRange rangeInHover msg@@ -2140,7 +2217,9 @@   mkFindTests tests = testGroup "get"     [ testGroup "definition" $ mapMaybe fst tests     , testGroup "hover"      $ mapMaybe snd tests-    , checkFileCompiles sourceFilePath+    , checkFileCompiles sourceFilePath $+        expectDiagnostics+          [ ( "GotoHover.hs", [(DsError, (59, 7), "Found hole: _")]) ]     , testGroup "type-definition" typeDefinitionTests ]    typeDefinitionTests = [ tst (getTypeDefinitions, checkDefs) aaaL14 (pure tcData) "Saturated data con"@@ -2161,17 +2240,17 @@   aaaL14 = Position 18 20  ;  aaa    = [mkR  11  0   11  3]   dcL7   = Position 11 11  ;  tcDC   = [mkR   7 23    9 16]   dcL12  = Position 16 11  ;-  xtcL5  = Position  9 11  ;  xtc    = [ExpectExternFail,   ExpectHoverText ["Int", "Defined in ‘GHC.Types’"]]+  xtcL5  = Position  9 11  ;  xtc    = [ExpectExternFail,   ExpectHoverText ["Int", "Defined in ", "GHC.Types"]]   tcL6   = Position 10 11  ;  tcData = [mkR   7  0    9 16, ExpectHoverText ["TypeConstructor", "GotoHover.hs:8:1"]]   vvL16  = Position 20 12  ;  vv     = [mkR  20  4   20  6]   opL16  = Position 20 15  ;  op     = [mkR  21  2   21  4]   opL18  = Position 22 22  ;  opp    = [mkR  22 13   22 17]   aL18   = Position 22 20  ;  apmp   = [mkR  22 10   22 11]   b'L19  = Position 23 13  ;  bp     = [mkR  23  6   23  7]-  xvL20  = Position 24  8  ;  xvMsg  = [ExpectExternFail,   ExpectHoverText ["Data.Text.pack", ":: String -> Text"]]+  xvL20  = Position 24  8  ;  xvMsg  = [ExpectExternFail,   ExpectHoverText ["pack", ":: String -> Text", "Data.Text"]]   clL23  = Position 27 11  ;  cls    = [mkR  25  0   26 20, ExpectHoverText ["MyClass", "GotoHover.hs:26:1"]]   clL25  = Position 29  9-  eclL15 = Position 19  8  ;  ecls   = [ExpectExternFail, ExpectHoverText ["Num", "Defined in ‘GHC.Num’"]]+  eclL15 = Position 19  8  ;  ecls   = [ExpectExternFail, ExpectHoverText ["Num", "Defined in ", "GHC.Num"]]   dnbL29 = Position 33 18  ;  dnb    = [ExpectHoverText [":: ()"],   mkR  33 12   33 21]   dnbL30 = Position 34 23   lcbL33 = Position 37 26  ;  lcb    = [ExpectHoverText [":: Char"], mkR  37 26   37 27]@@ -2190,19 +2269,15 @@   lstL43 = Position 47 12  ;  litL   = [ExpectHoverText ["[8391 :: Int, 6268]"]]   outL45 = Position 49  3  ;  outSig = [ExpectHoverText ["outer", "Bool"], mkR 46 0 46 5]   innL48 = Position 52  5  ;  innSig = [ExpectHoverText ["inner", "Char"], mkR 49 2 49 7]+  holeL60 = Position 59 7  ;  hleInfo = [ExpectHoverText ["_ ::"]]   cccL17 = Position 17 11  ;  docLink = [ExpectHoverText ["[Documentation](file:///"]]-#if MIN_GHC_API_VERSION(8,6,0)   imported = Position 56 13 ; importedSig = getDocUri "Foo.hs" >>= \foo -> return [ExpectHoverText ["foo", "Foo", "Haddock"], mkL foo 5 0 5 3]   reexported = Position 55 14 ; reexportedSig = getDocUri "Bar.hs" >>= \bar -> return [ExpectHoverText ["Bar", "Bar", "Haddock"], mkL bar 3 0 3 14]-#else-  imported = Position 56 13 ; importedSig = getDocUri "Foo.hs" >>= \foo -> return [ExpectHoverText ["foo", "Foo"], mkL foo 5 0 5 3]-  reexported = Position 55 14 ; reexportedSig = getDocUri "Bar.hs" >>= \bar -> return [ExpectHoverText ["Bar", "Bar"], mkL bar 3 0 3 14]-#endif   in   mkFindTests   --      def    hover  look       expect   [ test  yes    yes    fffL4      fff           "field in record definition"-  , test  broken broken fffL8      fff           "field in record construction     #71"+  , test  yes    yes    fffL8      fff           "field in record construction     #71"   , test  yes    yes    fffL14     fff           "field name used as accessor"          -- 120 in Calculate.hs   , test  yes    yes    aaaL14     aaa           "top-level name"                       -- 120   , test  yes    yes    dcL7       tcDC          "data constructor record         #247"@@ -2224,18 +2299,23 @@   , test  yes    yes    lclL33     lcb           "listcomp lookup"   , test  yes    yes    mclL36     mcl           "top-level fn 1st clause"   , test  yes    yes    mclL37     mcl           "top-level fn 2nd clause         #246"-  , test  yes    yes    spaceL37   space        "top-level fn on space #315"+#if MIN_GHC_API_VERSION(8,10,0)+  , test  yes    yes    spaceL37   space         "top-level fn on space #315"+#else+  , test  yes    broken spaceL37   space         "top-level fn on space #315"+#endif   , test  no     yes    docL41     doc           "documentation                     #7"   , test  no     yes    eitL40     kindE         "kind of Either                  #273"   , test  no     yes    intL40     kindI         "kind of Int                     #273"   , test  no     broken tvrL40     kindV         "kind of (* -> *) type variable  #273"-  , test  no     yes    intL41     litI          "literal Int  in hover info      #274"-  , test  no     yes    chrL36     litC          "literal Char in hover info      #274"-  , test  no     yes    txtL8      litT          "literal Text in hover info      #274"-  , test  no     yes    lstL43     litL          "literal List in hover info      #274"-  , test  no     yes    docL41     constr        "type constraint in hover info   #283"+  , test  no     broken intL41     litI          "literal Int  in hover info      #274"+  , test  no     broken chrL36     litC          "literal Char in hover info      #274"+  , test  no     broken txtL8      litT          "literal Text in hover info      #274"+  , test  no     broken lstL43     litL          "literal List in hover info      #274"+  , test  no     broken docL41     constr        "type constraint in hover info   #283"   , test  broken broken outL45     outSig        "top-level signature             #310"   , test  broken broken innL48     innSig        "inner     signature             #310"+  , test  no     yes    holeL60    hleInfo       "hole without internal name      #847"   , test  no     yes    cccL17     docLink       "Haddock html links"   , testM yes    yes    imported   importedSig   "Imported symbol"   , testM yes    yes    reexported reexportedSig "Imported symbol (reexported)"@@ -2245,15 +2325,15 @@         broken = Just . (`xfail` "known broken")         no = const Nothing -- don't run this test at all -checkFileCompiles :: FilePath -> TestTree-checkFileCompiles fp =+checkFileCompiles :: FilePath -> Session () -> TestTree+checkFileCompiles fp diag =   testSessionWithExtraFiles "hover" ("Does " ++ fp ++ " compile") $ \dir -> do     void (openTestDataDoc (dir </> fp))-    expectNoMoreDiagnostics 0.5+    diag  pluginSimpleTests :: TestTree-pluginSimpleTests = -  testSessionWait "simple plugin" $ do+pluginSimpleTests =+  ignoreInWindowsForGHC88And810 $ testSessionWait "simple plugin" $ do     let content =           T.unlines             [ "{-# OPTIONS_GHC -fplugin GHC.TypeLits.KnownNat.Solver #-}"@@ -2265,20 +2345,20 @@             , "f :: forall n. KnownNat n => Proxy n -> Integer"             , "f _ = natVal (Proxy :: Proxy n) + natVal (Proxy :: Proxy (n+2))"             , "foo :: Int -> Int -> Int"-            , "foo a b = a + c"+            , "foo a _b = a + c"             ]     _ <- createDoc "Testing.hs" "haskell" content     expectDiagnostics       [ ( "Testing.hs",-          [(DsError, (8, 14), "Variable not in scope: c")]+          [(DsError, (8, 15), "Variable not in scope: c")]           )       ] -pluginParsedResultTests :: TestTree -pluginParsedResultTests = -  (`xfail84` "record-dot-preprocessor unsupported on 8.4") $ testSessionWait "parsedResultAction plugin" $ do -    let content = -          T.unlines +pluginParsedResultTests :: TestTree+pluginParsedResultTests =+  ignoreInWindowsForGHC88And810 $ testSessionWait "parsedResultAction plugin" $ do+    let content =+          T.unlines             [ "{-# LANGUAGE DuplicateRecordFields, TypeApplications, FlexibleContexts, DataKinds, MultiParamTypeClasses, TypeSynonymInstances, FlexibleInstances #-}"             , "{-# OPTIONS_GHC -fplugin=RecordDotPreprocessor #-}"             , "module Testing (Company(..), display) where"@@ -2286,13 +2366,13 @@             , "display :: Company -> String"             , "display c = c.name"             ]-    _ <- createDoc "Testing.hs" "haskell" content -    expectNoMoreDiagnostics 1+    _ <- createDoc "Testing.hs" "haskell" content+    expectNoMoreDiagnostics 2  cppTests :: TestTree cppTests =   testGroup "cpp"-    [ testCase "cpp-error" $ do+    [ ignoreInWindowsBecause "Throw a lsp session time out in windows for ghc-8.8 and is broken for other versions" $ testCase "cpp-error" $ do         let content =               T.unlines                 [ "{-# LANGUAGE CPP #-}",@@ -2358,7 +2438,7 @@                 ["{-# LANGUAGE Trustworthy #-}"                 ,"module A where"                 ,"import System.IO.Unsafe"-                ,"import System.IO"+                ,"import System.IO ()"                 ,"trustWorthyId :: a -> a"                 ,"trustWorthyId i = unsafePerformIO $ do"                 ,"  putStrLn \"I'm safe\""@@ -2425,7 +2505,38 @@         _ <- createDoc "A.hs" "haskell" sourceA         _ <- createDoc "B.hs" "haskell" sourceB         return ()-    , thReloadingTest `xfail` "expect broken (#672)"+    , thReloadingTest+    -- Regression test for https://github.com/digital-asset/ghcide/issues/614+    , thLinkingTest+    , testSessionWait "findsTHIdentifiers" $ do+        let sourceA =+              T.unlines+                [ "{-# LANGUAGE TemplateHaskell #-}"+                , "module A (a) where"+                , "a = [| glorifiedID |]"+                , "glorifiedID :: a -> a"+                , "glorifiedID = id" ]+        let sourceB =+              T.unlines+                [ "{-# OPTIONS_GHC -Wall #-}"+                , "{-# LANGUAGE TemplateHaskell #-}"+                , "module B where"+                , "import A"+                , "main = $a (putStrLn \"success!\")"]+        _ <- createDoc "A.hs" "haskell" sourceA+        _ <- createDoc "B.hs" "haskell" sourceB+        expectDiagnostics [ ( "B.hs", [(DsWarning, (4, 0), "Top-level binding with no type signature: main :: IO ()")] ) ]+    , ignoreInWindowsForGHC88 $ testCase "findsTHnewNameConstructor" $ withoutStackEnv $ runWithExtraFiles "THNewName" $ \dir -> do++    -- This test defines a TH value with the meaning "data A = A" in A.hs+    -- Loads and export the template in B.hs+    -- And checks wether the constructor A can be loaded in C.hs+    -- This test does not fail when either A and B get manually loaded before C.hs+    -- or when we remove the seemingly unnecessary TH pragma from C.hs++    let cPath = dir </> "C.hs"+    _ <- openDoc cPath "haskell"+    expectDiagnostics [ ( cPath, [(DsWarning, (3, 0), "Top-level binding with no type signature: a :: A")] ) ]     ]  -- | test that TH is reevaluated on typecheck@@ -2436,7 +2547,7 @@         bPath = dir </> "THB.hs"         cPath = dir </> "THC.hs" -    aSource <- liftIO $ readFileUtf8 aPath --  th = [d|a :: ()|]+    aSource <- liftIO $ readFileUtf8 aPath --  th = [d|a = ()|]     bSource <- liftIO $ readFileUtf8 bPath --  $th     cSource <- liftIO $ readFileUtf8 cPath --  c = a :: () @@ -2456,17 +2567,45 @@     expectDiagnostics         [("THC.hs", [(DsError, (4, 4), "Couldn't match expected type '()' with actual type 'Bool'")])         ,("THC.hs", [(DsWarning, (6,0), "Top-level binding")])+        ,("THB.hs", [(DsWarning, (4,0), "Top-level binding")])         ]      closeDoc adoc     closeDoc bdoc     closeDoc cdoc +thLinkingTest :: TestTree+thLinkingTest = testCase "th-linking-test" $ withoutStackEnv $ runWithExtraFiles "TH" $ \dir -> do +    let aPath = dir </> "THA.hs"+        bPath = dir </> "THB.hs"++    aSource <- liftIO $ readFileUtf8 aPath --  th_a = [d|a :: ()|]+    bSource <- liftIO $ readFileUtf8 bPath --  $th_a++    adoc <- createDoc aPath "haskell" aSource+    bdoc <- createDoc bPath "haskell" bSource++    expectDiagnostics [("THB.hs", [(DsWarning, (4,0), "Top-level binding")])]++    let aSource' = T.unlines $ init (init (T.lines aSource)) ++ ["th :: DecsQ", "th = [d| a = False|]"]+    changeDoc adoc [TextDocumentContentChangeEvent Nothing Nothing aSource']++    -- modify b too+    let bSource' = T.unlines $ init (T.lines bSource) ++ ["$th"]+    changeDoc bdoc [TextDocumentContentChangeEvent Nothing Nothing bSource']++    expectDiagnostics [("THB.hs", [(DsWarning, (4,0), "Top-level binding")])]++    closeDoc adoc+    closeDoc bdoc++ completionTests :: TestTree completionTests   = testGroup "completion"     [ testGroup "non local" nonLocalCompletionTests+    , testGroup "topLevel" topLevelCompletionTests     , testGroup "local" localCompletionTests     , testGroup "other" otherCompletionTests     ]@@ -2485,8 +2624,8 @@             when expectedDocs $                 assertBool ("Missing docs: " <> T.unpack _label) (isJust _documentation) -localCompletionTests :: [TestTree]-localCompletionTests = [+topLevelCompletionTests :: [TestTree]+topLevelCompletionTests = [     completionTest         "variable"         ["bar = xx", "-- | haddock", "xxx :: ()", "xxx = ()", "-- | haddock", "data Xxx = XxxCon"]@@ -2515,9 +2654,81 @@         "class"         ["bar :: Xx", "xxx = ()", "-- | haddock", "class Xxx a"]         (Position 0 9)-        [("Xxx", CiClass, False, True)]+        [("Xxx", CiClass, False, True)],+    completionTest+        "records"+        ["data Person = Person { _personName:: String, _personAge:: Int}", "bar = Person { _pers }" ]+        (Position 1 19)+        [("_personName", CiFunction, False, True),+         ("_personAge", CiFunction, False, True)],+    completionTest+        "recordsConstructor"+        ["data XxRecord = XyRecord { x:: String, y:: Int}", "bar = Xy" ]+        (Position 1 19)+        [("XyRecord", CiConstructor, False, True)]     ] +localCompletionTests :: [TestTree]+localCompletionTests = [+    completionTest+        "argument"+        ["bar (Just abcdef) abcdefg = abcd"]+        (Position 0 32)+        [("abcdef", CiFunction, True, False),+         ("abcdefg", CiFunction , True, False)+        ],+    completionTest+        "let"+        ["bar = let (Just abcdef) = undefined"+        ,"          abcdefg = let abcd = undefined in undefined"+        ,"        in abcd"+        ]+        (Position 2 15)+        [("abcdef", CiFunction, True, False),+         ("abcdefg", CiFunction , True, False)+        ],+    completionTest+        "where"+        ["bar = abcd"+        ,"  where (Just abcdef) = undefined"+        ,"        abcdefg = let abcd = undefined in undefined"+        ]+        (Position 0 10)+        [("abcdef", CiFunction, True, False),+         ("abcdefg", CiFunction , True, False)+        ],+    completionTest+        "do/1"+        ["bar = do"+        ,"  Just abcdef <- undefined"+        ,"  abcd"+        ,"  abcdefg <- undefined"+        ,"  pure ()"+        ]+        (Position 2 6)+        [("abcdef", CiFunction, True, False)+        ],+    completionTest+        "do/2"+        ["bar abcde = do"+        ,"    Just [(abcdef,_)] <- undefined"+        ,"    abcdefg <- undefined"+        ,"    let abcdefgh = undefined"+        ,"        (Just [abcdefghi]) = undefined"+        ,"    abcd"+        ,"  where"+        ,"    abcdefghij = undefined"+        ]+        (Position 5 8)+        [("abcde", CiFunction, True, False)+        ,("abcdefghij", CiFunction, True, False)+        ,("abcdef", CiFunction, True, False)+        ,("abcdefg", CiFunction, True, False)+        ,("abcdefgh", CiFunction, True, False)+        ,("abcdefghi", CiFunction, True, False)+        ]+    ]+ nonLocalCompletionTests :: [TestTree] nonLocalCompletionTests =   [ completionTest@@ -2544,6 +2755,12 @@       ["{-# OPTIONS_GHC -Wunused-binds #-}", "module A () where", "f = Prelude.hea"]       (Position 2 15)       [ ("head", CiFunction, True, True)+      ],+    completionTest+      "duplicate import"+      ["module A where", "import Data.List", "import Data.List", "f = perm"]+      (Position 3 8)+      [ ("permutations", CiFunction, False, False)       ]   ] @@ -2568,6 +2785,76 @@       [("Integer", CiStruct, True, True)]   ] +highlightTests :: TestTree+highlightTests = testGroup "highlight"+  [ testSessionWait "value" $ do+    doc <- createDoc "A.hs" "haskell" source+    _ <- waitForDiagnostics+    highlights <- getHighlights doc (Position 2 2)+    liftIO $ highlights @?=+            [ DocumentHighlight (R 1 0 1 3) (Just HkRead)+            , DocumentHighlight (R 2 0 2 3) (Just HkWrite)+            , DocumentHighlight (R 3 6 3 9) (Just HkRead)+            , DocumentHighlight (R 4 22 4 25) (Just HkRead)+            ]+  , testSessionWait "type" $ do+    doc <- createDoc "A.hs" "haskell" source+    _ <- waitForDiagnostics+    highlights <- getHighlights doc (Position 1 8)+    liftIO $ highlights @?=+            [ DocumentHighlight (R 1 7 1 10) (Just HkRead)+            , DocumentHighlight (R 2 11 2 14) (Just HkRead)+            ]+  , testSessionWait "local" $ do+    doc <- createDoc "A.hs" "haskell" source+    _ <- waitForDiagnostics+    highlights <- getHighlights doc (Position 5 5)+    liftIO $ highlights @?=+            [ DocumentHighlight (R 5 4 5 7) (Just HkWrite)+            , DocumentHighlight (R 5 10 5 13) (Just HkRead)+            , DocumentHighlight (R 6 12 6 15) (Just HkRead)+            ]+  , testSessionWait "record" $ do+    doc <- createDoc "A.hs" "haskell" recsource+    _ <- waitForDiagnostics+    highlights <- getHighlights doc (Position 3 15)+    liftIO $ highlights @?=+      -- Span is just the .. on 8.10, but Rec{..} before+#if MIN_GHC_API_VERSION(8,10,0)+            [ DocumentHighlight (R 3 8 3 10) (Just HkWrite)+#else+            [ DocumentHighlight (R 3 4 3 11) (Just HkWrite)+#endif+            , DocumentHighlight (R 3 14 3 20) (Just HkRead)+            ]+    highlights <- getHighlights doc (Position 2 17)+    liftIO $ highlights @?=+            [ DocumentHighlight (R 2 17 2 23) (Just HkWrite)+      -- Span is just the .. on 8.10, but Rec{..} before+#if MIN_GHC_API_VERSION(8,10,0)+            , DocumentHighlight (R 3 8 3 10) (Just HkRead)+#else+            , DocumentHighlight (R 3 4 3 11) (Just HkRead)+#endif+            ]+  ]+  where+    source = T.unlines+      ["module Highlight where"+      ,"foo :: Int"+      ,"foo = 3 :: Int"+      ,"bar = foo"+      ,"  where baz = let x = foo in x"+      ,"baz arg = arg + x"+      ,"  where x = arg"+      ]+    recsource = T.unlines+      ["{-# LANGUAGE RecordWildCards #-}"+      ,"module Highlight where"+      ,"data Rec = Rec { field1 :: Int, field2 :: Char }"+      ,"foo Rec{..} = field2 + field1"+      ]+ outlineTests :: TestTree outlineTests = testGroup   "outline"@@ -2645,10 +2932,10 @@     liftIO $ symbols @?= Left       [docSymbol "a :: ()" SkFunction (R 1 0 1 12)]   , testSessionWait "function" $ do-    let source = T.unlines ["a x = ()"]+    let source = T.unlines ["a _x = ()"]     docId   <- createDoc "A.hs" "haskell" source     symbols <- getDocumentSymbols docId-    liftIO $ symbols @?= Left [docSymbol "a" SkFunction (R 0 0 0 8)]+    liftIO $ symbols @?= Left [docSymbol "a" SkFunction (R 0 0 0 9)]   , testSessionWait "type synonym" $ do     let source = T.unlines ["type A = Bool"]     docId   <- createDoc "A.hs" "haskell" source@@ -2678,26 +2965,26 @@           ]       ]   , testSessionWait "import" $ do-    let source = T.unlines ["import Data.Maybe"]+    let source = T.unlines ["import Data.Maybe ()"]     docId   <- createDoc "A.hs" "haskell" source     symbols <- getDocumentSymbols docId     liftIO $ symbols @?= Left       [docSymbolWithChildren "imports"                              SkModule-                             (R 0 0 0 17)-                             [ docSymbol "import Data.Maybe" SkModule (R 0 0 0 17)+                             (R 0 0 0 20)+                             [ docSymbol "import Data.Maybe" SkModule (R 0 0 0 20)                              ]       ]   , testSessionWait "multiple import" $ do-    let source = T.unlines ["", "import Data.Maybe", "", "import Control.Exception", ""]+    let source = T.unlines ["", "import Data.Maybe ()", "", "import Control.Exception ()", ""]     docId   <- createDoc "A.hs" "haskell" source     symbols <- getDocumentSymbols docId     liftIO $ symbols @?= Left       [docSymbolWithChildren "imports"                              SkModule-                             (R 1 0 3 24)-                             [ docSymbol "import Data.Maybe" SkModule (R 1 0 1 17)-                             , docSymbol "import Control.Exception" SkModule (R 3 0 3 24)+                             (R 1 0 3 27)+                             [ docSymbol "import Data.Maybe" SkModule (R 1 0 1 20)+                             , docSymbol "import Control.Exception" SkModule (R 3 0 3 27)                              ]       ]   , testSessionWait "foreign import" $ do@@ -2749,13 +3036,6 @@ xfail :: TestTree -> String -> TestTree xfail = flip expectFailBecause -xfail84 :: TestTree -> String -> TestTree-#if MIN_GHC_API_VERSION(8,6,0)-xfail84 t _ = t-#else-xfail84 = flip expectFailBecause-#endif- expectFailCabal :: String -> TestTree -> TestTree #ifdef STACK expectFailCabal _ = id@@ -2763,6 +3043,25 @@ expectFailCabal = expectFailBecause #endif +ignoreInWindowsBecause :: String -> TestTree -> TestTree+ignoreInWindowsBecause = if isWindows then ignoreTestBecause else (\_ x -> x)++ignoreInWindowsForGHC88And810 :: TestTree -> TestTree+#if MIN_GHC_API_VERSION(8,8,1) && !MIN_GHC_API_VERSION(9,0,0)+ignoreInWindowsForGHC88And810 =+    ignoreInWindowsBecause "tests are unreliable in windows for ghc 8.8 and 8.10"+#else+ignoreInWindowsForGHC88And810 = id+#endif++ignoreInWindowsForGHC88 :: TestTree -> TestTree+#if MIN_GHC_API_VERSION(8,8,1) && !MIN_GHC_API_VERSION(8,10,1)+ignoreInWindowsForGHC88 =+    ignoreInWindowsBecause "tests are unreliable in windows for ghc 8.8"+#else+ignoreInWindowsForGHC88 = id+#endif+ data Expect   = ExpectRange Range -- Both gotoDef and hover should report this range   | ExpectLocation Location@@ -2869,7 +3168,7 @@  dependentFileTest :: TestTree dependentFileTest = testGroup "addDependentFile"-    [testGroup "file-changed" [testSession' "test" test]+    [testGroup "file-changed" [ignoreInWindowsForGHC88 $ testSession' "test" test]     ]     where       test dir = do@@ -2886,7 +3185,7 @@               , "               f <- qRunIO (readFile \"dep-file.txt\")"               , "               if f == \"B\" then [| 1 |] else lift f)"               ]-        let bazContent = T.unlines ["module Baz where", "import Foo"]+        let bazContent = T.unlines ["module Baz where", "import Foo ()"]         _ <-createDoc "Foo.hs" "haskell" fooContent         doc <- createDoc "Baz.hs" "haskell" bazContent         expectDiagnostics@@ -3025,8 +3324,11 @@     pSource <- liftIO $ readFileUtf8 pPath -- bar = x :: Int      bdoc <- createDoc bPath "haskell" bSource-    expectDiagnostics [("P.hs", [(DsWarning,(4,0), "Top-level binding")]) -- So what we know P has been loaded-                      ]+    expectDiagnosticsWithTags+      [("P.hs", [(DsWarning,(4,0), "Top-level binding", Nothing)]) -- So what we know P has been loaded+      ,("P.hs", [(DsInfo,(2,0), "The import of", Just DtUnnecessary)])+      ,("P.hs", [(DsInfo,(4,0), "Defined but not used", Just DtUnnecessary)])+      ]      -- Change y from Int to B     changeDoc bdoc [TextDocumentContentChangeEvent Nothing Nothing $ T.unlines ["module B where", "y :: Bool", "y = undefined"]]@@ -3040,17 +3342,11 @@      -- Check that we wrote the interfaces for B when we saved     lid <- sendRequest (CustomClientMethod "hidir") $ GetInterfaceFilesDir bPath-    res <- skipManyTill (message :: Session WorkDoneProgressCreateRequest) $-           skipManyTill (message :: Session WorkDoneProgressBeginNotification) $-             responseForId lid+    res <- skipManyTill anyMessage $ responseForId lid     liftIO $ case res of       ResponseMessage{_result=Right hidir} -> do         hi_exists <- doesFileExist $ hidir </> "B.hi"         assertBool ("Couldn't find B.hi in " ++ hidir) hi_exists-#if MIN_GHC_API_VERSION(8,6,0)-        hie_exists <- doesFileExist $ hidir </> "B.hie"-        assertBool ("Couldn't find B.hie in " ++ hidir) hie_exists-#endif       _ -> assertFailure $ "Got malformed response for CustomMessage hidir: " ++ show res      pdoc <- createDoc pPath "haskell" pSource@@ -3063,9 +3359,12 @@     -- This is clearly inconsistent, and the expected outcome a bit surprising:     --   - The diagnostic for A has already been received. Ghcide does not repeat diagnostics     --   - P is being typechecked with the last successful artifacts for A.-    expectDiagnostics [("P.hs", [(DsWarning,(4,0), "Top-level binding")])-                      ,("P.hs", [(DsWarning,(6,0), "Top-level binding")])-                      ]+    expectDiagnosticsWithTags+      [("P.hs", [(DsWarning,(4,0), "Top-level binding", Nothing)])+      ,("P.hs", [(DsWarning,(6,0), "Top-level binding", Nothing)])+      ,("P.hs", [(DsInfo,(4,0), "Defined but not used", Just DtUnnecessary)])+      ,("P.hs", [(DsInfo,(6,0), "Defined but not used", Just DtUnnecessary)])+      ]     expectNoMoreDiagnostics 2  ifaceErrorTest2 :: TestTree@@ -3078,8 +3377,11 @@      bdoc <- createDoc bPath "haskell" bSource     pdoc <- createDoc pPath "haskell" pSource-    expectDiagnostics [("P.hs", [(DsWarning,(4,0), "Top-level binding")]) -- So that we know P has been loaded-                      ]+    expectDiagnosticsWithTags+      [("P.hs", [(DsWarning,(4,0), "Top-level binding", Nothing)]) -- So that we know P has been loaded+      ,("P.hs", [(DsInfo,(2,0), "The import of", Just DtUnnecessary)])+      ,("P.hs", [(DsInfo,(4,0), "Defined but not used", Just DtUnnecessary)])+      ]      -- Change y from Int to B     changeDoc bdoc [TextDocumentContentChangeEvent Nothing Nothing $ T.unlines ["module B where", "y :: Bool", "y = undefined"]]@@ -3091,12 +3393,14 @@     -- foo = y :: Bool     -- HOWEVER, in A...     -- x = y  :: Int-    expectDiagnostics+    expectDiagnosticsWithTags     -- As in the other test, P is being typechecked with the last successful artifacts for A     -- (ot thanks to -fdeferred-type-errors)-      [("A.hs", [(DsError, (5, 4), "Couldn't match expected type 'Int' with actual type 'Bool'")])-      ,("P.hs", [(DsWarning,(4,0), "Top-level binding")])-      ,("P.hs", [(DsWarning,(6,0), "Top-level binding")])+      [("A.hs", [(DsError, (5, 4), "Couldn't match expected type 'Int' with actual type 'Bool'", Nothing)])+      ,("P.hs", [(DsWarning, (4, 0), "Top-level binding", Nothing)])+      ,("P.hs", [(DsInfo, (4,0), "Defined but not used", Just DtUnnecessary)])+      ,("P.hs", [(DsWarning, (6, 0), "Top-level binding", Nothing)])+      ,("P.hs", [(DsInfo, (6,0), "Defined but not used", Just DtUnnecessary)])       ]      expectNoMoreDiagnostics 2@@ -3119,9 +3423,11 @@      -- In this example the interface file for A should not exist (modulo the cache folder)     -- Despite that P still type checks, as we can generate an interface file for A thanks to -fdeferred-type-errors-    expectDiagnostics-      [("A.hs", [(DsError, (5, 4), "Couldn't match expected type 'Int' with actual type 'Bool'")])-      ,("P.hs", [(DsWarning,(4,0), "Top-level binding")])+    expectDiagnosticsWithTags+      [("A.hs", [(DsError, (5, 4), "Couldn't match expected type 'Int' with actual type 'Bool'", Nothing)])+      ,("P.hs", [(DsWarning,(4,0), "Top-level binding", Nothing)])+      ,("P.hs", [(DsInfo,(2,0), "The import of", Just DtUnnecessary)])+      ,("P.hs", [(DsInfo,(4,0), "Defined but not used", Just DtUnnecessary)])       ]     expectNoMoreDiagnostics 2 @@ -3184,9 +3490,10 @@             , Bench.repetitions = Just 3             , Bench.buildTool = Bench.Stack             } in-    withResource Bench.setup id $ \_ -> testGroup "benchmark experiments"+    withResource Bench.setup Bench.cleanUp $ \getResource -> testGroup "benchmark experiments"     [ expectFailCabal "Requires stack" $ testCase (Bench.name e) $ do-        res <- Bench.runBench runInDir e+        Bench.SetupResult{Bench.benchDir} <- getResource+        res <- Bench.runBench (runInDir benchDir) e         assertBool "did not successfully complete 5 repetitions" $ Bench.success res         | e <- Bench.experiments         , Bench.name e /= "edit" -- the edit experiment does not ever fail@@ -3234,6 +3541,27 @@             liftIO $ [ _title | CACodeAction CodeAction{_title} <- actions] @=? ["add signature: foo :: a -> a"]     ] ++clientSettingsTest :: TestTree+clientSettingsTest = testGroup "client settings handling"+    [+        testSession "ghcide does not support update config" $ do+            sendNotification WorkspaceDidChangeConfiguration (DidChangeConfigurationParams (toJSON ("" :: String)))+            logNot <- skipManyTill anyMessage loggingNotification+            isMessagePresent "Updating Not supported" [getLogMessage logNot]+    ,   testSession "ghcide restarts shake session on config changes" $ do+            void $ skipManyTill anyMessage $ message @RegisterCapabilityRequest+            sendNotification WorkspaceDidChangeConfiguration (DidChangeConfigurationParams (toJSON ("" :: String)))+            nots <- skipManyTill anyMessage $ count 3 loggingNotification+            isMessagePresent "Restarting build session" (map getLogMessage nots)++    ]+  where getLogMessage (NotLogMessage (NotificationMessage _ _ (LogMessageParams _ msg))) = msg+        getLogMessage _ = ""++        isMessagePresent expectedMsg actualMsgs = liftIO $+            assertBool ("\"" ++ expectedMsg ++ "\" is not present in: " ++ show actualMsgs)+                       (any ((expectedMsg `isSubsequenceOf`) . show) actualMsgs) ---------------------------------------------------------------------- -- Utils ----------------------------------------------------------------------@@ -3379,6 +3707,23 @@          uriToFilePath' uri @?= Just ""      , testCase "Key with empty file path roundtrips via Binary"  $          Binary.decode (Binary.encode (Q ((), emptyFilePath))) @?= Q ((), emptyFilePath)+     , testCase "showDiagnostics prints ranges 1-based (like vscode)" $ do+         let diag = ("", Diagnostics.ShowDiag, Diagnostic+               { _range = Range+                   { _start = Position{_line = 0, _character = 1}+                   , _end = Position{_line = 2, _character = 3}+                   }+               , _severity = Nothing+               , _code = Nothing+               , _source = Nothing+               , _message = ""+               , _relatedInformation = Nothing+               , _tags = Nothing+               })+         let shown = T.unpack (Diagnostics.showDiagnostics [diag])+         let expected = "1:2-3:4"+         assertBool (unwords ["expected to find range", expected, "in diagnostic", shown]) $+             expected `isInfixOf` shown      ]  positionMappingTests :: TestTree
test/src/Development/IDE/Test.hs view
@@ -9,14 +9,17 @@   , requireDiagnostic   , diagnostic   , expectDiagnostics+  , expectDiagnosticsWithTags   , expectNoMoreDiagnostics   , canonicalizeUri+  , standardizeQuotes   ) where  import Control.Applicative.Combinators import Control.Lens hiding (List) import Control.Monad import Control.Monad.IO.Class+import Data.Bifunctor (second) import qualified Data.Map.Strict as Map import qualified Data.Text as T import Language.Haskell.LSP.Test hiding (message)@@ -35,8 +38,8 @@ cursorPosition :: Cursor -> Position cursorPosition (line,  col) = Position line col -requireDiagnostic :: List Diagnostic -> (DiagnosticSeverity, Cursor, T.Text) -> Assertion-requireDiagnostic actuals expected@(severity, cursor, expectedMsg) = do+requireDiagnostic :: List Diagnostic -> (DiagnosticSeverity, Cursor, T.Text, Maybe DiagnosticTag) -> Assertion+requireDiagnostic actuals expected@(severity, cursor, expectedMsg, expectedTag) = do     unless (any match actuals) $         assertFailure $             "Could not find " <> show expected <>@@ -48,7 +51,13 @@         && cursorPosition cursor == d ^. range . start         && standardizeQuotes (T.toLower expectedMsg) `T.isInfixOf`            standardizeQuotes (T.toLower $ d ^. message)+        && hasTag expectedTag (d ^. tags) +    hasTag :: Maybe DiagnosticTag -> Maybe (List DiagnosticTag) -> Bool+    hasTag Nothing  _       = True+    hasTag (Just _) Nothing = False+    hasTag (Just actualTag) (Just (List tags)) = actualTag `elem` tags+ -- |wait for @timeout@ seconds and report an assertion failure -- if any diagnostic messages arrive in that period expectNoMoreDiagnostics :: Seconds -> Session ()@@ -76,7 +85,12 @@     ignoreOthers = void anyMessage >> handleMessages  expectDiagnostics :: [(FilePath, [(DiagnosticSeverity, Cursor, T.Text)])] -> Session ()-expectDiagnostics expected = do+expectDiagnostics+  = expectDiagnosticsWithTags+  . map (second (map (\(ds, c, t) -> (ds, c, t, Nothing))))++expectDiagnosticsWithTags :: [(FilePath, [(DiagnosticSeverity, Cursor, T.Text, Maybe DiagnosticTag)])] -> Session ()+expectDiagnosticsWithTags expected = do     let f = getDocUri >=> liftIO . canonicalizeUri >=> pure . toNormalizedUri     expected' <- Map.fromListWith (<>) <$> traverseOf (traverse . _1) f expected     go expected'