package org.develnext.jphp.core.syntax.generators; import org.develnext.jphp.core.syntax.SyntaxAnalyzer; import org.develnext.jphp.core.tokenizer.token.SemicolonToken; import org.develnext.jphp.core.tokenizer.token.Token; import org.develnext.jphp.core.tokenizer.token.expr.BraceExprToken; import org.develnext.jphp.core.tokenizer.token.expr.value.FulledNameToken; import org.develnext.jphp.core.tokenizer.token.stmt.NamespaceStmtToken; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class NamespaceGenerator extends Generator<NamespaceStmtToken> { public NamespaceGenerator(SyntaxAnalyzer analyzer) { super(analyzer); } protected void processBody(NamespaceStmtToken namespace, ListIterator<Token> iterator){ Token next = nextToken(iterator); if (next instanceof SemicolonToken){ List<Token> tree = analyzer.process(iterator); namespace.setTree(tree); namespace.setTokenRegistered(true); } else if (isOpenedBrace(next, BraceExprToken.Kind.BLOCK)) { boolean done = false; List<Token> tree = new ArrayList<Token>(); while (iterator.hasNext()){ Token item = analyzer.processNext(iterator); if (isClosedBrace(item, BraceExprToken.Kind.BLOCK)){ done = true; break; } tree.add(item); } if (!done) nextToken(iterator); namespace.setTree(tree); } else unexpectedToken(next); } @Override public NamespaceStmtToken getToken(Token current, ListIterator<Token> iterator) { if (current instanceof NamespaceStmtToken){ NamespaceStmtToken result = (NamespaceStmtToken)current; FulledNameToken name = analyzer.generator(NameGenerator.class).getToken( nextToken(iterator), iterator ); result.setName(name); if (name == null) iterator.previous(); analyzer.setNamespace(result); processBody(result, iterator); analyzer.setNamespace(NamespaceStmtToken.getDefault()); return result; } return null; } }