Skip to content

Commit

Permalink
Suppress validation kinds based on file pattern
Browse files Browse the repository at this point in the history
Fixes eclipse#1275

Signed-off-by: azerr <[email protected]>
  • Loading branch information
angelozerr committed Sep 12, 2022
1 parent 1fb2a20 commit 0ba0052
Show file tree
Hide file tree
Showing 21 changed files with 332 additions and 94 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
import org.eclipse.lemminx.customservice.XMLLanguageServerAPI;
import org.eclipse.lemminx.dom.DOMDocument;
import org.eclipse.lemminx.extensions.contentmodel.settings.ContentModelSettings;
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationSettings;
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationRootSettings;
import org.eclipse.lemminx.logs.LogHelper;
import org.eclipse.lemminx.services.IXMLDocumentProvider;
import org.eclipse.lemminx.services.IXMLNotificationService;
Expand Down Expand Up @@ -222,7 +222,7 @@ private synchronized void updateSettings(Object initOptions, boolean initLogs) {
}
ContentModelSettings cmSettings = ContentModelSettings.getContentModelXMLSettings(initSettings);
if (cmSettings != null) {
XMLValidationSettings validationSettings = cmSettings.getValidation();
XMLValidationRootSettings validationSettings = cmSettings.getValidation();
xmlTextDocumentService.getValidationSettings().merge(validationSettings);

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
import org.eclipse.lemminx.commons.TextDocument;
import org.eclipse.lemminx.dom.DOMDocument;
import org.eclipse.lemminx.dom.DOMParser;
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationSettings;
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationRootSettings;
import org.eclipse.lemminx.services.DocumentSymbolsResult;
import org.eclipse.lemminx.services.SymbolInformationResult;
import org.eclipse.lemminx.services.XMLLanguageService;
Expand Down Expand Up @@ -250,7 +250,8 @@ public CompletableFuture<Either<List<CompletionItem>, CompletionList>> completio
@Override
public CompletableFuture<CompletionItem> resolveCompletionItem(CompletionItem unresolved) {
return computeDOMAsync(unresolved.getData(), (xmlDocument, cancelChecker) -> {
return getXMLLanguageService().resolveCompletionItem(unresolved, xmlDocument, sharedSettings, cancelChecker);
return getXMLLanguageService().resolveCompletionItem(unresolved, xmlDocument, sharedSettings,
cancelChecker);
});
}

Expand Down Expand Up @@ -660,7 +661,8 @@ void validate(DOMDocument xmlDocument, Map<String, Object> validationArgs) throw
cancelChecker.checkCanceled();
getXMLLanguageService().publishDiagnostics(xmlDocument,
params -> xmlLanguageServer.getLanguageClient().publishDiagnostics(params),
(doc) -> triggerValidationFor(doc, TriggeredBy.Other), sharedSettings.getValidationSettings(),
(doc) -> triggerValidationFor(doc, TriggeredBy.Other),
sharedSettings.getValidationSettings(),
validationArgs, cancelChecker);
}

Expand Down Expand Up @@ -704,7 +706,7 @@ public XMLFormattingOptions getSharedFormattingSettings() {
return sharedSettings.getFormattingSettings();
}

public XMLValidationSettings getValidationSettings() {
public XMLValidationRootSettings getValidationSettings() {
return sharedSettings.getValidationSettings();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -363,7 +363,7 @@ private static void warnNoGrammar(DOMDocument document, List<Diagnostic> diagnos
range = new Range(new Position(0, 0), new Position(0, 0));
}
diagnostics.add(new Diagnostic(range, "No grammar constraints (DTD or XML Schema).", severity,
document.getDocumentURI(), XMLSyntaxErrorCode.NoGrammarConstraints.name()));
"xml", XMLSyntaxErrorCode.NoGrammarConstraints.name()));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public class ContentModelSettings {

private XMLFileAssociation[] fileAssociations;

private XMLValidationSettings validation;
private XMLValidationRootSettings validation;

private XMLSymbolsSettings symbols;

Expand Down Expand Up @@ -90,11 +90,11 @@ public static ContentModelSettings getContentModelXMLSettings(Object initializat
return JSONUtility.toModel(initializationOptionsSettings, ContentModelSettings.class);
}

public void setValidation(XMLValidationSettings validation) {
public void setValidation(XMLValidationRootSettings validation) {
this.validation = validation;
}

public XMLValidationSettings getValidation() {
public XMLValidationRootSettings getValidation() {
return validation;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.eclipse.lemminx.extensions.contentmodel.settings;

import org.eclipse.lemminx.settings.PathPatternMatcher;

public class XMLValidationFilter extends XMLValidationSettings {

private String pattern;

private transient PathPatternMatcher matcher;

public boolean matches(String uri) {
if (matcher == null) {
matcher = new PathPatternMatcher();
matcher.setPattern(pattern);
}
return matcher.matches(uri);
}

public String getPattern() {
return pattern;
}

public void setPattern(String pattern) {
this.pattern = pattern;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/**
* Copyright (c) 2019 Red Hat Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Red Hat Inc. - initial API and implementation
*/
package org.eclipse.lemminx.extensions.contentmodel.settings;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
* XMLValidationSettings
*/
public class XMLValidationRootSettings extends XMLValidationSettings {

private static final XMLValidationFilter[] DEFAULT_FILTERS;

private XMLValidationFilter[] filters;

static {
DEFAULT_FILTERS = createDefaultFilters();
}

public XMLValidationRootSettings() {
super();
setFilters(DEFAULT_FILTERS);
}

public XMLValidationFilter[] getFilters() {
return filters;
}

public void setFilters(XMLValidationFilter[] filters) {
this.filters = filters;
}

public XMLValidationSettings getValidationSettings(String uri) {
if (filters != null) {
for (XMLValidationFilter filter : filters) {
if (filter.matches(uri)) {
return filter;
}
}
}
return this;
}

public XMLValidationRootSettings merge(XMLValidationRootSettings settings) {
if (settings != null) {
this.filters = settings.getFilters();
}
super.merge(settings);
return this;
}

@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + Arrays.hashCode(filters);
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
XMLValidationRootSettings other = (XMLValidationRootSettings) obj;
return Arrays.equals(filters, other.filters);
}

private static XMLValidationFilter[] createDefaultFilters() {
List<XMLValidationFilter> filters = new ArrayList<>();
// Ignore validation for Eclipse '*.exsd' files
XMLValidationFilter filter = new XMLValidationFilter();
filter.setEnabled(false);
filter.setPattern("**.exsd");
filters.add(filter);
// Don't warn that XML file have no grammar for Eclipse '.project',
// '.classpath',
// 'plugin.xml', 'feature.xml' files
filter = new XMLValidationFilter();
filter.setNoGrammar("ignore");
filter.setPattern("**{.project,.classpath,plugin.xml,feature.xml}");
filters.add(filter);
return filters.toArray(new XMLValidationFilter[filters.size()]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.eclipse.lemminx.customservice.AutoCloseTagResponse;
import org.eclipse.lemminx.dom.DOMDocument;
import org.eclipse.lemminx.dom.DOMParser;
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationRootSettings;
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationSettings;
import org.eclipse.lemminx.services.extensions.XMLExtensionsRegistry;
import org.eclipse.lemminx.services.extensions.diagnostics.DiagnosticsResult;
Expand Down Expand Up @@ -174,12 +175,13 @@ public List<Diagnostic> doDiagnostics(DOMDocument xmlDocument, XMLValidationSett

public CompletableFuture<Path> publishDiagnostics(DOMDocument xmlDocument,
Consumer<PublishDiagnosticsParams> publishDiagnostics, Consumer<TextDocument> triggerValidation,
XMLValidationSettings validationSettings, Map<String, Object> validationArgs, CancelChecker cancelChecker) {
XMLValidationRootSettings validationSettings, Map<String, Object> validationArgs, CancelChecker cancelChecker) {
String uri = xmlDocument.getDocumentURI();
TextDocument document = xmlDocument.getTextDocument();

XMLValidationSettings validationSettingsForUri = validationSettings.getValidationSettings(xmlDocument.getDocumentURI());

// Process validation
DiagnosticsResult diagnostics = (DiagnosticsResult) this.doDiagnostics(xmlDocument, validationSettings,
DiagnosticsResult diagnostics = (DiagnosticsResult) this.doDiagnostics(xmlDocument, validationSettingsForUri,
validationArgs, cancelChecker);
cancelChecker.checkCanceled();
publishDiagnostics.accept(new PublishDiagnosticsParams(uri, diagnostics));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
*******************************************************************************/
package org.eclipse.lemminx.settings;

import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationRootSettings;
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationSettings;

/**
Expand All @@ -21,7 +22,7 @@ public class SharedSettings {
private final XMLCompletionSettings completionSettings;
private final XMLFoldingSettings foldingSettings;
private final XMLFormattingOptions formattingSettings;
private final XMLValidationSettings validationSettings;
private final XMLValidationRootSettings validationSettings;
private final XMLSymbolSettings symbolSettings;

private final XMLCodeActionSettings codeActionSettings;
Expand All @@ -37,7 +38,7 @@ public SharedSettings() {
this.completionSettings = new XMLCompletionSettings();
this.foldingSettings = new XMLFoldingSettings();
this.formattingSettings = new XMLFormattingOptions(true);
this.validationSettings = new XMLValidationSettings();
this.validationSettings = new XMLValidationRootSettings();
this.symbolSettings = new XMLSymbolSettings();
this.codeActionSettings = new XMLCodeActionSettings();
this.codeLensSettings = new XMLCodeLensSettings();
Expand Down Expand Up @@ -75,7 +76,7 @@ public XMLFormattingOptions getFormattingSettings() {
return formattingSettings;
}

public XMLValidationSettings getValidationSettings() {
public XMLValidationRootSettings getValidationSettings() {
return validationSettings;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
import org.eclipse.lemminx.extensions.contentmodel.settings.ContentModelSettings;
import org.eclipse.lemminx.extensions.contentmodel.settings.SchemaEnabled;
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLSchemaSettings;
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationSettings;
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationRootSettings;
import org.eclipse.lemminx.extensions.generators.FileContentGeneratorManager;
import org.eclipse.lemminx.extensions.generators.FileContentGeneratorSettings;
import org.eclipse.lemminx.services.XMLLanguageService;
Expand Down Expand Up @@ -612,7 +612,7 @@ public static void testDiagnosticsFor(String xml, String catalogPath, Consumer<X
String fileURI, boolean filter, Diagnostic... expected) {
ContentModelSettings settings = new ContentModelSettings();
settings.setUseCache(false);
XMLValidationSettings problems = new XMLValidationSettings();
XMLValidationRootSettings problems = new XMLValidationRootSettings();
problems.setNoGrammar("ignore");
settings.setValidation(problems);
if (catalogPath != null) {
Expand Down Expand Up @@ -717,10 +717,10 @@ public static Range r(int startLine, int startCharacter, int endLine, int endCha
public static ContentModelSettings getContentModelSettings(boolean isEnabled, SchemaEnabled schemaEnabled) {
ContentModelSettings settings = new ContentModelSettings();
settings.setUseCache(false);
XMLValidationSettings problems = new XMLValidationSettings();
XMLValidationRootSettings problems = new XMLValidationRootSettings();
problems.setNoGrammar("ignore");
settings.setValidation(problems);
XMLValidationSettings diagnostics = new XMLValidationSettings();
XMLValidationRootSettings diagnostics = new XMLValidationRootSettings();
diagnostics.setEnabled(isEnabled);
XMLSchemaSettings schemaSettings = new XMLSchemaSettings();
schemaSettings.setEnabled(schemaEnabled);
Expand All @@ -736,12 +736,12 @@ public static void testPublishDiagnosticsFor(String xml, String fileURI, Consume
testPublishDiagnosticsFor(xml, fileURI, null, configuration, expected);
}

public static void testPublishDiagnosticsFor(String xml, String fileURI, XMLValidationSettings validationSettings,
public static void testPublishDiagnosticsFor(String xml, String fileURI, XMLValidationRootSettings validationSettings,
PublishDiagnosticsParams... expected) {
testPublishDiagnosticsFor(xml, fileURI, validationSettings, (Consumer<XMLLanguageService>) null, expected);
}

public static void testPublishDiagnosticsFor(String xml, String fileURI, XMLValidationSettings validationSettings,
public static void testPublishDiagnosticsFor(String xml, String fileURI, XMLValidationRootSettings validationSettings,
Consumer<XMLLanguageService> configuration, PublishDiagnosticsParams... expected) {
XMLLanguageService xmlLanguageService = new XMLLanguageService();
if (configuration != null) {
Expand All @@ -756,7 +756,7 @@ public static void testPublishDiagnosticsFor(String xml, String fileURI, XMLLang
testPublishDiagnosticsFor(xml, fileURI, null, xmlLanguageService, expected);
}

public static void testPublishDiagnosticsFor(String xml, String fileURI, XMLValidationSettings validationSettings,
public static void testPublishDiagnosticsFor(String xml, String fileURI, XMLValidationRootSettings validationSettings,
XMLLanguageService xmlLanguageService, PublishDiagnosticsParams... expected) {
List<PublishDiagnosticsParams> actual = new ArrayList<>();

Expand Down Expand Up @@ -797,7 +797,7 @@ public static void publishDiagnostics(DOMDocument xmlDocument, List<PublishDiagn
publishDiagnostics(xmlDocument, null, actual, languageService);
}

public static void publishDiagnostics(DOMDocument xmlDocument, XMLValidationSettings validationSettings,
public static void publishDiagnostics(DOMDocument xmlDocument, XMLValidationRootSettings validationSettings,
List<PublishDiagnosticsParams> actual, XMLLanguageService languageService) {
CompletableFuture<Path> error = languageService.publishDiagnostics(xmlDocument, params -> {
actual.add(params);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
import org.eclipse.lemminx.extensions.contentmodel.participants.DTDErrorCode;
import org.eclipse.lemminx.extensions.contentmodel.participants.XMLSyntaxErrorCode;
import org.eclipse.lemminx.extensions.contentmodel.settings.ContentModelSettings;
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationSettings;
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationRootSettings;
import org.eclipse.lemminx.services.XMLLanguageService;
import org.eclipse.lsp4j.Diagnostic;
import org.eclipse.lsp4j.DiagnosticRelatedInformation;
Expand Down Expand Up @@ -395,7 +395,7 @@ public void testDTDNotFoundWithEntitySYSTEMAndResolve() throws Exception {
" <\r\n" + // [2]
"</root-element>";
ContentModelSettings settings = new ContentModelSettings();
XMLValidationSettings validation = new XMLValidationSettings();
XMLValidationRootSettings validation = new XMLValidationRootSettings();
validation.setResolveExternalEntities(true);
settings.setValidation(validation);

Expand Down Expand Up @@ -471,7 +471,7 @@ public void MSG_SPACE_REQUIRED_BEFORE_ENTITY_NAME_IN_ENTITYDECL() throws Excepti
public void diagnosticRelatedInformationWithDOCTYPE() throws Exception {
ContentModelSettings settings = new ContentModelSettings();
settings.setUseCache(true);
XMLValidationSettings validationSettings = new XMLValidationSettings();
XMLValidationRootSettings validationSettings = new XMLValidationRootSettings();
validationSettings.setCapabilities(new PublishDiagnosticsCapabilities(true)); // with related information
settings.setValidation(validationSettings);

Expand Down Expand Up @@ -505,7 +505,7 @@ public void diagnosticRelatedInformationWithDOCTYPE() throws Exception {
public void diagnosticRelatedInformationWithXMLModel() throws Exception {
ContentModelSettings settings = new ContentModelSettings();
settings.setUseCache(true);
XMLValidationSettings validationSettings = new XMLValidationSettings();
XMLValidationRootSettings validationSettings = new XMLValidationRootSettings();
validationSettings.setCapabilities(new PublishDiagnosticsCapabilities(true)); // with related information
settings.setValidation(validationSettings);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import org.eclipse.lemminx.extensions.contentmodel.participants.DTDErrorCode;
import org.eclipse.lemminx.extensions.contentmodel.participants.XMLSyntaxErrorCode;
import org.eclipse.lemminx.extensions.contentmodel.settings.ContentModelSettings;
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationSettings;
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationRootSettings;
import org.eclipse.lsp4j.Diagnostic;
import org.junit.jupiter.api.Test;

Expand Down Expand Up @@ -111,7 +111,7 @@ public void doctypeNotAllowed() throws Exception {
private static void testDiagnosticsDisallowDocTypeDecl(String xml, Diagnostic diagnostic) {
ContentModelSettings settings = new ContentModelSettings();
settings.setUseCache(false);
XMLValidationSettings validationSettings = new XMLValidationSettings();
XMLValidationRootSettings validationSettings = new XMLValidationRootSettings();
validationSettings.setDisallowDocTypeDecl(true);
settings.setValidation(validationSettings);

Expand Down
Loading

0 comments on commit 0ba0052

Please sign in to comment.