109 for (String a: aliases) {
110 if (a.equals(opt))
111 return true;
112 }
113 return false;
114 }
115
116 boolean ignoreRest() {
117 return false;
118 }
119
120 abstract void process(JavapTask task, String opt, String arg) throws BadArgs;
121
122 final boolean hasArg;
123 final String[] aliases;
124 }
125
126 static final Option[] recognizedOptions = {
127
128 new Option(false, "-help", "--help", "-?") {
129 void process(JavapTask task, String opt, String arg) {
130 task.options.help = true;
131 }
132 },
133
134 new Option(false, "-version") {
135 void process(JavapTask task, String opt, String arg) {
136 task.options.version = true;
137 }
138 },
139
140 new Option(false, "-fullversion") {
141 void process(JavapTask task, String opt, String arg) {
142 task.options.fullVersion = true;
143 }
144 },
145
146 new Option(false, "-v", "-verbose", "-all") {
147 void process(JavapTask task, String opt, String arg) {
148 task.options.verbose = true;
149 task.options.showDescriptors = true;
150 task.options.showFlags = true;
151 task.options.showAllAttrs = true;
152 }
153 },
154
155 new Option(false, "-l") {
156 void process(JavapTask task, String opt, String arg) {
157 task.options.showLineAndLocalVariableTables = true;
158 }
159 },
160
161 new Option(false, "-public") {
162 void process(JavapTask task, String opt, String arg) {
163 task.options.accessOptions.add(opt);
164 task.options.showAccess = AccessFlags.ACC_PUBLIC;
165 }
166 },
167
168 new Option(false, "-protected") {
169 void process(JavapTask task, String opt, String arg) {
170 task.options.accessOptions.add(opt);
171 task.options.showAccess = AccessFlags.ACC_PROTECTED;
172 }
173 },
174
175 new Option(false, "-package") {
176 void process(JavapTask task, String opt, String arg) {
177 task.options.accessOptions.add(opt);
178 task.options.showAccess = 0;
179 }
180 },
181
182 new Option(false, "-p", "-private") {
183 void process(JavapTask task, String opt, String arg) {
184 if (!task.options.accessOptions.contains("-p") &&
185 !task.options.accessOptions.contains("-private")) {
186 task.options.accessOptions.add(opt);
187 }
188 task.options.showAccess = AccessFlags.ACC_PRIVATE;
189 }
190 },
191
192 new Option(false, "-c") {
193 void process(JavapTask task, String opt, String arg) {
194 task.options.showDisassembled = true;
195 }
196 },
197
198 new Option(false, "-s") {
199 void process(JavapTask task, String opt, String arg) {
200 task.options.showDescriptors = true;
201 }
202 },
203
204 new Option(false, "-sysinfo") {
205 void process(JavapTask task, String opt, String arg) {
206 task.options.sysInfo = true;
207 }
208 },
209
210 new Option(false, "-XDdetails") {
211 void process(JavapTask task, String opt, String arg) {
212 task.options.details = EnumSet.allOf(InstructionDetailWriter.Kind.class);
213 }
214
215 },
216
217 new Option(false, "-XDdetails:") {
218 @Override
219 boolean matches(String opt) {
220 int sep = opt.indexOf(":");
221 return sep != -1 && super.matches(opt.substring(0, sep + 1));
222 }
223
224 void process(JavapTask task, String opt, String arg) throws BadArgs {
225 int sep = opt.indexOf(":");
226 for (String v: opt.substring(sep + 1).split("[,: ]+")) {
227 if (!handleArg(task, v))
228 throw task.new BadArgs("err.invalid.arg.for.option", v);
229 }
230 }
231
232 boolean handleArg(JavapTask task, String arg) {
233 if (arg.length() == 0)
234 return true;
235
236 if (arg.equals("all")) {
237 task.options.details = EnumSet.allOf(InstructionDetailWriter.Kind.class);
238 return true;
239 }
240
241 boolean on = true;
242 if (arg.startsWith("-")) {
243 on = false;
244 arg = arg.substring(1);
245 }
246
247 for (InstructionDetailWriter.Kind k: InstructionDetailWriter.Kind.values()) {
248 if (arg.equalsIgnoreCase(k.option)) {
249 if (on)
250 task.options.details.add(k);
251 else
252 task.options.details.remove(k);
253 return true;
254 }
255 }
256 return false;
257 }
258 },
259
260 new Option(false, "-constants") {
261 void process(JavapTask task, String opt, String arg) {
262 task.options.showConstants = true;
263 }
264 },
265
266 new Option(false, "-XDinner") {
267 void process(JavapTask task, String opt, String arg) {
268 task.options.showInnerClasses = true;
269 }
270 },
271
272 new Option(false, "-XDindent:") {
273 @Override
274 boolean matches(String opt) {
275 int sep = opt.indexOf(":");
276 return sep != -1 && super.matches(opt.substring(0, sep + 1));
277 }
278
279 void process(JavapTask task, String opt, String arg) throws BadArgs {
280 int sep = opt.indexOf(":");
281 try {
282 int i = Integer.valueOf(opt.substring(sep + 1));
283 if (i > 0) // silently ignore invalid values
284 task.options.indentWidth = i;
285 } catch (NumberFormatException e) {
286 }
287 }
288 },
289
290 new Option(false, "-XDtab:") {
291 @Override
292 boolean matches(String opt) {
293 int sep = opt.indexOf(":");
294 return sep != -1 && super.matches(opt.substring(0, sep + 1));
295 }
296
297 void process(JavapTask task, String opt, String arg) throws BadArgs {
298 int sep = opt.indexOf(":");
299 try {
300 int i = Integer.valueOf(opt.substring(sep + 1));
301 if (i > 0) // silently ignore invalid values
302 task.options.tabColumn = i;
303 } catch (NumberFormatException e) {
304 }
305 }
306 },
307
308 new Option(true, "-m") {
309 @Override
310 void process(JavapTask task, String opt, String arg) throws BadArgs {
311 task.options.moduleName = arg;
312 }
313 }
314
315 };
316
317 public JavapTask() {
318 context = new Context();
319 context.put(Messages.class, this);
320 options = Options.instance(context);
321 attributeFactory = new Attribute.Factory();
322 }
323
324 public JavapTask(Writer out,
325 JavaFileManager fileManager,
326 DiagnosticListener<? super JavaFileObject> diagnosticListener) {
327 this();
328 this.log = getPrintWriterForWriter(out);
912 Location result = null;
913 for (Location l: set) {
914 String name = fileManager.inferModuleName(l);
915 if (name.equals(moduleName)) {
916 if (result == null)
917 result = l;
918 else
919 throw new IOException("multiple definitions found for " + moduleName);
920 }
921 }
922 if (result != null)
923 return result;
924 }
925 }
926 return null;
927 }
928
929 private void showHelp() {
930 printLines(getMessage("main.usage", progname));
931 for (Option o: recognizedOptions) {
932 String name = o.aliases[0].substring(1); // there must always be at least one name
933 if (name.startsWith("X") || name.equals("fullversion") || name.equals("h") || name.equals("verify"))
934 continue;
935 printLines(getMessage("main.opt." + name));
936 }
937 String[] fmOptions = {
938 "-classpath", "-cp", "-bootclasspath",
939 "-upgrademodulepath", "-system", "-modulepath" };
940 for (String o: fmOptions) {
941 if (fileManager.isSupportedOption(o) == -1)
942 continue;
943 String name = o.substring(1);
944 printLines(getMessage("main.opt." + name));
945 }
946
947 }
948
949 private void showVersion(boolean full) {
950 printLines(version(full ? "full" : "release"));
951 }
952
953 private void printLines(String msg) {
954 log.println(msg.replace("\n", nl));
955 }
956
957 private static final String nl = System.getProperty("line.separator");
958
959 private static final String versionRBName = "com.sun.tools.javap.resources.version";
960 private static ResourceBundle versionRB;
961
962 private String version(String key) {
963 // key=version: mm.nn.oo[-milestone]
964 // key=full: mm.mm.oo[-milestone]-build
965 if (versionRB == null) {
966 try {
|
109 for (String a: aliases) {
110 if (a.equals(opt))
111 return true;
112 }
113 return false;
114 }
115
116 boolean ignoreRest() {
117 return false;
118 }
119
120 abstract void process(JavapTask task, String opt, String arg) throws BadArgs;
121
122 final boolean hasArg;
123 final String[] aliases;
124 }
125
126 static final Option[] recognizedOptions = {
127
128 new Option(false, "-help", "--help", "-?") {
129 @Override
130 void process(JavapTask task, String opt, String arg) {
131 task.options.help = true;
132 }
133 },
134
135 new Option(false, "-version") {
136 @Override
137 void process(JavapTask task, String opt, String arg) {
138 task.options.version = true;
139 }
140 },
141
142 new Option(false, "-fullversion") {
143 @Override
144 void process(JavapTask task, String opt, String arg) {
145 task.options.fullVersion = true;
146 }
147 },
148
149 new Option(false, "-v", "-verbose", "-all") {
150 @Override
151 void process(JavapTask task, String opt, String arg) {
152 task.options.verbose = true;
153 task.options.showDescriptors = true;
154 task.options.showFlags = true;
155 task.options.showAllAttrs = true;
156 }
157 },
158
159 new Option(false, "-l") {
160 @Override
161 void process(JavapTask task, String opt, String arg) {
162 task.options.showLineAndLocalVariableTables = true;
163 }
164 },
165
166 new Option(false, "-public") {
167 @Override
168 void process(JavapTask task, String opt, String arg) {
169 task.options.accessOptions.add(opt);
170 task.options.showAccess = AccessFlags.ACC_PUBLIC;
171 }
172 },
173
174 new Option(false, "-protected") {
175 @Override
176 void process(JavapTask task, String opt, String arg) {
177 task.options.accessOptions.add(opt);
178 task.options.showAccess = AccessFlags.ACC_PROTECTED;
179 }
180 },
181
182 new Option(false, "-package") {
183 @Override
184 void process(JavapTask task, String opt, String arg) {
185 task.options.accessOptions.add(opt);
186 task.options.showAccess = 0;
187 }
188 },
189
190 new Option(false, "-p", "-private") {
191 @Override
192 void process(JavapTask task, String opt, String arg) {
193 if (!task.options.accessOptions.contains("-p") &&
194 !task.options.accessOptions.contains("-private")) {
195 task.options.accessOptions.add(opt);
196 }
197 task.options.showAccess = AccessFlags.ACC_PRIVATE;
198 }
199 },
200
201 new Option(false, "-c") {
202 @Override
203 void process(JavapTask task, String opt, String arg) {
204 task.options.showDisassembled = true;
205 }
206 },
207
208 new Option(false, "-s") {
209 @Override
210 void process(JavapTask task, String opt, String arg) {
211 task.options.showDescriptors = true;
212 }
213 },
214
215 new Option(false, "-sysinfo") {
216 @Override
217 void process(JavapTask task, String opt, String arg) {
218 task.options.sysInfo = true;
219 }
220 },
221
222 new Option(false, "-XDdetails") {
223 @Override
224 void process(JavapTask task, String opt, String arg) {
225 task.options.details = EnumSet.allOf(InstructionDetailWriter.Kind.class);
226 }
227
228 },
229
230 new Option(false, "-XDdetails:") {
231 @Override
232 boolean matches(String opt) {
233 int sep = opt.indexOf(":");
234 return sep != -1 && super.matches(opt.substring(0, sep + 1));
235 }
236
237 @Override
238 void process(JavapTask task, String opt, String arg) throws BadArgs {
239 int sep = opt.indexOf(":");
240 for (String v: opt.substring(sep + 1).split("[,: ]+")) {
241 if (!handleArg(task, v))
242 throw task.new BadArgs("err.invalid.arg.for.option", v);
243 }
244 }
245
246 boolean handleArg(JavapTask task, String arg) {
247 if (arg.length() == 0)
248 return true;
249
250 if (arg.equals("all")) {
251 task.options.details = EnumSet.allOf(InstructionDetailWriter.Kind.class);
252 return true;
253 }
254
255 boolean on = true;
256 if (arg.startsWith("-")) {
257 on = false;
258 arg = arg.substring(1);
259 }
260
261 for (InstructionDetailWriter.Kind k: InstructionDetailWriter.Kind.values()) {
262 if (arg.equalsIgnoreCase(k.option)) {
263 if (on)
264 task.options.details.add(k);
265 else
266 task.options.details.remove(k);
267 return true;
268 }
269 }
270 return false;
271 }
272 },
273
274 new Option(false, "-constants") {
275 @Override
276 void process(JavapTask task, String opt, String arg) {
277 task.options.showConstants = true;
278 }
279 },
280
281 new Option(false, "-XDinner") {
282 @Override
283 void process(JavapTask task, String opt, String arg) {
284 task.options.showInnerClasses = true;
285 }
286 },
287
288 new Option(false, "-XDindent:") {
289 @Override
290 boolean matches(String opt) {
291 int sep = opt.indexOf(":");
292 return sep != -1 && super.matches(opt.substring(0, sep + 1));
293 }
294
295 @Override
296 void process(JavapTask task, String opt, String arg) throws BadArgs {
297 int sep = opt.indexOf(":");
298 try {
299 int i = Integer.valueOf(opt.substring(sep + 1));
300 if (i > 0) // silently ignore invalid values
301 task.options.indentWidth = i;
302 } catch (NumberFormatException e) {
303 }
304 }
305 },
306
307 new Option(false, "-XDtab:") {
308 @Override
309 boolean matches(String opt) {
310 int sep = opt.indexOf(":");
311 return sep != -1 && super.matches(opt.substring(0, sep + 1));
312 }
313
314 @Override
315 void process(JavapTask task, String opt, String arg) throws BadArgs {
316 int sep = opt.indexOf(":");
317 try {
318 int i = Integer.valueOf(opt.substring(sep + 1));
319 if (i > 0) // silently ignore invalid values
320 task.options.tabColumn = i;
321 } catch (NumberFormatException e) {
322 }
323 }
324 },
325
326 new Option(true, "--module", "-m") {
327 @Override
328 void process(JavapTask task, String opt, String arg) throws BadArgs {
329 task.options.moduleName = arg;
330 }
331 }
332
333 };
334
335 public JavapTask() {
336 context = new Context();
337 context.put(Messages.class, this);
338 options = Options.instance(context);
339 attributeFactory = new Attribute.Factory();
340 }
341
342 public JavapTask(Writer out,
343 JavaFileManager fileManager,
344 DiagnosticListener<? super JavaFileObject> diagnosticListener) {
345 this();
346 this.log = getPrintWriterForWriter(out);
930 Location result = null;
931 for (Location l: set) {
932 String name = fileManager.inferModuleName(l);
933 if (name.equals(moduleName)) {
934 if (result == null)
935 result = l;
936 else
937 throw new IOException("multiple definitions found for " + moduleName);
938 }
939 }
940 if (result != null)
941 return result;
942 }
943 }
944 return null;
945 }
946
947 private void showHelp() {
948 printLines(getMessage("main.usage", progname));
949 for (Option o: recognizedOptions) {
950 String name = o.aliases[0].replaceAll("^-+", "").replaceAll("-+", "_"); // there must always be at least one name
951 if (name.startsWith("X") || name.equals("fullversion") || name.equals("h") || name.equals("verify"))
952 continue;
953 printLines(getMessage("main.opt." + name));
954 }
955
956 String[] fmOptions = {
957 "--module-path", "--system",
958 "--class-path", "-classpath", "-cp",
959 "-bootclasspath"
960 };
961
962 for (String o: fmOptions) {
963 if (fileManager.isSupportedOption(o) == -1)
964 continue;
965 String name = o.replaceAll("^-+", "").replaceAll("-+", "_");
966 printLines(getMessage("main.opt." + name));
967 }
968
969 log.println(getMessage("main.usage.foot"));
970 }
971
972 private void showVersion(boolean full) {
973 printLines(version(full ? "full" : "release"));
974 }
975
976 private void printLines(String msg) {
977 log.println(msg.replace("\n", nl));
978 }
979
980 private static final String nl = System.getProperty("line.separator");
981
982 private static final String versionRBName = "com.sun.tools.javap.resources.version";
983 private static ResourceBundle versionRB;
984
985 private String version(String key) {
986 // key=version: mm.nn.oo[-milestone]
987 // key=full: mm.mm.oo[-milestone]-build
988 if (versionRB == null) {
989 try {
|