java syntax parser
[javainspect.git] / src / main / java / eu / svjatoslav / inspector / java / methods / JavaFile.java
1 package eu.svjatoslav.inspector.java.methods;
2
3 import java.io.BufferedReader;
4 import java.io.File;
5 import java.io.FileNotFoundException;
6 import java.io.FileReader;
7 import java.io.IOException;
8 import java.util.ArrayList;
9 import java.util.List;
10
11 import eu.svjatoslav.inspector.tokenizer.InvalidSyntaxException;
12 import eu.svjatoslav.inspector.tokenizer.Tokenizer;
13 import eu.svjatoslav.inspector.tokenizer.TokenizerMatch;
14
15 public class JavaFile {
16
17         private final List<Import> imports = new ArrayList<Import>();
18
19         private String packageName;
20
21         private final File file;
22
23         StringBuffer contents = new StringBuffer();
24
25         public JavaFile(final File file) throws IOException, InvalidSyntaxException {
26                 this.file = file;
27                 parse();
28         }
29
30         public void parse() throws IOException, InvalidSyntaxException {
31                 System.out.println("java file: " + file);
32
33                 readFile();
34
35                 final Tokenizer tokenizer = new Tokenizer(contents.toString());
36                 tokenizer.addTerminator(" ", true);
37                 tokenizer.addTerminator("\t", true);
38                 tokenizer.addTerminator("\n", true);
39
40                 tokenizer.addTerminator(";", false);
41                 tokenizer.addTerminator("{", false);
42                 tokenizer.addTerminator("}", false);
43                 tokenizer.addTerminator("(", false);
44                 tokenizer.addTerminator(")", false);
45                 tokenizer.addTerminator("[", false);
46                 tokenizer.addTerminator("]", false);
47                 tokenizer.addTerminator("<", false);
48                 tokenizer.addTerminator(">", false);
49                 tokenizer.addTerminator(",", false);
50
51                 final Modifiers modifiers = new Modifiers();
52
53                 while (true) {
54                         final TokenizerMatch match = tokenizer.getToken();
55                         if (match == null)
56                                 break;
57
58                         if (match.token.equals("package")) {
59                                 parsePackage(tokenizer);
60                                 continue;
61                         }
62
63                         if (match.token.equals("import")) {
64                                 parseImport(tokenizer);
65                                 continue;
66                         }
67
68                         final boolean wasModifier = modifiers.parseModifier(match.token);
69                         if (wasModifier)
70                                 continue;
71
72                         if ("class".equals(match.token)) {
73                                 parseClass(tokenizer);
74                                 continue;
75                         }
76
77                         System.out.println("    " + modifiers.toString() + " "
78                                         + match.token);
79                         modifiers.reset();
80                         skipUntilSemicolon(tokenizer);
81                 }
82
83         }
84
85         private void parseClass(final Tokenizer tokenizer)
86                         throws InvalidSyntaxException {
87
88                 final TokenizerMatch match = tokenizer.getToken();
89                 final Clazz clazz = new Clazz(packageName, match.token, tokenizer);
90                 System.out.println(clazz.toString());
91
92         }
93
94         private void parseImport(final Tokenizer tokenizer)
95                         throws InvalidSyntaxException {
96
97                 final Import imp = new Import();
98
99                 final TokenizerMatch match = tokenizer.getToken();
100
101                 if (match.token.equals("static")) {
102                         imp.isStatic = true;
103                         imp.path = tokenizer.getToken().token;
104                 } else
105                         imp.path = match.token;
106
107                 imports.add(imp);
108
109                 tokenizer.expectToken(";");
110         }
111
112         private void parsePackage(final Tokenizer tokenizer)
113                         throws InvalidSyntaxException {
114
115                 final TokenizerMatch match = tokenizer.getToken();
116
117                 packageName = match.token;
118
119                 tokenizer.expectToken(";");
120         }
121
122         private void readFile() throws FileNotFoundException, IOException {
123                 final FileReader fileReader = new FileReader(file);
124
125                 final BufferedReader bufferedReader = new BufferedReader(fileReader);
126
127                 while (true) {
128                         final String line = bufferedReader.readLine();
129
130                         if (line == null)
131                                 break;
132
133                         contents.append(line);
134                         contents.append("\n");
135                 }
136
137                 bufferedReader.close();
138                 fileReader.close();
139         }
140
141         public void skipUntilSemicolon(final Tokenizer tokenizer) {
142                 while (true) {
143                         final TokenizerMatch token = tokenizer.getToken();
144                         if (token.token.equals(";"))
145                                 return;
146                 }
147         }
148
149 }