Search in sources :

Example 6 with Issue

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()));
}
Also used : NullProgressMonitor(org.eclipse.core.runtime.NullProgressMonitor) Issue(org.eclipse.xtext.validation.Issue) XtextEditor(org.eclipse.xtext.ui.editor.XtextEditor) IAnnotationModel(org.eclipse.jface.text.source.IAnnotationModel) IssueUtil(org.eclipse.xtext.ui.util.IssueUtil) AnnotationIssueProcessor(org.eclipse.xtext.ui.editor.validation.AnnotationIssueProcessor) XtextAnnotation(org.eclipse.xtext.ui.editor.validation.XtextAnnotation) IssueResolutionProvider(org.eclipse.xtext.ui.editor.quickfix.IssueResolutionProvider) IMarker(org.eclipse.core.resources.IMarker) MarkerCreator(org.eclipse.xtext.ui.editor.validation.MarkerCreator) IResource(org.eclipse.core.resources.IResource) IXtextDocument(org.eclipse.xtext.ui.editor.model.IXtextDocument) Test(org.junit.Test)

Example 7 with Issue

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;
}
Also used : Issue(org.eclipse.xtext.validation.Issue) CoreException(org.eclipse.core.runtime.CoreException) Severity(org.eclipse.xtext.diagnostics.Severity)

Example 8 with 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);
}
Also used : NullProgressMonitor(org.eclipse.core.runtime.NullProgressMonitor) Issue(org.eclipse.xtext.validation.Issue) MarkerResolutionGenerator(org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator) WorkbenchMarkerResolution(org.eclipse.ui.views.markers.WorkbenchMarkerResolution) IMarkerResolution(org.eclipse.ui.IMarkerResolution) Injector(com.google.inject.Injector) IMarker(org.eclipse.core.resources.IMarker) IResource(org.eclipse.core.resources.IResource) IXtextDocument(org.eclipse.xtext.ui.editor.model.IXtextDocument)

Example 9 with Issue

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;
}
Also used : IssueResolutionProviderExtension(org.eclipse.xtext.ui.editor.quickfix.IssueResolutionProviderExtension) Issue(org.eclipse.xtext.validation.Issue) Position(org.eclipse.jface.text.Position) Annotation(org.eclipse.jface.text.source.Annotation) MarkerAnnotation(org.eclipse.ui.texteditor.MarkerAnnotation)

Example 10 with Issue

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()));
    }
}
Also used : IFile(org.eclipse.core.resources.IFile) Issue(org.eclipse.xtext.validation.Issue) List(java.util.List) XtextResource(org.eclipse.xtext.resource.XtextResource) MarkerCreator(org.eclipse.xtext.ui.editor.validation.MarkerCreator)

Aggregations

Issue (org.eclipse.xtext.validation.Issue)105 Test (org.junit.Test)38 XtextResource (org.eclipse.xtext.resource.XtextResource)33 Resource (org.eclipse.emf.ecore.resource.Resource)21 IResourceValidator (org.eclipse.xtext.validation.IResourceValidator)18 URI (org.eclipse.emf.common.util.URI)16 List (java.util.List)14 XtextResourceSet (org.eclipse.xtext.resource.XtextResourceSet)12 IssueResolution (org.eclipse.xtext.ui.editor.quickfix.IssueResolution)12 XtendFile (org.eclipse.xtend.core.xtend.XtendFile)11 ArrayList (java.util.ArrayList)9 Severity (org.eclipse.xtext.diagnostics.Severity)9 IXtextDocument (org.eclipse.xtext.ui.editor.model.IXtextDocument)9 EObject (org.eclipse.emf.ecore.EObject)8 IOException (java.io.IOException)7 CoreException (org.eclipse.core.runtime.CoreException)7 ResourceSet (org.eclipse.emf.ecore.resource.ResourceSet)7 StringInputStream (org.eclipse.xtext.util.StringInputStream)7 Diagnostic (org.eclipse.emf.ecore.resource.Resource.Diagnostic)6 IssueResolutionAcceptor (org.eclipse.xtext.ui.editor.quickfix.IssueResolutionAcceptor)6