Records ohne Components kompiliert nicht. #343

Closed
opened 2024-08-06 18:09:38 +00:00 by RubenKraft · 0 comments
Collaborator

Bei meiner Arbeit mit Records ist mir aufgefallen, dass ein Fehler auftritt, sobald ein Record keine Attribute besitzt.

Beispiel

Der folgende Code kompiliert ohne Probleme:

import java.lang.Integer;
import java.lang.Object;
import java.lang.Float;
import java.lang.String;

public record Rec(Integer a) {}



public class SwitchInfered {
    public main(o) {
        return switch (o) {
        case Rec(a) -> "asd";
        default -> "cde";
        };
    }
}

Wenn ich jedoch die Definition des Records ändere (public record Rec() {}) und den Case entsprechend anpasse (case Rec() -> "asd";) wird folgender Fehler geworfen:

java.lang.NullPointerException: Cannot invoke "de.dhbwstuttgart.parser.antlr.Java17Parser$RecordComponentListContext.recordComponent()" because the return value of "de.dhbwstuttgart.parser.antlr.Java17Parser$RecordHeaderContext.recordComponentList()" is null

Es scheint, als ob der Parser nicht erwartet, dass Records ohne Attribute erstellt werden. Ob ein leerer Record sinnvoll ist oder nicht, steht zur Debatte, aber funktionieren sollte es per Definition. (siehe hier)

Steps to Reproduce

  1. Folgenden Code als Test ausführen:
import java.lang.Integer;
import java.lang.Object;
import java.lang.Float;
import java.lang.String;

public record Rec() {}



public class SwitchInfered {
    public main(o) {
        return switch (o) {
        case Rec() -> "asd";
        default -> "cde";
        };
    }
}

Stacktrace


java.lang.NullPointerException: Cannot invoke "de.dhbwstuttgart.parser.antlr.Java17Parser$RecordComponentListContext.recordComponent()" because the return value of "de.dhbwstuttgart.parser.antlr.Java17Parser$RecordHeaderContext.recordComponentList()" is null

	at de.dhbwstuttgart.parser.SyntaxTreeGenerator.SyntaxTreeGenerator.convertRecord(SyntaxTreeGenerator.java:257)
	at de.dhbwstuttgart.parser.SyntaxTreeGenerator.SyntaxTreeGenerator.convert(SyntaxTreeGenerator.java:165)
	at de.dhbwstuttgart.core.JavaTXCompiler.parse(JavaTXCompiler.java:676)
	at de.dhbwstuttgart.core.JavaTXCompiler.<init>(JavaTXCompiler.java:106)
	at targetast.TestCodegen.generateClassFiles(TestCodegen.java:45)
	at TestComplete.testSwitchInfered(TestComplete.java:681)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
	at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
Bei meiner Arbeit mit Records ist mir aufgefallen, dass ein Fehler auftritt, sobald ein Record keine Attribute besitzt. ## Beispiel Der folgende Code kompiliert ohne Probleme: ```java import java.lang.Integer; import java.lang.Object; import java.lang.Float; import java.lang.String; public record Rec(Integer a) {} public class SwitchInfered { public main(o) { return switch (o) { case Rec(a) -> "asd"; default -> "cde"; }; } } ``` Wenn ich jedoch die Definition des Records ändere (```public record Rec() {}```) und den Case entsprechend anpasse (```case Rec() -> "asd";```) wird folgender Fehler geworfen: ```java java.lang.NullPointerException: Cannot invoke "de.dhbwstuttgart.parser.antlr.Java17Parser$RecordComponentListContext.recordComponent()" because the return value of "de.dhbwstuttgart.parser.antlr.Java17Parser$RecordHeaderContext.recordComponentList()" is null ``` Es scheint, als ob der Parser nicht erwartet, dass Records ohne Attribute erstellt werden. Ob ein leerer Record sinnvoll ist oder nicht, steht zur Debatte, aber funktionieren sollte es per Definition. (siehe [hier](https://softwaregarden.dev/en/posts/new-java/records/can-and-cannot)) ## Steps to Reproduce 1. Folgenden Code als Test ausführen: ```java import java.lang.Integer; import java.lang.Object; import java.lang.Float; import java.lang.String; public record Rec() {} public class SwitchInfered { public main(o) { return switch (o) { case Rec() -> "asd"; default -> "cde"; }; } } ``` ## Stacktrace ```java java.lang.NullPointerException: Cannot invoke "de.dhbwstuttgart.parser.antlr.Java17Parser$RecordComponentListContext.recordComponent()" because the return value of "de.dhbwstuttgart.parser.antlr.Java17Parser$RecordHeaderContext.recordComponentList()" is null at de.dhbwstuttgart.parser.SyntaxTreeGenerator.SyntaxTreeGenerator.convertRecord(SyntaxTreeGenerator.java:257) at de.dhbwstuttgart.parser.SyntaxTreeGenerator.SyntaxTreeGenerator.convert(SyntaxTreeGenerator.java:165) at de.dhbwstuttgart.core.JavaTXCompiler.parse(JavaTXCompiler.java:676) at de.dhbwstuttgart.core.JavaTXCompiler.<init>(JavaTXCompiler.java:106) at targetast.TestCodegen.generateClassFiles(TestCodegen.java:45) at TestComplete.testSwitchInfered(TestComplete.java:681) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.junit.runner.JUnitCore.run(JUnitCore.java:160) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ```
RubenKraft added the
Parser
label 2024-08-06 18:09:38 +00:00
dholle referenced this issue from a commit 2024-08-07 11:34:11 +00:00
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: JavaTX/JavaCompilerCore#343
No description provided.