anchor.diff:      return new Disposable(obj.callMethod("onDidChangeGrammar", [(e) => callback(new Grammar(e))]));
     }
   
  +  Disposable onDidAddSelection(Consumer<Selection> callback) {
  +    return new Disposable(obj.callMethod("onDidAddSelection", [(e) => callback(new Selection(e))]));
  +  }
  +
  +  Disposable onDidRemoveSelection(Consumer<Selection> callback) {
  +    return new Disposable(obj.callMethod("onDidRemoveSelection", [(e) => callback(new Selection(e))]));
  +  }
  +
  +  ScopeDescriptor get rootScopeDescriptor => new ScopeDescriptor.wrap(obj.callMethod("getRootScopeDescriptor"));
  +  ScopeDescriptor scopeDescriptorForBufferPosition(f) =>
  +    new ScopeDescriptor.wrap(obj.callMethod("scopeDescriptorForBufferPosition", [f is Point ? f.toJS() : f]));
  +
     Disposable observeGrammar(Consumer<Grammar> callback) {
       return new Disposable(obj.callMethod("observeGrammar", [(e) => callback(new Grammar(e))]));
     }
  
positive.code:   List<Selection> get selections => obj.callMethod("getSelections").map((it) =>
      new Selection(it)
    ).toList();
  }
  
  class Selection {
  
negative.code:   Disposable onDidSave(Action callback) => new Disposable(obj.callMethod("onDidSave", [(e) => callback()]));
    Disposable onDidDestroy(Action callback) => new Disposable(obj.callMethod("onDidDestroy", [callback]));
  
    void save() {
      obj.callMethod("save");
    }
  
    void saveAs(String path) {
      obj.callMethod("saveAs", [path]);
    }
  
    void transpose() {
      obj.callMethod("transpose");
    }
  