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()));
}
}