astro-ghostcms/.pnpm-store/v3/files/f9/cab578f40e192219dee2e9d5071...

89 lines
3.6 KiB
Plaintext

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.snippetForFunctionCall = void 0;
const PConst = require("../protocol.const");
function snippetForFunctionCall(item, displayParts) {
if (item.insertText && typeof item.insertText !== 'string') {
return { snippet: item.insertText, parameterCount: 0 };
}
let _tabstop = 1;
const parameterListParts = getParameterListParts(displayParts);
let snippet = '';
snippet += `${item.insertText || item.label}(`;
snippet = appendJoinedPlaceholders(snippet, parameterListParts.parts, ', ');
if (parameterListParts.hasOptionalParameters) {
snippet += '$' + _tabstop++;
}
snippet += ')';
snippet += '$' + _tabstop++;
return { snippet, parameterCount: parameterListParts.parts.length + (parameterListParts.hasOptionalParameters ? 1 : 0) };
function appendJoinedPlaceholders(snippet, parts, joiner) {
for (let i = 0; i < parts.length; ++i) {
const paramterPart = parts[i];
snippet += '${' + _tabstop++ + ':' + paramterPart.text + '}';
if (i !== parts.length - 1) {
snippet += joiner;
}
}
return snippet;
}
}
exports.snippetForFunctionCall = snippetForFunctionCall;
function getParameterListParts(displayParts) {
const parts = [];
let isInMethod = false;
let hasOptionalParameters = false;
let parenCount = 0;
let braceCount = 0;
outer: for (let i = 0; i < displayParts.length; ++i) {
const part = displayParts[i];
switch (part.kind) {
case PConst.DisplayPartKind.methodName:
case PConst.DisplayPartKind.functionName:
case PConst.DisplayPartKind.text:
case PConst.DisplayPartKind.propertyName:
if (parenCount === 0 && braceCount === 0) {
isInMethod = true;
}
break;
case PConst.DisplayPartKind.parameterName:
if (parenCount === 1 && braceCount === 0 && isInMethod) {
// Only take top level paren names
const next = displayParts[i + 1];
// Skip optional parameters
const nameIsFollowedByOptionalIndicator = next && next.text === '?';
// Skip this parameter
const nameIsThis = part.text === 'this';
if (!nameIsFollowedByOptionalIndicator && !nameIsThis) {
parts.push(part);
}
hasOptionalParameters = hasOptionalParameters || nameIsFollowedByOptionalIndicator;
}
break;
case PConst.DisplayPartKind.punctuation:
if (part.text === '(') {
++parenCount;
}
else if (part.text === ')') {
--parenCount;
if (parenCount <= 0 && isInMethod) {
break outer;
}
}
else if (part.text === '...' && parenCount === 1) {
// Found rest parmeter. Do not fill in any further arguments
hasOptionalParameters = true;
break outer;
}
else if (part.text === '{') {
++braceCount;
}
else if (part.text === '}') {
--braceCount;
}
break;
}
}
return { hasOptionalParameters, parts };
}
//# sourceMappingURL=snippetForFunctionCall.js.map