Skip to content

Commit 980c5db

Browse files
committed
Fix:Feature request: extend "microprofile(unknown)" to detect references
from property files See redhat-developer/vscode-microprofile#600 Signed-off-by: azerr <azerr@redhat.com>
1 parent 71183fe commit 980c5db

5 files changed

Lines changed: 72 additions & 51 deletions

File tree

microprofile.ls/org.eclipse.lsp4mp.ls/src/main/java/org/eclipse/lsp4mp/services/properties/PropertiesFileValidator.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class PropertiesFileValidator {
7070
private final Map<String, Property> potentiallyUnknownProperties;
7171
private Set<String> declaredProperties;
7272
private Map<String, ItemMetadata> availableProperties;
73+
private Set<String> referencedProperties;
7374

7475
private ValidationKeyContext validationKeyContext;
7576
private ValidationValueContext validationValueContext;
@@ -87,6 +88,7 @@ public PropertiesFileValidator(MicroProfileProjectInfo projectInfo, List<Diagnos
8788
// to be lazily init
8889
this.declaredProperties = null;
8990
this.availableProperties = null;
91+
this.referencedProperties = null;
9092
}
9193

9294
public void validate(PropertiesModel document, CancelChecker cancelChecker) {
@@ -427,10 +429,15 @@ private void addDiagnosticsForRequiredIfNoValue(String propertyName, DiagnosticS
427429

428430
private void addDiagnosticsForUnknownProperties() {
429431
// Properties that are referenced in expressions have already been removed from potentiallyUnknownProperties
432+
// or are in referencedProperties set
430433
potentiallyUnknownProperties.forEach((propertyName, property) -> {
434+
// Skip properties that are referenced in expressions (they may have been added after initialization)
435+
if (referencedProperties != null && referencedProperties.contains(propertyName)) {
436+
return;
437+
}
431438
DiagnosticSeverity severity = validationSettings.getUnknown().getDiagnosticSeverity(propertyName);
432439
if (severity != null) {
433-
addDiagnostic("Unrecognized property '" + propertyName + "', it is not referenced in any Java files",
440+
addDiagnostic("Unrecognized property '" + propertyName + "', it is not referenced in any Java, Properties files",
434441
property.getKey(), severity, ValidationType.unknown.name());
435442
}
436443
});
@@ -441,10 +448,12 @@ private void addDiagnosticsForUnknownProperties() {
441448
* Collects:
442449
* - declaredProperties: all property names defined in the file
443450
* - availableProperties: all properties from project metadata
451+
* - referencedProperties: all properties referenced in expressions
444452
* Also removes referenced properties from potentiallyUnknownProperties
445453
*/
446454
private void initializePropertiesCollections(PropertiesModel model) {
447455
declaredProperties = new java.util.HashSet<>();
456+
referencedProperties = new java.util.HashSet<>();
448457

449458
// Single pass to collect declared properties and remove referenced ones from potentially unknown
450459
for (Node node : model.getChildren()) {
@@ -453,12 +462,14 @@ private void initializePropertiesCollections(PropertiesModel model) {
453462
// Collect declared property
454463
declaredProperties.add(prop.getPropertyNameWithProfile());
455464

456-
// Remove referenced properties from potentiallyUnknownProperties
465+
// Collect and remove referenced properties from potentiallyUnknownProperties
457466
if (prop.getValue() != null) {
458467
for (Node child : prop.getValue().getChildren()) {
459468
if (child.getNodeType() == NodeType.PROPERTY_VALUE_EXPRESSION) {
460469
PropertyValueExpression expr = (PropertyValueExpression) child;
461-
potentiallyUnknownProperties.remove(expr.getReferencedPropertyName());
470+
String referencedProp = expr.getReferencedPropertyName();
471+
referencedProperties.add(referencedProp);
472+
potentiallyUnknownProperties.remove(referencedProp);
462473
}
463474
}
464475
}

microprofile.ls/org.eclipse.lsp4mp.ls/src/test/java/org/eclipse/lsp4mp/extensions/sysenv/SysEnvDiagnosticsTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public void sysemPropertyInKey() {
3535
// dbuser doesn't exists a System property
3636
String value = "dbuser = FOO";
3737
testDiagnosticsFor(value, //
38-
d(0, 0, 6, "Unrecognized property 'dbuser', it is not referenced in any Java files",
38+
d(0, 0, 6, "Unrecognized property 'dbuser', it is not referenced in any Java, Properties files",
3939
DiagnosticSeverity.Warning, ValidationType.unknown));
4040

4141
// user.name exists as System property
@@ -61,7 +61,7 @@ public void environmentVariableInKey() {
6161
// DBUSER doesn't exists a Environment variable
6262
String value = "DBUSER = FOO";
6363
testDiagnosticsFor(value, //
64-
d(0, 0, 6, "Unrecognized property 'DBUSER', it is not referenced in any Java files",
64+
d(0, 0, 6, "Unrecognized property 'DBUSER', it is not referenced in any Java, Properties files",
6565
DiagnosticSeverity.Warning, ValidationType.unknown));
6666

6767
// PATH exists as Environment variable

microprofile.ls/org.eclipse.lsp4mp.ls/src/test/java/org/eclipse/lsp4mp/services/properties/PropertiesFileCodeActionsTest.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public void codeActionsForUnknownProperties() throws BadLocationException {
4545
"\n" + //
4646
"";
4747
Diagnostic d = d(1, 0, 23,
48-
"Unrecognized property 'quarkus.application.nme', it is not referenced in any Java files",
48+
"Unrecognized property 'quarkus.application.nme', it is not referenced in any Java, Properties files",
4949
DiagnosticSeverity.Warning, ValidationType.unknown);
5050

5151
testDiagnosticsFor(value, d);
@@ -65,22 +65,22 @@ public void codeActionsForUnknownPropertiesParentKey() throws BadLocationExcepti
6565
"abcdefghij.readiness-probe.initial-delay-seconds=20\n" + //
6666
"abcdefghij.readiness-probe.period-seconds=45";
6767

68-
Diagnostic d1 = d(0, 0, 16, "Unrecognized property 'abcdefghij.group', it is not referenced in any Java files",
68+
Diagnostic d1 = d(0, 0, 16, "Unrecognized property 'abcdefghij.group', it is not referenced in any Java, Properties files",
6969
DiagnosticSeverity.Warning, ValidationType.unknown);
7070
Diagnostic d2 = d(1, 0, 19,
71-
"Unrecognized property 'abcdefghij.registry', it is not referenced in any Java files",
71+
"Unrecognized property 'abcdefghij.registry', it is not referenced in any Java, Properties files",
7272
DiagnosticSeverity.Warning, ValidationType.unknown);
7373
Diagnostic d3 = d(2, 0, 24,
74-
"Unrecognized property 'abcdefghij.labels[0].key', it is not referenced in any Java files",
74+
"Unrecognized property 'abcdefghij.labels[0].key', it is not referenced in any Java, Properties files",
7575
DiagnosticSeverity.Warning, ValidationType.unknown);
7676
Diagnostic d4 = d(3, 0, 26,
77-
"Unrecognized property 'abcdefghij.labels[0].value', it is not referenced in any Java files",
77+
"Unrecognized property 'abcdefghij.labels[0].value', it is not referenced in any Java, Properties files",
7878
DiagnosticSeverity.Warning, ValidationType.unknown);
7979
Diagnostic d5 = d(4, 0, 48,
80-
"Unrecognized property 'abcdefghij.readiness-probe.initial-delay-seconds', it is not referenced in any Java files",
80+
"Unrecognized property 'abcdefghij.readiness-probe.initial-delay-seconds', it is not referenced in any Java, Properties files",
8181
DiagnosticSeverity.Warning, ValidationType.unknown);
8282
Diagnostic d6 = d(5, 0, 41,
83-
"Unrecognized property 'abcdefghij.readiness-probe.period-seconds', it is not referenced in any Java files",
83+
"Unrecognized property 'abcdefghij.readiness-probe.period-seconds', it is not referenced in any Java, Properties files",
8484
DiagnosticSeverity.Warning, ValidationType.unknown);
8585

8686
testDiagnosticsFor(value, d1, d2, d3, d4, d5, d6);
@@ -107,9 +107,9 @@ public void codeActionsForUnknownPropertiesParentKey2() throws BadLocationExcept
107107
String value = "a.b.c.d=123\n" + //
108108
"a.c.d=123";
109109

110-
Diagnostic d1 = d(0, 0, 7, "Unrecognized property 'a.b.c.d', it is not referenced in any Java files",
110+
Diagnostic d1 = d(0, 0, 7, "Unrecognized property 'a.b.c.d', it is not referenced in any Java, Properties files",
111111
DiagnosticSeverity.Warning, ValidationType.unknown);
112-
Diagnostic d2 = d(1, 0, 5, "Unrecognized property 'a.c.d', it is not referenced in any Java files",
112+
Diagnostic d2 = d(1, 0, 5, "Unrecognized property 'a.c.d', it is not referenced in any Java, Properties files",
113113
DiagnosticSeverity.Warning, ValidationType.unknown);
114114

115115
testDiagnosticsFor(value, d1, d2);
@@ -126,7 +126,7 @@ public void codeActionsForUnknownPropertiesParentKey3() throws BadLocationExcept
126126

127127
String value = "quarkus.a.b.c.d=123";
128128

129-
Diagnostic d = d(0, 0, 15, "Unrecognized property 'quarkus.a.b.c.d', it is not referenced in any Java files",
129+
Diagnostic d = d(0, 0, 15, "Unrecognized property 'quarkus.a.b.c.d', it is not referenced in any Java, Properties files",
130130
DiagnosticSeverity.Warning, ValidationType.unknown);
131131

132132
testDiagnosticsFor(value, d);
@@ -140,7 +140,7 @@ public void codeActionsForUnknownPropertiesParentKey4() throws BadLocationExcept
140140

141141
String value = "a.b.c.d=123";
142142

143-
Diagnostic d1 = d(0, 0, 7, "Unrecognized property 'a.b.c.d', it is not referenced in any Java files",
143+
Diagnostic d1 = d(0, 0, 7, "Unrecognized property 'a.b.c.d', it is not referenced in any Java, Properties files",
144144
DiagnosticSeverity.Warning, ValidationType.unknown);
145145

146146
testDiagnosticsFor(value, d1);

microprofile.ls/org.eclipse.lsp4mp.ls/src/test/java/org/eclipse/lsp4mp/services/properties/PropertiesFileDiagnosticsTest.java

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,10 @@ public void validateUnknownProperties() throws BadLocationException {
5858
"\n" + //
5959
"";
6060
testDiagnosticsFor(value, getDefaultMicroProfileProjectInfo(),
61-
d(8, 0, 16, "Unrecognized property 'unknown.property', it is not referenced in any Java files",
61+
d(8, 0, 16, "Unrecognized property 'unknown.property', it is not referenced in any Java, Properties files",
6262
DiagnosticSeverity.Warning, ValidationType.unknown), //
6363
d(10, 0, 53,
64-
"Unrecognized property 'quarkus.log.category.XXXXXXXXXXXXX.YYYYYYYYYYYY.level', it is not referenced in any Java files",
64+
"Unrecognized property 'quarkus.log.category.XXXXXXXXXXXXX.YYYYYYYYYYYY.level', it is not referenced in any Java, Properties files",
6565
DiagnosticSeverity.Warning, ValidationType.unknown));
6666
}
6767

@@ -77,7 +77,7 @@ public void validateUnknownPropertyMissingEquals() throws BadLocationException {
7777
testDiagnosticsFor(value, getDefaultMicroProfileProjectInfo(),
7878
d(0, 0, 16, "Missing equals sign after 'unknown.property'", DiagnosticSeverity.Error,
7979
ValidationType.syntax),
80-
d(0, 0, 16, "Unrecognized property 'unknown.property', it is not referenced in any Java files",
80+
d(0, 0, 16, "Unrecognized property 'unknown.property', it is not referenced in any Java, Properties files",
8181
DiagnosticSeverity.Warning, ValidationType.unknown));
8282
}
8383

@@ -106,10 +106,10 @@ public void validateUnknownPropertiesAsError() throws BadLocationException {
106106
settings.setUnknown(unknown);
107107

108108
testDiagnosticsFor(value, getDefaultMicroProfileProjectInfo(), settings,
109-
d(8, 0, 16, "Unrecognized property 'unknown.property', it is not referenced in any Java files",
109+
d(8, 0, 16, "Unrecognized property 'unknown.property', it is not referenced in any Java, Properties files",
110110
DiagnosticSeverity.Error, ValidationType.unknown), //
111111
d(10, 0, 53,
112-
"Unrecognized property 'quarkus.log.category.XXXXXXXXXXXXX.YYYYYYYYYYYY.level', it is not referenced in any Java files",
112+
"Unrecognized property 'quarkus.log.category.XXXXXXXXXXXXX.YYYYYYYYYYYY.level', it is not referenced in any Java, Properties files",
113113
DiagnosticSeverity.Error, ValidationType.unknown));
114114
}
115115

@@ -139,7 +139,7 @@ public void validateUnknownPropertiesExcluded() throws BadLocationException {
139139
settings.setUnknown(unknown);
140140

141141
testDiagnosticsFor(value, 1, getDefaultMicroProfileProjectInfo(), settings, d(10, 0, 53,
142-
"Unrecognized property 'quarkus.log.category.XXXXXXXXXXXXX.YYYYYYYYYYYY.level', it is not referenced in any Java files",
142+
"Unrecognized property 'quarkus.log.category.XXXXXXXXXXXXX.YYYYYYYYYYYY.level', it is not referenced in any Java, Properties files",
143143
DiagnosticSeverity.Error, ValidationType.unknown));
144144
}
145145

@@ -158,15 +158,15 @@ public void validateUnknownPropertiesExcludedWithPattern() throws BadLocationExc
158158
// com.mycompany.remoteServices.MyServiceClient/mp-rest/url is ignored
159159
unknown.setExcluded(Arrays.asList("*/mp-rest/url"));
160160
testDiagnosticsFor(value, 2, getDefaultMicroProfileProjectInfo(), settings, d(1, 0, 56,
161-
"Unrecognized property 'com.mycompany.remoteServices.MyServiceClient/mp-rest/uri', it is not referenced in any Java files",
161+
"Unrecognized property 'com.mycompany.remoteServices.MyServiceClient/mp-rest/uri', it is not referenced in any Java, Properties files",
162162
DiagnosticSeverity.Error, ValidationType.unknown),
163-
d(2, 0, 17, "Unrecognized property 'com.mycompany.foo', it is not referenced in any Java files",
163+
d(2, 0, 17, "Unrecognized property 'com.mycompany.foo', it is not referenced in any Java, Properties files",
164164
DiagnosticSeverity.Error, ValidationType.unknown));
165165

166166
// */mp-rest/* pattern --> all errors containing path 'mp-rest' are ignored
167167
unknown.setExcluded(Arrays.asList("*/mp-rest/*"));
168168
testDiagnosticsFor(value, 1, getDefaultMicroProfileProjectInfo(), settings,
169-
d(2, 0, 17, "Unrecognized property 'com.mycompany.foo', it is not referenced in any Java files",
169+
d(2, 0, 17, "Unrecognized property 'com.mycompany.foo', it is not referenced in any Java, Properties files",
170170
DiagnosticSeverity.Error, ValidationType.unknown));
171171

172172
value = "com.mycompany.remoteServices.MyServiceClient/mp-rest/url/foo=url\n" + //
@@ -183,63 +183,63 @@ public void validateUnknownPropertiesExcludedWithPattern() throws BadLocationExc
183183
// errors are ignored
184184
unknown.setExcluded(Arrays.asList("com.mycompany.remoteServices.MyServiceClient/**/"));
185185
testDiagnosticsFor(value, 3, getDefaultMicroProfileProjectInfo(), settings, d(2, 0, 58,
186-
"Unrecognized property 'com.mycompany.remoteServices.MyOtherClient/mp-rest/url/foo', it is not referenced in any Java files",
186+
"Unrecognized property 'com.mycompany.remoteServices.MyOtherClient/mp-rest/url/foo', it is not referenced in any Java, Properties files",
187187
DiagnosticSeverity.Error, ValidationType.unknown),
188188
d(3, 0, 58,
189-
"Unrecognized property 'com.mycompany.remoteServices.MyOtherClient/mp-rest/uri/bar', it is not referenced in any Java files",
189+
"Unrecognized property 'com.mycompany.remoteServices.MyOtherClient/mp-rest/uri/bar', it is not referenced in any Java, Properties files",
190190
DiagnosticSeverity.Error, ValidationType.unknown),
191-
d(4, 0, 17, "Unrecognized property 'com.mycompany.foo', it is not referenced in any Java files",
191+
d(4, 0, 17, "Unrecognized property 'com.mycompany.foo', it is not referenced in any Java, Properties files",
192192
DiagnosticSeverity.Error, ValidationType.unknown));
193193

194194
// com.mycompany.remoteServices.MyServiceClient/**/foo --> all errors
195195
// for 'MyServiceClient' properties ending with path 'foo' are ignored
196196
unknown.setExcluded(Arrays.asList("com.mycompany.remoteServices.MyServiceClient/**/foo"));
197197
testDiagnosticsFor(value, 4, getDefaultMicroProfileProjectInfo(), settings, d(1, 0, 60,
198-
"Unrecognized property 'com.mycompany.remoteServices.MyServiceClient/mp-rest/uri/bar', it is not referenced in any Java files",
198+
"Unrecognized property 'com.mycompany.remoteServices.MyServiceClient/mp-rest/uri/bar', it is not referenced in any Java, Properties files",
199199
DiagnosticSeverity.Error, ValidationType.unknown),
200200
d(2, 0, 58,
201-
"Unrecognized property 'com.mycompany.remoteServices.MyOtherClient/mp-rest/url/foo', it is not referenced in any Java files",
201+
"Unrecognized property 'com.mycompany.remoteServices.MyOtherClient/mp-rest/url/foo', it is not referenced in any Java, Properties files",
202202
DiagnosticSeverity.Error, ValidationType.unknown),
203203
d(3, 0, 58,
204-
"Unrecognized property 'com.mycompany.remoteServices.MyOtherClient/mp-rest/uri/bar', it is not referenced in any Java files",
204+
"Unrecognized property 'com.mycompany.remoteServices.MyOtherClient/mp-rest/uri/bar', it is not referenced in any Java, Properties files",
205205
DiagnosticSeverity.Error, ValidationType.unknown),
206-
d(4, 0, 17, "Unrecognized property 'com.mycompany.foo', it is not referenced in any Java files",
206+
d(4, 0, 17, "Unrecognized property 'com.mycompany.foo', it is not referenced in any Java, Properties files",
207207
DiagnosticSeverity.Error, ValidationType.unknown));
208208

209209
// com.mycompany.*/**/foo --> all errors for properties
210210
// ending with path 'foo' are ignored
211211
unknown.setExcluded(Arrays.asList("com.mycompany.*/**/foo"));
212212
testDiagnosticsFor(value, 3, getDefaultMicroProfileProjectInfo(), settings, d(1, 0, 60,
213-
"Unrecognized property 'com.mycompany.remoteServices.MyServiceClient/mp-rest/uri/bar', it is not referenced in any Java files",
213+
"Unrecognized property 'com.mycompany.remoteServices.MyServiceClient/mp-rest/uri/bar', it is not referenced in any Java, Properties files",
214214
DiagnosticSeverity.Error, ValidationType.unknown),
215215
d(3, 0, 58,
216-
"Unrecognized property 'com.mycompany.remoteServices.MyOtherClient/mp-rest/uri/bar', it is not referenced in any Java files",
216+
"Unrecognized property 'com.mycompany.remoteServices.MyOtherClient/mp-rest/uri/bar', it is not referenced in any Java, Properties files",
217217
DiagnosticSeverity.Error, ValidationType.unknown),
218-
d(4, 0, 17, "Unrecognized property 'com.mycompany.foo', it is not referenced in any Java files",
218+
d(4, 0, 17, "Unrecognized property 'com.mycompany.foo', it is not referenced in any Java, Properties files",
219219
DiagnosticSeverity.Error, ValidationType.unknown));
220220

221221
// com*MyService*/**/foo --> all errors for 'MyService' properties
222222
// ending with path 'foo' are ignored
223223
unknown.setExcluded(Arrays.asList("com*MyService*/**/foo"));
224224
testDiagnosticsFor(value, 4, getDefaultMicroProfileProjectInfo(), settings, d(1, 0, 60,
225-
"Unrecognized property 'com.mycompany.remoteServices.MyServiceClient/mp-rest/uri/bar', it is not referenced in any Java files",
225+
"Unrecognized property 'com.mycompany.remoteServices.MyServiceClient/mp-rest/uri/bar', it is not referenced in any Java, Properties files",
226226
DiagnosticSeverity.Error, ValidationType.unknown),
227227
d(2, 0, 58,
228-
"Unrecognized property 'com.mycompany.remoteServices.MyOtherClient/mp-rest/url/foo', it is not referenced in any Java files",
228+
"Unrecognized property 'com.mycompany.remoteServices.MyOtherClient/mp-rest/url/foo', it is not referenced in any Java, Properties files",
229229
DiagnosticSeverity.Error, ValidationType.unknown),
230230
d(3, 0, 58,
231-
"Unrecognized property 'com.mycompany.remoteServices.MyOtherClient/mp-rest/uri/bar', it is not referenced in any Java files",
231+
"Unrecognized property 'com.mycompany.remoteServices.MyOtherClient/mp-rest/uri/bar', it is not referenced in any Java, Properties files",
232232
DiagnosticSeverity.Error, ValidationType.unknown),
233-
d(4, 0, 17, "Unrecognized property 'com.mycompany.foo', it is not referenced in any Java files",
233+
d(4, 0, 17, "Unrecognized property 'com.mycompany.foo', it is not referenced in any Java, Properties files",
234234
DiagnosticSeverity.Error, ValidationType.unknown));
235235

236236
// *foo --> all errors ending with 'foo' are ignored
237237
unknown.setExcluded(Arrays.asList("*foo"));
238238
testDiagnosticsFor(value, 2, getDefaultMicroProfileProjectInfo(), settings, d(1, 0, 60,
239-
"Unrecognized property 'com.mycompany.remoteServices.MyServiceClient/mp-rest/uri/bar', it is not referenced in any Java files",
239+
"Unrecognized property 'com.mycompany.remoteServices.MyServiceClient/mp-rest/uri/bar', it is not referenced in any Java, Properties files",
240240
DiagnosticSeverity.Error, ValidationType.unknown),
241241
d(3, 0, 58,
242-
"Unrecognized property 'com.mycompany.remoteServices.MyOtherClient/mp-rest/uri/bar', it is not referenced in any Java files",
242+
"Unrecognized property 'com.mycompany.remoteServices.MyOtherClient/mp-rest/uri/bar', it is not referenced in any Java, Properties files",
243243
DiagnosticSeverity.Error, ValidationType.unknown));
244244

245245
// * pattern --> all errors are ignored
@@ -796,7 +796,7 @@ public void validateMultilineKey() {
796796

797797
value = "qu.\\\n" + "application.\\\n" + "name=name";
798798
testDiagnosticsFor(value, getDefaultMicroProfileProjectInfo(), settings, //
799-
d(0, 0, 2, 4, "Unrecognized property 'qu.application.name', it is not referenced in any Java files",
799+
d(0, 0, 2, 4, "Unrecognized property 'qu.application.name', it is not referenced in any Java, Properties files",
800800
DiagnosticSeverity.Warning, ValidationType.unknown));
801801
}
802802

0 commit comments

Comments
 (0)