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 2013/01/20 12:11:18 UTC
svn commit: r1435816 - in /flex/falcon/trunk:
compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/
compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/
compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/ comp...
Author: erikdebruin
Date: Sun Jan 20 11:11:18 2013
New Revision: 1435816
URL: http://svn.apache.org/viewvc?rev=1435816&view=rev
Log:
- implemented Interface support and testing
Modified:
flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogInterface.java
flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/JSEmitter.java
flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java
flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java
flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/js/codegen/goog/IJSGoogDocEmitter.java
Modified: flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogInterface.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogInterface.java?rev=1435816&r1=1435815&r2=1435816&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogInterface.java (original)
+++ flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogInterface.java Sun Jan 20 11:11:18 2013
@@ -23,7 +23,6 @@ import org.apache.flex.compiler.clients.
import org.apache.flex.compiler.internal.as.codegen.TestInterface;
import org.apache.flex.compiler.internal.js.driver.goog.GoogBackend;
import org.apache.flex.compiler.tree.as.IInterfaceNode;
-import org.junit.Ignore;
import org.junit.Test;
/**
@@ -34,49 +33,42 @@ import org.junit.Test;
*/
public class TestGoogInterface extends TestInterface
{
- // TODO (erikdebruin) test interfaces
-
- @Ignore
@Override
@Test
public void testSimple()
{
IInterfaceNode node = getInterfaceNode("public interface IA{}");
visitor.visitInterface(node);
- assertOut("");
+ assertOut("/**\n * @interface\n */\npublic interface IA {\n}");
}
- @Ignore
@Override
@Test
public void testSimpleExtends()
{
IInterfaceNode node = getInterfaceNode("public interface IA extends IB{}");
visitor.visitInterface(node);
- assertOut("");
+ assertOut("/**\n * @interface\n * @extends {IB}\n */\npublic interface IA {\n}");
}
- @Ignore
@Override
@Test
public void testSimpleExtendsMultiple()
{
IInterfaceNode node = getInterfaceNode("public interface IA extends IB, IC, ID {}");
visitor.visitInterface(node);
- assertOut("");
+ assertOut("/**\n * @interface\n * @extends {IB}\n * @extends {IC}\n * @extends {ID}\n */\npublic interface IA {\n}");
}
- @Ignore
@Override
@Test
public void testQualifiedExtendsMultiple()
{
IInterfaceNode node = getInterfaceNode("public interface IA extends foo.bar.IB, baz.goo.IC, foo.ID {}");
visitor.visitInterface(node);
- assertOut("");
+ assertOut("/**\n * @interface\n * @extends {foo.bar.IB}\n * @extends {baz.goo.IC}\n * @extends {foo.ID}\n */\npublic interface IA {\n}");
}
- @Ignore
@Override
@Test
public void testAccessors()
@@ -85,22 +77,20 @@ public class TestGoogInterface extends T
+ "function get foo1():Object;"
+ "function set foo1(value:Object):void;}");
visitor.visitInterface(node);
- assertOut("");
+ assertOut("/**\n * @interface\n */\npublic interface IA {\n}\nIA.prototype.foo1;");
}
- @Ignore
@Override
@Test
public void testMethods()
{
IInterfaceNode node = getInterfaceNode("public interface IA {"
- + "function foo1():Object;"
- + "function foo1(value:Object):void;}");
+ + "function baz1():Object;"
+ + "function baz2(value:Object):void;}");
visitor.visitInterface(node);
- assertOut("");
+ assertOut("/**\n * @interface\n */\npublic interface IA {\n}\nIA.prototype.baz1 = function();\nIA.prototype.baz2 = function(value);");
}
- @Ignore
@Override
@Test
public void testAccessorsMethods()
@@ -111,7 +101,7 @@ public class TestGoogInterface extends T
+ "function baz1():Object;"
+ "function baz2(value:Object):void;}");
visitor.visitInterface(node);
- assertOut("");
+ assertOut("/**\n * @interface\n */\npublic interface IA {\n}\nIA.prototype.foo1;\nIA.prototype.baz1 = function();\nIA.prototype.baz2 = function(value);");
}
protected IBackend createBackend()
Modified: flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/JSEmitter.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/JSEmitter.java?rev=1435816&r1=1435815&r2=1435816&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/JSEmitter.java (original)
+++ flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/JSEmitter.java Sun Jan 20 11:11:18 2013
@@ -37,6 +37,7 @@ public class JSEmitter extends ASEmitter
public static final String CONFIGURABLE = "configurable";
public static final String CONSTRUCTOR = "constructor";
public static final String DEFINE_PROPERTY = "defineProperty";
+ public static final String INTERFACE = "interface";
public static final String PROTOTYPE = "prototype";
public static final String SLICE = "slice";
Modified: flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java?rev=1435816&r1=1435815&r2=1435816&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java (original)
+++ flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java Sun Jan 20 11:11:18 2013
@@ -36,6 +36,7 @@ import org.apache.flex.compiler.tree.as.
import org.apache.flex.compiler.tree.as.IClassNode;
import org.apache.flex.compiler.tree.as.IExpressionNode;
import org.apache.flex.compiler.tree.as.IFunctionNode;
+import org.apache.flex.compiler.tree.as.IInterfaceNode;
import org.apache.flex.compiler.tree.as.IPackageNode;
import org.apache.flex.compiler.tree.as.IParameterNode;
import org.apache.flex.compiler.tree.as.IVariableNode;
@@ -53,29 +54,45 @@ public class JSGoogDocEmitter extends JS
}
@Override
- public void emitFieldDoc(IVariableNode node)
+ public void emitInterfaceDoc(IInterfaceNode node)
{
begin();
- String ns = node.getNamespace();
- if (ns == IASKeywordConstants.PRIVATE)
+ emitJSDocLine(JSGoogEmitter.INTERFACE);
+
+ String[] inodes = node.getExtendedInterfaces();
+ for (String inode : inodes)
{
- emitPrivate(node);
+ emitJSDocLine(IASKeywordConstants.EXTENDS, inode);
}
- else if (ns == IASKeywordConstants.PROTECTED)
- {
- emitProtected(node);
- }
-
- if (node.isConst())
- emitConst(node);
-
- emitType(node);
end();
}
@Override
+ public void emitFieldDoc(IVariableNode node)
+ {
+ begin();
+
+ String ns = node.getNamespace();
+ if (ns == IASKeywordConstants.PRIVATE)
+ {
+ emitPrivate(node);
+ }
+ else if (ns == IASKeywordConstants.PROTECTED)
+ {
+ emitProtected(node);
+ }
+
+ if (node.isConst())
+ emitConst(node);
+
+ emitType(node);
+
+ end();
+ }
+
+ @Override
public void emitMethodDoc(IFunctionNode node, ICompilerProject project)
{
IClassNode cnode = (IClassNode) node.getAncestorOfType(IClassNode.class);
Modified: flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java?rev=1435816&r1=1435815&r2=1435816&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java (original)
+++ flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java Sun Jan 20 11:11:18 2013
@@ -51,6 +51,7 @@ import org.apache.flex.compiler.tree.as.
import org.apache.flex.compiler.tree.as.IFunctionNode;
import org.apache.flex.compiler.tree.as.IGetterNode;
import org.apache.flex.compiler.tree.as.IIdentifierNode;
+import org.apache.flex.compiler.tree.as.IInterfaceNode;
import org.apache.flex.compiler.tree.as.IPackageNode;
import org.apache.flex.compiler.tree.as.IParameterNode;
import org.apache.flex.compiler.tree.as.IScopedNode;
@@ -74,6 +75,12 @@ public class JSGoogEmitter extends JSEmi
public static final String GOOG_PROVIDE = "goog.provide";
public static final String GOOG_REQUIRE = "goog.require";
+ // TODO (erikdebruin) I needed some state to remember if an accessor is
+ // accompanied by it's counterpart, as 'goog' likes having
+ // a property with a type declaration to go with them. We
+ // only want one declaration per property, so we need to
+ // know if we visited the complementary instance already...
+ // Q for (mschmalle): do we need to reset this at some point?
private List<String> propertyNames = new ArrayList<String>();
IJSGoogDocEmitter getDoc()
@@ -201,6 +208,60 @@ public class JSGoogEmitter extends JSEmi
}
@Override
+ public void emitInterface(IInterfaceNode node)
+ {
+ getDoc().emitInterfaceDoc(node);
+
+ write(node.getNamespace());
+ write(SPACE);
+
+ writeToken(IASKeywordConstants.INTERFACE);
+ write(SPACE);
+ getWalker().walk(node.getNameExpressionNode());
+ write(SPACE);
+
+ write(CURLYBRACE_OPEN);
+ writeNewline();
+ write(CURLYBRACE_CLOSE);
+
+ final IDefinitionNode[] members = node.getAllMemberDefinitionNodes();
+ for (IDefinitionNode mnode : members)
+ {
+ boolean isAccessor = mnode.getNodeID() == ASTNodeID.GetterID ||
+ mnode.getNodeID() == ASTNodeID.SetterID;
+
+ String qname = node.getQualifiedName();
+
+ if (!isAccessor || !propertyNames.contains(qname))
+ {
+ writeNewline();
+
+ emitMemberName(node);
+ write(PERIOD);
+ write(PROTOTYPE);
+ write(PERIOD);
+ write(mnode.getQualifiedName());
+
+ if (isAccessor && !propertyNames.contains(qname))
+ {
+ propertyNames.add(qname);
+ }
+ else
+ {
+ write(SPACE);
+ write(EQUALS);
+ write(SPACE);
+ write(FUNCTION);
+
+ emitParamters(((IFunctionNode) mnode).getParameterNodes());
+ }
+
+ write(SEMICOLON);
+ }
+ }
+ }
+
+ @Override
public void emitField(IVariableNode node)
{
IClassDefinition definition = getClassDefinition(node);
@@ -298,14 +359,15 @@ public class JSGoogEmitter extends JSEmi
private void emitAccessors(IAccessorNode node)
{
- if (!propertyNames.contains(node.getName()))
+ String qname = node.getQualifiedName();
+ if (!propertyNames.contains(qname))
{
emitField(node);
write(SEMICOLON);
writeNewline();
writeNewline();
- propertyNames.add(node.getName());
+ propertyNames.add(qname);
}
if (node.getNodeID() == ASTNodeID.GetterID)
Modified: flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/js/codegen/goog/IJSGoogDocEmitter.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/js/codegen/goog/IJSGoogDocEmitter.java?rev=1435816&r1=1435815&r2=1435816&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/js/codegen/goog/IJSGoogDocEmitter.java (original)
+++ flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/js/codegen/goog/IJSGoogDocEmitter.java Sun Jan 20 11:11:18 2013
@@ -26,6 +26,7 @@ import org.apache.flex.compiler.projects
import org.apache.flex.compiler.tree.as.IASNode;
import org.apache.flex.compiler.tree.as.IClassNode;
import org.apache.flex.compiler.tree.as.IFunctionNode;
+import org.apache.flex.compiler.tree.as.IInterfaceNode;
import org.apache.flex.compiler.tree.as.IParameterNode;
import org.apache.flex.compiler.tree.as.IVariableNode;
@@ -48,6 +49,8 @@ import org.apache.flex.compiler.tree.as.
public interface IJSGoogDocEmitter extends IJSDocEmitter
{
+ void emitInterfaceDoc(IInterfaceNode node);
+
void emitFieldDoc(IVariableNode node);
void emitMethodDoc(IFunctionNode node, ICompilerProject project);