| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- import type { Node as SyntaxNode } from 'web-tree-sitter';
- import { getNodeText, getChildByField } from '../tree-sitter-helpers';
- import type { LanguageExtractor } from '../tree-sitter-types';
- export const pascalExtractor: LanguageExtractor = {
- functionTypes: ['declProc'],
- classTypes: ['declClass'],
- methodTypes: ['declProc'],
- interfaceTypes: ['declIntf'],
- structTypes: [],
- enumTypes: ['declEnum'],
- typeAliasTypes: ['declType'],
- importTypes: ['declUses'],
- callTypes: ['exprCall'],
- variableTypes: ['declField', 'declConst'],
- nameField: 'name',
- bodyField: 'body',
- paramsField: 'args',
- returnField: 'type',
- getSignature: (node, source) => {
- const args = getChildByField(node, 'args');
- const returnType = node.namedChildren.find(
- (c: SyntaxNode) => c.type === 'typeref'
- );
- if (!args && !returnType) return undefined;
- let sig = '';
- if (args) sig = getNodeText(args, source);
- if (returnType) {
- sig += ': ' + getNodeText(returnType, source);
- }
- return sig || undefined;
- },
- getVisibility: (node) => {
- let current = node.parent;
- while (current) {
- if (current.type === 'declSection') {
- for (let i = 0; i < current.childCount; i++) {
- const child = current.child(i);
- if (child?.type === 'kPublic' || child?.type === 'kPublished')
- return 'public';
- if (child?.type === 'kPrivate') return 'private';
- if (child?.type === 'kProtected') return 'protected';
- }
- }
- current = current.parent;
- }
- return undefined;
- },
- isExported: (_node, _source) => {
- // In Pascal, symbols declared in the interface section are exported
- return false;
- },
- isStatic: (node) => {
- for (let i = 0; i < node.childCount; i++) {
- if (node.child(i)?.type === 'kClass') return true;
- }
- return false;
- },
- isConst: (node) => {
- return node.type === 'declConst';
- },
- };
|