Repository: flex-falcon Updated Branches: refs/heads/develop e39f4e042 -> 4e7322ff0
Fixed Math "namespace" not being recognized as a final class. - Still major work and tests to support packages, not impl currently. - Initial ES3 test for classes - My formatter is back to the original I was using, no more messed up formatted commits where nothing really changed. Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/4e7322ff Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/4e7322ff Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/4e7322ff Branch: refs/heads/develop Commit: 4e7322ff029cf928d7fe910a616d1cd3e072867a Parents: e39f4e0 Author: Michael Schmalle <[email protected]> Authored: Fri Jun 12 11:38:23 2015 -0400 Committer: Michael Schmalle <[email protected]> Committed: Fri Jun 12 11:38:23 2015 -0400 ---------------------------------------------------------------------- .../codegen/externals/ExternalsTestBase.java | 5 ++ .../codegen/externals/TestConstructor.java | 56 +++++++++++---- .../codegen/externals/TestExternES3.java | 75 ++++++++++++++++++++ .../externals_unit_tests/constructor_params.js | 12 +++- .../codegen/externals/pass/AddMemberPass.java | 5 +- .../externals/reference/ClassReference.java | 10 +++ .../reference/NullConstructorReference.java | 45 ++++++++++++ .../externals/reference/ReferenceModel.java | 41 ++++++++++- .../codegen/externals/utils/FunctionUtils.java | 44 ++++++------ 9 files changed, 253 insertions(+), 40 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/4e7322ff/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/ExternalsTestBase.java ---------------------------------------------------------------------- diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/ExternalsTestBase.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/ExternalsTestBase.java index 1e1ff73..b4b8789 100644 --- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/ExternalsTestBase.java +++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/ExternalsTestBase.java @@ -70,6 +70,11 @@ public abstract class ExternalsTestBase protected Result compile(File file) throws IOException { config.addExternal(file); + return compile(); + } + + protected Result compile() throws IOException + { Result result = client.compile(); Assert.assertTrue(result.success); return result; http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/4e7322ff/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/TestConstructor.java ---------------------------------------------------------------------- diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/TestConstructor.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/TestConstructor.java index 973c31e..175c803 100644 --- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/TestConstructor.java +++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/TestConstructor.java @@ -34,6 +34,17 @@ public class TestConstructor extends ExternalsTestBase { @Test + public void test_const_object_literal() throws IOException + { + compile("constructor_params.js"); + + assertTrue(model.hasClass("FinalClass")); + assertTrue(model.getClassReference("FinalClass").isFinal()); + assertTrue(model.getClassReference("FinalClass").hasMethod("bar")); + assertTrue(model.getClassReference("FinalClass").getMethod("bar").isStatic()); + } + + @Test public void test_constructor_args() throws IOException { compile("constructor_params.js"); @@ -51,20 +62,33 @@ public class TestConstructor extends ExternalsTestBase assertEquals(0, FooNoArgs.getConstructor().getParameterNames().size()); assertEquals(2, FooOptArgs.getConstructor().getParameterNames().size()); assertEquals(2, FooVarArgs.getConstructor().getParameterNames().size()); - assertEquals(3, FooOptVarArgs.getConstructor().getParameterNames().size()); - - assertFalse(FooOptArgs.getConstructor().getComment().getParameterType("arg1").isOptionalArg()); - assertTrue(FooOptArgs.getConstructor().getComment().getParameterType("opt_arg2").isOptionalArg()); - - assertFalse(FooVarArgs.getConstructor().getComment().getParameterType("arg1").isVarArgs()); - assertTrue(FooVarArgs.getConstructor().getComment().getParameterType("var_args").isVarArgs()); - - assertTrue(FooOptVarArgs.getConstructor().getComment().getParameterType("opt_arg2").isOptionalArg()); - assertTrue(FooOptVarArgs.getConstructor().getComment().getParameterType("var_args").isVarArgs()); - - assertEquals("number", evaluateParam(FooOptVarArgs.getConstructor(), "arg1").toAnnotationString()); - assertEquals("*", evaluateParam(FooOptVarArgs.getConstructor(), "opt_arg2").toAnnotationString()); - assertEquals("*", evaluateParam(FooOptVarArgs.getConstructor(), "var_args").toAnnotationString()); + assertEquals(3, + FooOptVarArgs.getConstructor().getParameterNames().size()); + + assertFalse(FooOptArgs.getConstructor().getComment().getParameterType( + "arg1").isOptionalArg()); + assertTrue(FooOptArgs.getConstructor().getComment().getParameterType( + "opt_arg2").isOptionalArg()); + + assertFalse(FooVarArgs.getConstructor().getComment().getParameterType( + "arg1").isVarArgs()); + assertTrue(FooVarArgs.getConstructor().getComment().getParameterType( + "var_args").isVarArgs()); + + assertTrue(FooOptVarArgs.getConstructor().getComment().getParameterType( + "opt_arg2").isOptionalArg()); + assertTrue(FooOptVarArgs.getConstructor().getComment().getParameterType( + "var_args").isVarArgs()); + + assertEquals( + "number", + evaluateParam(FooOptVarArgs.getConstructor(), "arg1").toAnnotationString()); + assertEquals( + "*", + evaluateParam(FooOptVarArgs.getConstructor(), "opt_arg2").toAnnotationString()); + assertEquals( + "*", + evaluateParam(FooOptVarArgs.getConstructor(), "var_args").toAnnotationString()); } @Test @@ -77,7 +101,9 @@ public class TestConstructor extends ExternalsTestBase ClassReference FooOptVarArgs = model.getClassReference("FooOptVarArgs"); FooOptVarArgs.getConstructor().emit(sb); String string = sb.toString(); - assertEquals(" /**\n * A constructor with arg, opt arg and var args.\n *\n * @param arg1 [number] The arg 1.\n * @param opt_arg2 [*] The arg that is wrapped by another line in the comment.\n * @param var_args [*] A var agr param.\n * @see http://foo.bar.com \n * @see [constructor_params]\n * @returns {(FooVarArgs|null)} Another instance.\n */\n native public function FooOptVarArgs(arg1:Number, opt_arg2:* = null, ...rest);\n", string); + assertEquals( + " /**\n * A constructor with arg, opt arg and var args.\n *\n * @param arg1 [number] The arg 1.\n * @param opt_arg2 [*] The arg that is wrapped by another line in the comment.\n * @param var_args [*] A var agr param.\n * @see http://foo.bar.com \n * @see [constructor_params]\n * @returns {(FooVarArgs|null)} Another instance.\n */\n native public function FooOptVarArgs(arg1:Number, opt_arg2:* = null, ...rest);\n", + string); } @Override http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/4e7322ff/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/TestExternES3.java ---------------------------------------------------------------------- diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/TestExternES3.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/TestExternES3.java new file mode 100644 index 0000000..5dee9b5 --- /dev/null +++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/externals/TestExternES3.java @@ -0,0 +1,75 @@ +/* + * + * 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.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; + +import org.apache.flex.compiler.clients.ExternCConfiguration; +import org.junit.Test; + +import com.google.javascript.jscomp.Result; + +public class TestExternES3 extends ExternalsTestBase +{ + @Test + public void test_classes() throws IOException + { + Result result = compile(); + assertTrue(result.success); + + String[] classes = { + "Arguments", + "Object", + "Function", + "Array", + "Boolean", + "Number", + "Date", + "String", + "RegExp", + "Error", + "EvalError", + "RangeError", + "ReferenceError", + "SyntaxError", + "TypeError", + "URIError", + "Math" }; + + assertEquals(17, model.getClasses().size()); + for (String className : classes) + { + assertTrue(model.hasClass(className)); + } + } + + @Override + protected void configure(ExternCConfiguration config) throws IOException + { + config.setASRoot(ExternalsTestUtils.AS_ROOT_DIR); + + String coreRoot = ExternalsTestUtils.EXTERNAL_JS_DIR.getAbsolutePath(); + config.addExternal(coreRoot + "/es3.js"); + } + +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/4e7322ff/compiler.jx.tests/test-files/externals_unit_tests/constructor_params.js ---------------------------------------------------------------------- diff --git a/compiler.jx.tests/test-files/externals_unit_tests/constructor_params.js b/compiler.jx.tests/test-files/externals_unit_tests/constructor_params.js index 87a1254..1029bdb 100644 --- a/compiler.jx.tests/test-files/externals_unit_tests/constructor_params.js +++ b/compiler.jx.tests/test-files/externals_unit_tests/constructor_params.js @@ -68,4 +68,14 @@ AssignFooNoArgs = function () {}; * * @constructor */ -var VarAssignFooNoArgs = function () {}; \ No newline at end of file +var VarAssignFooNoArgs = function () {}; + +/** + * @const + */ +var FinalClass = {}; + +/** + * A static method. + */ +FinalClass.bar = function () {}; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/4e7322ff/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/pass/AddMemberPass.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/pass/AddMemberPass.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/pass/AddMemberPass.java index 18b65be..303a80e 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/pass/AddMemberPass.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/pass/AddMemberPass.java @@ -209,7 +209,7 @@ public class AddMemberPass extends AbstractCompilerPass if (getProp.getFirstChild().isGetProp()) { - ClassReference classReference = model.getClassReference(className.getString()); + ClassReference classReference = model.findClassReference(className.getString()); if (classReference != null) { classReference.addMethod(n, functionName.getString(), jsDoc, @@ -217,6 +217,7 @@ public class AddMemberPass extends AbstractCompilerPass } else { + System.err.println(">>>> {AddMemberPass.addMethod()} Class [" + className + "] not found in " + n.getSourceFileName()); } @@ -227,7 +228,7 @@ public class AddMemberPass extends AbstractCompilerPass functionName = getProp.getLastChild(); // Same //System.err.println(n.toStringTree()); - ClassReference classReference = model.getClassReference(className.getString()); + ClassReference classReference = model.findClassReference(className.getString()); if (classReference != null) { classReference.addMethod(n, functionName.getString(), jsDoc, http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/4e7322ff/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 b733af4..04deede 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 @@ -108,6 +108,16 @@ public class ClassReference extends BaseReference NAME MediaConstraints 727 [source_file: [w3c_rtc]] [length: 16] */ } + else if (comment.isConstant()) + { + /* + VAR 882 [jsdoc_info: JSDocInfo] + NAME Math + OBJECTLIT + */ + constructor = new NullConstructorReference(model, this, node, + getBaseName(), comment); + } else if (node.isFunction()) { /* http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/4e7322ff/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/NullConstructorReference.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/NullConstructorReference.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/NullConstructorReference.java new file mode 100644 index 0000000..80c1369 --- /dev/null +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/NullConstructorReference.java @@ -0,0 +1,45 @@ +/* + * + * 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.reference; + +import com.google.javascript.rhino.JSDocInfo; +import com.google.javascript.rhino.Node; + +public class NullConstructorReference extends MethodReference +{ + + public NullConstructorReference(ReferenceModel model, + ClassReference classReference, Node node, String name, + JSDocInfo comment) + { + super(model, classReference, node, name, comment, false); + } + + @Override + protected void emitFunctionCommentBody(StringBuilder sb) + { + super.emitFunctionCommentBody(sb); + + emitBlockDescription(sb); + emitSee(sb); + emitSeeSourceFileName(sb); + } + +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/4e7322ff/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 31900fd..9319153 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 @@ -39,6 +39,9 @@ public class ReferenceModel private Compiler compiler; private List<String> namespaces = new ArrayList<String>(); + + private HashMap<String, ClassReference> possibleClasses = new HashMap<String, ClassReference>(); + private HashMap<String, ClassReference> typedefs = new HashMap<String, ClassReference>(); private HashMap<String, ClassReference> classes = new HashMap<String, ClassReference>(); private HashMap<String, FunctionReference> functions = new HashMap<String, FunctionReference>(); @@ -94,6 +97,25 @@ public class ReferenceModel return classes.get(qName); } + public ClassReference findClassReference(String qName) + { + ClassReference reference = classes.get(qName); + if (reference != null) + return reference; + reference = possibleClasses.get(qName); + if (reference != null) + { + System.err.println(">>>> {ReferenceModel} Found class [" + + qName + + "] in possible classes from namespace, promoting to class in " + + reference.getNode().getSourceFileName()); + possibleClasses.remove(qName); + classes.put(qName, reference); + return reference; + } + return null; + } + public void addNamespace(Node node, String qName) { if (namespaces.contains(qName)) @@ -102,7 +124,17 @@ public class ReferenceModel return; } - System.out.println("Model.addNamespace(" + qName + ")"); + if (node.getJSDocInfo().isConstant()) + { + System.out.println("Model.addPossibleClass(" + qName + ")"); + ClassReference reference = new ClassReference(this, node, qName); + reference.setFinal(true); + possibleClasses.put(qName, reference); + } + else + { + System.out.println("Model.addNamespace(" + qName + ")"); + } namespaces.add(qName); } @@ -179,6 +211,11 @@ public class ReferenceModel functions.put(qName, reference); } + public boolean hasClass(String className) + { + return classes.containsKey(className); + } + public boolean hasConstant(String qName) { return constants.containsKey(qName); @@ -224,7 +261,7 @@ public class ReferenceModel public void addStaticField(Node node, String className, String qualfiedName) { - ClassReference classReference = getClassReference(className); + ClassReference classReference = findClassReference(className); // XXX this is here because for now, the doc might be on the parent ASSIGN node // if it's a static property with a value JSDocInfo comment = NodeUtil.getBestJSDocInfo(node); http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/4e7322ff/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/utils/FunctionUtils.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/utils/FunctionUtils.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/utils/FunctionUtils.java index ebbe279..e6a8a39 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/utils/FunctionUtils.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/utils/FunctionUtils.java @@ -58,34 +58,38 @@ public class FunctionUtils { StringBuilder sb = new StringBuilder(); sb.append("("); - int index = 0; - int len = comment.getParameterCount(); - if (len == 0) + if (paramNode != null) { - len = paramNode.getChildCount(); - // Missing JSDocInf @param tags - if (len > 0) + int index = 0; + int len = comment.getParameterCount(); + + if (len == 0) { - for (Node param : paramNode.children()) + len = paramNode.getChildCount(); + // Missing JSDocInf @param tags + if (len > 0) { - sb.append(param.getString() + ":Object"); - if (index < len - 1) - sb.append(", "); - index++; + for (Node param : paramNode.children()) + { + sb.append(param.getString() + ":Object"); + if (index < len - 1) + sb.append(", "); + index++; + } } } - } - else - { - for (String paramName : comment.getParameterNames()) + else { - sb.append(toParameter(reference, comment, paramName, - comment.getParameterType(paramName))); + for (String paramName : comment.getParameterNames()) + { + sb.append(toParameter(reference, comment, paramName, + comment.getParameterType(paramName))); - if (index < len - 1) - sb.append(", "); - index++; + if (index < len - 1) + sb.append(", "); + index++; + } } }
