tech.deplant.javapoet.Util Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of javapoet-core Show documentation
Show all versions of javapoet-core Show documentation
Use beautiful Java code to generate beautiful Java code.
The newest version!
/*
* Copyright (C) 2015 Square, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package tech.deplant.javapoet;
import javax.lang.model.element.Modifier;
import java.util.*;
import static java.lang.Character.isISOControl;
/**
* Like Guava, but worse and standalone. This makes it easier to mix JavaPoet with libraries that
* bring their own version of Guava.
*/
final class Util {
private final static Set JAVA_RESERVED_WORDS = Set.of("abstract",
"continue",
"for",
"new",
"switch",
"assert",
"default",
"goto",
"package",
"synchronized",
"boolean",
"do",
"if",
"private",
"this",
"break",
"double",
"implements",
"protected",
"throw",
"byte",
"else",
"import",
"public",
"throws",
"case",
"enum",
"instanceof",
"return",
"transient",
"catch",
"extends",
"int",
"short",
"try",
"char",
"final",
"interface",
"static",
"void",
"class",
"record",
"finally",
"long",
"strictfp",
"volatile",
"const",
"float",
"native",
"super",
"when",
"sealed",
"permits",
"while");
private Util() {
}
public static boolean isJavaReservedWord(String word) {
return JAVA_RESERVED_WORDS.contains(word);
}
static Map> immutableMultimap(Map> multimap) {
LinkedHashMap> result = new LinkedHashMap<>();
for (Map.Entry> entry : multimap.entrySet()) {
if (entry.getValue().isEmpty()) {
continue;
}
result.put(entry.getKey(), immutableList(entry.getValue()));
}
return Collections.unmodifiableMap(result);
}
static Map immutableMap(Map map) {
return Collections.unmodifiableMap(new LinkedHashMap<>(map));
}
static void checkArgument(boolean condition, String format, Object... args) {
if (!condition) {
throw new IllegalArgumentException(String.format(format, args));
}
}
static T checkNotNull(T reference, String format, Object... args) {
if (reference == null) {
throw new NullPointerException(String.format(format, args));
}
return reference;
}
static void checkState(boolean condition, String format, Object... args) {
if (!condition) {
throw new IllegalStateException(String.format(format, args));
}
}
static List immutableList(Collection collection) {
return Collections.unmodifiableList(new ArrayList<>(collection));
}
static Set immutableSet(Collection set) {
return Collections.unmodifiableSet(new LinkedHashSet<>(set));
}
static Set union(Set a, Set b) {
Set result = new LinkedHashSet<>();
result.addAll(a);
result.addAll(b);
return result;
}
static void requireExactlyOneOf(Set modifiers, Modifier... mutuallyExclusive) {
int count = 0;
for (Modifier modifier : mutuallyExclusive) {
if (modifiers.contains(modifier)) {
count++;
}
}
checkArgument(count == 1, "modifiers %s must contain one of %s",
modifiers, Arrays.toString(mutuallyExclusive));
}
static String characterLiteralWithoutSingleQuotes(char c) {
// see https://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.6
switch (c) {
case '\b':
return "\\b"; /* \u0008: backspace (BS) */
case '\t':
return "\\t"; /* \u0009: horizontal tab (HT) */
case '\n':
return "\\n"; /* \u000a: linefeed (LF) */
case '\f':
return "\\f"; /* \u000c: form feed (FF) */
case '\r':
return "\\r"; /* \u000d: carriage return (CR) */
case '\"':
return "\""; /* \u0022: double quote (") */
case '\'':
return "\\'"; /* \u0027: single quote (') */
case '\\':
return "\\\\"; /* \u005c: backslash (\) */
default:
return isISOControl(c) ? String.format("\\u%04x", (int) c) : Character.toString(c);
}
}
/**
* Returns the string literal representing {@code value}, including wrapping double quotes.
*/
static String stringLiteralWithDoubleQuotes(String value, String indent) {
StringBuilder result = new StringBuilder(value.length() + 2);
result.append('"');
for (int i = 0; i < value.length(); i++) {
char c = value.charAt(i);
// trivial case: single quote must not be escaped
if (c == '\'') {
result.append("'");
continue;
}
// trivial case: double quotes must be escaped
if (c == '\"') {
result.append("\\\"");
continue;
}
// default case: just let character literal do its work
result.append(characterLiteralWithoutSingleQuotes(c));
// need to append indent after linefeed?
if (c == '\n' && i + 1 < value.length()) {
result.append("\"\n").append(indent).append(indent).append("+ \"");
}
}
result.append('"');
return result.toString();
}
}