get raw output from asdoc into .txt files. Next step is to create dita files
Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/f938cb72 Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/f938cb72 Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/f938cb72 Branch: refs/heads/feature-autobuild/maven-archetypes Commit: f938cb721f121d1afdf675e4011ce18804ebb640 Parents: c5a1025 Author: Alex Harui <aha...@apache.org> Authored: Tue Oct 11 09:30:09 2016 -0700 Committer: Alex Harui <aha...@apache.org> Committed: Tue Oct 11 22:33:11 2016 -0700 ---------------------------------------------------------------------- .../apache/flex/compiler/clients/ASDOCJSC.java | 445 ++++++ .../apache/flex/compiler/clients/MXMLJSC.java | 2 +- .../codegen/js/flexjs/JSFlexJSASDocEmitter.java | 456 ++++++ .../mxml/flexjs/MXMLFlexJSASDocEmitter.java | 1478 ++++++++++++++++++ .../driver/js/goog/ASDocConfiguration.java | 566 +++++++ .../driver/mxml/ASDocASSourceFileHandler.java | 89 ++ .../driver/mxml/ASDocMXMLSourceFileHandler.java | 89 ++ .../mxml/flexjs/MXMLFlexJSASDocBackend.java | 140 ++ .../internal/projects/FlexJSProject.java | 2 + 9 files changed, 3266 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f938cb72/compiler-jx/src/main/java/org/apache/flex/compiler/clients/ASDOCJSC.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/clients/ASDOCJSC.java b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/ASDOCJSC.java new file mode 100644 index 0000000..5bab139 --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/ASDOCJSC.java @@ -0,0 +1,445 @@ +/* + * + * 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.clients; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Enumeration; +import java.util.List; +import java.util.Set; +import java.util.zip.Deflater; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; + +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.IOUtils; +import org.apache.flex.compiler.codegen.as.IASWriter; +import org.apache.flex.compiler.driver.IBackend; +import org.apache.flex.compiler.driver.js.IJSApplication; +import org.apache.flex.compiler.exceptions.ConfigurationException; +import org.apache.flex.compiler.exceptions.ConfigurationException.IOError; +import org.apache.flex.compiler.exceptions.ConfigurationException.MustSpecifyTarget; +import org.apache.flex.compiler.internal.codegen.js.JSSharedData; +import org.apache.flex.compiler.internal.driver.as.ASBackend; +import org.apache.flex.compiler.internal.driver.js.amd.AMDBackend; +import org.apache.flex.compiler.internal.driver.js.goog.ASDocConfiguration; +import org.apache.flex.compiler.internal.driver.js.goog.GoogBackend; +import org.apache.flex.compiler.internal.driver.mxml.flexjs.MXMLFlexJSASDocBackend; +import org.apache.flex.compiler.internal.driver.mxml.flexjs.MXMLFlexJSSWCBackend; +import org.apache.flex.compiler.internal.driver.mxml.jsc.MXMLJSCJSSWCBackend; +import org.apache.flex.compiler.internal.driver.mxml.vf2js.MXMLVF2JSSWCBackend; +import org.apache.flex.compiler.internal.projects.CompilerProject; +import org.apache.flex.compiler.internal.targets.FlexJSSWCTarget; +import org.apache.flex.compiler.internal.targets.JSTarget; +import org.apache.flex.compiler.problems.FileNotFoundProblem; +import org.apache.flex.compiler.problems.ICompilerProblem; +import org.apache.flex.compiler.problems.InternalCompilerProblem; +import org.apache.flex.compiler.problems.LibraryNotFoundProblem; +import org.apache.flex.compiler.problems.UnableToBuildSWFProblem; +import org.apache.flex.compiler.targets.ITarget.TargetType; +import org.apache.flex.compiler.targets.ITargetSettings; +import org.apache.flex.compiler.units.ICompilationUnit; +import org.apache.flex.swc.ISWC; +import org.apache.flex.swc.io.SWCReader; + +/** + * @author Erik de Bruin + * @author Michael Schmalle + */ +public class ASDOCJSC extends MXMLJSC +{ + /* + * Exit code enumerations. + */ + static enum ExitCode + { + SUCCESS(0), + PRINT_HELP(1), + FAILED_WITH_PROBLEMS(2), + FAILED_WITH_EXCEPTIONS(3), + FAILED_WITH_CONFIG_PROBLEMS(4); + + ExitCode(int code) + { + this.code = code; + } + + final int code; + } + + @Override + public String getName() + { + return FLEX_TOOL_ASDOC; + } + + @Override + public int execute(String[] args) + { + return staticMainNoExit(args); + } + + /** + * Java program entry point. + * + * @param args command line arguments + */ + public static void main(final String[] args) + { + int exitCode = staticMainNoExit(args); + System.exit(exitCode); + } + + /** + * Entry point for the {@code <compc>} Ant task. + * + * @param args Command line arguments. + * @return An exit code. + */ + public static int staticMainNoExit(final String[] args) + { + long startTime = System.nanoTime(); + + IBackend backend = new ASBackend(); + for (String s : args) + { + if (s.contains("js-output-type")) + { + jsOutputType = JSOutputType.fromString(s.split("=")[1]); + + switch (jsOutputType) + { + case AMD: + backend = new AMDBackend(); + break; + + case JSC: + backend = new MXMLJSCJSSWCBackend(); + break; + + case FLEXJS: + case FLEXJS_DUAL: + backend = new MXMLFlexJSASDocBackend(); + break; + + case GOOG: + backend = new GoogBackend(); + break; + + case VF2JS: + backend = new MXMLVF2JSSWCBackend(); + break; + + default: + throw new UnsupportedOperationException(); + } + } + } + + final ASDOCJSC mxmlc = new ASDOCJSC(backend); + final List<ICompilerProblem> problems = new ArrayList<ICompilerProblem>(); + final int exitCode = mxmlc.mainNoExit(args, problems, true); + + long endTime = System.nanoTime(); + JSSharedData.instance.stdout((endTime - startTime) / 1e9 + " seconds"); + + return exitCode; + } + + public ASDOCJSC(IBackend backend) + { + super(backend); + } + + /** + * Main body of this program. This method is called from the public static + * method's for this program. + * + * @return true if compiler succeeds + * @throws IOException + * @throws InterruptedException + */ + @Override + protected boolean compile() + { + boolean compilationSuccess = false; + + try + { + project.getSourceCompilationUnitFactory().addHandler(asFileHandler); + + if (setupTargetFile()) + buildArtifact(); + + if (jsTarget != null) + { + Collection<ICompilerProblem> errors = new ArrayList<ICompilerProblem>(); + Collection<ICompilerProblem> warnings = new ArrayList<ICompilerProblem>(); + + if (!config.getCreateTargetWithErrors()) + { + problems.getErrorsAndWarnings(errors, warnings); + if (errors.size() > 0) + return false; + } + + String outputFolderName = getOutputFilePath(); + + File outputFolder = null; + outputFolder = new File(outputFolderName); + + Set<String> externs = config.getExterns(); + List<String> excludeClasses = ((ASDocConfiguration)config).getExcludeClasses(); + List<String> excludeSources = ((ASDocConfiguration)config).getExcludeSources(); + Collection<ICompilationUnit> roots = ((FlexJSSWCTarget)target).getReachableCompilationUnits(errors); + Collection<ICompilationUnit> reachableCompilationUnits = project.getReachableCompilationUnitsInSWFOrder(roots); + for (final ICompilationUnit cu : reachableCompilationUnits) + { + ICompilationUnit.UnitType cuType = cu.getCompilationUnitType(); + + if (cuType == ICompilationUnit.UnitType.AS_UNIT + || cuType == ICompilationUnit.UnitType.MXML_UNIT) + { + String symbol = cu.getQualifiedNames().get(0); + if (externs.contains(symbol)) continue; + if (excludeClasses.contains(symbol)) continue; + String sourceFile = cu.getAbsoluteFilename(); + if (excludeSources.contains(sourceFile)) continue; + + final File outputClassFile = getOutputClassFile( + cu.getQualifiedNames().get(0), outputFolder); + + System.out.println("Compiling file: " + outputClassFile); + + ICompilationUnit unit = cu; + + IASWriter writer; + if (cuType == ICompilationUnit.UnitType.AS_UNIT) + { + writer = JSSharedData.backend.createWriter(project, + (List<ICompilerProblem>) errors, unit, + false); + } + else + { + writer = JSSharedData.backend.createMXMLWriter( + project, (List<ICompilerProblem>) errors, + unit, false); + } + problems.addAll(errors); + BufferedOutputStream out = new BufferedOutputStream( + new FileOutputStream(outputClassFile)); + writer.writeTo(out); + out.flush(); + out.close(); + writer.close(); + } + } + compilationSuccess = true; + } + } + catch (Exception e) + { + final ICompilerProblem problem = new InternalCompilerProblem(e); + problems.add(problem); + } + + return compilationSuccess; + } + + /** + * Build target artifact. + * + * @throws InterruptedException threading error + * @throws IOException IO error + * @throws ConfigurationException + */ + @Override + protected void buildArtifact() throws InterruptedException, IOException, + ConfigurationException + { + jsTarget = buildJSTarget(); + } + + private IJSApplication buildJSTarget() throws InterruptedException, + FileNotFoundException, ConfigurationException + { + final List<ICompilerProblem> problemsBuildingSWF = new ArrayList<ICompilerProblem>(); + + final IJSApplication app = buildApplication(project, + config.getMainDefinition(), null, problemsBuildingSWF); + problems.addAll(problemsBuildingSWF); + if (app == null) + { + ICompilerProblem problem = new UnableToBuildSWFProblem( + getOutputFilePath()); + problems.add(problem); + } + + return app; + } + + /** + * Replaces FlexApplicationProject::buildSWF() + * + * @param applicationProject + * @param rootClassName + * @param problems + * @return + * @throws InterruptedException + */ + + private IJSApplication buildApplication(CompilerProject applicationProject, + String rootClassName, ICompilationUnit mainCU, + Collection<ICompilerProblem> problems) throws InterruptedException, + ConfigurationException, FileNotFoundException + { + Collection<ICompilerProblem> fatalProblems = applicationProject.getFatalProblems(); + if (!fatalProblems.isEmpty()) + { + problems.addAll(fatalProblems); + return null; + } + + return ((JSTarget) target).build(mainCU, problems); + } + + /** + * Get the output file path. If {@code -output} is specified, use its value; + * otherwise, use the same base name as the target file. + * + * @return output file path + */ + private String getOutputFilePath() + { + if (config.getOutput() == null) + { + final String extension = "." + JSSharedData.OUTPUT_EXTENSION; + return FilenameUtils.removeExtension(config.getTargetFile()).concat( + extension); + } + else + { + String outputFolderName = config.getOutput(); + return outputFolderName; + } + } + + /** + * Get the output class file. This includes the (sub)directory in which the + * original class file lives. If the directory structure doesn't exist, it + * is created. + * + * @author Erik de Bruin + * @param qname + * @param outputFolder + * @return output class file path + */ + private File getOutputClassFile(String qname, File outputFolder) + { + String[] cname = qname.split("\\."); + String sdirPath = outputFolder + File.separator; + if (cname.length > 0) + { + for (int i = 0, n = cname.length - 1; i < n; i++) + { + sdirPath += cname[i] + File.separator; + } + + File sdir = new File(sdirPath); + if (!sdir.exists()) + sdir.mkdirs(); + + qname = cname[cname.length - 1]; + } + + return new File(sdirPath + qname + "." + JSSharedData.OUTPUT_EXTENSION); + } + + /** + * Mxmlc uses target file as the main compilation unit and derive the output + * SWF file name from this file. + * + * @return true if successful, false otherwise. + * @throws InterruptedException + */ + @Override + protected boolean setupTargetFile() throws InterruptedException + { + config.getTargetFile(); + + ITargetSettings settings = getTargetSettings(); + if (settings != null) + project.setTargetSettings(settings); + else + return false; + + target = JSSharedData.backend.createTarget(project, + getTargetSettings(), null); + + return true; + } + + private ITargetSettings getTargetSettings() + { + if (targetSettings == null) + targetSettings = projectConfigurator.getTargetSettings(getTargetType()); + + if (targetSettings == null) + problems.addAll(projectConfigurator.getConfigurationProblems()); + + return targetSettings; + } + + /** + * Validate target file. + * + * @throws MustSpecifyTarget + * @throws IOError + */ + @Override + protected void validateTargetFile() throws ConfigurationException + { + + } + + protected String getProgramName() + { + return "compc"; + } + + protected boolean isCompc() + { + return true; + } + + @Override + protected TargetType getTargetType() + { + return TargetType.SWC; + } +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f938cb72/compiler-jx/src/main/java/org/apache/flex/compiler/clients/MXMLJSC.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/clients/MXMLJSC.java b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/MXMLJSC.java index d14ccd6..0430905 100644 --- a/compiler-jx/src/main/java/org/apache/flex/compiler/clients/MXMLJSC.java +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/MXMLJSC.java @@ -734,7 +734,7 @@ public class MXMLJSC implements JSCompilerEntryPoint, ProblemQueryProvider, protected boolean configure(final String[] args) { project.getSourceCompilationUnitFactory().addHandler(asFileHandler); - projectConfigurator = createConfigurator(); + project.configurator = projectConfigurator = createConfigurator(); try { http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f938cb72/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 new file mode 100644 index 0000000..bdd15a2 --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSASDocEmitter.java @@ -0,0 +1,456 @@ +/* + * + * 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.js.flexjs; + +import java.io.FilterWriter; +import java.util.ArrayList; +import java.util.List; + +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; +import org.apache.flex.compiler.constants.IASKeywordConstants; +import org.apache.flex.compiler.constants.IASLanguageConstants; +import org.apache.flex.compiler.constants.INamespaceConstants; +import org.apache.flex.compiler.definitions.IAccessorDefinition; +import org.apache.flex.compiler.definitions.IClassDefinition; +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.internal.codegen.as.ASEmitterTokens; +import org.apache.flex.compiler.internal.codegen.js.JSSessionModel.ImplicitBindableImplementation; +import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitter; +import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitterTokens; +import org.apache.flex.compiler.internal.codegen.js.jx.AccessorEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.AsIsEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.BinaryOperatorEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.BindableEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.ClassEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.DefinePropertyFunctionEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.FieldEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.ForEachEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.FunctionCallEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.IdentifierEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.InterfaceEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.LiteralEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.MemberAccessEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.MethodEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.ObjectDefinePropertyEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.PackageFooterEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.PackageHeaderEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.SelfReferenceEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.SuperCallEmitter; +import org.apache.flex.compiler.internal.codegen.js.jx.VarDeclarationEmitter; +import org.apache.flex.compiler.internal.codegen.js.utils.EmitterUtils; +import org.apache.flex.compiler.internal.codegen.mxml.flexjs.MXMLFlexJSASDocEmitter; +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.projects.FlexJSProject; +import org.apache.flex.compiler.internal.projects.FlexProject; +import org.apache.flex.compiler.internal.tree.as.BinaryOperatorAsNode; +import org.apache.flex.compiler.internal.tree.as.BlockNode; +import org.apache.flex.compiler.internal.tree.as.DynamicAccessNode; +import org.apache.flex.compiler.internal.tree.as.FunctionCallNode; +import org.apache.flex.compiler.internal.tree.as.FunctionNode; +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.projects.ICompilerProject; +import org.apache.flex.compiler.tree.ASTNodeID; +import org.apache.flex.compiler.tree.as.IASNode; +import org.apache.flex.compiler.tree.as.IAccessorNode; +import org.apache.flex.compiler.tree.as.IBinaryOperatorNode; +import org.apache.flex.compiler.tree.as.IClassNode; +import org.apache.flex.compiler.tree.as.IContainerNode; +import org.apache.flex.compiler.tree.as.IDefinitionNode; +import org.apache.flex.compiler.tree.as.IExpressionNode; +import org.apache.flex.compiler.tree.as.IFileNode; +import org.apache.flex.compiler.tree.as.IForLoopNode; +import org.apache.flex.compiler.tree.as.IFunctionCallNode; +import org.apache.flex.compiler.tree.as.IFunctionNode; +import org.apache.flex.compiler.tree.as.IFunctionObjectNode; +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.ILiteralNode; +import org.apache.flex.compiler.tree.as.IMemberAccessExpressionNode; +import org.apache.flex.compiler.tree.as.INamespaceDecorationNode; +import org.apache.flex.compiler.tree.as.INamespaceNode; +import org.apache.flex.compiler.tree.as.IPackageNode; +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.utils.ASNodeUtils; + +import com.google.common.base.Joiner; +import org.apache.flex.compiler.utils.NativeUtils; + +/** + * Concrete implementation of the 'FlexJS' JavaScript production. + * + * @author Michael Schmalle + * @author Erik de Bruin + */ +public class JSFlexJSASDocEmitter extends JSGoogEmitter implements IJSFlexJSEmitter +{ + + @Override + public String postProcess(String output) + { + return output; + } + + public JSFlexJSASDocEmitter(FilterWriter out) + { + super(out); + } + + @Override + protected void writeIndent() + { + write(JSFlexJSEmitterTokens.INDENT); + } + + @Override + protected String getIndent(int numIndent) + { + final StringBuilder sb = new StringBuilder(); + for (int i = 0; i < numIndent; i++) + sb.append(JSFlexJSEmitterTokens.INDENT.getToken()); + return sb.toString(); + } + + @Override + public void emitNamespace(INamespaceNode node) + { + ASDocComment asDoc = (ASDocComment) node.getASDocComment(); + write("<"); + write(formatQualifiedName(node.getQualifiedName())); + write(">"); + indentPush(); + if (asDoc != null) + write(asDoc.commentNoEnd()); + indentPop(); + write("</"); + write(formatQualifiedName(node.getQualifiedName())); + writeNewline(">"); + } + + + @Override + public String formatQualifiedName(String name) + { + return formatQualifiedName(name, false); + } + + public MXMLFlexJSASDocEmitter mxmlEmitter = null; + + public String formatQualifiedName(String name, boolean isDoc) + { + if (mxmlEmitter != null) + name = mxmlEmitter.formatQualifiedName(name); + /* + if (name.contains("goog.") || name.startsWith("Vector.")) + return name; + name = name.replaceAll("\\.", "_"); + */ + if (getModel().isInternalClass(name)) + return getModel().getInternalClasses().get(name); + if (NativeUtils.isJSNative(name)) return name; + if (name.startsWith("window.")) + name = name.substring(7); + else if (!isDoc) + { + } + return name; + } + + public String convertASTypeToJS(String name) + { + String result = name; + + if (name.equals("")) + result = IASLanguageConstants.Object; + else if (name.equals(IASLanguageConstants.Class)) + result = IASLanguageConstants.Object; + else if (name.equals(IASLanguageConstants._int) + || name.equals(IASLanguageConstants.uint)) + result = IASLanguageConstants.Number; + + boolean isBuiltinFunction = name.matches("Vector\\.<.*>"); + if (isBuiltinFunction) + { + result = IASLanguageConstants.Array; + } + return result; + } + + //-------------------------------------------------------------------------- + // Package Level + //-------------------------------------------------------------------------- + + @Override + public void emitPackageHeader(IPackageDefinition definition) + { + IPackageNode packageNode = definition.getNode(); + IFileNode fileNode = (IFileNode) packageNode.getAncestorOfType(IFileNode.class); + int nodeCount = fileNode.getChildCount(); + for (int i = 0; i < nodeCount; i++) + { + IASNode pnode = fileNode.getChild(i); + + if (pnode instanceof IPackageNode) + { + } + else if (pnode instanceof IClassNode) + { + getWalker().walk(pnode); + } + else if (pnode instanceof IInterfaceNode) + { + getWalker().walk(pnode); + } + else if (pnode instanceof IFunctionNode) + { + getWalker().walk(pnode); + } + else if (pnode instanceof INamespaceNode) + { + getWalker().walk(pnode); + } + else if (pnode instanceof IVariableNode) + { + getWalker().walk(pnode); + } + } + } + + @Override + public void emitPackageHeaderContents(IPackageDefinition definition) + { + } + + @Override + public void emitPackageFooter(IPackageDefinition definition) + { + } + + //-------------------------------------------------------------------------- + // Class + //-------------------------------------------------------------------------- + + @Override + public void emitClass(IClassNode node) + { + ASDocComment asDoc = (ASDocComment) node.getASDocComment(); + write("<"); + write(formatQualifiedName(node.getQualifiedName())); + write(">"); + indentPush(); + if (asDoc != null) + write(asDoc.commentNoEnd()); + final IDefinitionNode[] members = node.getAllMemberNodes(); + for (IDefinitionNode mnode : members) + { + getWalker().walk(mnode); + } + indentPop(); + write("</"); + write(formatQualifiedName(node.getQualifiedName())); + write(">"); + } + + @Override + public void emitInterface(IInterfaceNode node) + { + ASDocComment asDoc = (ASDocComment) node.getASDocComment(); + write("<"); + write(formatQualifiedName(node.getQualifiedName())); + write(">"); + indentPush(); + if (asDoc != null) + write(asDoc.commentNoEnd()); + final IDefinitionNode[] members = node.getAllMemberDefinitionNodes(); + for (IDefinitionNode mnode : members) + { + getWalker().walk(mnode); + } + indentPop(); + write("</"); + write(formatQualifiedName(node.getQualifiedName())); + writeNewline(">"); + } + + private ArrayList<String> accessors = new ArrayList<String>(); + + @Override + public void emitGetAccessor(IGetterNode node) + { + if (node.getDefinition().isPrivate()) return; + + String name = node.getName(); + if (accessors.contains(name)) return; + accessors.add(name); + 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(); + } + } + write("<"); + write(formatQualifiedName(node.getQualifiedName())); + write(">"); + indentPush(); + if (asDoc != null) + write(asDoc.commentNoEnd()); + indentPop(); + write("</"); + write(formatQualifiedName(node.getQualifiedName())); + writeNewline(">"); + } + + @Override + public void emitSetAccessor(ISetterNode node) + { + if (node.getDefinition().isPrivate()) return; + + String name = node.getName(); + if (accessors.contains(name)) return; + accessors.add(name); + 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(); + } + } + write("<"); + write(formatQualifiedName(node.getQualifiedName())); + write(">"); + indentPush(); + if (asDoc != null) + write(asDoc.commentNoEnd()); + indentPop(); + write("</"); + write(formatQualifiedName(node.getQualifiedName())); + writeNewline(">"); + } + + @Override + public void emitField(IVariableNode node) + { + if (node.getDefinition().isPrivate()) return; + + ASDocComment asDoc = (ASDocComment) node.getASDocComment(); + write("<"); + write(formatQualifiedName(node.getQualifiedName())); + write(">"); + indentPush(); + if (asDoc != null) + write(asDoc.commentNoEnd()); + indentPop(); + write("</"); + write(formatQualifiedName(node.getQualifiedName())); + writeNewline(">"); + } + + @Override + public void emitVarDeclaration(IVariableNode node) + { + if (node.getDefinition().isPrivate()) return; + + ASDocComment asDoc = (ASDocComment) node.getASDocComment(); + write("<"); + write(formatQualifiedName(node.getQualifiedName())); + write(">"); + indentPush(); + if (asDoc != null) + write(asDoc.commentNoEnd()); + indentPop(); + write("</"); + write(formatQualifiedName(node.getQualifiedName())); + writeNewline(">"); + } + + @Override + public void emitAccessors(IAccessorNode node) + { + if (node.getDefinition().isPrivate()) return; + + String name = node.getName(); + if (accessors.contains(name)) return; + accessors.add(name); + 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(); + } + } + write("<"); + write(formatQualifiedName(node.getQualifiedName())); + write(">"); + indentPush(); + if (asDoc != null) + write(asDoc.commentNoEnd()); + indentPop(); + write("</"); + write(formatQualifiedName(node.getQualifiedName())); + writeNewline(">"); + } + + @Override + public void emitMethod(IFunctionNode node) + { + if (node.getDefinition().isPrivate()) return; + + ASDocComment asDoc = (ASDocComment) node.getASDocComment(); + write("<"); + write(formatQualifiedName(node.getQualifiedName())); + write(">"); + indentPush(); + if (asDoc != null) + write(asDoc.commentNoEnd()); + indentPop(); + write("</"); + write(formatQualifiedName(node.getQualifiedName())); + writeNewline(">"); + } +}