Skip to content
This repository was archived by the owner on Apr 1, 2025. It is now read-only.

Commit 147604e

Browse files
committed
Streamline manually language parsing
1 parent 0aab5eb commit 147604e

File tree

3 files changed

+56
-78
lines changed

3 files changed

+56
-78
lines changed

src/Data/Language.hs

Lines changed: 39 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
{-# LANGUAGE DeriveAnyClass, DeriveGeneric, KindSignatures #-}
1+
{-# LANGUAGE DeriveAnyClass, DeriveGeneric, KindSignatures, LambdaCase #-}
22
module Data.Language
33
( Language (..)
44
, SLanguage (..)
55
, extensionsForLanguage
6-
, parseLanguage
76
, knownLanguage
87
, languageForFilePath
98
, pathIsMinified
109
, supportedExts
1110
, codeNavLanguages
11+
, textToLanguage
12+
, languageToText
1213
) where
1314

1415
import Data.Aeson
@@ -78,67 +79,61 @@ instance SLanguage 'PHP where
7879

7980
instance FromJSON Language where
8081
parseJSON = withText "Language" $ \l ->
81-
pure $ fromMaybe Unknown (parseLanguage l)
82-
83-
parseLanguage :: Text -> Maybe Language
84-
parseLanguage l = case T.toLower l of
85-
"go" -> Just Go
86-
"haskell" -> Just Haskell
87-
"java" -> Just Java
88-
"javascript" -> Just JavaScript
89-
"json" -> Just JSON
90-
"jsx" -> Just JSX
91-
"markdown" -> Just Markdown
92-
"python" -> Just Python
93-
"ruby" -> Just Ruby
94-
"typescript" -> Just TypeScript
95-
"php" -> Just PHP
96-
_ -> Nothing
82+
pure $ textToLanguage l
9783

9884
-- | Predicate failing on 'Unknown' and passing in all other cases.
9985
knownLanguage :: Language -> Bool
10086
knownLanguage = (/= Unknown)
10187

10288
extensionsForLanguage :: Language -> [String]
103-
extensionsForLanguage language = case language of
104-
Go -> [".go"]
105-
Haskell -> [".hs"]
106-
JavaScript -> [".js", ".mjs"]
107-
PHP -> [".php", ".phpt"]
108-
Python -> [".py"]
109-
Ruby -> [".rb"]
110-
TypeScript -> [".ts"]
111-
TSX -> [".tsx", ".d.tsx"]
112-
JSX -> [".jsx"]
113-
_ -> []
89+
extensionsForLanguage language = T.unpack <$> maybe mempty Lingo.languageExtensions (Map.lookup (languageToText language) Lingo.languages)
11490

11591
-- | Return a language based on a FilePath's extension.
11692
languageForFilePath :: FilePath -> Language
117-
languageForFilePath path = case Lingo.languageName <$> Lingo.languageForPath path of
118-
Just "Go" -> Go
119-
Just "Haskell" -> Haskell
120-
Just "Java" -> Java
121-
Just "JavaScript" -> JavaScript
122-
Just "JSON" -> JSON
123-
Just "JSX" -> JSX
124-
Just "Markdown" -> Markdown
125-
Just "PHP" -> PHP
126-
Just "Python" -> Python
127-
Just "Ruby" -> Ruby
128-
Just "TSX" -> TSX
129-
Just "TypeScript" -> TypeScript
130-
_ -> Unknown
93+
languageForFilePath path = maybe Unknown (textToLanguage . Lingo.languageName) (Lingo.languageForPath path)
13194

13295
supportedExts :: [String]
13396
supportedExts = foldr append mempty supportedLanguages
13497
where
13598
append (Just l) b = fmap T.unpack (Lingo.languageExtensions l) <> b
13699
append Nothing b = b
137-
supportedLanguages = fmap lookup ["Go", "Ruby", "Python", "JavaScript", "TypeScript", "PHP"]
100+
supportedLanguages = fmap lookup (languageToText <$> codeNavLanguages)
138101
lookup k = Map.lookup k Lingo.languages
139102

140103
codeNavLanguages :: [Language]
141104
codeNavLanguages = [Go, Ruby, Python, JavaScript, TypeScript, PHP]
142105

143106
pathIsMinified :: FilePath -> Bool
144107
pathIsMinified = isExtensionOf ".min.js"
108+
109+
languageToText :: Language -> T.Text
110+
languageToText = \case
111+
Unknown -> "Unknown"
112+
Go -> "Go"
113+
Haskell -> "Haskell"
114+
Java -> "Java"
115+
JavaScript -> "JavaScript"
116+
JSON -> "JSON"
117+
JSX -> "JSX"
118+
Markdown -> "Markdown"
119+
Python -> "Python"
120+
Ruby -> "Ruby"
121+
TypeScript -> "TypeScript"
122+
TSX -> "TSX"
123+
PHP -> "PHP"
124+
125+
textToLanguage :: T.Text -> Language
126+
textToLanguage = \case
127+
"Go" -> Go
128+
"Haskell" -> Haskell
129+
"Java" -> Java
130+
"JavaScript" -> JavaScript
131+
"JSON" -> JSON
132+
"JSX" -> JSX
133+
"Markdown" -> Markdown
134+
"Python" -> Python
135+
"Ruby" -> Ruby
136+
"TypeScript" -> TypeScript
137+
"TSX" -> TSX
138+
"PHP" -> PHP
139+
_ -> Unknown

src/Semantic/Api/Bridge.hs

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -64,38 +64,7 @@ instance APIConvert Legacy.Span Data.Span where
6464
fromAPI Legacy.Span {..} = Data.Span <$> (start >>= preview bridging) <*> (end >>= preview bridging)
6565

6666
instance APIBridge T.Text Data.Language where
67-
bridging = iso apiLanguageToLanguage languageToApiLanguage where
68-
languageToApiLanguage :: Data.Language -> T.Text
69-
languageToApiLanguage = \case
70-
Data.Unknown -> "Unknown"
71-
Data.Go -> "Go"
72-
Data.Haskell -> "Haskell"
73-
Data.Java -> "Java"
74-
Data.JavaScript -> "JavaScript"
75-
Data.JSON -> "JSON"
76-
Data.JSX -> "JSX"
77-
Data.Markdown -> "Markdown"
78-
Data.Python -> "Python"
79-
Data.Ruby -> "Ruby"
80-
Data.TypeScript -> "TypeScript"
81-
Data.TSX -> "TSX"
82-
Data.PHP -> "PHP"
83-
84-
apiLanguageToLanguage :: T.Text -> Data.Language
85-
apiLanguageToLanguage = \case
86-
"Go" -> Data.Go
87-
"Haskell" -> Data.Haskell
88-
"Java" -> Data.Java
89-
"JavaScript" -> Data.JavaScript
90-
"JSON" -> Data.JSON
91-
"JSX" -> Data.JSX
92-
"Markdown" -> Data.Markdown
93-
"Python" -> Data.Python
94-
"Ruby" -> Data.Ruby
95-
"TypeScript" -> Data.TypeScript
96-
"TSX" -> Data.TSX
97-
"PHP" -> Data.PHP
98-
_ -> Data.Unknown
67+
bridging = iso Data.textToLanguage Data.languageToText
9968

10069
instance APIBridge API.Blob Data.Blob where
10170
bridging = iso apiBlobToBlob blobToApiBlob where

src/Semantic/CLI.hs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import Control.Exception as Exc (displayException)
55
import Data.Blob
66
import Data.Blob.IO
77
import Data.Handle
8-
import Data.Language (languageForFilePath, parseLanguage)
8+
import qualified Data.Language as Language
99
import Data.List (intercalate, uncons)
1010
import Data.List.Split (splitWhen)
1111
import Data.Project
@@ -180,8 +180,22 @@ filePathReader = eitherReader parseFilePath
180180
parseFilePath arg = case splitWhen (== ':') arg of
181181
[a, b] | Just lang <- parseLanguage (T.pack b) -> Right (File a lang)
182182
| Just lang <- parseLanguage (T.pack a) -> Right (File b lang)
183-
[path] -> Right (File path (languageForFilePath path))
183+
[path] -> Right (File path (Language.languageForFilePath path))
184184
_ -> Left ("cannot parse `" <> arg <> "`\nexpecting FILE:LANGUAGE or just FILE")
185+
parseLanguage :: Text -> Maybe Language.Language
186+
parseLanguage l = case T.toLower l of
187+
"go" -> Just Language.Go
188+
"haskell" -> Just Language.Haskell
189+
"java" -> Just Language.Java
190+
"javascript" -> Just Language.JavaScript
191+
"json" -> Just Language.JSON
192+
"jsx" -> Just Language.JSX
193+
"markdown" -> Just Language.Markdown
194+
"python" -> Just Language.Python
195+
"ruby" -> Just Language.Ruby
196+
"typescript" -> Just Language.TypeScript
197+
"php" -> Just Language.PHP
198+
_ -> Nothing
185199

186200
options :: Eq a => [(String, a)] -> Mod OptionFields a -> Parser a
187201
options options fields = option (optionsReader options) (fields <> showDefaultWith (findOption options) <> metavar (intercalate "|" (fmap fst options)))

0 commit comments

Comments
 (0)