Fixed: [ Issue 54 ] Markers from protoc are added to wrong files
https://code.google.com/p/protobuf-dt/issues/detail?id=54
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/FileStub.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/FileStub.java
index 524c744..d5e6136 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/FileStub.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/FileStub.java
@@ -10,8 +10,7 @@
import static java.util.Collections.*;
-import java.io.InputStream;
-import java.io.Reader;
+import java.io.*;
import java.net.URI;
import java.util.*;
@@ -26,6 +25,7 @@
public class FileStub implements IFile {
private final Map<String, List<MarkerStub>> markersByType = new HashMap<String, List<MarkerStub>>();
+ private IPath location;
/** {@inheritDoc} */
public void accept(IResourceProxyVisitor visitor, int memberFlags) {
@@ -225,7 +225,11 @@
/** {@inheritDoc} */
public IPath getLocation() {
- throw new UnsupportedOperationException();
+ return location;
+ }
+
+ public void setLocation(IPath location) {
+ this.location = location;
}
/** {@inheritDoc} */
@@ -516,8 +520,8 @@
List<MarkerStub> markers = markersByType.get(type);
return (markers == null) ? 0 : markers.size();
}
-
- public List<MarkerStub> markers(String type) {
+
+ public List<MarkerStub> markersOfType(String type) {
List<MarkerStub> markers = markersByType.get(type);
if (markers == null) return emptyList();
return unmodifiableList(markers);
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/builder/ProtocMarkerFactory_createErrorIfNecessary_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/builder/ProtocMarkerFactory_createErrorIfNecessary_Test.java
index 481d40d..ea42a3d 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/builder/ProtocMarkerFactory_createErrorIfNecessary_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/builder/ProtocMarkerFactory_createErrorIfNecessary_Test.java
@@ -15,14 +15,13 @@
import java.util.List;
-import org.eclipse.core.runtime.CoreException;
-import org.junit.Before;
-import org.junit.Test;
+import org.eclipse.core.runtime.*;
+import org.junit.*;
import com.google.eclipse.protobuf.junit.stubs.resources.*;
/**
- * Tests for <code>{@link ProtocMarkerFactory#createErrorIfNecessary(String, int)}</code>.
+ * Tests for <code>{@link ProtocMarkerFactory#createErrorIfNecessary(String, String, int)}</code>.
*
* @author alruiz@google.com (Alex Ruiz)
*/
@@ -33,26 +32,33 @@
private FileStub file;
private MarkerStub fastValidationMarker;
private ProtocMarkerFactory markerFactory;
-
+
@Before public void setUp() throws CoreException {
file = new FileStub();
+ file.setLocation(new Path("home/alex/protos/test1.proto"));
file.createMarker(PROTOC);
fastValidationMarker = error(FAST_VALIDATION, "Expected field name.", 68);
file.addMarker(fastValidationMarker);
markerFactory = new ProtocMarkerFactory(file);
}
-
- @Test public void should_create_marker_if_a_similar_one_does_not_exist() throws CoreException {
+
+ @Test public void should_create_marker_if_file_paths_match_and_a_similar_marker_does_not_exist() throws CoreException {
String message = "File not found.";
int lineNumber = 8;
- markerFactory.createErrorIfNecessary(message, lineNumber);
- List<MarkerStub> markers = file.markers(PROTOC);
+ markerFactory.createErrorIfNecessary("test1.proto", message, lineNumber);
+ List<MarkerStub> markers = file.markersOfType(PROTOC);
assertThat(markers.size(), equalTo(1));
assertThat(markers.get(0), equalTo(error(PROTOC, message, lineNumber)));
}
-
+
+ @Test public void should_not_create_marker_if_given_path_does_not_match_path_in_file() throws CoreException {
+ markerFactory.createErrorIfNecessary("test2.proto", "File not found.", 8);
+ assertThat(file.markerCount(PROTOC), equalTo(0));
+ }
+
@Test public void should_not_create_marker_if_a_similar_one_exists() throws CoreException {
- markerFactory.createErrorIfNecessary(fastValidationMarker.message(), fastValidationMarker.lineNumber());
+ markerFactory.createErrorIfNecessary("test1.proto", fastValidationMarker.message(),
+ fastValidationMarker.lineNumber());
assertThat(file.markerCount(PROTOC), equalTo(0));
}
}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/builder/ProtocOutputParser_parseAndAddMarkerIfNecessary_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/builder/ProtocOutputParser_parseAndAddMarkerIfNecessary_Test.java
index 58d02ea..544eddf 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/builder/ProtocOutputParser_parseAndAddMarkerIfNecessary_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/builder/ProtocOutputParser_parseAndAddMarkerIfNecessary_Test.java
@@ -11,8 +11,7 @@
import static org.mockito.Mockito.*;
import org.eclipse.core.runtime.CoreException;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.*;
/**
* Tests for <code>{@link ProtocOutputParser#parseAndAddMarkerIfNecessary(String, ProtocMarkerFactory)}</code>.
@@ -23,21 +22,21 @@
private ProtocMarkerFactory markerFactory;
private ProtocOutputParser outputParser;
-
+
@Before public void setUp() {
markerFactory = mock(ProtocMarkerFactory.class);
outputParser = new ProtocOutputParser();
}
-
+
@Test public void should_not_create_IMarker_if_line_does_not_match_error_pattern() throws CoreException {
String line = "person.proto: File not found.";
outputParser.parseAndAddMarkerIfNecessary(line, markerFactory);
verifyZeroInteractions(markerFactory);
}
-
+
@Test public void should_attempt_to_create_IMarker_if_line_matches_error_pattern() throws CoreException {
String line = "test.proto:23:21: Expected field name.";
outputParser.parseAndAddMarkerIfNecessary(line, markerFactory);
- verify(markerFactory).createErrorIfNecessary("Expected field name.", 23);
+ verify(markerFactory).createErrorIfNecessary("test.proto", "Expected field name.", 23);
}
}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocMarkerFactory.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocMarkerFactory.java
index 1188d40..5a5fe76 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocMarkerFactory.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocMarkerFactory.java
@@ -12,8 +12,7 @@
import static org.eclipse.core.resources.IResource.DEPTH_INFINITE;
import static org.eclipse.xtext.ui.MarkerTypes.FAST_VALIDATION;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
/**
@@ -34,8 +33,9 @@
markers = file.findMarkers(FAST_VALIDATION, true, DEPTH_INFINITE);
}
- void createErrorIfNecessary(String message, int lineNumber) throws CoreException {
- if (containsMarker(message, lineNumber)) return;
+ void createErrorIfNecessary(String fileName, String message, int lineNumber) throws CoreException {
+ String location = file.getLocation().toOSString();
+ if (!location.endsWith(fileName) || containsMarker(message, lineNumber)) return;
IMarker marker = file.createMarker(PROTOC);
marker.setAttribute(SEVERITY, SEVERITY_ERROR);
marker.setAttribute(MESSAGE, message);
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocOutputParser.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocOutputParser.java
index d4822a2..e1bd06c 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocOutputParser.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocOutputParser.java
@@ -10,8 +10,7 @@
import static java.lang.Integer.parseInt;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import java.util.regex.*;
import org.eclipse.core.runtime.CoreException;
@@ -37,8 +36,9 @@
void parseAndAddMarkerIfNecessary(String line, ProtocMarkerFactory markerFactory) throws CoreException {
Matcher errorMatcher = ERROR_PATTERN.matcher(line);
if (!errorMatcher.matches()) return;
+ String fileName = errorMatcher.group(1);
int lineNumber = parseInt(errorMatcher.group(2));
String message = errorMatcher.group(4);
- markerFactory.createErrorIfNecessary(message, lineNumber);
+ markerFactory.createErrorIfNecessary(fileName, message, lineNumber);
}
}