| 1 | /* |
|---|---|
| 2 | * Copyright (C) 2007-2010 JĂșlio Vilmar Gesser. |
| 3 | * Copyright (C) 2011, 2013-2020 The JavaParser Team. |
| 4 | * |
| 5 | * This file is part of JavaParser. |
| 6 | * |
| 7 | * JavaParser can be used either under the terms of |
| 8 | * a) the GNU Lesser General Public License as published by |
| 9 | * the Free Software Foundation, either version 3 of the License, or |
| 10 | * (at your option) any later version. |
| 11 | * b) the terms of the Apache License |
| 12 | * |
| 13 | * You should have received a copy of both licenses in LICENCE.LGPL and |
| 14 | * LICENCE.APACHE. Please refer to those files for details. |
| 15 | * |
| 16 | * JavaParser is distributed in the hope that it will be useful, |
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 19 | * GNU Lesser General Public License for more details. |
| 20 | */ |
| 21 | |
| 22 | package com.github.javaparser.printer; |
| 23 | |
| 24 | import com.github.javaparser.ast.visitor.VoidVisitor; |
| 25 | |
| 26 | import java.util.function.Function; |
| 27 | |
| 28 | import static com.github.javaparser.printer.PrettyPrinterConfiguration.IndentType.SPACES; |
| 29 | import static com.github.javaparser.utils.Utils.SYSTEM_EOL; |
| 30 | import static com.github.javaparser.utils.Utils.assertNonNegative; |
| 31 | import static com.github.javaparser.utils.Utils.assertNotNull; |
| 32 | import static com.github.javaparser.utils.Utils.assertPositive; |
| 33 | |
| 34 | /** |
| 35 | * Configuration options for the {@link PrettyPrinter}. |
| 36 | */ |
| 37 | public class PrettyPrinterConfiguration { |
| 38 | public enum IndentType { |
| 39 | /** |
| 40 | * Indent with spaces. |
| 41 | */ |
| 42 | SPACES, |
| 43 | |
| 44 | /** |
| 45 | * Indent with tabs as far as possible. |
| 46 | * For proper aligning, the tab width is necessary and by default 4. |
| 47 | */ |
| 48 | TABS, |
| 49 | |
| 50 | /** |
| 51 | * Indent with tabs but align with spaces when wrapping and aligning |
| 52 | * method call chains and method call parameters. |
| 53 | * |
| 54 | * <p/><i>Example result:</i> |
| 55 | * <pre> |
| 56 | * class Foo { |
| 57 | * |
| 58 | * \tvoid bar() { |
| 59 | * \t\tfoo().bar() |
| 60 | * \t\t......baz(() -*> { |
| 61 | * \t\t..........\tboo().baa() |
| 62 | * \t\t..........\t......bee(a, |
| 63 | * \t\t..........\t..........b, |
| 64 | * \t\t..........\t..........c); |
| 65 | * \t\t..........}) |
| 66 | * \t\t......bam(); |
| 67 | * \t} |
| 68 | * } |
| 69 | * </pre> |
| 70 | */ |
| 71 | TABS_WITH_SPACE_ALIGN |
| 72 | } |
| 73 | |
| 74 | public static final int DEFAULT_MAX_ENUM_CONSTANTS_TO_ALIGN_HORIZONTALLY = 5; |
| 75 | |
| 76 | private boolean orderImports = false; |
| 77 | private boolean printComments = true; |
| 78 | private boolean printJavadoc = true; |
| 79 | private boolean spaceAroundOperators = true; |
| 80 | private boolean columnAlignParameters = false; |
| 81 | private boolean columnAlignFirstMethodChain = false; |
| 82 | /** |
| 83 | * Indent the case when it is true, don't if false |
| 84 | * switch(x) { switch(x) { |
| 85 | * case 1: case 1: |
| 86 | * return y; return y; |
| 87 | * case 2: case 2: |
| 88 | * return z; return x; |
| 89 | *} } |
| 90 | */ |
| 91 | private boolean indentCaseInSwitch = true; |
| 92 | private IndentType indentType = SPACES; |
| 93 | private int tabWidth = 4; |
| 94 | private int indentSize = 4; |
| 95 | private String endOfLineCharacter = SYSTEM_EOL; |
| 96 | private Function<PrettyPrinterConfiguration, VoidVisitor<Void>> visitorFactory = PrettyPrintVisitor::new; |
| 97 | private int maxEnumConstantsToAlignHorizontally = DEFAULT_MAX_ENUM_CONSTANTS_TO_ALIGN_HORIZONTALLY; |
| 98 | |
| 99 | /** |
| 100 | * @return the string that will be used to indent. |
| 101 | */ |
| 102 | public String getIndent() { |
| 103 | StringBuilder indentString = new StringBuilder(); |
| 104 | char indentChar; |
| 105 | switch (indentType) { |
| 106 | case SPACES: |
| 107 | indentChar = ' '; |
| 108 | break; |
| 109 | |
| 110 | case TABS: |
| 111 | case TABS_WITH_SPACE_ALIGN: |
| 112 | indentChar = '\t'; |
| 113 | break; |
| 114 | |
| 115 | default: |
| 116 | throw new AssertionError("Unhandled indent type"); |
| 117 | } |
| 118 | for (int i = 0; i < indentSize; i++) { |
| 119 | indentString.append(indentChar); |
| 120 | } |
| 121 | return indentString.toString(); |
| 122 | } |
| 123 | |
| 124 | public int getIndentSize() { |
| 125 | return indentSize; |
| 126 | } |
| 127 | |
| 128 | /** |
| 129 | * Set the size of the indent in characters. |
| 130 | */ |
| 131 | public PrettyPrinterConfiguration setIndentSize(int indentSize) { |
| 132 | this.indentSize = assertNonNegative(indentSize); |
| 133 | return this; |
| 134 | } |
| 135 | |
| 136 | /** |
| 137 | * Get the type of indent to produce. |
| 138 | */ |
| 139 | public IndentType getIndentType() { |
| 140 | return indentType; |
| 141 | } |
| 142 | |
| 143 | /** |
| 144 | * Set the type of indent to produce. |
| 145 | */ |
| 146 | public PrettyPrinterConfiguration setIndentType(IndentType indentType) { |
| 147 | this.indentType = assertNotNull(indentType); |
| 148 | return this; |
| 149 | } |
| 150 | |
| 151 | |
| 152 | |
| 153 | /** |
| 154 | * Get the tab width for pretty aligning. |
| 155 | */ |
| 156 | public int getTabWidth() { |
| 157 | return tabWidth; |
| 158 | } |
| 159 | |
| 160 | /** |
| 161 | * Set the tab width for pretty aligning. |
| 162 | */ |
| 163 | public PrettyPrinterConfiguration setTabWidth(int tabWidth) { |
| 164 | this.tabWidth = assertPositive(tabWidth); |
| 165 | return this; |
| 166 | } |
| 167 | |
| 168 | public boolean isOrderImports() { |
| 169 | return orderImports; |
| 170 | } |
| 171 | |
| 172 | public boolean isPrintComments() { |
| 173 | return printComments; |
| 174 | } |
| 175 | |
| 176 | public boolean isIgnoreComments() { |
| 177 | return !printComments; |
| 178 | } |
| 179 | |
| 180 | public boolean isSpaceAroundOperators() { return spaceAroundOperators; } |
| 181 | |
| 182 | public boolean isPrintJavadoc() { |
| 183 | return printJavadoc; |
| 184 | } |
| 185 | |
| 186 | public boolean isColumnAlignParameters() { |
| 187 | return columnAlignParameters; |
| 188 | } |
| 189 | |
| 190 | public boolean isColumnAlignFirstMethodChain() { return columnAlignFirstMethodChain; } |
| 191 | |
| 192 | public boolean isIndentCaseInSwitch() { |
| 193 | return indentCaseInSwitch; |
| 194 | } |
| 195 | |
| 196 | |
| 197 | /** |
| 198 | * When true, all comments will be printed, unless printJavadoc is false, then only line and block comments will be |
| 199 | * printed. |
| 200 | */ |
| 201 | public PrettyPrinterConfiguration setPrintComments(boolean printComments) { |
| 202 | this.printComments = printComments; |
| 203 | return this; |
| 204 | } |
| 205 | |
| 206 | /** |
| 207 | * When true, Javadoc will be printed. |
| 208 | */ |
| 209 | public PrettyPrinterConfiguration setPrintJavadoc(boolean printJavadoc) { |
| 210 | this.printJavadoc = printJavadoc; |
| 211 | return this; |
| 212 | } |
| 213 | |
| 214 | /** |
| 215 | * Set if there should be spaces between operators |
| 216 | */ |
| 217 | public PrettyPrinterConfiguration setSpaceAroundOperators(boolean spaceAroundOperators){ |
| 218 | this.spaceAroundOperators = spaceAroundOperators; |
| 219 | return this; |
| 220 | } |
| 221 | |
| 222 | public PrettyPrinterConfiguration setColumnAlignParameters(boolean columnAlignParameters) { |
| 223 | this.columnAlignParameters = columnAlignParameters; |
| 224 | return this; |
| 225 | } |
| 226 | |
| 227 | public PrettyPrinterConfiguration setColumnAlignFirstMethodChain(boolean columnAlignFirstMethodChain) { |
| 228 | this.columnAlignFirstMethodChain = columnAlignFirstMethodChain; |
| 229 | return this; |
| 230 | } |
| 231 | |
| 232 | public PrettyPrinterConfiguration setIndentCaseInSwitch(boolean indentInSwitch) { |
| 233 | this.indentCaseInSwitch = indentInSwitch; |
| 234 | return this; |
| 235 | } |
| 236 | |
| 237 | public Function<PrettyPrinterConfiguration, VoidVisitor<Void>> getVisitorFactory() { |
| 238 | return visitorFactory; |
| 239 | } |
| 240 | |
| 241 | /** |
| 242 | * Set the factory that creates the PrettyPrintVisitor. By changing this you can make the PrettyPrinter use a custom |
| 243 | * PrettyPrinterVisitor. |
| 244 | */ |
| 245 | public PrettyPrinterConfiguration setVisitorFactory(Function<PrettyPrinterConfiguration, VoidVisitor<Void>> visitorFactory) { |
| 246 | this.visitorFactory = assertNotNull(visitorFactory); |
| 247 | return this; |
| 248 | } |
| 249 | |
| 250 | public String getEndOfLineCharacter() { |
| 251 | return endOfLineCharacter; |
| 252 | } |
| 253 | |
| 254 | /** |
| 255 | * Set the character to append when a line should end. Example values: "\n", "\r\n", "". |
| 256 | */ |
| 257 | public PrettyPrinterConfiguration setEndOfLineCharacter(String endOfLineCharacter) { |
| 258 | this.endOfLineCharacter = assertNotNull(endOfLineCharacter); |
| 259 | return this; |
| 260 | } |
| 261 | |
| 262 | /** |
| 263 | * When true, orders imports by alphabetically. |
| 264 | */ |
| 265 | public PrettyPrinterConfiguration setOrderImports(boolean orderImports) { |
| 266 | this.orderImports = orderImports; |
| 267 | return this; |
| 268 | } |
| 269 | |
| 270 | |
| 271 | |
| 272 | public int getMaxEnumConstantsToAlignHorizontally() { |
| 273 | return maxEnumConstantsToAlignHorizontally; |
| 274 | } |
| 275 | |
| 276 | /** |
| 277 | * By default enum constants get aligned like this: |
| 278 | * <pre> |
| 279 | * enum X { |
| 280 | * A, B, C, D |
| 281 | * } |
| 282 | * </pre> |
| 283 | * until the amount of constants passes this value (5 by default). |
| 284 | * Then they get aligned like this: |
| 285 | * <pre> |
| 286 | * enum X { |
| 287 | * A, |
| 288 | * B, |
| 289 | * C, |
| 290 | * D, |
| 291 | * E, |
| 292 | * F, |
| 293 | * G |
| 294 | * } |
| 295 | * </pre> |
| 296 | * Set it to a large number to always align horizontally. |
| 297 | * Set it to 1 or less to always align vertically. |
| 298 | */ |
| 299 | public PrettyPrinterConfiguration setMaxEnumConstantsToAlignHorizontally(int maxEnumConstantsToAlignHorizontally) { |
| 300 | this.maxEnumConstantsToAlignHorizontally = maxEnumConstantsToAlignHorizontally; |
| 301 | return this; |
| 302 | } |
| 303 | } |
| 304 |
Members