You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
venv/PyCharm 2025.2.1.1/plugins/javascript-plugin/jsLanguageServicesImpl/js-language-service.js

134 lines
4.4 KiB

var UTF8 = 'utf8';
var initializedPlugin = null;
function parseParams() {
var result = {
sessionId: null,
restArgs: null,
pluginName: null
};
var args = process.argv.slice(2);
var counter = 0;
var paramNameToPropertyName = {};
paramNameToPropertyName["-id="] = 'sessionId';
paramNameToPropertyName["-pluginName="] = 'pluginName';
args.forEach(function (value, index, arr) {
function isName(name) {
return value.indexOf(name) === 0;
}
function getValue() {
return value.split('=')[1];
}
Object.keys(paramNameToPropertyName).forEach(function (val) {
if (isName(val)) {
result[paramNameToPropertyName[val]] = getValue();
counter++;
}
});
});
result.restArgs = args.slice(counter);
return result;
}
function getPluginFactory(state, pluginName) {
var pluginPath = pluginName;
if (state.pluginPath) {
pluginPath = state.pluginPath;
}
var factoryProvider = require(pluginPath);
return factoryProvider.factory;
}
;
function initAndStartListening(params) {
var readline = require("readline");
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: false
});
process.stdin.setEncoding(UTF8);
var pending = [];
var canWrite = true;
function writeMessage(s) {
if (!canWrite) {
pending.push(s);
}
else {
canWrite = false;
process.stdout.write(new Buffer(s, UTF8), setCanWriteFlagAndWriteMessageIfNecessary);
}
}
function setCanWriteFlagAndWriteMessageIfNecessary() {
canWrite = true;
if (pending.length) {
writeMessage(pending.shift());
}
}
var messageWriter = {
write: function (answer) {
writeMessage(answer + '\n');
}
};
var expectedState = true;
rl.on("line", function (input) {
var message = input.trim();
if (expectedState) {
var state = JSON.parse(message);
if (state && state.pluginName) {
var pluginName = state.pluginName;
if (initializedPlugin == null) {
var pluginFactory = getPluginFactory(state, pluginName);
if (pluginFactory != null) {
var result = {};
try {
var _a = pluginFactory.create(state), languagePlugin = _a.languagePlugin, readyMessage = _a.readyMessage;
initializedPlugin = languagePlugin;
result.success = true;
result.message = readyMessage;
sendJson(JSON.stringify(result));
}
catch (e) {
//initialization error
//ok, lets kill the process
result.success = false;
var err = e.message || e.messageText;
result.error = "Initialization error (" + pluginName + "). " + err;
result.stack = e.stack;
sendJson(JSON.stringify(result));
}
}
}
expectedState = false;
}
}
else {
if (initializedPlugin != null) {
try {
initializedPlugin.onMessage(message, messageWriter);
}
catch (e) {
console.error(e.message + " " + e.stack);
}
}
}
});
rl.on("close", function () {
// If IDE doesn't have enough time to terminate process properly
// (due to being killed or just not to slow down the whole IDE termination stage),
// the process should take precautions and terminate itself.
exitProcess();
});
sendCommand("ready");
setInterval(function () {
console.error('Process ' + params.sessionId + ' heartbeat: "alive" ');
}, 60000);
function sendCommand(command) {
process.stdout.write(params.sessionId + ' ' + command + '\n', UTF8);
}
function sendJson(json) {
process.stdout.write(json + '\n', UTF8);
}
}
function exitProcess() {
process.exit(0);
}
initAndStartListening(parseParams());