You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by cd...@apache.org on 2016/10/21 15:17:02 UTC

[24/44] git commit: [flex-falcon] [refs/heads/feature-autobuild/maven-archetypes] - try to get JSON output for ASDoc

try to get JSON output for ASDoc


Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/8e795593
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/8e795593
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/8e795593

Branch: refs/heads/feature-autobuild/maven-archetypes
Commit: 8e7955930697c9b4c9385ce0b4ce39227db37aa0
Parents: f938cb7
Author: Alex Harui <ah...@apache.org>
Authored: Tue Oct 11 22:32:57 2016 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Oct 11 22:33:11 2016 -0700

----------------------------------------------------------------------
 .../compiler/asdoc/flexjs/ASDocComment.java     |  94 ++++-
 .../codegen/js/flexjs/JSFlexJSASDocEmitter.java | 371 +++++++++++++++----
 .../mxml/flexjs/MXMLFlexJSASDocBackend.java     |   2 +-
 .../parsing/as/FlexJSASDocDelegate.java         |  27 +-
 4 files changed, 389 insertions(+), 105 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/8e795593/compiler-jx/src/main/java/org/apache/flex/compiler/asdoc/flexjs/ASDocComment.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/asdoc/flexjs/ASDocComment.java b/compiler-jx/src/main/java/org/apache/flex/compiler/asdoc/flexjs/ASDocComment.java
index 5470f47..e5064b1 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/asdoc/flexjs/ASDocComment.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/asdoc/flexjs/ASDocComment.java
@@ -19,7 +19,9 @@
 
 package org.apache.flex.compiler.asdoc.flexjs;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -64,39 +66,91 @@ public class ASDocComment implements IASDocComment
         return sb.toString();
     }
 
+    private String description = null;
+    private Map<String, List<IASDocTag>> tagMap;
+    
     @Override
     public String getDescription()
     {
-        return null;
+        return description;
     }
 
     @Override
     public void compile()
     {
+        String s = token.getText();
+        String[] lines = s.split("\n");
+        StringBuilder sb = new StringBuilder();
+        int n = lines.length;
+        if (n == 1)
+        {
+        	int c = lines[0].indexOf("*/");
+        	if (c != -1)
+        		lines[0] = lines[0].substring(0, c);
+        }
+        // clip off asdoc slash-star-star
+        sb.append(lines[0].substring(3));
+        for (int i = 1; i < n - 1; i++)
+        {
+            String line = lines[i];
+            int star = line.indexOf("*");
+            int at = line.indexOf("@");
+            if (at == -1)
+            {
+	            sb.append(" ");
+	            if (star > -1)
+	                sb.append(line.substring(star + 1));
+            }
+            else
+            {
+            	if (tagMap == null)
+            		tagMap = new HashMap<String, List<IASDocTag>>();
+            	
+            	int after = line.indexOf(" ", at + 1);
+            	if (after == -1)
+            	{
+            		tagMap.put(line.substring(at + 1), null);
+            	}
+            	else
+            	{
+            		String tagName = line.substring(at + 1, after);
+            		List<IASDocTag> tags = tagMap.get(tagName);
+            		if (tags == null)
+            		{
+            			tags = new ArrayList<IASDocTag>();
+            			tagMap.put(tagName, tags);
+            		}
+            		tags.add(new ASDocTag(tagName, line.substring(after + 1)));
+            	}            		
+            }
+        }
+        description = sb.toString();
     }
 
     @Override
     public boolean hasTag(String name)
     {
-        return false;
+    	if (tagMap == null)	
+    		return false;
+    	return (tagMap.containsKey(name));
     }
 
     @Override
     public IASDocTag getTag(String name)
     {
-        return null;
+        return tagMap.get(name).get(0);
     }
 
     @Override
     public Map<String, List<IASDocTag>> getTags()
     {
-        return null;
+        return tagMap;
     }
 
     @Override
     public Collection<IASDocTag> getTagsByName(String string)
     {
-        return null;
+        return tagMap.get(string);
     }
 
     @Override
@@ -104,4 +158,34 @@ public class ASDocComment implements IASDocComment
     {
     }
 
+    class ASDocTag implements IASDocTag
+    {
+    	public ASDocTag(String name, String desc)
+    	{
+    		this.name = name;
+    		this.desc = desc;
+    	}
+
+    	private String name;
+    	private String desc;
+    	
+		@Override
+		public String getName() {
+			// TODO Auto-generated method stub
+			return name;
+		}
+
+		@Override
+		public String getDescription() {
+			// TODO Auto-generated method stub
+			return desc;
+		}
+
+		@Override
+		public boolean hasDescription() {
+			// TODO Auto-generated method stub
+			return desc != null;
+		}
+    	
+    }
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/8e795593/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSASDocEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSASDocEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSASDocEmitter.java
index bdd15a2..1fffbc1 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSASDocEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSASDocEmitter.java
@@ -22,7 +22,10 @@ package org.apache.flex.compiler.internal.codegen.js.flexjs;
 import java.io.FilterWriter;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
+import org.apache.flex.compiler.asdoc.IASDocTag;
 import org.apache.flex.compiler.asdoc.flexjs.ASDocComment;
 import org.apache.flex.compiler.codegen.js.flexjs.IJSFlexJSEmitter;
 import org.apache.flex.compiler.codegen.js.goog.IJSGoogDocEmitter;
@@ -35,6 +38,9 @@ import org.apache.flex.compiler.definitions.IDefinition;
 import org.apache.flex.compiler.definitions.INamespaceDefinition;
 import org.apache.flex.compiler.definitions.IPackageDefinition;
 import org.apache.flex.compiler.definitions.ITypeDefinition;
+import org.apache.flex.compiler.definitions.metadata.IDeprecationInfo;
+import org.apache.flex.compiler.definitions.metadata.IMetaTag;
+import org.apache.flex.compiler.definitions.references.INamespaceReference;
 import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens;
 import org.apache.flex.compiler.internal.codegen.js.JSSessionModel.ImplicitBindableImplementation;
 import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitter;
@@ -64,6 +70,7 @@ import org.apache.flex.compiler.internal.codegen.mxml.flexjs.MXMLFlexJSASDocEmit
 import org.apache.flex.compiler.internal.codegen.mxml.flexjs.MXMLFlexJSEmitter;
 import org.apache.flex.compiler.internal.definitions.AccessorDefinition;
 import org.apache.flex.compiler.internal.definitions.FunctionDefinition;
+import org.apache.flex.compiler.internal.definitions.GetterDefinition;
 import org.apache.flex.compiler.internal.projects.FlexJSProject;
 import org.apache.flex.compiler.internal.projects.FlexProject;
 import org.apache.flex.compiler.internal.tree.as.BinaryOperatorAsNode;
@@ -75,6 +82,7 @@ import org.apache.flex.compiler.internal.tree.as.IdentifierNode;
 import org.apache.flex.compiler.internal.tree.as.LabeledStatementNode;
 import org.apache.flex.compiler.internal.tree.as.MemberAccessExpressionNode;
 import org.apache.flex.compiler.internal.tree.as.NumericLiteralNode;
+import org.apache.flex.compiler.internal.tree.as.metadata.EventTagNode;
 import org.apache.flex.compiler.projects.ICompilerProject;
 import org.apache.flex.compiler.tree.ASTNodeID;
 import org.apache.flex.compiler.tree.as.IASNode;
@@ -101,6 +109,7 @@ import org.apache.flex.compiler.tree.as.IScopedNode;
 import org.apache.flex.compiler.tree.as.ISetterNode;
 import org.apache.flex.compiler.tree.as.IUnaryOperatorNode;
 import org.apache.flex.compiler.tree.as.IVariableNode;
+import org.apache.flex.compiler.tree.metadata.IMetaTagNode;
 import org.apache.flex.compiler.utils.ASNodeUtils;
 
 import com.google.common.base.Joiner;
@@ -115,6 +124,8 @@ import org.apache.flex.compiler.utils.NativeUtils;
 public class JSFlexJSASDocEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
 {
 
+	private boolean wroteSomething = false;
+	
     @Override
     public String postProcess(String output)
     {
@@ -145,16 +156,17 @@ public class JSFlexJSASDocEmitter extends JSGoogEmitter implements IJSFlexJSEmit
     public void emitNamespace(INamespaceNode node)
     {
         ASDocComment asDoc = (ASDocComment) node.getASDocComment();
-        write("<");
+        if (asDoc != null && asDoc.commentNoEnd().contains("@private"))
+        	return;
+        writeNewline("{ \"type\": \"namespace\",");
+        write("  \"qname\": \"");
         write(formatQualifiedName(node.getQualifiedName()));
-        write(">");
+        writeNewline("\",");
         indentPush();
         if (asDoc != null)
-        	write(asDoc.commentNoEnd());
+        	writeASDoc(asDoc);
         indentPop();
-        write("</");
-        write(formatQualifiedName(node.getQualifiedName()));
-        writeNewline(">");
+        writeNewline("}");
     }
 
 
@@ -264,42 +276,96 @@ public class JSFlexJSASDocEmitter extends JSGoogEmitter implements IJSFlexJSEmit
     public void emitClass(IClassNode node)
     {
         ASDocComment asDoc = (ASDocComment) node.getASDocComment();
-        write("<");
+        writeNewline("{ \"type\": \"class\",");
+        write("  \"qname\": \"");
         write(formatQualifiedName(node.getQualifiedName()));
-        write(">");
+        writeNewline("\",");
         indentPush();
         if (asDoc != null)
-        	write(asDoc.commentNoEnd());
+        	writeASDoc(asDoc);
         final IDefinitionNode[] members = node.getAllMemberNodes();
+        if (members.length > 0)
+        {
+        	writeNewline(",");
+        	writeNewline("\"members\": [");
+        	indentPush();
+        	indentPush();
+        }
+        boolean firstMember = true;
         for (IDefinitionNode mnode : members)
         {
+        	if (!firstMember && wroteSomething)
+        		writeNewline(",");
+        	firstMember = false;
+        	wroteSomething = false;
         	getWalker().walk(mnode);
         }
+        if (members.length > 0)
+        {
+            indentPop();
+            indentPop();
+        	writeNewline("]");
+        }
+        IMetaTagNode[] metas = node.getMetaTagNodesByName("Event");
+        if (metas.length > 0)
+        {
+        	writeNewline(",");
+        	writeNewline("\"events\": [");
+        	indentPush();
+        	indentPush();
+        }
+        boolean firstEvent = true;
+        for (IMetaTagNode mnode : metas)
+        {
+        	if (!firstEvent && wroteSomething)
+        		writeNewline(",");
+        	firstEvent = false;
+        	wroteSomething = false;
+        	writeEventTagNode(mnode);
+        }
+        if (metas.length > 0)
+        {
+            indentPop();
+            indentPop();
+        	writeNewline("]");
+        }
+        
         indentPop();
-        write("</");
-        write(formatQualifiedName(node.getQualifiedName()));
-        write(">");
+        writeNewline("}");
     }
 
     @Override
     public void emitInterface(IInterfaceNode node)
     {
         ASDocComment asDoc = (ASDocComment) node.getASDocComment();
-        write("<");
+        writeNewline("{ \"type\": \"interface\",");
+        write("  \"qname\": \"");
         write(formatQualifiedName(node.getQualifiedName()));
-        write(">");
+        writeNewline("\",");
         indentPush();
         if (asDoc != null)
-        	write(asDoc.commentNoEnd());
+        	writeASDoc(asDoc);
         final IDefinitionNode[] members = node.getAllMemberDefinitionNodes();
+        if (members.length > 0)
+        {
+        	writeNewline(",");
+        	writeNewline("members: [");
+        }
+        boolean firstMember = true;
         for (IDefinitionNode mnode : members)
         {
+        	if (!firstMember && wroteSomething)
+        		writeNewline(",");
+        	firstMember = false;
+        	wroteSomething = false;
         	getWalker().walk(mnode);
         }
+        if (members.length > 0)
+        {
+        	writeNewline("]");
+        }
         indentPop();
-        write("</");
-        write(formatQualifiedName(node.getQualifiedName()));
-        writeNewline(">");
+        writeNewline("}");
     }
 
     private ArrayList<String> accessors = new ArrayList<String>();
@@ -312,28 +378,32 @@ public class JSFlexJSASDocEmitter extends JSGoogEmitter implements IJSFlexJSEmit
     	String name = node.getName();
         if (accessors.contains(name)) return;
         accessors.add(name);
+        writeNewline("{ \"type\": \"accessor\",");
+    	IAccessorDefinition def = (IAccessorDefinition)node.getDefinition();
+    	IAccessorDefinition otherDef = (IAccessorDefinition)def.resolveCorrespondingAccessor(getWalker().getProject());
+    	IAccessorNode otherNode = null;
+    	if (otherDef != null)
+    	{
+        	otherNode = (IAccessorNode)otherDef.getNode();
+            writeNewline("  \"access\": \"read-write\",");
+    	}
+    	else
+            writeNewline("  \"access\": \"read-only\",");
         ASDocComment asDoc = (ASDocComment) node.getASDocComment();
         if (asDoc == null || asDoc.commentNoEnd().contains("@private"))
         {
-        	IAccessorDefinition def = (IAccessorDefinition)node.getDefinition();
-        	IAccessorDefinition otherDef = (IAccessorDefinition)def.resolveCorrespondingAccessor(getWalker().getProject());
-        	if (otherDef != null)
-        	{
-            	IAccessorNode otherNode = (IAccessorNode)otherDef.getNode();
-            	if (otherNode != null)
-            		asDoc = (ASDocComment) otherNode.getASDocComment();        		
-        	}
+        	if (otherNode != null)
+        		asDoc = (ASDocComment) otherNode.getASDocComment();        		
         }
-        write("<");
+        write("  \"qname\": \"");
         write(formatQualifiedName(node.getQualifiedName()));
-        write(">");
+        writeNewline("\",");
+        writeDefinitionAttributes(def);
         indentPush();
         if (asDoc != null)
-        	write(asDoc.commentNoEnd());
+        	writeASDoc(asDoc);
         indentPop();
-        write("</");
-        write(formatQualifiedName(node.getQualifiedName()));
-        writeNewline(">");
+        write("}");
     }
 
     @Override
@@ -344,28 +414,32 @@ public class JSFlexJSASDocEmitter extends JSGoogEmitter implements IJSFlexJSEmit
     	String name = node.getName();
         if (accessors.contains(name)) return;
         accessors.add(name);
+        writeNewline("{ \"type\": \"accessor\",");
+    	IAccessorDefinition def = (IAccessorDefinition)node.getDefinition();
+    	IAccessorDefinition otherDef = (IAccessorDefinition)def.resolveCorrespondingAccessor(getWalker().getProject());
+    	IAccessorNode otherNode = null;
+    	if (otherDef != null)
+    	{
+        	otherNode = (IAccessorNode)otherDef.getNode();
+            writeNewline("  \"access\": \"read-write\",");
+    	}
+    	else
+            writeNewline("  \"access\": \"read-only\",");
         ASDocComment asDoc = (ASDocComment) node.getASDocComment();
         if (asDoc == null || asDoc.commentNoEnd().contains("@private"))
         {
-        	IAccessorDefinition def = (IAccessorDefinition)node.getDefinition();
-        	IAccessorDefinition otherDef = (IAccessorDefinition)def.resolveCorrespondingAccessor(getWalker().getProject());
-        	if (otherDef != null)
-        	{
-            	IAccessorNode otherNode = (IAccessorNode)otherDef.getNode();
-            	if (otherNode != null)
-            		asDoc = (ASDocComment) otherNode.getASDocComment();        		
-        	}
+        	if (otherNode != null)
+        		asDoc = (ASDocComment) otherNode.getASDocComment();        		
         }
-        write("<");
+        write("  \"qname\": \"");
         write(formatQualifiedName(node.getQualifiedName()));
-        write(">");
+        writeNewline("\",");
+        writeDefinitionAttributes(def);
         indentPush();
         if (asDoc != null)
-        	write(asDoc.commentNoEnd());
+        	writeASDoc(asDoc);
         indentPop();
-        write("</");
-        write(formatQualifiedName(node.getQualifiedName()));
-        writeNewline(">");
+        write("}");
     }
     
     @Override
@@ -374,16 +448,18 @@ public class JSFlexJSASDocEmitter extends JSGoogEmitter implements IJSFlexJSEmit
     	if (node.getDefinition().isPrivate()) return;
     	
         ASDocComment asDoc = (ASDocComment) node.getASDocComment();
-        write("<");
+        if (asDoc != null && asDoc.commentNoEnd().contains("@private"))
+        	return;
+        writeNewline("{ \"type\": \"field\",");
+        write("  \"qname\": \"");
         write(formatQualifiedName(node.getQualifiedName()));
-        write(">");
+        writeNewline("\",");
+        writeDefinitionAttributes(node.getDefinition());
         indentPush();
         if (asDoc != null)
-        	write(asDoc.commentNoEnd());
+        	writeASDoc(asDoc);
         indentPop();
-        write("</");
-        write(formatQualifiedName(node.getQualifiedName()));
-        writeNewline(">");
+        write("}");
     }
 
     @Override
@@ -391,17 +467,19 @@ public class JSFlexJSASDocEmitter extends JSGoogEmitter implements IJSFlexJSEmit
     {
     	if (node.getDefinition().isPrivate()) return;
 
-    	ASDocComment asDoc = (ASDocComment) node.getASDocComment();
-        write("<");
+        ASDocComment asDoc = (ASDocComment) node.getASDocComment();
+        if (asDoc != null && asDoc.commentNoEnd().contains("@private"))
+        	return;
+        writeNewline("{ \"type\": \"variable\",");
+        write("  \"qname\": \"");
         write(formatQualifiedName(node.getQualifiedName()));
-        write(">");
+        writeNewline("\",");
+        writeDefinitionAttributes(node.getDefinition());
         indentPush();
         if (asDoc != null)
-        	write(asDoc.commentNoEnd());
+        	writeASDoc(asDoc);
         indentPop();
-        write("</");
-        write(formatQualifiedName(node.getQualifiedName()));
-        writeNewline(">");
+        write("}");
     }
 
     @Override
@@ -412,28 +490,32 @@ public class JSFlexJSASDocEmitter extends JSGoogEmitter implements IJSFlexJSEmit
     	String name = node.getName();
         if (accessors.contains(name)) return;
         accessors.add(name);
+        writeNewline("{ \"type\": \"accessor\",");
+    	IAccessorDefinition def = (IAccessorDefinition)node.getDefinition();
+    	IAccessorDefinition otherDef = (IAccessorDefinition)def.resolveCorrespondingAccessor(getWalker().getProject());
+    	IAccessorNode otherNode = null;
+    	if (otherDef != null)
+    	{
+        	otherNode = (IAccessorNode)otherDef.getNode();
+            writeNewline("  \"access\": \"read-write\",");
+    	}
+    	else
+            writeNewline("  \"access\": \"read-only\",");
         ASDocComment asDoc = (ASDocComment) node.getASDocComment();
         if (asDoc == null || asDoc.commentNoEnd().contains("@private"))
         {
-        	IAccessorDefinition def = (IAccessorDefinition)node.getDefinition();
-        	IAccessorDefinition otherDef = (IAccessorDefinition)def.resolveCorrespondingAccessor(getWalker().getProject());
-        	if (otherDef != null)
-        	{
-            	IAccessorNode otherNode = (IAccessorNode)otherDef.getNode();
-            	if (otherNode != null)
-            		asDoc = (ASDocComment) otherNode.getASDocComment();        		
-        	}
+        	if (otherNode != null)
+        		asDoc = (ASDocComment) otherNode.getASDocComment();        		
         }
-        write("<");
+        write("  \"qname\": \"");
         write(formatQualifiedName(node.getQualifiedName()));
-        write(">");
+        writeNewline("\",");
+        writeDefinitionAttributes(def);
         indentPush();
         if (asDoc != null)
-        	write(asDoc.commentNoEnd());
+        	writeASDoc(asDoc);
         indentPop();
-        write("</");
-        write(formatQualifiedName(node.getQualifiedName()));
-        writeNewline(">");
+        write("}");
     }
     
     @Override
@@ -441,16 +523,145 @@ public class JSFlexJSASDocEmitter extends JSGoogEmitter implements IJSFlexJSEmit
     {
     	if (node.getDefinition().isPrivate()) return;
 
-    	ASDocComment asDoc = (ASDocComment) node.getASDocComment();
-        write("<");
+        ASDocComment asDoc = (ASDocComment) node.getASDocComment();
+        if (asDoc != null && asDoc.commentNoEnd().contains("@private"))
+        	return;
+        writeNewline("{ \"type\": \"method\",");
+        write("  \"qname\": \"");
         write(formatQualifiedName(node.getQualifiedName()));
-        write(">");
+        writeNewline("\",");
+        writeDefinitionAttributes(node.getDefinition());
         indentPush();
         if (asDoc != null)
-        	write(asDoc.commentNoEnd());
+        	writeASDoc(asDoc);
         indentPop();
-        write("</");
-        write(formatQualifiedName(node.getQualifiedName()));
-        writeNewline(">");
+        write("}");
+    }
+    
+    public void writeASDoc(ASDocComment asDoc)
+    {
+    	asDoc.compile();
+        write("  \"description\": \"");
+    	write(asDoc.getDescription());
+		write("\"");
+    	Map<String, List<IASDocTag>> tags = asDoc.getTags();
+    	if (tags != null)
+    	{
+    		writeNewline(",");
+    		writeNewline("\"tags\": [");
+    		indentPush();
+    		indentPush();
+    		boolean firstTag = true;
+    		Set<String> tagNames = tags.keySet();
+    		for (String tagName : tagNames)
+    		{
+    			if (!firstTag)
+    				writeNewline(",");
+    			firstTag = false;
+    			write("{  \"tagName\": \"");
+    			write(tagName);
+    			writeNewline("\",");
+    			write("   \"values\": [");
+        		indentPush();
+        		indentPush();
+    			List<IASDocTag> values = tags.get(tagName);
+    			if (values != null)
+    			{
+    				boolean firstOne = true;
+    				for (IASDocTag value : values)
+    				{
+    					if (!firstOne) write(", ");
+    					firstOne = false;
+    					write("\"");
+    					write(value.getDescription());
+    					write("\"");
+    				}
+    			}
+    			write("]}");
+        		indentPop();
+        		indentPop();
+    		}
+    		write("  ]");
+    		indentPop();
+    		indentPop();
+    	}
     }
+    
+    @Override
+    public void write(String value)
+    {
+    	super.write(value);
+    	wroteSomething = true;
+    }
+       
+    public void writeDefinitionAttributes(IDefinition def)
+    {
+        write("  \"namespace\": ");
+        if (def.isProtected())
+        	writeNewline("\"protected\",");
+        else if (def.isInternal())
+        	writeNewline("\"internal\",");
+        else if (def.isPublic())
+        	writeNewline("\"public\",");
+        else 
+        {
+        	INamespaceReference nsRef = def.getNamespaceReference();
+        	writeNewline("\"" + nsRef.getBaseName() + "\",");
+        }
+        if (def.isBindable())
+        {
+        	List<String> events = def.getBindableEventNames();
+            write("  \"bindable\": [");
+            boolean firstEvent = true;
+            for (String event : events)
+            {
+            	if (!firstEvent)
+            		write(",");
+            	firstEvent = false;
+            	write("\"" + event + "\"");
+            }
+            writeNewline("],");
+        }
+        if (def.isOverride())
+            writeNewline("  \"override\": true,");
+        if (def.isStatic())
+            writeNewline("  \"static\": true,");
+        if (def.isDynamic())
+            writeNewline("  \"dynamic\": true,");
+        if (def.isFinal())
+            writeNewline("  \"final\": true,");
+        if (def.isDeprecated())
+        {
+        	IDeprecationInfo dep = def.getDeprecationInfo();
+            writeNewline("  \"deprecated\": {");
+            indentPush();
+            write("  \"message\":  \"");
+            write(dep.getMessage());
+            writeNewline("\",");
+            write("  \"replacement\":  \"");
+            write(dep.getReplacement());
+            writeNewline("\",");
+            write("  \"since\":  \"");
+            write(dep.getSince());
+            writeNewline("\",");
+        }
+    }
+    
+    public void writeEventTagNode(IMetaTagNode node)
+    {
+    	EventTagNode evt = (EventTagNode)node;
+        ASDocComment asDoc = (ASDocComment) evt.getASDocComment();
+        if (asDoc != null && asDoc.commentNoEnd().contains("@private"))
+        	return;
+        write("{ \"qname\": \"");
+        write(formatQualifiedName(evt.getName()));
+        writeNewline("\",");
+        indentPush();
+        if (asDoc != null)
+        	writeASDoc(asDoc);
+        indentPop();
+        write("}");
+    }
+    
+
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/8e795593/compiler-jx/src/main/java/org/apache/flex/compiler/internal/driver/mxml/flexjs/MXMLFlexJSASDocBackend.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/driver/mxml/flexjs/MXMLFlexJSASDocBackend.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/driver/mxml/flexjs/MXMLFlexJSASDocBackend.java
index 4816fd2..44e5c4e 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/driver/mxml/flexjs/MXMLFlexJSASDocBackend.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/driver/mxml/flexjs/MXMLFlexJSASDocBackend.java
@@ -134,7 +134,7 @@ public class MXMLFlexJSASDocBackend extends MXMLFlexJSSWCBackend
     @Override
     public String getOutputExtension()
     {
-        return "txt";
+        return "json";
     }
 
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/8e795593/compiler-jx/src/main/java/org/apache/flex/compiler/internal/parsing/as/FlexJSASDocDelegate.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/parsing/as/FlexJSASDocDelegate.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/parsing/as/FlexJSASDocDelegate.java
index 868e5d7..c1c2368 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/parsing/as/FlexJSASDocDelegate.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/parsing/as/FlexJSASDocDelegate.java
@@ -73,7 +73,7 @@ public final class FlexJSASDocDelegate implements IASDocDelegate
         return IPackageDITAParser.NIL_PARSER;
     }
 
-    private static final class ASDelegate implements IASParserASDocDelegate
+    private static final class ASDelegate implements IASParserASDocDelegate, IMetadataParserASDocDelegate
     {
         @SuppressWarnings("unused")
 		static final ASDelegate INSTANCE = new ASDelegate();
@@ -110,24 +110,13 @@ public final class FlexJSASDocDelegate implements IASDocDelegate
         @Override
         public IMetadataParserASDocDelegate getMetadataParserASDocDelegate()
         {
-            return MetadataDelegate.INSTANCE;
-        }
-
-    }
-
-    private static final class MetadataDelegate implements IMetadataParserASDocDelegate
-    {
-        static final MetadataDelegate INSTANCE = new MetadataDelegate();
-
-        @Override
-        public void setCurrentASDocToken(Token asDocToken)
-        {
-        }
-
-        @Override
-        public IASDocComment afterDefinition(IDocumentableDefinitionNode definitionNode)
-        {
-            return null;
+        	// ASDelegate is also MetadataDelegate because when metadata like
+        	// event metadata has asdoc, the parser sees the asdoc token before
+        	// seeing the metadata tokens so it tells the ASDelegate about
+        	// the token but then asks the metadata delegate after the
+        	// definition.  Sharing the token between the two types of
+        	// delegates seems to fix the problem.
+            return this;
         }
 
         @Override