IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Eclipse Platform Discussion :

Génerer du code java à partir d'un AST


Sujet :

Eclipse Platform

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 23
    Points
    23
    Par défaut Génerer du code java à partir d'un AST
    Bonjour à tous,

    bon je suis un gros noob concernant le développement de plugins sous Eclipse. Mon objectif pour l'instant est de génerer un petit helloWorld histoire de voir comment la génération de code se boutique...

    donc j'ai trouvé dans la doc éclipse un bout de code permettant de génerer ma classe HelloWorld :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    AST ast = AST.newAST(AST.JLS3);
    CompilationUnit unit = ast.newCompilationUnit();
    PackageDeclaration packageDeclaration = ast.newPackageDeclaration();
    packageDeclaration.setName(ast.newSimpleName("example"));
    unit.setPackage(packageDeclaration);
    ImportDeclaration importDeclaration = ast.newImportDeclaration();
    QualifiedName name = 
    	ast.newQualifiedName(
    		ast.newSimpleName("java"),
    		ast.newSimpleName("util"));
    importDeclaration.setName(name);
    importDeclaration.setOnDemand(true);
    unit.imports().add(importDeclaration);
    TypeDeclaration type = ast.newTypeDeclaration();
    type.setInterface(false);
    type.modifiers().add(ast.newModifier(Modifier.ModifierKeyword.PUBLIC_KEYWORD));
    type.setName(ast.newSimpleName("HelloWorld"));
    MethodDeclaration methodDeclaration = ast.newMethodDeclaration();
    methodDeclaration.setConstructor(false);
    List modifiers = methodDeclaration.modifiers();
    modifiers.add(ast.newModifier(Modifier.ModifierKeyword.PUBLIC_KEYWORD));
    modifiers.add(ast.newModifier(Modifier.ModifierKeyword.STATIC_KEYWORD));
    methodDeclaration.setName(ast.newSimpleName("main"));
    methodDeclaration.setReturnType2(ast.newPrimitiveType(PrimitiveType.VOID));
    SingleVariableDeclaration variableDeclaration = ast.newSingleVariableDeclaration();
    variableDeclaration.setType(ast.newArrayType(ast.newSimpleType(ast.newSimpleName("String"))));
    variableDeclaration.setName(ast.newSimpleName("args"));
    methodDeclaration.parameters().add(variableDeclaration);
    org.eclipse.jdt.core.dom.Block block = ast.newBlock();
    MethodInvocation methodInvocation = ast.newMethodInvocation();
    name = 
    	ast.newQualifiedName(
    		ast.newSimpleName("System"),
    		ast.newSimpleName("out"));
    methodInvocation.setExpression(name);
    methodInvocation.setName(ast.newSimpleName("println")); 
    InfixExpression infixExpression = ast.newInfixExpression();
    infixExpression.setOperator(InfixExpression.Operator.PLUS);
    StringLiteral literal = ast.newStringLiteral();
    literal.setLiteralValue("Hello");
    infixExpression.setLeftOperand(literal);
    literal = ast.newStringLiteral();
    literal.setLiteralValue(" world");
    infixExpression.setRightOperand(literal);
    methodInvocation.arguments().add(infixExpression);
    ExpressionStatement expressionStatement = ast.newExpressionStatement(methodInvocation);
    block.statements().add(expressionStatement);
    methodDeclaration.setBody(block);
    type.bodyDeclarations().add(methodDeclaration);
    unit.types().add(type);
    Normalement ça doit me sortir un truc comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    package example;
    	import java.util.*;
    	public class HelloWorld {
    		public static void main(String[] args) {
    			System.out.println("Hello" + " world");
    		}
    	}
    Bon j'ai créé mon plugin-project et ajouté les dépendances qu'il faut (org.eclipse.jdt.core(3.4.4)). Ensuite pour l'executer je lance ma classe main (contenant uniquement le code de génération - voir gros paté de code plus haut) en tant que java application, et là, rien...
    Le code est bien executé, mais impossible de retrouver ma classe HelloWorld

    J'ai sans doutes fait une connerie, mais vu mon manque d'experience dans le domaine, hé ben j'aimerais bien quelques éclaircissement sur la situation s'il vous plait

    Merchi d'avance

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    bon et bien j'ai trouvé la solution,

    en fait il fallait en premier lieu récuperer l'arborescence du projet à partir de leur nom (package, src, ...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    IWorkspaceRoot wr = ResourcesPlugin.getWorkspace().getRoot();
    IProject p = wr.getProject("testProject");
    IJavaProject jp = JavaCore.create(p);
    IPackageFragmentRoot fragmentRoots[] = null;
    try {
    	fragmentRoots = jp.getPackageFragmentRoots();
    } catch (JavaModelException e) {
    	e.printStackTrace();
    }
    for( IPackageFragmentRoot fragmentRoot : fragmentRoots ){
    	if( fragmentRoot.getElementName().equals("src") ){
    		IPackageFragment fragment = fragmentRoot.getPackageFragment("example");
    		try {
    			fragment.createCompilationUnit("HelloWorld.java", unit.toString(), true, null);
    		} catch (JavaModelException e) {
    			e.printStackTrace();
    		}
     
            }
    }
    d'autre part il fallait aussi lancer ma fonction de génération dans la fonction start() de la classe activator. Et enfin il fallait rajouter une extension au manifest.mf, org.eclipse.ui.startup, et que ma classe de génération implémente ce IStartup.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/01/2010, 23h24
  2. Générer du code Java à partir de Protégé
    Par lahmar.abdel1 dans le forum Ontologies
    Réponses: 0
    Dernier message: 20/07/2009, 15h35
  3. Générer code java à partir de rptdesign
    Par flo123456 dans le forum BIRT
    Réponses: 5
    Dernier message: 27/05/2009, 14h10
  4. Réponses: 1
    Dernier message: 09/03/2007, 14h40
  5. Exécuter du code Java à partir d'un rapport
    Par medbass dans le forum BIRT
    Réponses: 6
    Dernier message: 16/08/2006, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo