blob: f434bcc0c7499b13de7005e43ca1f9411b4d8955 [file] [log] [blame]
Ted Kremenekfdbe6792008-04-16 04:38:45 +00001//===--- HTMLPrint.cpp - Source code -> HTML pretty-printing --------------===//
Ted Kremenek5e0020e2008-03-18 22:21:07 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenekfdbe6792008-04-16 04:38:45 +000010// Pretty-printing of source code to HTML.
Ted Kremenek5e0020e2008-03-18 22:21:07 +000011//
12//===----------------------------------------------------------------------===//
13
Eli Friedman39d7c4d2009-05-18 22:50:54 +000014#include "clang/Frontend/ASTConsumers.h"
Ted Kremenek5e0020e2008-03-18 22:21:07 +000015#include "clang/AST/ASTConsumer.h"
Daniel Dunbare91593e2008-08-11 04:54:23 +000016#include "clang/AST/Decl.h"
Ted Kremenek5e0020e2008-03-18 22:21:07 +000017#include "clang/Rewrite/Rewriter.h"
18#include "clang/Rewrite/HTMLRewrite.h"
Chris Lattner8ac661c2008-04-16 05:21:09 +000019#include "clang/Basic/Diagnostic.h"
Ted Kremenek5e0020e2008-03-18 22:21:07 +000020#include "clang/Basic/SourceManager.h"
Ted Kremenekf6f593f2008-07-07 18:31:05 +000021#include "clang/Basic/FileManager.h"
Ted Kremenek5e0020e2008-03-18 22:21:07 +000022#include "clang/AST/ASTContext.h"
Eli Friedman24200912009-05-19 05:28:52 +000023#include "llvm/Support/MemoryBuffer.h"
Chris Lattner0fa0daa2009-08-24 04:11:30 +000024#include "llvm/Support/raw_ostream.h"
Ted Kremenek5e0020e2008-03-18 22:21:07 +000025using namespace clang;
26
Ted Kremenek13e479b2008-03-19 07:53:42 +000027//===----------------------------------------------------------------------===//
28// Functional HTML pretty-printing.
29//===----------------------------------------------------------------------===//
30
Ted Kremenek5e0020e2008-03-18 22:21:07 +000031namespace {
32 class HTMLPrinter : public ASTConsumer {
33 Rewriter R;
Eli Friedman66d6f042009-05-18 22:20:00 +000034 llvm::raw_ostream *Out;
Chris Lattner8ac661c2008-04-16 05:21:09 +000035 Diagnostic &Diags;
Chris Lattner3245a0a2008-04-16 06:11:58 +000036 Preprocessor *PP;
Ted Kremenek339b9c22008-04-17 22:31:54 +000037 PreprocessorFactory *PPF;
Ted Kremenek5e0020e2008-03-18 22:21:07 +000038 public:
Eli Friedman66d6f042009-05-18 22:20:00 +000039 HTMLPrinter(llvm::raw_ostream *OS, Diagnostic &D, Preprocessor *pp,
Ted Kremenek339b9c22008-04-17 22:31:54 +000040 PreprocessorFactory* ppf)
Eli Friedman66d6f042009-05-18 22:20:00 +000041 : Out(OS), Diags(D), PP(pp), PPF(ppf) {}
Ted Kremenek5e0020e2008-03-18 22:21:07 +000042 virtual ~HTMLPrinter();
43
44 void Initialize(ASTContext &context);
45 };
46}
47
Eli Friedman66d6f042009-05-18 22:20:00 +000048ASTConsumer* clang::CreateHTMLPrinter(llvm::raw_ostream *OS,
Ted Kremenek339b9c22008-04-17 22:31:54 +000049 Diagnostic &D, Preprocessor *PP,
50 PreprocessorFactory* PPF) {
51
Eli Friedman66d6f042009-05-18 22:20:00 +000052 return new HTMLPrinter(OS, D, PP, PPF);
Chris Lattner8ac661c2008-04-16 05:21:09 +000053}
Ted Kremenek5e0020e2008-03-18 22:21:07 +000054
55void HTMLPrinter::Initialize(ASTContext &context) {
Chris Lattner2c78b872009-04-14 23:22:57 +000056 R.setSourceMgr(context.getSourceManager(), context.getLangOptions());
Ted Kremenek5e0020e2008-03-18 22:21:07 +000057}
58
59HTMLPrinter::~HTMLPrinter() {
Chris Lattner8ac661c2008-04-16 05:21:09 +000060 if (Diags.hasErrorOccurred())
61 return;
62
63 // Format the file.
Chris Lattner2b2453a2009-01-17 06:22:33 +000064 FileID FID = R.getSourceMgr().getMainFileID();
65 const FileEntry* Entry = R.getSourceMgr().getFileEntryForID(FID);
Eli Friedman24200912009-05-19 05:28:52 +000066 const char* Name;
67 // In some cases, in particular the case where the input is from stdin,
68 // there is no entry. Fall back to the memory buffer for a name in those
69 // cases.
70 if (Entry)
71 Name = Entry->getName();
72 else
73 Name = R.getSourceMgr().getBuffer(FID)->getBufferIdentifier();
74
Chris Lattner2b2453a2009-01-17 06:22:33 +000075 html::AddLineNumbers(R, FID);
Eli Friedman24200912009-05-19 05:28:52 +000076 html::AddHeaderFooterInternalBuiltinCSS(R, FID, Name);
Chris Lattner8ac661c2008-04-16 05:21:09 +000077
Ted Kremenek47abe762008-04-16 16:39:56 +000078 // If we have a preprocessor, relex the file and syntax highlight.
79 // We might not have a preprocessor if we come from a deserialized AST file,
80 // for example.
81
Chris Lattner2b2453a2009-01-17 06:22:33 +000082 if (PP) html::SyntaxHighlight(R, FID, *PP);
83 if (PPF) html::HighlightMacros(R, FID, *PP);
84 html::EscapeText(R, FID, false, true);
Eli Friedman66d6f042009-05-18 22:20:00 +000085
Ted Kremenek5e0020e2008-03-18 22:21:07 +000086 // Emit the HTML.
Chris Lattner2b2453a2009-01-17 06:22:33 +000087 const RewriteBuffer &RewriteBuf = R.getEditBuffer(FID);
Chris Lattner8ac661c2008-04-16 05:21:09 +000088 char *Buffer = (char*)malloc(RewriteBuf.size());
89 std::copy(RewriteBuf.begin(), RewriteBuf.end(), Buffer);
Eli Friedman66d6f042009-05-18 22:20:00 +000090 Out->write(Buffer, RewriteBuf.size());
Chris Lattner8ac661c2008-04-16 05:21:09 +000091 free(Buffer);
Ted Kremenek5e0020e2008-03-18 22:21:07 +000092}