On Sunday, June 7, 2015 at 10:58:38 PM UTC+9, David Nolen wrote: > Still not quite enough information what is the code generated prior to > advanced compilation? > > > I suspect you need to supply the "@constructor" JSDoc. > > > David > > On Sunday, June 7, 2015, Alice Bellard <[email protected]> wrote: > On Saturday, June 6, 2015 at 11:24:58 PM UTC+9, David Nolen wrote: > > > It seems to me this problem can could be made more minimal than it is. As > > it is, it seems like Google Closure itself might be rewriting the code. I > > don't see any other way for a gensym to end up used over "this". > > > > > > > > > Need more information via a more minimal case. > > > > > > > > > > > > David > > > > > > > > > On Sat, Jun 6, 2015 at 5:56 AM, Dusan Miloradovic <[email protected]> > > wrote: > > > Sorry, I thought it was the well known issue. Here is the simplified macro: > > > > > > > > > > > > (defmacro custom-this [] > > > > > > (list 'js* "this") > > > > > > ) > > > > > > > > > > > > (defmacro test-comp > > > > > > [tsym tfields bsym & impls] > > > > > > `(defn ~tsym [~@tfields] > > > > > > ~@(map (fn[c] > > > > > > `(this-as this# > > > > > > (aset this# ~(str c) ~c))) tfields) > > > > > > ~(if (symbol? (first impls)) > > > > > > `(goog/base (custom-this)) > > > > > > (let [[constr-name params & bd] (first impls) > > > > > > mta (meta constr-name) > > > > > > ovrrd (when mta (= 'override (:tag mta))) > > > > > > thsym (gensym "this") > > > > > > ] > > > > > > `(this-as ~thsym > > > > > > ~(when-not ovrrd > > > > > > ;`(goog/base ~thsym ~@params) > > > > > > `(goog/base (custom-this) ~@params) > > > > > > ) > > > > > > ~@bd))) > > > > > > (this-as this## this##) > > > > > > ) > > > > > > ) > > > > > > > > > > > > and the test case in the cljs file: > > > > > > > > > > > > (mm/test-comp TestComponent [name] goog.ui.Component) > > > > > > > > > > > > generates the following js code: > > > > > > > > > > > > testns.TestComponent = (function testns$TestComponent(name){ > > > > > > var this__18400__auto___26494 = this; > > > > > > (this__18400__auto___26494["name"] = name); > > > > > > > > > > > > var this26491_26495 = this; > > > > > > var G__26493_26496 = this; > > > > > > goog.base(G__26493_26496); > > > > > > > > > > > > var this_SHARP___18401__auto__ = this; > > > > > > return this_SHARP___18401__auto__; > > > > > > }); > > > > > > > > > > > > and that fails during the advanced compilation phase with: > > > > > > ERROR: JSC_BASE_CLASS_ERROR. incorrect use of goog.base: First argument > > must be 'this'. > > > > > > > > > > > > Thanks, > > > > > > Dusan > > > > > > > > > > > > > > > > > > -- > > > > > > Note that posts from new members are moderated - please be patient with > > your first post. > > > > > > --- > > > > > > You received this message because you are subscribed to the Google Groups > > "ClojureScript" group. > > > > > > To unsubscribe from this group and stop receiving emails from it, send an > > email to [email protected]. > > > > > > To post to this group, send email to [email protected]. > > > > > > Visit this group at http://groups.google.com/group/clojurescript. > > > > I'm also seeing the same error. > > > > (defn Foo > > [] > > (goog/base (js* "this"))) > > (goog/inherits Foo js/Object) > > > > (defn Foo > > [] > > (this-as this > > (goog/base this))) > > (goog/inherits Foo js/Object) > > > > Neither does work under advanced compilation mode. > > > > > > Compiling ClojureScript. > > Compiling "resources/public/js/compiled/main.js" from ["src-cljs"]... > > 6?? 07, 2015 10:24:58 ???? com.google.javascript.jscomp.LoggerErrorManager > println > > SEVERE: /C:/workspace/app/target/cljsbuild-compiler-0/my/core.js:7: ERROR - > incorrect use of goog.base: First argument must be 'this'. > > return goog.base(G__9818); > > ^ > > > > 6?? 07, 2015 10:24:58 ???? com.google.javascript.jscomp.LoggerErrorManager > printSummary > > WARNING: 1 error(s), 0 warning(s) > > ERROR: JSC_BASE_CLASS_ERROR. incorrect use of goog.base: First argument must > be 'this'. at /C:/workspace/app/target/cljsbuild-compiler-0/my/core.js line 7 > : 7 > > [32mSuccessfully compiled "resources/public/js/compiled/main.js" in 13.313 > seconds. [0m > > > > -- > > Note that posts from new members are moderated - please be patient with your > first post. > > --- > > You received this message because you are subscribed to the Google Groups > "ClojureScript" group. > > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > > To post to this group, send email to [email protected]. > > Visit this group at http://groups.google.com/group/clojurescript.
The problem is that (goog/base (js* "this")) becomes var G__9818 = this; return goog.base(G__9818); But the closure compiler expects the first argument to be "this" explicitly, and doesn't allow this indirection. The workaround is to use (js* "goog.base(this)"). Also the closure compiler expects calls to the goog.inherits to be the next statement following the constructor, but the calls to (goog/inherits Foo js/Object) becomes var G__9819_9821 = my.core.Foo; var G__9820_9822 = Object; goog.inherits(G__9819_9821,G__9820_9822); and that causes an error complaining "incorrect use of goog.base: Could not find goog.inherits for base class at ...". The workaround is to use (js* "goog.inherits(my.core.Foo, Object)"). So here's the full working code: (defn Foo [] (js* "goog.base(this))) (js* "goog.inherits(my.core.Foo, Object)") The compiler still issues "WARNING - dangerous use of this in static method my.core.Foo" because of the absent of "@constructor" annotation, but the code works fine. -- Note that posts from new members are moderated - please be patient with your first post. --- You received this message because you are subscribed to the Google Groups "ClojureScript" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/clojurescript.
