package org.develnext.jphp.core.compiler.jvm.statement; import org.develnext.jphp.core.compiler.jvm.JvmCompiler; import org.develnext.jphp.core.tokenizer.TokenMeta; import org.develnext.jphp.core.tokenizer.token.expr.value.NameToken; import org.develnext.jphp.core.tokenizer.token.stmt.ClassStmtToken; import org.develnext.jphp.core.tokenizer.token.stmt.FunctionStmtToken; import org.develnext.jphp.core.tokenizer.token.stmt.MethodStmtToken; import org.develnext.jphp.core.tokenizer.token.stmt.NamespaceStmtToken; import php.runtime.common.Modifier; import php.runtime.reflection.*; import java.util.Arrays; public class FunctionStmtCompiler extends StmtCompiler<FunctionEntity> { protected FunctionStmtToken statement; public FunctionStmtCompiler(JvmCompiler compiler, FunctionStmtToken statement) { super(compiler); this.statement = statement; } @Override public FunctionEntity compile() { // ModuleEntity module = compiler.getModule(); FunctionEntity entity = new FunctionEntity(compiler.getContext()); entity.setModule(module); entity.setName(statement.getFulledName()); entity.setReturnReference(statement.isReturnReference()); entity.setInternalName(compiler.getModule().getInternalName() + "_func" + statement.getId()); entity.setTrace(statement.toTraceInfo(compiler.getContext())); if (statement.getDocComment() != null) entity.setDocComment(new DocumentComment(statement.getDocComment().getComment())); NamespaceStmtToken namespace = NamespaceStmtToken.getDefault(); ClassStmtToken token = new ClassStmtToken(statement.getMeta()); token.setFinal(true); token.setNamespace(namespace); token.setName(new NameToken(TokenMeta.of(entity.getInternalName()))); MethodStmtToken methodToken = new MethodStmtToken(statement); methodToken.setClazz(token); methodToken.setFinal(true); methodToken.setStatic(true); methodToken.setReturnReference(entity.isReturnReference()); methodToken.setModifier(Modifier.PUBLIC); methodToken.setName(new NameToken(TokenMeta.of("__invoke"))); token.setMethods(Arrays.asList(methodToken)); ClassStmtCompiler classStmtCompiler = new ClassStmtCompiler(compiler, token); classStmtCompiler.setSystem(true); classStmtCompiler.setFunctionName(entity.getName()); ClassEntity clazzEntity = classStmtCompiler.compile(); entity.setData(clazzEntity.getData()); MethodEntity methodEntity = clazzEntity.findMethod("__invoke"); entity.setParameters(methodEntity.getParameters()); entity.setEmpty(methodEntity.isEmpty()); entity.setUsesStackTrace(methodEntity.isUsesStackTrace()); entity.setImmutable(methodEntity.isImmutable()); entity.setResult(methodEntity.getResult()); entity.setGeneratorEntity(methodEntity.getGeneratorEntity()); return entity; } }