1 /* 2 * Copyright 2016 Google Inc. All Rights Reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.turbine.binder.sym; 18 19 import com.google.errorprone.annotations.Immutable; 20 import org.jspecify.annotations.Nullable; 21 22 /** 23 * A class symbol. 24 * 25 * <p>Turbine identifies classes by their binary string name. Symbols are immutable and do not hold 26 * any semantic information: the information that has been determined at the current phase (e.g. 27 * about super-types and members) is held externally. 28 */ 29 // TODO(cushon): investigate performance impact of interning names/symbols 30 @Immutable 31 public class ClassSymbol implements Symbol { 32 33 public static final ClassSymbol OBJECT = new ClassSymbol("java/lang/Object"); 34 public static final ClassSymbol STRING = new ClassSymbol("java/lang/String"); 35 public static final ClassSymbol ENUM = new ClassSymbol("java/lang/Enum"); 36 public static final ClassSymbol RECORD = new ClassSymbol("java/lang/Record"); 37 public static final ClassSymbol ANNOTATION = new ClassSymbol("java/lang/annotation/Annotation"); 38 public static final ClassSymbol INHERITED = new ClassSymbol("java/lang/annotation/Inherited"); 39 public static final ClassSymbol CLONEABLE = new ClassSymbol("java/lang/Cloneable"); 40 public static final ClassSymbol SERIALIZABLE = new ClassSymbol("java/io/Serializable"); 41 public static final ClassSymbol DEPRECATED = new ClassSymbol("java/lang/Deprecated"); 42 public static final ClassSymbol PROFILE_ANNOTATION = new ClassSymbol("jdk/Profile+Annotation"); 43 public static final ClassSymbol PROPRIETARY_ANNOTATION = 44 new ClassSymbol("sun/Proprietary+Annotation"); 45 public static final ClassSymbol ERROR = new ClassSymbol("<error>"); 46 47 public static final ClassSymbol CHARACTER = new ClassSymbol("java/lang/Character"); 48 public static final ClassSymbol SHORT = new ClassSymbol("java/lang/Short"); 49 public static final ClassSymbol INTEGER = new ClassSymbol("java/lang/Integer"); 50 public static final ClassSymbol LONG = new ClassSymbol("java/lang/Long"); 51 public static final ClassSymbol FLOAT = new ClassSymbol("java/lang/Float"); 52 public static final ClassSymbol DOUBLE = new ClassSymbol("java/lang/Double"); 53 public static final ClassSymbol BOOLEAN = new ClassSymbol("java/lang/Boolean"); 54 public static final ClassSymbol BYTE = new ClassSymbol("java/lang/Byte"); 55 56 private final String className; 57 ClassSymbol(String className)58 public ClassSymbol(String className) { 59 this.className = className; 60 } 61 62 @Override hashCode()63 public int hashCode() { 64 return className.hashCode(); 65 } 66 67 @Override toString()68 public String toString() { 69 return className.replace('/', '.'); 70 } 71 72 @Override equals(@ullable Object o)73 public boolean equals(@Nullable Object o) { 74 return o instanceof ClassSymbol && className.equals(((ClassSymbol) o).className); 75 } 76 77 /** The JVMS 4.2.1 binary name of the class. */ binaryName()78 public String binaryName() { 79 return className; 80 } 81 82 @Override symKind()83 public Kind symKind() { 84 return Kind.CLASS; 85 } 86 simpleName()87 public String simpleName() { 88 return binaryName().substring(binaryName().lastIndexOf('/') + 1); 89 } 90 packageName()91 public String packageName() { 92 int idx = binaryName().lastIndexOf('/'); 93 return idx != -1 ? binaryName().substring(0, idx) : ""; 94 } 95 owner()96 public PackageSymbol owner() { 97 return new PackageSymbol(packageName()); 98 } 99 } 100