Browse Source

Check module names as well, cleanup

Jens Fischer 6 years ago
parent
commit
9e59c03802

+ 5 - 4
src/context/typecore.ml

@@ -237,13 +237,14 @@ let check_field_name ctx name p =
 	| "new" -> () (* the only keyword allowed in field names *)
 	| _ -> check_identifier_name ctx name "field" p
 
-let check_type_name ctx name p =
+let check_uppercase_identifier_name ctx name kind p =
 	if Ast.is_lower_ident name then
-		display_error ctx "Type name should start with an uppercase letter" p
+		display_error ctx ((StringHelper.capitalize kind) ^ " name should start with an uppercase letter") p
 	else
-		check_identifier_name ctx name "type" p
+		check_identifier_name ctx name kind p
 
-let check_type_path ctx path p =
+let check_module_path ctx path p =
+	check_uppercase_identifier_name ctx (snd path) "module" p;
 	let pack = fst path in
 	try
 		List.iter (fun part -> Path.check_package_name part) pack;

+ 9 - 8
src/typing/typeloadModule.ml

@@ -187,6 +187,7 @@ end
 	Build module structure : should be atomic - no type loading is possible
 *)
 let module_pass_1 ctx m tdecls loadp =
+	Typecore.check_module_path ctx m.m_path loadp;
 	let com = ctx.com in
 	let decls = ref [] in
 	let make_path name priv =
@@ -196,6 +197,10 @@ let module_pass_1 ctx m tdecls loadp =
 	let pt = ref None in
 	let rec make_decl acc decl =
 		let p = snd decl in
+		let check_type_name type_name =
+			let module_name = snd m.m_path in
+			if type_name <> module_name then Typecore.check_uppercase_identifier_name ctx type_name "type" p;
+		in
 		let acc = (match fst decl with
 		| EImport _ | EUsing _ ->
 			(match !pt with
@@ -203,11 +208,10 @@ let module_pass_1 ctx m tdecls loadp =
 			| Some _ -> error "import and using may not appear after a type declaration" p)
 		| EClass d ->
 			let name = fst d.d_name in
-			Typecore.check_type_name ctx name p;
+			check_type_name name;
 			pt := Some p;
 			let priv = List.mem HPrivate d.d_flags in
 			let path = make_path name priv in
-			Typecore.check_type_path ctx path p;
 			let c = mk_class m path p (pos d.d_name) in
 			(* we shouldn't load any other type until we propertly set cl_build *)
 			c.cl_build <- (fun() -> error (s_type_path c.cl_path ^ " is not ready to be accessed, separate your type declarations in several files") p);
@@ -225,11 +229,10 @@ let module_pass_1 ctx m tdecls loadp =
 			acc
 		| EEnum d ->
 			let name = fst d.d_name in
-			Typecore.check_type_name ctx name p;
+			check_type_name name;
 			pt := Some p;
 			let priv = List.mem EPrivate d.d_flags in
 			let path = make_path name priv in
-			Typecore.check_type_path ctx path p;
 			if Meta.has (Meta.Custom ":fakeEnum") d.d_meta then error "@:fakeEnum enums is no longer supported in Haxe 4, use extern enum abstract instead" p;
 			let e = {
 				e_path = path;
@@ -250,12 +253,11 @@ let module_pass_1 ctx m tdecls loadp =
 			acc
 		| ETypedef d ->
 			let name = fst d.d_name in
-			Typecore.check_type_name ctx name p;
+			check_type_name name;
 			if has_meta Meta.Using d.d_meta then error "@:using on typedef is not allowed" p;
 			pt := Some p;
 			let priv = List.mem EPrivate d.d_flags in
 			let path = make_path name priv in
-			Typecore.check_type_path ctx path p;
 			let t = {
 				t_path = path;
 				t_module = m;
@@ -278,10 +280,9 @@ let module_pass_1 ctx m tdecls loadp =
 			acc
 		 | EAbstract d ->
 		 	let name = fst d.d_name in
-			Typecore.check_type_name ctx name p;
+			check_type_name name;
 			let priv = List.mem AbPrivate d.d_flags in
 			let path = make_path name priv in
-			Typecore.check_type_path ctx path p;
 			let a = {
 				a_path = path;
 				a_private = priv;

+ 21 - 0
tests/misc/projects/Issue8019/Macro2.hx

@@ -0,0 +1,21 @@
+import haxe.macro.Context;
+
+class Macro2 {
+	static function init() {
+		function defineModule(name:String) {
+			Context.defineModule(name, [{
+				pos: (macro 0).pos,
+				pack: [],
+				name: name,
+				kind: TDClass(),
+				fields: []
+			}]);
+		}
+
+		defineModule("Valid");
+
+		defineModule("");
+		defineModule("0");
+		defineModule("Type+");
+	}
+}

+ 0 - 2
tests/misc/projects/Issue8019/compile-fail.hxml.stderr

@@ -15,6 +15,4 @@ Macro.hx:8: characters 17-18 : Package name must start with a lower case charact
 Macro.hx:8: characters 17-18 : "0_structure" is not a valid package name:
 Macro.hx:8: characters 17-18 : Package name must start with a lower case character
 Macro.hx:8: characters 17-18 : "0_abstract" is not a valid package name:
-Macro.hx:8: characters 17-18 : Package name must start with a lower case character
-Macro.hx:8: characters 17-18 : "0_abstract._Test" is not a valid package name:
 Macro.hx:8: characters 17-18 : Package name must start with a lower case character

+ 1 - 0
tests/misc/projects/Issue8019/compile3-fail.hxml

@@ -0,0 +1 @@
+--macro Macro2.init()

+ 3 - 0
tests/misc/projects/Issue8019/compile3-fail.hxml.stderr

@@ -0,0 +1,3 @@
+Macro2.hx:7: characters 17-18 : "" is not a valid module name
+Macro2.hx:7: characters 17-18 : "0" is not a valid module name
+Macro2.hx:7: characters 17-18 : "Type+" is not a valid module name

+ 5 - 5
tests/misc/projects/issue5002/compile3-fail.hxml.stderr

@@ -1,6 +1,6 @@
-Main3.hx:9: characters 17-18 : Type name should start with an uppercase letter
-Main3.hx:9: characters 17-18 : "0_class" is not a valid type name
-Main3.hx:9: characters 17-18 : "0_enum" is not a valid type name
-Main3.hx:9: characters 17-18 : "0_struct" is not a valid type name
-Main3.hx:9: characters 17-18 : "0_abstract" is not a valid type name
+Main3.hx:9: characters 17-18 : Module name should start with an uppercase letter
+Main3.hx:9: characters 17-18 : "0_class" is not a valid module name
+Main3.hx:9: characters 17-18 : "0_enum" is not a valid module name
+Main3.hx:9: characters 17-18 : "0_struct" is not a valid module name
+Main3.hx:9: characters 17-18 : "0_abstract" is not a valid module name
 Main3.hx:9: characters 17-18 : "0_abstract_Impl_" is not a valid type name