Bläddra i källkod

completion errors fix

Nicolas Cannasse 15 år sedan
förälder
incheckning
03afcb5d7a
1 ändrade filer med 20 tillägg och 18 borttagningar
  1. 20 18
      parser.ml

+ 20 - 18
parser.ml

@@ -214,7 +214,7 @@ and parse_class_field_resume s =
 			| At :: _ | Kwd Public :: _ | Kwd Static :: _ | Kwd Var :: _ | Kwd Override :: _ | Kwd Dynamic :: _ ->
 			| At :: _ | Kwd Public :: _ | Kwd Static :: _ | Kwd Var :: _ | Kwd Override :: _ | Kwd Dynamic :: _ ->
 				raise Exit
 				raise Exit
 			| [] | Eof :: _ | Kwd Import :: _ | Kwd Using :: _ | Kwd Extern :: _ | Kwd Class :: _ | Kwd Interface :: _ | Kwd Enum :: _ | Kwd Typedef :: _ ->
 			| [] | Eof :: _ | Kwd Import :: _ | Kwd Using :: _ | Kwd Extern :: _ | Kwd Class :: _ | Kwd Interface :: _ | Kwd Enum :: _ | Kwd Typedef :: _ ->
-				raise Not_found				
+				raise Not_found
 			| [Kwd Private; Kwd Function]
 			| [Kwd Private; Kwd Function]
 			| [Kwd Private; Kwd Var] ->
 			| [Kwd Private; Kwd Var] ->
 				raise Exit
 				raise Exit
@@ -462,11 +462,10 @@ and block2 name ident p = parser
 
 
 and block acc s =
 and block acc s =
 	try
 	try
-		let e = parse_block_elt s in
+		(* because of inner recursion, we can't put Display handling in errors below *)
+		let e = try parse_block_elt s with Display e -> display (EBlock (List.rev (e :: acc)),snd e) in
 		block (e :: acc) s
 		block (e :: acc) s
 	with
 	with
-		| Display e ->
-			display (EBlock (List.rev (e :: acc)),snd e)
 		| Stream.Failure ->
 		| Stream.Failure ->
 			List.rev acc
 			List.rev acc
 		| Stream.Error _ ->
 		| Stream.Error _ ->
@@ -592,6 +591,7 @@ and expr_next e1 = parser
 		(match s with parser
 		(match s with parser
 		| [< '(Const (Ident f),p2) when p.pmax = p2.pmin; s >] -> expr_next (EField (e1,f) , punion (pos e1) p2) s
 		| [< '(Const (Ident f),p2) when p.pmax = p2.pmin; s >] -> expr_next (EField (e1,f) , punion (pos e1) p2) s
 		| [< '(Const (Type t),p2) when p.pmax = p2.pmin; s >] -> expr_next (EType (e1,t) , punion (pos e1) p2) s
 		| [< '(Const (Type t),p2) when p.pmax = p2.pmin; s >] -> expr_next (EType (e1,t) , punion (pos e1) p2) s
+		| [< '(Binop OpOr,p2) when do_resume() >] -> display (EDisplay e1,p)
 		| [< >] ->
 		| [< >] ->
 			(* turn an integer followed by a dot into a float *)
 			(* turn an integer followed by a dot into a float *)
 			match e1 with
 			match e1 with
@@ -633,7 +633,7 @@ and expr_next e1 = parser
 
 
 and parse_switch_cases eswitch cases = parser
 and parse_switch_cases eswitch cases = parser
 	| [< '(Kwd Default,p1); '(DblDot,_); s >] ->
 	| [< '(Kwd Default,p1); '(DblDot,_); s >] ->
-		let b = EBlock (try block [] s with Display e -> display (ESwitch (eswitch,cases,Some e),p1)) in		
+		let b = EBlock (try block [] s with Display e -> display (ESwitch (eswitch,cases,Some e),p1)) in
 		let l , def = parse_switch_cases eswitch cases s in
 		let l , def = parse_switch_cases eswitch cases s in
 		(match def with None -> () | Some (e,p) -> error Duplicate_default p);
 		(match def with None -> () | Some (e,p) -> error Duplicate_default p);
 		l , Some (b,p1)
 		l , Some (b,p1)
@@ -656,22 +656,24 @@ and parse_catch etry = parser
 		| [< '(_,p) >] -> error Missing_type p
 		| [< '(_,p) >] -> error Missing_type p
 
 
 and parse_call_params ec s =
 and parse_call_params ec s =
-	try
+	let e = (try
 		match s with parser
 		match s with parser
-		| [< e = expr >] ->
-			let rec loop acc =
-				try 
-					match s with parser
-					| [< '(Comma,_); e = expr >] -> loop (e::acc)
-					| [< >] -> List.rev acc
-				with Display e ->
-					display (ECall (ec,List.rev (e::acc)),pos ec)
-			in
-			loop [e]
-		| [< >] ->
-			[]
+		| [< e = expr >] -> Some e
+		| [< >] -> None
 	with Display e ->
 	with Display e ->
 		display (ECall (ec,[e]),pos ec)
 		display (ECall (ec,[e]),pos ec)
+	) in
+	let rec loop acc =
+		try
+			match s with parser
+			| [< '(Comma,_); e = expr >] -> loop (e::acc)
+			| [< >] -> List.rev acc
+		with Display e ->
+			display (ECall (ec,List.rev (e::acc)),pos ec)
+	in
+	match e with
+	| None -> []
+	| Some e -> loop [e]
 
 
 and toplevel_expr s =
 and toplevel_expr s =
 	try
 	try