/******************************************************************************* * Copyright (c) 2000, 2008 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.jdt.internal.core.search.matching; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IMember; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.ITypeParameter; import org.eclipse.jdt.core.Signature; import org.eclipse.jdt.core.search.IJavaSearchScope; import org.eclipse.jdt.core.search.SearchParticipant; import org.eclipse.jdt.internal.compiler.env.AccessRuleSet; import org.eclipse.jdt.internal.compiler.util.SuffixConstants; import org.eclipse.jdt.internal.core.index.Index; import org.eclipse.jdt.internal.core.search.IndexQueryRequestor; import org.eclipse.jdt.internal.core.search.JavaSearchScope; import org.eclipse.jdt.internal.core.util.Util; /** * Pattern to search type parameters. * * @since 3.1 */ public class TypeParameterPattern extends JavaSearchPattern { protected boolean findDeclarations; protected boolean findReferences; protected char[] name; protected ITypeParameter typeParameter; protected char[] declaringMemberName; protected char[] methodDeclaringClassName; protected char[][] methodArgumentTypes; /** * @param findDeclarations * @param findReferences * @param typeParameter * @param matchRule */ public TypeParameterPattern(boolean findDeclarations, boolean findReferences, ITypeParameter typeParameter, int matchRule) { super(TYPE_PARAM_PATTERN, matchRule); this.findDeclarations = findDeclarations; // set to find declarations & all occurences this.findReferences = findReferences; // set to find references & all occurences this.typeParameter = typeParameter; this.name = typeParameter.getElementName().toCharArray(); // store type parameter name IMember member = typeParameter.getDeclaringMember(); this.declaringMemberName = member.getElementName().toCharArray(); // store type parameter declaring member name // For method type parameter, store also declaring class name and parameters type names if (member instanceof IMethod) { IMethod method = (IMethod) member; this.methodDeclaringClassName = method.getParent().getElementName().toCharArray(); String[] parameters = method.getParameterTypes(); int length = parameters.length; this.methodArgumentTypes = new char[length][]; for (int i=0; i<length; i++) { this.methodArgumentTypes[i] = Signature.toCharArray(parameters[i].toCharArray()); } } } /* * Same than LocalVariablePattern. */ public void findIndexMatches(Index index, IndexQueryRequestor requestor, SearchParticipant participant, IJavaSearchScope scope, IProgressMonitor progressMonitor) { IPackageFragmentRoot root = (IPackageFragmentRoot) this.typeParameter.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT); String documentPath; String relativePath; if (root.isArchive()) { IType type = (IType) this.typeParameter.getAncestor(IJavaElement.TYPE); relativePath = (type.getFullyQualifiedName('$')).replace('.', '/') + SuffixConstants.SUFFIX_STRING_class; documentPath = root.getPath() + IJavaSearchScope.JAR_FILE_ENTRY_SEPARATOR + relativePath; } else { IPath path = this.typeParameter.getPath(); documentPath = path.toString(); relativePath = Util.relativePath(path, 1/*remove project segment*/); } if (scope instanceof JavaSearchScope) { JavaSearchScope javaSearchScope = (JavaSearchScope) scope; // Get document path access restriction from java search scope // Note that requestor has to verify if needed whether the document violates the access restriction or not AccessRuleSet access = javaSearchScope.getAccessRuleSet(relativePath, index.containerPath); if (access != JavaSearchScope.NOT_ENCLOSED) { // scope encloses the path if (!requestor.acceptIndexMatch(documentPath, this, participant, access)) throw new OperationCanceledException(); } } else if (scope.encloses(documentPath)) { if (!requestor.acceptIndexMatch(documentPath, this, participant, null)) throw new OperationCanceledException(); } } protected StringBuffer print(StringBuffer output) { if (this.findDeclarations) { output.append(this.findReferences ? "TypeParamCombinedPattern: " //$NON-NLS-1$ : "TypeParamDeclarationPattern: "); //$NON-NLS-1$ } else { output.append("TypeParamReferencePattern: "); //$NON-NLS-1$ } output.append(this.typeParameter.toString()); return super.print(output); } }