[Laszlo-dev] Corrected: For Review: Change 20071205-dda-z Summary: Initial support for keywords in script compiler
Donald Anderson
dda at ddanderson.com
Wed Dec 5 11:01:44 PST 2007
Tucker & Henry,
Just made a correction to this review -
I had a local change to WEB-INF/lps/lfc/build.xml for testing,
and that file shouldn't have been in the review at all.
I corrected the review, and the tar file is now correct -
but if you picked it up previously, just
ignore the changes to build.xml !
Thanks - sorry for any confusion.
- Don
Change 20071205-dda-z by dda at 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{}
///////////////////////
Files:
M WEB-INF/lps/server/src/org/openlaszlo/js2doc/JS2Doc.java
M WEB-INF/lps/server/src/org/openlaszlo/sc/JavascriptGenerator.java
M WEB-INF/lps/server/src/org/openlaszlo/sc/CommonGenerator.java
M WEB-INF/lps/server/src/org/openlaszlo/sc/CodeGenerator.java
M WEB-INF/lps/server/sc/src/org/openlaszlo/sc/Parser.jjt
A WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/
ASTModifiedDefinition.java
Changeset: http://svn.openlaszlo.org/openlaszlo/patches/20071205-dda-
z.tar
--
Don Anderson
Java/C/C++, Berkeley DB, systems consultant
Voice: 617-547-7881
Email: dda at ddanderson.com
WWW: http://www.ddanderson.com
More information about the Laszlo-dev
mailing list