Skip to content

Commit

Permalink
Fix issue #40: Correct error reporting for errors detected during
Browse files Browse the repository at this point in the history
a project build.
  • Loading branch information
vtst committed May 17, 2012
1 parent f66d051 commit 119091d
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 21 deletions.
Expand Up @@ -8,6 +8,8 @@

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.runtime.CoreException;

/**
* An error manager which generates problem markers for reporting errors.
Expand All @@ -24,8 +26,10 @@ public ErrorManagerForFileBuild(JSUnit unit, IFile file) {
}

@Override
protected Iterable<? extends IResource> getResources() {
return fileNameToFile.values();
protected void accept(IResourceVisitor visitor) throws CoreException {
for (IFile file: fileNameToFile.values()) {
file.accept(visitor);
}
}

@Override
Expand Down
@@ -1,11 +1,19 @@
package net.vtst.ow.eclipse.js.closure.builder;

import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import net.vtst.ow.eclipse.js.closure.compiler.ClosureCompiler;
import net.vtst.ow.eclipse.js.closure.compiler.ErrorManagerGeneratingProblemMarkers;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;

/**
* An error manager which generates problem markers for reporting errors.
Expand All @@ -16,19 +24,25 @@ public class ErrorManagerForProjectBuild extends ErrorManagerGeneratingProblemMa
private static final String PROBLEM = "net.vtst.ow.eclipse.js.closure.builder-error";

private IProject project;
// This map is intended to cache files for successive calls to getResource, in order to avoid
// doing multiple resolutions.
private Map<String, IFile> cachedFiles = new HashMap<String, IFile>();

public ErrorManagerForProjectBuild(IProject project) {
this.project = project;
}

@Override
protected Iterable<? extends IResource> getResources() {
return Collections.singleton(project);
protected void accept(IResourceVisitor visitor) throws CoreException {
project.accept(visitor);
}

@Override
protected IResource getResource(String sourceName) {
return project;
if (cachedFiles.containsKey(sourceName)) return cachedFiles.get(sourceName);
IFile file = ClosureCompiler.getFileFromSourceName(sourceName);
cachedFiles.put(sourceName, file);
return file;
}

@Override
Expand Down
Expand Up @@ -24,11 +24,14 @@
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentDescription;
import org.eclipse.core.runtime.content.IContentType;

import com.google.javascript.jscomp.JSError;

/**
* This class implements static methods which are useful for using the Closure Compiler.
* @author Vincent Simonet
Expand Down Expand Up @@ -182,4 +185,19 @@ public static IProject getCommonProject(Iterable<IResource> resources) {
}
return project;
}

/**
* Convert a source name (as returned by the closure compiler in an Error) into an Eclipse IFile.
* @param sourceName The source name to convert.
* @return The corresponding file, or null if not found in the workspace.
*/
public static IFile getFileFromSourceName(String sourceName) {
if (sourceName == null) return null;
IFile[] errorFiles = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI((new File(sourceName)).toURI());
if (errorFiles.length > 0) {
return errorFiles[0];
} else {
return null;
}
}
}
Expand Up @@ -2,6 +2,7 @@

import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.runtime.CoreException;

import com.google.javascript.jscomp.BasicErrorManager;
Expand All @@ -23,16 +24,20 @@ public abstract class ErrorManagerGeneratingProblemMarkers extends BasicErrorMan
* Sub-classes must implement this method to specify the set of resources it manages.
* @return The collection of resources controlled by this error manager.
*/
protected abstract Iterable<? extends IResource> getResources();
protected abstract void accept(IResourceVisitor visitor) throws CoreException;

protected abstract IResource getResource(String sourceName);

private void clearProblemMarkers() throws CoreException {
for (IResource resource: getResources()) {
for (IMarker marker : resource.findMarkers(getMarkerType(), false, 0)) {
marker.delete();
accept(new IResourceVisitor() {
@Override
public boolean visit(IResource resource) throws CoreException {
for (IMarker marker : resource.findMarkers(getMarkerType(), false, 0)) {
marker.delete();
}
return true;
}
}
});
}

@Override
Expand Down
Expand Up @@ -6,6 +6,8 @@
import java.util.HashSet;
import java.util.Set;

import net.vtst.ow.eclipse.js.closure.compiler.ClosureCompiler;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.debug.core.DebugException;
Expand Down Expand Up @@ -90,18 +92,14 @@ private static class ErrorInfo {
IFile file;
String fileName;
ErrorInfo(JSError error) {
if (error.sourceName != null) {
IFile[] errorFiles = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI((new File(error.sourceName)).toURI());
if (errorFiles.length > 0) {
this.file = errorFiles[0];
this.fileName = errorFiles[0].getFullPath().toOSString();
this.error = JSError.make(this.fileName, error.lineNumber, error.getCharno(), error.getDefaultLevel(), error.getType(), error.description);
return;
}
this.file = ClosureCompiler.getFileFromSourceName(error.sourceName);
if (this.file == null) {
this.fileName = null;
this.error = error;
} else {
this.fileName = this.file.getFullPath().toOSString();
this.error = JSError.make(this.fileName, error.lineNumber, error.getCharno(), error.getDefaultLevel(), error.getType(), error.description);
}
this.file = null;
this.fileName = null;
this.error = error;
}
}

Expand Down

0 comments on commit 119091d

Please sign in to comment.