name: mps-aspect-structure-concepts
description: Define concepts, interface concepts, enumerations, and constrained data types in an MPS language's structure aspect. Covers smart-reference detection, alias rules, cardinality, INamedConcept usage, bulk creation, and the full mps_mcp_alter_structure / mps_mcp_query_structure reference. Use when authoring or modifying a language's structure model.
type: reference
MPS Structure Aspect — Concepts
Concepts (ConceptDeclaration), interface concepts (InterfaceConceptDeclaration), enumerations (EnumerationDeclaration), and constrained data types (ConstrainedDataTypeDeclaration) are root nodes in a language's structure model. They use the language jetbrains.mps.lang.structure.
Critical Directives
- Implement
INamedConceptinstead of declaringnamedirectly. Anameproperty declared directly on a concept is an antipattern in MPS — implementjetbrains.mps.lang.core.structure.INamedConceptinstead. - Smart reference check (CRITICAL): before setting a
conceptAlias, determine whether the concept is an "Implicit Smart Reference". If it has exactly one mandatory reference and no properties or children of its own, do NOT set aconceptAlias— the concept should be transparent in the editor and completion menu so the user types the target's name directly. Examples: variable references, method calls, routine calls. - Leave alias empty on transparent collections too (e.g.
StatementList). - Set alias on concepts that can be root — that's how the user reaches them through the new-root menu.
- Always rebuild the language with
mps_mcp_alter_nodes MAKEandrebuild="true"after structural changes, so the new concepts are discoverable by runtime tools.
Prerequisites
- Requires the target language and its
structuremodel. - Uses the
jetbrains.mps.lang.structurelanguage. - Concepts, interface concepts, and enums are root nodes in the
structuremodel.
Workflow
- Locate language: use
mps_mcp_get_project_structureto find the language and itsstructuremodel. - Module creation: if needed, create the module via
mps_mcp_create_moduleusing an absolute path. - Define elements:
- ConceptDeclaration: core entities.
- InterfaceConceptDeclaration: orthogonal functionality.
- EnumerationDeclaration: fixed values.
- ConstrainedDataTypeDeclaration: regex-restricted properties.
- Attributes (annotations): concepts extending
NodeAttribute/PropertyAttribute/ChildAttribute/LinkAttributethat graft extra children/data onto other concepts without editing them — see Attributes section below.
- Inheritance & interfaces:
- Use inheritance and abstract concepts for shared logic.
- Implement
jetbrains.mps.lang.core.structure.INamedConceptif the concept needs anameproperty.
- Smart reference assessment: see directives above.
- Set alias on concepts that can be root: helps the user instantiate the concept through a menu.
- Leave alias empty on smart references and transparent collections: e.g.
StatementList. - Property definition:
- For enum properties: create the
EnumerationDeclarationfirst, then set the propertydataTypeto reference it.
- For enum properties: create the
- Proper cardinality: make sure intended child collections have the cardinality of
0..nor1..n. - Bulk operations: use
mps_mcp_alter_structurefor creating multiple concepts or enums efficiently.- Local references within the same JSON blueprint can use names for resolution.
- Reload runtime: always rebuild the language (via
mps_mcp_alter_nodeswithMAKEandrebuild="true") after structural changes to make concepts discoverable.
Attributes (Annotations)
Attributes let one language attach extra children, references, or property data to nodes of a concept it does not own — without editing or subclassing that concept. The host carries a universal smodelAttribute child slot (0..n, every BaseConcept has it); the attribute's own declaration says where it may attach. Used heavily for cross-cutting concerns: generator macros (NodeMacro/PropertyMacro/ReferenceMacro), documentation/description comments, requirement traces, error suppression.
- Declare an attribute = a
ConceptDeclarationthat extends one ofNodeAttribute(whole node),PropertyAttribute(one property),ChildAttribute(one child link), orLinkAttribute(one reference link), plus anAttributeInfo(alias@attribute info) in itssmodelAttributerole specifying the extension point:role(the attach key),attributed(which concept(s) may receive it —BaseConcept= any), andmultiple(one vs. many per node). CREATE_CONCEPTScannot express theAttributeInfo— create the concept extending the base attribute, then add theAttributeInfowithmps_mcp_update_node. Full walkthrough, concept reference, and the canonicalRequirementTraceblueprint live inreferences/attributes-and-annotations.md.
Related Skills
mps-aspect-editor-menus-and-keymaps— once concepts exist, define their editors (often the next step).mps-aspect-constraints— property validators, scopes, andcanBe*rules layered on top of structure.mps-aspect-behavior— virtual methods per concept.mps-aspect-actions— node factories for newly created concepts.mps-language-inheritance— forextendedLanguagesand concept super/interface relationships.
Reference Index
- Open
references/structure-operation-api.mdfor exactmps_mcp_alter_structureandmps_mcp_query_structureoperation names, JSON parameter formats, structure blueprint schemas,makeflag handling, andmakeStatussemantics (success / runtime_stale / failed / skipped). - Open
references/attributes-and-annotations.mdfor attributes/annotations: the four attribute kinds (NodeAttribute/PropertyAttribute/ChildAttribute/LinkAttribute), theAttributeInfoextension-point spec, the two-step MCP creation flow, thesmodelAttributeslot, and worked examples (RequirementTrace, generator macros, doc/comment annotations).