History | Log In     View a printable version of the current page.  
Issue Details (XML | Word | Printable)

Key: LPP-5175
Type: New Feature New Feature
Status: Resolved Resolved
Resolution: Fixed
Priority: -- --
Assignee: Donald Anderson
Reporter: Donald Anderson
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
OpenLaszlo

Allow new JS2 keywords: final, override, dynamic, protected, public, internal, private

Created: 30/Nov/07 12:03 PM   Updated: 06/Dec/07 01:22 PM
Component/s: Compiler - JavaScript
Affects Version/s: RingDing (4.1)
Fix Version/s: RingDing (4.1)

Time Tracking:
Not Specified

Severity: Minor
Fixed in Change#: 7,476
Fixed in branch: trunk
Runtime: N/A
Fix in hand: False


 Description  « Hide
New JS2 keywords should be allowed in the language,
as they will be needed for SWF9.
It will be okay to ignore these for all other targets
at least in the short term.

 All   Comments   Work Log   Change History      Sort Order: Ascending order - Click to sort in descending order
Donald Anderson - 06/Dec/07 01:22 PM
------------------------------------------------------------------------
r7476 | dda | 2007-12-06 15:37:08 -0500 (Thu, 06 Dec 2007) | 120 lines
Changed paths:
   M /openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/Parser.jjt
   A /openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/ASTModifiedDefinition.java
   M /openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/js2doc/JS2Doc.java
   M /openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/CodeGenerator.java
   M /openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/CommonGenerator.java
   M /openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/JavascriptGenerator.java

Change 20071205-dda-z by dda@freddie.local on 2007-12-05 10:32:16 EST
    in /Users/dda/laszlo/src/svn/openlaszlo/trunk
    for http://svn.openlaszlo.org/openlaszlo/trunk

Summary: Initial support for keywords in script compiler

New Features: no exposed features yet

Bugs Fixed: LPP-5175

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

Documentation:
    Nothing here affects .lzx files, and even for lzs coders, there is no effect
    unless the new keywords are used. Even so -- they don't do anything for SWF8/9,DHTML,
    they are merely accepted.. Some of these keywords will be used internally
    to help implement SWF9 (in later reviews), some may be exposed to users indirectly
    via .lzx tags in the future, at which time they may be documented.
    All keywords used in accordance with ActionScript 3.0 and the Ecmascript draft standard.

Release Notes:
    None.

Details:
    Initial support for several JS2 keywords: 'dynamic', 'override', 'final',
    'private', 'protected', 'public', 'internal'. The keyword 'static', although previously
    supported, is now handled in same way as the new group. In fact new keyword modifiers (I just
    noticed const) should now be easy to add. These keywords are all modifiers,
    in that they appear as part of a function, class, var definition, before
    the keywords 'function', 'class', 'var'. Multiple keywords can
    of course appear, for example, 'public static var x;'
    Also name space names can appear in this position, for example,
      mynamespace function f1() { }
      final override mynamespace function f2() { }

    There is no specific ordering of keywords enforced, and there are few
    restrictions: override is only for methods, dynamic is only for classes,
    only a single namespace name can appear, and a namespace cannot appear
    along with a visibility modifier ('public', 'private', 'protected', 'internal').

    By 'initial support', I mean that the keywords are now accepted, in the proper
    place and the infrastructure is available to take advantage of them.
    For SWF9, we plan to implement most or all of these keywords.
    Any code in the compilers or doc tools that already knew about 'static',
    has been changed to use this new modifier class.

    To make for easy handling of these modifiers (and potentially new ones), there
    is a new AST type: ASTModifiedDefinition. This can generally appear in the AST
    wherever a ClassDefinition, FunctionDeclaration or VariableStatement appears,
    and it has a child which is the ClassDefinition, FunctionDeclaration, VariableStatement.
    There is only one of these objects in the tree for any definition/declaration,
    and it holds information about all modifiers, including namespace names for the
    given declaration. This should make it easy to change any specifics about
    the modifiers, which ones are supported, etc. and allows each runtime to make
    its own decisions about how to treat the modifiers.

Tests:
    smoketest for SWF7/8 and DHTML
    exact comparison of LFC binaries (using 'generatePredictableTemps' option)
    comparison of JS2doc outputs for representative classes
      to ensure that no visible changes.
    A basic .lzs test to test that various keyword combinations are accepted/rejected.
      since 'test/' directory does not have .lzs files, I only include it here:

///////////////////////
// tests for new script compiler keywords
// to test keyword combinations that should
// give errors, uncomment lines beginning with //XXXX

function f1() { }
static function f2() { }
private static function f3() { }
static protected function f4() { }
static override function f5() { }
ns1 function f6() { }
ns1 final function f7() { }
final ns1 function f8() { }

var v1;
// Not allowed outside of class:
//XXXX public var badv1;
//XXXX static var badv2;
//XXXX protected static var badv3;

class c1 {
function cf1() { }
static function cf2() { }
private static function cf3() { }
static protected function cf4() { }
static override function cf5() { }
ns1 function cf6() { }
ns1 final function cf7() { }
final ns1 function cf8() { }

var cv1;
public var cv2;
static var cv3;
protected static var cv4;
}

private class c2 {}
ns2 class c3 {}
dynamic class c4 {}

// Multiple namespace names not allowed
//XXXX ns1 ns2 class badc1{}
// namespace not allowed with public/private/etc.
//XXXX public ns1 class badc2{}
//XXXX ns2 protected class badc3{}
// Inappropriate combinations
//XXXX override var badv4;
//XXXX dynamic function badf1() {}
//XXXX dynamic var badv5;
//XXXX override class badc4{}
///////////////////////



------------------------------------------------------------------------