package scotch.compiler.intermediate; import static scotch.compiler.syntax.reference.DefinitionReference.moduleRef; import java.util.ArrayList; import java.util.List; import com.google.common.collect.ImmutableList; import lombok.EqualsAndHashCode; import lombok.ToString; import scotch.compiler.syntax.reference.DefinitionReference; import scotch.compiler.target.BytecodeGenerator; @EqualsAndHashCode(callSuper = false) @ToString public class IntermediateModule extends IntermediateDefinition { private final String symbol; private final List<DefinitionReference> definitions; public IntermediateModule(String symbol, List<DefinitionReference> definitions) { this.symbol = symbol; this.definitions = ImmutableList.copyOf(definitions); } public IntermediateModule append(List<DefinitionReference> newDefinitions) { return new IntermediateModule(symbol, new ArrayList<DefinitionReference>() {{ addAll(definitions); addAll(newDefinitions); }}); } @Override public void generateBytecode(BytecodeGenerator generator) { generator.beginModule(symbol); definitions.forEach(generator::generateBytecode); generator.endClass(); } @Override public DefinitionReference getReference() { return moduleRef(symbol); } }