Skip to content

Commit 2aa73d8

Browse files
committed
refactor / fix
1 parent 6014dfe commit 2aa73d8

File tree

3 files changed

+92
-88
lines changed

3 files changed

+92
-88
lines changed

src/program.ts

Lines changed: 44 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3003,33 +3003,6 @@ export abstract class DeclaredElement extends Element {
30033003
return this.declaration.decorators;
30043004
}
30053005

3006-
/** Determine if two properties are compatibal during override by their getter and setter signature . */
3007-
private _isCampatibalOverrideProperty(selfProperty: Property|null, baseProperty: Property|null, ignoreInheritLineCheck: bool = false): bool {
3008-
if (!selfProperty || !baseProperty) {
3009-
return false;
3010-
} else {
3011-
let selfGetter = selfProperty.getterInstance;
3012-
let baseGetter = baseProperty.getterInstance;
3013-
if (selfGetter) {
3014-
if (!baseGetter || !selfGetter.signature.isAssignableTo(baseGetter.signature, true)) {
3015-
return false;
3016-
}
3017-
} else if (baseGetter) {
3018-
return false;
3019-
}
3020-
let selfSetter = selfProperty.setterInstance;
3021-
let baseSetter = baseProperty.setterInstance;
3022-
if (selfSetter) {
3023-
if (!baseSetter || !selfSetter.signature.isAssignableTo(baseSetter.signature, true)) {
3024-
return false;
3025-
}
3026-
} else if (baseSetter) {
3027-
return false;
3028-
}
3029-
}
3030-
return true;
3031-
}
3032-
30333006
/** Checks if this element is a compatible override of the specified. */
30343007
isCompatibleOverride(base: DeclaredElement): bool {
30353008
var self: DeclaredElement = this; // TS
@@ -3050,35 +3023,58 @@ export abstract class DeclaredElement extends Element {
30503023
}
30513024
case ElementKind.PROPERTY_PROTOTYPE: {
30523025
let selfProperty = this.program.resolver.resolveProperty(<PropertyPrototype>self);
3026+
if (!selfProperty) return false;
30533027
let baseProperty = this.program.resolver.resolveProperty(<PropertyPrototype>base);
3054-
return this._isCampatibalOverrideProperty(selfProperty, baseProperty, true);
3028+
if (!baseProperty) return false;
3029+
self = selfProperty;
3030+
base = baseProperty;
3031+
// fall-through
30553032
}
30563033
case ElementKind.PROPERTY: {
30573034
let selfProperty = <Property>self;
30583035
let baseProperty = <Property>base;
3059-
return self._isCampatibalOverrideProperty(selfProperty, baseProperty);
3060-
}
3061-
}
3062-
}
3063-
if (self.kind == ElementKind.FIELD && base.kind == ElementKind.PROPERTY_PROTOTYPE) {
3064-
// class A implement I, class B extends A implement I
3065-
let selfField = <Field>self;
3066-
let baseProperty = this.program.resolver.resolveProperty(<PropertyPrototype>base);
3067-
if (!selfField.internalGetterSignature || !selfField.internalSetterSignature || !baseProperty) {
3068-
return false;
3069-
}
3070-
let baseGetterInsance = baseProperty.getterInstance;
3071-
let baseSetterInsance = baseProperty.setterInstance;
3072-
if (baseGetterInsance && baseSetterInsance) {
3073-
if (!selfField.internalGetterSignature.isAssignableTo(baseGetterInsance.signature)
3074-
|| !selfField.internalSetterSignature.isAssignableTo(baseSetterInsance.signature)) {
3075-
return false;
3036+
let selfGetter = selfProperty.getterInstance;
3037+
let baseGetter = baseProperty.getterInstance;
3038+
if (selfGetter) {
3039+
if (!baseGetter || !selfGetter.signature.isAssignableTo(baseGetter.signature, true)) {
3040+
return false;
3041+
}
3042+
} else if (baseGetter) {
3043+
return false;
3044+
}
3045+
let selfSetter = selfProperty.setterInstance;
3046+
let baseSetter = baseProperty.setterInstance;
3047+
if (selfSetter) {
3048+
if (!baseSetter || !selfSetter.signature.isAssignableTo(baseSetter.signature, true)) {
3049+
return false;
3050+
}
3051+
} else if (baseSetter) {
3052+
return false;
3053+
}
3054+
return true;
30763055
}
3077-
} else {
3078-
return false;
30793056
}
3080-
return true;
30813057
}
3058+
// TODO: field and property cannot override each other, have different codegen
3059+
// if (self.kind == ElementKind.FIELD && base.kind == ElementKind.PROPERTY_PROTOTYPE) {
3060+
// // class A implement I, class B extends A implement I
3061+
// let selfField = <Field>self;
3062+
// let baseProperty = this.program.resolver.resolveProperty(<PropertyPrototype>base);
3063+
// if (!selfField.internalGetterSignature || !selfField.internalSetterSignature || !baseProperty) {
3064+
// return false;
3065+
// }
3066+
// let baseGetterInsance = baseProperty.getterInstance;
3067+
// let baseSetterInsance = baseProperty.setterInstance;
3068+
// if (baseGetterInsance && baseSetterInsance) {
3069+
// if (!selfField.internalGetterSignature.isAssignableTo(baseGetterInsance.signature)
3070+
// || !selfField.internalSetterSignature.isAssignableTo(baseSetterInsance.signature)) {
3071+
// return false;
3072+
// }
3073+
// } else {
3074+
// return false;
3075+
// }
3076+
// return true;
3077+
// }
30823078
return false;
30833079
}
30843080
}

src/types.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -926,19 +926,27 @@ export class Signature {
926926
}
927927

928928
/** Tests if a value of this function type is assignable to a target of the specified function type. */
929-
isAssignableTo(target: Signature, ignoreInheritLineCheck: bool = false): bool {
930-
931-
if (!ignoreInheritLineCheck) {
932-
// check `this` type
933-
var thisThisType = this.thisType;
934-
var targetThisType = target.thisType;
929+
isAssignableTo(target: Signature, checkCompatibleOverride: bool = false): bool {
930+
var thisThisType = this.thisType;
931+
var targetThisType = target.thisType;
932+
if (!checkCompatibleOverride) {
933+
// check exact `this` type
935934
if (thisThisType) {
936935
if (!targetThisType || !thisThisType.isAssignableTo(targetThisType)) {
937936
return false;
938937
}
939938
} else if (targetThisType) {
940939
return false;
941940
}
941+
} else {
942+
// check kind of `this` type
943+
if (thisThisType) {
944+
if (!targetThisType || thisThisType.kind != targetThisType.kind || thisThisType.isReference != targetThisType.isReference) {
945+
return false;
946+
}
947+
} else if (targetThisType) {
948+
return false;
949+
}
942950
}
943951

944952
// check rest parameter

tests/compiler/class-implements.debug.wat

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2612,7 +2612,7 @@
26122612
global.set $~lib/memory/__stack_pointer
26132613
local.get $1
26142614
)
2615-
(func $class-implements/D#constructor (param $0 i32) (result i32)
2615+
(func $class-implements/D#constructor (param $this i32) (result i32)
26162616
(local $1 i32)
26172617
global.get $~lib/memory/__stack_pointer
26182618
i32.const 4
@@ -2622,25 +2622,25 @@
26222622
global.get $~lib/memory/__stack_pointer
26232623
i32.const 0
26242624
i32.store $0
2625-
local.get $0
2625+
local.get $this
26262626
i32.eqz
26272627
if
26282628
global.get $~lib/memory/__stack_pointer
26292629
i32.const 0
26302630
i32.const 7
26312631
call $~lib/rt/itcms/__new
2632-
local.tee $0
2632+
local.tee $this
26332633
i32.store $0
26342634
end
2635-
local.get $0
2635+
local.get $this
26362636
local.set $1
26372637
global.get $~lib/memory/__stack_pointer
26382638
i32.const 4
26392639
i32.add
26402640
global.set $~lib/memory/__stack_pointer
26412641
local.get $1
26422642
)
2643-
(func $class-implements/E#constructor (param $0 i32) (result i32)
2643+
(func $class-implements/E#constructor (param $this i32) (result i32)
26442644
(local $1 i32)
26452645
global.get $~lib/memory/__stack_pointer
26462646
i32.const 4
@@ -2650,28 +2650,28 @@
26502650
global.get $~lib/memory/__stack_pointer
26512651
i32.const 0
26522652
i32.store $0
2653-
local.get $0
2653+
local.get $this
26542654
i32.eqz
26552655
if
26562656
global.get $~lib/memory/__stack_pointer
26572657
i32.const 4
26582658
i32.const 9
26592659
call $~lib/rt/itcms/__new
2660-
local.tee $0
2660+
local.tee $this
26612661
i32.store $0
26622662
end
2663-
local.get $0
2663+
local.get $this
26642664
i32.const 4
26652665
call $class-implements/E#set:a
2666-
local.get $0
2666+
local.get $this
26672667
local.set $1
26682668
global.get $~lib/memory/__stack_pointer
26692669
i32.const 4
26702670
i32.add
26712671
global.set $~lib/memory/__stack_pointer
26722672
local.get $1
26732673
)
2674-
(func $class-implements/F#constructor (param $0 i32) (result i32)
2674+
(func $class-implements/F#constructor (param $this i32) (result i32)
26752675
(local $1 i32)
26762676
global.get $~lib/memory/__stack_pointer
26772677
i32.const 4
@@ -2681,30 +2681,30 @@
26812681
global.get $~lib/memory/__stack_pointer
26822682
i32.const 0
26832683
i32.store $0
2684-
local.get $0
2684+
local.get $this
26852685
i32.eqz
26862686
if
26872687
global.get $~lib/memory/__stack_pointer
26882688
i32.const 4
26892689
i32.const 12
26902690
call $~lib/rt/itcms/__new
2691-
local.tee $0
2691+
local.tee $this
26922692
i32.store $0
26932693
end
26942694
global.get $~lib/memory/__stack_pointer
2695-
local.get $0
2695+
local.get $this
26962696
call $class-implements/E#constructor
2697-
local.tee $0
2697+
local.tee $this
26982698
i32.store $0
2699-
local.get $0
2699+
local.get $this
27002700
local.set $1
27012701
global.get $~lib/memory/__stack_pointer
27022702
i32.const 4
27032703
i32.add
27042704
global.set $~lib/memory/__stack_pointer
27052705
local.get $1
27062706
)
2707-
(func $class-implements/G#constructor (param $0 i32) (result i32)
2707+
(func $class-implements/G#constructor (param $this i32) (result i32)
27082708
(local $1 i32)
27092709
global.get $~lib/memory/__stack_pointer
27102710
i32.const 4
@@ -2714,33 +2714,33 @@
27142714
global.get $~lib/memory/__stack_pointer
27152715
i32.const 0
27162716
i32.store $0
2717-
local.get $0
2717+
local.get $this
27182718
i32.eqz
27192719
if
27202720
global.get $~lib/memory/__stack_pointer
27212721
i32.const 4
27222722
i32.const 13
27232723
call $~lib/rt/itcms/__new
2724-
local.tee $0
2724+
local.tee $this
27252725
i32.store $0
27262726
end
27272727
global.get $~lib/memory/__stack_pointer
2728-
local.get $0
2728+
local.get $this
27292729
call $class-implements/E#constructor
2730-
local.tee $0
2730+
local.tee $this
27312731
i32.store $0
2732-
local.get $0
2732+
local.get $this
27332733
i32.const 5
27342734
call $class-implements/G#set:a
2735-
local.get $0
2735+
local.get $this
27362736
local.set $1
27372737
global.get $~lib/memory/__stack_pointer
27382738
i32.const 4
27392739
i32.add
27402740
global.set $~lib/memory/__stack_pointer
27412741
local.get $1
27422742
)
2743-
(func $class-implements/H#constructor (param $0 i32) (result i32)
2743+
(func $class-implements/H#constructor (param $this i32) (result i32)
27442744
(local $1 i32)
27452745
global.get $~lib/memory/__stack_pointer
27462746
i32.const 4
@@ -2750,30 +2750,30 @@
27502750
global.get $~lib/memory/__stack_pointer
27512751
i32.const 0
27522752
i32.store $0
2753-
local.get $0
2753+
local.get $this
27542754
i32.eqz
27552755
if
27562756
global.get $~lib/memory/__stack_pointer
27572757
i32.const 0
27582758
i32.const 14
27592759
call $~lib/rt/itcms/__new
2760-
local.tee $0
2760+
local.tee $this
27612761
i32.store $0
27622762
end
27632763
global.get $~lib/memory/__stack_pointer
2764-
local.get $0
2764+
local.get $this
27652765
call $class-implements/D#constructor
2766-
local.tee $0
2766+
local.tee $this
27672767
i32.store $0
2768-
local.get $0
2768+
local.get $this
27692769
local.set $1
27702770
global.get $~lib/memory/__stack_pointer
27712771
i32.const 4
27722772
i32.add
27732773
global.set $~lib/memory/__stack_pointer
27742774
local.get $1
27752775
)
2776-
(func $class-implements/K#constructor (param $0 i32) (result i32)
2776+
(func $class-implements/K#constructor (param $this i32) (result i32)
27772777
(local $1 i32)
27782778
global.get $~lib/memory/__stack_pointer
27792779
i32.const 4
@@ -2783,22 +2783,22 @@
27832783
global.get $~lib/memory/__stack_pointer
27842784
i32.const 0
27852785
i32.store $0
2786-
local.get $0
2786+
local.get $this
27872787
i32.eqz
27882788
if
27892789
global.get $~lib/memory/__stack_pointer
27902790
i32.const 0
27912791
i32.const 15
27922792
call $~lib/rt/itcms/__new
2793-
local.tee $0
2793+
local.tee $this
27942794
i32.store $0
27952795
end
27962796
global.get $~lib/memory/__stack_pointer
2797-
local.get $0
2797+
local.get $this
27982798
call $class-implements/D#constructor
2799-
local.tee $0
2799+
local.tee $this
28002800
i32.store $0
2801-
local.get $0
2801+
local.get $this
28022802
local.set $1
28032803
global.get $~lib/memory/__stack_pointer
28042804
i32.const 4

0 commit comments

Comments
 (0)