浏览代码

added ECheckType

Nicolas Cannasse 14 年之前
父节点
当前提交
c85d029fa3
共有 5 个文件被更改,包括 12 次插入1 次删除
  1. 1 0
      ast.ml
  2. 2 1
      doc/CHANGES.txt
  3. 4 0
      interp.ml
  4. 1 0
      std/haxe/macro/Expr.hx
  5. 4 0
      typer.ml

+ 1 - 0
ast.ml

@@ -190,6 +190,7 @@ and expr_def =
 	| EDisplay of expr * bool
 	| EDisplayNew of type_path
 	| ETernary of expr * expr * expr
+	| ECheckType of expr * complex_type
 
 and expr = expr_def * pos
 

+ 2 - 1
doc/CHANGES.txt

@@ -5,7 +5,8 @@
 	flash9 : fixed -D swfprotected with swc output
 	neko : added ~ implementation
 	js : upgraded jquery version
-	spod macros : added "in" operator
+	sys : added "in" operator for spod macros
+	macro : added ECheckType
 
 2011-09-25: 2.08
 	js : added js.JQuery

+ 4 - 0
interp.ml

@@ -3150,6 +3150,8 @@ and encode_expr e =
 				27, [encode_path t]
 			| ETernary (econd,e1,e2) ->
 				28, [loop econd;loop e1;loop e2]
+			| ECheckType (e,t) ->
+				29, [loop e; encode_type t]
 		in
 		enc_obj [
 			"pos", encode_pos p;
@@ -3391,6 +3393,8 @@ let decode_expr v =
 			EDisplayNew (decode_path t)
 		| 28, [e1;e2;e3] ->
 			ETernary (loop e1,loop e2,loop e3)
+		| 29, [e;t] ->
+			ECheckType (loop e, decode_ctype t)
 		| _ ->
 			raise Invalid_expr
 	in

+ 1 - 0
std/haxe/macro/Expr.hx

@@ -115,6 +115,7 @@ enum ExprDef {
 	EDisplay( e : Expr, isCall : Bool );
 	EDisplayNew( t : TypePath );
 	ETernary( econd : Expr, eif : Expr, eelse : Expr );
+	ECheckType( e : Expr, t : ComplexType );
 }
 
 enum ComplexType {

+ 4 - 0
typer.ml

@@ -1739,6 +1739,10 @@ and type_expr ctx ?(need_val=true) (e,p) =
 			raise (Display t)
 		| _ ->
 			error "Not a class" p)
+	| ECheckType (e,t) ->
+		let e = type_expr ctx ~need_val e in
+		unify ctx e.etype (Typeload.load_complex_type ctx p t) e.epos;
+		e
 
 and type_call ctx e el p =
 	match e, el with