1 package net.sourceforge.pmd.lang.ecmascript;
2
3 import net.sourceforge.pmd.Rule;
4 import net.sourceforge.pmd.lang.ParserOptions;
5 import net.sourceforge.pmd.lang.rule.properties.BooleanProperty;
6 import net.sourceforge.pmd.lang.rule.properties.EnumeratedProperty;
7 import net.sourceforge.pmd.util.StringUtil;
8
9 import org.mozilla.javascript.Context;
10
11 public class EcmascriptParserOptions extends ParserOptions {
12
13 public enum Version {
14 VERSION_DEFAULT("default", Context.VERSION_DEFAULT),
15 VERSION_1_0("1.0", Context.VERSION_1_0),
16 VERSION_1_1("1.1", Context.VERSION_1_1),
17 VERSION_1_2("1.2", Context.VERSION_1_2),
18 VERSION_1_3("1.3", Context.VERSION_1_3),
19 VERSION_1_4("1.4", Context.VERSION_1_4),
20 VERSION_1_5("1.5", Context.VERSION_1_5),
21 VERSION_1_6("1.6", Context.VERSION_1_6),
22 VERSION_1_7("1.7", Context.VERSION_1_7),
23 VERSION_1_8("1.8", Context.VERSION_1_8);
24
25 private final String name;
26 private final int version;
27
28 private Version(String name, int version) {
29 this.name = name;
30 this.version = version;
31 }
32
33 public String getLabel() {
34 return name;
35 }
36
37 public int getVersion() {
38 return version;
39 }
40 };
41
42 private static final String[] VERSION_LABELS = new String[] { Version.VERSION_DEFAULT.getLabel(),
43 Version.VERSION_1_0.getLabel(), Version.VERSION_1_1.getLabel(), Version.VERSION_1_2.getLabel(),
44 Version.VERSION_1_3.getLabel(), Version.VERSION_1_4.getLabel(), Version.VERSION_1_5.getLabel(),
45 Version.VERSION_1_6.getLabel(), Version.VERSION_1_7.getLabel(), Version.VERSION_1_8.getLabel(), };
46
47
48 public static final BooleanProperty RECORDING_COMMENTS_DESCRIPTOR = new BooleanProperty("recordingComments",
49 "Specifies that comments are produced in the AST.", Boolean.TRUE, 3.0f);
50 public static final BooleanProperty RECORDING_LOCAL_JSDOC_COMMENTS_DESCRIPTOR = new BooleanProperty(
51 "recordingLocalJsDocComments", "Specifies that JsDoc comments are produced in the AST.", Boolean.TRUE, 4.0f);
52 public static final EnumeratedProperty<Version> RHINO_LANGUAGE_VERSION = new EnumeratedProperty<Version>(
53 "rhinoLanguageVersion",
54 "Specifies the Rhino Language Version to use for parsing. Defaults to Rhino default.", VERSION_LABELS,
55 Version.values(), 0, 5.0f);
56
57 private boolean recordingComments;
58 private boolean recordingLocalJsDocComments;
59 private Version rhinoLanguageVersion;
60
61 public EcmascriptParserOptions() {
62 this.recordingComments = RECORDING_COMMENTS_DESCRIPTOR.defaultValue().booleanValue();
63 this.recordingLocalJsDocComments = RECORDING_LOCAL_JSDOC_COMMENTS_DESCRIPTOR.defaultValue().booleanValue();
64 this.rhinoLanguageVersion = (Version) RHINO_LANGUAGE_VERSION.valueFrom((String) RHINO_LANGUAGE_VERSION
65 .defaultValue());
66 }
67
68 public EcmascriptParserOptions(Rule rule) {
69 this.recordingComments = rule.getProperty(RECORDING_COMMENTS_DESCRIPTOR);
70 this.recordingLocalJsDocComments = rule.getProperty(RECORDING_LOCAL_JSDOC_COMMENTS_DESCRIPTOR);
71 this.rhinoLanguageVersion = (Version) RHINO_LANGUAGE_VERSION.valueFrom((String) rule
72 .getProperty(RHINO_LANGUAGE_VERSION));
73 }
74
75 public boolean isRecordingComments() {
76 return this.recordingComments;
77 }
78
79 public void setRecordingComments(boolean recordingComments) {
80 this.recordingComments = recordingComments;
81 }
82
83 public boolean isRecordingLocalJsDocComments() {
84 return this.recordingLocalJsDocComments;
85 }
86
87 public void setRecordingLocalJsDocComments(boolean recordingLocalJsDocComments) {
88 this.recordingLocalJsDocComments = recordingLocalJsDocComments;
89 }
90
91 public Version getRhinoLanguageVersion() {
92 return this.rhinoLanguageVersion;
93 }
94
95 public void setRhinoLanguageVersion(Version rhinoLanguageVersion) {
96 this.rhinoLanguageVersion = rhinoLanguageVersion;
97 }
98
99 @Override
100 public int hashCode() {
101 final int prime = 31;
102 int result = super.hashCode();
103 result = prime * result + (recordingComments ? 1231 : 1237);
104 result = prime * result + (recordingLocalJsDocComments ? 1231 : 1237);
105 result = prime * result + ((rhinoLanguageVersion == null) ? 0 : rhinoLanguageVersion.hashCode());
106 return result;
107 }
108
109 @Override
110 public boolean equals(Object obj) {
111 if (this == obj) {
112 return true;
113 }
114 if (obj == null || getClass() != obj.getClass()) {
115 return false;
116 }
117 final EcmascriptParserOptions that = (EcmascriptParserOptions) obj;
118 return StringUtil.isSame(this.suppressMarker, that.suppressMarker, false, false, false)
119 && this.recordingComments == that.recordingComments
120 && this.recordingLocalJsDocComments == that.recordingLocalJsDocComments
121 && this.rhinoLanguageVersion == that.rhinoLanguageVersion;
122 }
123 }