| /******************************************************************************* |
| * Copyright (c) 2000, 2016 IBM Corporation and others. |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0. |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| *******************************************************************************/ |
| 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 |
| } |
| } |
| } |