On 5/15/2010 3:02 PM, P T Withington wrote:
Comments:
1) Not your bug, but I suspect this is an error:
String baseName = name.substring(setterPrefix.length());
AttributeSpec superAttr = superclassModel.getAttribute(name,
ALLOCATION_INSTANCE);
Shouldn't that be `baseName` in the second line? I think this is trying to check
that if the compiler is defining $lzc$set_foo and the schema has<setter
name='foo'> that `override` will be specified?
I'll try to create a test case to find out whether these lines are
necessary at all. They were introduced in r15122 for LPP-7184.
Otherwise approved.
On 2010-05-14, at 14:11, André Bargull wrote:
Change 20100514-bargull-sfC by barg...@bargull02 on 2010-05-14 17:15:00
in /home/anba/src/svn/openlaszlo/trunk
for http://svn.openlaszlo.org/openlaszlo/trunk
Summary: fix compiler to handle overrides of final methods properly
Bugs Fixed: LPP-8982 (It's possible to "de-finalize" a method), LPP-8983
(Compiler fails to detect overriden final methods on instance classes), LPP-8986
(Overriding final static method generates compiler warning)
Technical Reviewer: ptw
QA Reviewer: max
Overview:
Class-allocated methods aren't inherited to sub-classes, so any method
declaration check for overrides needs only to take place when defining
instance-allocated methods. This changes enforces this semantic and also fixes
some other bugs related to method overrides and final methods.
Details:
NodeModel:
- removed some unused imports
- added getUserTagName() to retrieve the tag-name used by the user, this is important for
instance classes to get the real tag-name instead of just "anonymous"
- addMethodInternal():
+ no override check required for class-allocated methods, because you cannot
override these methods
+ if an override was detected, but the user explicitely set override="false",
emit a warning
+ it's not yet possible to detect all overrides, so don't emit a warning if the user
explicitely set override="true", but no method declaration in a base class was
found
+ ViewSchema#checkInstanceMethodDeclaration() is only required for (1) overriden,
instance-allocated methods (2) class-allocated methods in<class> definitions
(or<mixin>,<interface>)
+ checkInstanceMethodDeclaration() needs the user tag-name, otherwise you'd end up trying
to get the attributes defined in a class named "anonymous"
ViewSchema:
- removed some unused imports
- checkMethodDeclaration():
+ only emit a warning when overriding an instance-allocated, final method
- checkInstanceMethodDeclaration():
+ only check for methods whether an override is allowed
+ call isOverrideAllowed() instead of isMethodDeclarationAllowed(), otherwise
you'd skip a class (remember 'classname' is the name of the base class of the
current instance class, so if you search for super-class methods you need to
include 'classname')
- addAttributeDefs():
+ only check overrides of instance-allocated attributes/methods
lfc-undeclared:
- "apply" and "call" must not be redefined as class-allocated methods, but it's
okay to define both as instance-allocated methods
final-method-override-class-allocation:
- test case for LPP-8986
final-method-override-instance-class:
- test case for LPP-8983
final-method-override-reserved:
- test case for schema changes
final-method-override:
- test case for LPP-8982
invalid-user-method-override:
- test case for detecting wrong override="false" from users
lztest-override-methods:
- tests for various method override cases in lzx
lztest-override-methods-lzs:
- tests for various method override cases in lzs
Tests:
smokecheck, amazon (swf8,swf10,dhtml)
all testcases from this change set (swf8,swf10,dhtml)
note: Some tests in test/compiler_errors will return compiler errors, this is
expected. Every file has got a section which explains the proper result.
note: Some tests won't compile at all in swf10 (e.g.
final-method-override-class-allocation), but this is expected, too. Also see
LPP-8993.
Files:
A test/compiler_errors/final-method-override-class-allocation.lzx
A test/compiler_errors/final-method-override-instance-class.lzx
A test/compiler_errors/final-method-override-reserved.lzx
A test/compiler_errors/final-method-override.lzx
A test/compiler_errors/invalid-user-method-override.lzx
A test/lztest/lztest-override-methods.lzx
A test/lztest/lztest-override-methods-lzs.lzx
M WEB-INF/lps/schema/lfc-undeclared.lzx
M WEB-INF/lps/server/src/org/openlaszlo/compiler/ViewSchema.java
M WEB-INF/lps/server/src/org/openlaszlo/compiler/NodeModel.java
Changeset: http://svn.openlaszlo.org/openlaszlo/patches/20100514-bargull-sfC.tar