In order to get all diagnostics, you must call all the APIs. And no APIs return
diagnostics produced by other APIs. This is how things were before hte addition
of the getCompletionOptionsDiagnostics API, and i'm returning things to that state.
Spreading emits as ".push.apply(reciver, values)". This pushes every elements in
values onto the stack before calling the function. This can easily stack overflow
if the amount of values is high (i hit this with ~10k values on my own system).
keyword `abstract` is parsed at the head of class declarations and as a modifier for class member functions/variables.
The following checks have been implemented:
* Objects whose type is an abstract class cannot be instantiated with `new`.
* all overloads of a function must match w/r/t having the abstract keyword.
* a member/class decl can't use the `abstract` keyword multiple times.
* a member can't be both `abstract` and `static`.
* a member can't be both `abstract` and `private`.
* Accessibility modifiers can't follow `abstract`
* Only classes and member functions can be declared abstract.
* abstract methods don't need an implementation
* abstract methods can only appear in abstract classes.
TODO:
* forbid abstract methods from having an implementation.
* make sure, barring overriding, an inherited method is abstract iff it is abstract in the parent.
* If a class has an abstract members, then it must be abstract. (eg: class B does not implement inherited member 'foo()')
* prevent overriding a non-abstract method with an abstract method.
* update "abstractness" flag when overriding abstract method with non-abstract method.
* prevent calling an abstract method via super.<abstract method name>()
* make all overloads of an abstract method adjacent to eachother.
* constructors can't be declared abstract -- give appropriate error.
* figure out what to emit to the *.ts file -- probably nothing.
* figure out what to emit to the *.d.ts file.
* process abstract declarations.
On the managed side tracing is disabled by default anyways. By logging we still
cause tons of allocations of strings on the managed side. These then cause
expensive GCs which can pause editing.