Skip to content

Commit e1d95d9

Browse files
committed
Avoid false field initializer warnings for initialized receivers
1 parent 70508db commit e1d95d9

2 files changed

Lines changed: 22 additions & 0 deletions

File tree

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/validation/WurstValidator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2008,6 +2008,7 @@ private void checkField(NameRef access) {
20082008
if (!(nameDef instanceof GlobalVarDef referenced)
20092009
|| !referenced.attrIsDynamicClassMember()
20102010
|| !(referenced.getInitialExpr() instanceof NoExpr)
2011+
|| (!isCurrentInstanceAccess(access) && hasGuaranteedConstructorAssignment(referenced))
20112012
|| !warned.add(referenced)) {
20122013
return;
20132014
}

de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/ClassesTests.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,27 @@ public void doesNotTreatDeferredClosureInitializerAsImmediateFieldRead() {
257257
result.getGui().getWarningList().toString());
258258
}
259259

260+
@Test
261+
public void doesNotWarnForExplicitReceiverWithGuaranteedConstructorAssignment() {
262+
CompilationResult result = test()
263+
.setStopOnFirstError(false)
264+
.executeProg(false)
265+
.lines(
266+
"package Test",
267+
"class Source",
268+
" int value",
269+
" construct()",
270+
" value = 1",
271+
"class Holder",
272+
" Source source = new Source()",
273+
" int copy = source.value"
274+
);
275+
276+
assertFalse(result.getGui().getWarningList().stream()
277+
.anyMatch(w -> w.getMessage().contains("read from a field initializer")),
278+
result.getGui().getWarningList().toString());
279+
}
280+
260281
@Test
261282
public void classes1() throws IOException {
262283
testAssertOkFile(new File(TEST_DIR + "Classes_1.wurst"), true);

0 commit comments

Comments
 (0)