Add HDL elements and interfaces for VHDL types, generics, functions, procedures, constants, variables, assignments, and ports
This commit is contained in:
90
src/extractors/GenericExtractor.ts
Normal file
90
src/extractors/GenericExtractor.ts
Normal file
@@ -0,0 +1,90 @@
|
||||
import { Position } from 'elements/Common';
|
||||
import { HDLGeneric } from 'elements/HDLGeneric';
|
||||
import { IHDLParameter } from 'elements/interfaces/Common';
|
||||
import { IHDLGenericInfo } from 'elements/interfaces/IHDLGeneric';
|
||||
import Parser from 'web-tree-sitter';
|
||||
import {
|
||||
INodeExtractor,
|
||||
NodeHandler,
|
||||
GetLeadingComment,
|
||||
} from './interfaces/IHDLElementExtractor';
|
||||
|
||||
/**
|
||||
* GenericExtractor extracts generic declarations from a VHDL AST.
|
||||
*/
|
||||
export class GenericExtractor implements INodeExtractor<HDLGeneric> {
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public get nodeType(): string {
|
||||
return 'generic_clause';
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public readonly excludedParents = [
|
||||
'function_body',
|
||||
'procedure_body',
|
||||
'process_statement',
|
||||
];
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public readonly nodeHandler: NodeHandler<HDLGeneric> = (
|
||||
node: Parser.SyntaxNode,
|
||||
getLeadingComment: GetLeadingComment,
|
||||
): HDLGeneric[] => {
|
||||
const result: HDLGeneric[] = [];
|
||||
|
||||
const genericNodes = node.descendantsOfType(
|
||||
'constant_interface_declaration',
|
||||
);
|
||||
|
||||
const generics: IHDLParameter[] = [];
|
||||
|
||||
for (const genericNode of genericNodes) {
|
||||
const nameNode =
|
||||
genericNode.childForFieldName('identifier') ??
|
||||
genericNode.descendantsOfType('identifier')[0];
|
||||
|
||||
const typeNode =
|
||||
genericNode.childForFieldName('subtype_indication') ??
|
||||
genericNode.descendantsOfType('subtype_indication')[0];
|
||||
|
||||
const defaultNode =
|
||||
genericNode.childForFieldName('default_expression') ??
|
||||
genericNode.descendantsOfType('default_expression')[0];
|
||||
|
||||
const name = nameNode?.text ?? '';
|
||||
const type = typeNode?.text ?? '';
|
||||
const defaultValue = defaultNode?.text ?? undefined;
|
||||
|
||||
const comment = getLeadingComment(
|
||||
nameNode?.startPosition.row ?? genericNode.startPosition.row,
|
||||
);
|
||||
|
||||
generics.push({
|
||||
name,
|
||||
type,
|
||||
defaultValue,
|
||||
comment,
|
||||
});
|
||||
}
|
||||
|
||||
const pos = Position.fromNode(node);
|
||||
|
||||
const info: IHDLGenericInfo = {
|
||||
name: 'GenericClause',
|
||||
genericList: generics,
|
||||
position: pos,
|
||||
comment: getLeadingComment(pos.startLine),
|
||||
description: undefined,
|
||||
};
|
||||
|
||||
result.push(new HDLGeneric(info));
|
||||
|
||||
return result;
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user