source: proto/pablo/src/compiler/codeGenerator/visitors/helpers/CodeStore.java @ 2702

Last change on this file since 2702 was 2702, checked in by ksherdy, 6 years ago

General refactoring (variable names). Added final block XFormer. Move final block operations atEOF/inFile out of carry intro transformer to final block transformer.

File size: 2.7 KB
Line 
1package compiler.codeGenerator.visitors.helpers;
2
3import java.util.ArrayList;
4import java.util.List;
5
6public class CodeStore {
7       
8        private class CodeLine {
9                public String line;
10                public final int relativeIndent;         // compared to previous line.
11                public CodeLine(String line, int relativeIndent) {
12                        super();
13                        this.line = line;
14                        this.relativeIndent = relativeIndent;
15                }
16        }
17       
18        public static final char NEWLINE = '\n';
19        public static final char INDENT  = '\t';
20        List<CodeLine> code = new ArrayList<CodeLine>();
21        private String resultVarName = "codeStoreNoVar";
22
23        public void appendToLast(String line) {
24                if (code.isEmpty()) {
25                        addLine(line);
26                } else {
27                        CodeLine codeLine = code.get(code.size()-1);
28                        codeLine.line += line;
29                }
30        }
31       
32        public void addLine(String line, int relativeIndent) {
33                CodeLine codeLine = new CodeLine(line, relativeIndent);
34                code.add(codeLine);
35        }
36       
37        public void addLine(String line) {
38                addLine(line, 0);
39        }
40       
41        public void addFormattedLine(String format, Object...args ) {
42                String line = String.format(format, args);
43                addLine(line);
44        }
45       
46        public void indentedFormattedLine(String format, Object...args ) {
47                String line = String.format(format, args);
48                indentedLine(line);
49        }
50       
51        public void indentedLine(String line) {
52                addLine(line, 1);
53        }
54       
55        public void dedentedLine(String line) {
56                addLine(line, -1);
57        }
58       
59        public void setResultVarName(String name) {
60                this.resultVarName  = name;
61        }
62       
63        public String getResultVarName() {
64                return resultVarName;
65        }
66       
67        public void addAll(CodeStore other, int relativeIndent) {
68                if(other.code.isEmpty()) {
69                        return;
70                }
71               
72                CodeLine first = other.code.get(0);
73                addLine(first.line, first.relativeIndent + relativeIndent);
74               
75                List<CodeLine> tail = other.code.subList(1, other.code.size());
76                for(CodeLine line: tail) {
77                        code.add(line);
78                }
79        }
80       
81        public String toStringIndented(int startingIndent) {
82                StringBuilder builder = new StringBuilder();
83               
84                int indent = startingIndent;
85                for(CodeLine codeLine: code) {
86                        indent += codeLine.relativeIndent;
87                        addIndentation(builder, indent);
88                        builder.append(codeLine.line);
89                        builder.append(NEWLINE);
90                }
91               
92                return builder.toString();
93        }
94       
95        //////////////////////////////////////////////////////////////
96        // static interface
97        /*
98        public static void addIndentation(int indent, StringBuilder builder) {
99               
100        }
101        */
102        public static void addIndentation(StringBuilder builder, int indent) {
103                for(int i=0; i<indent; i++) {
104                        builder.append(INDENT);
105                }
106        }
107       
108        public void betailLastLine(int amount) {
109                int lastIndex = code.size() - 1;
110                CodeLine last = code.remove(lastIndex);;
111               
112                String line = last.line;
113                String betailed = line.substring(0, line.length()-amount);
114
115                addLine(betailed, last.relativeIndent);
116        }
117
118}
Note: See TracBrowser for help on using the repository browser.