package org.develnext.jphp.core.tokenizer.token.expr.value; import org.develnext.jphp.core.tokenizer.token.stmt.NamespaceUseStmtToken; import php.runtime.Information; import php.runtime.common.StringUtils; import org.develnext.jphp.core.tokenizer.TokenMeta; import org.develnext.jphp.core.tokenizer.token.Token; import java.util.*; public class FulledNameToken extends NameToken { private List<NameToken> names; private boolean absolutely; private boolean processed; private Set<NamespaceUseStmtToken.UseType> useProcessed = new HashSet<>(); public FulledNameToken(FulledNameToken token) { this(token.meta, Information.NAMESPACE_SEP_CHAR); names = token.names; absolutely = token.absolutely; } public FulledNameToken(TokenMeta meta) { this(meta, Information.NAMESPACE_SEP_CHAR); } public FulledNameToken(TokenMeta meta, char sep){ super(meta); this.names = new ArrayList<NameToken>(); String word = meta.getWord(); this.absolutely = word.startsWith(String.valueOf(sep)); if (absolutely) word = word.substring(1); for(String name : StringUtils.split(word, sep)){ this.names.add(new NameToken(TokenMeta.of( name, this ))); } } public FulledNameToken(TokenMeta meta, List<? extends Token> names) { super(meta); this.names = new ArrayList<NameToken>(); for (Token name : names) if (name instanceof NameToken) this.names.add((NameToken)name); } public List<NameToken> getNames() { return names; } public NameToken getLastName(){ return names.get(names.size() - 1); } public boolean isAbsolutely() { return absolutely; } public String toName(char delimiter){ StringBuilder builder = new StringBuilder(); ListIterator<NameToken> iterator = names.listIterator(); while (iterator.hasNext()){ NameToken tk = iterator.next(); builder.append(tk.getName()); if (iterator.hasNext()) builder.append(delimiter); } return builder.toString(); } public String toName(){ return toName('\\'); } @Override public String getName() { return toName(); } public boolean isSingle() { return names.size() == 1; } public boolean isAnyProcessed() { return isProcessed(NamespaceUseStmtToken.UseType.CLASS) || isProcessed(NamespaceUseStmtToken.UseType.FUNCTION) || isProcessed(NamespaceUseStmtToken.UseType.CONSTANT); } public boolean isProcessed(NamespaceUseStmtToken.UseType useType) { return isAbsolutely() || useProcessed.contains(useType); } public void setProcessed(NamespaceUseStmtToken.UseType useType) { this.useProcessed.add(useType); } public static FulledNameToken valueOf(String... names){ List<NameToken> tmp = new ArrayList<NameToken>(); for(String value : names){ tmp.add(NameToken.valueOf(value)); } return new FulledNameToken(TokenMeta.empty(), tmp); } }