package org.develnext.jphp.core.compiler.jvm.statement; import org.develnext.jphp.core.compiler.jvm.JvmCompiler; import org.develnext.jphp.core.tokenizer.token.expr.value.NameToken; import org.develnext.jphp.core.tokenizer.token.stmt.*; import php.runtime.common.Modifier; import php.runtime.lang.Generator; import php.runtime.reflection.ClassEntity; import php.runtime.reflection.helper.GeneratorEntity; import java.util.Arrays; import java.util.Collections; public class GeneratorStmtCompiler extends StmtCompiler<GeneratorEntity> { protected final FunctionStmtToken statement; public GeneratorStmtCompiler(JvmCompiler compiler, FunctionStmtToken statement) { super(compiler); this.statement = statement; } @Override public GeneratorEntity compile() { GeneratorEntity entity = new GeneratorEntity(getCompiler().getContext()); entity.setReturnReference(statement.isReturnReference()); entity.setInternalName(compiler.getModule().getInternalName() + "_generator" + statement.getId()); entity.setId(statement.getGeneratorId()); entity.setTrace(statement.toTraceInfo(compiler.getContext())); ClassStmtToken classStmtToken = new ClassStmtToken(statement.getMeta()); classStmtToken.setNamespace(NamespaceStmtToken.getDefault()); classStmtToken.setName(NameToken.valueOf(entity.getInternalName())); classStmtToken.setExtend(ExtendsStmtToken.valueOf(Generator.class.getSimpleName())); MethodStmtToken methodToken = new MethodStmtToken(statement); methodToken.setClazz(classStmtToken); methodToken.setGenerator(false); methodToken.setReturnReference(false); methodToken.setModifier(Modifier.PROTECTED); methodToken.setName(NameToken.valueOf("_run")); methodToken.setUses(statement.getArguments()); methodToken.setArguments(Collections.<ArgumentStmtToken>emptyList()); classStmtToken.setMethods(Arrays.asList(methodToken)); ClassStmtCompiler classStmtCompiler = new ClassStmtCompiler(this.compiler, classStmtToken); classStmtCompiler.setSystem(true); classStmtCompiler.setInterfaceCheck(false); classStmtCompiler.setGeneratorEntity(entity); classStmtCompiler.setFunctionName(statement.getFulledName()); ClassEntity clazzEntity = classStmtCompiler.compile(); entity.getMethods().putAll(clazzEntity.getMethods()); if (clazzEntity.getParent() != null) entity.setParent(clazzEntity.getParent()); entity.setData(clazzEntity.getData()); entity.doneDeclare(); return entity; } }