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