Skip to content

feat: add Clojure language support (tree-sitter + clojure-lsp) #169

@jafreck

Description

@jafreck

Summary

Add Clojure support via tree-sitter + LSP enrichment, complementing existing Java/Kotlin/Scala support in the JVM ecosystem.

Tooling

Component Tool Notes
Tree-sitter grammar tree-sitter-clojure Stable, well-tested
LSP server clojure-lsp Excellent, 1.5k+ stars, very active
SCIP indexer None N/A

What to implement

  • Add tree-sitter-clojure as an npm dependency
  • Create src/indexer/extractors/clojure.ts:
    • Extract (defn name ...) as function symbols
    • Extract (def name ...) as variable/constant symbols
    • Extract (defmacro name ...) as macro symbols
    • Extract (defprotocol Name ...) as interface symbols
    • Extract (defrecord Name ...) and (deftype Name ...) as class/type symbols
    • Extract (defmethod name dispatch-val ...) as method symbols
    • Extract function invocations (first element of list forms) as call refs
    • Extract (require '[ns.path :as alias]), (use ...), (import ...) as imports
    • Extract (ns name (:require ...)) namespace declaration
  • Register clojure in SourceIndexStage EXTRACTORS map and ParserPool LANG_PACKAGES
  • Add clojure-lsp to src/indexer/lsp/registry.ts: { command: 'clojure-lsp', args: [] }
  • Add file extensions .clj, .cljs, .cljc, .edn to walker
  • Add test fixtures in tests/fixtures/clojure/
  • Add extractor tests

Language notes

  • Clojure is homoiconic — code is data. Function calls are (function-name arg1 arg2) (first element of a list)
  • Namespace-qualified symbols: my.namespace/my-fn — the extractor should preserve the full qualified name and also record the bare name
  • .clj = JVM Clojure, .cljs = ClojureScript (JavaScript target), .cljc = reader conditionals (both targets)
  • Thread-first -> and thread-last ->> macros create call chains analogous to pipe operators
  • Multimethod dispatch (defmulti/defmethod) creates virtual-dispatch relationship edges
  • clojure-lsp provides excellent go-to-definition, find-references, and rename across namespaces

Context

Complements existing Java/Kotlin/Scala support. Clojure runs on the JVM and frequently interops with Java libraries. ClojureScript shares dependencies with JavaScript/TypeScript projects.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions