Skip to content

Commit

Permalink
Refactor how BodyDeclarations are printed.
Browse files Browse the repository at this point in the history
Distinguishes between printing declarations and definitions since both header and implementation could be printing declaratrions.
Distinguishes between "inner" and "outer" declarations based on whether the declaration should occur within the Objective-C type.
	Change on 2015/03/10 by kstanger <kstanger@google.com>
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=88270966
  • Loading branch information
kstanger committed Mar 18, 2015
1 parent 0bab71a commit f270bfd
Show file tree
Hide file tree
Showing 3 changed files with 135 additions and 133 deletions.
Expand Up @@ -141,15 +141,15 @@ public void generate(TypeDeclaration node) {
printInstanceVariables(node, false); printInstanceVariables(node, false);
println("}"); println("}");
} }
printDeclarations(node.getBodyDeclarations()); printInnerDeclarations(node);
println("\n@end"); println("\n@end");


if (isInterface) { if (isInterface) {
printStaticInterface(node); printStaticInterface(node);
} else { } else {
printStaticInitFunction(node); printStaticInitFunction(node);
printFieldSetters(node, false); printFieldSetters(node, false);
printFunctions(node.getBodyDeclarations()); printOuterDeclarations(node);
printStaticFields(node); printStaticFields(node);
} }


Expand Down Expand Up @@ -310,10 +310,10 @@ protected void generate(EnumDeclaration node) {
println(" > {"); println(" > {");
printInstanceVariables(node, false); printInstanceVariables(node, false);
println("}"); println("}");
printDeclarations(node.getBodyDeclarations()); printInnerDeclarations(node);
println("\n@end"); println("\n@end");
printStaticInitFunction(node); printStaticInitFunction(node);
printFunctions(node.getBodyDeclarations()); printOuterDeclarations(node);
printf("\nFOUNDATION_EXPORT %s *%s_values_[];\n", typeName, typeName); printf("\nFOUNDATION_EXPORT %s *%s_values_[];\n", typeName, typeName);
for (EnumConstantDeclaration constant : constants) { for (EnumConstantDeclaration constant : constants) {
String varName = NameTable.getStaticVarName(constant.getVariableBinding()); String varName = NameTable.getStaticVarName(constant.getVariableBinding());
Expand Down Expand Up @@ -375,33 +375,8 @@ protected void printStaticField(IVariableBinding var) {
} }


@Override @Override
protected void printFunction(FunctionDeclaration function) { protected void printFunctionDeclaration(FunctionDeclaration function) {
if (!Modifier.isPrivate(function.getModifiers())) { println("\nFOUNDATION_EXPORT " + getFunctionSignature(function) + ';');
println("\nFOUNDATION_EXPORT " + getFunctionSignature(function) + ';');
}
}

@Override
protected void printNativeDeclaration(NativeDeclaration declaration) {
newline();
String code = declaration.getHeaderCode();
if (code != null) {
print(declaration.getHeaderCode());
}
}

@Override
protected void printNormalMethod(MethodDeclaration m) {
if (!Modifier.isNative(m.getModifiers())) {
printNormalMethodDeclaration(m);
}
}

@Override
protected void printConstructor(MethodDeclaration m) {
newline();
printDocComment(m.getJavadoc());
println(super.methodDeclaration(m) + ";");
} }


static enum SortState { BEFORE_DECLS, METHODS, AFTER_DECLS }; static enum SortState { BEFORE_DECLS, METHODS, AFTER_DECLS };
Expand All @@ -414,7 +389,10 @@ static enum SortState { BEFORE_DECLS, METHODS, AFTER_DECLS };
* after the method list, however. * after the method list, however.
*/ */
@Override @Override
protected void printDeclarations(Iterable<BodyDeclaration> iter) { protected void printInnerDeclarations(AbstractTypeDeclaration node) {
Iterable<BodyDeclaration> iter = Iterables.filter(Iterables.filter(
node.getBodyDeclarations(), isInnerFilter()), printDeclFilter());

List<BodyDeclaration> allDeclarations = Lists.newArrayList(iter); List<BodyDeclaration> allDeclarations = Lists.newArrayList(iter);
List<BodyDeclaration> beforeDeclarations = Lists.newArrayList(); List<BodyDeclaration> beforeDeclarations = Lists.newArrayList();
List<MethodDeclaration> allMethods = Lists.newArrayList(); List<MethodDeclaration> allMethods = Lists.newArrayList();
Expand Down Expand Up @@ -442,10 +420,7 @@ protected void printDeclarations(Iterable<BodyDeclaration> iter) {
return; return;
} }
if (decl instanceof MethodDeclaration) { if (decl instanceof MethodDeclaration) {
MethodDeclaration m = (MethodDeclaration) decl; allMethods.add((MethodDeclaration) decl);
if (shouldPrint(m)) {
allMethods.add(m);
}
} }
} }
} }
Expand All @@ -472,19 +447,15 @@ private void printSortedMethods(List<MethodDeclaration> allMethods, String title
printf("\n#pragma mark %s\n", title); printf("\n#pragma mark %s\n", title);
TreeUtil.sortMethods(methods); TreeUtil.sortMethods(methods);
for (MethodDeclaration m : methods) { for (MethodDeclaration m : methods) {
printMethod(m); printMethodDeclaration(m);
} }
} }


@Override protected boolean shouldPrintDeclaration(BodyDeclaration decl) {
protected void printMethod(MethodDeclaration m) { if (decl instanceof FunctionDeclaration) {
if (shouldPrint(m)) { return !Modifier.isPrivate(decl.getModifiers());
super.printMethod(m);
} }
} return !Options.hidePrivateMembers() || !isPrivateOrSynthetic(decl.getModifiers());

private boolean shouldPrint(MethodDeclaration m) {
return !Options.hidePrivateMembers() || !isPrivateOrSynthetic(m.getModifiers());
} }


protected void printForwardDeclarations(Set<Import> forwardDecls) { protected void printForwardDeclarations(Set<Import> forwardDecls) {
Expand Down
Expand Up @@ -25,6 +25,7 @@
import com.google.devtools.j2objc.ast.Annotation; import com.google.devtools.j2objc.ast.Annotation;
import com.google.devtools.j2objc.ast.AnnotationTypeDeclaration; import com.google.devtools.j2objc.ast.AnnotationTypeDeclaration;
import com.google.devtools.j2objc.ast.AnnotationTypeMemberDeclaration; import com.google.devtools.j2objc.ast.AnnotationTypeMemberDeclaration;
import com.google.devtools.j2objc.ast.BodyDeclaration;
import com.google.devtools.j2objc.ast.CompilationUnit; import com.google.devtools.j2objc.ast.CompilationUnit;
import com.google.devtools.j2objc.ast.EnumConstantDeclaration; import com.google.devtools.j2objc.ast.EnumConstantDeclaration;
import com.google.devtools.j2objc.ast.EnumDeclaration; import com.google.devtools.j2objc.ast.EnumDeclaration;
Expand Down Expand Up @@ -157,7 +158,8 @@ public void generate(TypeDeclaration node) {
syncLineNumbers(node.getName()); // avoid doc-comment syncLineNumbers(node.getName()); // avoid doc-comment
printf("@implementation %s\n", typeName); printf("@implementation %s\n", typeName);
printStaticVars(node); printStaticVars(node);
printMethods(node); printInnerDefinitions(node);
printInitializeMethod(node);
if (TranslationUtil.needsReflection(node)) { if (TranslationUtil.needsReflection(node)) {
printTypeAnnotationsMethod(node); printTypeAnnotationsMethod(node);
printMethodAnnotationMethods(TreeUtil.getMethodDeclarations(node)); printMethodAnnotationMethods(TreeUtil.getMethodDeclarations(node));
Expand All @@ -166,7 +168,7 @@ public void generate(TypeDeclaration node) {
} }


println("\n@end"); println("\n@end");
printFunctions(node.getBodyDeclarations()); printOuterDefinitions(node);
} }
} }


Expand Down Expand Up @@ -265,20 +267,14 @@ private void generate(PackageDeclaration node) {
} }
} }


@Override private void printNativeDefinition(NativeDeclaration declaration) {
protected void printNativeDeclaration(NativeDeclaration declaration) {
newline(); newline();
String code = declaration.getImplementationCode(); String code = declaration.getImplementationCode();
if (code != null) { if (code != null) {
println(reindent(code)); println(reindent(code));
} }
} }


private void printMethods(TypeDeclaration node) {
printDeclarations(node.getBodyDeclarations());
printInitializeMethod(node);
}

private void printStaticInterface(AbstractTypeDeclaration node, String typeName) { private void printStaticInterface(AbstractTypeDeclaration node, String typeName) {
boolean needsReflection = TranslationUtil.needsReflection(node); boolean needsReflection = TranslationUtil.needsReflection(node);
boolean needsImplementation = hasInitializeMethod(node) || needsReflection; boolean needsImplementation = hasInitializeMethod(node) || needsReflection;
Expand All @@ -296,7 +292,7 @@ private void printStaticInterface(AbstractTypeDeclaration node, String typeName)
printMetadata(node); printMetadata(node);
} }
println("\n@end"); println("\n@end");
printFunctions(node.getBodyDeclarations()); printOuterDefinitions(node);
} }


@Override @Override
Expand All @@ -313,15 +309,15 @@ protected void generate(EnumDeclaration node) {
printf("@implementation %s\n", typeName); printf("@implementation %s\n", typeName);
printStaticVars(node); printStaticVars(node);


printDeclarations(node.getBodyDeclarations()); printInnerDefinitions(node);
printInitializeMethod(node); printInitializeMethod(node);


if (TranslationUtil.needsReflection(node)) { if (TranslationUtil.needsReflection(node)) {
printTypeAnnotationsMethod(node); printTypeAnnotationsMethod(node);
printMetadata(node); printMetadata(node);
} }
println("\n@end"); println("\n@end");
printFunctions(node.getBodyDeclarations()); printOuterDefinitions(node);
} }


private void printInitFlagDefinition(AbstractTypeDeclaration node) { private void printInitFlagDefinition(AbstractTypeDeclaration node) {
Expand All @@ -332,30 +328,43 @@ private void printInitFlagDefinition(AbstractTypeDeclaration node) {
} }
} }


@Override private void printInnerDefinitions(AbstractTypeDeclaration node) {
protected void printNormalMethod(MethodDeclaration m) { printDefinitions(Iterables.filter(node.getBodyDeclarations(), isInnerFilter()));
String methodBody = generateMethodBody(m); }
if (methodBody != null) {
newline(); private void printOuterDefinitions(AbstractTypeDeclaration node) {
syncLineNumbers(m.getName()); // avoid doc-comment printDefinitions(Iterables.filter(node.getBodyDeclarations(), isOuterFilter()));
print(super.methodDeclaration(m) + " " + reindent(methodBody) + "\n"); }

private void printDefinitions(Iterable<BodyDeclaration> declarations) {
for (BodyDeclaration declaration : declarations) {
printDefinition(declaration);
} }
} }


private String generateMethodBody(MethodDeclaration m) { private void printDefinition(BodyDeclaration declaration) {
if (Modifier.isAbstract(m.getModifiers())) { switch (declaration.getKind()) {
return null; case FUNCTION_DECLARATION:
} else { printFunctionDefinition((FunctionDeclaration) declaration);
// generate a normal method body return;
return generateStatement(m.getBody(), /* isFunction */ false); case METHOD_DECLARATION:
printMethodDefinition((MethodDeclaration) declaration);
return;
case NATIVE_DECLARATION:
printNativeDefinition((NativeDeclaration) declaration);
return;
default:
break;
} }
} }


@Override private void printMethodDefinition(MethodDeclaration m) {
protected void printConstructor(MethodDeclaration m) { if (Modifier.isAbstract(m.getModifiers())) {
String methodBody = generateStatement(m.getBody(), /* isFunction */ false); return;
}
newline(); newline();
syncLineNumbers(m.getName()); // avoid doc-comment syncLineNumbers(m.getName()); // avoid doc-comment
String methodBody = generateStatement(m.getBody(), /* isFunction */ false);
print(super.methodDeclaration(m) + " " + reindent(methodBody) + "\n"); print(super.methodDeclaration(m) + " " + reindent(methodBody) + "\n");
} }


Expand Down Expand Up @@ -398,7 +407,7 @@ private void printImports(CompilationUnit node) {
} }


for (NativeDeclaration decl : node.getNativeBlocks()) { for (NativeDeclaration decl : node.getNativeBlocks()) {
printNativeDeclaration(decl); printNativeDefinition(decl);
} }
} }


Expand All @@ -421,29 +430,22 @@ private void printStaticVars(AbstractTypeDeclaration node) {
} }


private void printFinalFunctionDecls(List<AbstractTypeDeclaration> types) { private void printFinalFunctionDecls(List<AbstractTypeDeclaration> types) {
boolean needsNewLine = true;
for (AbstractTypeDeclaration type : types) { for (AbstractTypeDeclaration type : types) {
for (FunctionDeclaration function : TreeUtil.getFunctionDeclarations(type)) { printOuterDeclarations(type);
int modifiers = function.getModifiers();
if (!Modifier.isPrivate(modifiers)) {
// Declaration is defined in header file.
continue;
}
if (needsNewLine) {
newline();
needsNewLine = false;
}
// We expect native functions to be defined externally.
if (!Modifier.isNative(modifiers)) {
print("__attribute__((unused)) static ");
}
println(getFunctionSignature(function) + ";");
}
} }
} }


@Override @Override
protected void printFunction(FunctionDeclaration function) { protected void printFunctionDeclaration(FunctionDeclaration function) {
newline();
// We expect native functions to be defined externally.
if (!Modifier.isNative(function.getModifiers())) {
print("__attribute__((unused)) static ");
}
println(getFunctionSignature(function) + ";");
}

private void printFunctionDefinition(FunctionDeclaration function) {
if (Modifier.isNative(function.getModifiers())) { if (Modifier.isNative(function.getModifiers())) {
return; return;
} }
Expand Down Expand Up @@ -644,12 +646,21 @@ private void printClassExtensions(List<AbstractTypeDeclaration> types) {
} }
} }


protected boolean shouldPrintDeclaration(BodyDeclaration decl) {
if (decl instanceof FunctionDeclaration) {
return Modifier.isPrivate(decl.getModifiers());
}
// TODO(kstanger): exclude synthetic.
return Options.hidePrivateMembers() && isPrivateOrSynthetic(decl.getModifiers());
}

private void printClassExtension(AbstractTypeDeclaration node) { private void printClassExtension(AbstractTypeDeclaration node) {
if (Options.hidePrivateMembers()) { if (Options.hidePrivateMembers()) {
List<FieldDeclaration> fields = TreeUtil.getFieldDeclarationsList(node); List<FieldDeclaration> fields = TreeUtil.getFieldDeclarationsList(node);
boolean hasPrivateFields = hasPrivateFields(fields); boolean hasPrivateFields = hasPrivateFields(fields);
List<MethodDeclaration> privateMethods = getPrivateMethodsToDeclare(node); Iterable<BodyDeclaration> privateDecls = Iterables.filter(Iterables.filter(
if (!privateMethods.isEmpty() || hasPrivateFields) { node.getBodyDeclarations(), isInnerFilter()), printDeclFilter());
if (!Iterables.isEmpty(privateDecls) || hasPrivateFields) {
String typeName = NameTable.getFullName(node.getTypeBinding()); String typeName = NameTable.getFullName(node.getTypeBinding());
newline(); newline();
printf("@interface %s ()", typeName); printf("@interface %s ()", typeName);
Expand All @@ -660,15 +671,7 @@ private void printClassExtension(AbstractTypeDeclaration node) {
} else { } else {
newline(); newline();
} }
for (MethodDeclaration m : privateMethods) { printDeclarations(privateDecls);
if (isPrivateOrSynthetic(m.getModifiers())) {
if (m.isConstructor()) {
println(methodDeclaration(m) + ";");
} else {
printNormalMethodDeclaration(m);
}
}
}
println("@end"); println("@end");
printFieldSetters(node, true); printFieldSetters(node, true);
} }
Expand Down

0 comments on commit f270bfd

Please sign in to comment.