Skip to content

Commit cba6878

Browse files
committed
Converter: Remove unnecessary parentheses from function applications
1 parent 7e41702 commit cba6878

File tree

2 files changed

+42
-27
lines changed

2 files changed

+42
-27
lines changed

src/Axel/AST.hs

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE DeriveDataTypeable #-}
12
{-# LANGUAGE DeriveFunctor #-}
23
{-# LANGUAGE DuplicateRecordFields #-}
34
{-# LANGUAGE FlexibleContexts #-}
@@ -45,6 +46,7 @@ import Control.Lens.TH (makeFieldsNoPrefix, makePrisms)
4546
import Control.Lens.Wrapped (_Wrapped)
4647
import Control.Monad ((>=>))
4748

49+
import Data.Data (Data)
4850
import Data.Semigroup ((<>))
4951

5052
class ToHaskell a where
@@ -58,15 +60,15 @@ data CaseBlock ann =
5860
, _expr :: Expression ann
5961
, _matches :: [(Expression ann, Expression ann)]
6062
}
61-
deriving (Eq, Functor, Show)
63+
deriving (Data, Eq, Functor, Show)
6264

6365
data FunctionApplication ann =
6466
FunctionApplication
6567
{ _ann :: ann
6668
, _function :: Expression ann
6769
, _arguments :: [Expression ann]
6870
}
69-
deriving (Eq, Functor, Show)
71+
deriving (Data, Eq, Functor, Show)
7072

7173
data IfBlock ann =
7274
IfBlock
@@ -75,35 +77,35 @@ data IfBlock ann =
7577
, _ifTrue :: Expression ann
7678
, _ifFalse :: Expression ann
7779
}
78-
deriving (Eq, Functor, Show)
80+
deriving (Data, Eq, Functor, Show)
7981

8082
data TopLevel ann =
8183
TopLevel
8284
{ _ann :: ann
8385
, _statements :: [Statement ann]
8486
}
85-
deriving (Eq, Functor, Show)
87+
deriving (Data, Eq, Functor, Show)
8688

8789
data TypeDefinition ann
8890
= ProperType ann Identifier
8991
| TypeConstructor ann (FunctionApplication ann)
90-
deriving (Eq, Functor, Show)
92+
deriving (Data, Eq, Functor, Show)
9193

9294
data DataDeclaration ann =
9395
DataDeclaration
9496
{ _ann :: ann
9597
, _typeDefinition :: TypeDefinition ann
9698
, _constructors :: [FunctionApplication ann]
9799
}
98-
deriving (Eq, Functor, Show)
100+
deriving (Data, Eq, Functor, Show)
99101

100102
data NewtypeDeclaration ann =
101103
NewtypeDeclaration
102104
{ _ann :: ann
103105
, _typeDefinition :: TypeDefinition ann
104106
, _constructor :: FunctionApplication ann
105107
}
106-
deriving (Eq, Functor, Show)
108+
deriving (Data, Eq, Functor, Show)
107109

108110
data FunctionDefinition ann =
109111
FunctionDefinition
@@ -113,55 +115,55 @@ data FunctionDefinition ann =
113115
, _body :: Expression ann
114116
, _whereBindings :: [FunctionDefinition ann]
115117
}
116-
deriving (Eq, Functor, Show)
118+
deriving (Data, Eq, Functor, Show)
117119

118120
data Import ann
119121
= ImportItem ann Identifier
120122
| ImportType ann Identifier [Identifier]
121-
deriving (Eq, Functor, Show)
123+
deriving (Data, Eq, Functor, Show)
122124

123125
data ImportSpecification ann
124126
= ImportAll ann
125127
| ImportOnly ann [Import ann]
126-
deriving (Eq, Functor, Show)
128+
deriving (Data, Eq, Functor, Show)
127129

128130
data Lambda ann =
129131
Lambda
130132
{ _ann :: ann
131133
, _arguments :: [Expression ann]
132134
, _body :: Expression ann
133135
}
134-
deriving (Eq, Functor, Show)
136+
deriving (Data, Eq, Functor, Show)
135137

136138
data LetBlock ann =
137139
LetBlock
138140
{ _ann :: ann
139141
, _bindings :: [(Expression ann, Expression ann)]
140142
, _body :: Expression ann
141143
}
142-
deriving (Eq, Functor, Show)
144+
deriving (Data, Eq, Functor, Show)
143145

144146
data MacroDefinition ann =
145147
MacroDefinition
146148
{ _ann :: ann
147149
, _functionDefinition :: FunctionDefinition ann
148150
}
149-
deriving (Eq, Functor, Show)
151+
deriving (Data, Eq, Functor, Show)
150152

151153
data MacroImport ann =
152154
MacroImport
153155
{ _ann :: ann
154156
, _moduleName :: Identifier
155157
, _imports :: [Identifier]
156158
}
157-
deriving (Eq, Functor, Show)
159+
deriving (Data, Eq, Functor, Show)
158160

159161
data Pragma ann =
160162
Pragma
161163
{ _ann :: ann
162164
, _pragmaSpecification :: String
163165
}
164-
deriving (Eq, Functor, Show)
166+
deriving (Data, Eq, Functor, Show)
165167

166168
data QualifiedImport ann =
167169
QualifiedImport
@@ -170,29 +172,29 @@ data QualifiedImport ann =
170172
, _alias :: Identifier
171173
, _imports :: ImportSpecification ann
172174
}
173-
deriving (Eq, Functor, Show)
175+
deriving (Data, Eq, Functor, Show)
174176

175177
data RecordDefinition ann =
176178
RecordDefinition
177179
{ _ann :: ann
178180
, _bindings :: [(Identifier, Expression ann)]
179181
}
180-
deriving (Eq, Functor, Show)
182+
deriving (Data, Eq, Functor, Show)
181183

182184
data RecordType ann =
183185
RecordType
184186
{ _ann :: ann
185187
, _fields :: [(Identifier, Expression ann)]
186188
}
187-
deriving (Eq, Functor, Show)
189+
deriving (Data, Eq, Functor, Show)
188190

189191
data RestrictedImport ann =
190192
RestrictedImport
191193
{ _ann :: ann
192194
, _moduleName :: Identifier
193195
, _imports :: ImportSpecification ann
194196
}
195-
deriving (Eq, Functor, Show)
197+
deriving (Data, Eq, Functor, Show)
196198

197199
data TypeclassDefinition ann =
198200
TypeclassDefinition
@@ -201,31 +203,31 @@ data TypeclassDefinition ann =
201203
, _constraints :: [Expression ann]
202204
, _signatures :: [TypeSignature ann]
203205
}
204-
deriving (Eq, Functor, Show)
206+
deriving (Data, Eq, Functor, Show)
205207

206208
data TypeclassInstance ann =
207209
TypeclassInstance
208210
{ _ann :: ann
209211
, _instanceName :: Expression ann
210212
, _definitions :: [FunctionDefinition ann]
211213
}
212-
deriving (Eq, Functor, Show)
214+
deriving (Data, Eq, Functor, Show)
213215

214216
data TypeSignature ann =
215217
TypeSignature
216218
{ _ann :: ann
217219
, _name :: Identifier
218220
, _typeDefinition :: Expression ann
219221
}
220-
deriving (Eq, Functor, Show)
222+
deriving (Data, Eq, Functor, Show)
221223

222224
data TypeSynonym ann =
223225
TypeSynonym
224226
{ _ann :: ann
225227
, _alias :: Expression ann
226228
, _definition :: Expression ann
227229
}
228-
deriving (Eq, Functor, Show)
230+
deriving (Data, Eq, Functor, Show)
229231

230232
data Expression ann
231233
= ECaseBlock (CaseBlock ann)
@@ -239,13 +241,13 @@ data Expression ann
239241
| ERawExpression ann String
240242
| ERecordDefinition (RecordDefinition ann)
241243
| ERecordType (RecordType ann)
242-
deriving (Eq, Functor, Show)
244+
deriving (Data, Eq, Functor, Show)
243245

244246
data Literal ann
245247
= LChar ann Char
246248
| LInt ann Int
247249
| LString ann String
248-
deriving (Eq, Functor, Show)
250+
deriving (Data, Eq, Functor, Show)
249251

250252
data Statement ann
251253
= STopLevel (TopLevel ann)
@@ -264,7 +266,7 @@ data Statement ann
264266
| STypeSignature (TypeSignature ann)
265267
| STypeSynonym (TypeSynonym ann)
266268
| SUnrestrictedImport ann Identifier
267-
deriving (Eq, Functor, Show)
269+
deriving (Data, Eq, Functor, Show)
268270

269271
type Program ann = [Statement ann]
270272

src/Axel/Haskell/Convert.hs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ import Control.Category ((>>>))
2929
import Control.Lens.Extras (is)
3030
import Control.Lens.Operators ((%~), (^.))
3131

32+
import Data.Data.Lens (biplate, uniplate)
33+
3234
import qualified Polysemy as Sem
3335
import qualified Polysemy.Error as Sem
3436

@@ -585,10 +587,21 @@ convertFile path newPath = do
585587
HSE.ParseFailed _ err -> Sem.throw $ ConvertError path err)
586588
putStrLn $ "Writing " <> newPath <> "..."
587589
let newContents =
588-
unlines $ map toAxel $ groupFunctionDefinitions $ toStmts parsedModule
590+
unlines $
591+
map toAxel $
592+
groupFunctionDefinitions $
593+
flattenFunctionApplications $ toStmts parsedModule
589594
FS.writeFile newPath newContents
590595
pure newPath
591596

597+
flattenFunctionApplications :: [AST.SMStatement] -> [AST.SMStatement]
598+
flattenFunctionApplications = map (biplate %~ (uniplate %~ handleExpr))
599+
where
600+
handleExpr :: AST.SMExpression -> AST.SMExpression
601+
handleExpr (AST.EFunctionApplication (AST.FunctionApplication ann (AST.EFunctionApplication (AST.FunctionApplication _ fn args)) args')) =
602+
AST.EFunctionApplication $ AST.FunctionApplication ann fn (args <> args')
603+
handleExpr x = x
604+
592605
groupFunctionDefinitions :: [AST.SMStatement] -> [SM.Expression]
593606
groupFunctionDefinitions =
594607
let findFnName (AST.SFunctionDefinition fnDef) = Just $ fnDef ^. AST.name

0 commit comments

Comments
 (0)