Meilleur reporting

Afin de faciliter l'apprentissage du langage, il est important de donner un diagnostiques précis des erreurs et en particulier indiquer la position de l'erreur : la ligne voire mieux l'intervalle dans la ligne en erreur.

Les utilisateurs peuvent à tout moment éditer un texte en erreur. Si l'erreur est située avant leur position d'édition l'analyse s'arrête et ils n'auront alors aucune information de potentielles erreurs à la position d'édition. Il est donc important d'avoir une analyse suffisamment robuste pour pouvoir indiquer le maximum d'erreurs possibles à l'utilisateur et en particulier à la position d'édition.

Positionnement

interface Position {
    offset: number;
    line: number;
    character: number;
}

interface Span {
    from: Position;
    to: Position
}

Les informations ligne/character et offset paraissent redondantes mais chaque éditeur de texte gère le positionnement dans le texte de façon différente :

  • le language Server Protocol utilisé par VSCode n'accepte que ligne/colonne ;
  • Codemirror accepte plutôt ligne/colonne, mais des fonctions de conversion existent ;
  • le positionnement brut dans un fichier est plus aisé avec l'offset.

C'est donc une bonne pratique d'utiliser le triplet ligne/colonne/offset pour le positionnement dans le texte.

Rapport d'erreurs multiples

Pour rapporter les erreurs, les différentes phases de l'analyse disposent d'un objet du type suivant :

interface ErrorReporter {
    reportError(span: Span, message: string);
}

Description des outils de test

Afin de simplifier l'écriture des tests la fonction utilitaire code est utilisée pour définir à la fois le code à analyser ainsi que la position de marqueurs (@{1}, @{2}, etc.). Ces marqueurs sont ensuite utilisés pour comparer avec les positions fournies par le résultat de l'analyse.