language-typescript 0.0.2 → 0.0.3
raw patch · 4 files changed
+282/−8 lines, 4 filesdep +pretty
Dependencies added: pretty
Files
- language-typescript.cabal +5/−5
- src/Language/TypeScript.hs +3/−1
- src/Language/TypeScript/Pretty.hs +272/−0
- src/Language/TypeScript/Types.hs +2/−2
language-typescript.cabal view
@@ -1,5 +1,5 @@ name: language-typescript-version: 0.0.2+version: 0.0.3 cabal-version: >=1.4 build-type: Simple license: MIT@@ -15,11 +15,11 @@ data-dir: "" library- build-depends: base >= 3 && <= 5, containers -any, parsec -any- exposed-modules: Language.TypeScript Language.TypeScript.Parser- Language.TypeScript.Lexer Language.TypeScript.Types+ build-depends: base >=3 && <=5, containers -any, parsec -any, pretty -any+ exposed-modules: Language.TypeScript.Pretty Language.TypeScript+ Language.TypeScript.Parser Language.TypeScript.Lexer+ Language.TypeScript.Types exposed: True buildable: True hs-source-dirs: src- other-modules:
src/Language/TypeScript.hs view
@@ -15,9 +15,11 @@ module Language.TypeScript ( module Language.TypeScript.Types, module Language.TypeScript.Lexer,- module Language.TypeScript.Parser+ module Language.TypeScript.Parser,+ module Language.TypeScript.Pretty ) where import Language.TypeScript.Types import Language.TypeScript.Lexer import Language.TypeScript.Parser+import Language.TypeScript.Pretty
+ src/Language/TypeScript/Pretty.hs view
@@ -0,0 +1,272 @@+-----------------------------------------------------------------------------+--+-- Module : Language.TypeScript.Pretty+-- Copyright : (c) DICOM Grid Inc. 2013+-- License : MIT+--+-- Maintainer : Phillip Freeman <paf31@cantab.net>+-- Stability : experimental+-- Portability :+--+-- |+--+-----------------------------------------------------------------------------++module Language.TypeScript.Pretty (+ renderDeclarationSourceFile+) where++import Language.TypeScript.Types+import Text.PrettyPrint++renderDeclarationSourceFile :: [DeclarationElement] -> String+renderDeclarationSourceFile = render . declarationSourceFile++declarationSourceFile :: [DeclarationElement] -> Doc+declarationSourceFile = vcat . map declarationElement++exported :: Exported -> Doc+exported _ = text "export"++renderMaybe :: (a -> Doc) -> Maybe a -> Doc+renderMaybe f = maybe empty f++stringLiteral :: String -> Doc+stringLiteral = doubleQuotes . text++declarationElement :: DeclarationElement -> Doc+declarationElement (InterfaceDeclaration _ e i) =+ renderMaybe exported e+ <+> interface i+declarationElement (ImportDeclaration e name entityName) =+ renderMaybe exported e+ <+> text "import"+ <+> text name+ <+> char '='+ <+> renderEntityName entityName+declarationElement (ExportDeclaration name) =+ exported Exported+ <+> text "="+ <+> text name+declarationElement (ExternalImportDeclaration e name imp) =+ renderMaybe exported e+ <+> text "import"+ <+> text name+ <+> char '='+ <+> text "require"+ <+> stringLiteral imp+declarationElement (AmbientDeclaration _ e a) =+ renderMaybe exported e+ <+> text "declare"+ <+> renderAmbientDeclaration a++renderAmbientDeclaration :: Ambient -> Doc+renderAmbientDeclaration (AmbientVariableDeclaration _ name ty) =+ text "var"+ <+> text name+ <+> renderMaybe typeAnnotation ty+ <+> semi+renderAmbientDeclaration (AmbientFunctionDeclaration _ name plrt) =+ text "function"+ <+> text name+ <+> parameterListAndReturnType plrt+ <+> semi+renderAmbientDeclaration (AmbientClassDeclaration _ name ps exts imps els) =+ text "class"+ <+> text name+ <+> renderMaybe typeParameters ps+ <+> renderMaybe extendsClause exts+ <+> renderMaybe implementsClause imps+ <+> braces (sepEndBy semi (renderAmbientClassBodyElement . snd ) els)+renderAmbientDeclaration (AmbientInterfaceDeclaration i) = interface i+renderAmbientDeclaration (AmbientEnumDeclaration _ name members) =+ text "enum" <+> text name <+> braces (sepEndBy comma enumMember members)+ where+ enumMember (name, val) = text name <+> renderMaybe (\n -> char '=' <+> integer n) val+renderAmbientDeclaration (AmbientModuleDeclaration _ name ds) =+ text "module"+ <+> sepBy dot text name+ <+> braces (vcat (map renderAmbientDeclaration ds))+renderAmbientDeclaration (AmbientExternalModuleDeclaration _ name es) =+ text "module"+ <+> stringLiteral name+ <+> braces (vcat (map renderAmbientExternalModuleElement es))++renderAmbientExternalModuleElement :: AmbientExternalModuleElement -> Doc+renderAmbientExternalModuleElement (AmbientModuleElement a) = renderAmbientDeclaration a+renderAmbientExternalModuleElement (ExportAssignment name) =+ text "export"+ <+> char '='+ <+> text name+ <+> semi+renderAmbientExternalModuleElement (AmbientModuleExternalImportDeclaration e name imp) =+ renderMaybe exported e+ <+> text "import"+ <+> text name+ <+> char '='+ <+> text "require"+ <+> stringLiteral imp++renderAmbientClassBodyElement :: AmbientClassBodyElement -> Doc+renderAmbientClassBodyElement (AmbientConstructorDeclaration ps) =+ text "constructor"+ <+> parameterList ps+ <+> semi+renderAmbientClassBodyElement (AmbientMemberDeclaration p s prop (Left ty)) =+ renderMaybe publicOrPrivate p+ <+> renderMaybe static s+ <+> propertyName prop+ <+> renderMaybe typeAnnotation ty+renderAmbientClassBodyElement (AmbientMemberDeclaration p s prop (Right ps)) =+ renderMaybe publicOrPrivate p+ <+> renderMaybe static s+ <+> propertyName prop+ <+> parameterListAndReturnType ps+renderAmbientClassBodyElement (AmbientIndexSignature i) = renderIndexSignature i++renderIndexSignature :: IndexSignature -> Doc+renderIndexSignature (IndexSignature s sn ty) =+ text s+ <+> colon+ <+> stringOrNumber sn+ <+> typeAnnotation ty++dot :: Doc+dot = char '.'++sepEndBy :: Doc -> (a -> Doc) -> [a] -> Doc+sepEndBy s f as = hsep $ map (\e -> f e <+> s) as++renderEntityName :: EntityName -> Doc+renderEntityName (EntityName Nothing e) = text e+renderEntityName (EntityName (Just (ModuleName es)) e) = hcat (punctuate dot (map text es)) <> text e++interface :: Interface -> Doc+interface (Interface _ name ps exts ty) =+ text "interface"+ <+> text name+ <+> renderMaybe typeParameters ps+ <+> renderMaybe extendsClause exts+ <+> objectType ty++extendsClause :: [TypeRef] -> Doc+extendsClause rs = text "extends" <+> classOrInterfaceTypeList rs++implementsClause :: [TypeRef] -> Doc+implementsClause rs = text "implements" <+> classOrInterfaceTypeList rs++sepBy :: Doc -> (a -> Doc) -> [a] -> Doc+sepBy s f as = hsep $ punctuate s (map f as)++commaSep :: (a -> Doc) -> [a] -> Doc+commaSep = sepBy comma++classOrInterfaceTypeList :: [TypeRef] -> Doc+classOrInterfaceTypeList = commaSep typeRef++objectType :: TypeBody -> Doc+objectType = braces . typeBody++typeBody :: TypeBody -> Doc+typeBody (TypeBody ms) = hcat . map (\(_, m) -> typeMember m <+> semi) $ ms++typeMember :: TypeMember -> Doc+typeMember (MethodSignature name opt plrt) =+ propertyName name+ <+> renderMaybe optional opt+ <+> parameterListAndReturnType plrt+typeMember (PropertySignature name opt ty) =+ propertyName name+ <+> renderMaybe optional opt+ <+> renderMaybe typeAnnotation ty+typeMember (CallSignature plrt) = parameterListAndReturnType plrt+typeMember (ConstructSignature tyArgs pl ty) =+ text "new"+ <+> renderMaybe typeParameters tyArgs+ <+> parens (parameterList pl)+ <+> renderMaybe typeAnnotation ty+typeMember (TypeIndexSignature i) = renderIndexSignature i++propertyName :: String -> Doc+propertyName = text++typeAnnotation :: Type -> Doc+typeAnnotation t = colon <+> _type t++parameterListAndReturnType :: ParameterListAndReturnType -> Doc+parameterListAndReturnType (ParameterListAndReturnType ps pl ty) =+ renderMaybe typeParameters ps+ <+> parens (parameterList pl)+ <+> renderMaybe typeAnnotation ty++parameterList :: [Parameter] -> Doc+parameterList = commaSep parameter++optional :: Optional -> Doc+optional _ = char '?'++parameter :: Parameter -> Doc+parameter (RequiredOrOptionalParameter pop name opt ty) =+ renderMaybe publicOrPrivate pop+ <+> text name+ <+> renderMaybe optional opt+ <+> renderMaybe typeAnnotation ty+parameter (RestParameter name ty) =+ text "..."+ <+> text name+ <+> renderMaybe typeAnnotation ty++static :: Static -> Doc+static _ = text "static"++publicOrPrivate :: PublicOrPrivate -> Doc+publicOrPrivate Public = text "public"+publicOrPrivate Private = text "private"++stringOrNumber :: StringOrNumber -> Doc+stringOrNumber String = text "string"+stringOrNumber Number = text "number"++typeParameters :: [TypeParameter] -> Doc+typeParameters ps = char '<' <+> commaSep typeParameter ps <+> char '>'++typeParameter :: TypeParameter -> Doc+typeParameter (TypeParameter name ext) =+ text name+ <+> renderMaybe (\t -> text "extends" <+> _type t) ext++_type :: Type -> Doc+_type (ArrayType t) = _type t <+> text "[]"+_type (Predefined p) = predefinedType p+_type (TypeReference r) = typeRef r+_type (ObjectType o) = objectType o+_type (FunctionType ps pl ret) =+ renderMaybe typeParameters ps+ <+> parens (parameterList pl)+ <+> text "=>"+ <+> _type ret+_type (ConstructorType ps pl ret) =+ text "new"+ <+> renderMaybe typeParameters ps+ <+> parens (parameterList pl)+ <+> text "=>"+ <+> _type ret++typeRef :: TypeRef -> Doc+typeRef (TypeRef n as) =+ typeName n+ <+> renderMaybe typeArguments as++predefinedType :: PredefinedType -> Doc+predefinedType AnyType = text "any"+predefinedType NumberType = text "number"+predefinedType BooleanType = text "boolean"+predefinedType StringType = text "string"+predefinedType VoidType = text "void"++typeName :: TypeName -> Doc+typeName (TypeName Nothing t) = text t+typeName (TypeName (Just (ModuleName ts)) t) = sepBy dot text ts <+> text t++typeArguments :: [Type] -> Doc+typeArguments ts = char '<' <+> commaSep _type ts <+> char '>'
src/Language/TypeScript/Types.hs view
@@ -21,8 +21,8 @@ import Data.Data (Typeable, Data) data Comment = Comment- { text :: [String]- , other :: [(String, String)]+ { commentText :: [String]+ , commentOther :: [(String, String)] } deriving (Show, Data, Typeable) instance Monoid Comment where