blob: 4e3b20f69b0b164faa72b11b2d3ff93abd400e7c [file] [log] [blame]
/*
* Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.vm.ci.meta;
import static jdk.vm.ci.meta.MetaUtil.*;
/**
* Represents a resolved or unresolved type. Types include primitives, objects, {@code void}, and
* arrays thereof.
*/
public interface JavaType extends TrustedInterface {
/**
* Returns the name of this type in internal form. The following are examples of strings
* returned by this method:
*
* <pre>
* "Ljava/lang/Object;"
* "I"
* "[[B"
* </pre>
*/
String getName();
/**
* Returns an unqualified name of this type.
*
* <pre>
* "Object"
* "Integer"
* </pre>
*/
default String getUnqualifiedName() {
String name = getName();
if (name.indexOf('/') != -1) {
name = name.substring(name.lastIndexOf('/') + 1);
}
if (name.endsWith(";")) {
name = name.substring(0, name.length() - 1);
}
return name;
}
/**
* For array types, gets the type of the components, or {@code null} if this is not an array
* type. This method is analogous to {@link Class#getComponentType()}.
*/
JavaType getComponentType();
/**
* Gets the elemental type for this given type. The elemental type is the corresponding zero
* dimensional type of an array type. For example, the elemental type of {@code int[][][]} is
* {@code int}. A non-array type is its own elemental type.
*/
default JavaType getElementalType() {
JavaType t = this;
while (t.getComponentType() != null) {
t = t.getComponentType();
}
return t;
}
/**
* Gets the array class type representing an array with elements of this type.
*/
JavaType getArrayClass();
/**
* Gets the {@link JavaKind} of this type.
*/
JavaKind getJavaKind();
/**
* Resolves this type to a {@link ResolvedJavaType}.
*
* @param accessingClass the context of resolution (must not be null)
* @return the resolved Java type
* @throws LinkageError if the resolution failed
* @throws NullPointerException if {@code accessingClass} is {@code null}
*/
ResolvedJavaType resolve(ResolvedJavaType accessingClass);
/**
* Gets the Java programming language name for this type. The following are examples of strings
* returned by this method:
*
* <pre>
* java.lang.Object
* int
* boolean[][]
* </pre>
*
* @return the Java name corresponding to this type
*/
default String toJavaName() {
return internalNameToJava(getName(), true, false);
}
/**
* Gets the Java programming language name for this type. The following are examples of strings
* returned by this method:
*
* <pre>
* qualified == true:
* java.lang.Object
* int
* boolean[][]
* qualified == false:
* Object
* int
* boolean[][]
* </pre>
*
* @param qualified specifies if the package prefix of this type should be included in the
* returned name
* @return the Java name corresponding to this type
*/
default String toJavaName(boolean qualified) {
JavaKind kind = getJavaKind();
if (kind == JavaKind.Object) {
return internalNameToJava(getName(), qualified, false);
}
return getJavaKind().getJavaName();
}
/**
* Returns this type's name in the same format as {@link Class#getName()}.
*/
default String toClassName() {
return internalNameToJava(getName(), true, true);
}
}