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

Difference between revisions of "MoDisco/CSharp"

(Statements)
(Category:MoDisco)
 
(13 intermediate revisions by 3 users not shown)
Line 1: Line 1:
The CSharp meta model : it is the reflect of C# language, as it has been defined in version 2.0 of "C# Language Specification" from Microsoft Corporation.
+
The CSharp metamodel is the reflection of the C# language, as defined in version 2.0 of "C# Language Specification" from Microsoft Corporation.
  
J2SE5 meta model contains 81 meta classes.
+
The CSharp metamodel contains 81 metaclasses.
To better understand it, this page will introduce main features (meta classes and links).
+
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| install section]]).
+
  
 +
You could also browse the model definition '''csharp.ecore''' available in sources (see the [[#Install| install section]]).
  
 
== Main meta classes ==
 
== Main meta classes ==
Line 11: Line 10:
 
=== ASTNode ===
 
=== ASTNode ===
  
Every meta classes (without meta class '''Fragment''') inherit from ASTNode.
+
Every metaclass (except metaclass '''Fragment''') inherits from '''ASTNode'''.
As its name indicate it, ASTNode represent a graph node.
+
As its name indicates, '''ASTNode''' represents a graph node.
ASTNode has a reference to Comment meta class because almost every csharp element could be associated to a comment (bloc or line comment). More details in [[#Zoom on comments| "Comment" section]].
+
'''ASTNode''' has a reference to metaclass '''Comment''' because almost every csharp element could be associated to a comment (block or line comment).
  
 
[[Image:MoDisco-CSharp metaclass ASTNode.jpg|frame|center|ASTNode meta class]]
 
[[Image:MoDisco-CSharp metaclass ASTNode.jpg|frame|center|ASTNode meta class]]
Line 19: Line 18:
 
=== Assembly, Namespace, Type ===
 
=== Assembly, Namespace, Type ===
  
Root element of each CSharp model in an instance of "Assembly" meta class. It is a translation of csharp application concept, so it contains namespace declarations (instances of Namespace meta class). And namespace declarations contain type declarations (instances compatible with Type meta class), and so on ...
+
The root element of each CSharp model is an instance of the '''Assembly''' metaclass. It is a translation of the concept of csharp application, so it contains namespace declarations (instances of the '''Namespace''' metaclass). And namespace declarations contain type declarations (instances compatible with metaclass '''Type'''), and so on ...
  
 
[[Image:MoDisco-CSharp Assembly Namespace and Type.jpg|frame|center|Assembly Namespace and Type]]
 
[[Image:MoDisco-CSharp Assembly Namespace and Type.jpg|frame|center|Assembly Namespace and Type]]
Line 25: Line 24:
 
=== NamedElement & notion of Proxy ===
 
=== 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, ...
+
A lot of csharp elements are "named", and this name can be considered as an identifier : methods, packages, types, variables, fields, ...
So all of corresponding meta classes inherit from NamedElement meta class. It will be usefull to resolve references in binding, see [[#NamedElementRef|NamedElementRef]] meta class.
+
So all the corresponding metaclasses inherit from the '''NamedElement''' metaclass. It will be useful to resolve references in binding, see the [[#NamedElementRef|NamedElementRef]] metaclass.
  
And an other goal of this meta class is to indicate which element is a part of the current csharp application or not (element from an external library of from .Net). Then external elements are tagged as proxy through dedicated attribute and could be easily filtered.
+
Another goal of this metaclass is to indicate for each element whether it is part of the current csharp application or not (element from an external .NET library). So external elements are tagged as proxy through a dedicated attribute and can be easily filtered.
For example, instruction "Trace.WriteLine" has been decomposed in two named elements (one class and one method) which defintion are not part of current csharp application. So attribute "proxy" of these elements has been initialized as true.
+
For example, instruction "Trace.WriteLine" has been decomposed into two named elements (one class and one method) the definitions of which are not part of the current csharp application. So attribute '''proxy''' of these elements has been initialized to true.
  
 
[[Image:MoDisco-CSharp metaclass NamedElement and its hierarchy.jpg|frame|center|NamedElement and its hierarchy]]
 
[[Image:MoDisco-CSharp metaclass NamedElement and its hierarchy.jpg|frame|center|NamedElement and its hierarchy]]
Line 35: Line 34:
 
=== NamedElementRef ===
 
=== NamedElementRef ===
  
To represent links between csharp elements, as C# AST defines only string references, meta class NamedElementRef initially contained only this information.
+
To represent links between csharp elements, as the C# AST defines only string references, metaclass NamedElementRef initially contained only this information.
But an important addition was to resolve binding between elements, so is is actually possible to navigate directly in elements graph. It has been represented through a relationship from a NamedElementRef to a NamedElement (proxy or not).
+
But an important addition was to resolve bindings between elements, so it is actually possible to navigate directly through the elements graph. It has been represented as a relationship from a '''NamedElementRef''' to a '''NamedElement''' (proxy or not).
  
 
[[Image:MoDisco-CSharp metaclass NamedElementRef.jpg|frame|center|NamedElementRef meta class]]
 
[[Image:MoDisco-CSharp metaclass NamedElementRef.jpg|frame|center|NamedElementRef meta class]]
Line 42: Line 41:
 
=== InternalDeclaration ===
 
=== 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 meta class.
+
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.
  
 
[[Image:MoDisco-CSharp metaclass InternalDeclaration and its hierarchy.jpg|frame|center|InternalDeclaration and its hierarchy]]
 
[[Image:MoDisco-CSharp metaclass InternalDeclaration and its hierarchy.jpg|frame|center|InternalDeclaration and its hierarchy]]
Line 48: Line 47:
 
=== Expressions ===
 
=== 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 ...
+
Like in many languages, the 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, <source lang="csharp">++i</source> is an expression and will be translated in concept of InfixExpression meta class.
+
For example, <source lang="csharp">++i</source> is an expression and will be translated into the concept of '''InfixExpression''' metaclass.
All types of expressions shall inherit from Expression meta class.
+
All types of expressions shall inherit from metaclass '''Expression'''.
  
 
[[Image:MoDisco-CSharp metaclass Expression and its hierarchy.jpg|frame|center|Expression and its hierarchy]]
 
[[Image:MoDisco-CSharp metaclass Expression and its hierarchy.jpg|frame|center|Expression and its hierarchy]]
Line 56: Line 55:
 
=== Statements ===
 
=== Statements ===
  
An "instruction" in C# is represented by Statement meta class. A block of code (Block meta class) contains a collection of statements, an a block of code may be contained by a method.
+
An "instruction" in C# is represented by the '''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 example of statements in C# : <source lang="csharp">if, while, for, do, ...</source>
+
Some examples of statements in C# : <source lang="csharp">if, while, for, do, ...</source>
All of their definitions use concept of expression to separate value from instruction keyword.
+
All of their definitions use the concept of expression to separate the value from the instruction keyword.
  
 
[[Image:MoDisco-CSharp metaclass Statement and its hierarchy.jpg|frame|center|Statement and its hierarchy]]
 
[[Image:MoDisco-CSharp metaclass Statement and its hierarchy.jpg|frame|center|Statement and its hierarchy]]
  
=== Zoom on comments ===
 
  
There is three kinds of comments : line comments (//), block comments (/* */) and javadoc (/** */).
 
Every comments contains text fragments, but we could have more informations on javadoc (Javadoc meta class), it could contain javadoc tags that are identified and collected through instances of TagElement meta class.
 
  
[[Image:MoDisco-J2SE5 metaclass Comment and its hierarchy.jpg|frame|center|Comment and its hierarchy]]
 
  
=== Zoom on annotations ===
 
  
Official usage of annotations has been introduced in version 5 of JDK.
 
To handle it, annotation declarations are managed as type declarations (AnnotationTypeDeclaration meta class) with specific attributes (AnnotationTypeMemberDeclaration meta class).
 
And annotation usages are translated in instances of Annotation meta class, which reference corresponding annotation declarations. And parameters are translated in instances of MemberValuePair meta class.
 
  
[[Image:MoDisco-J2SE5 metaclass AnnotationTypeDeclaration and Annotation.jpg|frame|center|Annotation]]
 
 
=== Zoom on generics ===
 
 
Version 5 of JDK introduces also concept of "generics".
 
Generic types of methods declarations are translated respectively in instances of TypeDeclaration of MethodDeclaration meta class with arguments as instances of TypeParameter meta class.
 
Usage of these generics are translated in instances of ParameterizedType meta class which reference concret elements (type and types arguments).
 
 
Specific case of type argument is "wildcard" (for example <? extends X>. There is a specific meta class to handle it : WildCardType.
 
 
[[Image:MoDisco-J2SE5 generics declarations and usages.jpg|frame|center|Generics]]
 
  
 
== Requirements ==
 
== Requirements ==
Line 91: Line 71:
 
To use the plug-in you need:
 
To use the plug-in you need:
 
* JDK 1.5 or above
 
* JDK 1.5 or above
* a version of Eclipse 3.3 or above with the following set of plugins installed
+
* a version of Eclipse 3.3 or above with the following set of plug-ins installed
 
:* [[EMF|EMF]] 2.3.0 or higher
 
:* [[EMF|EMF]] 2.3.0 or higher
  
 +
== Team ==
 +
Gabriel Barbier ([http://www.mia-software.com Mia-Software])
 +
 +
Fabien Giquel ([http://www.mia-software.com Mia-Software])
 +
 +
Frédéric Madiot ([http://www.mia-software.com Mia-Software])
  
 
== Install ==
 
== Install ==
  
You will find a version of this plug-in attached in [https://bugs.eclipse.org/bugs/show_bug.cgi?id=258281 following bug].
+
You will find a version of this plug-in attached in [https://bugs.eclipse.org/bugs/show_bug.cgi?id=258281 the following bug].
  
As IP review of this plugin is not finished, here is installation instructions :
+
As IP review of this plug-in is not finished, here are installation instructions :
  
 
* Extract archive file in your Eclipse workspace, then use "import" menu to import this project.
 
* 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.
+
* Use "export" menu to export this project as a plug-in (Deployable plug-ins and fragments) in your Eclipse installation. Don't forget to choose the "Package plug-ins as individual jar archives" option.
* re-start your Eclipse to take in account this plug-in
+
* re-start your Eclipse to take this plug-in into account
 +
 
 +
== Associated Discoverers ==
 +
 
 +
A first version of the C# discoverer : [[MoDisco/CSharpDiscoverer|CSharpDiscoverer]]
 +
 
 +
[[Category:MoDisco]]

Latest revision as of 05:44, 13 January 2010

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

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

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

Main meta classes

ASTNode

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

ASTNode meta class

Assembly, Namespace, Type

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

Assembly Namespace and Type

NamedElement & notion of Proxy

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

Another goal of this metaclass is to indicate for each element whether it is part of the current csharp application or not (element from an external .NET library). So external elements are tagged as proxy through a dedicated attribute and can be easily filtered. For example, instruction "Trace.WriteLine" has been decomposed into two named elements (one class and one method) the definitions of which are not part of the current csharp application. So attribute proxy of these elements has been initialized to true.

NamedElement and its hierarchy

NamedElementRef

To represent links between csharp elements, as the C# AST defines only string references, metaclass NamedElementRef initially contained only this information. But an important addition was to resolve bindings between elements, so it is actually possible to navigate directly through the elements graph. It has been represented as 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, the 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 the concept of InfixExpression metaclass.

All types of expressions shall inherit from metaclass Expression.

Expression and its hierarchy

Statements

An "instruction" in C# is represented by the 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 the concept of expression to separate the value from the 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 plug-ins installed
  • EMF 2.3.0 or higher

Team

Gabriel Barbier (Mia-Software)

Fabien Giquel (Mia-Software)

Frédéric Madiot (Mia-Software)

Install

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

As IP review of this plug-in 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 plug-in (Deployable plug-ins and fragments) in your Eclipse installation. Don't forget to choose the "Package plug-ins as individual jar archives" option.
  • re-start your Eclipse to take this plug-in into account

Associated Discoverers

A first version of the C# discoverer : CSharpDiscoverer

Back to the top