diff --git a/polymod/Polymod.hx b/polymod/Polymod.hx index acb14301..62599caa 100644 --- a/polymod/Polymod.hx +++ b/polymod/Polymod.hx @@ -691,6 +691,8 @@ class Polymod polymod.hscript._internal.PolymodScriptClass.registerScriptClassByPath(path); } } + + polymod.hscript._internal.PolymodInterpEx.validateImports(); } #else Polymod.warning(SCRIPT_HSCRIPT_NOT_INSTALLED, "Cannot register script classes, HScript is not available."); @@ -728,6 +730,9 @@ class Polymod if (future != null) futures.push(future); } } + + polymod.hscript._internal.PolymodInterpEx.validateImports(); + return futures; #else Polymod.warning(SCRIPT_HSCRIPT_NOT_INSTALLED, "Cannot register script classes, HScript is not available."); diff --git a/polymod/hscript/_internal/PolymodClassDeclEx.hx b/polymod/hscript/_internal/PolymodClassDeclEx.hx index a5d45619..927077ef 100644 --- a/polymod/hscript/_internal/PolymodClassDeclEx.hx +++ b/polymod/hscript/_internal/PolymodClassDeclEx.hx @@ -14,6 +14,7 @@ typedef PolymodClassDeclEx = * Save performance and improve sandboxing by resolving imports at interpretation time. */ @:optional var imports:Map; + @:optional var importsToValidate:Map; @:optional var pkg:Array; @:optional var staticFields:Array; diff --git a/polymod/hscript/_internal/PolymodInterpEx.hx b/polymod/hscript/_internal/PolymodInterpEx.hx index a8c69388..1f6ca690 100644 --- a/polymod/hscript/_internal/PolymodInterpEx.hx +++ b/polymod/hscript/_internal/PolymodInterpEx.hx @@ -62,6 +62,12 @@ class PolymodInterpEx extends Interp var clsRef = PolymodStaticClassReference.tryBuild(cl); if (clsRef != null) return clsRef.instantiate(args); + if (getClassDecl().imports != null && getClassDecl().imports.exists(cl)) + { + var clsRef = PolymodStaticClassReference.tryBuild(getClassDecl().imports.get(cl).fullPath); + if (clsRef != null) return clsRef.instantiate(args); + } + if (_proxy != null) { @:privateAccess @@ -194,6 +200,26 @@ class PolymodInterpEx extends Interp return _scriptClassDescriptors.get(name); } + public static function validateImports() + { + for (cls in _scriptClassDescriptors) + { + var clsPath = cls.pkg != null ? (cls.pkg.join(".") + ".") : ""; + clsPath += cls.name; + + for (key => imp in cls.importsToValidate) + { + if (_scriptClassDescriptors.exists(imp.fullPath)) + { + cls.imports.set(key, imp); + continue; + } + + Polymod.error(SCRIPT_CLASS_MODULE_NOT_FOUND, 'Could not import class ${imp.fullPath}', clsPath); + } + } + } + override function setVar(id:String, v:Dynamic) { if (_proxy != null && _proxy.superClass != null) @@ -1255,6 +1281,7 @@ class PolymodInterpEx extends Interp { var pkg:Array = null; var imports:Map = []; + var importsToValidate:Map = []; for (importPath in PolymodScriptClass.defaultImports.keys()) { @@ -1316,7 +1343,8 @@ class PolymodInterpEx extends Interp // If the class is still not found, skip this import entirely. if (resultCls == null && resultEnm == null) { - Polymod.error(SCRIPT_CLASS_MODULE_NOT_FOUND, 'Could not import class ${importedClass.fullPath}', origin); + //Polymod.error(SCRIPT_CLASS_MODULE_NOT_FOUND, 'Could not import class ${importedClass.fullPath}', origin); + importsToValidate.set(importedClass.name, importedClass); continue; } else if (resultCls != null) { importedClass.cls = resultCls; @@ -1372,6 +1400,7 @@ class PolymodInterpEx extends Interp var classDecl:PolymodClassDeclEx = { imports: imports, + importsToValidate: importsToValidate, pkg: pkg, name: c.name, params: c.params,