On Monday, June 8, 2015 at 6:19:26 AM UTC+9, David Nolen wrote:
> Google Closure needs to know about constructors. This is why we have JSDoc
> support.
>
> On Sunday, June 7, 2015, Alice Bellard <[email protected]> wrote:
> 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.
>
>
>
> With :optimizations :none, the code compiles to
>
>
>
> // Compiled by ClojureScript 0.0-3308 {}
>
> goog.provide('my.core');
>
> goog.require('cljs.core');
>
> my.core.Foo = (function my$core$Foo(){
>
> return goog.base(this);
>
> });
>
> goog.inherits(my.core.Foo,Object);
>
>
>
> I'm not sure how "@constructor" JSDoc can help here. I'm not dealing with a
> javascript source file, it's clojurescript code, and aren't JSDoc attributes
> optional?
>
>
>
> --
>
> 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.
Didn't know that JSDoc can be added to the clojure function like (defn ^{:jsdoc
"@constructor"} Foo ...), but as I explained it, I still have to use js* for
the whole statement to avoid the error.
--
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.