void AutoComplete()

in src/Shared/Compat/XmlTextWriter.cs [998:1097]


        void AutoComplete(Token token) {
            if (this.currentState == State.Closed) {
                throw new InvalidOperationException("Xml_Closed");
            }
            else if (this.currentState == State.Error) {
                throw new InvalidOperationException("Xml_WrongToken: " + tokenName[(int)token] + ", " + stateName[(int)State.Error]);
            }
 
            State newState = this.stateTable[(int)token * 8 + (int)this.currentState];
            if (newState == State.Error) {
                throw new InvalidOperationException("Xml_WrongToken: " + tokenName[(int)token] + ", " + stateName[(int)this.currentState]);
            }
 
            switch (token) {
                case Token.Doctype:
                    if (this.indented && this.currentState != State.Start) {
                        Indent(false);
                    }
                    break;
 
                case Token.StartElement:
                case Token.Comment:
                case Token.PI:
                case Token.CData:
                    if (this.currentState == State.Attribute) {
                        WriteEndAttributeQuote();
                        WriteEndStartTag(false);
                    }
                    else if (this.currentState == State.Element) {
                        WriteEndStartTag(false);
                    }
                    if (token == Token.CData) {
                        stack[top].mixed = true;
                    }
                    else if (this.indented && this.currentState != State.Start) {
                        Indent(false);
                    }
                    break;
 
                case Token.EndElement:
                case Token.LongEndElement:
                    if (this.flush) {
                        FlushEncoders();
                    }
                    if (this.currentState == State.Attribute) {
                        WriteEndAttributeQuote();
                    }
                    if (this.currentState == State.Content) {
                        token = Token.LongEndElement;
                    }
                    else {
                        WriteEndStartTag(token == Token.EndElement);
                    }
                    if (stateTableDocument == this.stateTable && top == 1) {
                        newState = State.Epilog;
                    }
                    break;
 
                case Token.StartAttribute:
                    if (this.flush) {
                        FlushEncoders();
                    }
                    if (this.currentState == State.Attribute) {
                        WriteEndAttributeQuote();
                        textWriter.Write(' ');
                    }
                    else if (this.currentState == State.Element) {
                        textWriter.Write(' ');
                    }
                    break;
 
                case Token.EndAttribute:
                    if (this.flush) {
                        FlushEncoders();
                    }
                    WriteEndAttributeQuote();
                    break;
 
                case Token.Whitespace:
                case Token.Content:
                case Token.RawData:
                case Token.Base64:
 
                    if (token != Token.Base64 && this.flush) {
                        FlushEncoders();
                    }
                    if (this.currentState == State.Element && this.lastToken != Token.Content) {
                        WriteEndStartTag(false);
                    }
                    if (newState == State.Content) {
                        stack[top].mixed = true;
                    }
                    break;
 
                default:
                    throw new InvalidOperationException("Xml_InvalidOperation");
            }
            this.currentState = newState;
            this.lastToken = token;
        }