8
votes

C # Code d'achèvement avec NREFactory 5

Je viens de découvrir Nrefactory 5 et je devinerais que c'est la solution la plus appropriée pour mon problème actuel. À l'heure actuelle, je développe une petite application de script C # pour laquelle je voudrais fournir une achèvement du code. Jusqu'à récemment, j'ai fait cela à l'aide du projet "ROSLYN" de Microsoft. Mais comme la dernière mise à jour de ce projet nécessite .NET Framework 4.5 Je ne peux plus l'utiliser comme si j'aimerais que l'application fonctionne également sous Win XP. Je dois donc passer à une autre technologie ici.

Mon problème n'est pas la compilation. Cela peut être fait, avec quelques efforts supplémentaires, par .NET CodeDomProvider également. Le problème est le cas d'achèvement du code. Autant que je sache, NREFactory 5 fournit tout ce qui est nécessaire pour fournir une achèvement de code (analyseur, système de type, etc.), mais je ne peux tout simplement pas comprendre comment l'utiliser. J'ai examiné le code source SharpDEvelop, mais ils n'utilisent pas NREFactory 5 pour l'achèvement du code, ils ne l'utilisent que comme décompiler. Comme je ne pouvais pas trouver un exemple sur la façon de l'utiliser pour l'achèvement du code dans le net, je pensais que je pourrais trouver une aide ici. P>

La situation est la suivante. J'ai un seul fichier contenant le code de script. En réalité, ce n'est même pas un fichier, mais une chaîne que je reçois du contrôle de l'éditeur (à la manière suivante: j'utilise Avalonedit pour cela. Grand éditeur!) Et des assemblages qui doivent être référencés. Ainsi, pas de fichiers de solution, pas de fichiers de projet, etc. Une seule chaîne de code source et des assemblages. P>

J'ai parcouru la démo fournie avec Nrefactory 5 et l'article sur le projet de code et obtenu Avec quelque chose comme ça: P>

var unresolvedTypeSystem = syntaxTree.ToTypeSystem();

IProjectContent pc = new CSharpProjectContent();

// Add parsed files to the type system
pc = pc.AddOrUpdateFiles(unresolvedTypeSystem);

// Add referenced assemblies:
pc = pc.AddAssemblyReferences(new CecilLoader().LoadAssemblyFile(
    System.Reflection.Assembly.GetAssembly(typeof(Object)).Location));


1 commentaires

Monodevelop utilise la classe CsharpCompletionEngine. Peut-être que cela démontrera comment ça fonctionne.


3 Réponses :


2
votes

Nrefactory 5 est utilisé dans SharpDevelop 5. Le code source de SharpDevelop 5 est actuellement disponible dans le NEWNR BRANCHE SUR GITUB . Je jetterais un coup d'oeil à la CSHARPCOMPETITIONS Class qui a du code pour afficher une fenêtre de liste d'achèvement en utilisant des informations de CsharpCompletionEngine de Nrefactory.


4 commentaires

Salut Matt. Malheureusement, SharpDEvelop 5 nécessite également .NET Framework 4.5 Donc, je ne peux donc pas explorer la solution sur ma machine. J'espère avoir mes mains sur une machine Win 8 le week-end pour creuser plus profondément dans cela. Pouvez-vous réduire les projets ou les DLL qui sont impliqués dans l'achèvement des affaires? Outre Csharpbinding Il semble être au moins des projets: mono.cecil , SharpDEvelop , ICSHARPCODE.SHARPDEVEL et < B> ICSHARPCODE.CORE . Est-ce correct? (#D version 5.0.0.1472) Il semble que les classes requises soient réparties sur plusieurs projets et espaces de noms. Merci!


Vous devriez pouvoir simplement utiliser les packages Nuget pour Avalonedit et Nrefactory. AvaloneDit a sa propre fenêtre de liste d'achèvement afin qu'il s'agisse simplement de capturer le texte entré puis de l'alimenter sur le moteur d'achèvement. Je vais regarder la mise en place d'un exemple.


@Mattward a jamais obtenu cet exemple ensemble? Merci!


@georgiosd - Lukas Buehler a créé un exemple - Github.com/lukebuehler/nrefactory-completion-sample - a>



3
votes

Jetez un coup d'oeil à la méthode icsharscode.nrefactory.cshaparp.codecompletion.Createengine . Vous devez créer une instance de csharpcompletionengine et transmettre le document correct et les résolveurs. J'ai réussi à le faire fonctionner pour CTRL + Scénario de complément spatial. Cependant, j'ai des problèmes avec des références aux types qui sont dans d'autres espaces de noms. Il ressemble à csharptyperesolvecontext ne prend pas en compte les instructions d'espace de noms - si je résolvez les références avec csharpastasolver , ils sont résolus, mais je ne parviens pas à utiliser correctement ce résolveur. dans le scénario de complétion de code ...

Mise à jour n ° 1:

Je viens de réussir à obtenir le travail en obtenant un résolution d'échec non résolu.

Voici le snippet: xxx

update # 2:

Voici la méthode complète. Il références de cours à partir de projets de test unitaires, Sou vous auriez besoin de les référencer / les copier dans votre projet: xxx

}

espère qu'il aide, Matra


0 commentaires

7
votes

1 commentaires

Vous avez simplement fait ma journée! Merci beaucoup pour ce grand travail. Il m'a fallu un peu pour le faire fonctionner. J'avais des problèmes car mon projet de test était partiellement lié à une autre version Avalonedit!