From 7a449c73ccc798425d7534d61983c4a3c65411ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 2 Feb 2024 05:44:09 +0100 Subject: [PATCH] Fixed error detection --- src/expresses.ts | 30 ++++++++++++++++++------------ src/tests.ts | 8 +++----- src/util/extend.ts | 4 ++-- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/expresses.ts b/src/expresses.ts index 429629c..edb6428 100644 --- a/src/expresses.ts +++ b/src/expresses.ts @@ -6,18 +6,24 @@ import { ExtendFn, ExtendableFn, SimplifyFn, StaticMembersFn } from "./util" class TraitExpression< Super extends AbstractClass, - Traits extends readonly Trait[], + Traits extends Trait[], > { constructor( readonly superclass: Super, readonly traits: Traits, ) {} - get implements() { - return {} + get implements(): ( + Pipe, + ExtendFn, + SimplifyFn, + ]> + ) { + throw new Error("Not meant to be called") } - extends(): ( + get extends(): ( AbstractClass< Pipe<[ InstanceType, @@ -59,7 +65,7 @@ export type Implements> = ( class TraitExpressionBuilder< Super extends AbstractClass, - Traits extends readonly Trait[], + Traits extends Trait[], > { constructor(public expression: TraitExpression) {} @@ -75,7 +81,7 @@ class TraitExpressionBuilder< } expresses< - AppendTraits extends readonly Trait[] + AppendTraits extends Trait[] >(...traits: AppendTraits) { return new TraitExpressionBuilder( new TraitExpression( @@ -89,15 +95,15 @@ class TraitExpressionBuilder< return this.expression as GetTraitExpression } - then(fn: (expression: typeof this.expression) => V): V { - return fn(this.expression) + then(fn: (expression: ReturnType) => V): V { + return fn(this.get()) } } type AbstractMembersExtendable< Super extends AbstractClass, - Traits extends readonly Trait[], + Traits extends Trait[], > = ( Call, @@ -107,7 +113,7 @@ type AbstractMembersExtendable< type ImplInstanceExtendable< Super extends AbstractClass, - Traits extends readonly Trait[], + Traits extends Trait[], > = ( Call, @@ -117,7 +123,7 @@ type ImplInstanceExtendable< type ImplStaticMembersExtendable< Super extends AbstractClass, - Traits extends readonly Trait[], + Traits extends Trait[], > = ( Pipe<[ Super, @@ -130,7 +136,7 @@ type ImplStaticMembersExtendable< type GetTraitExpression< Super extends AbstractClass, - Traits extends readonly Trait[], + Traits extends Trait[], > = ( Call extends true ? "Cannot express an empty list of traits." diff --git a/src/tests.ts b/src/tests.ts index cd7e8a7..ac36276 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,3 +1,4 @@ +import { Identity, Pipe, Tuples } from "hotscript" import { Implements, TraitAbstractMembers, expression, trait } from "." @@ -51,17 +52,14 @@ class TestSuperclass { const builder = expression .extends(TestSuperclass) .expresses( - // PrintsHelloOnNew, + PrintsHelloOnNew, Identifiable(), // Identifiable(), ) -type Impl = Implements - - const exp = builder.get() -class User extends exp.extends() implements (typeof exp.implements) { +class User extends exp.extends implements (typeof exp.implements) { // id: bigint = -1n } diff --git a/src/util/extend.ts b/src/util/extend.ts index 4639319..a7ee625 100644 --- a/src/util/extend.ts +++ b/src/util/extend.ts @@ -13,7 +13,7 @@ interface ExtendReducerFn extends Fn { } export type ExtendFn = Tuples.Reduce -export type Extend = Call +export type Extend = Call export type ExtendableFn = ComposeLeft<[ @@ -23,4 +23,4 @@ export type ExtendableFn = ComposeLeft<[ Match.With, ]> ]> -export type Extendable = Call +export type Extendable = Call