mathjslab
Version:
MathJSLab - An interpreter with language syntax like MATLAB®/Octave, ISBN 978-65-00-82338-7.
301 lines (300 loc) • 11 kB
TypeScript
import type { ClassEnumerationDefinition as ClassEnumerationDefinitionBase, ClassEventDefinition as ClassEventDefinitionBase, ClassMethodDefinition as ClassMethodDefinitionBase, ClassPropertyDefinition as ClassPropertyDefinitionBase } from './ClassMember';
import { ClassDefinition } from './ClassDefinition';
import { type RuntimeExpressionValue } from './AST';
import type { RuntimeDisplay } from './RuntimeDisplay';
type ClassPropertyDefinition = ClassPropertyDefinitionBase<ClassDefinition>;
type ClassMethodDefinition = ClassMethodDefinitionBase<ClassDefinition>;
type ClassEventDefinition = ClassEventDefinitionBase<ClassDefinition>;
type ClassEnumerationDefinition = ClassEnumerationDefinitionBase<ClassDefinition>;
/** Member metadata variants that can be exposed as MATLAB-like meta objects. */
type ClassMetaMemberDefinition = ClassPropertyDefinition | ClassMethodDefinition | ClassEventDefinition | ClassEnumerationDefinition;
/** Supported meta-object kind names. */
type ClassMetaKind = 'meta.class' | 'meta.property' | 'meta.method' | 'meta.event' | 'meta.EnumerationMember';
/** Runtime values exposed by public MATLAB-like `meta.*` properties. */
type ClassMetaPropertyValue = RuntimeExpressionValue;
/**
* Callback used by runtime-created meta objects to evaluate property defaults
* lazily.
*/
type ClassPropertyDefaultProvider = (property: ClassPropertyDefinition) => RuntimeExpressionValue | undefined;
/**
* Base class for MATLAB-like class meta objects.
*/
declare abstract class ClassMetaObject {
/** Runtime type tag used by interpreter predicates. */
static readonly CLASS_META = 7;
/** Runtime type tag stored on all meta objects. */
readonly type = 7;
/** Optional AST-style parent pointer used by generic value handling. */
parent?: unknown;
/** MATLAB-like meta object kind. */
abstract readonly kind: ClassMetaKind;
/**
* Test whether a value is a class meta object.
*
* @param obj Value to test.
* @returns `true` when `obj` is a `ClassMetaObject`.
*/
static readonly isInstanceOf: (obj: unknown) => obj is ClassMetaObject;
/**
* Copy a meta object.
*
* Meta objects are immutable views, so copying preserves identity.
*
* @param meta Meta object to copy.
* @returns The same meta object.
*/
static readonly copy: <T extends ClassMetaObject>(meta: T) => T;
/**
* Copy this meta object.
*
* @returns This meta object.
*/
copy(): this;
/**
* Read a MATLAB-like public meta property.
*
* @param field Property name.
* @returns Property value, if supported.
*/
abstract getProperty(field: string): ClassMetaPropertyValue | undefined;
/**
* Return the display name used by unparse and diagnostics.
*
* @returns Display name.
*/
abstract displayName(): string;
/**
* Render a compact meta-object summary.
*
* @param meta Meta object to render.
* @param _interpreter Interpreter requesting unparse.
* @returns Human-readable meta-object summary.
*/
static readonly unparse: (meta: ClassMetaObject, _interpreter: RuntimeDisplay) => string;
}
/**
* Meta object representing a class definition.
*/
declare class ClassMetaClass extends ClassMetaObject {
readonly definition: ClassDefinition;
private readonly propertyDefaultProvider?;
/** MATLAB-like meta object kind. */
readonly kind = "meta.class";
/**
* Create a class meta object.
*
* @param definition Class metadata.
* @param propertyDefaultProvider Optional callback used to expose evaluated
* property defaults from runtime-created meta objects.
*/
private constructor();
/**
* Test whether a value is a class meta object.
*
* @param obj Value to test.
* @returns `true` when `obj` is a `ClassMetaClass`.
*/
static readonly isInstanceOf: (obj: unknown) => obj is ClassMetaClass;
/**
* Create a class meta object.
*
* @param definition Class metadata.
* @param propertyDefaultProvider Optional callback used to expose evaluated
* property defaults from runtime-created meta objects.
* @returns Class meta object.
*/
static readonly create: (definition: ClassDefinition, propertyDefaultProvider?: ClassPropertyDefaultProvider) => ClassMetaClass;
/**
* Return the class name.
*
* @returns Class name.
*/
displayName(): string;
/**
* Read a supported `meta.class` property.
*
* @param field Property name.
* @returns Property value, if supported.
*/
getProperty(field: string): ClassMetaPropertyValue | undefined;
}
/**
* Base class for meta objects that wrap class members.
*/
declare abstract class ClassMetaMember extends ClassMetaObject {
readonly member: ClassMetaMemberDefinition;
private readonly propertyDefaultProvider?;
/**
* Create a member meta object.
*
* @param member Member metadata.
* @param propertyDefaultProvider Optional callback propagated back through
* `DefiningClass`.
*/
protected constructor(member: ClassMetaMemberDefinition, propertyDefaultProvider?: ClassPropertyDefaultProvider | undefined);
/**
* Return a qualified member display name.
*
* @returns Qualified member name.
*/
displayName(): string;
/**
* Read fields shared by property, method, event, and enumeration meta
* objects.
*
* @param field Property name.
* @returns Property value, if supported by all member meta objects.
*/
protected commonProperty(field: string): ClassMetaPropertyValue | undefined;
}
/**
* Meta object representing a class property.
*/
declare class ClassMetaProperty extends ClassMetaMember {
readonly property: ClassPropertyDefinition;
private readonly defaultProvider?;
/** MATLAB-like meta object kind. */
readonly kind = "meta.property";
/**
* Create a property meta object.
*
* @param property Property metadata.
* @param defaultProvider Optional callback used to evaluate the property's
* default expression lazily.
*/
private constructor();
/**
* Create a property meta object.
*
* @param property Property metadata.
* @param defaultProvider Optional callback used to evaluate the property's
* default expression lazily.
* @returns Property meta object.
*/
static readonly create: (property: ClassPropertyDefinition, defaultProvider?: ClassPropertyDefaultProvider) => ClassMetaProperty;
/**
* Return the default value exposed through metadata.
*
* Runtime-created meta objects evaluate defaults lazily; parser-created
* meta objects without a provider expose compact expression text.
*
* @returns Evaluated/default expression value, or `null` when absent.
*/
private defaultValue;
/**
* Read a supported `meta.property` property.
*
* @param field Property name.
* @returns Property value, if supported.
*/
getProperty(field: string): ClassMetaPropertyValue | undefined;
}
/**
* Meta object representing a class method.
*/
declare class ClassMetaMethod extends ClassMetaMember {
readonly method: ClassMethodDefinition;
/** MATLAB-like meta object kind. */
readonly kind = "meta.method";
/**
* Create a method meta object.
*
* @param method Method metadata.
* @param propertyDefaultProvider Optional callback propagated through
* `DefiningClass`.
*/
private constructor();
/**
* Create a method meta object.
*
* @param method Method metadata.
* @param propertyDefaultProvider Optional callback propagated through
* `DefiningClass`.
* @returns Method meta object.
*/
static readonly create: (method: ClassMethodDefinition, propertyDefaultProvider?: ClassPropertyDefaultProvider) => ClassMetaMethod;
/**
* Read a supported `meta.method` property.
*
* @param field Property name.
* @returns Property value, if supported.
*/
getProperty(field: string): ClassMetaPropertyValue | undefined;
}
/**
* Meta object representing a class event.
*/
declare class ClassMetaEvent extends ClassMetaMember {
readonly event: ClassEventDefinition;
/** MATLAB-like meta object kind. */
readonly kind = "meta.event";
/**
* Create an event meta object.
*
* @param event Event metadata.
* @param propertyDefaultProvider Optional callback propagated through
* `DefiningClass`.
*/
private constructor();
/**
* Create an event meta object.
*
* @param event Event metadata.
* @param propertyDefaultProvider Optional callback propagated through
* `DefiningClass`.
* @returns Event meta object.
*/
static readonly create: (event: ClassEventDefinition, propertyDefaultProvider?: ClassPropertyDefaultProvider) => ClassMetaEvent;
/**
* Read a supported `meta.event` property.
*
* @param field Property name.
* @returns Property value, if supported.
*/
getProperty(field: string): ClassMetaPropertyValue | undefined;
}
/**
* Meta object representing an enumeration member.
*/
declare class ClassMetaEnumerationMember extends ClassMetaMember {
readonly enumeration: ClassEnumerationDefinition;
/** MATLAB-like meta object kind. */
readonly kind = "meta.EnumerationMember";
/**
* Create an enumeration-member meta object.
*
* @param enumeration Enumeration metadata.
* @param propertyDefaultProvider Optional callback propagated through
* `DefiningClass`.
*/
private constructor();
/**
* Create an enumeration-member meta object.
*
* @param enumeration Enumeration metadata.
* @param propertyDefaultProvider Optional callback propagated through
* `DefiningClass`.
* @returns Enumeration-member meta object.
*/
static readonly create: (enumeration: ClassEnumerationDefinition, propertyDefaultProvider?: ClassPropertyDefaultProvider) => ClassMetaEnumerationMember;
/**
* Read a supported `meta.EnumerationMember` property.
*
* @param field Property name.
* @returns Property value, if supported.
*/
getProperty(field: string): ClassMetaPropertyValue | undefined;
}
export { ClassMetaObject, ClassMetaClass, ClassMetaMember, ClassMetaProperty, ClassMetaMethod, ClassMetaEvent, ClassMetaEnumerationMember };
export type { ClassMetaKind, ClassMetaPropertyValue };
declare const _default: {
ClassMetaObject: typeof ClassMetaObject;
ClassMetaClass: typeof ClassMetaClass;
ClassMetaMember: typeof ClassMetaMember;
ClassMetaProperty: typeof ClassMetaProperty;
ClassMetaMethod: typeof ClassMetaMethod;
ClassMetaEvent: typeof ClassMetaEvent;
ClassMetaEnumerationMember: typeof ClassMetaEnumerationMember;
};
export default _default;