@bscotch/gml-parser
Version:
A parser for GML (GameMaker Language) files for programmatic manipulation and analysis of GameMaker projects.
99 lines • 3.17 kB
JavaScript
import { assert } from './util.js';
function typeMemberToHoverText(member) {
let code = member.name;
if (member.optional) {
code += '?';
}
code += ': ' + member.type.toFeatherString();
return code;
}
export function typeToHoverDetails(type) {
const lines = [];
if (type.isFunction) {
if (type.self) {
lines.push(`*@self* \`${type.self.toFeatherString()}\``);
}
for (const param of type.listParameters()) {
if (param?.def && param.description) {
lines.push(`*@param* \`${param.name}\` - ${param.description}`);
}
}
}
else if (type.kind === 'Struct') {
const members = type
.listMembers()
.filter((x) => x.name !== 'self' && x.def)
.sort((a, b) => {
// underscore-prefixed should be sorted last
const a_prefix_count = a.name?.match(/^_+/)?.[0]?.length || 0;
const b_prefix_count = b.name?.match(/^_+/)?.[0]?.length || 0;
if (a_prefix_count !== b_prefix_count) {
return a_prefix_count - b_prefix_count;
}
return a.name
?.toLocaleLowerCase?.()
.localeCompare(b.name?.toLocaleLowerCase?.());
});
if (members.length) {
let code = '```ts\n{\n';
let i = 0;
for (const member of members) {
code += ` ${member.name}: ${member.type.toFeatherString()},\n`;
i++;
if (i > 19) {
code += ' // ... and more!\n';
break;
}
}
code += '}\n```';
lines.push(code);
}
}
else if (type.kind === 'Enum') {
const members = type.listMembers().filter((x) => x.def);
if (members.length) {
let code = '```ts\n{\n';
let i = 0;
for (const member of members) {
code += ` ${member.name},\n`;
i++;
if (i > 19) {
code += ' // ... and more!\n';
break;
}
}
code += '}\n```';
lines.push(code);
}
}
return lines.join('\n\n');
}
export function typeToHoverText(type) {
let code = '';
if (type.isFunction) {
code = `function ${type.name || ''}(`;
const params = type.listParameters();
for (let i = 0; i < params.length; i++) {
const param = params[i];
assert(param, 'Param is undefined');
if (i > 0) {
code += ', ';
}
code += typeMemberToHoverText(param);
}
code += ')';
if (type.isConstructor) {
code += ` constructor`;
}
code += `: ${type.isConstructor
? type.self.toFeatherString()
: type.returns?.type.length
? type.returns.toFeatherString()
: 'Undefined'}`;
}
else {
code += type.toFeatherString();
}
return code;
}
//# sourceMappingURL=types.hover.js.map