pss-langserver
Version:
A Language server for the Portable Stimulus Standard
267 lines (241 loc) • 6.82 kB
text/typescript
/*
* Copyright (C) 2025 Darshan(@thisisthedarshan)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import { integer, RequestType, SemanticTokenModifiers, SemanticTokensLegend, SemanticTokenTypes } from "vscode-languageserver";
/* The tool spec config */
export interface PSS_Config {
tabspaces: number,
fileAuthor: string,
formatPatterns: string[],
autoFormatHeader: boolean,
wrapAt: number;
}
/* This enum defines the types of objects our AST has */
export enum objType {
NONE = 'NONE',
COMPONENT = 'COMPONENT',
ACTION = 'ACTION',
ACTIVITY = 'ACTION',
FUNCTION = 'FUNCTION',
PROCEDURAL_FUNCTION = 'PROCEDURAL_FUNCTION',
ENUM = 'ENUM',
REGISTER_BODY_ITEM = 'REGISTER_BODY_ITEM',
REGISTER_GROUP = 'REGISTER_GROUP',
REGISTER_COMP = 'REGISTER_COMP',
REGISTER_DEF = 'REGISTER_DEF',
REGISTER = 'REGISTER',
BUFFER = 'BUFFER',
STRUCT = 'STRUCT',
STATE = 'STATE',
STREAM = 'STREAM',
POOLS = 'POOLS',
RESOURCE_OBJECT = 'RESOURCE_OBJECT',
PACKAGE = 'PACKAGE',
MONITOR = 'MONITOR',
CONSTRAINT = 'CONSTRAINT',
DATA = 'DATA',
TYPEDEF = 'TYPEDEF',
CHANDLE = 'CHANDLE',
INTEGER = 'INTEGER',
BIT = 'BIT',
STRING = 'STRING',
BOOL = 'BOOL',
FLOAT32 = 'FLOAT32',
FLOAT64 = 'FLOAT64',
REF = 'REF',
ARRAY = 'ARRAY',
LIST = 'LIST',
MAP = 'MAP',
SET = 'SET',
INSTANCE = 'INSTANCE',
MEMORY_SPACE = 'MEMORY_SPACE',
MEMORY_REGION = 'MEMORY_REGION',
MEMORY_CLAIM = 'MEMORY_CLAIM',
VARARGS = "VARARGS",
TEMPLATE_ITEM = 'TEMPLATE_ITEM',
ACTION_HANDLE = 'ACTION_HANDLE',
ADDRESS_SPACE = 'ADDRESS_SPACE',
ADDRESS_REGION = 'ADDRESS_REGION',
ADDRESS_CLAIM = 'ADDRESS_CLAIM',
STRUCT_ITEM = 'STRUCT_ITEM',
EXEC_PRESOLVE = 'EXEC_PRESOLVE',
EXEC_POSTSOLVE = 'EXEC_POSTSOLVE',
EXEC_PREBODY = 'EXEC_PREBODY',
EXEC_BODY = 'EXEC_BODY',
EXEC_HEADER = 'EXEC_HEADER',
EXEC_DECLARATION = 'EXEC_DECLARATION',
EXEC_RUNSTART = 'EXEC_RUNSTART',
EXEC_RUNEND = 'EXEC_RUNEND',
EXEC_INITDOWN = 'EXEC_INITDOWN',
EXEC_INITUP = 'EXEC_INITUP',
EXEC_INIT = 'EXEC_INIT',
EXEC_TARGET = 'EXEC_TARGET',
EXEC_FILE = 'EXEC_FILE',
CALL_SUPER = 'CALL_SUPER',
IMPORT = 'IMPORT',
ASSIGNMENT = 'ASSIGNMENT',
UNKNOWN = 'UNKNOWN'
}
export type enumItems = {
name: string;
value: integer;
definedOn: definedOn;
}
export type commentDocs = {
name: string;
brief: string;
details: string;
paramNames: string[];
paramTypes: string[] | undefined;
paramDescriptions: string[];
sees: string[];
returns: string;
}
/* Tells what line Defines the object */
export type definedOn = {
file: string;
lineNumber: integer;
columnNumber: integer;
}
/* Tells what line(s) use the object */
type usedOn = {
file: string;
lineNumber: integer;
}
/* Tells what are the traits of a memory object */
export type traits = {
traitType: string;
traitValue: string;
}
/* Holds info on parameters */
export type params = {
paramType: objType | string;
paramName: string;
paramDefault: string;
}
/* Interface to hold info on each traversed PSS Grammar node */
export interface PSSNode {
type: objType;
name: string;
definedOn: definedOn;
/*usedOn: usedOn[];*/ /* Not used for now */
comments: string | commentDocs;
children: PSSNode[]; /* Array of child nodes - defined in ds file */
}
/* Holds some meta info on the object(s) */
export type metaInfo = {
objectType: objType;
parent: string | undefined;
onLine: definedOn;
used: usedOn[];
documentation: string | undefined;
params: string | params[] | undefined;
/* In ENUMS this is their type, expression for data, return type for functions */
type: string | undefined;
subComponents: string[] | void[] | undefined;
}
/* This is the object returned by the visitor */
export type metaData = Record<string, metaInfo>;
export type semanticToken = {
line: integer;
startChar: integer;
length: integer;
tokenType: integer;
tokenModifers: integer;
}
export interface SemanticToken {
line: number;
startChar: number;
length: number;
tokenType: number;
tokenModifiers: number;
}
export interface KeywordInfo {
tokenType: number | SemanticTokenTypes;
tokenModifiers: number | SemanticTokenModifiers | SemanticTokenModifiers[];
}
/* Semantic Legend */
export const semanticTokensLegend = {
tokenTypes: [
"namespace",
"type",
"class",
"enum",
"interface",
"struct",
"typeParameter",
"parameter",
"variable",
"property",
"enumMember",
"event",
"function",
"method",
"macro",
"keyword",
"modifier",
"comment",
"string",
"number",
"regexp",
"operator",
"decorator"
],
tokenModifiers: [
"declaration",
"definition",
"readonly",
"static",
"deprecated",
"abstract",
"async",
"modification",
"documentation",
"defaultLibrary"
]
};
/* Create a mapping for access type */
export const accessMap: {
[key: string]: "READONLY" | "READWRITE" | "WRITEONLY"
} = {
"READONLY": "READONLY",
"READWRITE": "READWRITE",
"WRITEONLY": "WRITEONLY"
}
/* Custom request types for client and server */
/* This request and response pair are used with RequestDoxygenGeneration method */
interface DoxygenGenerationRequest {
line: string; /* Line contents since client isn't able to parse content but server can */
/* To further ensure that we find the exact variable in case there are multiple of same type,
we get line number */
lineNumber: number;
/* For future implementation, we also get the fileURI */
fileURI: string;
}
interface DoxygenGenerationResponse {
content: string; /* The doxygen comment generated by the server */
keyword: string; /* The keyword for which it was generated */
}
/* Custom Request Method Types */
/* The first type is for client to send a line and the server to
send a doxygen comment info for the first entity type it encounters.
This excludes keywords but only has variable types, functions etc */
const RequestDoxygenGeneration = new RequestType<DoxygenGenerationRequest, DoxygenGenerationResponse, void>('dsp/RequestDoxygenGeneration');
export {
DoxygenGenerationRequest,
DoxygenGenerationResponse,
RequestDoxygenGeneration,
};