aboutsummaryrefslogtreecommitdiffstats
path: root/style-generator/src/Writer.elm
diff options
context:
space:
mode:
Diffstat (limited to 'style-generator/src/Writer.elm')
-rw-r--r--style-generator/src/Writer.elm640
1 files changed, 0 insertions, 640 deletions
diff --git a/style-generator/src/Writer.elm b/style-generator/src/Writer.elm
deleted file mode 100644
index ad9f3fd..0000000
--- a/style-generator/src/Writer.elm
+++ /dev/null
@@ -1,640 +0,0 @@
-module Writer exposing (write, writeDeclaration, writeExpression, writeFile, writePattern, writeTypeAnnotation)
-
-{-| Copied and tweaked from Elm Syntax.
-
-
-# Elm.Writer
-
-Write a file to a string.
-@docs write, writeFile, writePattern, writeExpression, writeTypeAnnotation, writeDeclaration
-
--}
-
-import Elm.Syntax.Declaration exposing (..)
-import Elm.Syntax.Documentation exposing (..)
-import Elm.Syntax.Exposing as Exposing exposing (..)
-import Elm.Syntax.Expression exposing (..)
-import Elm.Syntax.File exposing (..)
-import Elm.Syntax.Import exposing (Import)
-import Elm.Syntax.Infix exposing (..)
-import Elm.Syntax.Module exposing (..)
-import Elm.Syntax.ModuleName exposing (..)
-import Elm.Syntax.Node as Node exposing (Node(..))
-import Elm.Syntax.Pattern exposing (..)
-import Elm.Syntax.Range exposing (Range)
-import Elm.Syntax.Signature exposing (Signature)
-import Elm.Syntax.Type exposing (..)
-import Elm.Syntax.TypeAlias exposing (..)
-import Elm.Syntax.TypeAnnotation exposing (..)
-import List.Extra as List
-import StructuredWriter as Writer exposing (..)
-
-
-{-| Transform a writer to a string
--}
-write : Writer -> String
-write =
- Writer.write
-
-
-{-| Write a file
--}
-writeFile : File -> Writer
-writeFile file =
- breaked
- [ writeModule <| Node.value file.moduleDefinition
- , breaked (List.map (Node.value >> writeImport) file.imports)
- , breaked (List.map writeDeclaration file.declarations)
- ]
-
-
-writeModule : Module -> Writer
-writeModule m =
- case m of
- NormalModule defaultModuleData ->
- writeDefaultModuleData defaultModuleData
-
- PortModule defaultModuleData ->
- spaced
- [ string "port"
- , writeDefaultModuleData defaultModuleData
- ]
-
- EffectModule effectModuleData ->
- writeEffectModuleData effectModuleData
-
-
-writeDefaultModuleData : DefaultModuleData -> Writer
-writeDefaultModuleData { moduleName, exposingList } =
- spaced
- [ string "module"
- , writeModuleName <| Node.value moduleName
- , writeExposureExpose <| Node.value exposingList
- ]
-
-
-writeEffectModuleData : EffectModuleData -> Writer
-writeEffectModuleData { moduleName, exposingList, command, subscription } =
- spaced
- [ string "effect"
- , string "module"
- , writeModuleName <| Node.value moduleName
- , writeWhere ( command, subscription )
- , writeExposureExpose <| Node.value exposingList
- ]
-
-
-writeWhere : ( Maybe (Node String), Maybe (Node String) ) -> Writer
-writeWhere input =
- case input of
- ( Nothing, Nothing ) ->
- epsilon
-
- ( Just x, Nothing ) ->
- spaced
- [ string "where { command ="
- , string <| Node.value x
- , string "}"
- ]
-
- ( Nothing, Just x ) ->
- spaced
- [ string "where { subscription ="
- , string <| Node.value x
- , string "}"
- ]
-
- ( Just x, Just y ) ->
- spaced
- [ string "where { command ="
- , string <| Node.value x
- , string ", subscription ="
- , string <| Node.value y
- , string "}"
- ]
-
-
-writeModuleName : ModuleName -> Writer
-writeModuleName moduleName =
- string (String.join "." moduleName)
-
-
-writeExposureExpose : Exposing -> Writer
-writeExposureExpose x =
- case x of
- All _ ->
- string "exposing (..)"
-
- Explicit exposeList ->
- let
- diffLines =
- List.map Node.range exposeList
- |> startOnDifferentLines
- in
- spaced
- [ string "exposing"
- , parensComma diffLines (List.map writeExpose exposeList)
- ]
-
-
-writeExpose : Node TopLevelExpose -> Writer
-writeExpose (Node _ exp) =
- case exp of
- InfixExpose x ->
- string ("(" ++ x ++ ")")
-
- FunctionExpose f ->
- string f
-
- TypeOrAliasExpose t ->
- string t
-
- TypeExpose { name, open } ->
- case open of
- Just _ ->
- spaced
- [ string name
- , string "(..)"
- ]
-
- Nothing ->
- string name
-
-
-startOnDifferentLines : List Range -> Bool
-startOnDifferentLines xs =
- List.length (List.unique (List.map (.start >> .row) xs)) > 1
-
-
-writeImport : Import -> Writer
-writeImport { moduleName, moduleAlias, exposingList } =
- spaced
- [ string "import"
- , writeModuleName <| Node.value moduleName
- , maybe (Maybe.map (Node.value >> writeModuleName >> (\x -> spaced [ string "as", x ])) moduleAlias)
- , maybe (Maybe.map writeExposureExpose exposingList)
- ]
-
-
-writeLetDeclaration : Node LetDeclaration -> Writer
-writeLetDeclaration (Node _ letDeclaration) =
- case letDeclaration of
- LetFunction function ->
- writeFunction function
-
- LetDestructuring pattern expression ->
- writeDestructuring pattern expression
-
-
-{-| Write a declaration
--}
-writeDeclaration : Node Declaration -> Writer
-writeDeclaration (Node _ decl) =
- case decl of
- FunctionDeclaration function ->
- writeFunction function
-
- AliasDeclaration typeAlias ->
- writeTypeAlias typeAlias
-
- CustomTypeDeclaration type_ ->
- writeType type_
-
- PortDeclaration p ->
- writePortDeclaration p
-
- InfixDeclaration i ->
- writeInfix i
-
- Destructuring pattern expression ->
- writeDestructuring pattern expression
-
-
-writeFunction : Function -> Writer
-writeFunction { documentation, signature, declaration } =
- breaked
- [ maybe (Maybe.map writeDocumentation documentation)
- , maybe (Maybe.map (Node.value >> writeSignature) signature)
- , writeFunctionImplementation <| Node.value declaration
- ]
-
-
-writeFunctionImplementation : FunctionImplementation -> Writer
-writeFunctionImplementation declaration =
- breaked
- [ spaced
- [ string <| Node.value declaration.name
- , spaced (List.map writePattern declaration.arguments)
- , string "="
- ]
- , indent 4 (writeExpression declaration.expression)
- ]
-
-
-writeSignature : Signature -> Writer
-writeSignature signature =
- spaced
- [ string <| Node.value signature.name
- , string ":"
- , writeTypeAnnotation signature.typeAnnotation
- ]
-
-
-writeDocumentation : Node Documentation -> Writer
-writeDocumentation =
- Node.value >> string
-
-
-writeTypeAlias : TypeAlias -> Writer
-writeTypeAlias typeAlias =
- breaked
- [ spaced
- [ string "type alias"
- , string <| Node.value typeAlias.name
- , spaced (List.map (Node.value >> string) typeAlias.generics)
- , string "="
- ]
- , indent 4 (writeTypeAnnotation typeAlias.typeAnnotation)
- ]
-
-
-writeType : Type -> Writer
-writeType type_ =
- breaked
- [ spaced
- [ string "type"
- , string <| Node.value type_.name
- , spaced (List.map (Node.value >> string) type_.generics)
- ]
- , let
- diffLines =
- List.map Node.range type_.constructors
- |> startOnDifferentLines
- in
- sepBy ( "=", "|", "" )
- diffLines
- (List.map (Node.value >> writeValueConstructor) type_.constructors)
- ]
-
-
-writeValueConstructor : ValueConstructor -> Writer
-writeValueConstructor { name, arguments } =
- spaced
- [ string <| Node.value name
- , spaced (List.map writeTypeAnnotation arguments)
- ]
-
-
-writePortDeclaration : Signature -> Writer
-writePortDeclaration signature =
- spaced [ string "port", writeSignature signature ]
-
-
-writeInfix : Infix -> Writer
-writeInfix { direction, precedence, operator, function } =
- spaced
- [ string "infix"
- , case Node.value direction of
- Left ->
- string "left"
-
- Right ->
- string "right"
-
- Non ->
- string "non"
- , string (String.fromInt (Node.value precedence))
- , string (Node.value operator)
- , string "="
- , string (Node.value function)
- ]
-
-
-writeDestructuring : Node Pattern -> Node Expression -> Writer
-writeDestructuring pattern expression =
- breaked
- [ spaced [ writePattern pattern, string "=" ]
- , indent 4 (writeExpression expression)
- ]
-
-
-{-| Write a type annotation
--}
-writeTypeAnnotation : Node TypeAnnotation -> Writer
-writeTypeAnnotation (Node _ typeAnnotation) =
- case typeAnnotation of
- GenericType s ->
- string s
-
- Typed moduleNameAndName args ->
- let
- moduleName =
- Node.value moduleNameAndName |> Tuple.first
-
- k =
- Node.value moduleNameAndName |> Tuple.second
- in
- spaced
- ((string <| String.join "." (moduleName ++ [ k ]))
- :: List.map (writeTypeAnnotation >> parensIfContainsSpaces) args
- )
-
- Unit ->
- string "()"
-
- Tupled xs ->
- parensComma False (List.map writeTypeAnnotation xs)
-
- Record xs ->
- bracesComma False (List.map writeRecordField xs)
-
- GenericRecord name fields ->
- spaced
- [ string "{"
- , string <| Node.value name
- , string "|"
- , sepByComma False (List.map writeRecordField <| Node.value fields)
- , string "}"
- ]
-
- FunctionTypeAnnotation left right ->
- let
- addParensForSubTypeAnnotation type_ =
- case type_ of
- Node _ (FunctionTypeAnnotation _ _) ->
- join [ string "(", writeTypeAnnotation type_, string ")" ]
-
- _ ->
- writeTypeAnnotation type_
- in
- spaced
- [ addParensForSubTypeAnnotation left
- , string "->"
- , addParensForSubTypeAnnotation right
- ]
-
-
-writeRecordField : Node RecordField -> Writer
-writeRecordField (Node _ ( name, ref )) =
- spaced
- [ string <| Node.value name
- , string ":"
- , writeTypeAnnotation ref
- ]
-
-
-{-| Writer an expression
--}
-writeExpression : Node Expression -> Writer
-writeExpression (Node range inner) =
- let
- recurRangeHelper (Node x y) =
- ( x, writeExpression (Node x y) )
-
- writeRecordSetter : RecordSetter -> ( Range, Writer )
- writeRecordSetter ( name, expr ) =
- ( Node.range expr
- , spaced [ string <| Node.value name, string "=", writeExpression expr ]
- )
-
- sepHelper : (Bool -> List Writer -> Writer) -> List ( Range, Writer ) -> Writer
- sepHelper f l =
- let
- diffLines =
- List.map Tuple.first l
- |> startOnDifferentLines
- in
- f diffLines (List.map Tuple.second l)
-
- fakeSepHelper : (Bool -> List Writer -> Writer) -> List ( Range, Writer ) -> Writer
- fakeSepHelper f l =
- f True (List.map Tuple.second l)
- in
- case inner of
- UnitExpr ->
- string "()"
-
- Application xs ->
- case xs of
- [] ->
- epsilon
-
- [ x ] ->
- writeExpression x
-
- x :: rest ->
- spaced
- [ writeExpression x
- , sepHelper sepBySpace (List.map recurRangeHelper rest)
- ]
-
- OperatorApplication x dir left right ->
- case dir of
- Left ->
- sepHelper sepBySpace
- [ ( Node.range left, writeExpression left )
- , ( range, spaced [ string x, writeExpression right ] )
- ]
-
- Right ->
- sepHelper sepBySpace
- [ ( Node.range left, spaced [ writeExpression left, string x ] )
- , ( Node.range right, writeExpression right )
- ]
-
- Non ->
- sepHelper sepBySpace
- [ ( Node.range left, spaced [ writeExpression left, string x ] )
- , ( Node.range right, writeExpression right )
- ]
-
- FunctionOrValue moduleName name ->
- case moduleName of
- [] ->
- string name
-
- _ ->
- join
- [ writeModuleName <| moduleName
- , string "."
- , string <| name
- ]
-
- IfBlock condition thenCase elseCase ->
- breaked
- [ spaced [ string "if", writeExpression condition, string "then" ]
- , indent 2 (writeExpression thenCase)
- , string "else"
- , indent 2 (writeExpression elseCase)
- ]
-
- PrefixOperator x ->
- string ("(" ++ x ++ ")")
-
- Operator x ->
- string x
-
- Hex h ->
- string "TODO"
-
- Integer i ->
- string (String.fromInt i)
-
- Floatable f ->
- string (String.fromFloat f)
-
- Negation x ->
- append (string "-") (writeExpression x)
-
- Literal s ->
- string ("\"" ++ s ++ "\"")
-
- CharLiteral c ->
- string ("'" ++ String.fromList [ c ] ++ "'")
-
- TupledExpression t ->
- sepHelper sepByComma (List.map recurRangeHelper t)
-
- ParenthesizedExpression x ->
- join [ string "(", writeExpression x, string ")" ]
-
- LetExpression letBlock ->
- breaked
- [ string "let"
- , indent 2 (breaked (List.map writeLetDeclaration letBlock.declarations))
- , string "in"
- , indent 2 (writeExpression letBlock.expression)
- ]
-
- CaseExpression caseBlock ->
- let
- writeCaseBranch ( pattern, expression ) =
- indent 2 <|
- breaked
- [ spaced [ writePattern pattern, string "->" ]
- , indent 2 (writeExpression expression)
- ]
- in
- breaked
- [ spaced [ string "case", writeExpression caseBlock.expression, string "of" ]
- , breaked (List.map writeCaseBranch caseBlock.cases)
- ]
-
- LambdaExpression lambda ->
- spaced
- [ join
- [ string "\\"
- , spaced (List.map writePattern lambda.args)
- ]
- , string "->"
- , writeExpression lambda.expression
- ]
-
- RecordExpr setters ->
- --sepHelper bracesComma (List.map (Node.value >> writeRecordSetter) setters)
- bracesComma True (List.map (Node.value >> (\( name, expr ) -> spaced [ string <| Node.value name, string "=", writeExpression expr ])) setters)
-
- ListExpr xs ->
- fakeSepHelper bracketsComma (List.map recurRangeHelper xs)
-
- RecordAccess expression accessor ->
- join [ writeExpression expression, string ".", string <| Node.value accessor ]
-
- RecordAccessFunction s ->
- join [ string ".", string s ]
-
- RecordUpdateExpression name updates ->
- spaced
- [ string "{"
- , string <| Node.value name
- , string "|"
- , sepHelper sepByComma (List.map (Node.value >> writeRecordSetter) updates)
- , string "}"
- ]
-
- GLSLExpression s ->
- join
- [ string "[glsl|"
- , string s
- , string "|]"
- ]
-
-
-{-| Write a pattern
--}
-writePattern : Node Pattern -> Writer
-writePattern (Node _ p) =
- case p of
- AllPattern ->
- string "_"
-
- UnitPattern ->
- string "()"
-
- CharPattern c ->
- string ("'" ++ String.fromList [ c ] ++ "'")
-
- StringPattern s ->
- string s
-
- HexPattern h ->
- string "TODO"
-
- IntPattern i ->
- string (String.fromInt i)
-
- FloatPattern f ->
- string (String.fromFloat f)
-
- TuplePattern inner ->
- parensComma False (List.map writePattern inner)
-
- RecordPattern inner ->
- bracesComma False (List.map (Node.value >> string) inner)
-
- UnConsPattern left right ->
- spaced [ writePattern left, string "::", writePattern right ]
-
- ListPattern inner ->
- bracketsComma False (List.map writePattern inner)
-
- VarPattern var ->
- string var
-
- NamedPattern qnr others ->
- spaced
- [ writeQualifiedNameRef qnr
- , spaced (List.map writePattern others)
- ]
-
- AsPattern innerPattern asName ->
- spaced [ writePattern innerPattern, string "as", string <| Node.value asName ]
-
- ParenthesizedPattern innerPattern ->
- spaced [ string "(", writePattern innerPattern, string ")" ]
-
-
-writeQualifiedNameRef : QualifiedNameRef -> Writer
-writeQualifiedNameRef { moduleName, name } =
- case moduleName of
- [] ->
- string name
-
- _ ->
- join
- [ writeModuleName moduleName
- , string "."
- , string name
- ]
-
-
-
--- Helpers
-
-
-parensIfContainsSpaces : Writer -> Writer
-parensIfContainsSpaces w =
- if Writer.write w |> String.contains " " then
- join [ string "(", w, string ")" ]
- else
- w