/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.lang.ecmascript; import org.mozilla.javascript.Context; import net.sourceforge.pmd.Rule; import net.sourceforge.pmd.lang.ParserOptions; import net.sourceforge.pmd.lang.rule.properties.BooleanProperty; import net.sourceforge.pmd.lang.rule.properties.EnumeratedProperty; import net.sourceforge.pmd.util.StringUtil; public class EcmascriptParserOptions extends ParserOptions { public enum Version { VERSION_DEFAULT("default", Context.VERSION_DEFAULT), VERSION_1_0("1.0", Context.VERSION_1_0), VERSION_1_1("1.1", Context.VERSION_1_1), VERSION_1_2("1.2", Context.VERSION_1_2), VERSION_1_3("1.3", Context.VERSION_1_3), VERSION_1_4("1.4", Context.VERSION_1_4), VERSION_1_5("1.5", Context.VERSION_1_5), VERSION_1_6("1.6", Context.VERSION_1_6), VERSION_1_7("1.7", Context.VERSION_1_7), VERSION_1_8("1.8", Context.VERSION_1_8); private final String name; private final int version; Version(String name, int version) { this.name = name; this.version = version; } public String getLabel() { return name; } public int getVersion() { return version; } } private static final String[] VERSION_LABELS = new String[] { Version.VERSION_DEFAULT.getLabel(), Version.VERSION_1_0.getLabel(), Version.VERSION_1_1.getLabel(), Version.VERSION_1_2.getLabel(), Version.VERSION_1_3.getLabel(), Version.VERSION_1_4.getLabel(), Version.VERSION_1_5.getLabel(), Version.VERSION_1_6.getLabel(), Version.VERSION_1_7.getLabel(), Version.VERSION_1_8.getLabel(), }; // Note: The UI order values are chosen to be larger than those built into // XPathRule. public static final BooleanProperty RECORDING_COMMENTS_DESCRIPTOR = new BooleanProperty("recordingComments", "Specifies that comments are produced in the AST.", Boolean.TRUE, 3.0f); public static final BooleanProperty RECORDING_LOCAL_JSDOC_COMMENTS_DESCRIPTOR = new BooleanProperty( "recordingLocalJsDocComments", "Specifies that JsDoc comments are produced in the AST.", Boolean.TRUE, 4.0f); public static final EnumeratedProperty<Version> RHINO_LANGUAGE_VERSION = new EnumeratedProperty<>( "rhinoLanguageVersion", "Specifies the Rhino Language Version to use for parsing. Defaults to Rhino default.", VERSION_LABELS, Version.values(), 0, 5.0f); private boolean recordingComments; private boolean recordingLocalJsDocComments; private Version rhinoLanguageVersion; public EcmascriptParserOptions() { this.recordingComments = RECORDING_COMMENTS_DESCRIPTOR.defaultValue().booleanValue(); this.recordingLocalJsDocComments = RECORDING_LOCAL_JSDOC_COMMENTS_DESCRIPTOR.defaultValue().booleanValue(); this.rhinoLanguageVersion = (Version) RHINO_LANGUAGE_VERSION .valueFrom((String) RHINO_LANGUAGE_VERSION.defaultValue()); } public EcmascriptParserOptions(Rule rule) { this.recordingComments = rule.getProperty(RECORDING_COMMENTS_DESCRIPTOR); this.recordingLocalJsDocComments = rule.getProperty(RECORDING_LOCAL_JSDOC_COMMENTS_DESCRIPTOR); this.rhinoLanguageVersion = (Version) RHINO_LANGUAGE_VERSION .valueFrom((String) rule.getProperty(RHINO_LANGUAGE_VERSION)); } public boolean isRecordingComments() { return this.recordingComments; } public void setRecordingComments(boolean recordingComments) { this.recordingComments = recordingComments; } public boolean isRecordingLocalJsDocComments() { return this.recordingLocalJsDocComments; } public void setRecordingLocalJsDocComments(boolean recordingLocalJsDocComments) { this.recordingLocalJsDocComments = recordingLocalJsDocComments; } public Version getRhinoLanguageVersion() { return this.rhinoLanguageVersion; } public void setRhinoLanguageVersion(Version rhinoLanguageVersion) { this.rhinoLanguageVersion = rhinoLanguageVersion; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + (recordingComments ? 1231 : 1237); result = prime * result + (recordingLocalJsDocComments ? 1231 : 1237); result = prime * result + ((rhinoLanguageVersion == null) ? 0 : rhinoLanguageVersion.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } final EcmascriptParserOptions that = (EcmascriptParserOptions) obj; return StringUtil.isSame(this.suppressMarker, that.suppressMarker, false, false, false) && this.recordingComments == that.recordingComments && this.recordingLocalJsDocComments == that.recordingLocalJsDocComments && this.rhinoLanguageVersion == that.rhinoLanguageVersion; } }