Compare commits
14
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1002bfc969 | ||
|
|
8d99717f39 | ||
|
|
97a0aa4e37 | ||
|
|
54333cdb3a | ||
|
|
99d542215f | ||
|
|
ec01692883 | ||
|
|
9ddc7eee5c | ||
|
|
a69d51f474 | ||
|
|
9c3069d62e | ||
|
|
c91ca46eb4 | ||
|
|
115bd453b9 | ||
|
|
826282aa72 | ||
|
|
3b8b017d4d | ||
|
|
d344ede669 |
@@ -1,3 +1,4 @@
|
||||
--macro keep('IntIterator')
|
||||
--macro hscript.macros.AbstractHandler.init()
|
||||
--macro hscript.macros.ClassExtendMacro.init()
|
||||
--macro hscript.macros.CustomClassMacro.init()
|
||||
|
||||
+69
-40
@@ -122,7 +122,8 @@ class Interp {
|
||||
return inCustomClass ? cast scriptObject : null;
|
||||
|
||||
public var errorHandler:Error->Void;
|
||||
public var importFailedCallback:Array<String>->Bool;
|
||||
public var warnHandler:Error->Void;
|
||||
public var importFailedCallback:Array<String>->Null<String>->Bool;
|
||||
|
||||
public var customClasses:Map<String, CustomClassHandler>;
|
||||
public var variables:Map<String, Dynamic>;
|
||||
@@ -143,6 +144,7 @@ class Interp {
|
||||
var beforeAlias:Null<String> = null;
|
||||
|
||||
public var importEnabled:Bool = true;
|
||||
public var allowStaticImports:Bool = true;
|
||||
|
||||
public var allowStaticVariables:Bool = false;
|
||||
public var allowPublicVariables:Bool = false;
|
||||
@@ -602,6 +604,15 @@ class Interp {
|
||||
return null;
|
||||
}
|
||||
|
||||
public inline function warn(e:#if hscriptPos ErrorDef #else Error #end) {
|
||||
#if hscriptPos var e = new Error(e, curExpr.pmin, curExpr.pmax, curExpr.origin, curExpr.line); #end
|
||||
|
||||
if(warnHandler != null)
|
||||
warnHandler(e);
|
||||
else
|
||||
trace('[ Warning ] ${Printer.errorToString(e)}');
|
||||
}
|
||||
|
||||
inline function rethrow(e:Dynamic):Void {
|
||||
#if hl
|
||||
hl.Api.rethrow(e);
|
||||
@@ -705,12 +716,15 @@ class Interp {
|
||||
switch (e) {
|
||||
case EPackage(_):
|
||||
case EClass(name, fields, extend, interfaces, isFinal):
|
||||
// TODO: module isolation
|
||||
var oldName:String = name;
|
||||
var hasAlias:Bool = (setAlias != null && beforeAlias == oldName);
|
||||
var toSetName:String = hasAlias ? setAlias : oldName;
|
||||
|
||||
if (customClasses.exists(toSetName))
|
||||
error(EAlreadyExistingClass(toSetName));
|
||||
if (customClasses.exists(toSetName)) {
|
||||
warn(EAlreadyExistingClass(toSetName));
|
||||
return null;// ignore it
|
||||
}
|
||||
|
||||
inline function importVar(thing:String):String {
|
||||
if (thing == null)
|
||||
@@ -725,20 +739,20 @@ class Interp {
|
||||
beforeAlias = null;
|
||||
setAlias = null;
|
||||
}
|
||||
case EImport(c, n, isUsing):
|
||||
if (!importEnabled)
|
||||
return null;
|
||||
var splitClassName = [for (e in c.split(".")) e.trim()];
|
||||
case EImport(clsName, aliasAs, isUsing):
|
||||
if(!importEnabled) return null;
|
||||
|
||||
var splitClassName = [for (e in clsName.split(".")) e.trim()];
|
||||
var realClassName = splitClassName.join(".");
|
||||
var claVarName = splitClassName[splitClassName.length - 1];
|
||||
var toSetName = n != null ? n : claVarName;
|
||||
var toSetName = aliasAs != null ? aliasAs : claVarName;
|
||||
var oldClassName = realClassName;
|
||||
var oldSplitName = splitClassName.copy();
|
||||
|
||||
if (variables.exists(toSetName)) { // class is already imported
|
||||
if(variables.exists(toSetName)) { // class is already imported
|
||||
if(isUsing && !usingHandler.entryExists(toSetName))
|
||||
setUsing(toSetName, variables.get(toSetName));
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -748,56 +762,70 @@ class Interp {
|
||||
// setting the extension
|
||||
if(isUsing && !usingHandler.entryExists(toSetName))
|
||||
setCustomClassUsing(toSetName, customClasses.get(toSetName));
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function importResolve(__clsName:String):Null<Dynamic> {
|
||||
var _realClassName = getLocalImportRedirect(__clsName);
|
||||
if(importBlocklist.contains(_realClassName)) return null;
|
||||
|
||||
var realClassName = getLocalImportRedirect(realClassName);
|
||||
|
||||
if (importBlocklist.contains(realClassName))
|
||||
return null;
|
||||
var cl = Type.resolveClass(realClassName);
|
||||
if (cl == null)
|
||||
cl = Type.resolveClass('${realClassName}_HSC');
|
||||
var _cl = Type.resolveClass(_realClassName);
|
||||
if(_cl == null) _cl = Type.resolveClass('${_realClassName}_HSC');
|
||||
return _cl;
|
||||
}
|
||||
|
||||
var cl = importResolve(realClassName);
|
||||
var en = Type.resolveEnum(realClassName);
|
||||
|
||||
//trace(realClassName, cl, en, splitClassName);
|
||||
|
||||
// Allow for flixel.ui.FlxBar.FlxBarFillDirection;
|
||||
if (cl == null && en == null) {
|
||||
if(cl == null && en == null) {
|
||||
if(splitClassName.length > 1) {
|
||||
splitClassName.splice(-2, 1); // Remove the last last item
|
||||
realClassName = splitClassName.join(".");
|
||||
|
||||
var realClassName = getLocalImportRedirect(realClassName);
|
||||
|
||||
if (importBlocklist.contains(realClassName))
|
||||
return null;
|
||||
|
||||
cl = Type.resolveClass(realClassName);
|
||||
if (cl == null)
|
||||
cl = Type.resolveClass('${realClassName}_HSC');
|
||||
|
||||
cl = importResolve(realClassName);
|
||||
en = Type.resolveEnum(realClassName);
|
||||
|
||||
//trace(realClassName, cl, en, splitClassName);
|
||||
}
|
||||
}
|
||||
|
||||
if (cl == null && en == null) {
|
||||
if(cl == null && en == null) {
|
||||
if(allowStaticImports) { //allows for static imports like "haxe.io.Path.normalize"
|
||||
var clPth = oldSplitName.copy();
|
||||
var funcName = clPth.pop();
|
||||
var statField = Reflect.getProperty(Type.resolveClass(StringTools.trim(clPth.join("."))), funcName);
|
||||
|
||||
if(statField != null) {
|
||||
variables.set((toSetName != null && toSetName.length > 0 ? toSetName : funcName), statField);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
beforeAlias = claVarName;
|
||||
setAlias = n;
|
||||
if (importFailedCallback == null || !importFailedCallback(oldSplitName)){
|
||||
setAlias = aliasAs;
|
||||
if(importFailedCallback == null || !importFailedCallback(oldSplitName, toSetName)){
|
||||
beforeAlias = null;
|
||||
setAlias = null;
|
||||
error(EInvalidClass(oldClassName));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (en != null) {
|
||||
if(isUsing) error(EInvalidClass(oldClassName));
|
||||
// ENUM!!!!
|
||||
//If the first letter of the alias is not an uppercase letter, then throw an error.
|
||||
//We don't need to worry about this for static imports.
|
||||
if(toSetName != claVarName && !Tools.isUppercase(toSetName)) {
|
||||
error(ECustom("Type aliases must start with an uppercase letter"));
|
||||
return null;
|
||||
}
|
||||
|
||||
if(en != null) { // ENUM!!!!
|
||||
if(isUsing) {
|
||||
error(EInvalidClass(oldClassName));
|
||||
return null;
|
||||
}
|
||||
|
||||
var enumThingy:HEnum = {};
|
||||
for (c in en.getConstructors()) {
|
||||
for(c in en.getConstructors()) {
|
||||
try {
|
||||
//UnsafeReflect.setField(enumThingy, c, en.createByName(c));
|
||||
enumThingy.setEnum(c, en.createByName(c));
|
||||
@@ -811,12 +839,11 @@ class Interp {
|
||||
}
|
||||
}
|
||||
variables.set(toSetName, enumThingy);
|
||||
} else {
|
||||
} else { //Standard class
|
||||
if(isUsing) setUsing(toSetName, cl);
|
||||
variables.set(toSetName, cl);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
case EEnum(en, _): // TODO: enum abstracts
|
||||
@@ -1222,7 +1249,7 @@ class Interp {
|
||||
var match = false;
|
||||
for (c in cases) {
|
||||
for (v in c.values) {
|
||||
// https://github.com/FunkinCrew/hscript/blob/funkin-dev/hscript/Interp.hx#L531
|
||||
// https://github.com/FunkinCrew/hscript/blob/funkin-dev/hscript/Interp.hx#L611
|
||||
switch (Tools.expr(v)) {
|
||||
case ECall(e, params):
|
||||
switch (Tools.expr(e)) {
|
||||
@@ -1626,3 +1653,5 @@ class Interp {
|
||||
return Type.createInstance(c, args);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -131,6 +131,13 @@ class Tools {
|
||||
#end
|
||||
}
|
||||
|
||||
public static function isUppercase(s:String) {
|
||||
if(s.length == 0) return false;
|
||||
var c:Int = StringTools.fastCodeAt(s, 0);
|
||||
if(StringTools.isEof(c)) return false; // Just in case :3
|
||||
return c >= 65 && c <= 90; // A-Z
|
||||
}
|
||||
|
||||
public static inline function isCustomAbstract(obj:Dynamic):Bool
|
||||
return obj != null && obj is IHScriptAbstractBehaviour;
|
||||
|
||||
|
||||
@@ -26,9 +26,11 @@ class ClassExtendMacro {
|
||||
#if !display
|
||||
#if CUSTOM_CLASSES
|
||||
if(Context.defined("display")) return;
|
||||
/*
|
||||
for(apply in Config.ALLOWED_CUSTOM_CLASSES) {
|
||||
Compiler.addGlobalMetadata(apply, "@:build(hscript.macros.ClassExtendMacro.build())");
|
||||
}
|
||||
*/
|
||||
//Context.onAfterTyping(buildTyped);
|
||||
#end
|
||||
#end
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user