JS backend: added generation @lends JsDoc annotation.

For more information about @lends see https://code.google.com/p/jsdoc-toolkit/wiki/TagLends

(cherry picked from commit 1269911)
This commit is contained in:
develar
2013-08-08 21:28:41 +04:00
committed by Zalim Bashorov
parent a53b9e99ad
commit bc4e0e212a
3 changed files with 24 additions and 10 deletions
Binary file not shown.
Binary file not shown.
@@ -123,25 +123,28 @@ public final class ClassTranslator extends AbstractTranslator {
private void translate(@NotNull JsInvocation createInvocation, @NotNull TranslationContext context) { private void translate(@NotNull JsInvocation createInvocation, @NotNull TranslationContext context) {
addSuperclassReferences(createInvocation); addSuperclassReferences(createInvocation);
addClassOwnDeclarations(createInvocation, context); addClassOwnDeclarations(createInvocation.getArguments(), context);
} }
private boolean isTrait() { private boolean isTrait() {
return descriptor.getKind().equals(ClassKind.TRAIT); return descriptor.getKind().equals(ClassKind.TRAIT);
} }
private void addClassOwnDeclarations(@NotNull JsInvocation jsClassDeclaration, @NotNull final TranslationContext declarationContext) { private void addClassOwnDeclarations(@NotNull List<JsExpression> invocationArguments, @NotNull TranslationContext declarationContext) {
final List<JsPropertyInitializer> properties = new SmartList<JsPropertyInitializer>(); final List<JsPropertyInitializer> properties = new SmartList<JsPropertyInitializer>();
final List<JsPropertyInitializer> staticProperties; final List<JsPropertyInitializer> staticProperties;
boolean isTopLevelDeclaration = context() == declarationContext; boolean isTopLevelDeclaration = context() == declarationContext;
final JsNameRef qualifiedReference;
if (!isTopLevelDeclaration) { if (!isTopLevelDeclaration) {
staticProperties = null; staticProperties = null;
qualifiedReference = null;
} }
else if (descriptor.getKind().isObject()) { else if (descriptor.getKind().isObject()) {
staticProperties = null; staticProperties = null;
declarationContext.literalFunctionTranslator() qualifiedReference = null;
.setDefinitionPlace(new NotNullLazyValue<Trinity<List<JsPropertyInitializer>, LabelGenerator, JsExpression>>() { declarationContext.literalFunctionTranslator().setDefinitionPlace(
new NotNullLazyValue<Trinity<List<JsPropertyInitializer>, LabelGenerator, JsExpression>>() {
@Override @Override
@NotNull @NotNull
public Trinity<List<JsPropertyInitializer>, LabelGenerator, JsExpression> compute() { public Trinity<List<JsPropertyInitializer>, LabelGenerator, JsExpression> compute() {
@@ -150,13 +153,14 @@ public final class ClassTranslator extends AbstractTranslator {
}); });
} }
else { else {
qualifiedReference = getQualifiedReference(declarationContext, descriptor);
staticProperties = new SmartList<JsPropertyInitializer>(); staticProperties = new SmartList<JsPropertyInitializer>();
declarationContext.literalFunctionTranslator() declarationContext.literalFunctionTranslator().setDefinitionPlace(
.setDefinitionPlace(new NotNullLazyValue<Trinity<List<JsPropertyInitializer>, LabelGenerator, JsExpression>>() { new NotNullLazyValue<Trinity<List<JsPropertyInitializer>, LabelGenerator, JsExpression>>() {
@Override @Override
@NotNull @NotNull
public Trinity<List<JsPropertyInitializer>, LabelGenerator, JsExpression> compute() { public Trinity<List<JsPropertyInitializer>, LabelGenerator, JsExpression> compute() {
return createPlace(staticProperties, getQualifiedReference(declarationContext, descriptor)); return createPlace(staticProperties, qualifiedReference);
} }
}); });
} }
@@ -164,7 +168,7 @@ public final class ClassTranslator extends AbstractTranslator {
if (!isTrait()) { if (!isTrait()) {
JsFunction initializer = new ClassInitializerTranslator(classDeclaration, declarationContext).generateInitializeMethod(); JsFunction initializer = new ClassInitializerTranslator(classDeclaration, declarationContext).generateInitializeMethod();
if (context().isEcma5()) { if (context().isEcma5()) {
jsClassDeclaration.getArguments().add(initializer.getBody().getStatements().isEmpty() ? JsLiteral.NULL : initializer); invocationArguments.add(initializer.getBody().getStatements().isEmpty() ? JsLiteral.NULL : initializer);
} }
else { else {
properties.add(new JsPropertyInitializer(Namer.initializeMethodReference(), initializer)); properties.add(new JsPropertyInitializer(Namer.initializeMethodReference(), initializer));
@@ -180,10 +184,20 @@ public final class ClassTranslator extends AbstractTranslator {
boolean hasStaticProperties = staticProperties != null && !staticProperties.isEmpty(); boolean hasStaticProperties = staticProperties != null && !staticProperties.isEmpty();
if (!properties.isEmpty() || hasStaticProperties) { if (!properties.isEmpty() || hasStaticProperties) {
jsClassDeclaration.getArguments().add(properties.isEmpty() ? JsLiteral.NULL : new JsObjectLiteral(properties, true)); if (properties.isEmpty()) {
invocationArguments.add(JsLiteral.NULL);
}
else {
if (qualifiedReference != null) {
// about "prototype" -- see http://code.google.com/p/jsdoc-toolkit/wiki/TagLends
invocationArguments.add(new JsDocComment("lends", new JsNameRef("prototype", qualifiedReference)));
}
invocationArguments.add(new JsObjectLiteral(properties, true));
}
} }
if (hasStaticProperties) { if (hasStaticProperties) {
jsClassDeclaration.getArguments().add(new JsObjectLiteral(staticProperties, true)); invocationArguments.add(new JsDocComment("lends", qualifiedReference));
invocationArguments.add(new JsObjectLiteral(staticProperties, true));
} }
} }