blob: 425db269ba43a94ac22d837c599bc2dcd9dc429f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2016 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
*
*******************************************************************************/
package org.eclipse.dltk.internal.core;
import org.eclipse.dltk.compiler.CharOperation;
import org.eclipse.dltk.compiler.env.IModuleSource;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.IProjectFragment;
import org.eclipse.dltk.core.IScriptFolder;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.IType;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.internal.codeassist.ISearchRequestor;
import org.eclipse.dltk.internal.compiler.env.AccessRestriction;
import org.eclipse.dltk.internal.compiler.env.AccessRuleSet;
/**
* Implements <code>IModelElementRequestor</code>
*/
class SearchableEnvironmentRequestor extends ModelElementRequestor {
/**
* The <code>ISearchRequestor</code> this ModelElementRequestor wraps and
* forwards results to.
*/
protected ISearchRequestor requestor;
/**
* The <code>ICompilationUNit</code> this ModelElementRequestor will not
* accept types within.
*/
protected IModuleSource unitToSkip;
protected IScriptProject 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,
IModuleSource unitToSkip, IScriptProject project,
NameLookup nameLookup) {
this.requestor = requestor;
this.unitToSkip = unitToSkip;
this.project = project;
this.nameLookup = nameLookup;
this.checkAccessRestrictions = !DLTKCore.IGNORE.equals(project
.getOption(DLTKCore.COMPILER_PB_FORBIDDEN_REFERENCE, true))
|| !DLTKCore.IGNORE.equals(project.getOption(
DLTKCore.COMPILER_PB_DISCOURAGED_REFERENCE, true));
}
/**
* @see IModelElementRequestor
*/
@Override
public void acceptScriptFolder(IScriptFolder ScriptFolder) {
this.requestor
.acceptPackage(ScriptFolder.getElementName().toCharArray());
}
/**
* @see IModelElementRequestor
*/
@Override
public void acceptType(IType type) {
try {
if (this.unitToSkip != null
&& this.unitToSkip.equals(type.getSourceModule())) {
return;
}
char[] packageName = type.getScriptFolder().getElementName()
.toCharArray();
// determine associated access restriction
AccessRestriction accessRestriction = null;
if (this.checkAccessRestrictions
&& (!type.getScriptProject().equals(this.project))) {
IProjectFragment root = (IProjectFragment) type
.getAncestor(IModelElement.PROJECT_FRAGMENT);
BuildpathEntry entry = (BuildpathEntry) 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[] fileWithoutExtension = type.getElementName()
.toCharArray();
accessRestriction = accessRuleSet
.getViolatedRestriction(
CharOperation.concatWith(packageChars,
fileWithoutExtension, '/'));
}
}
}
this.requestor.acceptType(packageName,
type.getElementName().toCharArray(), null, type.getFlags(),
accessRestriction);
} catch (ModelException jme) {
// ignore
}
}
}