{"record":{"id":"b577bfdaedd4f3ea","repo":"karatelabs/karate","slug":"duplicate-private-name-name-in-class-body","errorCode":null,"errorMessage":"duplicate private name ${name} in class body","messagePattern":"duplicate private name (.+?) in class body","errorType":"exception","errorClass":"ParserException","httpStatus":null,"severity":"error","filePath":"karate-js/src/main/java/io/karatelabs/parser/JsParser.java","lineNumber":366,"sourceCode":"                }\n            }\n            if (key == null) {\n                continue;\n            }\n            String name = key.getText();\n            if (\"#constructor\".equals(name)) {\n                throw new ParserException(\"#constructor is a reserved private name\");\n            }\n            if (names == null) {\n                names = new HashSet<>(4);\n                kinds = new HashMap<>(4);\n            }\n            Integer prior = kinds.put(name, kind);\n            // a get/set pair at the same placement is the sole legal duplicate\n            boolean accessorPair = prior != null && (prior & 8) == (kind & 8)\n                    && (prior & 4) == 0 && (kind & 4) == 0 && ((prior & 3) | (kind & 3)) == 3;\n            if (prior != null && !accessorPair) {\n                throw new ParserException(\"duplicate private name \" + name + \" in class body\");\n            }\n            names.add(name);\n        }\n        return names == null ? parent : new PrivateScope(parent, names);\n    }\n\n    /**\n     * An enclosing label. {@code iteration} records whether the labelled statement is an\n     * iteration statement, which is what separates a legal {@code continue} target from a\n     * legal {@code break} target (§14.13.1). An immutable cons cell so {@link #earlyErrors}\n     * can thread the chain down without copying.\n     */\n    private record Label(String name, boolean iteration, Label next) {\n        static boolean contains(Label chain, String name, boolean iterationOnly) {\n            for (Label l = chain; l != null; l = l.next) {\n                if (l.name.equals(name) && (!iterationOnly || l.iteration)) {\n                    return true;\n                }","sourceCodeStart":348,"sourceCodeEnd":384,"githubUrl":"https://github.com/karatelabs/karate/blob/a22eb90246d958d15a47bf436693d0121ad2812d/karate-js/src/main/java/io/karatelabs/parser/JsParser.java#L348-L384","documentation":"Within one class body, each private name must be unique, except that a getter/setter pair at the same placement (both static or both instance) may share one name. classPrivateScope records every private member name and its kind bits; a re-declaration that is not a legal accessor pair is rejected.","triggerScenarios":"Declaring two private members with the same name in a class body — e.g. `class C { #x; #x() {} }`, duplicate `static #m` and `#m`, two methods, or a get/set pair mismatched in static-ness — detected when the second `kinds.put` returns a prior entry.","commonSituations":"Copy-paste duplication when adding private methods; accidentally adding a private field with the same name as an existing private method; moving a member between static/instance without removing the old one.","solutions":["Remove or rename one of the duplicate private declarations","If you want get/set semantics, make both members a matching accessor pair (same static-ness, one `get`, one `set`)","Ensure the accessor pair's static/instance placement matches — a static getter with an instance setter is still a duplicate"],"exampleFix":"// before\nclass C { get #v() { return this._v; } static set #v(x) { this._v = x; } }\n// after\nclass C { get #v() { return this._v; } set #v(x) { this._v = x; } }","handlingStrategy":"validation","validationCode":"// Detect duplicate private declarations in a class body:\nconst names = (body.match(/#\\w+/g) || []); const dup = names.filter((n,i)=>names.indexOf(n)!==i);","typeGuard":null,"tryCatchPattern":"try { eval(js); } catch (e) { if (String(e).includes('duplicate private name')) { /* rename or make a get/set pair */ } throw e; }","preventionTips":["Keep one declaration per private name; pair get/set only when intentional","Ensure accessor pairs share the same static/instance placement","Review copy-pasted class members for name collisions"],"tags":["javascript","parser","classes","duplicate-declaration"],"backgroundTag":"duplicate-declaration","analyzedSha":"a22eb90246d958d15a47bf436693d0121ad2812d","analyzedAt":"2026-09-12T09:01:00.220Z","contentChangedAt":"2026-09-12T09:01:00.220Z","schemaVersion":2},"datasetVersion":"2026-09-16T19:17:19.609Z"}