From 34fb87c9fed12369111f5c3f5b25e4721b758b71 Mon Sep 17 00:00:00 2001 From: James Wu Date: Fri, 17 Aug 2018 10:51:13 -0700 Subject: [PATCH] Do not allow interfaces to use traits Summary: title; runtime already bans it but we might as well ban it in the typechecker as well. Reviewed By: kmeht Differential Revision: D9324929 fbshipit-source-id: 5a3000d3b5e72791a9143106c77f1f3c4f66fa03 --- hphp/hack/src/errors/error_codes.ml | 1 + hphp/hack/src/errors/errors.ml | 4 ++++ hphp/hack/src/errors/errors_sig.ml | 1 + hphp/hack/src/typing/nastCheck.ml | 3 +++ hphp/hack/test/errors/error_map.ml | 1 + hphp/hack/test/typecheck/interface_use_trait.php | 5 +++++ hphp/hack/test/typecheck/interface_use_trait.php.exp | 2 ++ 7 files changed, 17 insertions(+) create mode 100644 hphp/hack/test/typecheck/interface_use_trait.php create mode 100644 hphp/hack/test/typecheck/interface_use_trait.php.exp diff --git a/hphp/hack/src/errors/error_codes.ml b/hphp/hack/src/errors/error_codes.ml index f31b585f7d4..a872fe2d6f3 100644 --- a/hphp/hack/src/errors/error_codes.ml +++ b/hphp/hack/src/errors/error_codes.ml @@ -219,6 +219,7 @@ module NastCheck = struct | ConflictingMutableAndMaybeMutableAttributes | MaybeMutableMethodsMustBeReactive | RequiresFinalClass + | InterfaceUsesTrait (* EXTEND HERE WITH NEW VALUES IF NEEDED *) [@@ deriving enum, show { with_path = false } ] let err_code = to_enum diff --git a/hphp/hack/src/errors/errors.ml b/hphp/hack/src/errors/errors.ml index 891b889e097..b482dd5149f 100644 --- a/hphp/hack/src/errors/errors.ml +++ b/hphp/hack/src/errors/errors.ml @@ -1286,6 +1286,10 @@ let await_in_sync_function p = add (NastCheck.err_code NastCheck.AwaitInSyncFunction) p "await can only be used inside async functions" +let interface_use_trait p = + add (NastCheck.err_code NastCheck.InterfaceUsesTrait) p + "Interfaces cannot use traits" + let await_not_allowed p = add (NastCheck.err_code NastCheck.AwaitNotAllowed) p "await is only permitted as a statement, expression in a return statement \ diff --git a/hphp/hack/src/errors/errors_sig.ml b/hphp/hack/src/errors/errors_sig.ml index 718723ed13b..5024e6c3f4a 100644 --- a/hphp/hack/src/errors/errors_sig.ml +++ b/hphp/hack/src/errors/errors_sig.ml @@ -588,4 +588,5 @@ module type S = sig val misplaced_rx_of_scope: Pos.t -> unit val rx_of_scope_and_explicit_rx: Pos.t -> unit val lateinit_with_default: Pos.t -> unit + val interface_use_trait: Pos.t -> unit end diff --git a/hphp/hack/src/typing/nastCheck.ml b/hphp/hack/src/typing/nastCheck.ml index 8492f9472b1..506219b0c81 100644 --- a/hphp/hack/src/typing/nastCheck.ml +++ b/hphp/hack/src/typing/nastCheck.ml @@ -841,6 +841,9 @@ and interface c = (* make sure constructor has no body *) Option.iter c.c_constructor enforce_no_body; Option.iter c.c_constructor enforce_not_async; + List.iter (c.c_uses) (fun (p, _) -> + Errors.interface_use_trait p + ); (* make sure that interfaces don't have any member variables *) match c.c_vars with | hd::_ -> diff --git a/hphp/hack/test/errors/error_map.ml b/hphp/hack/test/errors/error_map.ml index a440fc23425..69fd347d8fe 100644 --- a/hphp/hack/test/errors/error_map.ml +++ b/hphp/hack/test/errors/error_map.ml @@ -218,6 +218,7 @@ MaybeMutableAttributeOnFunction = 3069 ConflictingMutableAndMaybeMutableAttributes = 3070 MaybeMutableMethodsMustBeReactive = 3071 RequiresFinalClass = 3072 +InterfaceUsesTrait = 3073 Typing Errors: AbstractClassFinalDEPRECATED = 4001 diff --git a/hphp/hack/test/typecheck/interface_use_trait.php b/hphp/hack/test/typecheck/interface_use_trait.php new file mode 100644 index 00000000000..6be070f08f0 --- /dev/null +++ b/hphp/hack/test/typecheck/interface_use_trait.php @@ -0,0 +1,5 @@ +