Change dda-20110301-0dx by [email protected] on 2011-03-01 14:23:55 EST
    in /Users/dda/laszlo/src/svn/openlaszlo/trunk-c/WEB-INF/lps/schema
    for http://svn.openlaszlo.org/openlaszlo/trunk/WEB-INF/lps/schema

Summary: Eliminate the need for with(this) from most typical cases

New Features:

Bugs Fixed: LPP-8751 Eliminate the use of `with(this)`

Technical Reviewer: ptw (pending)
QA Reviewer: henry (pending)
Doc Reviewer: (pending)

Documentation:

Release Notes:

Overview:
    with(this) can be eliminated from a function only when either of these
    conditions occur:
     - we have an complete knowledge of the class heirarchy.
     - there are no free references in the function that cannot be
       accounted for as globals.
    We address the first condition via changes to the js2doc as it
    generates the lfc schema, the tag compiler as it generates extra
    'reference' JS classes that contain attributes and methods with
    empty implementations, and the script compiler, as it uses the
    reference classes to create a (usually) complete picture of the class
    heirarchy for most cases.  The second condition is addressed via
    a prescan of the AST for globals and class names.

    There may be some future work that may require a complete set of
    reference classes, or method args, etc..  These are mentioned in
    comments below as 'FUTURE WORK'.  For most of these, preliminary
    explorations were done, and abandoned for expediency.

Details:
    test/lztest/lztest-class-impl.lzx:
      Added some simple tests that illustrate how with(this) is inserted
      in certain cases (before this change).  By inspecting JS, used to
      verify with-this removal is working.

    WEB-INF/lps/schema/lfc-undeclared.lzx:
      Added attribute: isinited, marked as private in doc, which is used
      by old components, and cannot be marked as public.
      Added method: setAttribute, which actually lives in LzEventable, and is
      used quite often.  We don't current emit reference classes for
      any classes that are not associated with a tag (it was too hard
      to get a non-tag class into the tag compiler - FUTURE WORK).

    WEB-INF/lps/lfc/core/LzNode.lzs:
      Added devnote about isinited.

    WEB-INF/lps/lfc/compiler/Class.lzs:
      Minor error message improvement that I found helpful once. (optional)

    WEB-INF/lps/server/src/org/openlaszlo/js2doc/SchemaBuilder.java:
      - jsname (the javascript name) for a class as well as jsextends
        (the javascript class it extends) are put into the schema, though
        not currently used - FUTURE WORK).
      - omit event names not already defined as attributes
      - method parameters are now collected and inserted into the schema,
        but no typing is currently preserved (FUTURE WORK).

    WEB-INF/lps/server/src/org/openlaszlo/compiler/ClassCompiler.java:
      Ignore classes in the schema that has no associated tag name (FUTURE 
WORK).
      Small change to the protocol of compiling a ClassModel.

    WEB-INF/lps/server/src/org/openlaszlo/compiler/NodeModel.java:
      Ignore the jsname, jsextends parts of the schema (FUTURE WORK).
      Small change to the protocol of compiling a ClassModel.

    WEB-INF/lps/server/src/org/openlaszlo/compiler/ClassModel.java:
      - Changed isCompiled() to be true to its name.
      - reworked compile() to handle emiting reference classes as needed.
      - reworked emitClassDeclaration() to work with reference classes.

    WEB-INF/lps/server/src/org/openlaszlo/sc/ScriptClass.java:
      Changed generation of a class so it won't create attributes named 'with'
      classes named 'class', etc.  Needed when generating all classes for
      the full schema (possibly optional now, but needed for FUTURE WORK).

    WEB-INF/lps/server/src/org/openlaszlo/sc/CommonGenerator.java:
      - rearrange globals and debugGlobals into separate sets.
      - ClassDescriptor.getInstanceProperties() modified to return an 
'incomplete' set,
        rather than null.  ClassDescriptor.complete is set and needs to be 
checked
        by the caller.
      - ClassDescriptor.incompleteSet() added for informational messages.
      - ClassDescriptor.toString() for development/debugging.
      - process reference classes minimally when needed at all.

    WEB-INF/lps/server/src/org/openlaszlo/sc/JavascriptGenerator.java:
      - create set of forwardGlobals by doing a shallow walk of the AST.
      - manage the 'possibleInstance' set to try to reduce it and move
        as many items as appropriate/possible to the 'bindthis' set,
        which is the set of variables we will actively bind to 'this'.
      - issue warning if 'warnWithThis' is on.

    WEB-INF/lps/server/src/org/openlaszlo/sc/SWF9Generator.java:
      Make sure reference classes are ignored in this generator.

    WEB-INF/lps/server/src/org/openlaszlo/sc/DHTMLCompiler.java:
      set option so that reference classes are accepted.

    WEB-INF/lps/server/src/org/openlaszlo/sc/Compiler.java:
      define 'referenceClass' pragma issued by tag compiler.
      define 'registerReferenceClasses', an option only set by the 
DHTMLCompiler.
      define 'warnWithThis', a new debugging option that will warn
      when with(this) is used, and give the reason behind it, e.g.:
         'with(this) added in foobar: unknown parts of class hierarchy: 
[LzTestManagerClass->LzEventable] and unaccounted refs: [LzHTTPLoader, escape]'

    WEB-INF/lps/server/src/org/openlaszlo/sc/CodeGenerator.java:
      Abide by new ClassDescriptor protocol

    WEB-INF/lps/server/src/org/openlaszlo/sc/GenericVariableAnalyzer.java:
    WEB-INF/lps/server/src/org/openlaszlo/sc/VariableAnalyzer.java:
    WEB-INF/lps/server/src/org/openlaszlo/sc/WithThisAnalyzer.java:
      Refactored VariableAnalyzer so essential parts could be shared
      with a new 'WithThisAnalyzer'.  The new analyzer walks the tree
      and applies identifier --> this.identifier transformation for
      any free variables found in a set.

    WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/SimpleNode.java:
      Added indexOf() - a convenience function, helpful in the 'this binding'.

Tests:
  - Ran smoketest (DHTML,SWF10) lztest, runlzunit
  - after lztest, examined *.js files left behind to determine that
    79% (286 of 362) of occurrences of with(this) had been removed compared
    with a run without these changes.  Spot checked to ensure that 'this.'
    was inserted, specifically in the 'WithThis' tests
    (in test/lztest/lztest-class-impl.lzx)
-  Of the occurrences left, we know why they occur: 1) LzTestManagerClass 
inherits
    from LzEventable, not a class associated with a tag.  This will not happen 
for
    pure lzx programs. 2) they often refer to use class names in the LFC:
    LzHTTPLoader, LzTimeKernel.  3) they refer to identifiers 'canvas', 
'escape'.



Files:
M       test/lztest/lztest-class-impl.lzx
M       WEB-INF/lps/schema/lfc-undeclared.lzx
M       WEB-INF/lps/lfc/core/LzNode.lzs
M       WEB-INF/lps/lfc/compiler/Class.lzs
M       WEB-INF/lps/server/src/org/openlaszlo/js2doc/SchemaBuilder.java
A       WEB-INF/lps/server/src/org/openlaszlo/sc/WithThisAnalyzer.java
M       WEB-INF/lps/server/src/org/openlaszlo/sc/JavascriptGenerator.java
A       WEB-INF/lps/server/src/org/openlaszlo/sc/GenericVariableAnalyzer.java
M       WEB-INF/lps/server/src/org/openlaszlo/sc/VariableAnalyzer.java
M       WEB-INF/lps/server/src/org/openlaszlo/sc/SWF9Generator.java
M       WEB-INF/lps/server/src/org/openlaszlo/sc/CommonGenerator.java
M       WEB-INF/lps/server/src/org/openlaszlo/sc/DHTMLCompiler.java
M       WEB-INF/lps/server/src/org/openlaszlo/sc/Compiler.java
M       WEB-INF/lps/server/src/org/openlaszlo/sc/CodeGenerator.java
M       WEB-INF/lps/server/src/org/openlaszlo/sc/ScriptClass.java
M       WEB-INF/lps/server/src/org/openlaszlo/compiler/ClassCompiler.java
M       WEB-INF/lps/server/src/org/openlaszlo/compiler/NodeModel.java
M       WEB-INF/lps/server/src/org/openlaszlo/compiler/ClassModel.java
M       WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/SimpleNode.java

Changeset: http://svn.openlaszlo.org/openlaszlo/patches/dda-20110301-0dx.tar



--

Don Anderson
Java/C/C++, Berkeley DB, systems consultant

voice: 617-306-2057
email: [email protected]
www: http://www.ddanderson.com
blog: http://libdb.wordpress.com





Reply via email to