From 1bf00b84eaec3b53675cd76d6ae65f0b59f04e61 Mon Sep 17 00:00:00 2001 From: Daniel Chao Date: Tue, 23 Jun 2026 09:46:14 -0700 Subject: [PATCH] Revert "Reject abstract members in non-abstract classes" (#1688) The changes made in this commit are good, but we're going to kick this out to the next release. This is because: 1. There's a couple more issues around the `abstract` modifier that is not implemented yet, and need design considerations 2. These are breaking changes, and we want to minimize the amount of breakages for users. 3. The main branch is still the develop branch for Pkl 0.32 We will apply a re-revert of this commit after Pkl 0.32 is released. --- .../org/pkl/core/ast/builder/AstBuilder.java | 27 ------------------- .../org/pkl/core/errorMessages.properties | 5 ---- .../abstractMemberInNonAbstractClass.pkl | 5 ---- .../abstractMemberInNonAbstractModule.pkl | 1 - .../abstractMethodInNonAbstractClass.pkl | 5 ---- .../abstractMemberInNonAbstractClass.err | 8 ------ .../abstractMemberInNonAbstractModule.err | 8 ------ .../abstractMethodInNonAbstractClass.err | 8 ------ .../com.package1/moduleMethodModifiers.pkl | 2 +- .../1.2.3/moduleMethodModifiers/index.html | 2 +- .../1.2.3/moduleMethodModifiers/index.html | 2 +- 11 files changed, 3 insertions(+), 70 deletions(-) delete mode 100644 pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMemberInNonAbstractClass.pkl delete mode 100644 pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMemberInNonAbstractModule.pkl delete mode 100644 pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMethodInNonAbstractClass.pkl delete mode 100644 pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMemberInNonAbstractClass.err delete mode 100644 pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMemberInNonAbstractModule.err delete mode 100644 pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMethodInNonAbstractClass.err diff --git a/pkl-core/src/main/java/org/pkl/core/ast/builder/AstBuilder.java b/pkl-core/src/main/java/org/pkl/core/ast/builder/AstBuilder.java index e6ee30a8f..d7df51d14 100644 --- a/pkl-core/src/main/java/org/pkl/core/ast/builder/AstBuilder.java +++ b/pkl-core/src/main/java/org/pkl/core/ast/builder/AstBuilder.java @@ -1476,8 +1476,6 @@ public class AstBuilder extends AbstractAstBuilder { var scope = (ModuleScope) symbolTable.getCurrentScope(); scope.setModifiers(modifiers); - checkAbstractMembersAllowed(modifiers, mod.getProperties(), mod.getMethods()); - // visit imports first so that we already have the object member name available var imports = mod.getImports(); var importMembers = new ObjectMember[imports.size()]; @@ -1722,7 +1720,6 @@ public class AstBuilder extends AbstractAstBuilder { List properties = bodyNode != null ? bodyNode.getProperties() : List.of(); List methods = bodyNode != null ? bodyNode.getMethods() : List.of(); registerClassScopeNames(scope, properties, methods); - checkAbstractMembersAllowed(modifiers, properties, methods); var supertypeCtx = clazz.getSuperClass(); @@ -1813,30 +1810,6 @@ public class AstBuilder extends AbstractAstBuilder { }; } - private void checkAbstractMembersAllowed( - int enclosingModifiers, List properties, List methods) { - if (VmModifier.isAbstract(enclosingModifiers)) { - return; - } - for (var property : properties) { - checkMemberNotAbstract(property.getModifiers()); - } - for (var method : methods) { - checkMemberNotAbstract(method.getModifiers()); - } - } - - private void checkMemberNotAbstract(List modifiers) { - for (var modifier : modifiers) { - if (modifier.getValue() == ModifierValue.ABSTRACT) { - throw exceptionBuilder() - .evalError("abstractMemberInNonAbstractClass") - .withSourceSection(createSourceSection(modifier.span())) - .build(); - } - } - } - private UnresolvedPropertyNode[] doVisitClassProperties( List propertyContexts, Set propertyNames) { var propertyNodes = new UnresolvedPropertyNode[propertyContexts.size()]; diff --git a/pkl-core/src/main/resources/org/pkl/core/errorMessages.properties b/pkl-core/src/main/resources/org/pkl/core/errorMessages.properties index fb96eabb3..e3b93b6b7 100644 --- a/pkl-core/src/main/resources/org/pkl/core/errorMessages.properties +++ b/pkl-core/src/main/resources/org/pkl/core/errorMessages.properties @@ -286,11 +286,6 @@ External members cannot have a body. abstractMemberCannotHaveBody=\ Abstract members cannot have a body. -abstractMemberInNonAbstractClass=\ -Cannot define an abstract member in a non-abstract class.\n\ -\n\ -A member can only be `abstract` if its enclosing class is also `abstract`. - methodNotDefined1=\ Method `{0}` is not defined for argument type `{1}`. diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMemberInNonAbstractClass.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMemberInNonAbstractClass.pkl deleted file mode 100644 index 7417fbd26..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMemberInNonAbstractClass.pkl +++ /dev/null @@ -1,5 +0,0 @@ -class Foo { - abstract bar: Int -} - -res = new Foo { bar = 5 } diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMemberInNonAbstractModule.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMemberInNonAbstractModule.pkl deleted file mode 100644 index e9dff5a3d..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMemberInNonAbstractModule.pkl +++ /dev/null @@ -1 +0,0 @@ -abstract foo: Int diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMethodInNonAbstractClass.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMethodInNonAbstractClass.pkl deleted file mode 100644 index 5f2a1213b..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMethodInNonAbstractClass.pkl +++ /dev/null @@ -1,5 +0,0 @@ -class Foo { - abstract function bar(): Int -} - -res = new Foo {} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMemberInNonAbstractClass.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMemberInNonAbstractClass.err deleted file mode 100644 index 836ca8f00..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMemberInNonAbstractClass.err +++ /dev/null @@ -1,8 +0,0 @@ -–– Pkl Error –– -Cannot define an abstract member in a non-abstract class. - -x | abstract bar: Int - ^^^^^^^^ -at abstractMemberInNonAbstractClass#Foo (file:///$snippetsDir/input/errors/abstractMemberInNonAbstractClass.pkl) - -A member can only be `abstract` if its enclosing class is also `abstract`. diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMemberInNonAbstractModule.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMemberInNonAbstractModule.err deleted file mode 100644 index d31c181d0..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMemberInNonAbstractModule.err +++ /dev/null @@ -1,8 +0,0 @@ -–– Pkl Error –– -Cannot define an abstract member in a non-abstract class. - -x | abstract foo: Int - ^^^^^^^^ -at abstractMemberInNonAbstractModule (file:///$snippetsDir/input/errors/abstractMemberInNonAbstractModule.pkl) - -A member can only be `abstract` if its enclosing class is also `abstract`. diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMethodInNonAbstractClass.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMethodInNonAbstractClass.err deleted file mode 100644 index a090b927a..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMethodInNonAbstractClass.err +++ /dev/null @@ -1,8 +0,0 @@ -–– Pkl Error –– -Cannot define an abstract member in a non-abstract class. - -x | abstract function bar(): Int - ^^^^^^^^ -at abstractMethodInNonAbstractClass#Foo (file:///$snippetsDir/input/errors/abstractMethodInNonAbstractClass.pkl) - -A member can only be `abstract` if its enclosing class is also `abstract`. diff --git a/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleMethodModifiers.pkl b/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleMethodModifiers.pkl index bd48b43c7..6138dbb76 100644 --- a/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleMethodModifiers.pkl +++ b/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleMethodModifiers.pkl @@ -1,5 +1,5 @@ /// Module methods with different modifiers. -abstract module com.package1.moduleMethodModifiers +module com.package1.moduleMethodModifiers /// Method with `abstract` modifier. abstract function method1(arg: String): Boolean diff --git a/pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/moduleMethodModifiers/index.html b/pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/moduleMethodModifiers/index.html index 06c96ad88..573620801 100644 --- a/pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/moduleMethodModifiers/index.html +++ b/pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/moduleMethodModifiers/index.html @@ -32,7 +32,7 @@
-
abstract module com.package1.moduleMethodModifiers
+
module com.package1.moduleMethodModifiers

Module methods with different modifiers.

Module URI:
diff --git a/pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/moduleMethodModifiers/index.html b/pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/moduleMethodModifiers/index.html index 06c96ad88..573620801 100644 --- a/pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/moduleMethodModifiers/index.html +++ b/pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/moduleMethodModifiers/index.html @@ -32,7 +32,7 @@
-
abstract module com.package1.moduleMethodModifiers
+
module com.package1.moduleMethodModifiers

Module methods with different modifiers.

Module URI: