From 5de8662b50a1475607278b07ce00825e8da5f4a0 Mon Sep 17 00:00:00 2001 From: Luke VanderHart and Ghadi Shayban Date: Fri, 26 Oct 2012 11:51:03 -0400 Subject: [PATCH] CLJ-706: Add compiler warning when using deprecated vars --- src/clj/clojure/core.clj | 6 ++++++ src/clj/clojure/main.clj | 9 +++++---- src/jvm/clojure/lang/Compiler.java | 6 ++++++ src/jvm/clojure/lang/RT.java | 4 ++++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj index f03c638..0436209 100644 --- a/src/clj/clojure/core.clj +++ b/src/clj/clojure/core.clj @@ -5805,6 +5805,12 @@ Defaults to false." {:added "1.0"}) +(add-doc-and-meta *warn-on-deprecation* + "When set to true, the compiler will emit warnings when resolving a + var which has a true value for :deprecated in its metadata map. + + Defaults to true." {:added "1.6"}) + (add-doc-and-meta *compile-path* "Specifies the directory where 'compile' will write out .class files. This directory must be in the classpath for 'compile' to diff --git a/src/clj/clojure/main.clj b/src/clj/clojure/main.clj index ec1bcf7..2328d22 100644 --- a/src/clj/clojure/main.clj +++ b/src/clj/clojure/main.clj @@ -83,13 +83,14 @@ (defmacro with-bindings - "Executes body in the context of thread-local bindings for several vars - that often need to be set!: *ns* *warn-on-reflection* *math-context* - *print-meta* *print-length* *print-level* *compile-path* - *command-line-args* *1 *2 *3 *e" + "Executes body in the context of thread-local bindings for several + vars that often need to be set!: *ns* *warn-on-reflection* + *warn-on-deprecation* *math-context* *print-meta* *print-length* + *print-level* *compile-path* *command-line-args* *1 *2 *3 *e" [& body] `(binding [*ns* *ns* *warn-on-reflection* *warn-on-reflection* + *warn-on-deprecation* *warn-on-deprecation* *math-context* *math-context* *print-meta* *print-meta* *print-length* *print-length* diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index 7eda658..6b042cf 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -6782,6 +6782,10 @@ private static Expr analyzeSymbol(Symbol sym) { Var v = (Var) o; if(isMacro(v) != null) throw Util.runtimeException("Can't take value of a macro: " + v); + if(RT.booleanCast(RT.WARN_ON_DEPRECATION.deref()) && RT.booleanCast(RT.get(v.meta(),RT.DEPRECATED_KEY))) + { + RT.errPrintWriter().format("Deprecation warning: var %s is tagged as deprecated\n", v); + } if(RT.booleanCast(RT.get(v.meta(),RT.CONST_KEY))) return analyze(C.EXPRESSION, RT.list(QUOTE, v.get())); registerVar(v); @@ -7051,6 +7055,7 @@ public static Object load(Reader rdr, String sourcePath, String sourceName) { COLUMN_AFTER, pushbackReader.getColumnNumber() ,RT.UNCHECKED_MATH, RT.UNCHECKED_MATH.deref() ,RT.WARN_ON_REFLECTION, RT.WARN_ON_REFLECTION.deref() + ,RT.WARN_ON_DEPRECATION, RT.WARN_ON_DEPRECATION.deref() ,RT.DATA_READERS, RT.DATA_READERS.deref() )); @@ -7187,6 +7192,7 @@ public static Object compile(Reader rdr, String sourcePath, String sourceName) t VARS, PersistentHashMap.EMPTY ,RT.UNCHECKED_MATH, RT.UNCHECKED_MATH.deref() ,RT.WARN_ON_REFLECTION, RT.WARN_ON_REFLECTION.deref() + ,RT.WARN_ON_DEPRECATION, RT.WARN_ON_DEPRECATION.deref() ,RT.DATA_READERS, RT.DATA_READERS.deref() // ,LOADER, RT.makeClassLoader() )); diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 3349813..8ca6a9e 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -188,6 +188,7 @@ final static public Var ERR = new PrintWriter(new OutputStreamWriter(System.err), true)).setDynamic(); final static Keyword TAG_KEY = Keyword.intern(null, "tag"); final static Keyword CONST_KEY = Keyword.intern(null, "const"); +final static Keyword DEPRECATED_KEY = Keyword.intern(null, "deprecated"); final static public Var AGENT = Var.intern(CLOJURE_NS, Symbol.intern("*agent*"), null).setDynamic(); static Object readeval = readTrueFalseUnknown(System.getProperty("clojure.read.eval","true")); final static public Var READEVAL = Var.intern(CLOJURE_NS, Symbol.intern("*read-eval*"), readeval).setDynamic(); @@ -224,6 +225,7 @@ final static Var PRINT_META = Var.intern(CLOJURE_NS, Symbol.intern("*print-meta* final static Var PRINT_READABLY = Var.intern(CLOJURE_NS, Symbol.intern("*print-readably*"), T).setDynamic(); final static Var PRINT_DUP = Var.intern(CLOJURE_NS, Symbol.intern("*print-dup*"), F).setDynamic(); final static Var WARN_ON_REFLECTION = Var.intern(CLOJURE_NS, Symbol.intern("*warn-on-reflection*"), F).setDynamic(); +final static Var WARN_ON_DEPRECATION = Var.intern(CLOJURE_NS, Symbol.intern("*warn-on-deprecation*"), T).setDynamic(); final static Var ALLOW_UNRESOLVED_VARS = Var.intern(CLOJURE_NS, Symbol.intern("*allow-unresolved-vars*"), F).setDynamic(); final static Var IN_NS_VAR = Var.intern(CLOJURE_NS, Symbol.intern("in-ns"), F); @@ -426,6 +428,7 @@ static public void load(String scriptbase, boolean failIfNotFound) throws IOExce Var.pushThreadBindings( RT.mapUniqueKeys(CURRENT_NS, CURRENT_NS.deref(), WARN_ON_REFLECTION, WARN_ON_REFLECTION.deref() + ,WARN_ON_DEPRECATION, WARN_ON_DEPRECATION.deref() ,RT.UNCHECKED_MATH, RT.UNCHECKED_MATH.deref())); loaded = (loadClassForName(scriptbase.replace('/', '.') + LOADER_SUFFIX) != null); } @@ -449,6 +452,7 @@ static void doInit() throws ClassNotFoundException, IOException{ Var.pushThreadBindings( RT.mapUniqueKeys(CURRENT_NS, CURRENT_NS.deref(), WARN_ON_REFLECTION, WARN_ON_REFLECTION.deref() + ,WARN_ON_DEPRECATION, WARN_ON_DEPRECATION.deref() ,RT.UNCHECKED_MATH, RT.UNCHECKED_MATH.deref())); try { Symbol USER = Symbol.intern("user"); -- 1.8.0