1 salcianu 1.1 // CompStagePipeline.java, created Fri Apr 18 15:05:45 2003 by salcianu 2 salcianu 1.1 // Copyright (C) 2003 Alexandru Salcianu <salcianu@MIT.EDU> 3 salcianu 1.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 salcianu 1.1 package harpoon.Main; 5 salcianu 1.1 6 salcianu 1.1 import harpoon.Util.Options.Option; 7 salcianu 1.1 8 cananian 1.5 import net.cscott.jutil.CombineIterator; 9 salcianu 1.1 10 salcianu 1.1 import java.util.List; 11 salcianu 1.1 import java.util.LinkedList; 12 salcianu 1.1 import java.util.Iterator; 13 salcianu 1.1 import java.util.Arrays; 14 salcianu 1.1 15 salcianu 1.1 /** 16 salcianu 1.2 * <code>CompStagePipeline</code> is a special 17 salcianu 1.2 * <code>CompilerStage</code> that is the sequential composition of a 18 salcianu 1.2 * list of <code>CompilerStage</code>s. 19 salcianu 1.1 * 20 salcianu 1.1 * @author Alexandru Salcianu <salcianu@MIT.EDU> 21 cananian 1.6 * @version $Id: CompStagePipeline.java,v 1.6 2004/02/08 03:21:38 cananian Exp $ */ 22 salcianu 1.3 public class CompStagePipeline extends CompilerStage { 23 salcianu 1.1 24 salcianu 1.1 /** Creates a <code>CompStagePipeline</code>. */ 25 cananian 1.4 public CompStagePipeline(List<CompilerStage> stages, String name) { 26 salcianu 1.1 super(name); 27 salcianu 1.1 this.stages = stages; 28 salcianu 1.1 } 29 salcianu 1.1 30 cananian 1.4 public CompStagePipeline(List<CompilerStage> stages) { 31 salcianu 1.1 this(stages, build_name(stages)); 32 salcianu 1.1 } 33 salcianu 1.1 34 salcianu 1.1 public CompStagePipeline(CompilerStage s1, CompilerStage s2, String name) { 35 salcianu 1.1 this(Arrays.asList(new CompilerStage[]{s1, s2}), name); 36 salcianu 1.1 } 37 salcianu 1.1 38 salcianu 1.1 public CompStagePipeline(CompilerStage s1, CompilerStage s2) { 39 salcianu 1.1 this(Arrays.asList(new CompilerStage[]{s1, s2})); 40 salcianu 1.1 } 41 salcianu 1.1 42 salcianu 1.1 43 cananian 1.4 private static String build_name(List<CompilerStage> stages) { 44 salcianu 1.1 StringBuffer name = new StringBuffer("("); 45 salcianu 1.1 boolean first = true; 46 cananian 1.6 for(CompilerStage stage : stages) { 47 salcianu 1.1 if(!first) name.append(","); 48 salcianu 1.1 first = false; 49 salcianu 1.1 name.append(stage.name()); 50 salcianu 1.1 } 51 salcianu 1.1 name.append(")"); 52 salcianu 1.1 return name.toString(); 53 salcianu 1.1 } 54 salcianu 1.1 55 salcianu 1.1 56 cananian 1.4 private final List<CompilerStage> stages; 57 salcianu 1.2 58 salcianu 1.2 /** @return <code>count</code>th CompilerStage from this pipeline. */ 59 salcianu 1.2 protected CompilerStage getStage(int count) { 60 cananian 1.4 return stages.get(count); 61 salcianu 1.2 } 62 salcianu 1.1 63 cananian 1.4 public List<Option> getOptions() { 64 cananian 1.4 List<Option> opts = new LinkedList<Option>(); 65 cananian 1.6 for(CompilerStage stage : stages) { 66 salcianu 1.1 opts.addAll(stage.getOptions()); 67 salcianu 1.1 } 68 salcianu 1.1 return opts; 69 salcianu 1.1 } 70 salcianu 1.3 71 salcianu 1.3 public boolean enabled() { return true; } 72 salcianu 1.1 73 salcianu 1.2 public final CompilerState action(CompilerState cs) { 74 cananian 1.6 for(CompilerStage stage : stages) { 75 salcianu 1.2 if(stage.enabled()) 76 salcianu 1.2 cs = stage.action(cs); 77 salcianu 1.1 } 78 salcianu 1.1 return cs; 79 salcianu 1.1 } 80 salcianu 1.1 81 salcianu 1.1 }