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>*

Reply via email to