private void printImports(CompilationUnit node) { ImplementationImportCollector collector = new ImplementationImportCollector(); collector.collect(node, getSourceFileName()); Set<Import> imports = collector.getImports(); if (!imports.isEmpty()) { Set<String> includeStmts = Sets.newTreeSet(); for (Import imp : imports) { includeStmts.add(String.format("#include \"%s.h\"", imp.getImportFileName())); } for (String stmt : includeStmts) { println(stmt); } // Print native includes. int endOfImportText = node.types().isEmpty() ? node.getLength() : ((ASTNode) node.types().get(0)).getStartPosition(); for (Comment c : ASTUtil.getCommentList(node)) { int start = c.getStartPosition(); if (start >= endOfImportText) { break; } if (c instanceof BlockComment) { String nativeImport = extractNativeCode(start, c.getLength(), true); if (nativeImport != null) { // if it has a JSNI section println(nativeImport.trim()); } } } newline(); } }
/** Finds all block comments and associates them with their containing type. */ private void findBlockComments(CompilationUnit unit, List<AbstractTypeDeclaration> types) { List<Comment> comments = ASTUtil.getCommentList(unit); for (Comment comment : comments) { if (!comment.isBlockComment()) { continue; } int commentPos = comment.getStartPosition(); AbstractTypeDeclaration containingType = null; int containingTypePos = -1; for (AbstractTypeDeclaration type : types) { int typePos = type.getStartPosition(); if (typePos < 0) { continue; } int typeEnd = typePos + type.getLength(); if (commentPos > typePos && commentPos < typeEnd && typePos > containingTypePos) { containingType = type; containingTypePos = typePos; } } if (containingType != null) { blockComments.put(containingType, comment); } } }
private void printMethodsAndOcni( AbstractTypeDeclaration typeNode, Iterable<MethodDeclaration> methods, Iterable<Comment> comments) { Set<String> methodsPrinted = Sets.newHashSet(); Iterator<MethodDeclaration> methodsIter = methods.iterator(); Iterator<Comment> commentsIter = comments.iterator(); MethodDeclaration nextMethod = methodsIter.hasNext() ? methodsIter.next() : null; Comment nextComment = commentsIter.hasNext() ? commentsIter.next() : null; int minPos = 0; while (nextMethod != null || nextComment != null) { int methodStartPos = nextMethod != null ? nextMethod.getStartPosition() : Integer.MAX_VALUE; if (methodStartPos < 0) { methodStartPos = minPos; } int commentStartPos = nextComment != null ? nextComment.getStartPosition() : Integer.MAX_VALUE; if (methodStartPos < commentStartPos) { assert nextMethod != null; printMethod(nextMethod); minPos = methodStartPos + nextMethod.getLength(); nextMethod = methodsIter.hasNext() ? methodsIter.next() : null; } else { assert nextComment != null; if (commentStartPos > minPos) { String nativeCode = extractNativeCode(commentStartPos, nextComment.getLength()); if (nativeCode != null) { nativeCode = reindent(nativeCode.trim()); findMethodSignatures(nativeCode, methodsPrinted); print(nativeCode + "\n\n"); } } nextComment = commentsIter.hasNext() ? commentsIter.next() : null; } } // If the type implements Iterable and there's no existing implementation // for NSFastEnumeration's protocol method, then add the default // implementation. if (BindingUtil.findInterface(Types.getTypeBinding(typeNode), "java.lang.Iterable") != null && !methodsPrinted.contains("countByEnumeratingWithState:objects:count:")) { print( "- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state " + "objects:(__unsafe_unretained id *)stackbuf count:(NSUInteger)len {\n" + " return JreDefaultFastEnumeration(self, state, stackbuf, len);\n}\n\n"); } }
private void processComments(CompilationUnit cu) { System.out.println("Processing comments..."); for (Object o : cu.getCommentList()) { ((Comment) o).accept(new CommentVisitor()); } }