A node in MPS always has a concept. It may or may not have a type.

A concept may have at most one superconcept and any number of subconcepts. A types may have many supertypes and subtypes.

These are two distinct, independent relationships: inheritance between concepts and subtyping between types. Let’s examine some further differences between them.

The concept hierarchy must not contain a cycle. The type hierarchy in MPS may be cyclic, as we will see below.

In MPS, types are represented as nodes. Thus, inheritance applies to concepts and subtyping applies to nodes.

Concept A being a subconcept of B does not imply that a type represented by an instance of A is a subtype of a type represented by an instance of B.

Let’s look at a concrete example.

The sequence type

The sequence type in jetbrains.mps.baseLanguage.collections is an instance of SequenceType concept.

If you examine the supertypes of sequence<node<>> in Type Explorer, you will see this hierarchy:

You see that sequence<node<>> has multiple supertypes, one of them being java.lang.Iterable<node<>> (an instance of ClassifierType, although this is not shown in the tool), one of whose superclasses is again sequence<node<>>, forming a cycle.

If you now examine the declaration of SequenceType concept, you will see this inheritance hierarchy:

The hierarchy does not contain ClassifierType: SequenceType is neither a superclass, nor a subclass of it.

The classifier type

Let’s examine ClassifierType closer. This is the concept used to represent Java class or interface types. Here is its definition:

For example, the type for java.lang.Object could be represented (in the notation of light quotations) as

ClassifierType(classifier: Object)

The type for java.util.List<Object> would be

    classifier: List,
    parameter: [ClassifierType(classifier: Object)]

These two types are represented by two instances of the same concept, ClassifierType. However, List<Object> is a subtype of Object.

The type hierarchy is independent from the concept hierarchy and it’s important not to confuse the two.