summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--emacs/caml-types.el5
-rw-r--r--parsing/parser.mly40
2 files changed, 20 insertions, 25 deletions
diff --git a/emacs/caml-types.el b/emacs/caml-types.el
index f58598c9e8..ec20a1a8b8 100644
--- a/emacs/caml-types.el
+++ b/emacs/caml-types.el
@@ -34,11 +34,6 @@
; or on a semicolon, or on the :: constructor
; . Even if type checking fails, you can still look at the types
; in the file, up to and including where the type checker failed.
-; . The system doesn't "see" parentheses and begin/end. If you
-; put the cursor on a parenthesis, you will have the type of
-; the expression that contains the parenthesized expression.
-; If you want the parenthesized expression, you need to put the
-; cursor inside it (for example, in a space between its words).
; . To get rid of the highlighting, put the cursor in a comment
; and type C-c C-t.
; . The mark in the .types file is set to the beginning of the
diff --git a/parsing/parser.mly b/parsing/parser.mly
index d1e46589d4..eaac02c0b3 100644
--- a/parsing/parser.mly
+++ b/parsing/parser.mly
@@ -41,6 +41,9 @@ let mkclass d =
let mkcty d =
{ pcty_desc = d; pcty_loc = symbol_rloc() }
+let reloc_pat x = { x with ppat_loc = symbol_rloc () };;
+let reloc_exp x = { x with pexp_loc = symbol_rloc () };;
+
let mkoperator name pos =
{ pexp_desc = Pexp_ident(Lident name); pexp_loc = rhs_loc pos }
@@ -98,8 +101,7 @@ let rec mktailexp = function
loc_end = exp_el.pexp_loc.loc_end;
loc_ghost = true}
in
- let arg = {pexp_desc = Pexp_tuple [e1; exp_el];
- pexp_loc = {l with loc_ghost = true} } in
+ let arg = {pexp_desc = Pexp_tuple [e1; exp_el]; pexp_loc = l} in
{pexp_desc = Pexp_construct(Lident "::", Some arg, false); pexp_loc = l}
let rec mktailpat = function
@@ -109,13 +111,12 @@ let rec mktailpat = function
let pat_pl = mktailpat pl in
let l = {loc_start = p1.ppat_loc.loc_start;
loc_end = pat_pl.ppat_loc.loc_end;
- loc_ghost = false}
+ loc_ghost = true}
in
- let arg = {ppat_desc = Ppat_tuple [p1; pat_pl];
- ppat_loc = {l with loc_ghost = true} } in
+ let arg = {ppat_desc = Ppat_tuple [p1; pat_pl]; ppat_loc = l} in
{ppat_desc = Ppat_construct(Lident "::", Some arg, false); ppat_loc = l}
-let mkstrexp e =
+let ghstrexp e =
{ pstr_desc = Pstr_eval e; pstr_loc = {e.pexp_loc with loc_ghost = true} }
let array_function str name =
@@ -129,8 +130,7 @@ let rec deep_mkrangepat c1 c2 =
let rec mkrangepat c1 c2 =
if c1 > c2 then mkrangepat c2 c1 else
if c1 = c2 then mkpat(Ppat_constant(Const_char c1)) else
- mkpat(Ppat_or(ghpat(Ppat_constant(Const_char c1)),
- deep_mkrangepat (Char.chr(Char.code c1 + 1)) c2))
+ reloc_pat (deep_mkrangepat c1 c2)
let syntax_error () =
raise Syntaxerr.Escape_error
@@ -373,7 +373,7 @@ interface:
;
toplevel_phrase:
top_structure SEMISEMI { Ptop_def $1 }
- | seq_expr SEMISEMI { Ptop_def[mkstrexp $1] }
+ | seq_expr SEMISEMI { Ptop_def[ghstrexp $1] }
| toplevel_directive SEMISEMI { $1 }
| EOF { raise End_of_file }
;
@@ -383,12 +383,12 @@ top_structure:
;
use_file:
use_file_tail { $1 }
- | seq_expr use_file_tail { Ptop_def[mkstrexp $1] :: $2 }
+ | seq_expr use_file_tail { Ptop_def[ghstrexp $1] :: $2 }
;
use_file_tail:
EOF { [] }
| SEMISEMI EOF { [] }
- | SEMISEMI seq_expr use_file_tail { Ptop_def[mkstrexp $2] :: $3 }
+ | SEMISEMI seq_expr use_file_tail { Ptop_def[ghstrexp $2] :: $3 }
| SEMISEMI structure_item use_file_tail { Ptop_def[$2] :: $3 }
| SEMISEMI toplevel_directive use_file_tail { $2 :: $3 }
| structure_item use_file_tail { Ptop_def[$1] :: $2 }
@@ -421,12 +421,12 @@ module_expr:
;
structure:
structure_tail { $1 }
- | seq_expr structure_tail { mkstrexp $1 :: $2 }
+ | seq_expr structure_tail { ghstrexp $1 :: $2 }
;
structure_tail:
/* empty */ { [] }
| SEMISEMI { [] }
- | SEMISEMI seq_expr structure_tail { mkstrexp $2 :: $3 }
+ | SEMISEMI seq_expr structure_tail { ghstrexp $2 :: $3 }
| SEMISEMI structure_item structure_tail { $2 :: $3 }
| structure_item structure_tail { $1 :: $2 }
;
@@ -586,7 +586,7 @@ class_structure:
;
class_self_pattern:
LPAREN pattern RPAREN
- { $2 }
+ { reloc_pat $2 }
| LPAREN pattern COLON core_type RPAREN
{ mkpat(Ppat_constraint($2, $4)) }
| /* empty */
@@ -737,7 +737,7 @@ class_type_declaration:
seq_expr:
| expr %prec below_SEMI { $1 }
- | expr SEMI { $1 }
+ | expr SEMI { reloc_exp $1 }
| expr SEMI seq_expr { mkexp(Pexp_sequence($1, $3)) }
;
labeled_simple_pattern:
@@ -890,11 +890,11 @@ simple_expr:
| name_tag %prec prec_constant_constructor
{ mkexp(Pexp_variant($1, None)) }
| LPAREN seq_expr RPAREN
- { $2 }
+ { reloc_exp $2 }
| LPAREN seq_expr error
{ unclosed "(" 1 ")" 3 }
| BEGIN seq_expr END
- { $2 }
+ { reloc_exp $2 }
| BEGIN END
{ mkexp (Pexp_construct (Lident "()", None, false)) }
| BEGIN seq_expr error
@@ -928,7 +928,7 @@ simple_expr:
| LBRACKETBAR BARRBRACKET
{ mkexp(Pexp_array []) }
| LBRACKET expr_semi_list opt_semi RBRACKET
- { mkexp (mktailexp (List.rev $2)).pexp_desc }
+ { reloc_exp (mktailexp (List.rev $2)) }
| LBRACKET expr_semi_list opt_semi error
{ unclosed "[" 1 "]" 4 }
| PREFIXOP simple_expr
@@ -1089,7 +1089,7 @@ simple_pattern:
| LBRACE lbl_pattern_list opt_semi error
{ unclosed "{" 1 "}" 4 }
| LBRACKET pattern_semi_list opt_semi RBRACKET
- { mkpat (mktailpat (List.rev $2)).ppat_desc }
+ { reloc_pat (mktailpat (List.rev $2)) }
| LBRACKET pattern_semi_list opt_semi error
{ unclosed "[" 1 "]" 4 }
| LBRACKETBAR pattern_semi_list opt_semi BARRBRACKET
@@ -1099,7 +1099,7 @@ simple_pattern:
| LBRACKETBAR pattern_semi_list opt_semi error
{ unclosed "[|" 1 "|]" 4 }
| LPAREN pattern RPAREN
- { $2 }
+ { reloc_pat $2 }
| LPAREN pattern error
{ unclosed "(" 1 ")" 3 }
| LPAREN pattern COLON core_type RPAREN