in compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleDocEmitter.java [219:460]
public void emitMethodDoc(IFunctionNode node, ICompilerProject project)
{
RoyaleJSProject fjp = (RoyaleJSProject)project;
boolean keepASDoc = fjp.config != null && fjp.config.getKeepASDoc();
//exporting methods is handled dynamically in ClosureUtils
emitExports = false;
exportProtected = false;
exportInternal = false;
coercionList = null;
ignoreList = null;
localSettings = null;
emitStringConversions = true;
suppressClosure = false;
IClassDefinition classDefinition = resolveClassDefinition(node);
ASDocComment asDoc = (ASDocComment) node.getASDocComment();
if (node instanceof IFunctionNode)
{
boolean hasDoc = false;
Boolean override = false;
if (node.isConstructor())
{
if (asDoc != null && keepASDoc)
write(changeAnnotations(asDoc.commentNoEnd()));
else
begin();
hasDoc = true;
emitJSDocLine(JSEmitterTokens.CONSTRUCTOR);
IClassDefinition parent = (IClassDefinition) node
.getDefinition().getParent();
IClassDefinition superClass = parent.resolveBaseClass(project);
String qname = (superClass != null) ? project.getActualPackageName(superClass.getQualifiedName()) : null;
//support implicit bindable implementation for 'Extends' EventDispatcher:
if (superClass == null || qname.equals(IASLanguageConstants.Object)) {
if (((JSRoyaleEmitter)emitter).getModel().getImplicitBindableImplementation()
== JSSessionModel.ImplicitBindableImplementation.EXTENDS) {
superClass = (IClassDefinition) project.resolveQNameToDefinition(BindableEmitter.DISPATCHER_CLASS_QNAME);
if (superClass == null) {
System.out.println(BindableEmitter.DISPATCHER_CLASS_QNAME+" not resolved for implicit super class in "+classDefinition.getQualifiedName());
} else qname = BindableEmitter.DISPATCHER_CLASS_QNAME;
}
}
usedNames = true;
if (superClass != null
&& !qname.equals(IASLanguageConstants.Object))
emitExtends(superClass, superClass.getPackageName());
IReference[] references = classDefinition
.getImplementedInterfaceReferences();
Boolean sawIEventDispatcher = false;
Boolean needsIEventDispatcher = ((JSRoyaleEmitter)emitter).getModel().getImplicitBindableImplementation()
== JSSessionModel.ImplicitBindableImplementation.IMPLEMENTS;
for (IReference iReference : references)
{
ITypeDefinition type = (ITypeDefinition) iReference
.resolve(project, (ASScope) classDefinition
.getContainingScope(),
DependencyType.INHERITANCE, true);
if (type == null) {
System.out.println(iReference.getDisplayString()
+ " not resolved in "
+ classDefinition.getQualifiedName());
} else {
emitImplements(type, project.getActualPackageName(type.getPackageName()));
}
if (type.getQualifiedName() == BindableEmitter.DISPATCHER_INTERFACE_QNAME)
sawIEventDispatcher=true;
}
//support implicit bindable implementation for 'implements' IEventDispatcher:
if (needsIEventDispatcher && !sawIEventDispatcher) {
ITypeDefinition type = (ITypeDefinition) project.resolveQNameToDefinition(BindableEmitter.DISPATCHER_INTERFACE_QNAME);
if (type == null) {
System.out.println(BindableEmitter.DISPATCHER_INTERFACE_QNAME+" not resolved for implicit implementation in "+classDefinition.getQualifiedName());
} else {
emitImplements(type, project.getActualPackageName(type.getPackageName()));
}
}
usedNames = false;
}
else
{
// @override
override = node.hasModifier(ASModifier.OVERRIDE);
String ns = node.getNamespace();
if (ASNodeUtils.hasExportSuppressed(node)) {
emitExports = false;
if (IASKeywordConstants.PUBLIC.equals(ns)) // suppress it for reflection data checks:
((JSRoyaleEmitter) (emitter)).getModel().suppressedExportNodes.add(node);
}
if (ns != null)
{
if (asDoc != null && keepASDoc)
{
String docText = asDoc.commentNoEnd();
String keepToken = JSRoyaleEmitterTokens.EMIT_COERCION
.getToken();
if (docText.contains(keepToken))
loadKeepers(docText);
String ignoreToken = JSRoyaleEmitterTokens.IGNORE_COERCION
.getToken();
if (docText.contains(ignoreToken))
loadIgnores(docText);
String noStringToken = JSRoyaleEmitterTokens.IGNORE_STRING_COERCION
.getToken();
if (docText.contains(noStringToken))
emitStringConversions = false;
String noImplicitComplexCoercion = JSRoyaleEmitterTokens.SUPPRESS_COMPLEX_IMPLICIT_COERCION
.getToken();
if (docText.contains(noImplicitComplexCoercion))
loadLocalSettings(docText, noImplicitComplexCoercion, "true");
String noResolveUncertain = JSRoyaleEmitterTokens.SUPPRESS_RESOLVE_UNCERTAIN
.getToken();
if (docText.contains(noResolveUncertain))
loadLocalSettings(docText,noResolveUncertain, "true");
String suppressVectorIndexCheck = JSRoyaleEmitterTokens.SUPPRESS_VECTOR_INDEX_CHECK
.getToken();
if (docText.contains(suppressVectorIndexCheck))
loadLocalSettings(docText,suppressVectorIndexCheck, "true");
String suppressClosureToken = JSRoyaleEmitterTokens.SUPPRESS_CLOSURE.getToken();
if (docText.contains(suppressClosureToken))
suppressClosure = true;
write(changeAnnotations(asDoc.commentNoEnd()));
}
else
begin();
emitMethodAccess(node);
emitMethodNoCollapse(node, fjp);
hasDoc = true;
}
}
if (!override)
{
// @param
IParameterNode[] parameters = node.getParameterNodes();
for (IParameterNode pnode : parameters)
{
if (!hasDoc)
{
if (asDoc != null && keepASDoc)
write(changeAnnotations(asDoc.commentNoEnd()));
else
begin();
emitMethodAccess(node);
emitMethodNoCollapse(node, fjp);
hasDoc = true;
}
IExpressionNode enode = pnode.getNameExpressionNode();
ITypeDefinition tdef = enode.resolveType(project);
if (tdef == null)
continue;
emitParam(pnode, project.getActualPackageName(tdef.getPackageName()), project);
}
}
if (!node.isConstructor())
{
if (!override)
{
// @return
String returnType = node.getReturnType();
if (project.getInferTypes() && (returnType == null || returnType.isEmpty()))
{
ITypeDefinition resolvedTypeDef = SemanticUtils.resolveFunctionInferredReturnType(node, project);
if (resolvedTypeDef != null)
{
returnType = resolvedTypeDef.getQualifiedName();
}
else
{
returnType = "*";
}
}
if (returnType != ""
&& returnType != ASEmitterTokens.VOID.getToken())
{
if (!hasDoc)
{
if (asDoc != null && keepASDoc)
write(changeAnnotations(asDoc.commentNoEnd()));
else
begin();
emitMethodAccess(node);
emitMethodNoCollapse(node, fjp);
hasDoc = true;
}
ITypeDefinition tdef = ((IFunctionDefinition) node
.getDefinition()).resolveReturnType(project);
String packageName = "";
packageName = tdef != null ? tdef.getPackageName() : "";
emitReturn(node, project.getActualPackageName(packageName), project);
}
}
if (override)
{
if (!hasDoc)
{
if (asDoc != null && keepASDoc)
write(changeAnnotations(asDoc.commentNoEnd()));
else
begin();
emitMethodAccess(node);
emitMethodNoCollapse(node, fjp);
hasDoc = true;
}
emitOverride(node);
}
}
if (hasDoc)
end();
}
}