branch: elpa/haskell-tng-mode commit 3f5467393bda731b93bc55ff913bd9ac8939cd56 Author: Tseen She <ts33n....@gmail.com> Commit: Tseen She <ts33n....@gmail.com>
don't fontify toplevel --- haskell-tng-font-lock.el | 17 +++-------------- haskell-tng-rx.el | 11 ----------- haskell-tng-smie.el | 2 +- test/src/layout.hs.faceup | 16 ++++++++-------- test/src/medley.hs.faceup | 26 +++++++++++++------------- 5 files changed, 25 insertions(+), 47 deletions(-) diff --git a/haskell-tng-font-lock.el b/haskell-tng-font-lock.el index 2dc6504..4f571be 100644 --- a/haskell-tng-font-lock.el +++ b/haskell-tng-font-lock.el @@ -62,11 +62,6 @@ "Haskell constructors." :group 'haskell-tng:faces) -(defface haskell-tng:toplevel - '((t :inherit font-lock-function-name-face)) - "Haskell top level declarations." - :group 'haskell-tng:faces) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Here is the `font-lock-keywords' table of matchers and highlighters. (defconst @@ -77,7 +72,6 @@ (let ((conid haskell-tng:rx:conid) ;;(qual haskell-tng:rx:qual) (consym haskell-tng:rx:consym) - (toplevel haskell-tng:rx:toplevel) (qual haskell-tng:rx:qual) (bigspace `(| space ,haskell-tng:rx:newline))) `(;; reservedid / reservedop @@ -164,10 +158,6 @@ ;; TODO numeric / char primitives? ;; TODO haddock, different face vs line comments, and some markup. - ;; top-level - (,(rx-to-string toplevel) - . 'haskell-tng:toplevel) - ;; uses of F.Q.N.s ;; TODO should perhaps be in a different font than module/import use, e.g. ;; lighter not bolder. @@ -232,7 +222,9 @@ Some complexity to avoid matching on operators." "Used in `font-lock-extend-region-functions'. Automatically populated by `haskell-tng:font:multiline'") -;; TODO (perf) don't extend if the TRIGGER has a multiline prop already +;; TODO (perf) don't extend if the TRIGGER has a multiline prop already or +;; consider only using multiline instead of trying to add custom +;; font-lock-extend-region-functions entries. (defmacro haskell-tng:font:multiline (name trigger find &rest limiters) "Defines `font-lock-keywords' / `font-lock-extend-region-functions' entries. @@ -284,9 +276,6 @@ succeeds and may further restrict the FIND search limit." ,(finder 'limit))) (add-to-list 'haskell-tng:extend-region-functions ',extend t))))) -;; TODO if the beginning of a multiline pattern goes off the screen, e.g. for a -;; large type definition, we can lose the fontification. This seems to be a bug -;; in Emacs. (haskell-tng:font:multiline explicit-type (rx symbol-start "::" symbol-end) (rx symbol-start "::" symbol-end (group (+ anything))) diff --git a/haskell-tng-rx.el b/haskell-tng-rx.el index bf090bd..1943ac1 100644 --- a/haskell-tng-rx.el +++ b/haskell-tng-rx.el @@ -54,15 +54,6 @@ give false positives." `(| (| "[]" "()") ;; empty list / void (: symbol-start (char ?\\)))) ;; TODO only for lambdas, don't include ops like \\ -(defconst haskell-tng:rx:toplevel - ;; TODO multi-definitions, e.g. Servant's :<|> - ;; - ;; Lexically and grammatically there is nothing special about top-level - ;; definitions, since they are just WLDOs for the module's `where'. But they - ;; are so common in practice that it's useful to special case them. - `(: line-start (group (| ,haskell-tng:rx:varid - (: "(" (+? (syntax symbol)) ")"))) - symbol-end)) (defconst haskell-tng:rx:newline '(| ?\n (: symbol-start "--" (+ (not (any ?\n))) ?\n)) @@ -93,8 +84,6 @@ give false positives." `(| ))) (defconst haskell-tng:regexp:symid (rx-to-string haskell-tng:rx:symid)) -(defconst haskell-tng:regexp:toplevel - (rx-to-string haskell-tng:rx:toplevel)) (provide 'haskell-tng-rx) ;;; haskell-tng-rx.el ends here diff --git a/haskell-tng-smie.el b/haskell-tng-smie.el index 711aeb4..0d7ba97 100644 --- a/haskell-tng-smie.el +++ b/haskell-tng-smie.el @@ -274,7 +274,7 @@ current line." indents) (save-excursion (end-of-line 0) - (re-search-backward haskell-tng:regexp:toplevel nil t) + (re-search-backward (rx bol (not space)) nil t) (when-let (new (haskell-tng-smie:relevant-alts pos t)) (setq indents (append new indents)))) diff --git a/test/src/layout.hs.faceup b/test/src/layout.hs.faceup index d383603..8e1d9e8 100644 --- a/test/src/layout.hs.faceup +++ b/test/src/layout.hs.faceup @@ -3,18 +3,18 @@ «:haskell-tng:keyword:data»«:haskell-tng:type: Stack a »«:haskell-tng:keyword:=» «:haskell-tng:constructor:Empty» «:haskell-tng:keyword:|» «:haskell-tng:constructor:MkStack» a «:haskell-tng:keyword:(»«:haskell-tng:constructor:Stack» a«:haskell-tng:keyword:)» -«:haskell-tng:toplevel:push» «:haskell-tng:keyword:::»«:haskell-tng:type: a »«:haskell-tng:keyword:->»«:haskell-tng:type: Stack a »«:haskell-tng:keyword:->»«:haskell-tng:type: Stack a -»«:haskell-tng:toplevel:push» x s «:haskell-tng:keyword:=» «:haskell-tng:constructor:MkStack» x s +push «:haskell-tng:keyword:::»«:haskell-tng:type: a »«:haskell-tng:keyword:->»«:haskell-tng:type: Stack a »«:haskell-tng:keyword:->»«:haskell-tng:type: Stack a +»push x s «:haskell-tng:keyword:=» «:haskell-tng:constructor:MkStack» x s -«:haskell-tng:toplevel:size» «:haskell-tng:keyword:::»«:haskell-tng:type: Stack a »«:haskell-tng:keyword:->»«:haskell-tng:type: Int -»«:haskell-tng:toplevel:size» s «:haskell-tng:keyword:=» length «:haskell-tng:keyword:(»stkToLst s«:haskell-tng:keyword:)» «:haskell-tng:keyword:where» +size «:haskell-tng:keyword:::»«:haskell-tng:type: Stack a »«:haskell-tng:keyword:->»«:haskell-tng:type: Int +»size s «:haskell-tng:keyword:=» length «:haskell-tng:keyword:(»stkToLst s«:haskell-tng:keyword:)» «:haskell-tng:keyword:where» stkToLst «:haskell-tng:constructor:Empty» «:haskell-tng:keyword:=» «:haskell-tng:keyword:[]» stkToLst «:haskell-tng:keyword:(»«:haskell-tng:constructor:MkStack» x s«:haskell-tng:keyword:)» «:haskell-tng:keyword:=» x«:haskell-tng:keyword::»xs «:haskell-tng:keyword:where» xs «:haskell-tng:keyword:=» stkToLst s -«:haskell-tng:toplevel:pop» «:haskell-tng:keyword:::»«:haskell-tng:type: Stack a »«:haskell-tng:keyword:->»«:haskell-tng:type: »«:haskell-tng:keyword:(»«:haskell-tng:type:a»«:haskell-tng:keyword:,»«:haskell-tng:type: Stack a»«:haskell-tng:keyword:)»«:haskell-tng:type: -»«:haskell-tng:toplevel:pop» «:haskell-tng:keyword:(»«:haskell-tng:constructor:MkStack» x s«:haskell-tng:keyword:)» +pop «:haskell-tng:keyword:::»«:haskell-tng:type: Stack a »«:haskell-tng:keyword:->»«:haskell-tng:type: »«:haskell-tng:keyword:(»«:haskell-tng:type:a»«:haskell-tng:keyword:,»«:haskell-tng:type: Stack a»«:haskell-tng:keyword:)»«:haskell-tng:type: +»pop «:haskell-tng:keyword:(»«:haskell-tng:constructor:MkStack» x s«:haskell-tng:keyword:)» «:haskell-tng:keyword:=» «:haskell-tng:keyword:(»x«:haskell-tng:keyword:,» «:haskell-tng:keyword:case» s «:haskell-tng:keyword:of» r «:haskell-tng:keyword:->» i r «:haskell-tng:keyword:where» i x «:haskell-tng:keyword:=» x«:haskell-tng:keyword:)» «m:-- »«x:(pop Empty) is an error » -«:haskell-tng:toplevel:top» «:haskell-tng:keyword:::»«:haskell-tng:type: Stack a »«:haskell-tng:keyword:->»«:haskell-tng:type: a -»«:haskell-tng:toplevel:top» «:haskell-tng:keyword:(»«:haskell-tng:constructor:MkStack» x s«:haskell-tng:keyword:)» «:haskell-tng:keyword:=» x «m:-- »«x:(top Empty) is an error +top «:haskell-tng:keyword:::»«:haskell-tng:type: Stack a »«:haskell-tng:keyword:->»«:haskell-tng:type: a +»top «:haskell-tng:keyword:(»«:haskell-tng:constructor:MkStack» x s«:haskell-tng:keyword:)» «:haskell-tng:keyword:=» x «m:-- »«x:(top Empty) is an error » \ No newline at end of file diff --git a/test/src/medley.hs.faceup b/test/src/medley.hs.faceup index 9eb0f6c..7c26e33 100644 --- a/test/src/medley.hs.faceup +++ b/test/src/medley.hs.faceup @@ -34,19 +34,19 @@ createProcess«:haskell-tng:keyword:,» proc«:haskell-tng:keyword:,» waitForProcess«:haskell-tng:keyword:)» «m:-- »«x:some chars that should be propertized -»«:haskell-tng:toplevel:chars» «:haskell-tng:keyword:=» «:haskell-tng:keyword:[»«s:'c'»«:haskell-tng:keyword:,» «s:'\n'»«:haskell-tng:keyword:,» «s:'\''»«:haskell-tng:keyword:]» +»chars «:haskell-tng:keyword:=» «:haskell-tng:keyword:[»«s:'c'»«:haskell-tng:keyword:,» «s:'\n'»«:haskell-tng:keyword:,» «s:'\''»«:haskell-tng:keyword:]» -«:haskell-tng:toplevel:strings» «:haskell-tng:keyword:=» «:haskell-tng:keyword:[»«s:""»«:haskell-tng:keyword:,» «s:"\"\""»«:haskell-tng:keyword:,» «s:"\n\\ "»«:haskell-tng:keyword:,» «s:"\\"»«:haskell-tng:keyword:]» +strings «:haskell-tng:keyword:=» «:haskell-tng:keyword:[»«s:""»«:haskell-tng:keyword:,» «s:"\"\""»«:haskell-tng:keyword:,» «s:"\n\\ "»«:haskell-tng:keyword:,» «s:"\\"»«:haskell-tng:keyword:]» «m:-- »«x:knownWrongEscape = "foo"\\"bar" » -«:haskell-tng:toplevel:multiline1» «:haskell-tng:keyword:=» «s:"\ +multiline1 «:haskell-tng:keyword:=» «s:"\ \ "» -«:haskell-tng:toplevel:multiline2» «:haskell-tng:keyword:=» «s:"\ +multiline2 «:haskell-tng:keyword:=» «s:"\ \"» -«:haskell-tng:toplevel:difficult» «:haskell-tng:keyword:=» foo' «s:'a'» 2 +difficult «:haskell-tng:keyword:=» foo' «s:'a'» 2 -«:haskell-tng:toplevel:foo» «:haskell-tng:keyword:=» «s:"wobble (wibble)"» +foo «:haskell-tng:keyword:=» «s:"wobble (wibble)"» «:haskell-tng:keyword:class»«:haskell-tng:type: Get a s »«:haskell-tng:keyword:where» get «:haskell-tng:keyword:::»«:haskell-tng:type: Set s »«:haskell-tng:keyword:->»«:haskell-tng:type: a @@ -91,7 +91,7 @@ «:haskell-tng:keyword:newtype»«:haskell-tng:type: Flobby »«:haskell-tng:keyword:=» «:haskell-tng:constructor:Flobby» -«:haskell-tng:toplevel:foo» «:haskell-tng:keyword:::»«:haskell-tng:type: +foo «:haskell-tng:keyword:::»«:haskell-tng:type: Wibble »«m:-- »«x:wibble »«:haskell-tng:type: »«:haskell-tng:keyword:->»«:haskell-tng:type: Wobble »«m:-- »«x:wobble »«:haskell-tng:type: »«:haskell-tng:keyword:->»«:haskell-tng:type: Wobble »«m:-- »«x:wobble @@ -109,8 +109,8 @@ a »«:haskell-tng:keyword:=» «:haskell-tng:constructor:TestApp» a -«:haskell-tng:toplevel:optionsParser» «:haskell-tng:keyword:::»«:haskell-tng:type: Opts.Parser Options -»«:haskell-tng:toplevel:optionsParser» «:haskell-tng:keyword:=» «:haskell-tng:constructor:Options» +optionsParser «:haskell-tng:keyword:::»«:haskell-tng:type: Opts.Parser Options +»optionsParser «:haskell-tng:keyword:=» «:haskell-tng:constructor:Options» <$> «:haskell-tng:keyword:(»«:haskell-tng:module:Opts.»flag' «:haskell-tng:constructor:Alloc» «:haskell-tng:keyword:(»«:haskell-tng:module:Opts.»long «s:"alloc"» <> «:haskell-tng:module:Opts.»help «s:"wibble"»«:haskell-tng:keyword:)» <|> «:haskell-tng:module:Opts.»flag' «:haskell-tng:constructor:Entries» «:haskell-tng:keyword:(»«:haskell-tng:module:Opts.»long «s:"entry"» <> «:haskell-tng:module:Opts.»help «s:"wobble"»«:haskell-tng:keyword:)» <|> «:haskell-tng:module:Opts.»flag' «:haskell-tng:constructor:Bytes» «:haskell-tng:keyword:(»«:haskell-tng:module:Opts.»long «s:"bytes"» <> «:haskell-tng:module:Opts.»help «s:"i'm a fish"»«:haskell-tng:keyword:))» @@ -136,18 +136,18 @@ «:haskell-tng:keyword:deriving» anyclass «:haskell-tng:keyword:instance» «:haskell-tng:constructor:FromJSON» «:haskell-tng:constructor:Base» «:haskell-tng:keyword:deriving» «:haskell-tng:keyword:newtype» «:haskell-tng:keyword:instance» «:haskell-tng:constructor:FromJSON» «:haskell-tng:constructor:Treble» -«:haskell-tng:toplevel:foo» «:haskell-tng:keyword:=» «:haskell-tng:keyword:do» +foo «:haskell-tng:keyword:=» «:haskell-tng:keyword:do» bar «:haskell-tng:keyword:::»«:haskell-tng:type: Wibble »«:haskell-tng:keyword:<-» baz «:haskell-tng:keyword:where» baz «:haskell-tng:keyword:=» «:haskell-tng:keyword:_» «m:-- »«x:checking that comments are ignored in layout » «m:-- »«x:and that a starting syntax entry is ok » «:haskell-tng:keyword:(»+«:haskell-tng:keyword:)» «:haskell-tng:keyword:=» «:haskell-tng:keyword:_» -«:haskell-tng:toplevel:test» «:haskell-tng:keyword:=» 1 `shouldBe` 1 +test «:haskell-tng:keyword:=» 1 `shouldBe` 1 -«:haskell-tng:toplevel:cases» «:haskell-tng:keyword:=» «:haskell-tng:keyword:\case» +cases «:haskell-tng:keyword:=» «:haskell-tng:keyword:\case» «:haskell-tng:constructor:Nothing» «:haskell-tng:keyword:->» «s:"no"» & toUpper «:haskell-tng:constructor:Just» «:haskell-tng:keyword:_» «:haskell-tng:keyword:->» toUpper $ «s:"yes"» -«:haskell-tng:toplevel:bar» «:haskell-tng:keyword:=» «:haskell-tng:keyword:do» «m:-- »«x:an incomplete do block +bar «:haskell-tng:keyword:=» «:haskell-tng:keyword:do» «m:-- »«x:an incomplete do block » \ No newline at end of file