You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by er...@apache.org on 2012/12/27 13:53:34 UTC
svn commit: r1426183 - in /incubator/flex/whiteboard/mschmalle/falconjx:
compiler.jx.tests/src/org/apache/flex/js/internal/js/codegen/
compiler.jx/src/org/apache/flex/compiler/internal/js/codgen/
Author: erikdebruin
Date: Thu Dec 27 12:53:33 2012
New Revision: 1426183
URL: http://svn.apache.org/viewvc?rev=1426183&view=rev
Log:
Implemented an alternate method to deal with default values for parameters in JS.
In order to do this without 'breaking' any existing code, I've create a new 'setting' on JSSharedData: OUTPUT_ALTERNATE. I used this setting to split the flow in 'emitFunctionBlockHeader' and call to 'emitDefaultParameterCodeBlock_Alternate' instead of the regular method.
I've also added a test to 'TestGoogEmiter': 'testDefaultParameter_Alternate' to check the functionality of the above mentioned addition.
Modified:
incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/js/internal/js/codegen/TestGoogEmiter.java
incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codgen/JSGoogEmitter.java
incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codgen/JSSharedData.java
Modified: incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/js/internal/js/codegen/TestGoogEmiter.java
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/js/internal/js/codegen/TestGoogEmiter.java?rev=1426183&r1=1426182&r2=1426183&view=diff
==============================================================================
--- incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/js/internal/js/codegen/TestGoogEmiter.java (original)
+++ incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/js/internal/js/codegen/TestGoogEmiter.java Thu Dec 27 12:53:33 2012
@@ -170,6 +170,30 @@ public class TestGoogEmiter extends Test
JSSharedData.OUTPUT_JSDOC = true;
}
+ @Test
+ public void testDefaultParameter_Alternate()
+ {
+ /*
+ foo.bar.A.method1 = function(p1, p2, p3, p4) {
+ p3 = typeof p3 !== 'undefined' ? p3 : 3;
+ p4 = typeof p4 !== 'undefined' ? p4 : 4;
+
+ return p1 + p2 + p3 + p4;
+ }
+ */
+ JSSharedData.OUTPUT_JSDOC = false;
+ JSSharedData.OUTPUT_ALTERNATE = true;
+ IFunctionNode node = getMethod("function method1(p1:int, p2:int, p3:int = 3, p4:int = 4):int{return p1 + p2 + p3 + p4;}");
+ visitor.visitFunction(node);
+ assertOut("foo.bar.A.method1 = function(p1, p2, p3, p4) {\n" +
+ "\tp3 = typeof p3 !== 'undefined' ? p3 : 3;\n" +
+ "\tp4 = typeof p4 !== 'undefined' ? p4 : 4;\n" +
+ "\n" +
+ "\treturn p1 + p2 + p3 + p4;\n}");
+ JSSharedData.OUTPUT_ALTERNATE = false;
+ JSSharedData.OUTPUT_JSDOC = true;
+ }
+
protected IBackend createBackend()
{
return new GoogBackend();
Modified: incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codgen/JSGoogEmitter.java
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codgen/JSGoogEmitter.java?rev=1426183&r1=1426182&r2=1426183&view=diff
==============================================================================
--- incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codgen/JSGoogEmitter.java (original)
+++ incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codgen/JSGoogEmitter.java Thu Dec 27 12:53:33 2012
@@ -210,7 +210,14 @@ public class JSGoogEmitter extends JSEmi
@Override
public void emitFunctionBlockHeader(IFunctionNode node)
{
- emitDefaultParameterCodeBlock(node);
+ if (JSSharedData.OUTPUT_ALTERNATE)
+ {
+ emitDefaultParameterCodeBlock_Alternate(node);
+ }
+ else
+ {
+ emitDefaultParameterCodeBlock(node);
+ }
}
private void emitDefaultParameterCodeBlock(IFunctionNode node)
@@ -271,6 +278,46 @@ public class JSGoogEmitter extends JSEmi
}
}
+ private void emitDefaultParameterCodeBlock_Alternate(IFunctionNode node)
+ {
+ // (erikdebruin) implemented alternative approach to handling
+ // default parameter values in JS
+
+ IParameterNode[] pnodes = node.getParameterNodes();
+
+ Map<Integer, IParameterNode> defaults = getDefaults(pnodes);
+
+ final StringBuilder code = new StringBuilder();
+
+ if (defaults != null)
+ {
+ List<IParameterNode> parameters = new ArrayList<IParameterNode>(
+ defaults.values());
+
+ int numDefaults = 0;
+ for (IParameterNode pnode : parameters)
+ {
+ if (pnode != null)
+ {
+ if (numDefaults > 0)
+ code.append(getIndent(getCurrentIndent()));
+
+ code.append(
+ pnode.getName() +
+ " = typeof " + pnode.getName() + " !== 'undefined' ? " +
+ pnode.getName() + " : " +
+ pnode.getDefaultValue() + ";\n");
+
+ numDefaults++;
+ }
+ }
+
+ code.append("\n");
+
+ write(code.toString());
+ }
+ }
+
@Override
public void emitParameter(IParameterNode node)
{
Modified: incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codgen/JSSharedData.java
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codgen/JSSharedData.java?rev=1426183&r1=1426182&r2=1426183&view=diff
==============================================================================
--- incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codgen/JSSharedData.java (original)
+++ incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codgen/JSSharedData.java Thu Dec 27 12:53:33 2012
@@ -39,6 +39,7 @@ public class JSSharedData
// TODO (mschmalle) Temp until I figure out the correct place for configuration
public static boolean OUTPUT_JSDOC = true;
+ public static boolean OUTPUT_ALTERNATE = false;
public static IBackend backend;
public static String OUTPUT_EXTENSION;