@@ -3007,18 +3007,38 @@ export abstract class DeclaredElement extends Element {
3007
3007
isCompatibleOverride ( base : DeclaredElement ) : bool {
3008
3008
var self : DeclaredElement = this ; // TS
3009
3009
var kind = self . kind ;
3010
+ var checkCompatibleOverride = false ;
3010
3011
if ( kind == base . kind ) {
3011
3012
switch ( kind ) {
3013
+ case ElementKind . FUNCTION_PROTOTYPE : {
3014
+ let selfFunction = this . program . resolver . resolveFunction ( < FunctionPrototype > self , null ) ;
3015
+ if ( ! selfFunction ) return false ;
3016
+ let baseFunction = this . program . resolver . resolveFunction ( < FunctionPrototype > base , null ) ;
3017
+ if ( ! baseFunction ) return false ;
3018
+ self = selfFunction ;
3019
+ base = baseFunction ;
3020
+ checkCompatibleOverride = true ;
3021
+ // fall-through
3022
+ }
3012
3023
case ElementKind . FUNCTION : {
3013
- return ( < Function > self ) . signature . isAssignableTo ( ( < Function > base ) . signature ) ;
3024
+ return ( < Function > self ) . signature . isAssignableTo ( ( < Function > base ) . signature , checkCompatibleOverride ) ;
3025
+ }
3026
+ case ElementKind . PROPERTY_PROTOTYPE : {
3027
+ let selfProperty = this . program . resolver . resolveProperty ( < PropertyPrototype > self ) ;
3028
+ if ( ! selfProperty ) return false ;
3029
+ let baseProperty = this . program . resolver . resolveProperty ( < PropertyPrototype > base ) ;
3030
+ if ( ! baseProperty ) return false ;
3031
+ self = selfProperty ;
3032
+ base = baseProperty ;
3033
+ // fall-through
3014
3034
}
3015
3035
case ElementKind . PROPERTY : {
3016
3036
let selfProperty = < Property > self ;
3017
3037
let baseProperty = < Property > base ;
3018
3038
let selfGetter = selfProperty . getterInstance ;
3019
3039
let baseGetter = baseProperty . getterInstance ;
3020
3040
if ( selfGetter ) {
3021
- if ( ! baseGetter || ! selfGetter . signature . isAssignableTo ( baseGetter . signature ) ) {
3041
+ if ( ! baseGetter || ! selfGetter . signature . isAssignableTo ( baseGetter . signature , true ) ) {
3022
3042
return false ;
3023
3043
}
3024
3044
} else if ( baseGetter ) {
@@ -3027,14 +3047,18 @@ export abstract class DeclaredElement extends Element {
3027
3047
let selfSetter = selfProperty . setterInstance ;
3028
3048
let baseSetter = baseProperty . setterInstance ;
3029
3049
if ( selfSetter ) {
3030
- if ( ! baseSetter || ! selfSetter . signature . isAssignableTo ( baseSetter . signature ) ) {
3050
+ if ( ! baseSetter || ! selfSetter . signature . isAssignableTo ( baseSetter . signature , true ) ) {
3031
3051
return false ;
3032
3052
}
3033
3053
} else if ( baseSetter ) {
3034
3054
return false ;
3035
3055
}
3036
3056
return true ;
3037
3057
}
3058
+ // TODO: Implement properties overriding fields and vice-versa. Challenge is that anything overridable requires
3059
+ // a virtual stub, but fields aren't functions. Either all (such) fields should become property-like, with a
3060
+ // getter and a setter that can participate as a virtual stub, or it's allowed one-way, with fields integrated
3061
+ // into what can be a virtual stub as get=load and set=store, then not necessarily with own accessor functions.
3038
3062
}
3039
3063
}
3040
3064
return false ;
@@ -4294,6 +4318,11 @@ export class Class extends TypedElement {
4294
4318
) ;
4295
4319
}
4296
4320
4321
+ /** Tests if this is an interface. */
4322
+ get isInterface ( ) : bool {
4323
+ return this . kind == ElementKind . INTERFACE ;
4324
+ }
4325
+
4297
4326
/** Constructs a new class. */
4298
4327
constructor (
4299
4328
/** Name incl. type parameters, i.e. `Foo<i32>`. */
0 commit comments