You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ms...@apache.org on 2015/06/14 19:26:10 UTC
git commit: [flex-falcon] [refs/heads/develop] - Implemented the
@enum tag to generate enumerated classes. - var object literals with @enum
get created as a class and each property string gets converted to a class
constant of the type expression, Nu
Repository: flex-falcon
Updated Branches:
refs/heads/develop 28398c9a6 -> bb8b743a0
Implemented the @enum tag to generate enumerated classes.
- var object literals with @enum get created as a class and each
property string gets converted to a class constant of the type expression,
Number is the default, doesn't really matter what the values are right
now since there is no inlining in this compiler.
Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/bb8b743a
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/bb8b743a
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/bb8b743a
Branch: refs/heads/develop
Commit: bb8b743a08c4b9cea8c7d128af51d1f375d4ab80
Parents: 28398c9
Author: Michael Schmalle <ms...@apache.org>
Authored: Sun Jun 14 13:25:57 2015 -0400
Committer: Michael Schmalle <ms...@apache.org>
Committed: Sun Jun 14 13:25:57 2015 -0400
----------------------------------------------------------------------
.../codegen/externals/TestAnnotationEnum.java | 64 ++++++++++++++++++++
.../externals_unit_tests/annotation_enum.js | 48 +++++++++++++++
.../externals/pass/NamespaceResolutionPass.java | 4 ++
.../externals/reference/ClassReference.java | 50 ++++++++++++++-
.../externals/reference/FieldReference.java | 47 +++++++++++++-
.../externals/reference/ReferenceModel.java | 13 ++++
6 files changed, 223 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/bb8b743a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/TestAnnotationEnum.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/TestAnnotationEnum.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/TestAnnotationEnum.java
new file mode 100644
index 0000000..c43cd8b
--- /dev/null
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/TestAnnotationEnum.java
@@ -0,0 +1,64 @@
+/*
+ *
+ * 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.flex.compiler.internal.codegen.externals;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+
+import org.apache.flex.compiler.clients.ExternCConfiguration;
+import org.apache.flex.compiler.internal.codegen.externals.reference.ClassReference;
+import org.junit.Test;
+
+public class TestAnnotationEnum extends ExternalsTestBase
+{
+ @Test
+ public void test_class_creation() throws IOException
+ {
+ compile("annotation_enum.js");
+
+ ClassReference FontFaceLoadStatus = model.getClassReference("FontFaceLoadStatus");
+ ClassReference FontFaceSetLoadStatus = model.getClassReference("FontFaceSetLoadStatus");
+ assertNotNull(FontFaceLoadStatus);
+ assertNotNull(FontFaceSetLoadStatus);
+
+ assertTrue(FontFaceLoadStatus.hasStaticField("ERROR"));
+ assertTrue(FontFaceLoadStatus.hasStaticField("LOADED"));
+ assertTrue(FontFaceLoadStatus.hasStaticField("LOADING"));
+ assertTrue(FontFaceLoadStatus.hasStaticField("UNLOADED"));
+
+ assertTrue(FontFaceSetLoadStatus.hasStaticField("FOO_LOADED"));
+ assertTrue(FontFaceSetLoadStatus.hasStaticField("FOO_LOADING"));
+
+ assertTrue(FontFaceLoadStatus.getField("ERROR").isStatic());
+ assertTrue(FontFaceLoadStatus.getField("ERROR").isConst());
+
+ // TODO check values and value type IE String, Number
+
+ //String emit1 = client.getEmitter().emit(FontFaceLoadStatus);
+ //String emit2 = client.getEmitter().emit(FontFaceSetLoadStatus);
+ }
+
+ @Override
+ protected void configure(ExternCConfiguration config) throws IOException
+ {
+ }
+}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/bb8b743a/compiler.jx.tests/test-files/externals_unit_tests/annotation_enum.js
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/test-files/externals_unit_tests/annotation_enum.js b/compiler.jx.tests/test-files/externals_unit_tests/annotation_enum.js
new file mode 100644
index 0000000..bc9276c
--- /dev/null
+++ b/compiler.jx.tests/test-files/externals_unit_tests/annotation_enum.js
@@ -0,0 +1,48 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+/**
+ * @enum {string}
+ * @see http://dev.w3.org/csswg/css-font-loading/#enumdef-fontfaceloadstatus
+ */
+var FontFaceLoadStatus = {
+ ERROR: 'error',
+ LOADED: 'loaded',
+ LOADING: 'loading',
+ UNLOADED: 'unloaded'
+};
+
+/**
+ * @enum
+ * @see http://dev.w3.org/csswg/css-font-loading/#enumdef-fontfacesetloadstatus
+ */
+var FontFaceSetLoadStatus = {
+ FOO_LOADED: 'loaded',
+ FOO_LOADING: 'loading'
+};
+
+
+
+
+
+
+
+
+
+
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/bb8b743a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/pass/NamespaceResolutionPass.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/pass/NamespaceResolutionPass.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/pass/NamespaceResolutionPass.java
index a0711ad..1ccd3c4 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/pass/NamespaceResolutionPass.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/pass/NamespaceResolutionPass.java
@@ -66,6 +66,10 @@ public class NamespaceResolutionPass extends AbstractCompilerPass
model.addClass(child, name.getQualifiedName());
}
}
+ else if (comment != null && comment.hasEnumParameterType())
+ {
+ model.addEnum(child, name.getQualifiedName());
+ }
}
else if (child.isExprResult())
{
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/bb8b743a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ClassReference.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ClassReference.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ClassReference.java
index b11c6a0..ff96fe6 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ClassReference.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ClassReference.java
@@ -29,6 +29,7 @@ import java.util.Map.Entry;
import org.apache.flex.compiler.internal.codegen.externals.utils.DebugLogUtils;
import org.apache.flex.compiler.internal.codegen.externals.utils.JSTypeUtils;
+import org.apache.flex.compiler.internal.codegen.externals.utils.TypeUtils;
import com.google.javascript.rhino.JSDocInfo;
import com.google.javascript.rhino.JSDocInfoBuilder;
@@ -39,6 +40,7 @@ import com.google.javascript.rhino.jstype.JSType;
public class ClassReference extends BaseReference
{
private boolean isFinal;
+ private int enumConstantCounter = 0;
private List<String> imports = new ArrayList<String>();
private MethodReference constructor;
@@ -54,6 +56,16 @@ public class ClassReference extends BaseReference
private boolean isNamespace;
+ public final int getEnumConstant()
+ {
+ return enumConstantCounter;
+ }
+
+ public final void nextEnumConstant()
+ {
+ enumConstantCounter++;
+ }
+
public void setIsNamespace(boolean isNamespace)
{
this.isNamespace = isNamespace;
@@ -122,7 +134,40 @@ public class ClassReference extends BaseReference
functionNode = null;
paramListNode = null;
- if (comment.getTypedefType() != null)
+ if (comment.hasEnumParameterType())
+ {
+ /*
+ VAR 35 [jsdoc_info: JSDocInfo]
+ NAME FontFaceSetLoadStatus
+ OBJECTLIT
+ STRING_KEY LOADED
+ STRING loaded
+ STRING_KEY LOADING
+ STRING loading
+ */
+ JSTypeExpression enumParameterType = comment.getEnumParameterType();
+ String overrideStringType = TypeUtils.transformType(getModel().evaluate(
+ enumParameterType).toAnnotationString());
+
+ Node objLit = node.getFirstChild().getFirstChild();
+ for (Node stringKey : objLit.children())
+ {
+ if (stringKey.isStringKey())
+ {
+ Node valueNode = stringKey.getFirstChild();
+
+ JSDocInfoBuilder b = new JSDocInfoBuilder(true);
+ JSDocInfo fieldComment = b.build();
+ String fieldName = stringKey.getString();
+ FieldReference field = addField(stringKey, fieldName,
+ fieldComment, true);
+ field.setConst(true);
+ field.setOverrideStringType(overrideStringType);
+ field.setConstantValueNode(valueNode);
+ }
+ }
+ }
+ else if (comment.getTypedefType() != null)
{
//System.out.println(node.toStringTree());
/*
@@ -204,6 +249,8 @@ public class ClassReference extends BaseReference
@Override
public void emit(StringBuilder sb)
{
+ enumConstantCounter = 0;
+
String packageName = getPackageName();
sb.append("package ");
@@ -647,6 +694,7 @@ public class ClassReference extends BaseReference
{
fieldSet.getValue().emit(sb);
sb.append("\n");
+ nextEnumConstant();
}
}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/bb8b743a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/FieldReference.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/FieldReference.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/FieldReference.java
index 8965c13..618a13a 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/FieldReference.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/FieldReference.java
@@ -32,7 +32,9 @@ public class FieldReference extends MemberReference
{
private boolean isStatic;
+ private boolean isConst;
private String overrideStringType;
+ private Node constantValueNode;
public boolean isStatic()
{
@@ -44,11 +46,26 @@ public class FieldReference extends MemberReference
this.isStatic = isStatic;
}
+ public boolean isConst()
+ {
+ return isConst;
+ }
+
+ public void setConst(boolean isConst)
+ {
+ this.isConst = isConst;
+ }
+
public void setOverrideStringType(String overrideStringType)
{
this.overrideStringType = overrideStringType;
}
+ public void setConstantValueNode(Node constantValueNode)
+ {
+ this.constantValueNode = constantValueNode;
+ }
+
public String toTypeAnnotationString()
{
JSType jsType = getModel().evaluate(getComment().getType());
@@ -109,14 +126,39 @@ public class FieldReference extends MemberReference
private void emitVar(StringBuilder sb)
{
String staticValue = (isStatic) ? "static " : "";
+ String constVarValue = (isConst) ? "const " : "var ";
String type = toTypeString();
if (type.indexOf("|") != -1 || type.indexOf("?") != -1)
type = "*";
sb.append(indent);
- sb.append("public " + staticValue + "var " + getQualifiedName() + ":"
- + type + ";\n");
+ sb.append("public ");
+ sb.append(staticValue);
+ sb.append(constVarValue);
+ sb.append(getQualifiedName());
+ sb.append(":");
+ sb.append(type);
+ if (isConst)
+ {
+ emitConstValue(sb);
+ }
+ sb.append(";\n");
+ }
+
+ private void emitConstValue(StringBuilder sb)
+ {
+ sb.append(" = ");
+ sb.append(toConstValue(constantValueNode));
+ }
+
+ private String toConstValue(Node node)
+ {
+ if (toTypeString().equals("Number"))
+ return Integer.toString(getClassReference().getEnumConstant());
+ if (node.isString())
+ return "'" + node.getString() + "'";
+ return "undefined /* TODO type not set */";
}
private String toTypeString()
@@ -162,4 +204,5 @@ public class FieldReference extends MemberReference
sb.append("\n");
}
}
+
}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/bb8b743a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ReferenceModel.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ReferenceModel.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ReferenceModel.java
index 7f9a342..52b64d6 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ReferenceModel.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ReferenceModel.java
@@ -136,6 +136,19 @@ public class ReferenceModel
classes.put(qualifiedName, reference);
}
+ public void addEnum(Node node, String qualifiedName)
+ {
+ if (classes.containsKey(qualifiedName))
+ {
+ err("Duplicate class, @enum conflict [" + qualifiedName + "]");
+ return;
+ }
+
+ log("Model.addEnum(" + qualifiedName + ")");
+ ClassReference reference = new ClassReference(this, node, qualifiedName);
+ classes.put(qualifiedName, reference);
+ }
+
public void addTypeDef(Node node, String qualifiedName)
{
if (typedefs.containsKey(qualifiedName))