package org.eclipse.jdt.internal.core.builder.impl; /* * (c) Copyright IBM Corp. 2000, 2001. * All Rights Reserved. */ import org.eclipse.jdt.internal.core.Assert; import org.eclipse.jdt.internal.core.builder.*; import java.util.Hashtable; public class PrimitiveTypeHandleImpl extends TypeImpl implements IType { JavaDevelopmentContextImpl fDevelopmentContext; int fTypeCode; /* * Type codes */ static final int TC_BOOLEAN = 0; static final int TC_BYTE = 1; static final int TC_CHAR = 2; static final int TC_SHORT = 3; static final int TC_INT = 4; static final int TC_LONG = 5; static final int TC_FLOAT = 6; static final int TC_DOUBLE = 7; static final int TC_ARRAY = 9; static final int TC_CLASS = 10; static final int TC_VOID = 11; /** * Creates a new primitive type with the given type code */ PrimitiveTypeHandleImpl(JavaDevelopmentContextImpl dc, char typeCode) { fDevelopmentContext = dc; switch (typeCode) { case 'I' : fTypeCode = TC_INT; break; case 'F' : fTypeCode = TC_FLOAT; break; case 'V' : fTypeCode = TC_VOID; break; case 'Z' : fTypeCode = TC_BOOLEAN; break; case 'B' : fTypeCode = TC_BYTE; break; case 'S' : fTypeCode = TC_SHORT; break; case 'C' : fTypeCode = TC_CHAR; break; case 'J' : fTypeCode = TC_LONG; break; case 'D' : fTypeCode = TC_DOUBLE; break; } } /** * Appends the signature for this type to the StringBuffer * If includeUnnamed is true, then the identifiers for unnamed packages * are included, preceded by '$'. Otherwise, they are excluded. */ void appendSignature(StringBuffer sb, boolean includeUnnamed) { char sig; switch (fTypeCode) { case TC_BOOLEAN : sig = 'Z'; break; case TC_BYTE : sig = 'B'; break; case TC_CHAR : sig = 'C'; break; case TC_DOUBLE : sig = 'D'; break; case TC_FLOAT : sig = 'F'; break; case TC_INT : sig = 'I'; break; case TC_LONG : sig = 'J'; break; case TC_SHORT : sig = 'S'; break; case TC_VOID : sig = 'V'; break; default : sig = ' '; } sb.append(sig); } /** * Appends the VM signature of the type to the StringBuffer. */ void appendVMSignature(StringBuffer sb) { sb.append(typeSignature(fTypeCode)); } /** * Compares this object against the specified object. * Returns true if the objects are the same. */ public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof PrimitiveTypeHandleImpl)) return false; PrimitiveTypeHandleImpl prim = (PrimitiveTypeHandleImpl) o; return fTypeCode == prim.fTypeCode && fDevelopmentContext.equals(prim.fDevelopmentContext); } public JavaDevelopmentContextImpl getInternalDC() { return fDevelopmentContext; } /** * Returns the fully-qualified name of the type (class, interface, * array, or primitive) represented by this object, as a String. * For classes and interfaces, the name is the VM class name, * including the package name. * For inner classes, the name is as described in the * Inner Classes Specification. * For array types, the name is the name of the component type, followed by '[]'. * For primitive types, the name is the keyword for the primitive type. * This is a handle-only method. */ public String getName() { return getSimpleName(); } /** * Returns the simple name of the type (class, interface, array, * or primitive) represented by this object, as a String. * For classes and interfaces, this is the VM class name, * excluding the package name. * For array types, this is the simple name of the component type, followed by '[]'. * For primitive types, this is the keyword for the primitive type. * This is a handle-only method. */ public String getSimpleName() { switch (fTypeCode) { case TC_BOOLEAN : return "boolean"/*nonNLS*/; case TC_BYTE : return "byte"/*nonNLS*/; case TC_CHAR : return "char"/*nonNLS*/; case TC_DOUBLE : return "double"/*nonNLS*/; case TC_FLOAT : return "float"/*nonNLS*/; case TC_INT : return "int"/*nonNLS*/; case TC_LONG : return "long"/*nonNLS*/; case TC_SHORT : return "short"/*nonNLS*/; case TC_VOID : return "void"/*nonNLS*/; default : } return null; } int getTypeCode() { return fTypeCode; } /** * Returns the VM signature of the type. */ String getVMSignature() { return typeSignature(fTypeCode); } /** * Returns a consistent hash code for this object */ public int hashCode() { return fTypeCode; } /** * Returns a state specific version of this handle in the given state. */ public IHandle inState(IState s) throws org.eclipse.jdt.internal.core.builder.StateSpecificException { return new PrimitiveTypeHandleImplSWH((StateImpl) s, this); } /** * Determines if the specified Type object represents a primitive Java * type. * This is a handle-only method. * *

There are nine predefined Type objects to represent the eight * primitive Java types and void. These are created by the Java * Virtual Machine, and have the same names as the primitive types * that they represent, namely boolean, byte, char, short, int, * long, float, and double, and void. */ public boolean isPrimitive() { return true; } /** * Returns a string representation of the package. For debugging purposes * only (NON-NLS). */ public String toString() { return getName(); } /** * Convert a base type code to the VM naming format */ protected static String typeSignature(int typeCode) { switch (typeCode) { case TC_VOID : return "V"/*nonNLS*/; case TC_BOOLEAN : return "Z"/*nonNLS*/; case TC_BYTE : return "B"/*nonNLS*/; case TC_CHAR : return "C"/*nonNLS*/; case TC_SHORT : return "S"/*nonNLS*/; case TC_INT : return "I"/*nonNLS*/; case TC_LONG : return "J"/*nonNLS*/; case TC_FLOAT : return "F"/*nonNLS*/; case TC_DOUBLE : return "D"/*nonNLS*/; default : return "unknown"/*nonNLS*/; } } }