/* *******************************************************************
 * Copyright (c) 1999-2001 Xerox Corporation, 
 *               2002 Palo Alto Research Center, Incorporated (PARC).
 * 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 
 *  
 * ******************************************************************/
package org.aspectj.util;

Encapsulate generic signature parsing
Author:Adrian Colyer, Andy Clement
/** * Encapsulate generic signature parsing * * @author Adrian Colyer * @author Andy Clement */
public class GenericSignature {
structure holding a parsed class signature
/** * structure holding a parsed class signature */
public static class ClassSignature { public FormalTypeParameter[] formalTypeParameters = FormalTypeParameter.NONE; public ClassTypeSignature superclassSignature; public ClassTypeSignature[] superInterfaceSignatures = ClassTypeSignature.NONE; public String toString() { StringBuffer ret = new StringBuffer(); ret.append(formalTypeParameters.toString()); ret.append(superclassSignature.toString()); for (int i = 0; i < superInterfaceSignatures.length; i++) { ret.append(superInterfaceSignatures[i].toString()); } return ret.toString(); } } public static class MethodTypeSignature { public FormalTypeParameter[] formalTypeParameters = new FormalTypeParameter[0]; public TypeSignature[] parameters = new TypeSignature[0]; public TypeSignature returnType; public FieldTypeSignature[] throwsSignatures = new FieldTypeSignature[0]; public MethodTypeSignature(FormalTypeParameter[] aFormalParameterList, TypeSignature[] aParameterList, TypeSignature aReturnType, FieldTypeSignature[] aThrowsSignatureList) { this.formalTypeParameters = aFormalParameterList; this.parameters = aParameterList; this.returnType = aReturnType; this.throwsSignatures = aThrowsSignatureList; } public String toString() { StringBuffer sb = new StringBuffer(); if (formalTypeParameters.length > 0) { sb.append("<"); for (int i = 0; i < formalTypeParameters.length; i++) { sb.append(formalTypeParameters[i].toString()); } sb.append(">"); } sb.append("("); for (int i = 0; i < parameters.length; i++) { sb.append(parameters[i].toString()); } sb.append(")"); sb.append(returnType.toString()); for (int i = 0; i < throwsSignatures.length; i++) { sb.append("^"); sb.append(throwsSignatures[i].toString()); } return sb.toString(); } }
structure capturing a FormalTypeParameter from the Signature grammar
/** * structure capturing a FormalTypeParameter from the Signature grammar */
public static class FormalTypeParameter { public static final FormalTypeParameter[] NONE = new FormalTypeParameter[0]; public String identifier; public FieldTypeSignature classBound; public FieldTypeSignature[] interfaceBounds; public String toString() { StringBuffer ret = new StringBuffer(); ret.append("T"); ret.append(identifier); ret.append(":"); ret.append(classBound.toString()); for (int i = 0; i < interfaceBounds.length; i++) { ret.append(":"); ret.append(interfaceBounds[i].toString()); } return ret.toString(); } } public static abstract class TypeSignature { public boolean isBaseType() { return false; } } public static class BaseTypeSignature extends TypeSignature { private final String sig; public BaseTypeSignature(String aPrimitiveType) { sig = aPrimitiveType; } public boolean isBaseType() { return true; } public String toString() { return sig; } } public static abstract class FieldTypeSignature extends TypeSignature { public boolean isClassTypeSignature() { return false; } public boolean isTypeVariableSignature() { return false; } public boolean isArrayTypeSignature() { return false; } } public static class ClassTypeSignature extends FieldTypeSignature { public static final ClassTypeSignature[] NONE = new ClassTypeSignature[0]; public String classSignature; public SimpleClassTypeSignature outerType; public SimpleClassTypeSignature[] nestedTypes; public ClassTypeSignature(String sig, String identifier) { this.classSignature = sig; this.outerType = new SimpleClassTypeSignature(identifier); this.nestedTypes = new SimpleClassTypeSignature[0]; } public ClassTypeSignature(String sig, SimpleClassTypeSignature outer, SimpleClassTypeSignature[] inners) { this.classSignature = sig; this.outerType = outer; this.nestedTypes = inners; } public boolean isClassTypeSignature() { return true; } public String toString() { return classSignature; } } public static class TypeVariableSignature extends FieldTypeSignature { public String typeVariableName; public TypeVariableSignature(String typeVarToken) { this.typeVariableName = typeVarToken.substring(1); } public boolean isTypeVariableSignature() { return true; } public String toString() { return "T" + typeVariableName + ";"; } } public static class ArrayTypeSignature extends FieldTypeSignature { public TypeSignature typeSig; public ArrayTypeSignature(TypeSignature aTypeSig) { this.typeSig = aTypeSig; } public boolean isArrayTypeSignature() { return true; } public String toString() { return "[" + typeSig.toString(); } } public static class SimpleClassTypeSignature { public String identifier; public TypeArgument[] typeArguments; public SimpleClassTypeSignature(String identifier) { this.identifier = identifier; this.typeArguments = new TypeArgument[0]; } public SimpleClassTypeSignature(String identifier, TypeArgument[] args) { this.identifier = identifier; this.typeArguments = args; } public String toString() { StringBuffer sb = new StringBuffer(); sb.append(identifier); if (typeArguments.length > 0) { sb.append("<"); for (int i = 0; i < typeArguments.length; i++) { sb.append(typeArguments[i].toString()); } sb.append(">"); } return sb.toString(); } } public static class TypeArgument { public boolean isWildcard = false; public boolean isPlus = false; public boolean isMinus = false; public FieldTypeSignature signature; // null if isWildcard public TypeArgument() { isWildcard = true; } public TypeArgument(boolean plus, boolean minus, FieldTypeSignature aSig) { this.isPlus = plus; this.isMinus = minus; this.signature = aSig; } public String toString() { if (isWildcard) return "*"; StringBuffer sb = new StringBuffer(); if (isPlus) sb.append("+"); if (isMinus) sb.append("-"); sb.append(signature.toString()); return sb.toString(); } } }