mirror of
https://github.com/apple/pkl.git
synced 2026-06-11 00:02:47 +02:00
ce0383837a7f8accfbe5f8421ab2ec386a0ba6a4
Fixes #1614. ## Context A non-abstract `class` (or `module`) was allowed to declare `abstract` properties and methods. Because such an enclosing type is instantiable, an `abstract` member there can never be guaranteed an implementation — so the contradiction surfaced only as a runtime error when the member was accessed (`Cannot invoke abstract method`), or not at all. This makes it a compile-time error to declare an `abstract` member unless its enclosing class or module is also `abstract`. This is consistent with how Pkl already rejects instantiating an abstract class, and mirrors how Java and Kotlin treat abstract members. ## Before ```pkl class Foo { abstract bar: Int } res = new Foo { bar = 5 } // evaluated successfully (should fail) ``` ```pkl class Foo { abstract function bar(): Int } res = new Foo {} // evaluated successfully; res.bar() failed only at runtime ``` ## After ``` –– Pkl Error –– Cannot define an abstract member in a non-abstract class. 2 | abstract bar: Int ^^^^^^^^ at Foo A member can only be `abstract` if its enclosing class is also `abstract`. ``` ## Implementation - `AstBuilder` now validates, while building the AST, that a non-abstract class/module declares no `abstract` members. The check runs in both `visitClass` and `visitModule`, and the error points at the `abstract` keyword. - Adds the `abstractMemberInNonAbstractClass` error message. ## Scope: classes and modules The issue describes classes; I applied the same rule to modules as well, since a module is a class in Pkl and a non-abstract module is likewise directly evaluatable. Happy to narrow this to classes only if you'd prefer — it's a one-line change either way. The `moduleMethodModifiers` pkl-doc test fixture declared an abstract method at non-abstract module level (relying on the old behavior); it's updated to an `abstract module`, and its expected documentation output is regenerated. ## Tests - New `LanguageSnippetTests` error cases: abstract property in a class, abstract method in a class, and abstract member in a module. - `./gradlew build` passes (`pkl-core` and `pkl-doc` included). --------- Co-authored-by: Vinayak <vinayak@vama.app> Co-authored-by: Daniel Chao <daniel.h.chao@gmail.com>
= image:.idea/icon.svg[Pkl,30] Pkl
:uri-homepage: https://pkl-lang.org
:uri-docs: {uri-homepage}/main/current
:uri-docs-introduction: {uri-docs}/introduction
:uri-docs-release-notes: {uri-docs}/release-notes
:uri-docs-language: {uri-docs}/language
:uri-docs-tools: {uri-docs}/tools
:uri-github-issue: https://github.com/apple/pkl/issues
:uri-github-discussions: https://github.com/apple/pkl/discussions
:uri-pkl-examples: https://pkl-lang.org/main/current/examples.html
:uri-installation: https://pkl-lang.org/main/current/pkl-cli/index.html#installation
:uri-lang-reference: https://pkl-lang.org/main/current/language-reference/index.html
:uri-ci-artifacts: https://s01.oss.sonatype.org/content/groups/public/org/pkl-lang/
:uri-ci-pipeline: https://github.com/apple/pkl/actions
A configuration as code language with rich validation and tooling.
== Quick Links
* {uri-installation}[Installation]
* {uri-lang-reference}[Language Reference]
== Documentation
* {uri-homepage}[Home Page]
** {uri-docs-introduction}[Introduction]
** {uri-docs-language}[Language]
** {uri-docs-tools}[Tools]
** {uri-pkl-examples}[Examples]
** {uri-docs-release-notes}[Release Notes]
== Community
We'd love to hear from you!
* Create an {uri-github-issue}[issue]
* Ask a question on {uri-github-discussions}[GitHub Discussions]
== Development
image:https://github.com/apple/pkl/actions/workflows/main.yml/badge.svg?style=svg["Build (main)", link="https://github.com/apple/pkl/actions/workflows/main.yml"]
* link:CONTRIBUTING.adoc[] for tips on pull requests and filing issues
* link:DEVELOPMENT.adoc[] for build instructions
* {uri-ci-artifacts}[Sonatype Repository] for the artifacts/binaries built by our {uri-ci-pipeline}[CI pipelines] (and those of our other tools and packages repositories).
== Pkl GitHub Repositories
[%autowidth]
|===
|Name |Description
|`apple/pkl`
|A configuration as code language with rich validation and tooling.
|https://github.com/apple/pkl-evolution[`apple/pkl-evolution`]
|Suggested Pkl Improvements, Changes, or Enhancements (SPICEs)
|https://github.com/apple/pkl-go[`apple/pkl-go`]
|Pkl bindings for the Go programming language
|https://github.com/apple/pkl-go-examples[`apple/pkl-go-examples`]
|Examples for using Pkl within Go applications
|https://github.com/apple/highlightjs-pkl[`apple/highlightjs-pkl`]
|Highlight.js syntax highlighting for Pkl
|https://github.com/apple/pkl-intellij[`apple/pkl-intellij`]
|JetBrains editor plugins providing Pkl language support
|https://github.com/apple/pkl-jvm-examples[`apple/pkl-jvm-examples`]
|Examples for using Pkl within JVM applications
|https://github.com/apple/pkl-k8s[`apple/pkl-k8s`]
|Templates for using Pkl with Kubernetes
|https://github.com/apple/pkl-k8s-examples[`apple/pkl-k8s-examples`]
|Examples for using Pkl with Kubernetes
|https://github.com/apple/pkl-lang.org[`apple/pkl-lang.org`]
|The pkl-lang.org website
|https://github.com/apple/pkl-lsp[`apple/pkl-lsp`]
|Language server for Pkl, implementing the server-side of the Language Server Protocol
|https://github.com/apple/pkl-neovim[`apple/pkl-neovim`]
|Pkl language support for Neovim
|https://github.com/apple/pkl-package-docs[`apple/pkl-package-docs`]
|Documentation for Pkl packages
|https://github.com/apple/pkl-pantry[`apple/pkl-pantry`]
|Shared Pkl packages
|https://github.com/apple/pkl-project-commons[`apple/pkl-project-commons`]
|Utility libraries for Pkl
|https://github.com/apple/pkl-readers[`apple/pkl-readers`]
|Shared Pkl https://pkl-lang.org/main/current/language-reference/index.html#external-readers[external reader] tools
|https://github.com/apple/pkl-spring[`apple/pkl-spring`]
|Spring Boot extension for configuring Boot apps with Pkl
|https://github.com/apple/pkl-swift[`apple/pkl-swift`]
|Pkl bindings for the Swift programming language
|https://github.com/apple/pkl-swift-examples[`apple/pkl-swift-examples`]
|Examples for using Pkl within Swift applications
|https://github.com/apple/pkl-vscode[`apple/pkl-vscode`]
|Pkl language support for VS Code
|https://github.com/apple/pkl.tmbundle[`apple/pkl.tmbundle`]
|TextMate bundle for Pkl
|https://github.com/apple/tree-sitter-pkl[`apple/tree-sitter-pkl`]
|Tree-sitter parser for Pkl
|https://github.com/apple/rules_pkl[`apple/rules_pkl`]
|Bazel build rules for Pkl
|===
Description
Releases
10
Languages
Java
65%
Kotlin
29%
Pkl
5.2%
JavaScript
0.6%
CSS
0.2%