@@ -770,7 +770,7 @@ parseFreeUnsafe t = case parseProgram t initCompilerFlags{needsMain = False} of
770770 replacePositionWithAnyPosition (Cast a b _) = Cast (replacePositionWithAnyPosition a) (replacePositionWithAnyPosition b) anyPosition
771771 replacePositionWithAnyPosition (TypeLit type' _) = TypeLit type' anyPosition
772772 replacePositionWithAnyPosition (Flexible a _) = Flexible (replacePositionWithAnyPosition a) anyPosition
773- replacePositionWithAnyPosition (Trait name methods g _) = Trait name (map replacePositionWithAnyPosition methods) g anyPosition
773+ replacePositionWithAnyPosition (Trait name methods g reqProps ref refSrc _) = Trait name (map replacePositionWithAnyPosition methods) g reqProps ( fmap replacePositionWithAnyPosition ref) refSrc anyPosition
774774 replacePositionWithAnyPosition (Impl traitName traitTypeArgs f m _) = Impl traitName traitTypeArgs f (map replacePositionWithAnyPosition m) anyPosition
775775 replacePositionWithAnyPosition (StrictEval a _) = StrictEval (replacePositionWithAnyPosition a) anyPosition
776776 replacePositionWithAnyPosition (External n a _) = External n (map replacePositionWithAnyPosition a) anyPosition
@@ -867,18 +867,57 @@ trait = do
867867 keyword " trait"
868868 name <- identifier <?> " trait name"
869869 generics <- fromMaybe [] <$> optional generic <?> " trait generics"
870- methods <-
871- ( do
870+ hasEquals <- lookAhead (optional (try (symbol " =" )))
871+ (requiredProperties, refinementSrc, refinement, methods) <- case hasEquals of
872+ Just _ -> do
872873 symbol " ="
873- keyword " do"
874- newline'
875- fds <- funcDec `sepEndBy` newline' <?> " trait methods"
876- keyword " end"
877- return fds
878- )
879- <|> return []
874+ reqProps <- optional (try (parens (traitField `sepBy` symbol " ," )) <?> " required properties" )
875+ refSrc <- lookAhead $ optional $ do
876+ keyword " satisfies"
877+ parens (many (noneOf [' )' ])) <?> " refinement source"
878+ ref <- optional $ do
879+ keyword " satisfies"
880+ parens expr <?> " refinement"
881+ methods' <-
882+ ( do
883+ keyword " do"
884+ newline'
885+ fds <- funcDec `sepEndBy` newline' <?> " trait methods"
886+ keyword " end"
887+ return fds
888+ )
889+ <|> return []
890+ return (reqProps, refSrc, ref, methods')
891+ Nothing -> do
892+ reqProps <- optional (try (parens (traitField `sepBy` symbol " ," )) <?> " required properties" )
893+ refSrc <- lookAhead $ optional $ do
894+ keyword " satisfies"
895+ parens (many (noneOf [' )' ])) <?> " refinement source"
896+ ref <- optional $ do
897+ keyword " satisfies"
898+ parens expr <?> " refinement"
899+ hasEqualsAfter <- lookAhead (optional (try (symbol " =" )))
900+ methods' <- case hasEqualsAfter of
901+ Just _ -> do
902+ symbol " ="
903+ ( do
904+ keyword " do"
905+ newline'
906+ fds <- funcDec `sepEndBy` newline' <?> " trait methods"
907+ keyword " end"
908+ return fds
909+ )
910+ <|> return []
911+ Nothing -> return []
912+ return (reqProps, refSrc, ref, methods')
880913 end <- getOffset
881- return $ Trait name methods generics (Position (start, end))
914+ return $ Trait name methods generics (fromMaybe [] requiredProperties) refinement (fromMaybe " " refinementSrc) (Position (start, end))
915+ where
916+ traitField = do
917+ fieldName <- identifier <?> " field name"
918+ symbol " :"
919+ fieldType <- validType <?> " field type"
920+ return (fieldName, fieldType)
882921
883922impl :: Parser Expr
884923impl = do
0 commit comments