blob: b393cc5f5159a731f8db5e8a22a7ce8f91c420f9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.core.search;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.Signature;
import org.eclipse.jdt.core.compiler.CharOperation;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.MethodNameMatchRequestor;
import org.eclipse.jdt.core.search.MethodNameRequestor;
import org.eclipse.jdt.internal.compiler.env.AccessRestriction;
/**
* Wrapper used to link {@link IRestrictedAccessMethodRequestor} with {@link MethodNameRequestor}.
* This wrapper specifically allows usage of internal method {@link BasicSearchEngine#searchAllMethodNames(
* char[] packageName,
* int pkgMatchRule,
* char[] declaringQualification,
* int declQualificationMatchRule,
* char[] delcaringSimpleName,
* int declSimpleNameMatchRule,
* char[] methodName,
* int methodMatchRule,
* IJavaSearchScope scope,
* IRestrictedAccessMethodRequestor methodRequestor,
* int waitingPolicy,
* IProgressMonitor progressMonitor)} from API method
* {@link org.eclipse.jdt.core.search.SearchEngine#searchAllMethodNames(
* char[] packageName,
* int pkgMatchRule,
* char[] declaringQualification,
* int declQualificationMatchRule,
* char[] delcaringSimpleName,
* int declSimpleNameMatchRule,
* char[] methodName,
* int methodMatchRule,
* IJavaSearchScope scope,
* MethodNameRequestor methodRequestor,
* int waitingPolicy,
* IProgressMonitor progressMonitor)}.
*/
public class MethodNameMatchRequestorWrapper extends NameMatchRequestorWrapper implements IRestrictedAccessMethodRequestor {
MethodNameMatchRequestor requestor;
public MethodNameMatchRequestorWrapper(MethodNameMatchRequestor requestor, IJavaSearchScope scope) {
super(scope);
this.requestor = requestor;
}
@Override
public void acceptMethod(char[] methodName, int parameterCount, char[] declaringQualifier,
char[] simpleTypeName, int typeModifiers, char[] packageName, char[] signature, char[][] parameterTypes,
char[][] parameterNames, char[] returnType, int modifiers, String path,
AccessRestriction access, int methodIndex) {
// Get the type
char[][] enclosingTypeNames = declaringQualifier != null && declaringQualifier.length > 0 ? CharOperation.splitOn('.', declaringQualifier) : CharOperation.NO_CHAR_CHAR;
IType type = getType(typeModifiers, packageName, simpleTypeName, enclosingTypeNames, path, access);
if (type == null) return;
if (!(!(this.scope instanceof HierarchyScope) || ((HierarchyScope) this.scope).enclosesFineGrained(type))) return;
parameterTypes = parameterTypes == null ? CharOperation.NO_CHAR_CHAR : parameterTypes;
String[] paramTypeSigs = CharOperation.NO_STRINGS;
if (signature != null) {
char[][] parTypes = Signature.getParameterTypes(signature);
if (parTypes.length > 0) {
for (int i = 0, l = parTypes.length; i < l; ++i) {
CharOperation.replace(parTypes[i], '/', '.');
}
}
paramTypeSigs = CharOperation.toStrings(parTypes);
} else if (parameterTypes.length > 0) {
int l = parameterTypes.length;
paramTypeSigs = new String[l];
for (int i = 0; i < l; ++i) {
paramTypeSigs[i] = Signature.createTypeSignature(parameterTypes[i], false);
}
}
IMethod method = type.getMethod(new String(methodName), paramTypeSigs);
this.requestor.acceptMethodNameMatch(new JavaSearchMethodNameMatch(method, modifiers));
}
}