package scotch.compiler.parser; import static scotch.symbol.Symbol.symbol; import static scotch.symbol.Symbol.unqualified; import java.util.Optional; import org.antlr.v4.runtime.ParserRuleContext; import scotch.compiler.parser.ScotchParser.NameContext; import scotch.compiler.parser.ScotchParser.OperatorNameContext; import scotch.compiler.parser.ScotchParser.QualifiedNameContext; import scotch.compiler.parser.ScotchParser.QualifiedTypeContext; import scotch.symbol.Symbol; public class SymbolTransformer extends ScotchParserBaseVisitor<Optional<Symbol>> { @Override public Optional<Symbol> defaultResult() { return Optional.empty(); } public Symbol getSymbol(ParserRuleContext ctx) { return ctx.accept(this) .orElseThrow(() -> new TransformException("Could not get symbol from " + ctx.getClass().getSimpleName())); } @Override public Optional<Symbol> visitName(NameContext ctx) { if (ctx.idVar() != null) { return Optional.of(unqualified(ctx.idVar().getText())); } else if (ctx.idType() != null) { return Optional.of(unqualified(ctx.idType().getText())); } else if (ctx.operatorName() != null) { return visitOperatorName(ctx.operatorName()); } else { return Optional.empty(); } } @Override public Optional<Symbol> visitOperatorName(OperatorNameContext ctx) { if (ctx.OPERATOR() != null) { return Optional.of(unqualified(ctx.OPERATOR().getText())); } else if (ctx.idVar() != null) { return Optional.of(unqualified(ctx.idVar().getText())); } else { return Optional.empty(); } } @Override public Optional<Symbol> visitQualifiedName(QualifiedNameContext ctx) { if (ctx.moduleName() == null) { return visitName(ctx.name()); } else { return visitName(ctx.name()).map(symbol -> symbol.qualifyWith(ctx.moduleName().getText())); } } @Override public Optional<Symbol> visitQualifiedType(QualifiedTypeContext ctx) { return Optional.of(symbol(ctx.getText())); } }