Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add delimiter face #2027

Merged
merged 1 commit into from
Apr 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/Juvix/Compiler/Concrete/Data/Highlight.hs
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ goFaceParsedItem i = WithLoc (i ^. parsedLoc) (PropertyFace f)
ParsedTagLiteralInt -> FaceNumber
ParsedTagLiteralString -> FaceString
ParsedTagComment -> FaceComment
ParsedTagDelimiter -> FaceDelimiter

goFaceName :: AName -> Maybe (WithLoc PropertyFace)
goFaceName n = do
Expand Down
2 changes: 2 additions & 0 deletions src/Juvix/Compiler/Concrete/Data/Highlight/Properties.hs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ data Face
| FaceFunction
| FaceModule
| FaceAxiom
| FaceDelimiter
| FaceKeyword
| FaceString
| FaceNumber
Expand All @@ -40,6 +41,7 @@ faceSymbolStr = \case
FaceConstructor -> Str.constructor
FaceModule -> Str.module_
FaceKeyword -> Str.keyword
FaceDelimiter -> Str.delimiter
FaceFunction -> Str.function
FaceNumber -> Str.number
FaceComment -> Str.comment
Expand Down
2 changes: 1 addition & 1 deletion src/Juvix/Compiler/Concrete/Data/Highlight/RenderEmacs.hs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ fromCodeAnn = \case
f <- nameKindFace k
return (EPropertyFace (PropertyFace f))
AnnKeyword -> Just (EPropertyFace (PropertyFace FaceKeyword))
AnnDelimiter -> Just (EPropertyFace (PropertyFace FaceKeyword))
AnnDelimiter -> Just (EPropertyFace (PropertyFace FaceDelimiter))
AnnComment -> Just (EPropertyFace (PropertyFace FaceComment))
AnnLiteralString -> Just (EPropertyFace (PropertyFace FaceString))
AnnLiteralInteger -> Just (EPropertyFace (PropertyFace FaceNumber))
Expand Down
9 changes: 9 additions & 0 deletions src/Juvix/Compiler/Concrete/Data/ParsedInfoTableBuilder.hs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
module Juvix.Compiler.Concrete.Data.ParsedInfoTableBuilder
( InfoTableBuilder,
registerLiteral,
registerDelimiter,
registerKeyword,
registerJudocText,
registerComment,
Expand Down Expand Up @@ -38,6 +39,14 @@ registerKeyword r =
_parsedTag = ParsedTagKeyword
}

registerDelimiter :: Member InfoTableBuilder r => Interval -> Sem r ()
registerDelimiter i =
registerItem
ParsedItem
{ _parsedLoc = i,
_parsedTag = ParsedTagDelimiter
}

registerJudocText :: Member InfoTableBuilder r => Interval -> Sem r ()
registerJudocText i =
registerItem
Expand Down
1 change: 1 addition & 0 deletions src/Juvix/Compiler/Concrete/Data/ParsedItem.hs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ data ParsedItemTag
| ParsedTagLiteralInt
| ParsedTagLiteralString
| ParsedTagComment
| ParsedTagDelimiter
deriving stock (Eq, Show, Generic)

makeLenses ''ParsedItem
Expand Down
14 changes: 7 additions & 7 deletions src/Juvix/Compiler/Concrete/Translation/FromSource.hs
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ top ::
(Member InfoTableBuilder r) =>
ParsecS r a ->
ParsecS r a
top p = space >> p <* (optional (kw kwSemicolon) >> P.eof)
top p = space >> p <* (optional semicolon >> P.eof)

topModuleDef ::
(Members '[Error ParserError, Files, PathResolver, InfoTableBuilder, JudocStash, NameIdGen] r) =>
Expand Down Expand Up @@ -143,7 +143,7 @@ mkTopModulePath :: NonEmpty Symbol -> TopModulePath
mkTopModulePath l = TopModulePath (NonEmpty.init l) (NonEmpty.last l)

symbolList :: (Members '[InfoTableBuilder, JudocStash, NameIdGen] r) => ParsecS r (NonEmpty Symbol)
symbolList = braces (P.sepBy1 symbol (kw kwSemicolon))
symbolList = braces (P.sepBy1 symbol semicolon)

topModulePath :: (Members '[InfoTableBuilder, JudocStash, NameIdGen] r) => ParsecS r TopModulePath
topModulePath = mkTopModulePath <$> dottedSymbol
Expand Down Expand Up @@ -192,7 +192,7 @@ stashJudoc = do
P.try (judocStart >> judocExampleStart)
_exampleId <- P.lift freshNameId
(_exampleExpression, _exampleLoc) <- interval parseExpressionAtoms
kw kwSemicolon
semicolon
space
return (JudocExample (Example {..}))

Expand Down Expand Up @@ -380,7 +380,7 @@ letClause = either LetTypeSig LetFunClause <$> auxTypeSigFunClause
letBlock :: (Members '[InfoTableBuilder, JudocStash, NameIdGen] r) => ParsecS r (LetBlock 'Parsed)
letBlock = do
_letKw <- kw kwLet
_letClauses <- P.sepEndBy1 letClause (kw kwSemicolon)
_letClauses <- P.sepEndBy1 letClause semicolon
kw kwIn
_letExpression <- parseExpressionAtoms
return LetBlock {..}
Expand Down Expand Up @@ -625,15 +625,15 @@ moduleDef = P.label "<module definition>" $ do
_moduleDoc <- getJudoc
_modulePath <- pmodulePath
_moduleParameters <- many inductiveParams
kw kwSemicolon
_moduleBody <- P.sepEndBy statement (kw kwSemicolon)
semicolon
_moduleBody <- P.sepEndBy statement semicolon
_moduleKwEnd <- endModule
return Module {..}
where
endModule :: ParsecS r (ModuleEndType t)
endModule = case sing :: SModuleIsTop t of
SModuleLocal -> kw kwEnd
SModuleTop -> void (optional (kw kwEnd >> kw kwSemicolon))
SModuleTop -> void (optional (kw kwEnd >> semicolon))

-- | An ExpressionAtom which is a valid expression on its own.
atomicExpression :: (Members '[InfoTableBuilder, JudocStash, NameIdGen] r) => ParsecS r (ExpressionAtoms 'Parsed)
Expand Down
20 changes: 15 additions & 5 deletions src/Juvix/Compiler/Concrete/Translation/FromSource/Lexer.hs
Original file line number Diff line number Diff line change
Expand Up @@ -93,20 +93,30 @@ dot = P.char '.'
dottedIdentifier :: (Members '[InfoTableBuilder] r) => ParsecS r (NonEmpty (Text, Interval))
dottedIdentifier = lexeme $ P.sepBy1 bareIdentifier dot

delim :: (Members '[InfoTableBuilder] r) => Text -> ParsecS r ()
delim sym = lexeme $ delim' sym >>= P.lift . registerDelimiter

lbrace :: (Members '[InfoTableBuilder] r) => ParsecS r ()
lbrace = symbol "{"
lbrace = delim "{"

rbrace :: (Members '[InfoTableBuilder] r) => ParsecS r ()
rbrace = symbol "}"
rbrace = delim "}"

lparen :: (Members '[InfoTableBuilder] r) => ParsecS r ()
lparen = symbol "("
lparen = delim "("

rparen :: (Members '[InfoTableBuilder] r) => ParsecS r ()
rparen = symbol ")"
rparen = delim ")"

-- TODO Consider using this instead of kw kwPipe
pipe :: (Members '[InfoTableBuilder] r) => ParsecS r ()
pipe = delim "|"

semicolon :: (Members '[InfoTableBuilder] r) => ParsecS r ()
semicolon = delim ";"

parens :: (Members '[InfoTableBuilder] r) => ParsecS r a -> ParsecS r a
parens = between lparen rparen

braces :: (Members '[InfoTableBuilder] r) => ParsecS r a -> ParsecS r a
braces = between (symbol "{") (symbol "}")
braces = between lbrace rbrace
2 changes: 1 addition & 1 deletion src/Juvix/Data/CodeAnn.hs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ kwColonColon :: Doc Ann
kwColonColon = keyword (Str.colon <> Str.colon)

kwPipe :: Doc Ann
kwPipe = keyword Str.pipe
kwPipe = delimiter Str.pipe

kwHole :: Doc Ann
kwHole = keyword Str.underscore
Expand Down
3 changes: 3 additions & 0 deletions src/Juvix/Extra/Strings.hs
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,9 @@ any = "Any"
questionMark :: (IsString s) => s
questionMark = "?"

delimiter :: (IsString s) => s
delimiter = "delimiter"

keyword :: (IsString s) => s
keyword = "keyword"

Expand Down
4 changes: 4 additions & 0 deletions src/Juvix/Parser/Lexer.hs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ number' int mn mx = do
string' :: ParsecS r Text
string' = pack <$> (char '"' >> manyTill L.charLiteral (char '"'))

-- | The caller is responsible of consuming space after it.
delim' :: Text -> ParsecS r Interval
delim' d = P.label (unpack d) . fmap snd . interval $ chunk d

-- | The caller is responsible of consuming space after it.
kw' :: Keyword -> ParsecS r KeywordRef
kw' k@Keyword {..} = P.label (unpack _keywordAscii) (reserved <|> normal)
Expand Down