"use strict";
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

require("core-js/modules/es.regexp.exec.js");

require("core-js/modules/es.string.match.js");

require("core-js/modules/es.object.to-string.js");

require("core-js/modules/es.promise.js");

require("regenerator-runtime/runtime.js");

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getHTMLMode = getHTMLMode;

var languageModelCache_1 = require("../languageModelCache");

function getHTMLMode(htmlLanguageService, workspace) {
  var htmlDocuments = (0, languageModelCache_1.getLanguageModelCache)(10, 60, function (document) {
    return htmlLanguageService.parseHTMLDocument(document);
  });
  return {
    getId: function getId() {
      return 'html';
    },
    getSelectionRange: function getSelectionRange(document, position) {
      return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
        return regeneratorRuntime.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                return _context.abrupt("return", htmlLanguageService.getSelectionRanges(document, [position])[0]);

              case 1:
              case "end":
                return _context.stop();
            }
          }
        }, _callee);
      }))();
    },
    doComplete: function doComplete(document, position, documentContext) {
      var _htmlSettings$complet, _htmlSettings$complet2;

      var settings = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : workspace.settings;
      var htmlSettings = settings === null || settings === void 0 ? void 0 : settings.html;
      var options = merge(htmlSettings === null || htmlSettings === void 0 ? void 0 : htmlSettings.suggest, {});
      options.hideAutoCompleteProposals = (htmlSettings === null || htmlSettings === void 0 ? void 0 : htmlSettings.autoClosingTags) === true;
      options.attributeDefaultValue = (_htmlSettings$complet = htmlSettings === null || htmlSettings === void 0 ? void 0 : (_htmlSettings$complet2 = htmlSettings.completion) === null || _htmlSettings$complet2 === void 0 ? void 0 : _htmlSettings$complet2.attributeDefaultValue) !== null && _htmlSettings$complet !== void 0 ? _htmlSettings$complet : 'doublequotes';
      var htmlDocument = htmlDocuments.get(document);
      var completionList = htmlLanguageService.doComplete2(document, position, htmlDocument, documentContext, options);
      return completionList;
    },
    doHover: function doHover(document, position, settings) {
      return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
        var _settings$html;

        return regeneratorRuntime.wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                return _context2.abrupt("return", htmlLanguageService.doHover(document, position, htmlDocuments.get(document), settings === null || settings === void 0 ? void 0 : (_settings$html = settings.html) === null || _settings$html === void 0 ? void 0 : _settings$html.hover));

              case 1:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2);
      }))();
    },
    findDocumentHighlight: function findDocumentHighlight(document, position) {
      return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
        return regeneratorRuntime.wrap(function _callee3$(_context3) {
          while (1) {
            switch (_context3.prev = _context3.next) {
              case 0:
                return _context3.abrupt("return", htmlLanguageService.findDocumentHighlights(document, position, htmlDocuments.get(document)));

              case 1:
              case "end":
                return _context3.stop();
            }
          }
        }, _callee3);
      }))();
    },
    findDocumentLinks: function findDocumentLinks(document, documentContext) {
      return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {
        return regeneratorRuntime.wrap(function _callee4$(_context4) {
          while (1) {
            switch (_context4.prev = _context4.next) {
              case 0:
                return _context4.abrupt("return", htmlLanguageService.findDocumentLinks(document, documentContext));

              case 1:
              case "end":
                return _context4.stop();
            }
          }
        }, _callee4);
      }))();
    },
    findDocumentSymbols: function findDocumentSymbols(document) {
      return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {
        return regeneratorRuntime.wrap(function _callee5$(_context5) {
          while (1) {
            switch (_context5.prev = _context5.next) {
              case 0:
                return _context5.abrupt("return", htmlLanguageService.findDocumentSymbols(document, htmlDocuments.get(document)));

              case 1:
              case "end":
                return _context5.stop();
            }
          }
        }, _callee5);
      }))();
    },
    format: function format(document, range, formatParams) {
      var _arguments = arguments;
      return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {
        var _settings$html2;

        var settings, formatSettings;
        return regeneratorRuntime.wrap(function _callee6$(_context6) {
          while (1) {
            switch (_context6.prev = _context6.next) {
              case 0:
                settings = _arguments.length > 3 && _arguments[3] !== undefined ? _arguments[3] : workspace.settings;
                formatSettings = merge(settings === null || settings === void 0 ? void 0 : (_settings$html2 = settings.html) === null || _settings$html2 === void 0 ? void 0 : _settings$html2.format, {});

                if (formatSettings.contentUnformatted) {
                  formatSettings.contentUnformatted = formatSettings.contentUnformatted + ',script';
                } else {
                  formatSettings.contentUnformatted = 'script';
                }

                merge(formatParams, formatSettings);
                return _context6.abrupt("return", htmlLanguageService.format(document, range, formatSettings));

              case 5:
              case "end":
                return _context6.stop();
            }
          }
        }, _callee6);
      }))();
    },
    getFoldingRanges: function getFoldingRanges(document) {
      return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee7() {
        return regeneratorRuntime.wrap(function _callee7$(_context7) {
          while (1) {
            switch (_context7.prev = _context7.next) {
              case 0:
                return _context7.abrupt("return", htmlLanguageService.getFoldingRanges(document));

              case 1:
              case "end":
                return _context7.stop();
            }
          }
        }, _callee7);
      }))();
    },
    doAutoInsert: function doAutoInsert(document, position, kind) {
      var _arguments2 = arguments;
      return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee8() {
        var settings, offset, text, _htmlSettings$complet3, _htmlSettings$complet4, htmlSettings, options;

        return regeneratorRuntime.wrap(function _callee8$(_context8) {
          while (1) {
            switch (_context8.prev = _context8.next) {
              case 0:
                settings = _arguments2.length > 3 && _arguments2[3] !== undefined ? _arguments2[3] : workspace.settings;
                offset = document.offsetAt(position);
                text = document.getText();

                if (!(kind === 'autoQuote')) {
                  _context8.next = 11;
                  break;
                }

                if (!(offset > 0 && text.charAt(offset - 1) === '=')) {
                  _context8.next = 9;
                  break;
                }

                htmlSettings = settings === null || settings === void 0 ? void 0 : settings.html;
                options = merge(htmlSettings === null || htmlSettings === void 0 ? void 0 : htmlSettings.suggest, {});
                options.attributeDefaultValue = (_htmlSettings$complet3 = htmlSettings === null || htmlSettings === void 0 ? void 0 : (_htmlSettings$complet4 = htmlSettings.completion) === null || _htmlSettings$complet4 === void 0 ? void 0 : _htmlSettings$complet4.attributeDefaultValue) !== null && _htmlSettings$complet3 !== void 0 ? _htmlSettings$complet3 : 'doublequotes';
                return _context8.abrupt("return", htmlLanguageService.doQuoteComplete(document, position, htmlDocuments.get(document), options));

              case 9:
                _context8.next = 14;
                break;

              case 11:
                if (!(kind === 'autoClose')) {
                  _context8.next = 14;
                  break;
                }

                if (!(offset > 0 && text.charAt(offset - 1).match(/[>\/]/g))) {
                  _context8.next = 14;
                  break;
                }

                return _context8.abrupt("return", htmlLanguageService.doTagComplete(document, position, htmlDocuments.get(document)));

              case 14:
                return _context8.abrupt("return", null);

              case 15:
              case "end":
                return _context8.stop();
            }
          }
        }, _callee8);
      }))();
    },
    doRename: function doRename(document, position, newName) {
      return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee9() {
        var htmlDocument;
        return regeneratorRuntime.wrap(function _callee9$(_context9) {
          while (1) {
            switch (_context9.prev = _context9.next) {
              case 0:
                htmlDocument = htmlDocuments.get(document);
                return _context9.abrupt("return", htmlLanguageService.doRename(document, position, newName, htmlDocument));

              case 2:
              case "end":
                return _context9.stop();
            }
          }
        }, _callee9);
      }))();
    },
    onDocumentRemoved: function onDocumentRemoved(document) {
      return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee10() {
        return regeneratorRuntime.wrap(function _callee10$(_context10) {
          while (1) {
            switch (_context10.prev = _context10.next) {
              case 0:
                htmlDocuments.onDocumentRemoved(document);

              case 1:
              case "end":
                return _context10.stop();
            }
          }
        }, _callee10);
      }))();
    },
    findMatchingTagPosition: function findMatchingTagPosition(document, position) {
      return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee11() {
        var htmlDocument;
        return regeneratorRuntime.wrap(function _callee11$(_context11) {
          while (1) {
            switch (_context11.prev = _context11.next) {
              case 0:
                htmlDocument = htmlDocuments.get(document);
                return _context11.abrupt("return", htmlLanguageService.findMatchingTagPosition(document, position, htmlDocument));

              case 2:
              case "end":
                return _context11.stop();
            }
          }
        }, _callee11);
      }))();
    },
    doLinkedEditing: function doLinkedEditing(document, position) {
      return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee12() {
        var htmlDocument;
        return regeneratorRuntime.wrap(function _callee12$(_context12) {
          while (1) {
            switch (_context12.prev = _context12.next) {
              case 0:
                htmlDocument = htmlDocuments.get(document);
                return _context12.abrupt("return", htmlLanguageService.findLinkedEditingRanges(document, position, htmlDocument));

              case 2:
              case "end":
                return _context12.stop();
            }
          }
        }, _callee12);
      }))();
    },
    dispose: function dispose() {
      htmlDocuments.dispose();
    }
  };
}

function merge(src, dst) {
  if (src) {
    for (var key in src) {
      if (src.hasOwnProperty(key)) {
        dst[key] = src[key];
      }
    }
  }

  return dst;
}