package me.tomassetti.turin.symbols; import me.tomassetti.turin.parser.ast.Node; import me.tomassetti.turin.parser.ast.QualifiedName; import me.tomassetti.turin.parser.ast.expressions.InvokableExpr; import me.tomassetti.turin.typesystem.TypeUsage; import java.util.List; import java.util.Optional; /** * Something generic: it could come from an AST or be a loaded value. */ public interface Symbol { TypeUsage calcType(); /** * Is this symbol an AST node? */ default boolean isNode() { return false; } default Node asNode() { throw new UnsupportedOperationException(); } default Symbol getField(String fieldName) { throw new UnsupportedOperationException(this.getClass().getCanonicalName()); } default Symbol getField(QualifiedName fieldsPath) { if (fieldsPath.isSimpleName()) { return getField(fieldsPath.getName()); } else { Symbol next = getField(fieldsPath.firstSegment()); return next.getField(fieldsPath.rest()); } } default Optional<List<? extends FormalParameter>> findFormalParametersFor(InvokableExpr invokable) { throw new UnsupportedOperationException(); } }