package php.runtime.reflection.support;
import php.runtime.Memory;
import php.runtime.common.HintType;
import php.runtime.env.Context;
import php.runtime.env.Environment;
import php.runtime.ext.support.Extension;
import php.runtime.lang.Closure;
import php.runtime.reflection.DocumentComment;
import php.runtime.reflection.ParameterEntity;
import php.runtime.reflection.helper.GeneratorEntity;
abstract public class AbstractFunctionEntity extends Entity {
protected boolean isImmutable;
protected boolean isEmpty = false;
protected DocumentComment docComment;
protected boolean returnReference;
protected ParameterEntity[] parameters;
protected TypeChecker returnTypeChecker;
protected Memory result;
protected boolean abstractable = false;
protected Extension extension;
protected boolean deprecated;
protected boolean usesStackTrace = false;
protected GeneratorEntity generatorEntity;
protected AbstractFunctionEntity(Context context) {
super(context);
}
public Closure getClosure(Environment env){
return null;
}
public boolean isDeprecated() {
return deprecated;
}
public void setDeprecated(boolean deprecated) {
this.deprecated = deprecated;
}
public Extension getExtension() {
return extension;
}
public void setExtension(Extension extension) {
this.extension = extension;
}
public Memory getResult() {
return result;
}
public void setResult(Memory result) {
this.result = result;
}
public void unsetArguments(Memory[] arguments){
if (arguments != null){
int x = 0;
for(Memory argument : arguments) {
if (argument == null) continue;
if (argument.isArray()) {
ParameterEntity param = parameters != null && x < parameters.length ? parameters[x] : null;
if (param == null || (param.isUsed() && param.isMutable() && !param.isReference())) {
argument.unset();
}
}
x++;
}
}
}
public boolean isAbstractable() {
return abstractable;
}
public void setAbstractable(boolean abstractable) {
this.abstractable = abstractable;
}
public boolean isEmpty() {
return isEmpty;
}
public void setEmpty(boolean empty) {
isEmpty = empty;
}
public DocumentComment getDocComment() {
return docComment;
}
public void setDocComment(DocumentComment docComment) {
this.docComment = docComment;
}
public void setParameters(ParameterEntity[] parameters) {
this.parameters = parameters;
}
public ParameterEntity[] getParameters() {
return getParameters(-1);
}
public ParameterEntity[] getParameters(int count) {
return parameters;
}
public boolean isImmutable() {
return isImmutable;
}
public Memory getImmutableResult(){
if (isImmutable && !abstractable)
return getResult().toImmutable();
return null;
}
public void setImmutable(boolean immutable) {
isImmutable = immutable;
}
public boolean isReturnReference() {
return returnReference;
}
public void setReturnReference(boolean returnReference) {
this.returnReference = returnReference;
}
public boolean isUsesStackTrace() {
return usesStackTrace;
}
public void setUsesStackTrace(boolean usesStackTrace) {
this.usesStackTrace = usesStackTrace;
}
public GeneratorEntity getGeneratorEntity() {
return generatorEntity;
}
public void setGeneratorEntity(GeneratorEntity generatorEntity) {
this.generatorEntity = generatorEntity;
}
public void setReturnTypeChecker(TypeChecker returnTypeChecker) {
this.returnTypeChecker = returnTypeChecker;
}
public TypeChecker getReturnTypeChecker() {
return returnTypeChecker;
}
}