/*
* Copyright 2003-2016 JetBrains s.r.o.
*
* 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 jetbrains.mps.util;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.SModelReference;
import org.jetbrains.mps.openapi.model.SNode;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
* User: Dmitriev.
* Date: Jan 13, 2004
*/
public final class JavaNameUtil {
private static Set<String> JAVA_KEYWORDS = new HashSet<String>();
static {
JAVA_KEYWORDS.addAll(Arrays.asList(
"abstract", "continue", "for", "new", "switch", "assert", "default", "if", "package", "synchronized", "boolean", "do", "goto", "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", "finally", "long",
"strictfp", "volatile", "const", "float", "native", "super", "while", "true", "false", "null"));
}
private JavaNameUtil() {
}
/**
* Beware, for nested classes this method yields incorrect result (consider Classifier.getFqName() instead).
*/
public static String fqClassName(@NotNull SModel model, @NotNull String shortClassName) {
String packageName = packageName(model);
if (packageName.isEmpty()) {
return shortClassName;
}
return packageName + '.' + shortClassName;
}
public static String fqClassName(@NotNull SNode node, @NotNull String shortClassName) {
return fqClassName(node.getModel(), shortClassName);
}
public static String packageNameForModelUID(@NotNull SModelReference modelReference) {
return modelReference.getName().getLongName();
}
public static String packageName(@NotNull SModel model) {
return model.getName().getLongName();
}
@Contract(value = "null -> null; !null -> !null")
public static String packageName(@Nullable String fqName) {
if (fqName == null) {
return null;
}
int offset = fqName.lastIndexOf('.');
if (offset < 0) {
return "";
}
return fqName.substring(0, offset);
}
@Contract(value = "null -> null; !null -> !null")
public static String shortName(@Nullable String fqName) {
if (fqName == null) {
return null;
}
int offset = fqName.lastIndexOf('.');
if (offset < 0) {
return fqName;
}
return fqName.substring(offset + 1);
}
public static String nestedClassName(String packageName, String fqClassName) {
return packageName.isEmpty() ? fqClassName : fqClassName.substring(packageName.length() + 1);
}
public static boolean isJavaIdentifier(@NotNull String text) {
if (text.isEmpty()) {
return false;
}
if (!Character.isJavaIdentifierStart(text.charAt(0))) {
return false;
}
for (int i = 1; i < text.length(); i++) {
if (!Character.isJavaIdentifierPart(text.charAt(i))) {
return false;
}
}
return !JAVA_KEYWORDS.contains(text);
}
}