use of org.eclipse.xtext.validation.Issue in project xtext-eclipse by eclipse.
the class IssueDataTest method testIssueData.
@Test
public void testIssueData() throws Exception {
XtextEditor xtextEditor = newXtextEditor(PROJECT_NAME, MODEL_FILE, MODEL_WITH_LINKING_ERROR);
IXtextDocument document = xtextEditor.getDocument();
IResource file = xtextEditor.getResource();
List<Issue> issues = getIssues(document);
assertEquals(1, issues.size());
Issue issue = issues.get(0);
assertEquals(2, issue.getLineNumber().intValue());
assertEquals(3, issue.getColumn().intValue());
assertEquals(PREFIX.length(), issue.getOffset().intValue());
assertEquals(QuickfixCrossrefTestLanguageValidator.TRIGGER_VALIDATION_ISSUE.length(), issue.getLength().intValue());
String[] expectedIssueData = new String[] { QuickfixCrossrefTestLanguageValidator.ISSUE_DATA_0, QuickfixCrossrefTestLanguageValidator.ISSUE_DATA_1 };
assertTrue(Arrays.equals(expectedIssueData, issue.getData()));
Thread.sleep(1000);
IAnnotationModel annotationModel = xtextEditor.getDocumentProvider().getAnnotationModel(xtextEditor.getEditorInput());
AnnotationIssueProcessor annotationIssueProcessor = new AnnotationIssueProcessor(document, annotationModel, new IssueResolutionProvider.NullImpl());
annotationIssueProcessor.processIssues(issues, new NullProgressMonitor());
Iterator<?> annotationIterator = annotationModel.getAnnotationIterator();
// filter QuickDiffAnnotations
List<Object> allAnnotations = Lists.newArrayList(annotationIterator);
List<XtextAnnotation> annotations = newArrayList(filter(allAnnotations, XtextAnnotation.class));
assertEquals(annotations.toString(), 1, annotations.size());
XtextAnnotation annotation = annotations.get(0);
assertTrue(Arrays.equals(expectedIssueData, annotation.getIssueData()));
IssueUtil issueUtil = new IssueUtil();
Issue issueFromAnnotation = issueUtil.getIssueFromAnnotation(annotation);
assertTrue(Arrays.equals(expectedIssueData, issueFromAnnotation.getData()));
new MarkerCreator().createMarker(issue, file, MarkerTypes.FAST_VALIDATION);
IMarker[] markers = file.findMarkers(MarkerTypes.FAST_VALIDATION, true, IResource.DEPTH_ZERO);
assertEquals(1, markers.length);
String attribute = (String) markers[0].getAttribute(Issue.DATA_KEY);
assertNotNull(attribute);
assertTrue(Arrays.equals(expectedIssueData, Strings.unpack(attribute)));
Issue issueFromMarker = issueUtil.createIssue(markers[0]);
assertEquals(issue.getColumn(), issueFromMarker.getColumn());
assertEquals(issue.getLineNumber(), issueFromMarker.getLineNumber());
assertEquals(issue.getOffset(), issueFromMarker.getOffset());
assertEquals(issue.getLength(), issueFromMarker.getLength());
assertTrue(Arrays.equals(expectedIssueData, issueFromMarker.getData()));
}
use of org.eclipse.xtext.validation.Issue in project xtext-eclipse by eclipse.
the class IssueUtil method createIssue.
/**
* Creates an Issue out of a Marker.
* setSyntaxError is unset since the current API does not allow fixing systax errors anyway.
*
* @param marker The marker to create an issue from
* @return an issue created out of the given marker or <code>null</code>
*/
public Issue createIssue(IMarker marker) {
Issue.IssueImpl issue = new Issue.IssueImpl();
try {
Map<String, Object> attributes = marker.getAttributes();
String markerType = marker.getType();
Object message = attributes.get(IMarker.MESSAGE);
issue.setMessage(message instanceof String ? (String) message : null);
Object lineNumber = attributes.get(IMarker.LINE_NUMBER);
issue.setLineNumber(lineNumber instanceof Integer ? (Integer) lineNumber : null);
Object column = attributes.get(Issue.COLUMN_KEY);
issue.setColumn(column instanceof Integer ? (Integer) column : null);
Object offset = attributes.get(IMarker.CHAR_START);
Object endOffset = attributes.get(IMarker.CHAR_END);
if (offset instanceof Integer && endOffset instanceof Integer) {
issue.setOffset((Integer) offset);
issue.setLength((Integer) endOffset - (Integer) offset);
} else {
issue.setOffset(-1);
issue.setLength(0);
}
Object code = attributes.get(Issue.CODE_KEY);
issue.setCode(code instanceof String ? (String) code : null);
Object data = attributes.get(Issue.DATA_KEY);
issue.setData(data instanceof String ? Strings.unpack((String) data) : null);
Object uri = attributes.get(Issue.URI_KEY);
issue.setUriToProblem(uri instanceof String ? URI.createURI((String) uri) : null);
Object severity = attributes.get(IMarker.SEVERITY);
Severity translatedSeverity = translateSeverity(severity instanceof Integer ? (Integer) severity : 0);
if (translatedSeverity == null)
throw new IllegalArgumentException(marker.toString());
issue.setSeverity(translatedSeverity);
if (markerTypeProvider != null)
issue.setType(markerTypeProvider.getCheckType(markerType));
else
issue.setType(MarkerTypes.toCheckType(markerType));
} catch (CoreException e) {
return null;
}
return issue;
}
use of org.eclipse.xtext.validation.Issue in project xtext-eclipse by eclipse.
the class XtextGrammarQuickfixProviderTest method assertAndApplyAllResolutions.
private void assertAndApplyAllResolutions(XtextEditor xtextEditor, String issueCode, int issueDataCount, int issueCount, String resolutionLabel) throws CoreException {
final Injector injector = createInjector();
InternalBuilderTest.setAutoBuild(true);
if (xtextEditor.isDirty()) {
xtextEditor.doSave(new NullProgressMonitor());
}
InternalBuilderTest.fullBuild();
IXtextDocument document = xtextEditor.getDocument();
validateInEditor(document);
List<Issue> issues = getIssues(document);
assertFalse("Document has no issues, but should.", issues.isEmpty());
issues.iterator().forEachRemaining((issue) -> {
assertEquals(issueCode, issue.getCode());
assertNotNull(issue.getData());
assertEquals(issueDataCount, issue.getData().length);
});
IResource resource = xtextEditor.getResource();
IMarker[] problems = resource.findMarkers(MarkerTypes.FAST_VALIDATION, true, IResource.DEPTH_INFINITE);
assertEquals("Resource should have " + issueCount + " error marker.", issueCount, problems.length);
validateInEditor(document);
MarkerResolutionGenerator instance = injector.getInstance(MarkerResolutionGenerator.class);
List<IMarkerResolution> resolutions = Lists.newArrayList(instance.getResolutions(problems[0]));
assertEquals(1, resolutions.size());
IMarkerResolution resolution = resolutions.iterator().next();
assertTrue(resolution instanceof WorkbenchMarkerResolution);
WorkbenchMarkerResolution workbenchResolution = (WorkbenchMarkerResolution) resolution;
IMarker primaryMarker = problems[0];
List<IMarker> others = Lists.newArrayList(workbenchResolution.findOtherMarkers(problems));
assertFalse(others.contains(primaryMarker));
assertEquals(problems.length - 1, others.size());
others.add(primaryMarker);
workbenchResolution.run(others.toArray(new IMarker[others.size()]), new NullProgressMonitor());
if (xtextEditor.isDirty()) {
xtextEditor.doSave(null);
}
InternalBuilderTest.cleanBuild();
problems = resource.findMarkers(MarkerTypes.FAST_VALIDATION, true, IResource.DEPTH_INFINITE);
assertEquals("Resource should have no error marker.", 0, problems.length);
}
use of org.eclipse.xtext.validation.Issue in project xtext-eclipse by eclipse.
the class AnnotationIssueProcessor method getAnnotationsToAdd.
protected Map<Annotation, Position> getAnnotationsToAdd(Multimap<Position, Annotation> positionToAnnotations, List<Issue> issues, IProgressMonitor monitor) {
if (monitor.isCanceled()) {
return HashBiMap.create();
}
Map<Annotation, Position> annotationToPosition = Maps.newHashMapWithExpectedSize(issues.size());
for (Issue issue : issues) {
if (monitor.isCanceled()) {
return annotationToPosition;
}
if (isSet(issue.getOffset()) && isSet(issue.getLength()) && issue.getMessage() != null) {
String type = lookup.getAnnotationType(EValidator.MARKER, getMarkerSeverity(issue.getSeverity()));
boolean isQuickfixable = false;
if (issueResolutionProvider instanceof IssueResolutionProviderExtension) {
isQuickfixable = ((IssueResolutionProviderExtension) issueResolutionProvider).hasResolutionFor(issue);
} else {
isQuickfixable = issueResolutionProvider.hasResolutionFor(issue.getCode());
}
Annotation annotation = new XtextAnnotation(type, false, xtextDocument, issue, isQuickfixable);
if (issue.getOffset() < 0 || issue.getLength() < 0) {
LOG.error("Invalid annotation position offset=" + issue.getOffset() + " length = " + issue.getLength());
}
Position position = new Position(Math.max(0, issue.getOffset()), Math.max(0, issue.getLength()));
annotationToPosition.put(annotation, position);
positionToAnnotations.put(position, annotation);
}
}
return annotationToPosition;
}
use of org.eclipse.xtext.validation.Issue in project xtext-eclipse by eclipse.
the class AbstractProblemHoverTest method setUp.
@Override
public void setUp() throws Exception {
super.setUp();
modelAsText = "stuff mystuff\nstuff yourstuff refs _mystuff// Comment";
IFile file = IResourcesSetupUtil.createFile("test/test.testlanguage", modelAsText);
editor = openEditor(file);
document = editor.getDocument();
hover = TestsActivator.getInstance().getInjector(getEditorId()).getInstance(MockHover.class);
hover.setSourceViewer(editor.getInternalSourceViewer());
List<Issue> issues = document.readOnly(new IUnitOfWork<List<Issue>, XtextResource>() {
@Override
public List<Issue> exec(XtextResource state) throws Exception {
return state.getResourceServiceProvider().getResourceValidator().validate(state, CheckMode.ALL, null);
}
});
MarkerCreator markerCreator = TestsActivator.getInstance().getInjector(getEditorId()).getInstance(MarkerCreator.class);
for (Issue issue : issues) {
markerCreator.createMarker(issue, file, MarkerTypes.forCheckType(issue.getType()));
}
}
Aggregations