001: /*
002: * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
003: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004: *
005: * This code is free software; you can redistribute it and/or modify it
006: * under the terms of the GNU General Public License version 2 only, as
007: * published by the Free Software Foundation. Sun designates this
008: * particular file as subject to the "Classpath" exception as provided
009: * by Sun in the LICENSE file that accompanied this code.
010: *
011: * This code is distributed in the hope that it will be useful, but WITHOUT
012: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014: * version 2 for more details (a copy is included in the LICENSE file that
015: * accompanied this code).
016: *
017: * You should have received a copy of the GNU General Public License version
018: * 2 along with this work; if not, write to the Free Software Foundation,
019: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020: *
021: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022: * CA 95054 USA or visit www.sun.com if you need additional information or
023: * have any questions.
024: */
025:
026: package com.sun.tools.javac.main;
027:
028: import com.sun.tools.javac.util.Log;
029: import com.sun.tools.javac.util.Options;
030: import com.sun.tools.javac.util.Version;
031: import java.io.PrintWriter;
032:
033: /**
034: * TODO: describe com.sun.tools.javac.main.JavacOption
035: *
036: * <p><b>This is NOT part of any API supported by Sun Microsystems.
037: * If you write code that depends on this, you do so at your own
038: * risk. This code and its internal interfaces are subject to change
039: * or deletion without notice.</b></p>
040: */
041: @Version("@(#)JavacOption.java 1.7 07/05/05")
042: public interface JavacOption {
043:
044: OptionKind getKind();
045:
046: /** Does this option take a (separate) operand? */
047: boolean hasArg();
048:
049: /** Does argument string match option pattern?
050: * @param arg The command line argument string.
051: */
052: boolean matches(String arg);
053:
054: /** Process the option (with arg). Return true if error detected.
055: */
056: boolean process(Options options, String option, String arg);
057:
058: /** Process the option (without arg). Return true if error detected.
059: */
060: boolean process(Options options, String option);
061:
062: OptionName getName();
063:
064: enum OptionKind {
065: NORMAL, EXTENDED, HIDDEN,
066: }
067:
068: /** This class represents an option recognized by the main program
069: */
070: static class Option implements JavacOption {
071:
072: /** Option string.
073: */
074: OptionName name;
075:
076: /** Documentation key for arguments.
077: */
078: String argsNameKey;
079:
080: /** Documentation key for description.
081: */
082: String descrKey;
083:
084: /** Suffix option (-foo=bar or -foo:bar)
085: */
086: boolean hasSuffix;
087:
088: Option(OptionName name, String argsNameKey, String descrKey) {
089: this .name = name;
090: this .argsNameKey = argsNameKey;
091: this .descrKey = descrKey;
092: char lastChar = name.optionName.charAt(name.optionName
093: .length() - 1);
094: hasSuffix = lastChar == ':' || lastChar == '=';
095: }
096:
097: Option(OptionName name, String descrKey) {
098: this (name, null, descrKey);
099: }
100:
101: public String toString() {
102: return name.optionName;
103: }
104:
105: /** Does this option take a (separate) operand?
106: */
107: public boolean hasArg() {
108: return argsNameKey != null && !hasSuffix;
109: }
110:
111: /** Does argument string match option pattern?
112: * @param arg The command line argument string.
113: */
114: public boolean matches(String arg) {
115: return hasSuffix ? arg.startsWith(name.optionName) : arg
116: .equals(name.optionName);
117: }
118:
119: /** Print a line of documentation describing this option, if standard.
120: */
121: void help(PrintWriter out) {
122: String s = " " + helpSynopsis();
123: out.print(s);
124: for (int j = s.length(); j < 29; j++)
125: out.print(" ");
126: Log.printLines(out, Main.getLocalizedString(descrKey));
127: }
128:
129: String helpSynopsis() {
130: return name
131: + (argsNameKey == null ? "" : ((hasSuffix ? ""
132: : " ") + Main
133: .getLocalizedString(argsNameKey)));
134: }
135:
136: /** Print a line of documentation describing this option, if non-standard.
137: */
138: void xhelp(PrintWriter out) {
139: }
140:
141: /** Process the option (with arg). Return true if error detected.
142: */
143: public boolean process(Options options, String option,
144: String arg) {
145: if (options != null)
146: options.put(option, arg);
147: return false;
148: }
149:
150: /** Process the option (without arg). Return true if error detected.
151: */
152: public boolean process(Options options, String option) {
153: if (hasSuffix)
154: return process(options, name.optionName, option
155: .substring(name.optionName.length()));
156: else
157: return process(options, option, option);
158: }
159:
160: public OptionKind getKind() {
161: return OptionKind.NORMAL;
162: }
163:
164: public OptionName getName() {
165: return name;
166: }
167: };
168:
169: /** A nonstandard or extended (-X) option
170: */
171: static class XOption extends Option {
172: XOption(OptionName name, String argsNameKey, String descrKey) {
173: super (name, argsNameKey, descrKey);
174: }
175:
176: XOption(OptionName name, String descrKey) {
177: this (name, null, descrKey);
178: }
179:
180: void help(PrintWriter out) {
181: }
182:
183: void xhelp(PrintWriter out) {
184: super .help(out);
185: }
186:
187: public OptionKind getKind() {
188: return OptionKind.EXTENDED;
189: }
190: };
191:
192: /** A hidden (implementor) option
193: */
194: static class HiddenOption extends Option {
195: HiddenOption(OptionName name) {
196: super (name, null, null);
197: }
198:
199: HiddenOption(OptionName name, String argsNameKey) {
200: super (name, argsNameKey, null);
201: }
202:
203: void help(PrintWriter out) {
204: }
205:
206: void xhelp(PrintWriter out) {
207: }
208:
209: public OptionKind getKind() {
210: return OptionKind.HIDDEN;
211: }
212: };
213:
214: }
|