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 }