ghc-8.4.2: The GHC API

HscMain

Description

Main API for compiling plain Haskell source code.

This module implements compilation of a Haskell source. It is not concerned with preprocessing of source files; this is handled in DriverPipeline.

There are various entry points depending on what mode we're in: "batch" mode (--make), "one-shot" mode (-c, -S etc.), and "interactive" mode (GHCi). There are also entry points for individual passes: parsing, typechecking/renaming, desugaring, and simplification.

All the functions here take an HscEnv as a parameter, but none of them return a new one: HscEnv is treated as an immutable value from here on in (although it has mutable components, for the caches).

We use the Hsc monad to deal with warning messages consistently: specifically, while executing within an Hsc monad, warnings are collected. When a Hsc monad returns to an IO monad, the warnings are printed, or compilation aborts if the -Werror flag is enabled.

(c) The GRASP/AQUA Project, Glasgow University, 1993-2000

Synopsis

Compiling complete source files

data HscStatus Source #

Status of a compilation to hard-code

Arguments

 :: HscEnv -> CgGuts -> ModSummary -> FilePath -> IO (FilePath, Maybe FilePath, [(ForeignSrcLang, FilePath)]) Just f = _stub.c is f

Compile to hard-code.

Running passes separately

parse a file, returning the abstract syntax

hscTypecheckRename :: HscEnv -> ModSummary -> HsParsedModule -> IO (TcGblEnv, RenamedStuff) Source #

Rename and typecheck a module, additionally returning the renamed syntax

Convert a typechecked module to Core

Make a ModDetails from the results of typechecking. Used when typechecking only, as opposed to full compilation.

Check that a module is safe to import.

We return True to indicate the import is safe and False otherwise although in the False case an exception may be thrown first.

Return if a module is trusted and the pkgs it depends on to be trusted.

Support for interactive evaluation

Rename some import declarations

Lookup things in the compiler's environment

Compile a stmt all the way to an HValue, but don't run it

We return Nothing to indicate an empty statement (or comment only), not a parse error.

Arguments

 :: HscEnv -> String The statement -> String The source -> Int Starting line -> IO (Maybe ([Id], ForeignHValue, FixityEnv))

Compile a stmt all the way to an HValue, but don't run it

We return Nothing to indicate an empty statement (or comment only), not a parse error.

Arguments

 :: HscEnv -> GhciLStmt GhcPs The parsed statement -> IO (Maybe ([Id], ForeignHValue, FixityEnv))

Arguments

 :: HscEnv -> String The statement -> IO ([TyThing], InteractiveContext)

Compile a decls

Arguments

 :: HscEnv -> String The statement -> String The source -> Int Starting line -> IO ([TyThing], InteractiveContext)

Compile a decls

Arguments

 :: HscEnv -> TcRnExprMode -> String The expression -> IO Type

Typecheck an expression (but don't run it)

How should we infer a type? See Note [TcRnExprMode]

Constructors

 TM_Inst Instantiate the type fully (:type) TM_NoInst Do not instantiate the type (:type +v) TM_Default Default the type eagerly (:type +d)

Arguments

 :: HscEnv -> Bool Normalise the type -> String The type as a string -> IO (Type, Kind) Resulting type (possibly normalised) and kind

Find the kind of a type Currently this does *not* generalise the kinds of the type

Low-level exports for hooks

Given a ModSummary, parses and typechecks it, returning the TcGblEnv resulting from type-checking.

ioMsgMaybe :: IO (Messages, Maybe a) -> Hsc a Source #

Deal with errors and warnings returned by a compilation step

In order to reduce dependencies to other parts of the compiler, functions outside the "main" parts of GHC return warnings and errors as a parameter and signal success via by wrapping the result in a Maybe type. This function logs the returned warnings and propagates errors as exceptions (of type SourceError).

This function assumes the following invariants:

1. If the second result indicates success (is of the form 'Just x'), there must be no error messages in the first result.
2. If there are no error messages, but the second result indicates failure there should be warnings in the first result. That is, if the action failed, it must have been due to the warnings (i.e., -Werror).

hscAddSptEntries :: HscEnv -> [SptEntry] -> IO () Source #

Load the given static-pointer table entries into the interpreter. See Note [Grand plan for static forms] in StaticPtrTable.