package org.develnext.jphp.core.tokenizer.token;
import php.runtime.env.Context;
import php.runtime.env.TraceInfo;
import org.develnext.jphp.core.tokenizer.TokenFinder;
import org.develnext.jphp.core.tokenizer.TokenMeta;
import org.develnext.jphp.core.tokenizer.TokenType;
import java.lang.reflect.InvocationTargetException;
public class Token {
protected final TokenMeta meta;
protected final TokenType type;
public Token(TokenMeta meta, TokenType type) {
this.meta = meta;
this.type = type;
}
@Override
public String toString(){
return getClass().getSimpleName() + "[" + meta.getWord() + "]";
}
public TokenType getType() {
return type;
}
public TokenMeta getMeta() {
return meta;
}
public TraceInfo toTraceInfo(Context context){
return getMeta().toTraceInfo(context);
}
public String getWord(){
return getMeta().getWord();
}
public boolean isNamedToken() {
return type == TokenType.T_STRING;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Token)) return false;
Token token = (Token) o;
return token.getClass() == this.getClass() && getWord().equals(token.getWord());
}
public static Token of(TokenMeta meta){
TokenFinder finder = new TokenFinder();
Class<? extends Token> clazz = finder.find(meta);
try {
return clazz.getConstructor(TokenMeta.class).newInstance(meta);
} catch (InvocationTargetException e) {
throw new RuntimeException(e.getTargetException());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static Token of(String word){
return of(new TokenMeta(word, 0, 0, 0, 0));
}
}