Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 13 additions & 26 deletions polymod/hscript/_internal/Interp.hx
Original file line number Diff line number Diff line change
Expand Up @@ -219,17 +219,8 @@ class Interp
var packagedClass = getClassDecl().pkg.join(".") + "." + cl;
if (_scriptClassDescriptors.exists(packagedClass))
{
// OVERRIDE CHANGE: Create a PolymodScriptClass instead of a ScriptClass
var clsDescriptor:ClassDecl = findScriptClassDescriptor(packagedClass);
var ctorField:Null<FieldDecl> = clsDescriptor.fields.find((f) -> f.name == 'new');
if (clsDescriptor != getClassDecl() && ctorField?.access.contains(APrivate))
{
error(EPrivateConstructor(clsRef.cls.name));
return null;
}

var proxy:PolymodAbstractScriptClass = new PolymodScriptClass(clsDescriptor, args);
return proxy;
var clsRef = PolymodStaticClassReference.tryBuild(packagedClass);
if (clsRef != null) return tryBuildClass(clsRef, args);
}
}
@:privateAccess
Expand All @@ -238,16 +229,8 @@ class Interp
var importedClass:ClassImport = getClassDecl().imports.get(cl);
if (_scriptClassDescriptors.exists(importedClass.fullPath))
{
// OVERRIDE CHANGE: Create a PolymodScriptClass instead of a ScriptClass
var clsDescriptor:ClassDecl = findScriptClassDescriptor(importedClass.fullPath);
var ctorField:Null<FieldDecl> = clsDescriptor.fields.find((f) -> f.name == 'new');
if (clsDescriptor != getClassDecl() && ctorField?.access.contains(APrivate))
{
error(EPrivateConstructor(clsRef.cls.name));
return null;
}
var proxy:PolymodAbstractScriptClass = new PolymodScriptClass(clsDescriptor, args);
return proxy;
var clsRef = PolymodStaticClassReference.tryBuild(importedClass.fullPath);
if (clsRef != null) return tryBuildClass(clsRef, args);
}

// Ignore importedClass.enm as enums cannot be instantiated.
Expand Down Expand Up @@ -2224,7 +2207,7 @@ class Interp
checkTypeForDeprecation(name);
return PolymodEnum.tryBuild(name, f);
}
try
try
{
return get(fieldTarget(e), f);
}
Expand Down Expand Up @@ -3455,13 +3438,17 @@ class Interp
}
else if (Std.isOfType(o, PolymodScriptClass))
{
var ref:PolymodAbstractScriptClass = cast(o, PolymodAbstractScriptClass);
// We use the topASC value when checking script classes
// As there's a chance the function we're referencing wasn't found in the parent but in a superclass instead.
var ref:PolymodAbstractScriptClass = cast(o, PolymodAbstractScriptClass).getMostTopASC();
var proxyTopASC:PolymodAbstractScriptClass = _proxy?.getMostTopASC();
var clsName:String = proxyTopASC?.fullyQualifiedName ?? getClassFullyQualifiedName();

if (ref.fullyQualifiedName == getClassFullyQualifiedName())
if (ref.fullyQualifiedName == clsName)
return true;

// If this script class shares the same superclasses with this class we're in (inheritance) then we can access it if the field is any of those.
var superClasses:Array<String> = PolymodScriptClass.getSuperClasses(getClassDecl()) ?? [];
var superClasses:Array<String> = PolymodScriptClass.getSuperClasses(proxyTopASC?._c ?? getClassDecl()) ?? [];
var inheritatedSuperClasses:Array<String> = [ref.fullyQualifiedName].concat(PolymodScriptClass.getSuperClasses(ref._c)).filter((superCls:String) -> return superClasses.contains(superCls));

var superClass:Dynamic = ref.superClass;
Expand Down Expand Up @@ -3509,7 +3496,7 @@ class Interp
else
{
// We're checking for fields from within a regular class.
var superClasses:Array<String> = PolymodScriptClass.getSuperClasses(getClassDecl()) ?? [];
var superClasses:Array<String> = PolymodScriptClass.getSuperClasses(_proxy?.getMostTopASC()._c ?? getClassDecl()) ?? [];
var inheritatedSuperClasses:Array<String> = [Util.getTypeNameOf(o)].concat(Util.getSuperClasses(o) ?? []).filter((superCls:String) -> return superClasses.contains(superCls));

for (cls in inheritatedSuperClasses)
Expand Down
Loading