export {}

//- @IFace defines/binding IFace
//- IFace.node/kind interface
interface IFace {
    //- @ifaceMethod defines/binding IFaceMethod
    //- IFaceMethod.node/kind function
    //- IFaceMethod.complete incomplete
    //- IFaceMethod childof IFace
    ifaceMethod(): void;

    //- @member defines/binding IFaceMember
    //- IFaceMember.node/kind variable
    member: number;
}

//- @IFace ref IFace
interface IExtended extends IFace {}

//- @Class defines/binding Class
//- Class.node/kind record
//- @IFace ref IFace
class Class implements IFace {
    //- @member defines/binding Member
    //- Member.node/kind variable
    //- Member childof Class
    //- !{ Member.tag/static _ }
    member: number;

    //- @staticMember defines/binding StaticMember
    //- StaticMember.tag/static _
    //- StaticMember childof Class
    static staticMember: number;

    // This ctor declares a new member var named 'otherMember', and also
    // declares an ordinary parameter named 'member' (to ensure we don't get
    // confused about params to the ctor vs true member variables).
    //- @constructor defines/binding ClassCtor
    //- ClassCtor.node/kind function
    //- ClassCtor.subkind constructor
    //- @otherMember defines/binding OtherMember
    //- OtherMember.node/kind variable
    //- OtherMember childof Class
    //- !{ OtherMember childof ClassCtor }
    //- @member defines/binding FakeMember
    //- FakeMember.node/kind variable
    //- FakeMember childof ClassCtor
    //- !{ FakeMember childof Class }
    constructor(public otherMember: number, member: string) {}

    //- @method defines/binding Method
    //- Method.node/kind function
    //- Method childof Class
    //- @param defines/binding MethodParam
    //- MethodParam childof Method
    method(param: number) {
        //- @member ref Member
        this.member;
        //- @method ref Method
        this.method(param);
    }

    // TODO: ensure the method is linked to the interface too.
    //- @ifaceMethod defines/binding _ClassIFaceMethod
    ifaceMethod(): void {}
}

// A class without a constructor binds the constructor to its declaration.
//- @Class ref ClassCtor
//- @Subclass defines/binding SubClassCtor
//- SubClassCtor.node/kind function
//- SubClassCtor.subkind constructor
class Subclass extends Class {
    method() {
        //- @member ref Member
        this.member;

        //- @Class ref ClassCtor
        new Class(0, '');

        //- @Class ref Class
        type CC = Class;
    }
}

//- @Class ref ClassCtor
let instance = new Class(3, 'a');
//- @otherMember ref OtherMember
instance.otherMember;

// Using Class in type position should still create a link to the class.
//- @Class ref Class
let useAsType: Class = instance;
