You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2013/10/08 23:50:10 UTC
[10/14] git commit: [flex-falcon] [refs/heads/develop] - changes
required to allow [Bindable] on getters and setters. Getters and setters may
be overrides,
and only one or the other has [Bindable] metadata. The basic premise is to
search the metadata f
changes required to allow [Bindable] on getters and setters. Getters and setters may be overrides, and only one or the other has [Bindable] metadata. The basic premise is to search the metadata for [Bindable] (isBindable) looks up the inheritance chain which is what we don't want). We find and search the metadata for the other accessor if it exists. Then if there is [Bindable] we move the method into the bindable namespace and generate the wrapper method.
Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/89968c43
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/89968c43
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/89968c43
Branch: refs/heads/develop
Commit: 89968c43a14d1e0ec3b45c1f2d4004cd65ded99d
Parents: 4201746
Author: Alex Harui <ah...@apache.org>
Authored: Tue Oct 8 07:47:40 2013 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Oct 8 13:50:58 2013 -0700
----------------------------------------------------------------------
.../internal/as/codegen/BindableHelper.java | 8 ++
.../as/codegen/ClassDirectiveProcessor.java | 102 ++++++++++++++++++-
.../internal/as/codegen/LexicalScope.java | 38 ++++++-
.../definitions/AccessorDefinition.java | 16 ++-
.../internal/definitions/DefinitionBase.java | 6 ++
.../compiler/internal/projects/FlexProject.java | 10 +-
.../flex/compiler/internal/scopes/ASScope.java | 4 +-
.../internal/tree/as/BaseDefinitionNode.java | 6 +-
.../tree/as/BaseTypedDefinitionNode.java | 87 ++++++++++++++++
.../internal/tree/as/BaseVariableNode.java | 56 ----------
.../compiler/internal/tree/as/FunctionNode.java | 5 +-
11 files changed, 264 insertions(+), 74 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/89968c43/compiler/src/org/apache/flex/compiler/internal/as/codegen/BindableHelper.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/as/codegen/BindableHelper.java b/compiler/src/org/apache/flex/compiler/internal/as/codegen/BindableHelper.java
index 21f5bda..ea1e0a3 100644
--- a/compiler/src/org/apache/flex/compiler/internal/as/codegen/BindableHelper.java
+++ b/compiler/src/org/apache/flex/compiler/internal/as/codegen/BindableHelper.java
@@ -526,6 +526,13 @@ public class BindableHelper
private static final Namespace bindablePrivateNamespace = new Namespace(CONSTANT_PrivateNs, ".BindableNamespace");
/**
+ * The namespace to put compiler generated members into so that they do not conflict with any user defined
+ * members.
+ */
+ public static final NamespaceDefinition bindableNamespaceDefinition = NamespaceDefinition.createNamespaceDefinition(bindablePrivateNamespace);
+
+
+ /**
* The mx.events package namespace
*/
public static Namespace NAMESPACE_MX_EVENTS = new Namespace(CONSTANT_PackageNs, "mx.events");
@@ -556,5 +563,6 @@ public class BindableHelper
private static final Name NAME_STATIC_EVENT_DISPATCHER = new Name("staticEventDispatcher");
public static String PROPERTY_CHANGE = "propertyChange";
+ public static String BINDABLE = "Bindable";
}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/89968c43/compiler/src/org/apache/flex/compiler/internal/as/codegen/ClassDirectiveProcessor.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/as/codegen/ClassDirectiveProcessor.java b/compiler/src/org/apache/flex/compiler/internal/as/codegen/ClassDirectiveProcessor.java
index 29d2a7b..2354faa 100644
--- a/compiler/src/org/apache/flex/compiler/internal/as/codegen/ClassDirectiveProcessor.java
+++ b/compiler/src/org/apache/flex/compiler/internal/as/codegen/ClassDirectiveProcessor.java
@@ -52,7 +52,10 @@ import org.apache.flex.compiler.definitions.IClassDefinition;
import org.apache.flex.compiler.definitions.IConstantDefinition;
import org.apache.flex.compiler.definitions.IDefinition;
import org.apache.flex.compiler.definitions.IInterfaceDefinition;
+import org.apache.flex.compiler.definitions.ITypeDefinition;
import org.apache.flex.compiler.definitions.metadata.IMetaTag;
+import org.apache.flex.compiler.definitions.metadata.IMetaTagAttribute;
+import org.apache.flex.compiler.definitions.references.INamespaceReference;
import org.apache.flex.compiler.exceptions.CodegenInterruptedException;
import org.apache.flex.compiler.problems.CircularTypeReferenceProblem;
import org.apache.flex.compiler.problems.ConstructorCannotHaveReturnTypeProblem;
@@ -83,9 +86,11 @@ import org.apache.flex.compiler.tree.as.IExpressionNode;
import org.apache.flex.compiler.tree.as.ILanguageIdentifierNode;
import org.apache.flex.compiler.tree.as.ILanguageIdentifierNode.LanguageIdentifierKind;
import org.apache.flex.compiler.internal.as.codegen.ICodeGenerator.IConstantValue;
+import org.apache.flex.compiler.internal.definitions.AccessorDefinition;
import org.apache.flex.compiler.internal.definitions.ClassDefinition;
import org.apache.flex.compiler.internal.definitions.DefinitionBase;
import org.apache.flex.compiler.internal.definitions.FunctionDefinition;
+import org.apache.flex.compiler.internal.definitions.GetterDefinition;
import org.apache.flex.compiler.internal.definitions.InterfaceDefinition;
import org.apache.flex.compiler.internal.definitions.NamespaceDefinition;
import org.apache.flex.compiler.internal.definitions.TypeDefinitionBase;
@@ -94,6 +99,7 @@ import org.apache.flex.compiler.internal.definitions.metadata.MetaTag;
import org.apache.flex.compiler.internal.definitions.metadata.ResourceBundleMetaTag;
import org.apache.flex.compiler.internal.embedding.EmbedData;
import org.apache.flex.compiler.internal.projects.CompilerProject;
+import org.apache.flex.compiler.internal.scopes.ASScope;
import org.apache.flex.compiler.internal.semantics.MethodBodySemanticChecker;
import org.apache.flex.compiler.internal.semantics.SemanticUtils;
import org.apache.flex.compiler.internal.tree.as.BaseDefinitionNode;
@@ -532,6 +538,23 @@ class ClassDirectiveProcessor extends DirectiveProcessor
cinit_insns.addAll(this.cinitInsns);
cinit_insns.addInstruction(OP_returnvoid);
+
+ if (this.cinfo.cInit == null)
+ {
+ // Speculatively initialize the class' cinit
+ // (static class initializer routine)'s data
+ // structures; the code generator may need to
+ // store information in them.
+ this.cinfo.cInit = new MethodInfo();
+ MethodBodyInfo cinit_info = new MethodBodyInfo();
+ cinit_info.setMethodInfo(this.cinfo.cInit);
+
+ this.classStaticScope.setMethodInfo(this.cinfo.cInit);
+ this.classStaticScope.methodVisitor = emitter.visitMethod(this.cinfo.cInit);
+ this.classStaticScope.methodVisitor.visit();
+ this.classStaticScope.methodBodyVisitor = this.classStaticScope.methodVisitor.visitBody(cinit_info);
+ this.classStaticScope.methodBodyVisitor.visit();
+ }
/*
* FIXME: NPE while compiling 'spark.swc'
@@ -650,6 +673,52 @@ class ClassDirectiveProcessor extends DirectiveProcessor
final FunctionDefinition funcDef = func.getDefinition();
final boolean is_constructor = func.isConstructor();
+
+ ICompilerProject project = classScope.getProject();
+
+ boolean isBindable = false;
+ if (funcDef instanceof AccessorDefinition)
+ {
+ IMetaTag[] metaTags = funcDef.getAllMetaTags();
+ for (IMetaTag metaTag : metaTags)
+ {
+ if (metaTag.getTagName().equals(BindableHelper.BINDABLE))
+ {
+ IMetaTagAttribute[] attrs = metaTag.getAllAttributes();
+ isBindable = attrs.length == 0;
+ }
+ }
+ if (!isBindable)
+ {
+ AccessorDefinition otherDef =
+ ((AccessorDefinition)funcDef).resolveCorrespondingAccessor(classScope.getProject());
+ // ignore if not in your class def
+ if (otherDef != null && otherDef.getContainingScope().equals(funcDef.getContainingScope()))
+ {
+ metaTags = otherDef.getAllMetaTags();
+ for (IMetaTag metaTag : metaTags)
+ {
+ if (metaTag.getTagName().equals(BindableHelper.BINDABLE))
+ {
+ IMetaTagAttribute[] attrs = metaTag.getAllAttributes();
+ isBindable = attrs.length == 0;
+ }
+ }
+ }
+ }
+ }
+ Name funcName = funcDef.getMName(classScope.getProject());
+ Name bindableName = null;
+ boolean wasOverride = false;
+ if (isBindable)
+ {
+ // move function into bindable namespace
+ bindableName = BindableHelper.getBackingPropertyName(funcName);
+ INamespaceReference ns = BindableHelper.bindableNamespaceDefinition;
+ wasOverride = funcDef.isOverride();
+ funcDef.setNamespaceReference(ns);
+ funcDef.unsetOverride();
+ }
functionSemanticChecks(func);
@@ -675,8 +744,8 @@ class ClassDirectiveProcessor extends DirectiveProcessor
if ( mi != null )
{
- Name funcName = funcDef.getMName(classScope.getProject());
- ITraitVisitor tv = ls.traitsVisitor.visitMethodTrait(functionTraitKind(func, TRAIT_Method), funcName, 0, mi);
+ ITraitVisitor tv = ls.traitsVisitor.visitMethodTrait(functionTraitKind(func, TRAIT_Method),
+ bindableName != null ? bindableName : funcName, 0, mi);
if (funcName != null)
classScope.getMethodBodySemanticChecker().checkFunctionForConflictingDefinitions(func, funcDef);
@@ -689,11 +758,38 @@ class ClassDirectiveProcessor extends DirectiveProcessor
if ( func.hasModifier(ASModifier.FINAL))
tv.visitAttribute(Trait.TRAIT_FINAL, Boolean.TRUE);
- if ( func.hasModifier(ASModifier.OVERRIDE) || funcDef.isOverride())
+ // don't set override if we've moved it to the bindable namespace
+ if (!wasOverride && (func.hasModifier(ASModifier.OVERRIDE) || funcDef.isOverride()))
tv.visitAttribute(Trait.TRAIT_OVERRIDE, Boolean.TRUE);
tv.visitEnd();
}
}
+ if (isBindable)
+ {
+ if (wasOverride)
+ funcDef.setOverride();
+ if (funcDef instanceof GetterDefinition)
+ {
+ DefinitionBase bindableGetter = func.buildBindableGetter(func.getName());
+ ASScope funcScope = (ASScope)funcDef.getContainingScope();
+ funcScope.addDefinition(bindableGetter);
+ LexicalScope ls = funcDef.isStatic()? classStaticScope: classScope;
+ ls.generateBindableGetter(bindableGetter, funcName, bindableName,
+ funcDef.resolveType(project).getMName(project), getAllMetaTags(funcDef));
+ }
+ else
+ {
+ TypeDefinitionBase typeDef = funcDef.resolveType(project);
+ ASScope funcScope = (ASScope)funcDef.getContainingScope();
+ DefinitionBase bindableSetter = func.buildBindableSetter(func.getName(),
+ funcScope,
+ funcDef.getTypeReference());
+ funcScope.addDefinition(bindableSetter);
+ LexicalScope ls = funcDef.isStatic()? classStaticScope: classScope;
+ ls.generateBindableSetter(bindableSetter, funcName, bindableName,
+ typeDef.getMName(project), getAllMetaTags(funcDef));
+ }
+ }
}
/**
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/89968c43/compiler/src/org/apache/flex/compiler/internal/as/codegen/LexicalScope.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/as/codegen/LexicalScope.java b/compiler/src/org/apache/flex/compiler/internal/as/codegen/LexicalScope.java
index d8128a2..92a2973 100644
--- a/compiler/src/org/apache/flex/compiler/internal/as/codegen/LexicalScope.java
+++ b/compiler/src/org/apache/flex/compiler/internal/as/codegen/LexicalScope.java
@@ -44,6 +44,7 @@ import org.apache.flex.abc.semantics.Name;
import org.apache.flex.abc.semantics.Namespace;
import org.apache.flex.abc.semantics.Nsset;
import org.apache.flex.abc.semantics.PooledValue;
+import org.apache.flex.abc.semantics.Trait;
import org.apache.flex.abc.visitors.IABCVisitor;
import org.apache.flex.abc.visitors.IMetadataVisitor;
import org.apache.flex.abc.visitors.IMethodBodyVisitor;
@@ -59,6 +60,7 @@ import org.apache.flex.compiler.definitions.metadata.IMetaTag;
import org.apache.flex.compiler.definitions.metadata.IMetaTagAttribute;
import org.apache.flex.compiler.internal.definitions.DefinitionBase;
import org.apache.flex.compiler.internal.definitions.metadata.MetaTag;
+import org.apache.flex.compiler.internal.definitions.metadata.MetaTagAttribute;
import org.apache.flex.compiler.internal.semantics.MethodBodySemanticChecker;
import org.apache.flex.compiler.internal.semantics.SemanticUtils;
import org.apache.flex.compiler.internal.tree.as.BaseVariableNode;
@@ -627,10 +629,16 @@ public class LexicalScope
var_type,
noInitializer
);
- ITraitVisitor getterTv = BindableHelper.generateBindableGetter(this, var_name, backingPropertyName, var_type);
-
IDefinition bindableVarDef = var.getDefinition();
+ generateBindableGetter(bindableVarDef, var_name, backingPropertyName, var_type, metaTags);
+ generateBindableSetter(bindableVarDef, var_name, backingPropertyName, var_type, metaTags);
+ }
+
+ public void generateBindableGetter(IDefinition bindableVarDef, Name var_name, Name backingPropertyName, Name var_type, IMetaInfo[] metaTags)
+ {
+ ITraitVisitor getterTv = BindableHelper.generateBindableGetter(this, var_name, backingPropertyName, var_type);
+
IMetaTag gotoDefinitionMetaTag = MetaTag.createGotoDefinitionHelp(bindableVarDef,
bindableVarDef.getContainingFilePath(),
Integer.toString(bindableVarDef.getNameStart()), false);
@@ -639,6 +647,9 @@ public class LexicalScope
// If we have an IMetaTagsNode use that, otherwise get the metadata from the definition
processMetadata(getterTv, metaTags);
+ if (bindableVarDef.isOverride())
+ getterTv.visitAttribute(Trait.TRAIT_OVERRIDE, Boolean.TRUE);
+
// We don't codegen classes in parallel right now,
// so we know that we are on the main code generation thread
// because bindable variables are always members of a class.
@@ -646,9 +657,23 @@ public class LexicalScope
// call visitEnd here and the vistEnd calls in generateBindableSetter
// are ok too.
getterTv.visitEnd();
- ITraitVisitor setterTv = BindableHelper.generateBindableSetter(this, var_name, backingPropertyName, var_type, var.getDefinition());
+ }
+
+ public void generateBindableSetter(IDefinition bindableVarDef, Name var_name, Name backingPropertyName, Name var_type, IMetaInfo[] metaTags)
+ {
+
+ ITraitVisitor setterTv = BindableHelper.generateBindableSetter(this, var_name, backingPropertyName, var_type, bindableVarDef);
+
+ IMetaTag gotoDefinitionMetaTag = MetaTag.createGotoDefinitionHelp(bindableVarDef,
+ bindableVarDef.getContainingFilePath(),
+ Integer.toString(bindableVarDef.getNameStart()), false);
+ metaTags = MetaTag.addMetaTag(metaTags, gotoDefinitionMetaTag);
+
+ processMetadata(setterTv, metaTags);
- processMetadata(setterTv, new IMetaInfo[] { gotoDefinitionMetaTag });
+ if (bindableVarDef.isOverride())
+ setterTv.visitAttribute(Trait.TRAIT_OVERRIDE, Boolean.TRUE);
+
setterTv.visitEnd();
}
@@ -1766,6 +1791,11 @@ public class LexicalScope
String name = meta_info.getTagName();
IMetaTagAttribute[] attrs = meta_info.getAllAttributes();
+ if (name.equals(BindableHelper.BINDABLE) && attrs.length == 0)
+ {
+ attrs = new MetaTagAttribute[1];
+ attrs[0] = new MetaTagAttribute("event", BindableHelper.PROPERTY_CHANGE);
+ }
String[] keys = new String[attrs.length];
String[] values = new String[attrs.length];
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/89968c43/compiler/src/org/apache/flex/compiler/internal/definitions/AccessorDefinition.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/definitions/AccessorDefinition.java b/compiler/src/org/apache/flex/compiler/internal/definitions/AccessorDefinition.java
index 75e9d5e..aadd143 100644
--- a/compiler/src/org/apache/flex/compiler/internal/definitions/AccessorDefinition.java
+++ b/compiler/src/org/apache/flex/compiler/internal/definitions/AccessorDefinition.java
@@ -36,6 +36,7 @@ import org.apache.flex.compiler.scopes.IDefinitionSet;
import org.apache.flex.compiler.tree.as.IVariableNode;
import org.apache.flex.compiler.definitions.IScopedDefinition;
import org.apache.flex.compiler.definitions.references.INamespaceReference;
+import org.apache.flex.compiler.internal.as.codegen.BindableHelper;
import org.apache.flex.compiler.internal.scopes.ASScope;
/**
@@ -136,6 +137,8 @@ public abstract class AccessorDefinition extends FunctionDefinition implements I
final INamespaceDefinition thisNamespaceDef = namespaceReference.resolveNamespaceReference(project);
if (thisNamespaceDef == null)
return null;
+ final boolean isBindable = ((NamespaceDefinition)thisNamespaceDef).getAETNamespace().getName().equals(
+ BindableHelper.bindableNamespaceDefinition.getAETNamespace().getName());
final IDefinitionSet definitionSet = scope.getLocalDefinitionSetByName(name);
@@ -158,13 +161,16 @@ public abstract class AccessorDefinition extends FunctionDefinition implements I
if (this instanceof IGetterDefinition && definition instanceof ISetterDefinition ||
this instanceof ISetterDefinition && definition instanceof IGetterDefinition)
{
- /* aharui: namespaces shouldn't have to match. A subclass may only override
- * one of the protected methods, and it was legal to have a public getter with
- * a protected setter and other combinations like that
- // The namespace must match or it isn't considering to correspond.
INamespaceReference testDefRef = definition.getNamespaceReference();
INamespaceDefinition testNamespaceDef = testDefRef.resolveNamespaceReference(project);
- if (thisNamespaceDef.equals(testNamespaceDef)) */
+ final boolean testBindable = ((NamespaceDefinition)testNamespaceDef).getAETNamespace().getName().equals(
+ BindableHelper.bindableNamespaceDefinition.getAETNamespace().getName());
+ /* aharui: namespaces shouldn't have to match. A subclass may only override
+ * one of the protected methods, and it was legal to have a public getter with
+ * a protected setter and other combinations like that. Either both
+ * have to be in the bindable namespace, or both are not. */
+ if ((isBindable && testBindable) ||
+ (!isBindable && !testBindable))
return (AccessorDefinition)definition;
}
}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/89968c43/compiler/src/org/apache/flex/compiler/internal/definitions/DefinitionBase.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/definitions/DefinitionBase.java b/compiler/src/org/apache/flex/compiler/internal/definitions/DefinitionBase.java
index c3ae2dd..3bf6df9 100644
--- a/compiler/src/org/apache/flex/compiler/internal/definitions/DefinitionBase.java
+++ b/compiler/src/org/apache/flex/compiler/internal/definitions/DefinitionBase.java
@@ -662,6 +662,12 @@ public abstract class DefinitionBase implements IDocumentableDefinition, IDefini
flags |= FLAG_OVERRIDE;
}
+ public void unsetOverride()
+ {
+ if (isOverride())
+ flags -= FLAG_OVERRIDE;
+ }
+
@Override
public boolean isStatic()
{
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/89968c43/compiler/src/org/apache/flex/compiler/internal/projects/FlexProject.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/projects/FlexProject.java b/compiler/src/org/apache/flex/compiler/internal/projects/FlexProject.java
index f12f47a..2b525b9 100644
--- a/compiler/src/org/apache/flex/compiler/internal/projects/FlexProject.java
+++ b/compiler/src/org/apache/flex/compiler/internal/projects/FlexProject.java
@@ -45,15 +45,19 @@ import org.apache.flex.compiler.definitions.IDefinition;
import org.apache.flex.compiler.definitions.IEffectDefinition;
import org.apache.flex.compiler.definitions.IEventDefinition;
import org.apache.flex.compiler.definitions.IGetterDefinition;
+import org.apache.flex.compiler.definitions.INamespaceDefinition;
import org.apache.flex.compiler.definitions.ISetterDefinition;
import org.apache.flex.compiler.definitions.IStyleDefinition;
import org.apache.flex.compiler.definitions.IVariableDefinition;
+import org.apache.flex.compiler.definitions.references.INamespaceReference;
import org.apache.flex.compiler.definitions.references.IResolvedQualifiersReference;
import org.apache.flex.compiler.definitions.references.ReferenceFactory;
import org.apache.flex.compiler.exceptions.LibraryCircularDependencyException;
import org.apache.flex.compiler.filespecs.IFileSpecification;
+import org.apache.flex.compiler.internal.as.codegen.BindableHelper;
import org.apache.flex.compiler.internal.css.CSSManager;
import org.apache.flex.compiler.internal.definitions.ClassDefinition;
+import org.apache.flex.compiler.internal.definitions.NamespaceDefinition;
import org.apache.flex.compiler.internal.definitions.PackageDefinition;
import org.apache.flex.compiler.internal.mxml.MXMLDialect;
import org.apache.flex.compiler.internal.mxml.MXMLManifestManager;
@@ -1295,9 +1299,13 @@ public class FlexProject extends ASProject implements IFlexProject
// Can MXML set mx_internal properties if you've done
// 'use namesapce mx_internal' in a <Script>?
winner = definition;
+ final INamespaceReference namespaceReference = definition.getNamespaceReference();
+ final INamespaceDefinition thisNamespaceDef = namespaceReference.resolveNamespaceReference(this);
+ final boolean isBindable = ((NamespaceDefinition)thisNamespaceDef).getAETNamespace().getName().equals(
+ BindableHelper.bindableNamespaceDefinition.getAETNamespace().getName());
// if we find a setter always take it, otherwise
// keep looking for a setter
- if (winner instanceof ISetterDefinition)
+ if (winner instanceof ISetterDefinition && !isBindable)
break;
}
}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/89968c43/compiler/src/org/apache/flex/compiler/internal/scopes/ASScope.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/scopes/ASScope.java b/compiler/src/org/apache/flex/compiler/internal/scopes/ASScope.java
index ff7aff7..84b6aa1 100644
--- a/compiler/src/org/apache/flex/compiler/internal/scopes/ASScope.java
+++ b/compiler/src/org/apache/flex/compiler/internal/scopes/ASScope.java
@@ -1682,7 +1682,9 @@ public abstract class ASScope extends ASScopeBase
{
IDefinition definition = project.getBuiltinType(builtinType);
- if( definition != null && builtinType != IASLanguageConstants.BuiltinType.ANY_TYPE )
+ if( definition != null &&
+ builtinType != IASLanguageConstants.BuiltinType.ANY_TYPE &&
+ builtinType != IASLanguageConstants.BuiltinType.VOID)
{
ASProjectScope projectScope = project.getScope();
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/89968c43/compiler/src/org/apache/flex/compiler/internal/tree/as/BaseDefinitionNode.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/tree/as/BaseDefinitionNode.java b/compiler/src/org/apache/flex/compiler/internal/tree/as/BaseDefinitionNode.java
index 86c53d4..2563416 100644
--- a/compiler/src/org/apache/flex/compiler/internal/tree/as/BaseDefinitionNode.java
+++ b/compiler/src/org/apache/flex/compiler/internal/tree/as/BaseDefinitionNode.java
@@ -377,7 +377,7 @@ public abstract class BaseDefinitionNode extends TreeNode implements IDocumentab
*
* @param db
*/
- void fillInNamespaceAndModifiers(DefinitionBase db)
+ protected void fillInNamespaceAndModifiers(DefinitionBase db)
{
INamespaceReference namespaceReference = NamespaceDefinition.createNamespaceReference(
getASScope(), getNamespaceNode(), this.hasModifier(ASModifier.STATIC));
@@ -387,7 +387,7 @@ public abstract class BaseDefinitionNode extends TreeNode implements IDocumentab
fillInModifiers(db);
}
- void fillInModifiers(DefinitionBase db)
+ protected void fillInModifiers(DefinitionBase db)
{
this.setDefinition(db);
@@ -403,7 +403,7 @@ public abstract class BaseDefinitionNode extends TreeNode implements IDocumentab
db.setStatic();
}
- void fillInMetadata(DefinitionBase definition)
+ protected void fillInMetadata(DefinitionBase definition)
{
IMetaTagsNode metaTagsNode = getMetaTagsNode();
if (metaTagsNode == null)
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/89968c43/compiler/src/org/apache/flex/compiler/internal/tree/as/BaseTypedDefinitionNode.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/tree/as/BaseTypedDefinitionNode.java b/compiler/src/org/apache/flex/compiler/internal/tree/as/BaseTypedDefinitionNode.java
index 3304f05..8bfc6f6 100644
--- a/compiler/src/org/apache/flex/compiler/internal/tree/as/BaseTypedDefinitionNode.java
+++ b/compiler/src/org/apache/flex/compiler/internal/tree/as/BaseTypedDefinitionNode.java
@@ -19,11 +19,28 @@
package org.apache.flex.compiler.internal.tree.as;
+import org.apache.flex.compiler.common.ASModifier;
+import org.apache.flex.compiler.constants.IASLanguageConstants;
+import org.apache.flex.compiler.definitions.metadata.IMetaTag;
+import org.apache.flex.compiler.definitions.references.INamespaceReference;
+import org.apache.flex.compiler.definitions.references.IReference;
+import org.apache.flex.compiler.definitions.references.ReferenceFactory;
+import org.apache.flex.compiler.internal.definitions.DefinitionBase;
+import org.apache.flex.compiler.internal.definitions.GetterDefinition;
+import org.apache.flex.compiler.internal.definitions.NamespaceDefinition;
+import org.apache.flex.compiler.internal.definitions.ParameterDefinition;
+import org.apache.flex.compiler.internal.definitions.SetterDefinition;
+import org.apache.flex.compiler.internal.definitions.SyntheticBindableGetterDefinition;
+import org.apache.flex.compiler.internal.definitions.SyntheticBindableSetterDefinition;
+import org.apache.flex.compiler.internal.scopes.ASScope;
+import org.apache.flex.compiler.internal.scopes.FunctionScope;
+import org.apache.flex.compiler.internal.tree.as.metadata.MetaTagsNode;
import org.apache.flex.compiler.parsing.IASToken;
import org.apache.flex.compiler.tree.as.IIdentifierNode;
import org.apache.flex.compiler.tree.as.ILanguageIdentifierNode;
import org.apache.flex.compiler.tree.as.ITypedNode;
import org.apache.flex.compiler.tree.as.ILanguageIdentifierNode.LanguageIdentifierKind;
+import org.apache.flex.compiler.tree.metadata.IMetaTagsNode;
/**
* Base class for definitions that have a type associated with them
@@ -139,4 +156,74 @@ public abstract class BaseTypedDefinitionNode extends BaseDefinitionNode impleme
typeNode = variableType;
}
+
+ /**
+ * Helper method to fill in a definition with appropriate metadata &
+ * namespace stuff. Used by both buildDefinition and
+ * buildBindableDefinitions
+ *
+ * @param definition the definition to "fill in"
+ */
+ protected void fillinDefinition(DefinitionBase definition)
+ {
+ definition.setNode(this);
+
+ fillInNamespaceAndModifiers(definition);
+ fillInMetadata(definition);
+
+ // Set the variable's type. If a type annotation doesn't appear in the source,
+ // the variable type in the definition will be null.
+ IReference typeRef = hasExplicitType() ? typeNode.computeTypeReference() : null;
+ definition.setTypeReference(typeRef);
+ }
+
+ public DefinitionBase buildBindableGetter(String definitionName)
+ {
+ GetterDefinition getter = new SyntheticBindableGetterDefinition(definitionName);
+ fillinDefinition(getter);
+
+ // set up the return type for the getter
+ IReference typeRef = getter.getTypeReference();
+ getter.setReturnTypeReference(typeRef);
+
+ return getter;
+ }
+
+ public DefinitionBase buildBindableSetter(String definitionName, ASScope containingScope, IReference typeRef)
+ {
+ SetterDefinition setter = new SyntheticBindableSetterDefinition(definitionName);
+
+ fillinDefinition(setter);
+
+ // Set up the params for the setter
+ ParameterDefinition param = new ParameterDefinition("");
+ param.setTypeReference(typeRef);
+ setter.setParameters(new ParameterDefinition[] {param});
+ setter.setTypeReference(typeRef);
+ ASScope setterContainedScope = new FunctionScope(containingScope);
+ setter.setContainedScope(setterContainedScope);
+ setterContainedScope.addDefinition(param);
+ setter.setReturnTypeReference(ReferenceFactory.builtinReference(IASLanguageConstants.BuiltinType.VOID));
+
+ return setter;
+ }
+
+ /**
+ * Build the definitions for a bindable variable that needs a generated
+ * getter/setter.
+ *
+ * @return An Array with all of the definitions built for this Node.
+ */
+ DefinitionBase[] buildBindableDefinitions(ASScope containingScope)
+ {
+ String definitionName = nameNode.computeSimpleReference();
+
+ DefinitionBase[] definitions = new DefinitionBase[2];
+ definitions[0] = buildBindableGetter(definitionName);
+ definitions[1] = buildBindableSetter(definitionName, containingScope, definitions[0].getTypeReference());
+
+ return definitions;
+ }
+
+
}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/89968c43/compiler/src/org/apache/flex/compiler/internal/tree/as/BaseVariableNode.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/tree/as/BaseVariableNode.java b/compiler/src/org/apache/flex/compiler/internal/tree/as/BaseVariableNode.java
index a6ccb2a..3ce33b6 100644
--- a/compiler/src/org/apache/flex/compiler/internal/tree/as/BaseVariableNode.java
+++ b/compiler/src/org/apache/flex/compiler/internal/tree/as/BaseVariableNode.java
@@ -316,62 +316,6 @@ public abstract class BaseVariableNode extends BaseTypedDefinitionNode implement
}
/**
- * Helper method to fill in a definition with appropriate metadata &
- * namespace stuff. Used by both buildDefinition and
- * buildBindableDefinitions
- *
- * @param definition the definition to "fill in"
- */
- private void fillinDefinition(DefinitionBase definition)
- {
- definition.setNode(this);
-
- fillInNamespaceAndModifiers(definition);
- fillInMetadata(definition);
-
- // Set the variable's type. If a type annotation doesn't appear in the source,
- // the variable type in the definition will be null.
- IReference typeRef = hasExplicitType() ? typeNode.computeTypeReference() : null;
- definition.setTypeReference(typeRef);
- }
-
- /**
- * Build the definitions for a bindable variable that needs a generated
- * getter/setter.
- *
- * @return An Array with all of the definitions built for this Node.
- */
- DefinitionBase[] buildBindableDefinitions(ASScope containingScope)
- {
- String definitionName = nameNode.computeSimpleReference();
-
- GetterDefinition getter = new SyntheticBindableGetterDefinition(definitionName);
- SetterDefinition setter = new SyntheticBindableSetterDefinition(definitionName);
-
- fillinDefinition(getter);
- fillinDefinition(setter);
-
- // set up the return type for the getter
- IReference typeRef = getter.getTypeReference();
- getter.setReturnTypeReference(typeRef);
-
- // Set up the params for the setter
- ParameterDefinition param = new ParameterDefinition("");
- param.setTypeReference(typeRef);
- setter.setParameters(new ParameterDefinition[] {param});
- setter.setTypeReference(typeRef);
- ASScope setterContainedScope = new FunctionScope(containingScope);
- setter.setContainedScope(setterContainedScope);
- setterContainedScope.addDefinition(param);
-
- DefinitionBase[] definitions = new DefinitionBase[2];
- definitions[0] = getter;
- definitions[1] = setter;
-
- return definitions;
- }
-
- /**
* Does this variable node need to construct a special definition this is
* true for variables that have bindable metadata and no attributes, or are
* "public" and inside of a ClassNode with bindable metadata with no
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/89968c43/compiler/src/org/apache/flex/compiler/internal/tree/as/FunctionNode.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/tree/as/FunctionNode.java b/compiler/src/org/apache/flex/compiler/internal/tree/as/FunctionNode.java
index 07b630f..77a79ba 100644
--- a/compiler/src/org/apache/flex/compiler/internal/tree/as/FunctionNode.java
+++ b/compiler/src/org/apache/flex/compiler/internal/tree/as/FunctionNode.java
@@ -205,6 +205,7 @@ public class FunctionNode extends BaseTypedDefinitionNode implements IFunctionNo
if (set.contains(PostProcessStep.POPULATE_SCOPE))
{
FunctionDefinition definition = buildDefinition();
+ boolean isBindable = definition.isBindable();
setDefinition(definition);
// if the parent is an anonymous function, then don't add the function definition to the scope
@@ -246,7 +247,9 @@ public class FunctionNode extends BaseTypedDefinitionNode implements IFunctionNo
{
scope = functionDef.getContainedScope();
ScopedBlockNode contents = contentsPart.getContents();
- if (contents != null)
+ // scope can be null for generated binding wrappers of
+ // getters and setters
+ if (contents != null && scope != null)
{
contents.reconnectScope(scope);
}