/******************************************************************************* * Copyright (c) 2000, 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.wst.jsdt.internal.core.hierarchy; import org.eclipse.wst.jsdt.core.compiler.CharOperation; import org.eclipse.wst.jsdt.internal.compiler.ast.TypeDeclaration; import org.eclipse.wst.jsdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.wst.jsdt.internal.compiler.env.IBinaryField; import org.eclipse.wst.jsdt.internal.compiler.env.IBinaryMethod; import org.eclipse.wst.jsdt.internal.compiler.env.IBinaryNestedType; import org.eclipse.wst.jsdt.internal.compiler.env.IBinaryType; public class HierarchyBinaryType implements IBinaryType { private int modifiers; private char[] sourceName; private char[] name; private char[] enclosingTypeName; private char[] superclass; private char[] genericSignature; public HierarchyBinaryType(int modifiers, char[] qualification, char[] sourceName, char[] enclosingTypeName){ this.modifiers = modifiers; this.sourceName = sourceName; if (enclosingTypeName == null){ this.name = CharOperation.concat(qualification, sourceName, '/'); } else { this.name = CharOperation.concat(qualification, '/', enclosingTypeName, '$', sourceName); //rebuild A$B name this.enclosingTypeName = CharOperation.concat(qualification, enclosingTypeName,'/'); CharOperation.replace(this.enclosingTypeName, '.', '/'); } CharOperation.replace(this.name, '.', '/'); } /** * Answer the resolved name of the enclosing type in the * class file format as specified in section 4.2 of the Java 2 VM spec * or null if the receiver is a top level type. * * For example, java.lang.String is java/lang/String. */ public char[] getEnclosingTypeName() { return this.enclosingTypeName; } /** * Answer the receiver's fields or null if the array is empty. */ public IBinaryField[] getFields() { return null; } /** * @see org.eclipse.wst.jsdt.internal.compiler.env.IDependent#getFileName() */ public char[] getFileName() { return null; } public char[] getGenericSignature() { return this.genericSignature; } /** * Answer the receiver's nested types or null if the array is empty. * * This nested type info is extracted from the inner class attributes. * Ask the name environment to find a member type using its compound name. */ public IBinaryNestedType[] getMemberTypes() { return null; } /** * Answer the receiver's methods or null if the array is empty. */ public IBinaryMethod[] getMethods() { return null; } /** * Answer an int whose bits are set according the access constants * defined by the VM spec. */ public int getModifiers() { return this.modifiers; } /** * Answer the resolved name of the type in the * class file format as specified in section 4.2 of the Java 2 VM spec. * * For example, java.lang.String is java/lang/String. */ public char[] getName() { return this.name; } public char[] getSourceName() { return this.sourceName; } /** * Answer the resolved name of the receiver's superclass in the * class file format as specified in section 4.2 of the Java 2 VM spec * or null if it does not have one. * * For example, java.lang.String is java/lang/String. */ public char[] getSuperclassName() { return this.superclass; } public boolean isAnonymous() { return false; // index did not record this information (since unused for hierarchies) } /** * Answer whether the receiver contains the resolved binary form * or the unresolved source form of the type. */ public boolean isBinaryType() { return true; } public boolean isLocal() { return false; // index did not record this information (since unused for hierarchies) } public boolean isMember() { return false; // index did not record this information (since unused for hierarchies) } public void recordSuperType(char[] superTypeName, char[] superQualification){ // index encoding of p.A$B was B/p.A$, rebuild the proper name if (superQualification != null){ int length = superQualification.length; if (superQualification[length-1] == '$'){ char[] enclosingSuperName = CharOperation.lastSegment(superQualification, '.'); superTypeName = CharOperation.concat(enclosingSuperName, superTypeName); superQualification = CharOperation.subarray(superQualification, 0, length - enclosingSuperName.length - 1); } } char[] encodedName = CharOperation.concat(superQualification, superTypeName, '/'); CharOperation.replace(encodedName, '.', '/'); this.superclass = encodedName; } public String toString() { StringBuffer buffer = new StringBuffer(); if (this.modifiers == ClassFileConstants.AccPublic) { buffer.append("public "); //$NON-NLS-1$ } switch (TypeDeclaration.kind(this.modifiers)) { case TypeDeclaration.CLASS_DECL : buffer.append("class "); //$NON-NLS-1$ break; } if (this.name != null) { buffer.append(this.name); } if (this.superclass != null) { buffer.append("\n extends "); //$NON-NLS-1$ buffer.append(this.superclass); } return buffer.toString(); } /** * @see org.eclipse.wst.jsdt.internal.compiler.env.IBinaryType */ public char[] sourceFileName() { return null; } // TODO (jerome) please verify that we don't need the tagbits for the receiver public long getTagBits() { return 0; } }