Repository: flex-falcon Updated Branches: refs/heads/develop e6409b279 -> 15e753a7c
externc: add ability to handle methods declared without = function() by detecting if param or returns JSDoc is present Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/4ed67a8f Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/4ed67a8f Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/4ed67a8f Branch: refs/heads/develop Commit: 4ed67a8fed775a92d0d7dcd998aabbb2f7fd10fd Parents: e6409b2 Author: Josh Tynjala <joshtynj...@apache.org> Authored: Tue Apr 19 16:06:22 2016 -0700 Committer: Josh Tynjala <joshtynj...@apache.org> Committed: Tue Apr 19 16:06:22 2016 -0700 ---------------------------------------------------------------------- .../codegen/externals/pass/AddMemberPass.java | 43 +++++++++++++++++++- .../externals/reference/MethodReference.java | 33 ++++++++++++++- .../externals/reference/ParameterReference.java | 6 +++ .../codegen/externals/utils/FunctionUtils.java | 2 +- 4 files changed, 81 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/4ed67a8f/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 8379af9..9308ff0 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 @@ -23,6 +23,7 @@ import org.apache.flex.compiler.internal.codegen.externals.reference.ReferenceMo import com.google.javascript.jscomp.AbstractCompiler; import com.google.javascript.jscomp.NodeTraversal; +import com.google.javascript.rhino.JSDocInfo; import com.google.javascript.rhino.Node; public class AddMemberPass extends AbstractCompilerPass @@ -80,7 +81,19 @@ public class AddMemberPass extends AbstractCompilerPass } else if (first.isGetProp()) { - visitGetProp(t, first); + JSDocInfo jsDocInfo = first.getJSDocInfo(); + if (jsDocInfo != null + && (jsDocInfo.getParameterCount() > 0 + || jsDocInfo.getReturnType() != null)) + { + // instance or static method that isn't declared as a + // function, but has @param or @returns + visitMethodFromJSDoc(t, first); + } + else + { + visitGetProp(t, first); + } } } } @@ -119,6 +132,34 @@ public class AddMemberPass extends AbstractCompilerPass log(n); } } + private void visitMethodFromJSDoc(NodeTraversal t, Node n) + { + String qName = n.getQualifiedName(); + + if (n.isGetProp()) + { + int protoType = qName.indexOf(".prototype."); + if (protoType != -1) + { + String className = qName.substring(0, protoType); + String memberName = qName.substring(protoType + 11, + qName.length()); + model.addMethod(n, className, memberName); + } + else + { + String className = qName.substring(0, qName.lastIndexOf(".")); + String memberName = qName.substring(qName.lastIndexOf(".") + 1, + qName.length()); + model.addStaticMethod(n, className, memberName); + } + } + else if (n.isName()) + { + err("visitMethod() non impl"); + log(n); + } + } private void visitGetProp(NodeTraversal t, Node n) { http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/4ed67a8f/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/MethodReference.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/MethodReference.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/MethodReference.java index 96aa9f2..6cfbadf 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/MethodReference.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/MethodReference.java @@ -28,6 +28,7 @@ import org.apache.flex.compiler.internal.codegen.externals.utils.FunctionUtils; import com.google.common.collect.Lists; import com.google.javascript.rhino.JSDocInfo; +import com.google.javascript.rhino.JSTypeExpression; import com.google.javascript.rhino.Node; import com.google.javascript.rhino.jstype.JSType; @@ -122,6 +123,20 @@ public class MethodReference extends MemberReference parameters.add(parameterReference); } } + else if(comment.getParameterCount() > 0 || comment.getReturnType() != null) + { + for (int i = 0; i < comment.getParameterCount(); i++) + { + String parameterName = comment.getParameterNameAt(i); + String qualifiedName = FunctionUtils.toParameterType(this, parameterName); + ParameterReference parameterReference = new ParameterReference(getModel(), parameterName, qualifiedName); + parameters.add(parameterReference); + } + } + else + { + System.out.println(getQualifiedName() + " parameters not found! " + " " + comment.getParameterCount()); + } } @Override @@ -300,7 +315,23 @@ public class MethodReference extends MemberReference private String toParameterString() { - return FunctionUtils.toParameterString(getContext(), getContext().getComment(), paramNode, outputJS); + if (paramNode != null) + { + return FunctionUtils.toParameterString(getContext(), getContext().getComment(), paramNode, outputJS); + } + StringBuilder sb = new StringBuilder(); + sb.append("("); + int len = comment.getParameterCount(); + for (int i = 0; i < len; i++) + { + String parameterName = comment.getParameterNameAt(i); + JSTypeExpression parameterType = comment.getParameterType(i); + sb.append(FunctionUtils.toParameter(getContext(), comment, parameterName, parameterType, outputJS)); + if (i < len - 1) + sb.append(", "); + } + sb.append(")"); + return sb.toString(); } public boolean isOverride() http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/4ed67a8f/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ParameterReference.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ParameterReference.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ParameterReference.java index 4823873..30d7c15 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ParameterReference.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/externals/reference/ParameterReference.java @@ -35,6 +35,12 @@ public class ParameterReference extends BaseReference name = node.getString(); } + public ParameterReference(final ReferenceModel model, final String name, final String qualifiedName) + { + super(model, null, qualifiedName, null); + this.name = name; + } + public ParameterReference(final ReferenceModel model, final Node parameterNode) { this(model, parameterNode, "Object"); http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/4ed67a8f/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 473e42c..f384689 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 @@ -154,7 +154,7 @@ public class FunctionUtils return canImport; } - private static String toParameter(BaseReference reference, JSDocInfo comment, String paramName, + public static String toParameter(BaseReference reference, JSDocInfo comment, String paramName, JSTypeExpression parameterType, boolean outputJS) { final StringBuilder sb = new StringBuilder();