blob: 868e9a005e07c86613a869c185027bdb17d6314a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2017 xored software, Inc. 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:
* xored software, Inc. - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.internal.core.builder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.dltk.core.IProjectFragment;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.builder.IBuildChange;
import org.eclipse.dltk.core.builder.IProjectChange;
import org.eclipse.dltk.core.builder.IRenameChange;
import org.eclipse.dltk.core.builder.IScriptBuilder;
public class FullBuildChange extends AbstractBuildChange
implements IBuildChange, IResourceVisitor {
public FullBuildChange(IProject project, IProgressMonitor monitor) {
super(project, monitor);
}
@Override
public IResourceDelta getResourceDelta() {
return null;
}
@Override
public List<IPath> getDeletes(int options) {
validateFlags(options, NO_RENAMES);
return Collections.emptyList();
}
@Override
public List<IRenameChange> getRenames() {
return Collections.emptyList();
}
@Override
public List<IFile> getResources(int options) throws CoreException {
validateFlags(options, ALL | NO_RENAMES | ADDED | CHANGED);
if (checkFlag(options, ALL)) {
loadProjectResources();
return Collections.unmodifiableList(projectResources);
} else {
loadSourceModules();
return Collections.unmodifiableList(realResources);
}
}
private void loadProjectResources() throws CoreException {
if (projectResources == null) {
projectResources = new ArrayList<>();
project.accept(this);
}
}
private List<ISourceModule> projectModules = null;
private List<IFile> realResources = null;
@Override
public List<ISourceModule> getSourceModules(int options)
throws CoreException {
validateFlags(options, ADDED | CHANGED);
loadSourceModules();
return Collections.unmodifiableList(projectModules);
}
private void loadSourceModules() throws CoreException {
if (projectModules == null) {
loadProjectResources();
projectModules = new ArrayList<>();
realResources = new ArrayList<>();
locateSourceModules(projectResources, projectModules,
realResources);
}
}
@Override
public int getBuildType() {
return IScriptBuilder.FULL_BUILD;
}
@Override
public void setBuildType(int buildType) {
if (buildType != IScriptBuilder.FULL_BUILD) {
throw new IllegalArgumentException();
}
}
@Override
public boolean isDependencyBuild() {
return false;
}
@Override
public IProjectChange[] getRequiredProjectChanges() {
return NO_PROJECT_CHANGES;
}
private List<IFile> projectResources = null;
@Override
public boolean visit(IResource resource) throws CoreException {
checkCanceled();
if (resource.getType() == IResource.FOLDER) {
monitor.subTask(Messages.ScriptBuilder_scanningProjectFolder
+ resource.getProjectRelativePath().toString());
}
if (resource.getType() == IResource.FILE) {
projectResources.add((IFile) resource);
return false;
}
return true;
}
@Override
public boolean addChangedResource(IFile file) {
return false;
}
@Override
public boolean addChangedResources(Collection<IFile> files)
throws CoreException {
return false;
}
private List<IPath> externalPaths = null;
private Collection<IProjectFragment> externalFragments = null;
private void loadExternalPaths() throws CoreException {
if (externalPaths == null) {
externalPaths = new ArrayList<>();
externalFragments = new ArrayList<>();
final IProjectFragment[] allFragments = getScriptProject()
.getAllProjectFragments();
for (int i = 0; i < allFragments.length; i++) {
final IProjectFragment fragment = allFragments[i];
if (fragment.isExternal()) {
final IPath path = fragment.getPath();
externalPaths.add(path);
externalFragments.add(fragment);
}
}
}
}
@Override
public List<IPath> getExternalPaths(int options) throws CoreException {
validateFlags(options, BEFORE);
if (options == BEFORE) {
return Collections.emptyList();
} else {
loadExternalPaths();
return Collections.unmodifiableList(externalPaths);
}
}
private List<ISourceModule> externalModules = null;
@Override
public List<ISourceModule> getExternalModules(int options)
throws CoreException {
validateFlags(options, DEFAULT);
if (externalModules == null) {
loadExternalPaths();
final ExternalModuleCollector moduleCollector = new ExternalModuleCollector(
monitor);
for (IProjectFragment fragment : externalFragments) {
fragment.accept(moduleCollector);
}
externalModules = unmodifiableList(moduleCollector.elements);
}
return externalModules;
}
}