mirror of
https://github.com/gren-lang/compiler.git
synced 2024-10-26 09:50:44 +03:00
Include inlined source maps when compiling projects. The actual source map generation is not done.
This commit is contained in:
parent
6076e115e0
commit
edf50aba98
@ -37,7 +37,7 @@ import Prelude hiding (cycle, print)
|
|||||||
type Task a =
|
type Task a =
|
||||||
Task.Task Exit.Generate a
|
Task.Task Exit.Generate a
|
||||||
|
|
||||||
debug :: FilePath -> Details.Details -> Build.Artifacts -> Task B.Builder
|
debug :: FilePath -> Details.Details -> Build.Artifacts -> Task JS.GeneratedResult
|
||||||
debug root details (Build.Artifacts pkg ifaces roots modules) =
|
debug root details (Build.Artifacts pkg ifaces roots modules) =
|
||||||
do
|
do
|
||||||
loading <- loadObjects root details modules
|
loading <- loadObjects root details modules
|
||||||
@ -46,20 +46,18 @@ debug root details (Build.Artifacts pkg ifaces roots modules) =
|
|||||||
let mode = Mode.Dev (Just types)
|
let mode = Mode.Dev (Just types)
|
||||||
let graph = objectsToGlobalGraph objects
|
let graph = objectsToGlobalGraph objects
|
||||||
let mains = gatherMains pkg objects roots
|
let mains = gatherMains pkg objects roots
|
||||||
let (JS.GeneratedResult state) = JS.generate mode graph mains
|
return $ JS.generate mode graph mains
|
||||||
return state
|
|
||||||
|
|
||||||
dev :: FilePath -> Details.Details -> Build.Artifacts -> Task B.Builder
|
dev :: FilePath -> Details.Details -> Build.Artifacts -> Task JS.GeneratedResult
|
||||||
dev root details (Build.Artifacts pkg _ roots modules) =
|
dev root details (Build.Artifacts pkg _ roots modules) =
|
||||||
do
|
do
|
||||||
objects <- finalizeObjects =<< loadObjects root details modules
|
objects <- finalizeObjects =<< loadObjects root details modules
|
||||||
let mode = Mode.Dev Nothing
|
let mode = Mode.Dev Nothing
|
||||||
let graph = objectsToGlobalGraph objects
|
let graph = objectsToGlobalGraph objects
|
||||||
let mains = gatherMains pkg objects roots
|
let mains = gatherMains pkg objects roots
|
||||||
let (JS.GeneratedResult state) = JS.generate mode graph mains
|
return $ JS.generate mode graph mains
|
||||||
return state
|
|
||||||
|
|
||||||
prod :: FilePath -> Details.Details -> Build.Artifacts -> Task B.Builder
|
prod :: FilePath -> Details.Details -> Build.Artifacts -> Task JS.GeneratedResult
|
||||||
prod root details (Build.Artifacts pkg _ roots modules) =
|
prod root details (Build.Artifacts pkg _ roots modules) =
|
||||||
do
|
do
|
||||||
objects <- finalizeObjects =<< loadObjects root details modules
|
objects <- finalizeObjects =<< loadObjects root details modules
|
||||||
@ -67,8 +65,7 @@ prod root details (Build.Artifacts pkg _ roots modules) =
|
|||||||
let graph = objectsToGlobalGraph objects
|
let graph = objectsToGlobalGraph objects
|
||||||
let mode = Mode.Prod (Mode.shortenFieldNames graph)
|
let mode = Mode.Prod (Mode.shortenFieldNames graph)
|
||||||
let mains = gatherMains pkg objects roots
|
let mains = gatherMains pkg objects roots
|
||||||
let (JS.GeneratedResult state) = JS.generate mode graph mains
|
return $ JS.generate mode graph mains
|
||||||
return state
|
|
||||||
|
|
||||||
repl :: FilePath -> Details.Details -> Bool -> Build.ReplArtifacts -> N.Name -> Task B.Builder
|
repl :: FilePath -> Details.Details -> Bool -> Build.ReplArtifacts -> N.Name -> Task B.Builder
|
||||||
repl root details ansi (Build.ReplArtifacts home modules localizer annotations) name =
|
repl root details ansi (Build.ReplArtifacts home modules localizer annotations) name =
|
||||||
|
@ -23,6 +23,7 @@ import Generate.JavaScript.Expression qualified as Expr
|
|||||||
import Generate.JavaScript.Functions qualified as Functions
|
import Generate.JavaScript.Functions qualified as Functions
|
||||||
import Generate.JavaScript.Name qualified as JsName
|
import Generate.JavaScript.Name qualified as JsName
|
||||||
import Generate.Mode qualified as Mode
|
import Generate.Mode qualified as Mode
|
||||||
|
import Generate.SourceMap qualified as SourceMap
|
||||||
import Gren.Kernel qualified as K
|
import Gren.Kernel qualified as K
|
||||||
import Gren.ModuleName qualified as ModuleName
|
import Gren.ModuleName qualified as ModuleName
|
||||||
import Reporting.Doc qualified as D
|
import Reporting.Doc qualified as D
|
||||||
@ -36,8 +37,10 @@ type Graph = Map.Map Opt.Global Opt.Node
|
|||||||
|
|
||||||
type Mains = Map.Map ModuleName.Canonical Opt.Main
|
type Mains = Map.Map ModuleName.Canonical Opt.Main
|
||||||
|
|
||||||
newtype GeneratedResult = GeneratedResult
|
data GeneratedResult = GeneratedResult
|
||||||
{_source :: B.Builder}
|
{ _source :: B.Builder,
|
||||||
|
_sourceMap :: SourceMap.SourceMap
|
||||||
|
}
|
||||||
|
|
||||||
prelude :: B.Builder
|
prelude :: B.Builder
|
||||||
prelude =
|
prelude =
|
||||||
@ -56,7 +59,11 @@ generate mode (Opt.GlobalGraph graph _) mains =
|
|||||||
<> stateToBuilder state
|
<> stateToBuilder state
|
||||||
<> toMainExports mode mains
|
<> toMainExports mode mains
|
||||||
<> "}(this.module ? this.module.exports : this));"
|
<> "}(this.module ? this.module.exports : this));"
|
||||||
in GeneratedResult {_source = builder}
|
sourceMap = SourceMap.generate $ stateToMappings state
|
||||||
|
in GeneratedResult
|
||||||
|
{ _source = builder,
|
||||||
|
_sourceMap = sourceMap
|
||||||
|
}
|
||||||
|
|
||||||
addMain :: Mode.Mode -> Graph -> ModuleName.Canonical -> Opt.Main -> State -> State
|
addMain :: Mode.Mode -> Graph -> ModuleName.Canonical -> Opt.Main -> State -> State
|
||||||
addMain mode graph home _ state =
|
addMain mode graph home _ state =
|
||||||
@ -114,6 +121,10 @@ stateToBuilder :: State -> B.Builder
|
|||||||
stateToBuilder (State _ builder) =
|
stateToBuilder (State _ builder) =
|
||||||
JS._code builder
|
JS._code builder
|
||||||
|
|
||||||
|
stateToMappings :: State -> [JS.Mapping]
|
||||||
|
stateToMappings (State _ builder) =
|
||||||
|
JS._mappings builder
|
||||||
|
|
||||||
-- ADD DEPENDENCIES
|
-- ADD DEPENDENCIES
|
||||||
|
|
||||||
addGlobal :: Mode.Mode -> Graph -> State -> Opt.Global -> State
|
addGlobal :: Mode.Mode -> Graph -> State -> Opt.Global -> State
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
module Generate.JavaScript.Builder
|
module Generate.JavaScript.Builder
|
||||||
( Builder (..),
|
( Builder (..),
|
||||||
|
Mapping (..),
|
||||||
emptyBuilder,
|
emptyBuilder,
|
||||||
stmtToBuilder,
|
stmtToBuilder,
|
||||||
exprToBuilder,
|
exprToBuilder,
|
||||||
|
22
compiler/src/Generate/SourceMap.hs
Normal file
22
compiler/src/Generate/SourceMap.hs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
|
module Generate.SourceMap (SourceMap, generate, sandwhich, toBytes) where
|
||||||
|
|
||||||
|
import Data.ByteString.Builder qualified as B
|
||||||
|
import Generate.JavaScript.Builder qualified as JS
|
||||||
|
|
||||||
|
newtype SourceMap = SourceMap B.Builder
|
||||||
|
|
||||||
|
generate :: [JS.Mapping] -> SourceMap
|
||||||
|
generate _ = SourceMap $ B.char7 '\0'
|
||||||
|
|
||||||
|
sandwhich :: SourceMap -> B.Builder -> B.Builder
|
||||||
|
sandwhich (SourceMap mapBytes) sourceBytes =
|
||||||
|
sourceBytes
|
||||||
|
<> "\n"
|
||||||
|
<> "//# sourceMappingURL=data:application/json;base64,"
|
||||||
|
<> mapBytes
|
||||||
|
|
||||||
|
toBytes :: SourceMap -> B.Builder
|
||||||
|
toBytes (SourceMap bytes) =
|
||||||
|
bytes
|
@ -152,6 +152,7 @@ Common gren-common
|
|||||||
Generate.JavaScript.Functions
|
Generate.JavaScript.Functions
|
||||||
Generate.JavaScript.Name
|
Generate.JavaScript.Name
|
||||||
Generate.Mode
|
Generate.Mode
|
||||||
|
Generate.SourceMap
|
||||||
Nitpick.Debug
|
Nitpick.Debug
|
||||||
Nitpick.PatternMatches
|
Nitpick.PatternMatches
|
||||||
Optimize.Case
|
Optimize.Case
|
||||||
|
@ -20,7 +20,9 @@ import Directories qualified as Dirs
|
|||||||
import File qualified
|
import File qualified
|
||||||
import Generate qualified
|
import Generate qualified
|
||||||
import Generate.Html qualified as Html
|
import Generate.Html qualified as Html
|
||||||
|
import Generate.JavaScript qualified as JS
|
||||||
import Generate.Node qualified as Node
|
import Generate.Node qualified as Node
|
||||||
|
import Generate.SourceMap qualified as SourceMap
|
||||||
import Gren.Details qualified as Details
|
import Gren.Details qualified as Details
|
||||||
import Gren.ModuleName qualified as ModuleName
|
import Gren.ModuleName qualified as ModuleName
|
||||||
import Gren.Platform qualified as Platform
|
import Gren.Platform qualified as Platform
|
||||||
@ -64,7 +66,7 @@ run paths flags@(Flags _ _ maybeOutput report) =
|
|||||||
Reporting.attemptWithStyle style Exit.makeToReport $
|
Reporting.attemptWithStyle style Exit.makeToReport $
|
||||||
case maybeRoot of
|
case maybeRoot of
|
||||||
Just root -> runHelp root paths style flags
|
Just root -> runHelp root paths style flags
|
||||||
Nothing -> return $ Left $ Exit.MakeNoOutline
|
Nothing -> return $ Left Exit.MakeNoOutline
|
||||||
|
|
||||||
runHelp :: FilePath -> [FilePath] -> Reporting.Style -> Flags -> IO (Either Exit.Make ())
|
runHelp :: FilePath -> [FilePath] -> Reporting.Style -> Flags -> IO (Either Exit.Make ())
|
||||||
runHelp root paths style (Flags debug optimize maybeOutput _) =
|
runHelp root paths style (Flags debug optimize maybeOutput _) =
|
||||||
@ -100,47 +102,47 @@ runHelp root paths style (Flags debug optimize maybeOutput _) =
|
|||||||
return ()
|
return ()
|
||||||
(Platform.Browser, [name]) ->
|
(Platform.Browser, [name]) ->
|
||||||
do
|
do
|
||||||
builder <- toBuilder root details desiredMode artifacts
|
(JS.GeneratedResult source sourceMap) <- generate root details desiredMode artifacts
|
||||||
generate style "index.html" (Html.sandwich name builder) (NE.List name [])
|
writeToDisk style "index.html" (Html.sandwich name (SourceMap.sandwhich sourceMap source)) (NE.List name [])
|
||||||
(Platform.Node, [name]) ->
|
(Platform.Node, [name]) ->
|
||||||
do
|
do
|
||||||
builder <- toBuilder root details desiredMode artifacts
|
(JS.GeneratedResult source sourceMap) <- generate root details desiredMode artifacts
|
||||||
generate style "app" (Node.sandwich name builder) (NE.List name [])
|
writeToDisk style "app" (SourceMap.sandwhich sourceMap (Node.sandwich name source)) (NE.List name [])
|
||||||
(_, name : names) ->
|
(_, name : names) ->
|
||||||
do
|
do
|
||||||
builder <- toBuilder root details desiredMode artifacts
|
(JS.GeneratedResult source sourceMap) <- generate root details desiredMode artifacts
|
||||||
generate style "index.js" builder (NE.List name names)
|
writeToDisk style "index.js" (SourceMap.sandwhich sourceMap source) (NE.List name names)
|
||||||
Just DevStdOut ->
|
Just DevStdOut ->
|
||||||
case getMains artifacts of
|
case getMains artifacts of
|
||||||
[] ->
|
[] ->
|
||||||
return ()
|
return ()
|
||||||
_ ->
|
_ ->
|
||||||
do
|
do
|
||||||
builder <- toBuilder root details desiredMode artifacts
|
(JS.GeneratedResult source sourceMap) <- generate root details desiredMode artifacts
|
||||||
Task.io $ B.hPutBuilder IO.stdout builder
|
Task.io $ B.hPutBuilder IO.stdout (SourceMap.sandwhich sourceMap source)
|
||||||
Just DevNull ->
|
Just DevNull ->
|
||||||
return ()
|
return ()
|
||||||
Just (Exe target) ->
|
Just (Exe target) ->
|
||||||
case platform of
|
case platform of
|
||||||
Platform.Node -> do
|
Platform.Node -> do
|
||||||
name <- hasOneMain artifacts
|
name <- hasOneMain artifacts
|
||||||
builder <- toBuilder root details desiredMode artifacts
|
(JS.GeneratedResult source sourceMap) <- generate root details desiredMode artifacts
|
||||||
generate style target (Node.sandwich name builder) (NE.List name [])
|
writeToDisk style target (SourceMap.sandwhich sourceMap (Node.sandwich name source)) (NE.List name [])
|
||||||
_ -> do
|
_ -> do
|
||||||
Task.throw Exit.MakeExeOnlyForNodePlatform
|
Task.throw Exit.MakeExeOnlyForNodePlatform
|
||||||
Just (JS target) ->
|
Just (JS target) ->
|
||||||
case getNoMains artifacts of
|
case getNoMains artifacts of
|
||||||
[] -> do
|
[] -> do
|
||||||
builder <- toBuilder root details desiredMode artifacts
|
(JS.GeneratedResult source sourceMap) <- generate root details desiredMode artifacts
|
||||||
generate style target builder (Build.getRootNames artifacts)
|
writeToDisk style target (SourceMap.sandwhich sourceMap source) (Build.getRootNames artifacts)
|
||||||
name : names ->
|
name : names ->
|
||||||
Task.throw (Exit.MakeNonMainFilesIntoJavaScript name names)
|
Task.throw (Exit.MakeNonMainFilesIntoJavaScript name names)
|
||||||
Just (Html target) ->
|
Just (Html target) ->
|
||||||
case platform of
|
case platform of
|
||||||
Platform.Browser -> do
|
Platform.Browser -> do
|
||||||
name <- hasOneMain artifacts
|
name <- hasOneMain artifacts
|
||||||
builder <- toBuilder root details desiredMode artifacts
|
(JS.GeneratedResult source sourceMap) <- generate root details desiredMode artifacts
|
||||||
generate style target (Html.sandwich name builder) (NE.List name [])
|
writeToDisk style target (Html.sandwich name (SourceMap.sandwhich sourceMap source)) (NE.List name [])
|
||||||
_ -> do
|
_ -> do
|
||||||
Task.throw Exit.MakeHtmlOnlyForBrowserPlatform
|
Task.throw Exit.MakeHtmlOnlyForBrowserPlatform
|
||||||
|
|
||||||
@ -251,22 +253,22 @@ getNoMain modules root =
|
|||||||
Just _ -> Nothing
|
Just _ -> Nothing
|
||||||
Nothing -> Just name
|
Nothing -> Just name
|
||||||
|
|
||||||
-- GENERATE
|
-- WRITE TO DISK
|
||||||
|
|
||||||
generate :: Reporting.Style -> FilePath -> B.Builder -> NE.List ModuleName.Raw -> Task ()
|
writeToDisk :: Reporting.Style -> FilePath -> B.Builder -> NE.List ModuleName.Raw -> Task ()
|
||||||
generate style target builder names =
|
writeToDisk style target builder names =
|
||||||
Task.io $
|
Task.io $
|
||||||
do
|
do
|
||||||
Dir.createDirectoryIfMissing True (FP.takeDirectory target)
|
Dir.createDirectoryIfMissing True (FP.takeDirectory target)
|
||||||
File.writeBuilder target builder
|
File.writeBuilder target builder
|
||||||
Reporting.reportGenerate style names target
|
Reporting.reportGenerate style names target
|
||||||
|
|
||||||
-- TO BUILDER
|
-- GENERATE
|
||||||
|
|
||||||
data DesiredMode = Debug | Dev | Prod
|
data DesiredMode = Debug | Dev | Prod
|
||||||
|
|
||||||
toBuilder :: FilePath -> Details.Details -> DesiredMode -> Build.Artifacts -> Task B.Builder
|
generate :: FilePath -> Details.Details -> DesiredMode -> Build.Artifacts -> Task JS.GeneratedResult
|
||||||
toBuilder root details desiredMode artifacts =
|
generate root details desiredMode artifacts =
|
||||||
Task.mapError Exit.MakeBadGenerate $
|
Task.mapError Exit.MakeBadGenerate $
|
||||||
case desiredMode of
|
case desiredMode of
|
||||||
Debug -> Generate.debug root details artifacts
|
Debug -> Generate.debug root details artifacts
|
||||||
|
Loading…
Reference in New Issue
Block a user