| /******************************************************************************* |
| * 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); |
| } |
| |
| } |