private static bool TreesAreDifferent(Block leftTree, Block rightTree, TextChange change) { Span changeOwner = leftTree.LocateOwner(change); // Apply the change to the tree if (changeOwner == null) { return(true); } changeOwner.ApplyChange(change, force: true); // Now compare the trees return(!Equals(leftTree, rightTree)); }
// Try to parse the change incrementally // Partial Parsing succeeds if: // * A single span can be identified which owns the change (i.e. it doesn't overlap multiple spans) // * The span which owns the change has logic to accept it // The performance of this method is crucial, since it occurs on the caller's thread (usually a UI thread). private PartialParseResult TryPartialParse(TextChange change) { PartialParseResult result = PartialParseResult.Rejected; if (CurrentParseTree != null && !_parseUnderway) { // Try the last change owner if (_lastChangeOwner != null && _lastChangeOwner.OwnsChange(change)) { result = _lastChangeOwner.ApplyChange(change); // If the last change was provisional, then the result of this span's attempt to parse partially goes // Otherwise, accept the change if this span accepted it, but if it didn't, just do the standard search. if (LastResultProvisional || result.HasFlag(PartialParseResult.Accepted)) { return(result); } } // Locate the span responsible for this change _lastChangeOwner = CurrentParseTree.LocateOwner(change); if (LastResultProvisional) { // Last change owner couldn't accept this, so we must do a full reparse result = PartialParseResult.Rejected; } else if (_lastChangeOwner != null) { result = _lastChangeOwner.ApplyChange(change); if (result.HasFlag(PartialParseResult.AutoCompleteBlock)) { _lastAutoCompleteSpan = _lastChangeOwner; } } } return(result); }