I think that would be ok to have it as a default, and instead of a switch to enable, have. switch to disable, in case that could be a problem for an IDE or something. But I think we must to power new things instead of having it as "optional"
thoughts? El vie., 25 ene. 2019 a las 12:41, Harbs (<[email protected]>) escribió: > Is there any reason to not enable this option by default? > > I can’t think of a downside to having this enabled. > > > On Jan 24, 2019, at 6:51 PM, Piotr Zarzycki <[email protected]> > wrote: > > > > It's a great starting point - Thank you for doing that! > > > > czw., 24 sty 2019 o 17:49 Josh Tynjala <[email protected]> > napisał(a): > > > >> Right now, only classes may be abstract. If you try to make a method > >> abstract, you'll get a compiler error: > >> > >>> The abstract attribute may be used only class property definitions. > >> > >> It's probably possible to support abstract methods too, but I wanted to > >> start with something simpler. > >> > >> - Josh > >> > >> On 2019/01/24 16:40:58, Piotr Zarzycki <[email protected]> > wrote: > >>> Josh, > >>> > >>> Do we have also ability to declare abstract methods ? > >>> > >>> Thanks, > >>> Piotr > >>> > >>> czw., 24 sty 2019 o 16:59 Carlos Rovira <[email protected]> > >>> napisał(a): > >>> > >>>> So cool! :) > >>>> > >>>> Think is time to tweet it! :) > >>>> > >>>> El jue., 24 ene. 2019 a las 16:50, Harbs (<[email protected]>) > >>>> escribió: > >>>> > >>>>> Perfect! Thanks! > >>>>> > >>>>>> On Jan 24, 2019, at 5:39 PM, Josh Tynjala <[email protected]> > >>>>> wrote: > >>>>>> > >>>>>> Following the suggestion from Harbs, I created a Github issue for > >>>>> abstract classes: > >>>>>> > >>>>>> https://github.com/apache/royale-compiler/issues/73 > >>>>>> > >>>>>> There's a code example in the description. > >>>>>> > >>>>>> - Josh > >>>>>> > >>>>>> On 2019/01/24 09:13:34, Piotr Zarzycki <[email protected]> > >>>>> wrote: > >>>>>>> Wow! <3 > >>>>>>> How does that class looks like ? Is it follow similar principle > >> as it > >>>>> is in > >>>>>>> C# language ? > >>>>>>> > >>>>>>> czw., 24 sty 2019 o 10:09 Harbs <[email protected]> > >> napisał(a): > >>>>>>> > >>>>>>>> Great addition! Love it! > >>>>>>>> > >>>>>>>> Suggestion: When you add features, it’s a good idea to add a > >> Github > >>>>> issue > >>>>>>>> to make it easier to track changes for release notes. > >>>>>>>> > >>>>>>>> Thanks, > >>>>>>>> Harbs > >>>>>>>> > >>>>>>>>> On Jan 24, 2019, at 12:58 AM, [email protected] wrote: > >>>>>>>>> > >>>>>>>>> This is an automated email from the ASF dual-hosted git > >> repository. > >>>>>>>>> > >>>>>>>>> joshtynjala pushed a commit to branch develop > >>>>>>>>> in repository > >>>> https://gitbox.apache.org/repos/asf/royale-compiler.git > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> The following commit(s) were added to refs/heads/develop by this > >>>> push: > >>>>>>>>> new 6a85bc1 compiler: added support for abstract classes in > >>>>>>>> ActionScript > >>>>>>>>> 6a85bc1 is described below > >>>>>>>>> > >>>>>>>>> commit 6a85bc1cd0c09e4ca07cf221a55ec9dd13e5d63c > >>>>>>>>> Author: Josh Tynjala <[email protected]> > >>>>>>>>> AuthorDate: Wed Jan 23 14:51:00 2019 -0800 > >>>>>>>>> > >>>>>>>>> compiler: added support for abstract classes in ActionScript > >>>>>>>>> > >>>>>>>>> When a developer attempts to instantiate an abstract class > >> with > >>>> the > >>>>>>>> "new" keyword, the compiler will report an error. This is a > >> compile > >>>>> time > >>>>>>>> check for now, but emitters could hypothetically add runtime > >> checks > >>>>> too. > >>>>>>>>> > >>>>>>>>> The abstract modifier is allowed on classes only at this > >> time, and > >>>>>>>> trying to use it on other definitions, like interfaces, methods, > >> and > >>>>>>>> variables results in a syntax problem. > >>>>>>>>> > >>>>>>>>> To enable abstract classes, use the new allow-abstract-classes > >>>>>>>> compiler option. Support for abstract classes is disabled by > >> default, > >>>>>>>> meaning using this experimental new syntax is completely opt-in. > >> Even > >>>>> if > >>>>>>>> the syntax widely adopted, we should keep it disabled by default > >> in > >>>> the > >>>>>>>> compiler to avoid syntax conflicts when using the compiler for > >> code > >>>>>>>> intelligence with other SDKs. To enable it by default for a > >>>> particular > >>>>> SDK, > >>>>>>>> modify the appropriate frameworks/*-config.xml file. > >>>>>>>>> > >>>>>>>>> Behind the scenes, When the "abstract" keyword is encountered > >> as a > >>>>>>>> modifier on a class, [RoyaleAbstract] metadata is created. This > >>>> allows > >>>>>>>> bytecode to store whether a class is abstract, without actually > >>>> having > >>>>> to > >>>>>>>> update the bytecode format and runtimes that support it. The > >> metadata > >>>>> also > >>>>>>>> allows classes in libraries to remain abstract when compiled to > >> SWC. > >>>>>>>>> --- > >>>>>>>>> .../apache/royale/compiler/common/ASModifier.java | 8 +++- > >>>>>>>>> .../royale/compiler/config/Configuration.java | 22 > >> +++++++++++ > >>>>>>>>> .../compiler/constants/IASKeywordConstants.java | 1 + > >>>>>>>>> .../royale/compiler/definitions/IDefinition.java | 7 ++++ > >>>>>>>>> .../royale/compiler/projects/ICompilerProject.java | 5 +++ > >>>>>>>>> .../royale/compiler/internal/parsing/as/ASParser.g | 3 +- > >>>>>>>>> .../constants/IMetaAttributeConstants.java | 4 ++ > >>>>>>>>> .../as/codegen/ClassDirectiveProcessor.java | 9 +++++ > >>>>>>>>> .../as/codegen/GlobalDirectiveProcessor.java | 19 > >> +++++++++- > >>>>>>>>> .../as/codegen/InterfaceDirectiveProcessor.java | 5 +++ > >>>>>>>>> .../internal/definitions/ClassDefinitionBase.java | 26 > >>>> +++++++++++++ > >>>>>>>>> .../internal/definitions/DefinitionBase.java | 24 > >> ++++++++++++ > >>>>>>>>> .../compiler/internal/parsing/as/ASToken.java | 4 ++ > >>>>>>>>> .../compiler/internal/parsing/as/BaseASParser.java | 3 +- > >>>>>>>>> .../internal/parsing/as/ConfigProcessor.java | 6 +++ > >>>>>>>>> .../internal/parsing/as/StreamingASTokenizer.java | 4 ++ > >>>>>>>>> .../compiler/internal/projects/ASCProject.java | 6 +++ > >>>>>>>>> .../compiler/internal/projects/RoyaleProject.java | 15 ++++++++ > >>>>>>>>> .../projects/RoyaleProjectConfigurator.java | 1 + > >>>>>>>>> .../semantics/MethodBodySemanticChecker.java | 11 ++++++ > >>>>>>>>> .../internal/tree/as/BaseDefinitionNode.java | 2 + > >>>>>>>>> .../AbstractClassCannotBeInstantiatedProblem.java | 42 > >>>>>>>> +++++++++++++++++++++ > >>>>>>>>> .../problems/AbstractOutsideClassProblem.java | 43 > >>>>>>>> ++++++++++++++++++++++ > >>>>>>>>> 23 files changed, 265 insertions(+), 5 deletions(-) > >>>>>>>>> > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler-common/src/main/java/org/apache/royale/compiler/common/ASModifier.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler-common/src/main/java/org/apache/royale/compiler/common/ASModifier.java > >>>>>>>>> index bb686ea..a601f80 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler-common/src/main/java/org/apache/royale/compiler/common/ASModifier.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler-common/src/main/java/org/apache/royale/compiler/common/ASModifier.java > >>>>>>>>> @@ -60,6 +60,11 @@ public class ASModifier > >>>>>>>>> * Represents the <code>virtual</code> modifier. > >>>>>>>>> */ > >>>>>>>>> public static final ASModifier VIRTUAL = new > >>>>>>>> ASModifier(IASKeywordConstants.VIRTUAL, 1 << 6); > >>>>>>>>> + > >>>>>>>>> + /** > >>>>>>>>> + * Represents the <code>abstract</code> modifier. > >>>>>>>>> + */ > >>>>>>>>> + public static final ASModifier ABSTRACT = new > >>>>>>>> ASModifier(IASKeywordConstants.ABSTRACT, 1 << 7); > >>>>>>>>> > >>>>>>>>> /** > >>>>>>>>> * A list of all the modifiers that exist within AS3 > >>>>>>>>> @@ -71,7 +76,8 @@ public class ASModifier > >>>>>>>>> NATIVE, > >>>>>>>>> OVERRIDE, > >>>>>>>>> STATIC, > >>>>>>>>> - VIRTUAL > >>>>>>>>> + VIRTUAL, > >>>>>>>>> + ABSTRACT > >>>>>>>>> }; > >>>>>>>>> > >>>>>>>>> /** > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler-common/src/main/java/org/apache/royale/compiler/config/Configuration.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler-common/src/main/java/org/apache/royale/compiler/config/Configuration.java > >>>>>>>>> index 5f8a3e0..478d346 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler-common/src/main/java/org/apache/royale/compiler/config/Configuration.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler-common/src/main/java/org/apache/royale/compiler/config/Configuration.java > >>>>>>>>> @@ -1508,6 +1508,28 @@ public class Configuration > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> // > >>>>>>>>> + // 'compiler.allow-abstract-classes' option > >>>>>>>>> + // > >>>>>>>>> + > >>>>>>>>> + private boolean allowAbstractClasses = false; > >>>>>>>>> + > >>>>>>>>> + public boolean getCompilerAllowAbstractClasses() > >>>>>>>>> + { > >>>>>>>>> + return allowAbstractClasses; > >>>>>>>>> + } > >>>>>>>>> + > >>>>>>>>> + /** > >>>>>>>>> + * Whether the compiler will allow classes to be abstract. > >>>>>>>>> + */ > >>>>>>>>> + @Config > >>>>>>>>> + @Mapping({ "compiler", "allow-abstract-classes" }) > >>>>>>>>> + @RoyaleOnly > >>>>>>>>> + public void > >> setCompilerAllowAbstractClasses(ConfigurationValue > >>>>> cv, > >>>>>>>> boolean allow) > >>>>>>>>> + { > >>>>>>>>> + this.allowAbstractClasses = allow; > >>>>>>>>> + } > >>>>>>>>> + > >>>>>>>>> + // > >>>>>>>>> // 'compiler.actionscript-file-encoding' option > >>>>>>>>> // > >>>>>>>>> > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler-common/src/main/java/org/apache/royale/compiler/constants/IASKeywordConstants.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler-common/src/main/java/org/apache/royale/compiler/constants/IASKeywordConstants.java > >>>>>>>>> index b45cea2..54e17ac 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler-common/src/main/java/org/apache/royale/compiler/constants/IASKeywordConstants.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler-common/src/main/java/org/apache/royale/compiler/constants/IASKeywordConstants.java > >>>>>>>>> @@ -26,6 +26,7 @@ import com.google.common.collect.ImmutableSet; > >>>>>>>>> */ > >>>>>>>>> public interface IASKeywordConstants > >>>>>>>>> { > >>>>>>>>> + static final String ABSTRACT = "abstract"; > >>>>>>>>> static final String AS = "as"; > >>>>>>>>> static final String BREAK = "break"; > >>>>>>>>> static final String CASE = "case"; > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler-common/src/main/java/org/apache/royale/compiler/definitions/IDefinition.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler-common/src/main/java/org/apache/royale/compiler/definitions/IDefinition.java > >>>>>>>>> index 21f225b..89bfd78 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler-common/src/main/java/org/apache/royale/compiler/definitions/IDefinition.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler-common/src/main/java/org/apache/royale/compiler/definitions/IDefinition.java > >>>>>>>>> @@ -268,6 +268,13 @@ public interface IDefinition > >>>>>>>>> boolean isStatic(); > >>>>>>>>> > >>>>>>>>> /** > >>>>>>>>> + * Is this definition marked as <code>abstract</code>? > >>>>>>>>> + * > >>>>>>>>> + * @return <code>true</code> if the definition is > >>>>>>>> <code>abstract</code>. > >>>>>>>>> + */ > >>>>>>>>> + boolean isAbstract(); > >>>>>>>>> + > >>>>>>>>> + /** > >>>>>>>>> * Determines whether the specified modifier is present on > >> this > >>>>>>>> definition. > >>>>>>>>> * See {@link ASModifier} for the list of modifiers. > >>>>>>>>> * > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler-common/src/main/java/org/apache/royale/compiler/projects/ICompilerProject.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler-common/src/main/java/org/apache/royale/compiler/projects/ICompilerProject.java > >>>>>>>>> index b3eea14..61d7489 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler-common/src/main/java/org/apache/royale/compiler/projects/ICompilerProject.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler-common/src/main/java/org/apache/royale/compiler/projects/ICompilerProject.java > >>>>>>>>> @@ -271,5 +271,10 @@ public interface ICompilerProject > >>>>>>>>> * @return True if import aliases are allowed. > >>>>>>>>> */ > >>>>>>>>> boolean getAllowImportAliases(); > >>>>>>>>> + > >>>>>>>>> + /** > >>>>>>>>> + * @return True if abstract classes are allowed. > >>>>>>>>> + */ > >>>>>>>>> + boolean getAllowAbstractClasses(); > >>>>>>>>> > >>>>>>>>> } > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/antlr/org/apache/royale/compiler/internal/parsing/as/ASParser.g > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/antlr/org/apache/royale/compiler/internal/parsing/as/ASParser.g > >>>>>>>>> index b4839ce..8a6a299 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/antlr/org/apache/royale/compiler/internal/parsing/as/ASParser.g > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/antlr/org/apache/royale/compiler/internal/parsing/as/ASParser.g > >>>>>>>>> @@ -212,7 +212,7 @@ attributedDefinition[ContainerNode c] > >>>>>>>>> > >>>>>>>>> /** > >>>>>>>>> * Matches an attribute such as: > >>>>>>>>> - * - Modifiers: dynamic, final, native, override, static, > >> virtual. > >>>>>>>>> + * - Modifiers: dynamic, final, native, override, static, > >> virtual, > >>>>>>>> abstract. > >>>>>>>>> * - Namespace names. > >>>>>>>>> * - Reserved namespace names: internal, private, public, > >> protected. > >>>>>>>>> * > >>>>>>>>> @@ -580,6 +580,7 @@ modifierAttribute returns [ModifierNode > >>>>> modifierNode] > >>>>>>>>> | TOKEN_MODIFIER_STATIC > >>>>>>>>> | TOKEN_MODIFIER_NATIVE > >>>>>>>>> | TOKEN_MODIFIER_VIRTUAL > >>>>>>>>> + | TOKEN_MODIFIER_ABSTRACT > >>>>>>>>> ) > >>>>>>>>> { modifierNode = new ModifierNode((ASToken) modifierT); > >>>> } > >>>>>>>>> ; > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/constants/IMetaAttributeConstants.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/constants/IMetaAttributeConstants.java > >>>>>>>>> index dee1690..189f8ea 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/constants/IMetaAttributeConstants.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/constants/IMetaAttributeConstants.java > >>>>>>>>> @@ -210,6 +210,9 @@ public interface IMetaAttributeConstants > >>>>>>>>> static final String NAME_MIN_VALUE_EXCLUSIVE = > >>>> "minValueExclusive"; > >>>>>>>>> static final String NAME_MAX_VALUE = "maxValue"; > >>>>>>>>> static final String NAME_MAX_VALUE_EXCLUSIVE = > >>>> "maxValueExclusive"; > >>>>>>>>> + > >>>>>>>>> + // [RoyaleAbstract] > >>>>>>>>> + static final String ATTRIBUTE_ABSTRACT = "RoyaleAbstract"; > >>>>>>>>> > >>>>>>>>> /** > >>>>>>>>> * List of metadata tags that do not inherit > >>>>>>>>> @@ -222,6 +225,7 @@ public interface IMetaAttributeConstants > >>>>>>>>> ATTRIBUTE_DEPRECATED, > >>>>>>>>> ATTRIBUTE_DISCOURAGED_FOR_PROFILE, > >>>>>>>>> ATTRIBUTE_EXCLUDECLASS, > >>>>>>>>> + ATTRIBUTE_ABSTRACT, > >>>>>>>>> }))); > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/ClassDirectiveProcessor.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/ClassDirectiveProcessor.java > >>>>>>>>> index cc1fef1..ff3a627 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/ClassDirectiveProcessor.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/ClassDirectiveProcessor.java > >>>>>>>>> @@ -58,6 +58,7 @@ import > >>>>>>>> org.apache.royale.compiler.definitions.IInterfaceDefinition; > >>>>>>>>> import org.apache.royale.compiler.definitions.metadata.IMetaTag; > >>>>>>>>> import > >>>>> org.apache.royale.compiler.definitions.metadata.IMetaTagAttribute; > >>>>>>>>> import > >>>>> org.apache.royale.compiler.exceptions.CodegenInterruptedException; > >>>>>>>>> +import > >>>>> org.apache.royale.compiler.problems.AbstractOutsideClassProblem; > >>>>>>>>> import > >>>>> org.apache.royale.compiler.problems.CircularTypeReferenceProblem; > >>>>>>>>> import > >>>>>>>> > >>>>> > >>>> > >> > org.apache.royale.compiler.problems.ConstructorCannotHaveReturnTypeProblem; > >>>>>>>>> import > >>>>>>>> > >> org.apache.royale.compiler.problems.ConstructorIsGetterSetterProblem; > >>>>>>>>> @@ -1091,6 +1092,10 @@ class ClassDirectiveProcessor extends > >>>>>>>> DirectiveProcessor > >>>>>>>>> { > >>>>>>>>> classScope.addProblem(new > >>>>>>>> VirtualOutsideClassProblem(site) ); > >>>>>>>>> } > >>>>>>>>> + if( modifiersSet.hasModifier(ASModifier.ABSTRACT) ) > >>>>>>>>> + { > >>>>>>>>> + classScope.addProblem(new > >>>>>>>> AbstractOutsideClassProblem(site) ); > >>>>>>>>> + } > >>>>>>>>> } > >>>>>>>>> > >>>>>>>> > >>>>> > >> classScope.getMethodBodySemanticChecker().checkForDuplicateModifiers(f); > >>>>>>>>> // Functions in a class allow all modifiers > >>>>>>>>> @@ -1127,6 +1132,10 @@ class ClassDirectiveProcessor extends > >>>>>>>> DirectiveProcessor > >>>>>>>>> { > >>>>>>>>> classScope.addProblem(new > >>>>>>>> VirtualOutsideClassProblem(site)); > >>>>>>>>> } > >>>>>>>>> + else if( modifier == ASModifier.ABSTRACT ) > >>>>>>>>> + { > >>>>>>>>> + classScope.addProblem(new > >>>>>>>> AbstractOutsideClassProblem(site)); > >>>>>>>>> + } > >>>>>>>>> } > >>>>>>>>> > >>>>>>>> > >>>>> > >> classScope.getMethodBodySemanticChecker().checkForDuplicateModifiers(v); > >>>>>>>>> } > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/GlobalDirectiveProcessor.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/GlobalDirectiveProcessor.java > >>>>>>>>> index 0f4f3c8..ca63800 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/GlobalDirectiveProcessor.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/GlobalDirectiveProcessor.java > >>>>>>>>> @@ -30,6 +30,7 @@ import > >> org.apache.royale.compiler.tree.as.IASNode; > >>>>>>>>> import org.apache.royale.compiler.tree.as.IExpressionNode; > >>>>>>>>> import org.apache.royale.compiler.common.ASModifier; > >>>>>>>>> import org.apache.royale.compiler.common.ModifiersSet; > >>>>>>>>> +import > >> org.apache.royale.compiler.constants.IASKeywordConstants; > >>>>>>>>> import > >> org.apache.royale.compiler.constants.IMetaAttributeConstants; > >>>>>>>>> import org.apache.royale.compiler.definitions.IDefinition; > >>>>>>>>> import > >>>>> org.apache.royale.compiler.internal.definitions.ClassDefinition; > >>>>>>>>> @@ -45,6 +46,7 @@ import > >>>> org.apache.royale.compiler.internal.tree.as > >>>>>>>> .NamespaceIdentifierNode; > >>>>>>>>> import org.apache.royale.compiler.internal.tree.as.PackageNode; > >>>>>>>>> import org.apache.royale.compiler.internal.tree.as.VariableNode; > >>>>>>>>> import > >>>> org.apache.royale.compiler.internal.tree.mxml.MXMLDocumentNode; > >>>>>>>>> +import > >>>>> org.apache.royale.compiler.problems.AbstractOutsideClassProblem; > >>>>>>>>> import > >> org.apache.royale.compiler.problems.DynamicNotOnClassProblem; > >>>>>>>>> import > >>>>>>>> > >> org.apache.royale.compiler.problems.EmbedOnlyOnClassesAndVarsProblem; > >>>>>>>>> import > >> org.apache.royale.compiler.problems.FinalOutsideClassProblem; > >>>>>>>>> @@ -54,6 +56,7 @@ import > >>>>>>>> org.apache.royale.compiler.problems.NativeNotOnFunctionProblem; > >>>>>>>>> import > >> org.apache.royale.compiler.problems.NativeVariableProblem; > >>>>>>>>> import > >>>>> org.apache.royale.compiler.problems.OverrideOutsideClassProblem; > >>>>>>>>> import > >>>> org.apache.royale.compiler.problems.StaticOutsideClassProblem; > >>>>>>>>> +import org.apache.royale.compiler.problems.SyntaxProblem; > >>>>>>>>> import > >>>> org.apache.royale.compiler.problems.VirtualOutsideClassProblem; > >>>>>>>>> import org.apache.royale.compiler.projects.ICompilerProject; > >>>>>>>>> import org.apache.royale.compiler.tree.mxml.IMXMLDocumentNode; > >>>>>>>>> @@ -320,6 +323,16 @@ class GlobalDirectiveProcessor extends > >>>>>>>> DirectiveProcessor > >>>>>>>>> */ > >>>>>>>>> protected void verifyClassModifiers(ClassNode c) > >>>>>>>>> { > >>>>>>>>> + > >> if(!currentScope.getProject().getAllowAbstractClasses() && > >>>>>>>> c.getDefinition().isAbstract()) > >>>>>>>>> + { > >>>>>>>>> + IASNode problemNode = c.getNameExpressionNode(); > >>>>>>>>> + if (problemNode == null) > >>>>>>>>> + { > >>>>>>>>> + problemNode = c; > >>>>>>>>> + } > >>>>>>>>> + currentScope.addProblem(new > >> SyntaxProblem(problemNode, > >>>>>>>> IASKeywordConstants.ABSTRACT)); > >>>>>>>>> + } > >>>>>>>>> + > >>>>>>>>> ModifiersSet modifiersSet = c.getModifiers(); > >>>>>>>>> if (modifiersSet == null) > >>>>>>>>> return; > >>>>>>>>> @@ -328,8 +341,8 @@ class GlobalDirectiveProcessor extends > >>>>>>>> DirectiveProcessor > >>>>>>>>> IExpressionNode site = c.getNameExpressionNode(); > >>>>>>>>> for (ASModifier modifier : modifiers) > >>>>>>>>> { > >>>>>>>>> - // final allowed on a class > >>>>>>>>> - if( modifier == ASModifier.FINAL || modifier == > >>>>>>>> ASModifier.DYNAMIC) > >>>>>>>>> + // final, dynamic, and abstract allowed on a class > >>>>>>>>> + if( modifier == ASModifier.FINAL || modifier == > >>>>>>>> ASModifier.DYNAMIC || modifier == ASModifier.ABSTRACT) > >>>>>>>>> { > >>>>>>>>> continue; > >>>>>>>>> } > >>>>>>>>> @@ -408,6 +421,8 @@ class GlobalDirectiveProcessor extends > >>>>>>>> DirectiveProcessor > >>>>>>>>> currentScope.addProblem(new > >>>>>>>> OverrideOutsideClassProblem(site)); > >>>>>>>>> else if( modifier == ASModifier.VIRTUAL ) > >>>>>>>>> currentScope.addProblem(new > >>>>>>>> VirtualOutsideClassProblem(site)); > >>>>>>>>> + else if( modifier == ASModifier.ABSTRACT ) > >>>>>>>>> + currentScope.addProblem(new > >>>>>>>> AbstractOutsideClassProblem(site)); > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> /** > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/InterfaceDirectiveProcessor.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/InterfaceDirectiveProcessor.java > >>>>>>>>> index f564c1b..46cfd3d 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/InterfaceDirectiveProcessor.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/InterfaceDirectiveProcessor.java > >>>>>>>>> @@ -55,6 +55,7 @@ import > >>>>>>>> org.apache.royale.compiler.internal.tree.as.ImportNode; > >>>>>>>>> import org.apache.royale.compiler.internal.tree.as > >> .InterfaceNode; > >>>>>>>>> import org.apache.royale.compiler.internal.tree.as > >>>>>>>> .NamespaceIdentifierNode; > >>>>>>>>> import org.apache.royale.compiler.internal.tree.as.VariableNode; > >>>>>>>>> +import > >>>>> org.apache.royale.compiler.problems.AbstractOutsideClassProblem; > >>>>>>>>> import > >>>> org.apache.royale.compiler.problems.AmbiguousReferenceProblem; > >>>>>>>>> import > >> org.apache.royale.compiler.problems.CannotExtendClassProblem; > >>>>>>>>> import > >>>>> org.apache.royale.compiler.problems.ConstructorInInterfaceProblem; > >>>>>>>>> @@ -456,6 +457,10 @@ public class InterfaceDirectiveProcessor > >>>> extends > >>>>>>>> DirectiveProcessor > >>>>>>>>> { > >>>>>>>>> interfaceScope.addProblem(new > >>>>>>>> VirtualOutsideClassProblem(site)); > >>>>>>>>> } > >>>>>>>>> + else if( modifier == ASModifier.ABSTRACT ) > >>>>>>>>> + { > >>>>>>>>> + interfaceScope.addProblem(new > >>>>>>>> AbstractOutsideClassProblem(site)); > >>>>>>>>> + } > >>>>>>>>> else if ( modifier == ASModifier.DYNAMIC ) > >>>>>>>>> { > >>>>>>>>> // Allow this and continue. > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/definitions/ClassDefinitionBase.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/definitions/ClassDefinitionBase.java > >>>>>>>>> index e00eda3..2dcf3ed 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/definitions/ClassDefinitionBase.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/definitions/ClassDefinitionBase.java > >>>>>>>>> @@ -32,8 +32,10 @@ import > >>>>>>>> org.apache.royale.compiler.definitions.IDefinition; > >>>>>>>>> import > >> org.apache.royale.compiler.definitions.IInterfaceDefinition; > >>>>>>>>> import org.apache.royale.compiler.definitions.ITypeDefinition; > >>>>>>>>> import org.apache.royale.compiler.definitions.metadata.IMetaTag; > >>>>>>>>> +import > >>>>>>>> > >> org.apache.royale.compiler.definitions.metadata.IMetaTagAttribute; > >>>>>>>>> import > >> org.apache.royale.compiler.definitions.references.IReference; > >>>>>>>>> import > >>>> org.apache.royale.compiler.internal.as.codegen.BindableHelper; > >>>>>>>>> +import > >>>>> org.apache.royale.compiler.internal.definitions.metadata.MetaTag; > >>>>>>>>> import > >> org.apache.royale.compiler.internal.projects.CompilerProject; > >>>>>>>>> import > >> org.apache.royale.compiler.internal.scopes.ASProjectScope; > >>>>>>>>> import org.apache.royale.compiler.internal.scopes.ASScope; > >>>>>>>>> @@ -536,6 +538,30 @@ public abstract class ClassDefinitionBase > >>>> extends > >>>>>>>> TypeDefinitionBase implements > >>>>>>>>> return interfaces; > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> + @Override > >>>>>>>>> + public boolean isAbstract() > >>>>>>>>> + { > >>>>>>>>> + if(super.isAbstract()) > >>>>>>>>> + { > >>>>>>>>> + return true; > >>>>>>>>> + } > >>>>>>>>> + IMetaTag[] metaTags = > >>>>>>>> getMetaTagsByName(IMetaAttributeConstants.ATTRIBUTE_ABSTRACT); > >>>>>>>>> + return metaTags != null && metaTags.length > 0; > >>>>>>>>> + } > >>>>>>>>> + > >>>>>>>>> + /** > >>>>>>>>> + * Utility to mark a definition as abstract. This method > >> should > >>>>>>>> only ever be > >>>>>>>>> + * called during construction or initialization of a > >>>> definition. > >>>>>>>>> + */ > >>>>>>>>> + @Override > >>>>>>>>> + public void setAbstract() > >>>>>>>>> + { > >>>>>>>>> + super.setAbstract(); > >>>>>>>>> + > >>>>>>>>> + MetaTag abstractMetaTag = new MetaTag(this, > >>>>>>>> IMetaAttributeConstants.ATTRIBUTE_ABSTRACT, new > >>>> IMetaTagAttribute[0]); > >>>>>>>>> + addMetaTag(abstractMetaTag); > >>>>>>>>> + } > >>>>>>>>> + > >>>>>>>>> /* > >>>>>>>>> * This inner class implements an iterator that enumerates > >> all of > >>>>>>>> this > >>>>>>>>> * ClassDefinition's superclasses. <p> It will stop iterating > >>>> when > >>>>> it > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/definitions/DefinitionBase.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/definitions/DefinitionBase.java > >>>>>>>>> index 2e4c859..a219328 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/definitions/DefinitionBase.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/definitions/DefinitionBase.java > >>>>>>>>> @@ -701,6 +701,21 @@ public abstract class DefinitionBase > >> implements > >>>>>>>> IDocumentableDefinition, IDefini > >>>>>>>>> flags |= FLAG_STATIC; > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> + // instead of increasing the size of "flags" from a short > >> to > >>>>> int, I > >>>>>>>> added > >>>>>>>>> + // a boolean variable instead. feel free to change this, if > >>>>>>>> desired. -JT > >>>>>>>>> + private boolean abstractFlag = false; > >>>>>>>>> + > >>>>>>>>> + @Override > >>>>>>>>> + public boolean isAbstract() > >>>>>>>>> + { > >>>>>>>>> + return abstractFlag; > >>>>>>>>> + } > >>>>>>>>> + > >>>>>>>>> + public void setAbstract() > >>>>>>>>> + { > >>>>>>>>> + abstractFlag = true; > >>>>>>>>> + } > >>>>>>>>> + > >>>>>>>>> @Override > >>>>>>>>> public boolean hasModifier(ASModifier modifier) > >>>>>>>>> { > >>>>>>>>> @@ -731,6 +746,10 @@ public abstract class DefinitionBase > >> implements > >>>>>>>> IDocumentableDefinition, IDefini > >>>>>>>>> // Ignore "virtual" modifier. > >>>>>>>>> return false; > >>>>>>>>> } > >>>>>>>>> + else if (modifier == ASModifier.ABSTRACT) > >>>>>>>>> + { > >>>>>>>>> + return abstractFlag; > >>>>>>>>> + } > >>>>>>>>> else > >>>>>>>>> { > >>>>>>>>> assert false : "Unknown modifier: " + modifier; > >>>>>>>>> @@ -752,6 +771,8 @@ public abstract class DefinitionBase > >> implements > >>>>>>>> IDocumentableDefinition, IDefini > >>>>>>>>> result.addModifier(ASModifier.DYNAMIC); > >>>>>>>>> if ((flags & FLAG_NATIVE) != 0) > >>>>>>>>> result.addModifier(ASModifier.NATIVE); > >>>>>>>>> + if (abstractFlag) > >>>>>>>>> + result.addModifier(ASModifier.ABSTRACT); > >>>>>>>>> return result; > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> @@ -774,6 +795,9 @@ public abstract class DefinitionBase > >> implements > >>>>>>>> IDocumentableDefinition, IDefini > >>>>>>>>> else if (modifier == ASModifier.NATIVE) > >>>>>>>>> flags |= FLAG_NATIVE; > >>>>>>>>> > >>>>>>>>> + else if (modifier == ASModifier.ABSTRACT) > >>>>>>>>> + setAbstract(); > >>>>>>>>> + > >>>>>>>>> else > >>>>>>>>> assert false; > >>>>>>>>> } > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/ASToken.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/ASToken.java > >>>>>>>>> index 52f2040..fa8b149 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/ASToken.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/ASToken.java > >>>>>>>>> @@ -463,6 +463,7 @@ public class ASToken extends TokenBase > >>>> implements > >>>>>>>> IASToken, ASTokenTypes > >>>>>>>>> case TOKEN_MODIFIER_NATIVE: > >>>>>>>>> case TOKEN_MODIFIER_OVERRIDE: > >>>>>>>>> case TOKEN_MODIFIER_STATIC: > >>>>>>>>> + case TOKEN_MODIFIER_ABSTRACT: > >>>>>>>>> return true; > >>>>>>>>> } > >>>>>>>>> return false; > >>>>>>>>> @@ -514,6 +515,7 @@ public class ASToken extends TokenBase > >>>> implements > >>>>>>>> IASToken, ASTokenTypes > >>>>>>>>> case TOKEN_MODIFIER_OVERRIDE: > >>>>>>>>> case TOKEN_MODIFIER_STATIC: > >>>>>>>>> case TOKEN_MODIFIER_VIRTUAL: > >>>>>>>>> + case TOKEN_MODIFIER_ABSTRACT: > >>>>>>>>> case TOKEN_RESERVED_WORD_GET: > >>>>>>>>> case TOKEN_RESERVED_WORD_SET: > >>>>>>>>> case TOKEN_RESERVED_WORD_NAMESPACE: > >>>>>>>>> @@ -655,6 +657,7 @@ public class ASToken extends TokenBase > >>>> implements > >>>>>>>> IASToken, ASTokenTypes > >>>>>>>>> case TOKEN_MODIFIER_NATIVE: > >>>>>>>>> case TOKEN_MODIFIER_OVERRIDE: > >>>>>>>>> case TOKEN_MODIFIER_STATIC: > >>>>>>>>> + case TOKEN_MODIFIER_ABSTRACT: > >>>>>>>>> return true; > >>>>>>>>> } > >>>>>>>>> return false; > >>>>>>>>> @@ -918,6 +921,7 @@ public class ASToken extends TokenBase > >>>> implements > >>>>>>>> IASToken, ASTokenTypes > >>>>>>>>> case TOKEN_MODIFIER_NATIVE: > >>>>>>>>> case TOKEN_MODIFIER_OVERRIDE: > >>>>>>>>> case TOKEN_MODIFIER_STATIC: > >>>>>>>>> + case TOKEN_MODIFIER_ABSTRACT: > >>>>>>>>> return ASTokenKind.MODIFIER; > >>>>>>>>> case HIDDEN_TOKEN_BUILTIN_NS: > >>>>>>>>> case TOKEN_NAMESPACE_ANNOTATION: > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/BaseASParser.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/BaseASParser.java > >>>>>>>>> index a8c3d7f..c247c89 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/BaseASParser.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/BaseASParser.java > >>>>>>>>> @@ -2329,7 +2329,7 @@ abstract class BaseASParser extends > >> LLkParser > >>>>>>>> implements IProblemReporter > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> private static final ImmutableSet<String> > >>>>>>>> CONTEXTUAL_RESERVED_KEYWORD_MODIFIERS = > >>>>>>>>> - ImmutableSet.of("dynamic", "final", "native", > >> "static", > >>>>>>>> "override"); > >>>>>>>>> + ImmutableSet.of("dynamic", "final", "native", > >> "static", > >>>>>>>> "override", "abstract"); > >>>>>>>>> > >>>>>>>>> /** > >>>>>>>>> * Recover from {@link CanNotInsertSemicolonProblem} after an > >>>>>>>> expression > >>>>>>>>> @@ -2854,6 +2854,7 @@ abstract class BaseASParser extends > >> LLkParser > >>>>>>>> implements IProblemReporter > >>>>>>>>> case TOKEN_MODIFIER_OVERRIDE: > >>>>>>>>> case TOKEN_MODIFIER_STATIC: > >>>>>>>>> case TOKEN_MODIFIER_VIRTUAL: > >>>>>>>>> + case TOKEN_MODIFIER_ABSTRACT: > >>>>>>>>> return true; > >>>>>>>>> } > >>>>>>>>> } > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/ConfigProcessor.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/ConfigProcessor.java > >>>>>>>>> index 1cf7922..af2dd3b 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/ConfigProcessor.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/ConfigProcessor.java > >>>>>>>>> @@ -164,6 +164,12 @@ public class ConfigProcessor > >>>>>>>>> // TODO Auto-generated method stub > >>>>>>>>> return false; > >>>>>>>>> } > >>>>>>>>> + > >>>>>>>>> + @Override > >>>>>>>>> + public boolean getAllowAbstractClasses() { > >>>>>>>>> + // TODO Auto-generated method stub > >>>>>>>>> + return false; > >>>>>>>>> + } > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> /** > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/StreamingASTokenizer.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/StreamingASTokenizer.java > >>>>>>>>> index 2cb8e99..32017a4 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/StreamingASTokenizer.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/StreamingASTokenizer.java > >>>>>>>>> @@ -101,6 +101,7 @@ public class StreamingASTokenizer implements > >>>>>>>> ASTokenTypes, IASTokenizer, Closeab > >>>>>>>>> .put(IASKeywordConstants.OVERRIDE, > >>>> TOKEN_MODIFIER_OVERRIDE) > >>>>>>>>> .put(IASKeywordConstants.STATIC, > >> TOKEN_MODIFIER_STATIC) > >>>>>>>>> .put(IASKeywordConstants.VIRTUAL, > >> TOKEN_MODIFIER_VIRTUAL) > >>>>>>>>> + .put(IASKeywordConstants.ABSTRACT, > >>>>> TOKEN_MODIFIER_ABSTRACT) > >>>>>>>>> .put(IASKeywordConstants.SET, > >> TOKEN_RESERVED_WORD_SET) > >>>>>>>>> // Keywords with special token types that affect > >>>> subsequent > >>>>>>>> blocks > >>>>>>>>> .put(IASKeywordConstants.CATCH, TOKEN_KEYWORD_CATCH) > >>>>>>>>> @@ -917,6 +918,7 @@ public class StreamingASTokenizer implements > >>>>>>>> ASTokenTypes, IASTokenizer, Closeab > >>>>>>>>> case TOKEN_MODIFIER_OVERRIDE: > >>>>>>>>> case TOKEN_MODIFIER_STATIC: > >>>>>>>>> case TOKEN_MODIFIER_VIRTUAL: > >>>>>>>>> + case TOKEN_MODIFIER_ABSTRACT: > >>>>>>>>> { > >>>>>>>>> // previous token is either a modifier or a > >>>>>>>> namespace, or if > >>>>>>>>> // null, assume keyword > >>>>>>>>> @@ -938,6 +940,7 @@ public class StreamingASTokenizer implements > >>>>>>>> ASTokenTypes, IASTokenizer, Closeab > >>>>>>>>> case TOKEN_MODIFIER_OVERRIDE: > >>>>>>>>> case TOKEN_MODIFIER_STATIC: > >>>>>>>>> case TOKEN_MODIFIER_VIRTUAL: > >>>>>>>>> + case TOKEN_MODIFIER_ABSTRACT: > >>>>>>>>> case TOKEN_NAMESPACE_ANNOTATION: > >>>>>>>>> case TOKEN_NAMESPACE_NAME: > >>>>>>>>> case HIDDEN_TOKEN_BUILTIN_NS: > >>>>>>>>> @@ -1773,6 +1776,7 @@ public class StreamingASTokenizer > >> implements > >>>>>>>> ASTokenTypes, IASTokenizer, Closeab > >>>>>>>>> case TOKEN_MODIFIER_OVERRIDE: > >>>>>>>>> case TOKEN_MODIFIER_STATIC: > >>>>>>>>> case TOKEN_MODIFIER_VIRTUAL: > >>>>>>>>> + case TOKEN_MODIFIER_ABSTRACT: > >>>>>>>>> case TOKEN_KEYWORD_CLASS: > >>>>>>>>> case TOKEN_KEYWORD_INTERFACE: > >>>>>>>>> case TOKEN_NAMESPACE_ANNOTATION: > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/projects/ASCProject.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/projects/ASCProject.java > >>>>>>>>> index d229ca3..de04bb2 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/projects/ASCProject.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/projects/ASCProject.java > >>>>>>>>> @@ -86,4 +86,10 @@ public class ASCProject extends > >> CompilerProject > >>>>>>>> implements IASCProject > >>>>>>>>> // TODO Auto-generated method stub > >>>>>>>>> return false; > >>>>>>>>> } > >>>>>>>>> + > >>>>>>>>> + @Override > >>>>>>>>> + public boolean getAllowAbstractClasses() { > >>>>>>>>> + // TODO Auto-generated method stub > >>>>>>>>> + return false; > >>>>>>>>> + } > >>>>>>>>> } > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleProject.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleProject.java > >>>>>>>>> index 6a03191..c99f5bb 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleProject.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleProject.java > >>>>>>>>> @@ -2445,6 +2445,21 @@ public class RoyaleProject extends > >> ASProject > >>>>>>>> implements IRoyaleProject, ICompile > >>>>>>>>> allowImportAliases = allow; > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> + private boolean allowAbstractClasses = false; > >>>>>>>>> + > >>>>>>>>> + /** > >>>>>>>>> + * Indicates if abstract classes are allowed. > >>>>>>>>> + */ > >>>>>>>>> + @Override > >>>>>>>>> + public boolean getAllowAbstractClasses() > >>>>>>>>> + { > >>>>>>>>> + return allowAbstractClasses; > >>>>>>>>> + } > >>>>>>>>> + public void setAllowAbstractClasses(boolean allow) > >>>>>>>>> + { > >>>>>>>>> + allowAbstractClasses = allow; > >>>>>>>>> + } > >>>>>>>>> + > >>>>>>>>> @Override > >>>>>>>>> public boolean isPlatformRule(ICSSRule rule) { > >>>>>>>>> return true; > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleProjectConfigurator.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleProjectConfigurator.java > >>>>>>>>> index 409dfd9..cb3a35b 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleProjectConfigurator.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleProjectConfigurator.java > >>>>>>>>> @@ -264,6 +264,7 @@ public class RoyaleProjectConfigurator > >> extends > >>>>>>>> Configurator > >>>>>>>>> > >>>>>>>> > >>>>> > >>>> > >> > project.setAllowPrivateNameConflicts(configuration.getCompilerAllowPrivateNameConflicts()); > >>>>>>>>> > >>>>>>>>> > >>>>>>>> > >>>>> > >>>> > >> > project.setAllowImportAliases(configuration.getCompilerAllowImportAliases()); > >>>>>>>>> + > >>>>>>>> > >>>>> > >>>> > >> > project.setAllowAbstractClasses(configuration.getCompilerAllowAbstractClasses()); > >>>>>>>>> > >>>>>>>>> DataTranscoder.embedClassName = > >>>>>>>> configuration.getByteArrayEmbedClass(); > >>>>>>>>> } > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/semantics/MethodBodySemanticChecker.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/semantics/MethodBodySemanticChecker.java > >>>>>>>>> index 0e009fe..c142116 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/semantics/MethodBodySemanticChecker.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/semantics/MethodBodySemanticChecker.java > >>>>>>>>> @@ -2089,6 +2089,13 @@ public class MethodBodySemanticChecker > >>>>>>>>> { > >>>>>>>>> ClassDefinition class_def = (ClassDefinition)def; > >>>>>>>>> > >>>>>>>>> + if ( project.getAllowAbstractClasses() && > >>>>>>>> class_def.isAbstract() ) > >>>>>>>>> + { > >>>>>>>>> + addProblem(new > >>>>> AbstractClassCannotBeInstantiatedProblem( > >>>>>>>>> + roundUpUsualSuspects(class_binding, iNode) > >>>>>>>>> + )); > >>>>>>>>> + } > >>>>>>>>> + > >>>>>>>>> IFunctionDefinition ctor = > >> class_def.getConstructor(); > >>>>>>>>> > >>>>>>>>> if ( ctor instanceof FunctionDefinition ) > >>>>>>>>> @@ -2456,6 +2463,10 @@ public class MethodBodySemanticChecker > >>>>>>>>> { > >>>>>>>>> currentScope.addProblem(new > >>>>>>>> StaticOutsideClassProblem(site)); > >>>>>>>>> } > >>>>>>>>> + else if( modifier == ASModifier.ABSTRACT ) > >>>>>>>>> + { > >>>>>>>>> + currentScope.addProblem(new > >>>>>>>> AbstractOutsideClassProblem(site)); > >>>>>>>>> + } > >>>>>>>>> } > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/as/BaseDefinitionNode.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/as/BaseDefinitionNode.java > >>>>>>>>> index a1d9609..c45def6 100644 > >>>>>>>>> --- > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/as/BaseDefinitionNode.java > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/as/BaseDefinitionNode.java > >>>>>>>>> @@ -401,6 +401,8 @@ public abstract class BaseDefinitionNode > >> extends > >>>>>>>> TreeNode implements IDocumentab > >>>>>>>>> db.setOverride(); > >>>>>>>>> if (hasModifier(ASModifier.STATIC)) > >>>>>>>>> db.setStatic(); > >>>>>>>>> + if (hasModifier(ASModifier.ABSTRACT)) > >>>>>>>>> + db.setAbstract(); > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> protected void fillInMetadata(DefinitionBase definition) > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/problems/AbstractClassCannotBeInstantiatedProblem.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/problems/AbstractClassCannotBeInstantiatedProblem.java > >>>>>>>>> new file mode 100644 > >>>>>>>>> index 0000000..e9d34d1 > >>>>>>>>> --- /dev/null > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/problems/AbstractClassCannotBeInstantiatedProblem.java > >>>>>>>>> @@ -0,0 +1,42 @@ > >>>>>>>>> +/* > >>>>>>>>> + * > >>>>>>>>> + * Licensed to the Apache Software Foundation (ASF) under one > >> or > >>>>> more > >>>>>>>>> + * contributor license agreements. See the NOTICE file > >>>> distributed > >>>>>>>> with > >>>>>>>>> + * this work for additional information regarding copyright > >>>>> ownership. > >>>>>>>>> + * The ASF licenses this file to You under the Apache License, > >>>>> Version > >>>>>>>> 2.0 > >>>>>>>>> + * (the "License"); you may not use this file except in > >> compliance > >>>>> with > >>>>>>>>> + * the License. You may obtain a copy of the License at > >>>>>>>>> + * > >>>>>>>>> + * http://www.apache.org/licenses/LICENSE-2.0 > >>>>>>>>> + * > >>>>>>>>> + * Unless required by applicable law or agreed to in writing, > >>>>> software > >>>>>>>>> + * distributed under the License is distributed on an "AS IS" > >>>> BASIS, > >>>>>>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either > >> express or > >>>>>>>> implied. > >>>>>>>>> + * See the License for the specific language governing > >> permissions > >>>>> and > >>>>>>>>> + * limitations under the License. > >>>>>>>>> + * > >>>>>>>>> + */ > >>>>>>>>> + > >>>>>>>>> +package org.apache.royale.compiler.problems; > >>>>>>>>> + > >>>>>>>>> +import org.apache.royale.compiler.tree.as.IASNode; > >>>>>>>>> + > >>>>>>>>> +/** > >>>>>>>>> + * Semantics diagnostic emitted when the method body > >>>>>>>>> + * semantic checker detects an attempt to instantiate an > >> abstract > >>>>>>>> class. > >>>>>>>>> + */ > >>>>>>>>> +public final class AbstractClassCannotBeInstantiatedProblem > >> extends > >>>>>>>> SemanticProblem > >>>>>>>>> +{ > >>>>>>>>> + public static final String DESCRIPTION = > >>>>>>>>> + "Abstract classes cannot be instantiated with the > >> ${NEW} > >>>>>>>> operator."; > >>>>>>>>> + > >>>>>>>>> + public static final int errorCode = 1156; > >>>>>>>>> + > >>>>>>>>> + public AbstractClassCannotBeInstantiatedProblem(IASNode > >> site) > >>>>>>>>> + { > >>>>>>>>> + super(site); > >>>>>>>>> + } > >>>>>>>>> + > >>>>>>>>> + // Prevent these from being localized. > >>>>>>>>> + public final String NEW = "new"; > >>>>>>>>> +} > >>>>>>>>> diff --git > >>>>>>>> > >>>>> > >>>> > >> > a/compiler/src/main/java/org/apache/royale/compiler/problems/AbstractOutsideClassProblem.java > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/problems/AbstractOutsideClassProblem.java > >>>>>>>>> new file mode 100644 > >>>>>>>>> index 0000000..4fea9f1 > >>>>>>>>> --- /dev/null > >>>>>>>>> +++ > >>>>>>>> > >>>>> > >>>> > >> > b/compiler/src/main/java/org/apache/royale/compiler/problems/AbstractOutsideClassProblem.java > >>>>>>>>> @@ -0,0 +1,43 @@ > >>>>>>>>> +/* > >>>>>>>>> + * > >>>>>>>>> + * Licensed to the Apache Software Foundation (ASF) under one > >> or > >>>>> more > >>>>>>>>> + * contributor license agreements. See the NOTICE file > >>>> distributed > >>>>>>>> with > >>>>>>>>> + * this work for additional information regarding copyright > >>>>> ownership. > >>>>>>>>> + * The ASF licenses this file to You under the Apache License, > >>>>> Version > >>>>>>>> 2.0 > >>>>>>>>> + * (the "License"); you may not use this file except in > >> compliance > >>>>> with > >>>>>>>>> + * the License. You may obtain a copy of the License at > >>>>>>>>> + * > >>>>>>>>> + * http://www.apache.org/licenses/LICENSE-2.0 > >>>>>>>>> + * > >>>>>>>>> + * Unless required by applicable law or agreed to in writing, > >>>>> software > >>>>>>>>> + * distributed under the License is distributed on an "AS IS" > >>>> BASIS, > >>>>>>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either > >> express or > >>>>>>>> implied. > >>>>>>>>> + * See the License for the specific language governing > >> permissions > >>>>> and > >>>>>>>>> + * limitations under the License. > >>>>>>>>> + * > >>>>>>>>> + */ > >>>>>>>>> + > >>>>>>>>> +package org.apache.royale.compiler.problems; > >>>>>>>>> + > >>>>>>>>> +import org.apache.royale.compiler.tree.as.IASNode; > >>>>>>>>> + > >>>>>>>>> +/** > >>>>>>>>> + * Problem generated when 'abstract' is used outside of a class > >>>>>>>>> + */ > >>>>>>>>> +public final class AbstractOutsideClassProblem extends > >>>> CodegenProblem > >>>>>>>>> +{ > >>>>>>>>> + // TODO ErrorMSG: not specific to methods > >>>>>>>>> + public static final String DESCRIPTION = > >>>>>>>>> + "The ${ABSTRACT} attribute may be used only > >> ${CLASS} > >>>>>>>> property definitions."; > >>>>>>>>> + > >>>>>>>>> + public static final int errorCode = 1011; > >>>>>>>>> + > >>>>>>>>> + public AbstractOutsideClassProblem(IASNode site) > >>>>>>>>> + { > >>>>>>>>> + super(site); > >>>>>>>>> + } > >>>>>>>>> + > >>>>>>>>> + // Prevent these from being localized. > >>>>>>>>> + public final String ABSTRACT = "abstract"; > >>>>>>>>> + public final String CLASS = "class"; > >>>>>>>>> +} > >>>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>> > >>>>>>> -- > >>>>>>> > >>>>>>> Piotr Zarzycki > >>>>>>> > >>>>>>> Patreon: *https://www.patreon.com/piotrzarzycki > >>>>>>> <https://www.patreon.com/piotrzarzycki>* > >>>>>>> > >>>>> > >>>>> > >>>>> > >>>> > >>>> -- > >>>> Carlos Rovira > >>>> http://about.me/carlosrovira > >>>> > >>> > >>> > >>> -- > >>> > >>> Piotr Zarzycki > >>> > >>> Patreon: *https://www.patreon.com/piotrzarzycki > >>> <https://www.patreon.com/piotrzarzycki>* > >>> > >> > > > > > > -- > > > > Piotr Zarzycki > > > > Patreon: *https://www.patreon.com/piotrzarzycki > > <https://www.patreon.com/piotrzarzycki>* > > -- Carlos Rovira http://about.me/carlosrovira
