Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

MoDisco/CSharp

The CSharp metamodel is the reflect of the C# language, as it has been defined in version 2.0 of "C# Language Specification" from Microsoft Corporation.

CSharp metamodel contains 81 metaclasses. To better understand it, this page will introduce the main features (metaclasses and links).

You could also browse definition model csharp.ecore available in sources (see install section).


Main meta classes

ASTNode

Every metaclasses (except metaclass Fragment) inherit from ASTNode. As its name indicates it, ASTNode represents a graph node. ASTNode has a reference to Comment metaclass because almost every csharp element could be associated to a comment (bloc or line comment).

ASTNode meta class

Assembly, Namespace, Type

Root element of each CSharp model in an instance of Assembly metaclass. It is a translation of csharp application concept, so it contains namespace declarations (instances of Namespace metaclass). And namespace declarations contain type declarations (instances compatible with Type metaclass), and so on ...

Assembly Namespace and Type

NamedElement & notion of Proxy

A lot of csharp elements are "named", and this name could be considered as an identifier : methods, packages, types, variables, fields, ... So all of corresponding metaclasses inherit from NamedElement metaclass. It will be useful to resolve references in binding, see NamedElementRef metaclass.

An other goal of this metaclass is to indicate which element is a part of the current csharp application or not (element from an external library of .Net). Then external elements are tagged as proxy through dedicated attribute and could be easily filtered. For example, instruction "Trace.WriteLine" has been decomposed into two named elements (one class and one method) which definition are not part of current csharp application. So attribute proxy of these elements has been initialized with true.

NamedElement and its hierarchy

NamedElementRef

To represent links between csharp elements, as C# AST defines only string references, metaclass NamedElementRef initially contained only this information. But an important addition was to resolve binding between elements, so it is actually possible to navigate directly through elements graph. It has been represented through a relationship from a NamedElementRef to a NamedElement (proxy or not).

NamedElementRef meta class

InternalDeclaration

A type declaration has different kinds of contents : fields, methods, static block, initialization block or other type declarations. All of these elements are of type InternalDeclaration metaclass.

InternalDeclaration and its hierarchy

Expressions

Like in many languages, concept of expression exists in C# : it is a portion of code, without declarations, and its evaluation returns a value, numerical or boolean or other ...

For example,
++i
is an expression and will be translated into concept of InfixExpression metaclass.

All types of expressions shall inherit from Expression metaclass.

Expression and its hierarchy

Statements

An "instruction" in C# is represented by Statement metaclass. A block of code (Block metaclass) contains a collection of statements, and a block of code may be contained by a method.

Some examples of statements in C# :
if, while, for, do, ...

All of their definitions use concept of expression to separate value from instruction keyword.

Statement and its hierarchy




Requirements

To use the plug-in you need:

  • JDK 1.5 or above
  • a version of Eclipse 3.3 or above with the following set of plugins installed
  • EMF 2.3.0 or higher


Install

You will find a version of this plug-in attached in following bug.

As IP review of this plugin is not finished, here are installation instructions :

  • Extract archive file in your Eclipse workspace, then use "import" menu to import this project.
  • Use "export" menu to export this project as a plugin (Deployable plugins and fragments) in your Eclipse installation. Don't forget to choose "Package plug-ins as individual jar archives" option.
  • re-start your Eclipse to take in account this plug-in

Associated Discoverers

A first version of C# discoverer : CSharpDiscoverer

Back to the top