Commit Graph

298 Commits

Author SHA1 Message Date
translatenix
8fa3acf32f codegen-kotlin: Support Java serialization of module classes (#721)
Motivation:
- Java serialization makes as much sense for module classes as it does for regular classes.
- Offer same Java serialization support as codegen-java.

Changes:
- Move generation of `appendProperty` method and serialization code
  into new method `generateCompanionRelatedCode`.
- Improve/fix generation of serialization code.

Result:
Java serialization is also supported for module classes.
2024-10-24 22:11:35 -07:00
Islon Scherer
8b0118fec5 Store PklProject annotations in the project metadata (#708)
Write annotations to project metadata, and provide them to pkl-doc\

The following annotations have meaning for pkl-doc:
* `@Unlisted`: hide package from documentation site
* `@Deprecated`: add deprecated information
2024-10-24 17:21:58 -07:00
Islon Scherer
93cc3253eb Report error on circular local dependencies (#731)
If a stack overflow is found during project evaluation, present any
circular imports found in the dependency graph.
2024-10-24 16:45:18 -07:00
translatenix
1ceb489d78 Fix lazy type checking of UInt types (#740)
For example, Listing<UInt16> is equivalent to Listing<UInt16>, but not to Listing<UInt32>.
2024-10-24 16:19:26 -07:00
Josh B
4b6bc7bb7c Produce more helpful output when module output is overwritten (#716)
Fix a bug where overwriting `output` causes a PklBugException.

This now produces a more helpful message pointing to the actual problem.

Co-authored-by: translatenix <119817707+translatenix@users.noreply.github.com>
2024-10-24 09:41:59 -07:00
translatenix
cbbcca0d84 codegen-java: Make stateless classes instantiable (#734)
Motivation:
Currently, the condition for making a generated Java class instantiable is "class is neither abstract nor stateless".
(An instantiable class receives a public constructor and equals/hashCode/toString/with methods.)
This is inconsistent with Pkl and codegen-kotlin, both of which support instantiation of stateless classes.

Changes:
Widen condition for making a class instantiable to "class is neither abstract nor a stateless final module class".
This is consistent with codegen-kotlin, which generates object declarations (only) for stateless final module classes.

Result:
Stateless classes are instantiable in Pkl, codegen-java, and codegen-kotlin.
2024-10-24 09:29:08 -07:00
Daniel Chao
22c9a6c9f4 Exclude thrown ascii filename error from native tests (#737)
The URI encoding is not predictable here.
2024-10-24 08:20:56 -07:00
Josh B
069a5d1adc Fix test failures on main (#735) 2024-10-24 11:53:39 +01:00
Javier Maestro
86d870ba09 Improve testing with stats and errors per test section (#498)
* Emojis are moves to the left to be aligned
* A summary line is added with test counts
* Facts and Examples are grouped under their own section
2024-10-23 23:00:35 -07:00
translatenix
2040f14b07 codegen-java: Change condition for generating equals/hashCode/toString/with/Serializable (#710)
Motivation:
- Currently, the condition for generating equals/hashCode/toString methods is "generated class declares properties".
  As a result, classes that don't declare properties inherit these methods from their generated superclasses.
  However, generated `equals` and `toString` methods aren't designed to be inherited
  and will either fail or produce wrong results when called for a subclass.
- Currently, the condition for generating `with` methods is "class is not abstract".
  However, it isn't useful to generate `with` methods for non-instantiable non-abstract classes.
- Currently, the condition for making classes serializable is "class is not a module class".
  However, it isn't useful to make non-instantiable non-module classes serializable,
  and it is useful to make instantiable module classes serializable.

Changes:
- Change condition for generating equals/hashCode/toString/with/Serializable to "class is instantiable".
  This is a breaking change.
  (A generated class is instantiable, i.e., declares a public constructor,
  if it is neither abstract nor stateless. This behavior remains unchanged for now.)
- Overhaul JavaCodeGeneratorTest
  - introduce classes JavaSourceCode and JavaSourceCodeAssert
  - change assertions to use JavaSourceCodeAssert via `assertThat(javaCode)`
  - use parameterized test instead of loop
  - use explicit trimIndent() and trimMargin() for multiline string literals
    - IntelliJ editor desperately wants to insert trimIndent()
    - can potentially be exploited by kotlinc and ktfmt

Result:
- Fixes all motivating issues.
- Fixes #706.
2024-10-23 21:59:15 -07:00
translatenix
730257861f codegen-kotlin: Don't generate equals/hashCode/toString/copy/:Serializable for abstract classes (#714)
* codegen-kotlin: Don't generate equals/hashCode/toString/copy/:Serializable for abstract classes

* Polish KotlinCodeGeneratorTest

- use `assertContains()` instead of `assertThat().contains()`
- remove redundant `trimIndent()` and `trimMargin()` calls
- rename `javaCode` to `kotlinCode`

* Overhaul KotlinCodeGeneratorTest

- introduce classes KotlinSourceCode and KotlinSourceCodeAssert
- change assertions to use KotlinSourceCodeAssert via `assertThat(kotlinCode)`
- use explicit trimIndent() and trimMargin() for multiline string literals
  - IntelliJ editor desperately wants to insert trimIndent()
  - can be used by kotlinc and ktfmt
- format code in the exact way it falls out of the IntelliJ editor
  (successfully destroyed by ktfmt)
2024-10-23 21:31:08 -07:00
Josh B
f9fe226eba Fix handling of file: module URIs with non-ASCII characters (#696)
Addresses an issue where Pkl cannot evaluate files with non-ASCII characters.
2024-10-23 20:52:40 -07:00
Daniel Chao
5a654e453c Fix formatting issues (#733) 2024-10-23 20:49:16 -07:00
Daniel Chao
9d10832ffc Fix typecheck error on Listing/Mapping (#725)
The addresses the following case:

    local l1: Listing<String> = new { 1 }
    l2: Listing<Int> = (l1) { 2 }

The member in `l1` should be checked against its owner; to check against `Listing<String>`.
2024-10-23 14:38:30 -07:00
Daniel Chao
ce25cb8ef0 Add analyze imports libs (SPICE-0001) (#695)
This adds a new feature to build a dependency graph of Pkl programs, following the SPICE outlined in https://github.com/apple/pkl-evolution/pull/2.

It adds:
* CLI command `pkl analyze imports`
* Java API `org.pkl.core.Analyzer`
* Pkl stdlib module `pkl:analyze`
* pkl-gradle extension `analyze`

In addition, it also changes the Gradle plugin such that `transitiveModules` is by default computed from the import graph.
2024-10-23 14:36:57 -07:00
Philip K.F. Hölzenspies
eb3891b21f Change license header from doc- to block-comment (#730)
* Change license header from doc to block comment

* Apply fixed license header throughout
2024-10-23 16:02:42 +01:00
Philip K.F. Hölzenspies
0aa4819cea Add version of resolved Pkl distribution to ExecutorException (#719)
* Add version of resolved Pkl distribution to `ExecutorException`

* Review comments

Co-authored-by: Daniel Chao <daniel.h.chao@gmail.com>

---------

Co-authored-by: Daniel Chao <daniel.h.chao@gmail.com>
2024-10-23 10:51:53 +01:00
Kushal Pisavadia
a7cc098925 Remove isMappingDefault on VmNull (#724)
This method is unused.
2024-10-22 10:41:31 -07:00
Daniel Chao
0ee3d37524 Add support for const object members (#678)
This adds support for adding the `const` modifier to object members.

Such object members are also required to have the `local` modifier applied.

This follows SPICE-0011.
2024-10-21 22:00:12 -07:00
translatenix
5057bb5b17 Fix build performance issues of spotless tasks (#722)
Using more efficient glob expressions and removing `targetExclude()` greatly speeds up performance on some OSes.
2024-10-21 17:23:40 -07:00
translatenix
9abf1de7de List Pkl GitHub repositories in README (#715) 2024-10-21 17:22:29 -07:00
translatenix
84f4ec863c codegen-kotlin: Fix generation of copy() methods (#705)
- don't generate copy methods for abstract classes
- precisely determine if copy method needs override modifier (tricky)

Fixes #569
2024-10-19 20:32:21 -07:00
translatenix
d271b62543 Update dependencies (#689)
- Update dependencies by deleting lock files and regenerating them with `gw updateDependencyLocks`.
  Deleting lock files avoids strange `some.library:some.older.version=default` entries.
  Most updated dependencies are test dependencies.
- Handle breaking changes in library commonmark.
- Fix test to close PackageServer exactly once.
  This problem surfaced because JUnit 5.11 changed override rules for lifecycle methods,
  resulting in too many instead of too few close() calls.
- Bump msgpack version
- Bump clikt version
- Bump Gradle plugin versions
2024-10-17 09:12:07 -07:00
Josh B
62c796a257 Fix double unary minus (#697)
Fix an issue where doubly unary minus (e.g. `--1`) on int/float literals are incorrectly
parsed as single unary minus.
2024-10-17 07:30:00 -07:00
Jens Teglhus Møller
9b5c5a5c98 Fix error in spread documentation (#704) 2024-10-17 07:16:53 -07:00
Daniel Chao
2add291375 Fix formatting of let expressions (#702) 2024-10-17 07:02:24 -07:00
Daniel Chao
7ac51f1f88 Fix invalid syntax in doc comments of pkl:reflect members (#703) 2024-10-17 07:02:10 -07:00
translatenix
1022cf3ff3 Replace some usages of java.lang.String.replaceAll with String.replace (#701)
Both methods replace all occurrences.
The difference is that String.replaceAll interprets its first argument as a regex.
2024-10-16 15:00:45 -07:00
Philip K.F. Hölzenspies
421711be10 Improve let-expression examples (#680) (#699)
Because I did not understand what a `Let Expression` should be and the example code was more confusing as explanatory, I changed the format of the examples a little bit and changed the result.

- It should be clear that the example is just one code-line
- I tried out the example (`pkl eval...`) and get a little bit different result

Co-authored-by: ManuW <ManuW@users.noreply.github.com>
2024-10-16 13:10:48 +01:00
translatenix
475f29c896 Set lower limit for glob pattern resolution in test mode (#693)
Motivation:
Speed up the test that verifies enforcement of the limit for glob pattern resolution (invalidGlobImport6.pkl).

Changes:
- Set a lower limit if test mode is enabled.
- Change static field to static method to prevent compile-time evaluation by native-image.
2024-10-15 22:20:25 -07:00
translatenix
d00c466843 Fix dangling Javadoc reference (#687) 2024-10-15 08:26:35 -07:00
translatenix
7f26592360 Use case-insensitive comparison for module URI schemes (#688)
Previously, some factories used case-sensitive comparison, for no apparent reason.
2024-10-15 08:26:23 -07:00
translatenix
4854027a1a Update Gradle to 8.10.2 (#684)
Verify wrapper JAR according to:
https://docs.gradle.org/current/userguide/gradle_wrapper.html#wrapper_checksum_verification
2024-10-14 22:53:26 -07:00
translatenix
2961cdad19 Update Windows and Mac development instructions (#685) 2024-10-14 22:52:59 -07:00
translatenix
b76ff0f858 Don't run native Windows tests during pkl-core:test (#686) 2024-10-14 22:51:28 -07:00
translatenix
bc9d526b7a Update DEVELOPMENT.adoc (#682) 2024-10-14 11:00:16 +02:00
Daniel Chao
3600582908 Add .vscode and .pkl-lsp to gitignore (#677) 2024-10-11 07:59:35 -07:00
Josh B
1e63c48ce4 Add String.splitLimit API (#666)
* Add String.splitLimit API

* Update stdlib/base.pkl

Co-authored-by: Daniel Chao <daniel.h.chao@gmail.com>

---------

Co-authored-by: Daniel Chao <daniel.h.chao@gmail.com>
2024-10-07 15:28:19 +01:00
Max Rydahl Andersen
9e7e42eb53 add jbang catalog (#655) 2024-10-07 13:13:38 +02:00
Josh B
b072794d0d Handle null contents gracefully in message passing API (#657)
In messages "Read Resource Response" and "Read Module Response", if `contents` and `error` are both null, default to an empty byte array/string.

This resolves one of the issues reported in #656
2024-10-01 12:54:06 -07:00
Philip K.F. Hölzenspies
cc1e432a30 Add PklProject.deps.json file with newline for POSIX compliance (#664)
* Add Project.deps.json file with newline for POSIX compliance

* Fix test cases
2024-10-01 20:00:46 +01:00
Daniel Chao
47f2143e0d Fix PklBugException when reading local package assets (#642) 2024-09-10 05:51:34 -07:00
Daniel Chao
7868d9d9c8 Typecheck Mapping/Listing members lazily (#628)
This changes how the language performs typechecks for mappings and
listings.

Currently, Pkl will shallow-force any Mapping and Listing to check it
the type parameter (e.g. Listing<Person> means each element is checked
to be an instance of Person).

This changes the language to check each member's type when the member
is accessed.

This also adjust test runner to handle thrown errors from within tests.

With the change to make mapping/listing typechecks lazy, we can now
correctly handle thrown errors from within a single test case.

This adjusts the test runner to consider any thrown errors as a failure
for that specific test case.
2024-09-06 15:05:23 -07:00
Josh B
7001a42149 [docs] Add documentation for new keyword (#624) 2024-08-29 15:25:14 -07:00
Philip K.F. Hölzenspies
a8f24c9f13 Fix parsing of external property values containing = (#631) 2024-08-20 13:28:13 +01:00
Josh B
e5b7e046d9 [docs] Improve searchability of "Methods" section (#625) 2024-08-19 15:54:46 -07:00
LamTrinh.Dev
ef0433a9ba Correct the link for ANTLR 4 Documentation (#623) 2024-08-15 20:15:26 -07:00
Josh B
a9c4963a4a [docs] Document the class-as-a-function pattern (#614) 2024-08-15 17:06:56 -07:00
Philip K.F. Hölzenspies
e21db76efe Remove const from reserved keywords (remnant) (#626) 2024-08-14 14:48:49 +01:00
Josh B
bbdc45656c [docs] Document hidden equality/hashing behavior (#618)
* [docs] Document `hidden` equality/hashing behavior

* Update docs/modules/language-reference/pages/index.adoc

---------

Co-authored-by: Daniel Chao <daniel.h.chao@gmail.com>
2024-08-13 09:56:15 +02:00