Explorar o código

make sure only allowed events are defined when events check is enabled

Nicolas Cannasse %!s(int64=4) %!d(string=hai) anos
pai
achega
eb165c34cc
Modificáronse 1 ficheiros con 19 adicións e 0 borrados
  1. 19 0
      hide/comp/ScriptEditor.hx

+ 19 - 0
hide/comp/ScriptEditor.hx

@@ -16,6 +16,7 @@ class ScriptChecker {
 	static var TYPE_CHECK_HOOKS : Array<ScriptChecker->Void> = [];
 	var ide : hide.Ide;
 	var apiFiles : Array<String>;
+	var checkEvents : Bool;
 	public var config : hide.Config;
 	public var documentName : String;
 	public var constants : Map<String,Dynamic>;
@@ -63,6 +64,8 @@ class ScriptChecker {
 		var cdbPack : String = config.get("script.cdbPackage");
 		var context = null;
 		var allowGlobalsDefine = false;
+		checkEvents = false;
+
 		for( api in apis ) {
 			for( f in api.globals.keys() ) {
 				var tname = api.globals.get(f);
@@ -112,6 +115,7 @@ class ScriptChecker {
 			if( api.events != null ) {
 				for( f in getFields(api.events) )
 					checker.setEvent(f.name, f.t);
+				checkEvents = true;
 			}
 
 			if( api.cdbEnums != null ) {
@@ -240,6 +244,7 @@ class ScriptChecker {
 		parser.allowJSON = true;
 		return parser;
 	}
+
 	public function getCompletion( script : String ) {
 		var parser = makeParser();
 		parser.resumeErrors = true;
@@ -257,6 +262,20 @@ class ScriptChecker {
 		var parser = makeParser();
 		try {
 			var expr = parser.parseString(script, "");
+
+			if( checkEvents ) {
+				function checkRec(e:hscript.Expr) {
+					switch( e.e ) {
+					case EFunction(_,_,name,_):
+						if( name != null && StringTools.startsWith(name,"on") && name.charCodeAt(2) > 'A'.code && name.charCodeAt(2) < 'Z'.code && @:privateAccess !checker.events.exists(name) )
+							@:privateAccess checker.error('Unknown event $name', e);
+					default:
+						hscript.Tools.iter(e, checkRec);
+					}
+				}
+				checkRec(expr);
+			}
+
 			if( checkTypes ) {
 				var et = checker.check(expr);
 				if( evalTo != null ) {