<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head>
    <meta name="copyright" content=
    "Copyright (c) IBM Corporation and others 2000, 2017. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." />
    <meta http-equiv="Content-Type" content=
    "text/html; charset=utf-8" />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <link rel="STYLESHEET" href="../book.css" charset="ISO-8859-1"
    type="text/css" />
    <title>
      Using the code formatter
    </title>
    <link rel="stylesheet" type="text/css" href="../book.css" />

  </head>
  <body>
    <h2>
      Using the code formatter
    </h2>
    <p>
      The JDT API allows other plug-ins to use the default
      <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html">
      code formatter</a></b> to format source code. The two methods
      to consider are:
    </p>

    <ul>
      <li>
        <b><a href=
        "../reference/api/org/eclipse/jdt/core/ToolFactory.html#createCodeFormatter(java.util.Map)">
        ToolFactory.createCodeFormatter(Map)</a></b>
      </li>
      <li>
        <b><a href=
        "../reference/api/org/eclipse/jdt/core/ToolFactory.html#createCodeFormatter(java.util.Map,%20int)">
        ToolFactory.createCodeFormatter(Map, int)</a></b>

      </li>
    </ul>
    <p>
      Note: The <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html">
      CodeFormatter</a></b> class is not intended to be subclassed
      by clients.
    </p>
    <h3>
      Getting a code formatter instance
    </h3>

    <p>
      The factory methods on <b><a href=
      "../reference/api/org/eclipse/jdt/core/ToolFactory.html">ToolFactory</a></b>
      can be invoked to create a new instance of the default code
      formatter. Before invoking one of those, you need to define a
      map that contains the code formatter options. In order to
      create such a map, you can use the methods defined in the
      class <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.html">
      DefaultCodeFormatterConstants</a></b> like <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.html#getEclipseDefaultSettings()">
      DefaultCodeFormatterConstants.getEclipseDefaultSettings()</a></b>

    </p>
    <p>
      NOTE: These predefined maps contain only the code formatter
      specific options. In order to invoke the code formatter, you
      also need to specify what kind of source the code formatter
      will format. In order to do so, specify the three options:
    </p>
    <ul>
      <li>
        <b><a href=
        "../reference/api/org/eclipse/jdt/core/JavaCore.html#COMPILER_CODEGEN_TARGET_PLATFORM">
        JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM</a></b>
      </li>

      <li>
        <b><a href=
        "../reference/api/org/eclipse/jdt/core/JavaCore.html#COMPILER_SOURCE">
        JavaCore.COMPILER_SOURCE</a></b>
      </li>
      <li>
        <b><a href=
        "../reference/api/org/eclipse/jdt/core/JavaCore.html#COMPILER_COMPLIANCE">
        JavaCore.COMPILER_COMPLIANCE</a></b>
      </li>

    </ul>
    <p>
      The possible values of these options are given by the
      constants:
    </p>
    <ul>
      <li>
        <b><a href=
        "../reference/api/org/eclipse/jdt/core/JavaCore.html#VERSION_1_1">
        JavaCore.VERSION_1_1</a></b>
      </li>

      <li>
        <b><a href=
        "../reference/api/org/eclipse/jdt/core/JavaCore.html#VERSION_1_2">
        JavaCore.VERSION_1_2</a></b>
      </li>
      <li>
        <b><a href=
        "../reference/api/org/eclipse/jdt/core/JavaCore.html#VERSION_1_3">
        JavaCore.VERSION_1_3</a></b>
      </li>

      <li>
        <b><a href=
        "../reference/api/org/eclipse/jdt/core/JavaCore.html#VERSION_1_4">
        JavaCore.VERSION_1_4</a></b>
      </li>
      <li>
        <b><a href=
        "../reference/api/org/eclipse/jdt/core/JavaCore.html#VERSION_1_5">
        JavaCore.VERSION_1_5</a></b>
      </li>

      <li>
        <b><a href=
        "../reference/api/org/eclipse/jdt/core/JavaCore.html#VERSION_1_6">
        JavaCore.VERSION_1_6</a></b>
      </li>
      <li>
        <b><a href=
        "../reference/api/org/eclipse/jdt/core/JavaCore.html#VERSION_1_7">
        JavaCore.VERSION_1_7</a></b>
      </li>
	 <li>
        <b><a href=
        "../reference/api/org/eclipse/jdt/core/JavaCore.html#VERSION_1_8">
        JavaCore.VERSION_1_8</a></b>
      </li>
	 <li>
        <b><a href=
        "../reference/api/org/eclipse/jdt/core/JavaCore.html#VERSION_1_8">
        JavaCore.VERSION_9</a></b>
      </li>
    </ul>
    <p>
      If you want to modify the default maps, it is recommended
      that you use the methods defined on <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.html">
      DefaultCodeFormatterConstants</a></b> to create the values of
      the corresponding options. This is especially true for the
      options relative to code wrapping.
    </p>
    <h3>
      Invoking the code formatter
    </h3>

    <p>
      Use the newly created code formatter to format code snippets.
      The default code formatter allows you to format different
      kind of code snippets.<br />
      These kinds are specified in the documentation of the
      <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html#format(int,%20java.lang.String,%20int,%20int,%20int,%20java.lang.String)">
      format</a></b> method. The returned value of this method is a
      text edit. This text edit then needs to be applied to an
      <b><a href=
      "../../org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/text/IDocument.html">
      IDocument</a></b> instance in order to get the formatted
      result.
    </p>

    <h4>
      Example
    </h4>
    <pre class="color1">
	// take default Eclipse formatting options
	Map options = DefaultCodeFormatterConstants.getEclipseDefaultSettings();

	// initialize the compiler settings to be able to format 1.5 code
	options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_5);
	options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_5);
	options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_5);

	// change the option to wrap each enum constant on a new line
	options.put(
		DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ENUM_CONSTANTS,
		DefaultCodeFormatterConstants.createAlignmentValue(
		true,
		DefaultCodeFormatterConstants.WRAP_ONE_PER_LINE,
		DefaultCodeFormatterConstants.INDENT_ON_COLUMN));

	// instantiate the default code formatter with the given options
	final CodeFormatter codeFormatter = ToolFactory.createCodeFormatter(options);

	// retrieve the source to format
	String source = null;
	try {
		source = ...; // retrieve the source 
	} catch (IOException e) {
		System.err.println("Could not retrieve the source"); //$NON-NLS-1$
		e.printStackTrace();
		return;
	}
	final TextEdit edit = codeFormatter.format(
		CodeFormatter.K_COMPILATION_UNIT, // format a compilation unit
		source, // source to format
		0, // starting position
		source.length(), // length
		0, // initial indentation
		System.getProperty("line.separator") // line separator
	);

	IDocument document = new Document(source);
	try {
		edit.apply(document);
	} catch (MalformedTreeException e) {
		e.printStackTrace();
	} catch (BadLocationException e) {
		e.printStackTrace();
	}

	// display the formatted string on the System out
	System.out.println(document.get());
</pre>
    <p>
      On this example,
    </p>
    <pre class="color1">
public enum X { A,B,C,D,E,F}
</pre>
    <p>
      the result would be:
    </p>
    <pre class="color1">
public enum X {
	A,
	B,
	C,
	D,
	E,
	F
}
</pre>
    <h3>
      Formatting a set of regions
    </h3>
    <p>

      The default <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html">
      code formatter</a></b> allows to format a set of regions of a
      given source file.<br />
      This can be achieved by calling the <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html#format(int,%20java.lang.String,%20org.eclipse.jface.text.IRegion[],%20int,%20java.lang.String)">
      format(int, String, IRegion[], int, String)</a></b> method of
      the code formatter, with a given <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html#K_UNKNOWN">
      source kind</a></b> and an array of <b><a href=
      "../../org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/text/IRegion.html">

      regions</a></b>.
    </p>
    <ul>
      <li>Each of the region to format must be within source range
      and should not overlap with another region.
      </li>
      <li>The array of regions to format must contain at least one
      region. Regions should be sorted by their offsets, smaller
      offset first.
      </li>
    </ul>
    <h3>
      Comment Formatter API
    </h3>

    <p>
      The default <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html">
      code formatter</a></b> API offers the possibility to format
      comments during the processing of the code snippet.<br />
      This can be achieved by combining the appropriate flag
      <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html#F_INCLUDE_COMMENTS">
      F_INCLUDE_COMMENTS</a></b> with <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html#K_COMPILATION_UNIT">

      K_COMPILATION_UNIT</a></b> and <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html#K_UNKNOWN">
      K_UNKNOWN</a></b> flags.<br />
      <br />
      This flag is effective only if the corresponding formatting
      option was enabled when calling <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html#format(int,%20java.lang.String,%20int,%20int,%20int,%20java.lang.String)">
      format(int, String, int, int, int, String)</a></b> or
      <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html#format(int,%20java.lang.String,%20org.eclipse.jface.text.IRegion[],%20int,%20java.lang.String)">

      format(int, String, IRegion[], int, String)</a></b> methods:
    </p>
    <ul>
      <li>
        <b><a href=
        "../reference/api/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.html#FORMATTER_COMMENT_FORMAT_JAVADOC_COMMENT">
        FORMATTER_COMMENT_FORMAT_JAVADOC_COMMENT</a></b> which
        controls the formatting of javadoc comments
      </li>
      <li>

        <b><a href=
        "../reference/api/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.html#FORMATTER_COMMENT_FORMAT_BLOCK_COMMENT">
        FORMATTER_COMMENT_FORMAT_BLOCK_COMMENT</a></b> which
        controls the formatting of multiple lines comments
      </li>
      <li>
        <b><a href=
        "../reference/api/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.html#FORMATTER_COMMENT_FORMAT_LINE_COMMENT">
        FORMATTER_COMMENT_FORMAT_LINE_COMMENT</a></b> which
        controls the formatting of single line comments
      </li>
    </ul>

    <h3>
      Comment formatter options
    </h3>
    <p>
      Various formatting options are available in order to format
      comments:
    </p>
    <ul>
      <li>General options to enable or disable the formatting of
      specific comments (javadoc, multi or single line comments),
      set maximum line width for comments.
      </li>
      <li>javadoc comments options to enable the formatting of code
      snippets or HTML sections inside javadoc comments, indent tag
      descriptions, etc.
      </li>

      <li>block comments option to keep or remove blanks lines
      within such comment
      </li>
    </ul>
    <p>
      For detailed information about these settings, refer to the
      <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.html">
      DefaultCodeFormatterConstants</a></b>
    </p>
    <h3>

      Formatting comments with the stand-alone formatter
    </h3>
    <p>
      The default <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html">
      code formatter</a></b> can be used to format comments
      (javadoc, multi or single line). In this case, the source
      passed to the <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html#format(int,%20java.lang.String,%20int,%20int,%20int,%20java.lang.String)">
      format method</a></b> should only contain a specific kind of
      comments, and corresponding kind <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html#K_JAVA_DOC">

      K_JAVA_DOC</a></b>, <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html#K_MULTI_LINE_COMMENT">
      K_MULTI_LINE_COMMENT</a></b> or <b><a href=
      "../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html#K_SINGLE_LINE_COMMENT">
      K_SINGLE_LINE_COMMENT</a></b> should be used.
    </p>
    <ul>
      <li>

        <h4>
          Formatting javadoc comments
        </h4>
        <p>
          The following unformatted javadoc:
        </p>
        <pre class="color1">
  /**
 * This is just a simple example to show how javadoc comments can     be formatted .
 * @param str The input string
   * @return      The resulting   string
   */
</pre>
        <p>

          should be formatted as follows:
        </p>
        <pre class="color1">
/**
 * This is just a simple example to show how javadoc comments can be formatted .
 * 
 * @param str
 *            The input string
 * @return The resulting string
 */
</pre>
        <p>
          using command:
        </p>
<pre class="color1">
	(...)
	final TextEdit edit = codeFormatter.format(
		<b><a href="../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html#K_JAVA_DOC">CodeFormatter.K_JAVA_DOC</a></b>, // specify the kind: javadoc
		source, // source to format (as per the above example)
		0, // starting position
		source.length(), // length
		0, // initial indentation
		System.getProperty("line.separator") // line separator
	);
	(...)

</pre>
      </li>
      <li>
        <h4>
          Formatting multi-line comments
        </h4>
        <p>
          The following unformatted multi-line comment:
        </p>
        <pre class="color1">

/*
  * This is just an example of multi- line comment intended to demonstrate the default code formatter ability to format multi-line comments .
  * 
  *   These possibilities include: Formatting of javadoc     comments, 
  *     formatting of multi-line comments
 */
</pre>
        <p>
          should be formatted as follows:
        </p>
        <pre class="color1">
/*
 * This is just an example of multi- line comment intended to demonstrate
 * the default code formatter ability to format multi-line comments .
 * 
 * These possibilities include: Formatting of javadoc comments, formatting
 * of multi-line comments
 */
</pre>
        <p>
          using command:
        </p>
        <pre class="color1">
	(...)
	final TextEdit edit = codeFormatter.format(
		<b><a href="../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html#K_MULTI_LINE_COMMENT">CodeFormatter.K_MULTI_LINE_COMMENT</a></b>, // specify the kind: multi-line comments
		source, // source to format (as per the above example)
		0, // starting position
		source.length(), // length
		0, // initial indentation
		System.getProperty("line.separator") // line separator
	);
	(...)
</pre>
      </li>
      <li>
        <h4>
          Formatting single line comments
        </h4>
        <p>
          The following unformatted single line comments:
        </p>

        <pre class="color1">
// This is a long comment that should be split in multiple line comments in case the line comment formatting is enabled
</pre>
        <p>
          should be formatted as follows:
        </p>
        <pre class="color1">
// This is a long comment that should be split in multiple line comments in
// case the line comment formatting is enabled
</pre>
        <p>
          using command:
        </p>

        <pre class="color1">
	(...)
	final TextEdit edit = codeFormatter.format(
		<b><a href="../reference/api/org/eclipse/jdt/core/formatter/CodeFormatter.html#K_SINGLE_LINE_COMMENT">CodeFormatter.K_SINGLE_LINE_COMMENT</a></b>,  // specify the kind: single-line comments
		source, // source to format (as per the above example)
		0, // starting position
		source.length(), // length
		0, // initial indentation
		System.getProperty("line.separator") // line separator
	);
	(...)
</pre>
      </li>
    </ul>
  </body>
</html>
