package scotch.compiler.syntax.value; import static scotch.compiler.intermediate.Intermediates.literal; import static scotch.compiler.text.TextUtil.quote; import lombok.EqualsAndHashCode; import lombok.Getter; import me.qmx.jitescript.CodeBlock; import scotch.compiler.analyzer.DependencyAccumulator; import scotch.compiler.analyzer.NameAccumulator; import scotch.compiler.analyzer.OperatorAccumulator; import scotch.compiler.analyzer.PrecedenceParser; import scotch.compiler.analyzer.NameQualifier; import scotch.compiler.analyzer.TypeChecker; import scotch.compiler.intermediate.IntermediateGenerator; import scotch.compiler.intermediate.IntermediateValue; import scotch.compiler.syntax.pattern.PatternReducer; import scotch.compiler.text.SourceLocation; import scotch.compiler.syntax.type.Type; @EqualsAndHashCode(callSuper = false) public abstract class LiteralValue<A> extends Value { @Getter protected final SourceLocation sourceLocation; @Getter protected final A value; @Getter protected final Type type; LiteralValue(SourceLocation sourceLocation, A value, Type type) { this.sourceLocation = sourceLocation; this.value = value; this.type = type; } @Override public Value accumulateDependencies(DependencyAccumulator state) { return this; } @Override public Value accumulateNames(NameAccumulator state) { return this; } @Override public IntermediateValue generateIntermediateCode(IntermediateGenerator state) { return literal(value); } @Override public Value bindMethods(TypeChecker typeChecker) { return this; } @Override public Value checkTypes(TypeChecker typeChecker) { return this; } @Override public Value bindTypes(TypeChecker typeChecker) { return this; } @Override public Value defineOperators(OperatorAccumulator state) { return this; } @Override public Value parsePrecedence(PrecedenceParser state) { return this; } protected abstract CodeBlock loadValue(); @Override public Value qualifyNames(NameQualifier state) { return this; } @Override public Value reducePatterns(PatternReducer reducer) { return this; } @Override public String toString() { return "(" + quote(value) + " :: " + type + ")"; } @Override public Value withType(Type type) { return this; } }