package php.runtime.ext.core.reflection;
import php.runtime.Information;
import php.runtime.Memory;
import php.runtime.common.HintType;
import php.runtime.env.Environment;
import php.runtime.ext.support.Extension;
import php.runtime.ext.support.compile.CompileConstant;
import php.runtime.memory.ArrayMemory;
import php.runtime.memory.StringMemory;
import php.runtime.reflection.ClassEntity;
import php.runtime.reflection.support.ReflectionUtils;
import static php.runtime.annotation.Reflection.*;
@Name("ReflectionExtension")
@Signature(
@Arg(value = "name", type = HintType.STRING)
)
public class ReflectionExtension extends Reflection {
private Extension extension;
public ReflectionExtension(Environment env, ClassEntity clazz) {
super(env, clazz);
}
public ReflectionExtension(Environment env) {
super(env);
}
public void setExtension(Extension extension) {
this.extension = extension;
getProperties().put("name", new StringMemory(extension.getName()));
}
@Signature(@Arg("name"))
public Memory __construct(Environment env, Memory... args){
String name = args[0].toString();
extension = env.scope.getExtension(name);
if (extension == null){
exception(env, "Extension %s does not exist", name);
}
setExtension(extension);
return Memory.NULL;
}
@Signature
public Memory getName(Environment env, Memory... args){
return new StringMemory(extension.getName());
}
@Signature
public Memory getVersion(Environment env, Memory... args){
String ver = extension.getVersion();
if ("~".equals(ver))
ver = Information.CORE_VERSION;
return new StringMemory(ver);
}
@Signature
public Memory getClassNames(Environment env, Memory... args){
ArrayMemory result = new ArrayMemory();
for(Class<?> e : extension.getClasses().values()){
result.add(ReflectionUtils.getClassName(e));
}
return result.toConstant();
}
@Signature
public Memory getConstants(Environment env, Memory... args){
ArrayMemory result = new ArrayMemory();
for(CompileConstant e : extension.getConstants().values()){
result.put(e.name, e.value);
}
return result.toConstant();
}
@Signature
public Memory getDependencies(Environment env, Memory... args){
ArrayMemory result = new ArrayMemory();
for(String name : extension.getRequiredExtensions()){
result.put(name, new StringMemory("Required"));
}
for(String name : extension.getOptionalExtensions()){
result.put(name, new StringMemory("Optional"));
}
for(String name : extension.getConflictExtensions()){
result.put(name, new StringMemory("Conflicts"));
}
return result.toConstant();
}
@Signature
public Memory getINIEntries(Environment env, Memory... args){
return ArrayMemory.ofStringMap(extension.getINIEntries());
}
@Signature
public Memory isPersistent(Environment env, Memory... args){
return Memory.TRUE;
}
@Signature
public Memory isTemporary(Environment env, Memory... args){
return Memory.FALSE;
}
@Signature
public Memory info(Environment env, Memory... args){
exception(env, "Method '%s' not supported in JPHP", "info");
return Memory.NULL;
}
@Signature({
@Arg(value = "reflector", type = HintType.OBJECT),
@Arg(value = "return", type = HintType.BOOLEAN, optional = @Optional(value = "", type = HintType.BOOLEAN))
})
public static Memory export(Environment env, Memory... args){
ReflectionExtension e = new ReflectionExtension(env, env.fetchClass("ReflectionExtension"));
if (args[1].toBoolean())
return e.__toString(env);
else
env.echo(e.__toString(env));
return Memory.NULL;
}
}