/** * Copyright (c) 2013-2016 Angelo ZERR. * 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: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation */ package tern.eclipse.ide.internal.core.scriptpath; import java.util.List; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceProxy; import org.eclipse.core.resources.IResourceProxyVisitor; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import tern.ITernFile; import tern.ITernProject; import tern.TernResourcesManager; import tern.eclipse.ide.core.IIDETernScriptPathReporter; import tern.scriptpath.ITernScriptPath; import tern.scriptpath.ITernScriptPath.ScriptPathsType; import tern.scriptpath.ITernScriptResource; import tern.scriptpath.impl.JSFileScriptResource; /** * {@link IResourceProxyVisitor} implementation to collect JavaScript files for * the tern scope. * */ public class ScriptResourceProxyVisitor implements IResourceProxyVisitor { private final IIDETernScriptPath scriptPath; private final IIDETernScriptPathReporter reporter; private final List<ITernScriptResource> resources; private final boolean isAlsoProject; public ScriptResourceProxyVisitor(IIDETernScriptPath scriptPath, List<ITernScriptResource> resources, IIDETernScriptPathReporter reporter) { this.scriptPath = scriptPath; this.resources = resources; this.reporter = reporter; this.isAlsoProject = scriptPath.getType() == ScriptPathsType.PROJECT; } @Override public boolean visit(IResourceProxy proxy) throws CoreException { if (proxy.isDerived()) return false; int resourceType = proxy.getType(); switch (resourceType) { case IResource.PROJECT: return true; case IResource.FOLDER: IPath folderPath = proxy.requestFullPath(); if (isAlsoProject) { if (isExcludedFromProject(folderPath, scriptPath.getOwnerProject())) { if (reporter != null) { reporter.report(folderPath, scriptPath, "Exclude folder (from project) because a tern script folder path already include it.", false); } return false; } } /* * if (!scriptPath.hasInclusionPatterns()) { return true; } */ return isInScope(folderPath, resourceType); case IResource.FILE: String filename = proxy.getName(); if (TernResourcesManager.isJSFile(filename)) { IPath path = proxy.requestFullPath(); if (isInScope(path, resourceType)) { IResource resource = proxy.requestResource(); ITernFile file = TernResourcesManager.getTernFile(resource); resources.add(new JSFileScriptResource(scriptPath.getOwnerProject(), file)); } } } return false; } protected boolean isInScope(IPath path, int resourceType) { boolean include = scriptPath.isInScope(path, resourceType); if (reporter != null) { if (include) { reporter.report(path, scriptPath, null, true); } else { reporter.report(path, scriptPath, null, false); } } return include; } private boolean isExcludedFromProject(IPath folderPath, ITernProject ownerProject) { // answer whether the folder should be ignored when walking the project // as a source folder // if (childPath.segmentCount() > 2) return false; // is a subfolder of // a package for (ITernScriptPath scriptPath : ownerProject.getScriptPaths()) { if (scriptPath.getType() == ScriptPathsType.FOLDER) { if (folderPath.equals(((FolderScriptPath) scriptPath).getFullPath())) return true; } } return false; } }