Comment (en détail) Microsoft implémente-t-il son Intellisense as-you-type ?
I peut Vous pouvez le décrire avec tous les détails que vous voulez, mais je n'ai pas le temps de vous donner plus qu'une brève explication. Je vais vous expliquer comment nous faisons dans Roslyn.
Tout d'abord, nous construisons un modèle immuable du flux de jetons à l'aide d'une structure de données pouvant représenter efficacement éditions car il est évident qu'il y aura beaucoup d'éditions.
L'idée maîtresse pour rendre efficace la réutilisation persistante est de représenter l'image de l'utilisateur. longueurs de caractères des jetons mais pas de leur positions des caractères dans le tampon d'édition ; rappelez-vous qu'un jeton à la fin du fichier va changer de position à chaque édition mais que la longueur du jeton ne change pas. Vous devez à tout prix minimiser le nombre total de relectures si vous voulez être efficace sur des fichiers extrêmement volumineux.
Une fois que vous disposez d'un modèle immuable capable de gérer les insertions et les suppressions afin de constituer un flux de jetons immuable sans avoir à ré-exécuter l'ensemble du fichier à chaque fois, vous devez ensuite procéder à l'opération suivante même mais pour l'analyse grammaticale. En pratique, c'est un problème beaucoup plus difficile . Je vous recommande d'obtenir un diplôme de premier cycle ou de deuxième cycle en informatique avec un accent sur la théorie des analyseurs syntaxiques, si ce n'est pas déjà fait. Nous avons obtenu l'aide de personnes titulaires d'un doctorat qui ont fait leur thèse sur la théorie des analyseurs syntaxiques pour concevoir cette partie particulière de l'algorithme.
Ensuite, évidemment, construisez un analyseur grammatical capable d'analyser le C#. Rappelez-vous, il doit analyser brisé C#, pas correct C# ; IntelliSense doit fonctionner alors que le programme est dans un état de non-compilation. Commencez donc par trouver des modifications à la grammaire qui ont de bonnes caractéristiques de récupération des erreurs.
OK, donc maintenant vous avez un analyseur syntaxique qui peut efficacement faire une analyse grammaticale sans ré-lexion ou ré-analyse de quoi que ce soit d'autre que la région éditée, la plupart du temps, ce qui signifie que vous pouvez faire le travail entre les frappes de touches. J'ai oublié de mentionner que, bien sûr, vous devrez trouver un mécanisme pour ne pas bloquer le thread de l'interface utilisateur tout en effectuant toutes ces analyses, au cas où l'analyse prendrait plus de temps que le temps entre deux frappes. La nouvelle fonctionnalité "async/await" de C# 5 devrait y contribuer. (Je peux vous le dire d'après mon expérience personnelle : faites attention à la prolifération des tâches et des jetons d'annulation. Si vous êtes négligent, il est possible de se retrouver dans un état où il y a des dizaines de milliers de tâches annulées en attente, et c'est pas rapide .)
Maintenant que vous avez une analyse grammaticale, vous devez construire un analyseur sémantique . Puisque vous ne faites que de l'IntelliSense, il n'est pas nécessaire que ce soit un analyseur sémantique particulièrement sophistiqué. (Notre analyseur sémantique doit faire une analyse appropriée pour générer du code à partir de programmes corrects et une analyse correcte des erreurs à partir de programmes incorrects). Mais bien sûr, il doit à nouveau faire une bonne analyse sémantique sur les programmes cassés, ce qui augmente considérablement la complexité.
Mon conseil est de commencer par construire un analyseur sémantique de "haut niveau", en utilisant à nouveau un modèle immuable qui peut conserver l'état des types de code source déclarés d'une édition à l'autre. L'analyseur de haut niveau traite tout ce qui est no une déclaration ou une expression : déclarations de types, directives, espaces de noms, déclarations de méthodes, constructeurs, destructeurs, etc. Les éléments qui constituent la "forme" du programme lorsque le compilateur génère des métadonnées.
Métadonnées ! J'ai oublié les métadonnées. Tu vas avoir besoin d'un lecteur de métadonnées. Vous devez être capable de produire IntelliSense sur les expressions qui font référence à des types dans les bibliothèques, évidemment. Je vous recommande d'utiliser les bibliothèques CCI comme lecteur de métadonnées, et non Reflection. Puisque vous ne faites que de l'IntelliSense, vous n'avez évidemment pas besoin d'un rédacteur de métadonnées.
Quoi qu'il en soit, une fois que vous avez un analyseur sémantique de haut niveau, vous pouvez écrire un analyseur sémantique d'énoncés et d'expressions qui analyse les types d'expressions dans un énoncé donné. Faites particulièrement attention à recherche du nom y résolution des surcharges algorithmes. L'inférence de type de méthode sera particulièrement délicate, notamment dans les requêtes LINQ .
Une fois que vous avez tout cela, un moteur IntelliSense devrait être facile ; il suffit de déterminer le type de l'expression à la position actuelle du curseur et d'afficher une liste déroulante en conséquence.
à quel point serait-il difficile pour moi de créer le mien avec le même standard ?
Eh bien, nous avons une équipe de, disons, dix personnes, et il faudra probablement, disons, cinq ans pour tout faire du début à la fin. Mais nous avons beaucoup plus à faire que juste le moteur IntelliSense. C'est peut-être seulement 40% du travail. Oh, et la moitié de ces personnes travaillent sur VB, maintenant que j'y pense. Mais ces personnes ont en moyenne cinq ou dix ans d'expérience dans ce genre de travail, et sont donc plus rapides que vous ne le serez si vous n'avez jamais fait cela auparavant.
Disons qu'il vous faudra environ dix à vingt ans de travail à temps plein, en travaillant seul, pour construire un moteur IntelliSense de qualité Roslyn pour C#, capable d'effectuer une analyse acceptable, proche de la correction, de grands programmes entre deux frappes.
Plus long si vous devez d'abord faire ce doctorat, évidemment.
Ou, vous pouvez simplement utiliser Roslyn, puisque c'est à cela qu'il sert . Cela vous prendra probablement quelques heures, mais vous n'aurez pas le plaisir de le faire vous-même. Et c'est amusant !
Vous pouvez télécharger la version préliminaire ici :
http://www.microsoft.com/download/en/details.aspx?id=27746
0 votes
Que voulez-vous exactement ? Le code source de Visual Studio Intellisense ? En quoi VS Intellisense est-il meilleur que le vôtre et quel problème rencontrez-vous pour l'implémenter ?
0 votes
Avez-vous jeté un coup d'œil à codeproject.com/Articles/42490/Utilisation d'AvalonEdit-WPF-Text-Editor encore ? AvalonEdit dispose non seulement de la coloration syntaxique, mais aussi d'une fonction de complétion automatique extensible.
0 votes
Je voudrais coder un contrôle de type éditeur qui puisse être utilisé dans les applications WPF et Win7 Phone. Je ne veux pas nécessairement les sources de MS, juste la méthodologie qu'ils utilisent pour implémenter cette fonctionnalité. Il semble que toutes les choses que j'ai rencontrées sont loin d'être aussi efficaces. Je vais maintenant jeter un coup d'œil à AvlonEdit. Merci à vous deux pour votre temps.
0 votes
D'autres mises à jour depuis la dernière édition ? ;-) Merci.
0 votes
Si et comment avez-vous mis en œuvre la navigation arrière/avant ?
0 votes
@bitman cela dépendrait du composant que vous avez utilisé.
0 votes
J'utilise AvalonEdit
0 votes
Bonjour @MoonKnight, existe-t-il un contrôle disponible pour la coloration syntaxique de SQL dans une application WPF ? En fait, je veux l'utiliser dans une application de recherche de schémas SQL. Je ne veux pas d'éditeur et il s'agit juste d'un contrôle en lecture seule. Je peux utiliser AvalonEdit mais je ne veux pas d'éditeur sur le plan fonctionnel, je veux juste alléger mon application.
0 votes
AvalonEdit est votre meilleur atout - il est beaucoup plus léger que vous ne le pensez. Sinon, vous devrez vous débrouiller tout seul, je pense.