{"record":{"id":"b43c7fa97ab7d1d9","repo":"oxc-project/oxc","slug":"accessor-pair-getter-key-and-setter-key-should","errorCode":null,"errorMessage":"Accessor pair {getter_key} and {setter_key} should be grouped.","messagePattern":"Accessor pair (.+?) and (.+?) should be grouped\\.","errorType":"validation","errorClass":"OxcDiagnostic","httpStatus":null,"severity":"warning","filePath":"crates/oxc_linter/src/rules/eslint/grouped_accessor_pairs.rs","lineNumber":35,"sourceCode":"use serde::{Deserialize, Serialize};\nuse serde_json::Value;\n\nuse crate::{\n    AstNode,\n    context::LintContext,\n    rule::{Rule, TupleRuleConfig},\n};\n\nfn grouped_accessor_pairs_diagnostic(\n    getter_span: Span,\n    getter_key: &str,\n    setter_span: Span,\n    setter_key: &str,\n    msg: String,\n) -> OxcDiagnostic {\n    let getter_label_span = getter_span.label(format!(\"{getter_key} is here\"));\n    let setter_label_span = setter_span.label(format!(\"{setter_key} is here\"));\n    OxcDiagnostic::warn(msg)\n        .with_help(\"Require grouped accessor pairs in object literals and classes\")\n        .with_labels([getter_label_span, setter_label_span])\n}\n\n#[derive(Debug, Default, PartialEq, Clone, Copy, JsonSchema, Serialize, Deserialize)]\n#[serde(rename_all = \"camelCase\")]\nenum PairOrder {\n    /// Accessors can be in any order. This is the default.\n    #[default]\n    AnyOrder,\n    /// Getters must come before setters.\n    GetBeforeSet,\n    /// Setters must come before getters.\n    SetBeforeGet,\n}\n\n#[derive(Debug, Default, Clone, JsonSchema, Serialize, Deserialize)]\n#[serde(rename_all = \"camelCase\", default)]","sourceCodeStart":17,"sourceCodeEnd":53,"githubUrl":"https://github.com/oxc-project/oxc/blob/e1e7af627c8843ab64044ed466b128fcc21a035b/crates/oxc_linter/src/rules/eslint/grouped_accessor_pairs.rs#L17-L53","documentation":"Oxlint's port of the ESLint rule grouped-accessor-pairs (crates/oxc_linter/src/rules/eslint/grouped_accessor_pairs.rs:29): when a property has both a getter and a setter (in an object literal or class body), they must be adjacent, and per the PairOrder enum optionally ordered — `anyOrder` (default, grouping only), `getBeforeSet`, or `setBeforeGet`. The diagnostic receives a prebuilt message plus both keys and spans, and labels each accessor with '{key} is here'.","triggerScenarios":"A `get value()` and `set value(v)` separated by other members in the same object literal or class under any mode; or accessors in the wrong order relative to a configured getBeforeSet/setBeforeGet.","commonSituations":"Large object literals where accessors drift apart as properties get inserted between them; enabling getBeforeSet on a codebase with mixed order; merging config objects.","solutions":["Move the getter and setter onto adjacent lines.","Order them to match the configured pairOrder (getBeforeSet is the common convention).","If grouping and order do not matter to the team, disable the rule."],"exampleFix":"// before\nconst cfg = {\n  get port() { return this._p; },\n  timeout: 30,\n  set port(v) { this._p = v; },\n};\n\n// after\nconst cfg = {\n  timeout: 30,\n  get port() { return this._p; },\n  set port(v) { this._p = v; },\n};","handlingStrategy":"validation","validationCode":"// .oxlintrc.json — enforce grouping plus getter-first order\n{\n  \"rules\": {\n    \"grouped-accessor-pairs\": [\"warn\", \"getBeforeSet\"]\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Write getter and setter back-to-back when introducing a property.","When inserting new members, append them outside accessor pairs rather than between.","Adopt getBeforeSet (or setBeforeGet) team-wide so ordering is mechanical."],"tags":["eslint","oxlint","getter","setter","accessors","style"],"backgroundTag":"grouped-accessor-pairs","analyzedSha":"e1e7af627c8843ab64044ed466b128fcc21a035b","analyzedAt":"2026-08-20T07:01:07.079Z","contentChangedAt":"2026-08-20T07:01:07.079Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}