package nl.utwente.viskell.haskell.typeparser;
import nl.utwente.viskell.haskell.type.Type;
import nl.utwente.viskell.haskell.type.TypeClass;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
import java.util.Map;
/**
* Turns a String into a Type.
*/
public final class TypeBuilder {
/** Map of available type classes. */
private Map<String, TypeClass> typeClasses;
/**
* @param typeClasses The available type classes.
*/
public TypeBuilder(Map<String, TypeClass> typeClasses) {
this.typeClasses = typeClasses;
}
/**
* Parse a Haskell type declaration into a TypeT instance.
*
* @param hs The Haskell type declaration
* @return Type
*/
public Type build(final String hs) {
TypeLexer lexer = new TypeLexer(new ANTLRInputStream(hs));
CommonTokenStream tokens = new CommonTokenStream(lexer);
TypeParser parser = new TypeParser(tokens);
ParserRuleContext tree = parser.type();
ParseTreeWalker walker = new ParseTreeWalker();
TypeBuilderListener extractor;
extractor = new TypeBuilderListener(this.typeClasses);
walker.walk(extractor, tree);
return extractor.result();
}
}