diff --git a/docs/modules/language-reference/pages/index.adoc b/docs/modules/language-reference/pages/index.adoc index 7af41707a..e2abd036c 100644 --- a/docs/modules/language-reference/pages/index.adoc +++ b/docs/modules/language-reference/pages/index.adoc @@ -6028,7 +6028,7 @@ Here's a realistic example of how references might be used: import "pkl:ref" class Domain extends ref.Domain { // <1> - function renderReference(reference: ref.Reference): String = +override function renderReference(reference: ref.Reference): String = if (reference.getData() is Task) let (path = reference.getPath().map((access) -> access.property ?? access.key.toString())) "${\(reference.getData().name)/\(path.join("/"))}" diff --git a/docs/modules/release-notes/pages/0.32.adoc b/docs/modules/release-notes/pages/0.32.adoc index 02805cb47..a0227a86a 100644 --- a/docs/modules/release-notes/pages/0.32.adoc +++ b/docs/modules/release-notes/pages/0.32.adoc @@ -63,7 +63,7 @@ Library authors describe types as `ref.Reference`, where `D` is the _domai import "pkl:ref" class MyDomain extends ref.Domain { // <1> - function renderReference(ref: ref.Reference): String = +override function renderReference(ref: ref.Reference): String = "${ " + ref.getData() + "." + ref.getPath().join(".") + " }" } diff --git a/pkl-cli/src/test/kotlin/org/pkl/cli/CliCommandRunnerTest.kt b/pkl-cli/src/test/kotlin/org/pkl/cli/CliCommandRunnerTest.kt index 521e69387..be1aa227f 100644 --- a/pkl-cli/src/test/kotlin/org/pkl/cli/CliCommandRunnerTest.kt +++ b/pkl-cli/src/test/kotlin/org/pkl/cli/CliCommandRunnerTest.kt @@ -46,7 +46,7 @@ class CliCommandRunnerTest { """ extends "pkl:Command" - options: Options + override options: Options output { value = options @@ -822,7 +822,7 @@ class CliCommandRunnerTest { """ extends "pkl:Command" - options: Options + override options: Options output { value = (options) { @@ -875,7 +875,7 @@ class CliCommandRunnerTest { """ extends "pkl:Command" - options: Options + override options: Options output { value = (options) { @@ -935,7 +935,7 @@ class CliCommandRunnerTest { extends "pkl:Command" import "base.pkl" - options: Options + override options: Options output { value = (options) { diff --git a/pkl-cli/src/test/kotlin/org/pkl/cli/CliEvaluatorTest.kt b/pkl-cli/src/test/kotlin/org/pkl/cli/CliEvaluatorTest.kt index e831cf268..05f54b582 100644 --- a/pkl-cli/src/test/kotlin/org/pkl/cli/CliEvaluatorTest.kt +++ b/pkl-cli/src/test/kotlin/org/pkl/cli/CliEvaluatorTest.kt @@ -1151,7 +1151,7 @@ result = someLib.x class Person { name: String - function toString() = "Person(\(name))" + override function toString() = "Person(\(name))" } person: Person = new { name = "Frodo" } """ diff --git a/pkl-codegen-java/src/test/kotlin/org/pkl/codegen/java/JavaCodeGeneratorTest.kt b/pkl-codegen-java/src/test/kotlin/org/pkl/codegen/java/JavaCodeGeneratorTest.kt index 3d9e97c70..9782c895d 100644 --- a/pkl-codegen-java/src/test/kotlin/org/pkl/codegen/java/JavaCodeGeneratorTest.kt +++ b/pkl-codegen-java/src/test/kotlin/org/pkl/codegen/java/JavaCodeGeneratorTest.kt @@ -1944,11 +1944,11 @@ class JavaCodeGeneratorTest { } open class OpenClass { - prop: Foo + open prop: Foo } class TheClass extends OpenClass { - prop: TheFoo + override prop: TheFoo } """ .trimIndent() @@ -1988,11 +1988,11 @@ class JavaCodeGeneratorTest { } open class OpenClass { - prop: Foo + open prop: Foo } class TheClass extends OpenClass { - prop: TheFoo + override prop: TheFoo } """ .trimIndent(), diff --git a/pkl-config-java/src/test/resources/codegenPkl/OverriddenProperty.pkl b/pkl-config-java/src/test/resources/codegenPkl/OverriddenProperty.pkl index c78a5d0af..837da6127 100644 --- a/pkl-config-java/src/test/resources/codegenPkl/OverriddenProperty.pkl +++ b/pkl-config-java/src/test/resources/codegenPkl/OverriddenProperty.pkl @@ -1,7 +1,7 @@ module com.example.OverriddenProperty abstract class BaseClass { - fixed bar: Listing = new { + open fixed bar: Listing = new { new { prop1 = "hello" } @@ -11,7 +11,7 @@ abstract class BaseClass { theClass: TheClass class TheClass extends BaseClass { - fixed bar: Listing = new { + override fixed bar: Listing = new { new { prop1 = "hello" prop2 = "hello again" diff --git a/pkl-config-kotlin/src/test/resources/codegenPkl/OverriddenProperty.pkl b/pkl-config-kotlin/src/test/resources/codegenPkl/OverriddenProperty.pkl index c78a5d0af..837da6127 100644 --- a/pkl-config-kotlin/src/test/resources/codegenPkl/OverriddenProperty.pkl +++ b/pkl-config-kotlin/src/test/resources/codegenPkl/OverriddenProperty.pkl @@ -1,7 +1,7 @@ module com.example.OverriddenProperty abstract class BaseClass { - fixed bar: Listing = new { + open fixed bar: Listing = new { new { prop1 = "hello" } @@ -11,7 +11,7 @@ abstract class BaseClass { theClass: TheClass class TheClass extends BaseClass { - fixed bar: Listing = new { + override fixed bar: Listing = new { new { prop1 = "hello" prop2 = "hello again" diff --git a/pkl-core/src/main/java/org/pkl/core/ast/VmModifier.java b/pkl-core/src/main/java/org/pkl/core/ast/VmModifier.java index 7ef8bf9db..556db6d8f 100644 --- a/pkl-core/src/main/java/org/pkl/core/ast/VmModifier.java +++ b/pkl-core/src/main/java/org/pkl/core/ast/VmModifier.java @@ -41,6 +41,8 @@ private VmModifier() {} public static final int CONST = 0x40; + public static final int OVERRIDE = 0x2000; + // internal modifiers public static final int IMPORT = 0x80; @@ -69,11 +71,12 @@ private VmModifier() {} public static final int VALID_TYPE_ALIAS_MODIFIERS = LOCAL | EXTERNAL; - public static final int VALID_METHOD_MODIFIERS = ABSTRACT | LOCAL | EXTERNAL | CONST; + public static final int VALID_METHOD_MODIFIERS = + ABSTRACT | LOCAL | EXTERNAL | CONST | OPEN | OVERRIDE; // for compat, properties may be parsed with abstract modifier but this is ignored public static final int VALID_PROPERTY_MODIFIERS = - ABSTRACT | LOCAL | HIDDEN | EXTERNAL | FIXED | CONST; + ABSTRACT | LOCAL | HIDDEN | EXTERNAL | FIXED | CONST | OPEN | OVERRIDE; public static final int VALID_OBJECT_MEMBER_MODIFIERS = LOCAL | CONST; @@ -129,6 +132,10 @@ public static boolean isConst(int modifiers) { return (modifiers & CONST) != 0; } + public static boolean isOverride(int modifiers) { + return (modifiers & OVERRIDE) != 0; + } + public static boolean isAmbiguousLocality(int modifiers) { return (modifiers & AMBIGUOUS_LOCALITY) != 0; } @@ -186,6 +193,7 @@ public static String toString(int modifier) { case EXTERNAL -> "external"; case FIXED -> "fixed"; case CONST -> "const"; + case OVERRIDE -> "override"; default -> throw new VmExceptionBuilder() .bug("Cannot convert internal modifier `%s` to a string.", toString(modifier)) @@ -203,6 +211,7 @@ public static VmSet getMirrors(int modifiers, boolean isClass) { if (isExternal(modifiers) && isClass) builder.add(toString(EXTERNAL)); if (isFixed(modifiers)) builder.add(toString(FIXED)); if (isConst(modifiers)) builder.add(toString(CONST)); + if (isOverride(modifiers)) builder.add(toString(OVERRIDE)); return builder.build(); } 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 22836aaa9..cb2196618 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 @@ -1857,6 +1857,7 @@ private int toModifier(Modifier modifier) { case HIDDEN -> VmModifier.HIDDEN; case FIXED -> VmModifier.FIXED; case CONST -> VmModifier.CONST; + case OVERRIDE -> VmModifier.OVERRIDE; }; } diff --git a/pkl-core/src/main/java/org/pkl/core/ast/member/ClassNode.java b/pkl-core/src/main/java/org/pkl/core/ast/member/ClassNode.java index 79a6f4cb3..ed5e3989d 100644 --- a/pkl-core/src/main/java/org/pkl/core/ast/member/ClassNode.java +++ b/pkl-core/src/main/java/org/pkl/core/ast/member/ClassNode.java @@ -123,37 +123,45 @@ public VmClass executeGeneric(VirtualFrame frame) { typeParameters, prototype); - if (unresolvedSupertypeNode != null) { - var supertypeNode = unresolvedSupertypeNode.execute(frame); - var superclass = supertypeNode.getVmClass(); + var localContext = VmLanguage.get(this).localContext.get(); + localContext.beginClassInit(cachedClass); - checkSupertype(supertypeNode, superclass); - cachedClass.initSupertype(supertypeNode, superclass); - } + try { + if (unresolvedSupertypeNode != null) { + var supertypeNode = unresolvedSupertypeNode.execute(frame); + var superclass = supertypeNode.getVmClass(); - // The superclass resolved above may not itself have completed the below initializations yet. - // That's because these initializations may have indirectly or directly triggered - // resolution of this class, in which case the `resolveSuperclass()` call above - // will have returned the partially initialized `cachedClass` of the superclass. - // As a consequence, initializations that require a fully initialized class hierarchy - // are done lazily in VmClass rather than here. - // A fully initialized class hierarchy is only required for initialization of internal caches, - // which is guaranteed to succeed (no impact on eager vs. lazy error reporting) and easy to - // defer. + checkSupertype(supertypeNode, superclass); + cachedClass.initSupertype(supertypeNode, superclass); + } - VmUtils.evaluateAnnotations(frame, annotationNodes, annotations); + // The superclass resolved above may not itself have completed the below initializations yet. + // That's because these initializations may have indirectly or directly triggered + // resolution of this class, in which case the `resolveSuperclass()` call above + // will have returned the partially initialized `cachedClass` of the superclass. + // As a consequence, initializations that require a fully initialized class hierarchy + // are done lazily in VmClass rather than here. + // A fully initialized class hierarchy is only required for initialization of internal caches, + // which is guaranteed to succeed (no impact on eager vs. lazy error reporting) and easy to + // defer. - for (var node : unresolvedPropertyNodes) { - cachedClass.addProperty(node.execute(frame, cachedClass)); - } + VmUtils.evaluateAnnotations(frame, annotationNodes, annotations); - for (var node : unresolvedMethodNodes) { - cachedClass.addMethod(node.execute(frame, cachedClass)); - } + for (var node : unresolvedPropertyNodes) { + cachedClass.addProperty(node.execute(frame, cachedClass)); + } - cachedClass.notifyInitialized(); + for (var node : unresolvedMethodNodes) { + cachedClass.addMethod(node.execute(frame, cachedClass)); + } - return cachedClass; + cachedClass.onOwnClassInitialized(); + localContext.endClassInit(); + return cachedClass; + } catch (Throwable e) { + localContext.clearClassInitState(); + throw e; + } } private void checkSupertype(TypeNode supertypeNode, @Nullable VmClass superclass) { diff --git a/pkl-core/src/main/java/org/pkl/core/ast/member/Member.java b/pkl-core/src/main/java/org/pkl/core/ast/member/Member.java index 7b7e3c8fd..d97602639 100644 --- a/pkl-core/src/main/java/org/pkl/core/ast/member/Member.java +++ b/pkl-core/src/main/java/org/pkl/core/ast/member/Member.java @@ -130,4 +130,12 @@ public final boolean isConstOrFixed() { public final boolean isLocalOrExternalOrAbstract() { return VmModifier.isLocalOrExternalOrAbstract(modifiers); } + + public final boolean isClosed() { + return VmModifier.isClosed(modifiers); + } + + public final boolean isOverride() { + return VmModifier.isOverride(modifiers); + } } diff --git a/pkl-core/src/main/java/org/pkl/core/runtime/VmClass.java b/pkl-core/src/main/java/org/pkl/core/runtime/VmClass.java index 68614aa86..2cbc110ff 100644 --- a/pkl-core/src/main/java/org/pkl/core/runtime/VmClass.java +++ b/pkl-core/src/main/java/org/pkl/core/runtime/VmClass.java @@ -33,6 +33,7 @@ import org.pkl.core.ast.*; import org.pkl.core.ast.member.*; import org.pkl.core.ast.type.TypeNode; +import org.pkl.core.runtime.VmExceptionBuilder.MultilineValue; import org.pkl.core.util.CollectionUtils; import org.pkl.core.util.EconomicMaps; import org.pkl.core.util.LateInit; @@ -150,6 +151,116 @@ public void initSupertype(TypeNode supertypeNode, VmClass superclass) { prototype.lateInitParent(superclass.getPrototype()); } + private void checkAbstractMethods() { + if (isAbstract()) return; + // minimize allocations in the non-error case + if (!hasAbstractMethod()) return; + var abstractMethods = getAbstractMethods(); + if (abstractMethods.size() == 1) { + throw new VmExceptionBuilder() + .evalError( + "noImplementationForAbstractMethod", + getDisplayName(), + abstractMethods.get(0).getName().toString()) + .withSourceSection(getHeaderSection()) + .build(); + } + var methodList = new ArrayList(abstractMethods.size()); + for (var method : abstractMethods) { + methodList.add(method.getCallSignature()); + } + throw new VmExceptionBuilder() + .evalError( + "noImplementationForAbstractMethods", getDisplayName(), MultilineValue.of(methodList)) + .withSourceSection(getHeaderSection()) + .build(); + } + + private boolean hasAbstractMethod() { + var methodCursor = getAllMethods().getEntries(); + while (methodCursor.advance()) { + var method = methodCursor.getValue(); + if (method.isAbstract()) { + return true; + } + } + return false; + } + + private List getAbstractMethods() { + assert this.superclass != null; + var result = new ArrayList(); + var methodCursor = getAllMethods().getEntries(); + while (methodCursor.advance()) { + var method = methodCursor.getValue(); + if (method.isAbstract()) { + result.add(method); + } + } + return result; + } + + private static final boolean enforceMembersOpen = true; + private static final boolean enforceMembersOverride = true; + + private void checkOverriddenMembers() { + if (superclass == null) return; // don't check for `pkl.base#Any` + doCheckOverriddenMembers( + declaredMethods, + superclass::getMethod, + it -> true, + "cannotOverrideFinalMethod", + "mustMarkMethodOverride", + "cannotMarkMethodOverride"); + doCheckOverriddenMembers( + declaredProperties, + superclass::getProperty, + it -> + it.getTypeNode() + != null, // don't need to cover the "defined first without type annotation" because + // this only matter for overrides + "cannotOverrideFinalProperty", + "mustMarkPropertyOverride", + "cannotMarkPropertyOverride"); + } + + private void doCheckOverriddenMembers( + EconomicMap declaredMembers, + Function getSuperMember, + Function isDefinition, + String errOpenMissing, + String errOverrideMissing, + String errOverrideUnnecessary) { + var memberCursor = declaredMembers.getEntries(); + while (memberCursor.advance()) { + var member = memberCursor.getValue(); + if (!isDefinition.apply(member)) continue; + var memberName = memberCursor.getKey(); + var overriddenMember = getSuperMember.apply(memberName); + if (overriddenMember == null) { + if (member.isOverride()) { + throw new VmExceptionBuilder() + .withSourceSection(member.getHeaderSection()) + .evalError(errOverrideUnnecessary, memberName) + .build(); + } + continue; + } + if (enforceMembersOpen && overriddenMember.isClosed() && !overriddenMember.isOverride()) { + throw new VmExceptionBuilder() + .withSourceSection(member.getHeaderSection()) + .evalError(errOpenMissing, memberName) + .build(); + } + if (enforceMembersOverride && !member.isOverride()) { + throw new VmExceptionBuilder() + .withSourceSection(member.getHeaderSection()) + .evalError(errOverrideMissing, memberName) + .build(); + } + } + } + @TruffleBoundary public void addProperty(ClassProperty property) { prototype.addProperty(property.getInitializer()); @@ -190,11 +301,21 @@ public void addMethods(Iterable methods) { } } - // Note: Superclasses may not have finished their initialization when this method is called. - public void notifyInitialized() { + /** + * Called when this class itself has been initialized. + * + *

Superclasses may not have been initialized yet. + */ + public void onOwnClassInitialized() { isInitialized = true; } + /** Called when the entire class hierarchy is completely initialized, including superclasses. */ + public void onFullyInitialized() { + checkAbstractMethods(); + checkOverriddenMembers(); + } + public int getTypeParameterCount() { return typeParameters.size(); } diff --git a/pkl-core/src/main/java/org/pkl/core/runtime/VmLocalContext.java b/pkl-core/src/main/java/org/pkl/core/runtime/VmLocalContext.java index f3f799ce8..36c213277 100644 --- a/pkl-core/src/main/java/org/pkl/core/runtime/VmLocalContext.java +++ b/pkl-core/src/main/java/org/pkl/core/runtime/VmLocalContext.java @@ -15,6 +15,9 @@ */ package org.pkl.core.runtime; +import java.util.ArrayDeque; +import java.util.Deque; + /** A per-context thread-local value that can be used to influence execution. */ public class VmLocalContext { private boolean shouldEagerTypecheck = false; @@ -22,6 +25,12 @@ public class VmLocalContext { /** Whether we are currently inside a type test ({@code is} check). */ private boolean inTypeTest = false; + /** The number of classes currently being initialized. */ + private int classDepth = 0; + + /** The classes currently being initialized. */ + private final Deque pendingClasses = new ArrayDeque<>(); + /** * Number of active {@link VmValueTracker} instances. Used to determine if instrumentation is * already active. @@ -48,6 +57,27 @@ public boolean isInTypeTest() { return inTypeTest; } + public void beginClassInit(VmClass vmClass) { + classDepth++; + pendingClasses.add(vmClass); + } + + public void endClassInit() { + classDepth--; + if (classDepth > 0) { + return; + } + while (!pendingClasses.isEmpty()) { + var clazz = pendingClasses.pop(); + clazz.onFullyInitialized(); + } + } + + public void clearClassInitState() { + pendingClasses.clear(); + classDepth = 0; + } + public void enterTracker() { activeTrackerDepth++; instrumentationEverUsed = true; diff --git a/pkl-core/src/main/java/org/pkl/core/util/SyntaxHighlighter.java b/pkl-core/src/main/java/org/pkl/core/util/SyntaxHighlighter.java index 28f60b72d..75fc708de 100644 --- a/pkl-core/src/main/java/org/pkl/core/util/SyntaxHighlighter.java +++ b/pkl-core/src/main/java/org/pkl/core/util/SyntaxHighlighter.java @@ -66,35 +66,9 @@ private SyntaxHighlighter() {} Token.DIV, Token.INT_DIV, Token.MOD, - Token.PIPE); - - private static final EnumSet keyword = - EnumSet.of( - Token.AMENDS, - Token.AS, - Token.EXTENDS, - Token.CLASS, - Token.TYPE_ALIAS, - Token.FUNCTION, - Token.MODULE, - Token.IMPORT, - Token.IMPORT_STAR, - Token.READ, - Token.READ_STAR, - Token.READ_QUESTION, - Token.TRACE, - Token.THROW, - Token.UNKNOWN, - Token.NOTHING, - Token.OUTER, - Token.SUPER, - Token.THIS, - Token.HIDDEN, - Token.ABSTRACT, - Token.CONST, - Token.FIXED, - Token.LOCAL, - Token.OPEN); + Token.PIPE, + Token.IS, + Token.AS); private static final EnumSet control = EnumSet.of( @@ -147,7 +121,7 @@ private static void doHighlightNormal(AnsiStringBuilder out, Token next, Lexer l out.append(AnsiTheme.SYNTAX_OPERATOR, lexer.text()); } else if (control.contains(next)) { out.append(AnsiTheme.SYNTAX_CONTROL, lexer.text()); - } else if (keyword.contains(next)) { + } else if (next.isKeyword()) { out.append(AnsiTheme.SYNTAX_KEYWORD, lexer.text()); } else if (next.isAffix()) { out.append(AnsiTheme.SYNTAX_COMMENT, lexer.text()); 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 b1e52a977..dcd9f5136 100644 --- a/pkl-core/src/main/resources/org/pkl/core/errorMessages.properties +++ b/pkl-core/src/main/resources/org/pkl/core/errorMessages.properties @@ -1208,3 +1208,34 @@ invalidReferenceTypeAnnotationWithConstraint=\ cannotInstallPackageWithNoCache=\ Cannot install package to module cache dir when module cache is disabled. + +noImplementationForAbstractMethod=\ +Class `{0}` should either be declared `abstract`, or should implement method `{1}`. + +noImplementationForAbstractMethods=\ +Class `{0}` should either be declared `abstract`, or implement the following methods:\n\ +{1} + +cannotOverrideFinalProperty=\ +Cannot override property `{0}` because it is not declared `open`.\n\ +\n\ +By default, properties are closed for overriding.\n\ +To make a property overridable, add an `open` modifier. + +cannotOverrideFinalMethod=\ +Cannot override method `{0}` because it is not declared `abstract` or `open`.\n\ +\n\ +By default, methods are closed for overriding.\n\ +To make a method overridable, add an `open` modifier. + +mustMarkPropertyOverride=\ +Cannot override property `{0}` from a parent class without declaring it `override`. + +mustMarkMethodOverride=\ +Cannot override method `{0}` from a parent class without declaring it `override`. + +cannotMarkPropertyOverride=\ +Property `{0}` is marked `override` but does not override any property from a parent class. + +cannotMarkMethodOverride=\ +Method `{0}` is marked `override` but does not override any method from a parent class. diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input-helper/classes/AbstractModule.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input-helper/classes/AbstractModule.pkl new file mode 100644 index 000000000..ab2e65b43 --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/input-helper/classes/AbstractModule.pkl @@ -0,0 +1,3 @@ +abstract module Foo + +abstract function bar(): Int diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input-helper/errors/ReferencedModuleWithOutputOverride.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input-helper/errors/ReferencedModuleWithOutputOverride.pkl deleted file mode 100644 index 308c004aa..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/input-helper/errors/ReferencedModuleWithOutputOverride.pkl +++ /dev/null @@ -1,7 +0,0 @@ -open module ReferencedModuleWithOutputOverride - -foo: String - -hidden output: ModuleOutput = new { - text = foo -} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecated1.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecated1.pkl index 34a2c7e48..70e269ae2 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecated1.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecated1.pkl @@ -1,6 +1,6 @@ open module deprecated1 -function f1(n) = n * 1000 + 1 +open function f1(n) = n * 1000 + 1 @Deprecated function f2(n) = n * 1000 + 2 @@ -11,14 +11,14 @@ class A { } open class B { - function f1(n) = n * 1000 + 201 + open function f1(n) = n * 1000 + 201 @Deprecated function f2(n) = n * 1000 + 202 } class C extends B { @Deprecated - function f1(n) = n * 1000 + 301 + override function f1(n) = n * 1000 + 301 } res1 = f1(100) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecated2.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecated2.pkl index 83715286b..4acaa5fff 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecated2.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecated2.pkl @@ -3,7 +3,7 @@ module deprecated2 extends "deprecated1.pkl" @Deprecated -function f1(n) = -1 * (n * 1000 + 1) +override function f1(n) = -1 * (n * 1000 + 1) res1 = f1(800) res1b = List(22, 23, 24).map((n) -> f1(n)) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecatedWithMessage1.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecatedWithMessage1.pkl index 0ae4bd9e2..f3b3b1a63 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecatedWithMessage1.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecatedWithMessage1.pkl @@ -1,6 +1,6 @@ open module deprecatedWithMessage1 -function f1(n) = n * 1000 + 1 +open function f1(n) = n * 1000 + 1 @Deprecated { message = "use f1 instead"} function f2(n) = n * 1000 + 2 @@ -11,14 +11,14 @@ class A { } open class B { - function f1(n) = n * 1000 + 201 + open function f1(n) = n * 1000 + 201 @Deprecated { message = "use this.f1 instead"} function f2(n) = n * 1000 + 202 } class C extends B { @Deprecated { message = "avoid using C.f1" } - function f1(n) = n * 1000 + 301 + override function f1(n) = n * 1000 + 301 } res1 = f1(100) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecatedWithMessage2.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecatedWithMessage2.pkl index c6903ab54..f357b8a2e 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecatedWithMessage2.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecatedWithMessage2.pkl @@ -3,7 +3,7 @@ module deprecatedWithMessage2 extends "deprecatedWithMessage1.pkl" @Deprecated { message = "avoid using f1" } -function f1(n) = -1 * (n * 1000 + 1) +override function f1(n) = -1 * (n * 1000 + 1) res1 = f1(800) res1b = List(22, 23, 24).map((n) -> f1(n)) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecationSuperMethod.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecationSuperMethod.pkl index f49cc629b..b4f8e5829 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecationSuperMethod.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecationSuperMethod.pkl @@ -1,17 +1,17 @@ open class Foo { @Deprecated - function bar() = 40 + open function bar() = 40 @Deprecated { message="Use only Foo#qux" } - function baz() = "baz" + open function baz() = "baz" - function qux() = 0 + open function qux() = 0 } class Bar extends Foo { - function bar() = super.bar() + 2 - function baz() = super.baz() + " was called" - function qux() = super.qux() - 1 + override function bar() = super.bar() + 2 + override function baz() = super.baz() + " was called" + override function qux() = super.qux() - 1 } barCall = new Bar {}.bar() diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/api/annotationConverters.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/api/annotationConverters.pkl index 5b0a83cd6..118052fc3 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/api/annotationConverters.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/api/annotationConverters.pkl @@ -33,7 +33,7 @@ open class Foo { prefixed_with_foo: Int = 2 @Prefix { prefix = "foo_" } - base_class_first: Int = 3 + open base_class_first: Int = 3 @MultiplyValue { factor = 2 } transform_value: Int = 4 @@ -50,7 +50,7 @@ open class Foo { class Bar extends Foo { @CamelCase - base_class_first: Int = 3 + override base_class_first: Int = 3 } output { diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/api/reference.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/api/reference.pkl index dddfb0712..0eb907825 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/api/reference.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/api/reference.pkl @@ -2,7 +2,7 @@ import "pkl:math" import "pkl:ref" class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = + override function renderReference(reference: ref.Reference): String = let (data = reference.getData()) let (root = if (data is Resource) data.name else data.toString()) let ( @@ -19,13 +19,13 @@ typealias Ref = ref.Reference abstract class Resource { name: String - hidden fixed $: Ref + open hidden fixed $: Ref } class A extends Resource { id: String hidden outputs: AProperties - hidden fixed $: Ref = ref.Reference(d, A, this) + override hidden fixed $: Ref = ref.Reference(d, A, this) } /// Test doc comment @@ -42,7 +42,7 @@ class AProperties { class B extends Resource { id: String hidden outputs: BProperties - hidden fixed $: Ref = ref.Reference(d, B, this) + override hidden fixed $: Ref = ref.Reference(d, B, this) } class BProperties { @@ -57,7 +57,7 @@ class BProperties { class MapKey { k: Int - function toString(): String = "key:\(k)" + override function toString(): String = "key:\(k)" } class K { diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/api/reflect4.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/api/reflect4.pkl index e34e3dc58..149d866e4 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/api/reflect4.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/api/reflect4.pkl @@ -6,62 +6,62 @@ local class MyAnn extends Annotation open local class A { inheritedFromA: String - overriddenInBFromA: String - overriddenInCFromA: String - overriddenInBCFromA: String + open overriddenInBFromA: String + open overriddenInCFromA: String + open overriddenInBCFromA: String fixed modA: String = "" - fixed modAOverrideB: String = "" - fixed modAOverrideC: String = "" - fixed modAOverrideBC: String = "" - fixed modAOverrideCB: String = "" + open fixed modAOverrideB: String = "" + open fixed modAOverrideC: String = "" + open fixed modAOverrideBC: String = "" + open fixed modAOverrideCB: String = "" @Unlisted annA: String @Unlisted - annAOverrideB: String + open annAOverrideB: String @Unlisted - annAOverrideC: String + open annAOverrideC: String @Unlisted - annAOverrideBC: String + open annAOverrideBC: String } open local class B extends A { inheritedFromB: String - overriddenInBFromA: Int - overriddenInCFromB: String - overriddenInBCFromA: Int + override overriddenInBFromA: Int + open overriddenInCFromB: String + override overriddenInBCFromA: Int fixed modB: String = "" - hidden fixed modAOverrideB: Int = 0 - hidden fixed modAOverrideBC: Int = 0 - fixed modAOverrideCB: Int = 0 + override hidden fixed modAOverrideB: Int = 0 + override hidden fixed modAOverrideBC: Int = 0 + override fixed modAOverrideCB: Int = 0 @Unlisted annB: String @MyAnn - annAOverrideB: String + override annAOverrideB: String @MyAnn - annAOverrideBC: String + override annAOverrideBC: String } local class C extends B { fromC: String - overriddenInCFromA: Int - overriddenInCFromB: Int - overriddenInBCFromA: Boolean + override overriddenInCFromA: Int + override overriddenInCFromB: Int + override overriddenInBCFromA: Boolean fixed modC: String = "" - hidden fixed modAOverrideC: Int = 0 - fixed modAOverrideBC: Boolean = false - hidden fixed modAOverrideCB: Boolean = false + override hidden fixed modAOverrideC: Int = 0 + override fixed modAOverrideBC: Boolean = false + override hidden fixed modAOverrideCB: Boolean = false @Unlisted annC: String @MyAnn - annAOverrideC: String + override annAOverrideC: String @AlsoKnownAs { names { "mergedAnnotations" } } - annAOverrideBC: String + override annAOverrideBC: String } local class DisplayProperty { diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/basic/reference.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/basic/reference.pkl index 336f0165e..d02f1d3ab 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/basic/reference.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/basic/reference.pkl @@ -3,7 +3,7 @@ amends "../snippetTest.pkl" import "pkl:ref" local class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = reference.getData().toString() + override function renderReference(reference: ref.Reference): String = reference.getData().toString() } local const d: D = new {} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/basic/string.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/basic/string.pkl index b1f6ffc57..3e04820ec 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/basic/string.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/basic/string.pkl @@ -81,5 +81,5 @@ local class Person { name: String; age: Int } local class Person2 { name: String age: Int - function toString() = "My name is \(name) and I'm \(age) years old." + override function toString() = "My name is \(name) and I'm \(age) years old." } diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/classes/functions4.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/classes/functions4.pkl index 083ac7c3a..01a13faf8 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/classes/functions4.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/classes/functions4.pkl @@ -1,13 +1,13 @@ function a(x) = 2 * x open class X { - function a(x) = 3 * x + open function a(x) = 3 * x function compute() = a(c) c = 3 } class Y extends X { - function a(x) = 4 * x + override function a(x) = 4 * x c = 5 } diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/classes/supercalls.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/classes/supercalls.pkl index 7b955f71a..e392ed95f 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/classes/supercalls.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/classes/supercalls.pkl @@ -1,7 +1,7 @@ open class One { prefix = "" function say(msg) = prefix + msg - function sameMethod() = 1 + open function sameMethod() = 1 sameProp = "a" } @@ -9,7 +9,7 @@ open class Two extends One { pigeon = super.say("Pigeon") function barnOwl() = super.say("Barn Owl") function say2(msg) = super.say(msg) + super.say(msg) - function sameMethod() = 2 + super.sameMethod() + override function sameMethod() = 2 + super.sameMethod() sameProp = super.sameProp + "b" } @@ -17,7 +17,7 @@ class Three extends Two { pigeonBarnOwl = super.pigeon + super.barnOwl() function barnOwlPigeon() = super.barnOwl() + super.pigeon parrot = super.say("Parrot") - function sameMethod() = 3 + super.sameMethod() + override function sameMethod() = 3 + super.sameMethod() sameProp = super.sameProp + "c" } diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/classes/supercallsInLet.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/classes/supercallsInLet.pkl index 397ef406c..9023bd27c 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/classes/supercallsInLet.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/classes/supercallsInLet.pkl @@ -1,9 +1,9 @@ open class A { - function foo() = "a" + open function foo() = "a" } class B extends A { - function foo() = + override function foo() = let (bar = "b") super.foo() + bar } @@ -29,11 +29,11 @@ res2 = d.result // Test with nested let expressions open class E { - function getValue() = "e" + open function getValue() = "e" } class F extends E { - function getValue() = + override function getValue() = let (x = "f") let (y = " and " + x) super.getValue() + y diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/classes/wrongType5.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/classes/wrongType5.pkl index 037f54af9..142a31457 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/classes/wrongType5.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/classes/wrongType5.pkl @@ -1,11 +1,11 @@ import "pkl:test" open class Person { - name: String + open name: String } class Person2 extends Person { - name: Int // currently allowed + override name: Int // currently allowed } class Person3 extends Person { diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMethodNotImplemented1.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMethodNotImplemented1.pkl new file mode 100644 index 000000000..7f8838864 --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMethodNotImplemented1.pkl @@ -0,0 +1,8 @@ +abstract class AbstractMethod { + abstract function foo(): Int +} + +class MyClass extends AbstractMethod { +} + +foo: MyClass diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMethodNotImplemented2.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMethodNotImplemented2.pkl new file mode 100644 index 000000000..8a7dca4b5 --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMethodNotImplemented2.pkl @@ -0,0 +1,9 @@ +abstract class AbstractMethods { + abstract function foo(): Int + abstract function bar(): Int +} + +class MyClass extends AbstractMethods { +} + +foo: MyClass diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMethodNotImplemented3.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMethodNotImplemented3.pkl new file mode 100644 index 000000000..d84a1a6e3 --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMethodNotImplemented3.pkl @@ -0,0 +1 @@ +extends "../../input-helper/classes/AbstractModule.pkl" diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMethodNotImplemented4.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMethodNotImplemented4.pkl new file mode 100644 index 000000000..dd4b5f5ff --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractMethodNotImplemented4.pkl @@ -0,0 +1,10 @@ +abstract class AbstractMethod { + abstract function foo(): Int +} + +abstract class AbstractIntermediate extends AbstractMethod + +class MyClass extends AbstractIntermediate { +} + +foo: MyClass diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidClassMethodModifier.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidClassMethodModifier.pkl deleted file mode 100644 index 320e3f5f3..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidClassMethodModifier.pkl +++ /dev/null @@ -1,5 +0,0 @@ -class Foo { - open function foo() = 42 -} - -res1 = new Foo {} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidClassPropertyModifier.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidClassPropertyModifier.pkl deleted file mode 100644 index adf9bfe5a..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidClassPropertyModifier.pkl +++ /dev/null @@ -1,5 +0,0 @@ -class Foo { - open foo: Int = 42 -} - -res1 = new Foo {} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidMethodModifier.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidMethodModifier.pkl deleted file mode 100644 index ef37d3d06..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidMethodModifier.pkl +++ /dev/null @@ -1 +0,0 @@ -open function foo() = 42 \ No newline at end of file diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidOutput1.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidOutput1.pkl deleted file mode 100644 index d2c46289c..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidOutput1.pkl +++ /dev/null @@ -1 +0,0 @@ -output: String = "abc" diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidOutput2.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidOutput2.pkl deleted file mode 100644 index 3a95b6f8d..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidOutput2.pkl +++ /dev/null @@ -1,3 +0,0 @@ -class Test {} - -output: Test = new {} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidPropertyModifier.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidPropertyModifier.pkl deleted file mode 100644 index 758e022b8..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidPropertyModifier.pkl +++ /dev/null @@ -1 +0,0 @@ -open foo: Int = 42 \ No newline at end of file diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference1.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference1.pkl index 0465c5bfe..a9c93e31a 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference1.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference1.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } local d: D = new {} typealias Ref = ref.Reference diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference10.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference10.pkl index bb145f685..9b34b1a62 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference10.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference10.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } typealias Ref = ref.Reference local d: D = new {} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference11.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference11.pkl index 8e1daebc4..43f40ced4 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference11.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference11.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } typealias Ref = ref.Reference local d: D = new {} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference12.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference12.pkl index 576d7d287..44b02fef2 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference12.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference12.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } typealias RefAlias1 = ref.Reference local d: D = new {} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference13.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference13.pkl index 489f46661..927d9463b 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference13.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference13.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } local d: D = new {} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference14.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference14.pkl index 47bbe6628..6e5c71f05 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference14.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference14.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } local d: D = new {} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference15.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference15.pkl index 4f82ef2af..8179c8693 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference15.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference15.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } local d: D = new {} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference16.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference16.pkl index 1519c25db..2799edcc8 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference16.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference16.pkl @@ -3,7 +3,7 @@ import "pkl:ref" import ".../input-helper/errors/ReferencedModule.pkl" class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } local d: D = new {} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference17.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference17.pkl deleted file mode 100644 index 81d697e2a..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference17.pkl +++ /dev/null @@ -1,10 +0,0 @@ -import "pkl:ref" - -import ".../input-helper/errors/ReferencedModuleWithOutputOverride.pkl" - -class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") -} -local d: D = new {} - -test = ref.Reference(d, ReferencedModuleWithOutputOverride.getClass(), "").output diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference18.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference18.pkl deleted file mode 100644 index 7a916c524..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference18.pkl +++ /dev/null @@ -1,12 +0,0 @@ -import "pkl:ref" - -import ".../input-helper/errors/ReferencedModuleWithOutputOverride.pkl" - -class ModuleSubclass extends ReferencedModuleWithOutputOverride - -class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") -} -local d: D = new {} - -test = ref.Reference(d, ModuleSubclass, "").output diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference19.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference19.pkl index 2e4ff0a74..4ff8f31b4 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference19.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference19.pkl @@ -5,7 +5,7 @@ class A { } class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } local d: D = new {} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference2.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference2.pkl index a942c2034..19c98f326 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference2.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference2.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } local d: D = new {} typealias Ref = ref.Reference diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference20.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference20.pkl index 417c9f3a0..434959867 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference20.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference20.pkl @@ -5,7 +5,7 @@ class A { } class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") + override function renderReference(reference: ref.Reference): String = throw("not supported") } local d: D = new {} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference24.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference24.pkl index 3877f6208..fd52456b7 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference24.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference24.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(_): String = throw("not implemented") +override function renderReference(_): String = throw("not implemented") } class Bird { diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference25.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference25.pkl index 8d6e3d8a1..dfca6310c 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference25.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference25.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(_): String = throw("not implemented") +override function renderReference(_): String = throw("not implemented") } class Holder { diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference26.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference26.pkl index e0ecf6479..1d5c3c123 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference26.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference26.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(_): String = throw("not implemented") + override function renderReference(_): String = throw("not implemented") } local myRef = ref.Reference(new D {}, Listing, null) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference27.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference27.pkl index 96d883165..b837a1d2c 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference27.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference27.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(_): String = throw("not implemented") + override function renderReference(_): String = throw("not implemented") } class Holder { diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference3.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference3.pkl index 182046e4c..7a05e4f94 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference3.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference3.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } local d: D = new {} typealias Ref = ref.Reference diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference4.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference4.pkl index a48fa5dab..616ccbaad 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference4.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference4.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } local d: D = new {} typealias Ref = ref.Reference diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference5.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference5.pkl index 1a7365af4..b3509fade 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference5.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference5.pkl @@ -1,13 +1,13 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } local d: D = new {} typealias Ref = ref.Reference class D2 extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } local d2: D2 = new {} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference6.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference6.pkl index 7ab3faed2..83f385ace 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference6.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference6.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } local d: D = new {} typealias Ref = ref.Reference diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference7.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference7.pkl index 649ddd426..1d4c70665 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference7.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference7.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } local d: D = new {} typealias Ref = ref.Reference diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference8.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference8.pkl index 0dff11cbe..9dd3c9595 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference8.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference8.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } typealias Ref = ref.Reference local d: D = new {} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference9.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference9.pkl index 2fa7bf21f..3d7b2a98a 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference9.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/errors/reference9.pkl @@ -1,7 +1,7 @@ import "pkl:ref" class D extends ref.Domain { - function renderReference(reference: ref.Reference): String = throw("not supported") +override function renderReference(reference: ref.Reference): String = throw("not supported") } typealias Ref = ref.Reference local d: D = new {} diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/internal/polymorphicCallSite.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/internal/polymorphicCallSite.pkl index 8960888a0..e49836c69 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/internal/polymorphicCallSite.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/internal/polymorphicCallSite.pkl @@ -24,27 +24,27 @@ abstract class Animal { class Cat extends Animal { size = "cat size" - function walk() = "cat walks" + override function walk() = "cat walks" } class Dog extends Animal { size = "dog size" - function walk() = "dog walks" + override function walk() = "dog walks" } class Bird extends Animal { size = "bird size" - function walk() = "bird walks" + override function walk() = "bird walks" } class Lion extends Animal { size = "lion size" - function walk() = "lion walks" + override function walk() = "lion walks" } class Turtle extends Animal { size = "turtle size" - function walk() = "turtle walks" + override function walk() = "turtle walks" } // polymorphic user-defined property call @@ -66,7 +66,7 @@ res13 = walk(new Lion {}) res14 = walk(new Turtle {}) open class Foo { - function speak() = "hi" + open function speak() = "hi" one { two { // polymorphic enclosing method call @@ -76,20 +76,20 @@ open class Foo { } class Bar extends Foo { - function speak() = "bye" + override function speak() = "bye" } res15 = new Foo {}.one.two.three res16 = new Bar {}.one.two.three open class Foo2 { - function speak() = "hi" + open function speak() = "hi" // polymorphic implicit this method call x: String = speak() } class Bar2 extends Foo2 { - function speak() = "bye" + override function speak() = "bye" } res17 = new Foo2 {}.x diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/modules/supercalls1.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/modules/supercalls1.pkl index 2fdecb262..8350ca598 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/modules/supercalls1.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/modules/supercalls1.pkl @@ -2,5 +2,5 @@ open module supercalls1 prefix = "" function say(msg) = prefix + msg -function sameMethod() = 1 +open function sameMethod() = 1 sameProp = "a" diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/modules/supercalls2.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/modules/supercalls2.pkl index 1706f759e..893994f1d 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/modules/supercalls2.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/modules/supercalls2.pkl @@ -5,5 +5,5 @@ extends "supercalls1.pkl" hidden pigeon = super.say("Pigeon") function barnOwl() = super.say("Barn Owl") function say2(msg) = super.say(msg) + super.say(msg) -function sameMethod() = 2 + super.sameMethod() +override function sameMethod() = 2 + super.sameMethod() sameProp = super.sameProp + "b" diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/modules/supercalls3.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/modules/supercalls3.pkl index 30a3c130d..bc8767971 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/modules/supercalls3.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/modules/supercalls3.pkl @@ -8,7 +8,7 @@ hidden pigeonBarnOwl = super.pigeon + super.barnOwl() function barnOwlPigeon() = super.barnOwl() + super.pigeon hidden parrot = super.say("Parrot") function other() = super.other() -function sameMethod() = 3 + super.sameMethod() +override function sameMethod() = 3 + super.sameMethod() sameProp = super.sameProp + "c" prefix = "Oh " diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/api/reflect4.pcf b/pkl-core/src/test/files/LanguageSnippetTests/output/api/reflect4.pcf index 94ce1d7c4..b366901cd 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/api/reflect4.pcf +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/api/reflect4.pcf @@ -13,24 +13,39 @@ examples { name = "overriddenInBFromA" annotations {} allAnnotations {} - modifiers {} - allModifiers {} + modifiers { + "override" + } + allModifiers { + "open" + "override" + } type = "Int" } ["overriddenInCFromA"] { name = "overriddenInCFromA" annotations {} allAnnotations {} - modifiers {} - allModifiers {} + modifiers { + "override" + } + allModifiers { + "open" + "override" + } type = "Int" } ["overriddenInBCFromA"] { name = "overriddenInBCFromA" annotations {} allAnnotations {} - modifiers {} - allModifiers {} + modifiers { + "override" + } + allModifiers { + "open" + "override" + } type = "Boolean" } ["modA"] { @@ -52,10 +67,13 @@ examples { modifiers { "hidden" "fixed" + "override" } allModifiers { + "open" "hidden" "fixed" + "override" } type = "Int" } @@ -66,10 +84,13 @@ examples { modifiers { "hidden" "fixed" + "override" } allModifiers { + "open" "hidden" "fixed" + "override" } type = "Int" } @@ -79,10 +100,13 @@ examples { allAnnotations {} modifiers { "fixed" + "override" } allModifiers { + "open" "hidden" "fixed" + "override" } type = "Boolean" } @@ -93,10 +117,13 @@ examples { modifiers { "hidden" "fixed" + "override" } allModifiers { + "open" "hidden" "fixed" + "override" } type = "Boolean" } @@ -121,8 +148,13 @@ examples { "new MyAnn {}" "new Unlisted {}" } - modifiers {} - allModifiers {} + modifiers { + "override" + } + allModifiers { + "open" + "override" + } type = "String" } ["annAOverrideC"] { @@ -134,8 +166,13 @@ examples { "new MyAnn {}" "new Unlisted {}" } - modifiers {} - allModifiers {} + modifiers { + "override" + } + allModifiers { + "open" + "override" + } type = "String" } ["annAOverrideBC"] { @@ -148,8 +185,13 @@ examples { "new MyAnn {}" "new Unlisted {}" } - modifiers {} - allModifiers {} + modifiers { + "override" + } + allModifiers { + "open" + "override" + } type = "String" } ["inheritedFromB"] { @@ -164,8 +206,13 @@ examples { name = "overriddenInCFromB" annotations {} allAnnotations {} - modifiers {} - allModifiers {} + modifiers { + "override" + } + allModifiers { + "open" + "override" + } type = "Int" } ["modB"] { diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/api/reflectedDeclaration.pcf b/pkl-core/src/test/files/LanguageSnippetTests/output/api/reflectedDeclaration.pcf index 176422757..783a33b5d 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/api/reflectedDeclaration.pcf +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/api/reflectedDeclaration.pcf @@ -87,7 +87,7 @@ alias { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -138,7 +138,7 @@ alias { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -223,7 +223,7 @@ alias { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -274,7 +274,7 @@ alias { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -381,7 +381,7 @@ alias { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -536,7 +536,7 @@ alias { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -587,7 +587,7 @@ alias { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -672,7 +672,7 @@ alias { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -723,7 +723,7 @@ alias { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -2394,7 +2394,7 @@ alias { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -3455,7 +3455,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -3506,7 +3506,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -3591,7 +3591,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -3642,7 +3642,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -3699,7 +3699,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -3843,7 +3843,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -3894,7 +3894,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -3979,7 +3979,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -4030,7 +4030,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -4087,7 +4087,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -4218,7 +4218,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -4452,7 +4452,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -4503,7 +4503,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -4588,7 +4588,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -4639,7 +4639,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -4696,7 +4696,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -4840,7 +4840,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -4891,7 +4891,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -4976,7 +4976,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -5027,7 +5027,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -5084,7 +5084,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -5215,7 +5215,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() @@ -5370,7 +5370,7 @@ rec { This method is used to convert the values of string interpolation expressions to strings. """ annotations = List() - modifiers = Set() + modifiers = Set("open") name = "toString" typeParameters = List() parameters = Map() diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMethodNotImplemented1.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMethodNotImplemented1.err new file mode 100644 index 000000000..f3cba3348 --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMethodNotImplemented1.err @@ -0,0 +1,6 @@ +–– Pkl Error –– +Class `abstractMethodNotImplemented1#MyClass` should either be declared `abstract`, or should implement method `foo`. + +x | class MyClass extends AbstractMethod { + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +at abstractMethodNotImplemented1 (file:///$snippetsDir/input/errors/abstractMethodNotImplemented1.pkl) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMethodNotImplemented2.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMethodNotImplemented2.err new file mode 100644 index 000000000..2c6cd8b89 --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMethodNotImplemented2.err @@ -0,0 +1,8 @@ +–– Pkl Error –– +Class `abstractMethodNotImplemented2#MyClass` should either be declared `abstract`, or implement the following methods: +foo() +bar() + +x | class MyClass extends AbstractMethods { + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +at abstractMethodNotImplemented2 (file:///$snippetsDir/input/errors/abstractMethodNotImplemented2.pkl) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMethodNotImplemented3.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMethodNotImplemented3.err new file mode 100644 index 000000000..76679da72 --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMethodNotImplemented3.err @@ -0,0 +1,6 @@ +–– Pkl Error –– +Class `abstractMethodNotImplemented3` should either be declared `abstract`, or should implement method `bar`. + +x | extends "../../input-helper/classes/AbstractModule.pkl" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +at abstractMethodNotImplemented3 (file:///$snippetsDir/input/errors/abstractMethodNotImplemented3.pkl) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMethodNotImplemented4.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMethodNotImplemented4.err new file mode 100644 index 000000000..4a3b1ca53 --- /dev/null +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractMethodNotImplemented4.err @@ -0,0 +1,6 @@ +–– Pkl Error –– +Class `abstractMethodNotImplemented4#MyClass` should either be declared `abstract`, or should implement method `foo`. + +x | class MyClass extends AbstractIntermediate { + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +at abstractMethodNotImplemented4 (file:///$snippetsDir/input/errors/abstractMethodNotImplemented4.pkl) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidClassMethodModifier.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidClassMethodModifier.err deleted file mode 100644 index 93aadd130..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidClassMethodModifier.err +++ /dev/null @@ -1,6 +0,0 @@ -–– Pkl Error –– -Modifier `open` is not applicable to methods. - -x | open function foo() = 42 - ^^^^ -at invalidClassMethodModifier#Foo (file:///$snippetsDir/input/errors/invalidClassMethodModifier.pkl) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidClassPropertyModifier.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidClassPropertyModifier.err deleted file mode 100644 index 0ad299d6e..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidClassPropertyModifier.err +++ /dev/null @@ -1,6 +0,0 @@ -–– Pkl Error –– -Modifier `open` is not applicable to properties. - -x | open foo: Int = 42 - ^^^^ -at invalidClassPropertyModifier#Foo (file:///$snippetsDir/input/errors/invalidClassPropertyModifier.pkl) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidMethodModifier.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidMethodModifier.err deleted file mode 100644 index be96d9c56..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidMethodModifier.err +++ /dev/null @@ -1,6 +0,0 @@ -–– Pkl Error –– -Modifier `open` is not applicable to methods. - -x | open function foo() = 42 - ^^^^ -at invalidMethodModifier (file:///$snippetsDir/input/errors/invalidMethodModifier.pkl) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidOutput1.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidOutput1.err deleted file mode 100644 index 0db295747..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidOutput1.err +++ /dev/null @@ -1,6 +0,0 @@ -–– Pkl Error –– -Expected `output` of module `file:///$snippetsDir/input/errors/invalidOutput1.pkl` to be of type `ModuleOutput`, but got type `String`. - -x | output: String = "abc" - ^^^^^ -at output (file:///$snippetsDir/input/errors/invalidOutput1.pkl) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidOutput2.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidOutput2.err deleted file mode 100644 index ab0b7d1c2..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidOutput2.err +++ /dev/null @@ -1,6 +0,0 @@ -–– Pkl Error –– -Expected `output` of module `file:///$snippetsDir/input/errors/invalidOutput2.pkl` to be of type `ModuleOutput`, but got type `invalidOutput2#Test`. - -x | output: Test = new {} - ^^^^^^ -at output (file:///$snippetsDir/input/errors/invalidOutput2.pkl) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidPropertyModifier.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidPropertyModifier.err deleted file mode 100644 index 931803cbb..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidPropertyModifier.err +++ /dev/null @@ -1,6 +0,0 @@ -–– Pkl Error –– -Modifier `open` is not applicable to properties. - -x | open foo: Int = 42 - ^^^^ -at invalidPropertyModifier (file:///$snippetsDir/input/errors/invalidPropertyModifier.pkl) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference17.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference17.err deleted file mode 100644 index b04be664a..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference17.err +++ /dev/null @@ -1,16 +0,0 @@ -–– Pkl Error –– -Cannot find property `output` in object of type `pkl.ref#Reference`. - -xx | test = ref.Reference(d, ReferencedModuleWithOutputOverride.getClass(), "").output - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -at reference17#test (file:///$snippetsDir/input/errors/reference17.pkl) - -Cannot reference property `output` because it is defined inside external class `Module`. - -xxx | renderer.renderDocument(value) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -at pkl.base#Module.output.text (pkl:base) - -xxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes("UTF-8") - ^^^^ -at pkl.base#Module.output.bytes (pkl:base) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference18.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference18.err deleted file mode 100644 index be4744eef..000000000 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference18.err +++ /dev/null @@ -1,16 +0,0 @@ -–– Pkl Error –– -Cannot find property `output` in object of type `pkl.ref#Reference`. - -xx | test = ref.Reference(d, ModuleSubclass, "").output - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -at reference18#test (file:///$snippetsDir/input/errors/reference18.pkl) - -Cannot reference property `output` because it is defined inside external class `Module`. - -xxx | renderer.renderDocument(value) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -at pkl.base#Module.output.text (pkl:base) - -xxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes("UTF-8") - ^^^^ -at pkl.base#Module.output.bytes (pkl:base) diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference20.err b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference20.err index 08663a8a8..fdc9a8040 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference20.err +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/errors/reference20.err @@ -1,12 +1,12 @@ –– Pkl Error –– not supported -x | function renderReference(reference: ref.Reference): String = throw("not supported") - ^^^^^^^^^^^^^^^^^^^^^^ +x | override function renderReference(reference: ref.Reference): String = throw("not supported") + ^^^^^^^^^^^^^^^^^^^^^^ at reference20#D.renderReference (file:///$snippetsDir/input/errors/reference20.pkl) -xxx | function toString(): String = getDomain().renderReference(this) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +xxx | override function toString(): String = getDomain().renderReference(this) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ at pkl.ref#Reference.toString (pkl:ref) xx | testInterpolation = "test:\(test)" diff --git a/pkl-core/src/test/kotlin/org/pkl/core/ClassInheritanceTest.kt b/pkl-core/src/test/kotlin/org/pkl/core/ClassInheritanceTest.kt index d2e751a8a..9740fa626 100644 --- a/pkl-core/src/test/kotlin/org/pkl/core/ClassInheritanceTest.kt +++ b/pkl-core/src/test/kotlin/org/pkl/core/ClassInheritanceTest.kt @@ -56,10 +56,10 @@ class ClassInheritanceTest { """ class Thing open class Base { - hidden thing: Thing + open hidden thing: Thing } class Derived extends Base { - thing: Thing = new {} + override thing: Thing = new {} } """ .trimIndent() diff --git a/pkl-core/src/test/kotlin/org/pkl/core/EvaluatorTest.kt b/pkl-core/src/test/kotlin/org/pkl/core/EvaluatorTest.kt index 6679603d8..6b7cefc32 100644 --- a/pkl-core/src/test/kotlin/org/pkl/core/EvaluatorTest.kt +++ b/pkl-core/src/test/kotlin/org/pkl/core/EvaluatorTest.kt @@ -674,17 +674,17 @@ class EvaluatorTest { """ import "pkl:pklbinary" abstract class Base { - fixed kind: String + open fixed kind: String input: String local encodedRequest = new pklbinary.Renderer {}.renderValue(this).base64 hidden fixed requestUri: String = "b64:\(encodedRequest)" hidden fixed result: Resource = read(requestUri) as Resource } class Enc extends Base { - fixed kind: "enc" + override fixed kind: "enc" } class Dec extends Base { - fixed kind: "dec" + override fixed kind: "dec" } local enc = new Enc { input = "hello world" } local dec = new Dec { input = enc.result.text } diff --git a/pkl-core/src/test/kotlin/org/pkl/core/runtime/CommandSpecParserTest.kt b/pkl-core/src/test/kotlin/org/pkl/core/runtime/CommandSpecParserTest.kt index 8b3432a07..7f5023c8f 100644 --- a/pkl-core/src/test/kotlin/org/pkl/core/runtime/CommandSpecParserTest.kt +++ b/pkl-core/src/test/kotlin/org/pkl/core/runtime/CommandSpecParserTest.kt @@ -36,7 +36,7 @@ class CommandSpecParserTest { extends "pkl:Command" import "pkl:Command" - options: Options + override options: Options output { value = options @@ -144,7 +144,7 @@ class CommandSpecParserTest { "cmd.pkl", """ extends "pkl:Command" - options: "nope" | "try again" + override options: "nope" | "try again" """ .trimIndent(), ) @@ -164,7 +164,7 @@ class CommandSpecParserTest { "cmd.pkl", """ extends "pkl:Command" - options: Options + override options: Options abstract class Options {} """ .trimIndent(), @@ -208,12 +208,12 @@ class CommandSpecParserTest { /// bar in BaseOptions @Flag { shortName = "b" } - bar: String + open bar: String } class Options extends BaseOptions { /// bar in Options @Flag { shortName = "x" } - bar: String + override bar: String /// baz in Options @Flag { shortName = "y" } diff --git a/pkl-core/src/test/resources/org/pkl/core/EvaluateSchemaTest.pkl b/pkl-core/src/test/resources/org/pkl/core/EvaluateSchemaTest.pkl index e040a85a4..852e1408a 100644 --- a/pkl-core/src/test/resources/org/pkl/core/EvaluateSchemaTest.pkl +++ b/pkl-core/src/test/resources/org/pkl/core/EvaluateSchemaTest.pkl @@ -17,8 +17,8 @@ function methodb2(str: String(!isEmpty, startsWith("a"))): Int(isPositive) = /// comment class Classb1 extends Classa1 { - name: String - age: Int + override name: String + override age: Int } propertyb3 = (_, _) -> 3 diff --git a/pkl-core/src/test/resources/org/pkl/core/EvaluateSchemaTestBaseModule.pkl b/pkl-core/src/test/resources/org/pkl/core/EvaluateSchemaTestBaseModule.pkl index a058b146e..372986b14 100644 --- a/pkl-core/src/test/resources/org/pkl/core/EvaluateSchemaTestBaseModule.pkl +++ b/pkl-core/src/test/resources/org/pkl/core/EvaluateSchemaTestBaseModule.pkl @@ -5,6 +5,6 @@ propertya1 = "pigeon" function methoda1() = "pigeon" open class Classa1 { - name: String - age: Int + open name: String + open age: Int } diff --git a/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/classInheritance.pkl b/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/classInheritance.pkl index d306705ba..c50e071b6 100644 --- a/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/classInheritance.pkl +++ b/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/classInheritance.pkl @@ -3,24 +3,24 @@ module com.package1.classInheritance abstract class MyClass1 { /// Inherited property comment. - property1: Boolean + open property1: Boolean /// function method1 in class MyClass1. abstract function method1(arg: String): Boolean } open class MyClass2 extends MyClass1 { - property1: Boolean = false + override property1: Boolean = false property2: String = "" /// function method1 in class MyClass2. - function method1(arg: String): Boolean = Undefined() + override function method1(arg: String): Boolean = Undefined() function method2(arg: String): Boolean = Undefined() } abstract class MyClass3 extends MyClass2 { - property1: Boolean = true - function method1(arg: String): Boolean = Undefined() + override property1: Boolean = true + override function method1(arg: String): Boolean = Undefined() } class MyClass4 extends MyClass2 { diff --git a/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleMethodCommentInheritance.pkl b/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleMethodCommentInheritance.pkl index 1bd8a8b96..bf5c9184e 100644 --- a/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleMethodCommentInheritance.pkl +++ b/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleMethodCommentInheritance.pkl @@ -2,4 +2,4 @@ module com.package1.moduleMethodCommentInheritance extends "moduleMethodComments.pkl" -function method3(arg: String): Boolean = Undefined() +override function method3(arg: String): Boolean = Undefined() diff --git a/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleMethodComments.pkl b/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleMethodComments.pkl index 02093b4c8..ef81cbb66 100644 --- a/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleMethodComments.pkl +++ b/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleMethodComments.pkl @@ -12,7 +12,7 @@ function method1(): Float = Undefined() function method2(): Float = Undefined() /// Method with single-line doc comment. -function method3(): Float = Undefined() +open function method3(): Float = Undefined() /// Method with /// multi-line diff --git a/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/modulePropertyCommentInheritance.pkl b/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/modulePropertyCommentInheritance.pkl index 5d09a905e..344030fad 100644 --- a/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/modulePropertyCommentInheritance.pkl +++ b/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/modulePropertyCommentInheritance.pkl @@ -2,4 +2,4 @@ module com.package1.modulePropertyCommentInheritance extends "modulePropertyComments.pkl" -property3: Float = 1.23 +override property3: Float = 1.23 diff --git a/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/modulePropertyComments.pkl b/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/modulePropertyComments.pkl index 3318b8f3d..6824e24a7 100644 --- a/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/modulePropertyComments.pkl +++ b/pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/modulePropertyComments.pkl @@ -12,7 +12,7 @@ property1: Float = 3.14159265359 property2: Float = 3.14159265359 /// Property with single-line doc comment. -property3: Float = 3.14159265359 +open property3: Float = 3.14159265359 /// Property with /// multi-line diff --git a/pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/Module Containing Spaces/index.html b/pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/Module Containing Spaces/index.html index 38a5fcc8f..0e98cc668 100644 --- a/pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/Module Containing Spaces/index.html +++ b/pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/Module Containing Spaces/index.html @@ -87,7 +87,7 @@

Methods(