summaryrefslogtreecommitdiffstats
path: root/otherlibs/labltk/browser/lexical.ml
diff options
context:
space:
mode:
Diffstat (limited to 'otherlibs/labltk/browser/lexical.ml')
-rw-r--r--otherlibs/labltk/browser/lexical.ml46
1 files changed, 32 insertions, 14 deletions
diff --git a/otherlibs/labltk/browser/lexical.ml b/otherlibs/labltk/browser/lexical.ml
index 655c3cc18..38dcb8f81 100644
--- a/otherlibs/labltk/browser/lexical.ml
+++ b/otherlibs/labltk/browser/lexical.ml
@@ -25,24 +25,28 @@ and colors =
"indianred4"; "saddlebrown"; "midnightblue"]
let init_tags tw =
- List.iter2 tags colors f:
+ List.iter2 tags colors ~f:
begin fun tag col ->
- Text.tag_configure tw :tag foreground:(`Color col)
+ Text.tag_configure tw ~tag ~foreground:(`Color col)
end;
- Text.tag_configure tw tag:"error" foreground:`Red;
- Text.tag_configure tw tag:"error" relief:`Raised;
- Text.tag_raise tw tag:"error"
+ Text.tag_configure tw ~tag:"error" ~foreground:`Red;
+ Text.tag_configure tw ~tag:"error" ~relief:`Raised;
+ Text.tag_raise tw ~tag:"error"
-let tag ?(:start=tstart) ?(:end=tend) tw =
- let tpos c = (Text.index tw index:start, [`Char c]) in
- let text = Text.get tw :start :end in
+let tag ?(start=tstart) ?(stop=tend) tw =
+ let tpos c = (Text.index tw ~index:start, [`Char c]) in
+ let text = Text.get tw ~start ~stop in
let buffer = Lexing.from_string text in
List.iter tags
- f:(fun tag -> Text.tag_remove tw :start :end :tag);
+ ~f:(fun tag -> Text.tag_remove tw ~start ~stop ~tag);
+ let last = ref (EOF, 0, 0) in
try
while true do
+ let token = Lexer.token buffer
+ and start = Lexing.lexeme_start buffer
+ and stop = Lexing.lexeme_end buffer in
let tag =
- match Lexer.token buffer with
+ match token with
AMPERAMPER
| AMPERSAND
| BARBAR
@@ -108,17 +112,31 @@ let tag ?(:start=tstart) ?(:end=tend) tw =
| SHARP
-> "infix"
| LABEL _
- | LABELID _
+ | OPTLABEL _
| QUESTION
+ | TILDE
-> "label"
| UIDENT _ -> "uident"
+ | LIDENT _ ->
+ begin match !last with
+ (QUESTION | TILDE), _, _ -> "label"
+ | _ -> ""
+ end
+ | COLON ->
+ begin match !last with
+ LIDENT _, lstart, lstop ->
+ if lstop = start then
+ Text.tag_add tw ~tag:"label"
+ ~start:(tpos lstart) ~stop:(tpos stop);
+ ""
+ | _ -> ""
+ end
| EOF -> raise End_of_file
| _ -> ""
in
if tag <> "" then
- Text.tag_add tw :tag
- start:(tpos (Lexing.lexeme_start buffer))
- end:(tpos (Lexing.lexeme_end buffer))
+ Text.tag_add tw ~tag ~start:(tpos start) ~stop:(tpos stop);
+ last := (token, start, stop)
done
with
End_of_file -> ()