[cfe-commits] [PATCH] Interface proposal for clang formatting tools

Manuel Klimek klimek at google.com
Wed Jun 6 02:57:18 PDT 2012


Daniel & me have worked on a first proposal to provide an interface for
clang formatting as part of the Tooling library.

Questions:
- please point out anything that might make this interface not viable for
your own use cases
- are we missing the point somewhere?
- is Tooling/ the right place for this?

Thx!
/Manuel

diff --git a/include/clang/Tooling/Format.h
b/include/clang/Tooling/Format.h


new file mode 100644



index 0000000..8a64574



--- /dev/null



+++ b/include/clang/Tooling/Format.h



@@ -0,0 +1,106 @@



+//===--- Format.h - Format C++ code -----------------------------*- C++
-*-===//


+//



+//                     The LLVM Compiler Infrastructure



+//



+// This file is distributed under the University of Illinois Open Source



+// License. See LICENSE.TXT for details.



+//
+//===----------------------------------------------------------------------===//
+//
+//  Various functions to configurably format source code.
+//
+//  This supports two use cases:
+//  - Format (ranges in) a given file.
+//  - Reformat sources after automated refactoring.
+//
+//  Formatting is done on a per file basis.
+//
+//  The formatting strategy is:
+//  - lex the file content
+//  - in case formatting decisions need information of the AST analysis,
run
+//    the analysis and annotate all tokens that are relevant for formatting
+//    in the current file
+//  - reformat based on the (annotated) tokens
+//
+//  To allow different strategies of handling the SourceManager the
formatter
+//  works on an interface AnalyzableSource, which provides access to the
file
+//  contents and, if available, allow to lazily run an analysis over the
AST
+//  when needed.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_TOOLING_FORMAT_H_
+#define LLVM_CLANG_TOOLING_FORMAT_H
+
+#include "clang/Frontend/FrontendAction.h"
+#include "clang/Tooling/Refactoring.h"
+
+namespace clang {
+namespace tooling {
+
+/// \brief Provides access to a source file and (optionally) its AST.
+///
+/// Implementors can overwrite VisitAST to provide AST analysis
capabilities
+/// for sources that can be parsed.
+class AnalyzableSource {
+public:
+  virtual ~AnalyzableSource();
+
+  /// \brief Runs the given action on the source's AST.
+  ///
+  /// Returns whether parsing was successful.
+  /// If false, some parts of the AST might have been visited.
+  virtual bool visitAST(ASTFrontendAction *Action) { return false; }
+
+  /// Returns the file's content.
+  virtual MemoryBuffer *getContent() = 0;
+};
+
+/// \brief Creates an AnalyzableSource from a snippet of code.
+///
+/// Assumes that 'Code' contains a complete TU.
+AnalyzableSource *createAnalyzableSource(Twine Code);
+
+/// \brief Creates an AnalyzableSource from a file.
+///
+/// Does not support AST analysis.
+AnalyzableSource *createAnalyzableSource(StringRef File);
+
+
+/// \brief A character range of source code.
+struct CodeRange {
+  CodeRange(unsigned Offset, unsigned Length)
+    : Offset(Offset), Length(Length) {}
+
+  unsigned Offset;
+  unsigned Length;
+};
+
+/// \brief Set of formatting options.
+struct FormatOptions {
+  /// \brief Indent level of blocks.
+  unsigned BlockIndentation;
+
+  /// \brief Indent level of line continuations.
+  unsigned ContinuationIndentation;
+};
+
+/// \brief Creates a format according to the LLVM style guide.
+///
+/// See http://llvm.org/docs/CodingStandards.html.
+FormatOptions getLLVMFormat();
+
+/// \brief Creates a format according to the Google style guide.
+///
+/// See http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml.
+FormatOptions getGoogleFormat();
+
+/// \brief Reformats the given Ranges in the Source.
+Replacements reformat(const AnalyzableSource &Source,
+                      std:vector<CodeRange> Ranges,
+                      const FormatOptions &Options);
+
+} // end namespace tooling
+} // end namespace clang
+
+#endif // LLVM_CLANG_TOOLING_FORMAT_H
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20120606/78aaf840/attachment.html>


More information about the cfe-commits mailing list