blob: 0346a12cb99907ecf41013b5a7f202560a7eec73 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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;
import org.eclipse.jdt.core.IInitializer;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.compiler.CharOperation;
import org.eclipse.jdt.internal.codeassist.ISearchRequestor;
import org.eclipse.jdt.internal.compiler.env.AccessRuleSet;
import org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
import org.eclipse.jdt.internal.compiler.env.AccessRestriction;
/**
* Implements <code>IJavaElementRequestor</code>, wrappering and forwarding
* results onto a <code>org.eclipse.jdt.internal.codeassist.api.ISearchRequestor</code>.
*/
class SearchableEnvironmentRequestor extends JavaElementRequestor {
/**
* The <code>ISearchRequestor</code> this JavaElementRequestor wraps
* and forwards results to.
*/
protected ISearchRequestor requestor;
/**
* The <code>ICompilationUNit</code> this JavaElementRequestor will not
* accept types within.
*/
protected ICompilationUnit unitToSkip;
protected IJavaProject project;
protected NameLookup nameLookup;
protected boolean checkAccessRestrictions;
/**
* Constructs a SearchableEnvironmentRequestor that wraps the
* given SearchRequestor.
*/
public SearchableEnvironmentRequestor(ISearchRequestor requestor) {
this.requestor = requestor;
this.unitToSkip= null;
this.project= null;
this.nameLookup= null;
this.checkAccessRestrictions = false;
}
/**
* Constructs a SearchableEnvironmentRequestor that wraps the
* given SearchRequestor. The requestor will not accept types in
* the <code>unitToSkip</code>.
*/
public SearchableEnvironmentRequestor(ISearchRequestor requestor, ICompilationUnit unitToSkip, IJavaProject project, NameLookup nameLookup) {
this.requestor = requestor;
this.unitToSkip= unitToSkip;
this.project= project;
this.nameLookup = nameLookup;
this.checkAccessRestrictions =
!JavaCore.IGNORE.equals(project.getOption(JavaCore.COMPILER_PB_FORBIDDEN_REFERENCE, true))
|| !JavaCore.IGNORE.equals(project.getOption(JavaCore.COMPILER_PB_DISCOURAGED_REFERENCE, true));
}
/**
* Do nothing, a SearchRequestor does not accept initializers
* so there is no need to forward this results.
*
* @see IJavaElementRequestor
*/
public void acceptInitializer(IInitializer initializer) {
// implements interface method
}
/**
* @see IJavaElementRequestor
*/
public void acceptPackageFragment(IPackageFragment packageFragment) {
this.requestor.acceptPackage(packageFragment.getElementName().toCharArray());
}
/**
* @see IJavaElementRequestor
*/
public void acceptType(IType type) {
try {
if (this.unitToSkip != null && this.unitToSkip.equals(type.getCompilationUnit())){
return;
}
char[] packageName = type.getPackageFragment().getElementName().toCharArray();
boolean isBinary = type instanceof BinaryType;
// determine associated access restriction
AccessRestriction accessRestriction = null;
if (this.checkAccessRestrictions && (isBinary || !type.getJavaProject().equals(this.project))) {
PackageFragmentRoot root = (PackageFragmentRoot)type.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
ClasspathEntry entry = (ClasspathEntry) this.nameLookup.rootToResolvedEntries.get(root);
if (entry != null) { // reverse map always contains resolved CP entry
AccessRuleSet accessRuleSet = entry.getAccessRuleSet();
if (accessRuleSet != null) {
// TODO (philippe) improve char[] <-> String conversions to avoid performing them on the fly
char[][] packageChars = CharOperation.splitOn('.', packageName);
char[] fileChars = type.getParent().getElementName().toCharArray();
accessRestriction = accessRuleSet.getViolatedRestriction(CharOperation.concatWith(packageChars, fileChars, '/'));
}
}
}
this.requestor.acceptType(packageName, type.getElementName().toCharArray(), type.getFlags(), accessRestriction);
} catch (JavaModelException jme) {
// ignore
}
}
}