{"id":15010229,"url":"https://github.com/clojure/clr.tools.analyzer","last_synced_at":"2025-10-19T22:30:36.798Z","repository":{"id":66759865,"uuid":"8753711","full_name":"clojure/clr.tools.analyzer","owner":"clojure","description":null,"archived":false,"fork":false,"pushed_at":"2024-07-15T18:07:22.000Z","size":132,"stargazers_count":3,"open_issues_count":0,"forks_count":6,"subscribers_count":27,"default_branch":"master","last_synced_at":"2025-01-30T06:32:23.492Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Clojure","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/clojure.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2013-03-13T14:15:36.000Z","updated_at":"2023-07-25T13:47:44.000Z","dependencies_parsed_at":"2024-10-07T11:50:19.889Z","dependency_job_id":"e319111e-d154-4f09-ba9e-d89369a4cc23","html_url":"https://github.com/clojure/clr.tools.analyzer","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clojure%2Fclr.tools.analyzer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clojure%2Fclr.tools.analyzer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clojure%2Fclr.tools.analyzer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clojure%2Fclr.tools.analyzer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/clojure","download_url":"https://codeload.github.com/clojure/clr.tools.analyzer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237221172,"owners_count":19274447,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-09-24T19:32:44.253Z","updated_at":"2025-10-19T22:30:31.500Z","avatar_url":"https://github.com/clojure.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Interface to ClojureCLR's Analyzer\n\nClojureCLR's analysis compilation phase holds rich information about Clojure forms, like type/reflection information.\n\n_analyze_ provides an interface to this phase, callable a la carte. The output is similar to ClojureScript's analyzer.\n\nSupports ClojureCLR 1.4.1 or later.\n\n# Contributing\n\nPull requests accepted from registered Clojure contributers\n\nhttp://clojure.org/contributing\n\n# Usage\n\n## Generating AST from syntax\n\n```clojure\n\nclojure.clr.tools.analyzer=\u003e (ast [1])\n{:op :constant, :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}}, :val [1]}\n\nclojure.clr.tools.analyzer=\u003e (-\u003e (ast (if true 1 2)) clojure.pprint/pprint)\n{:op :if,\n :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n :test\n {:op :boolean,\n  :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n  :val true},\n :then\n {:op :number,\n  :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n  :val 1},\n :else\n {:op :number,\n  :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n  :val 2}}\nnil\n\nclojure.clr.tools.analyzer=\u003e (-\u003e (ast (fn [x] (+ x 1))) clojure.pprint/pprint)\n{:op :meta,\n :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n :meta\n {:op :map,\n  :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n  :keyvals\n  ({:op :keyword,\n    :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n    :val :source-span}\n   {:op :map,\n    :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n    :keyvals\n    ({:op :keyword,\n      :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n      :val :start-line}\n     {:op :number,\n      :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n      :val 12}\n     {:op :keyword,\n      :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n      :val :start-column}\n     {:op :number,\n      :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n      :val 10}\n     {:op :keyword,\n      :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n      :val :end-line}\n     {:op :number,\n      :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n      :val 12}\n     {:op :keyword,\n      :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n      :val :end-column}\n     {:op :number,\n      :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n      :val 25})})},\n :expr\n {:name clojure.clr.tools.analyzer$fn__3171,\n  :op :fn-expr,\n  :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n  :methods\n  ({:op :fn-method,\n    :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n    :body\n    {:op :do,\n     :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n     :exprs\n     ({:op :static-method,\n       :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n       :class clojure.lang.Numbers,\n       :method\n       {:name add,\n        :return-type System.Object,\n        :declaring-class clojure.lang.Numbers,\n        :parameter-types [System.Object System.Int64],\n        :flags #{:hide-by-sig :reuse-slot :static :public}},\n       :args\n       ({:op :host-arg,\n         :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n         :expr\n         {:op :local-binding-expr,\n          :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n          :local-binding\n          {:op :local-binding,\n           :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n           :sym x,\n           :tag nil,\n           :init nil},\n          :tag nil}}\n        {:op :host-arg,\n         :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n         :expr\n         {:op :number,\n          :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n          :val 1}}),\n       :tag nil})},\n    :required-params\n    ({:op :local-binding,\n      :env {:locals {}, :ns {:name clojure.clr.tools.analyzer}},\n      :sym x,\n      :tag nil,\n      :init nil}),\n    :rest-param nil}),\n  :variadic-method nil,\n  :tag nil}}\nnil\n```\n\n## Syntax from AST\n\n\n```clojure\nclojure.jvm.tools.analyzer=\u003e (require '[clojure.jvm.tools.analyzer.emit-form :as e])\nnil\nclojure.jvm.tools.analyzer=\u003e (-\u003e (ast 1) e/emit-form)\n1\nclojure.jvm.tools.analyzer=\u003e (-\u003e (ast [(+ 1 2)]) e/emit-form)\n[(clojure.lang.Numbers/add 1 2)]\n```\n\n# Known Issues\n\n## Evaluating forms\n\nCurrently the analyzer evaluates each form after it is analyzed.\n\n## Incorrect handling of Var mappings within the same form\n\n`analyze` is a thin wrapper over `clojure.lang.Compiler`, so to get our\nhands on analysis results some compromises are made.\n\nThe following form normally evaluates to the Var `clojure.set/intersection`, but\nanalyses to `clojure.core/require`.\n\n\n```clojure\n;normal evaluation\n(eval\n '(do \n    (require '[clojure.set])\n    (refer 'clojure.set \n           :only '[intersection] \n           :rename '{intersection require})\n    require))\n;=\u003e #'clojure.set/intersection\n\n;analysis result\n(-\u003e (ast \n      (do (require '[clojure.set])\n        (refer 'clojure.set \n               :only '[intersection] \n               :rename '{intersection require})\n        require))\n  :exprs last :var)\n;=\u003e #'clojure.core/require\n```\n\n# Todo\n\n- analyze a leiningen `project.clj` file\n- analyze `clojure.core`\n- use :locals if necessary\n\n# Examples\n\nSee `clojure.jvm.tools.analyzer.examples.*` namespaces.\n\n# Contributors\n\n- Jonas Enlund (jonase)\n- Nicola Mometto (Bronsa)\n- Chris Gray (chrismgray)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclojure%2Fclr.tools.analyzer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclojure%2Fclr.tools.analyzer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclojure%2Fclr.tools.analyzer/lists"}