Meditor Archiv

Aus Physik
Zur Navigation springen Zur Suche springen

Versionen


Anfänglich vorhandene Strukturen

In grün Geschriebenes sind die selbst entwickelten Klassen.

Partitionierung des Dokuments

PartitionScanner ist MatlabPartitionScanner.

java.lang.Object
  |- org.eclipse.jface.text.rules.RuleBasedScanner
       |- org.eclipse.jface.text.rules.BufferedRuleBasedScanner
            |- org.eclipse.jface.text.rules.RuleBasedPartitionScanner
                 |- at.tugraz.itp.mltutor.meditor.editors.MatlabPartitionScanner

Der Partitioner ist FastPartitioner (war vorher der deprecated DefaultPartitioner)


Weiters gibt es MatlabScanner, welche allerdings nur für die Erstellung eines DefaultDamageRepairer in der Funktion MatlabConfiguration.getPresentationReconciler(...) verwendet wird.

java.lang.Object
  |- org.eclipse.jface.text.rules.RuleBasedScanner
       |- at.tugraz.itp.mltutor.meditor.editors.MatlabScanner

Warum zwei Scanner:
FastPartitioner wird von MatlabDocumentProvider.createDocument(...) verwendet, und braucht ein IPartitionTokenScanner. Dieses wird von RuleBasedPartitionScanner implementiert, jedoch nicht von RuleBasedScanner. RuleBasedPartitionScanner ist jedoch für IPredicateRules, was von WordRule nicht implementiert ist, gedacht. Letzteres wird für das Scannen nach den Keywords benutzt, weshalb für diesen Zweck letztendlich eine weitere Klasse von RuleBasedScanner abgeleitet wurde.
ABER: es gibt auch die Funktion RuleBasedPartitionScanner.setRules(IRule[] rules), es müsste nur ausprobiert werden, ob die WordRules damit wirklich funktionieren (bin ein wenig durch die Hilfe verwirrt --Osiris).

Ist ausprobiert und: geht NICHT

Indent Strategy

public class MatlabConfiguration extends SourceViewerConfiguration {
    public IAutoIndentStrategy getAutoIndentStrategy(ISourceViewer sourceViewer,String contentType){
        if (autoIndentStrategy == null){
            autoIndentStrategy = new MatlabAutoIndentStrategy();
        }
        return autoIndentStrategy;
    }
    ...
}

Recht ungut weil

  1. Deprecated
  2. MatlabAutoIndentStrategy() ist von DefaultAutoIndentStrategy abgeleitet.
    • Diese ist ebenfalls deprecated
    • Davon soll nicht abgeleitet werden - und vom "neuen" Äquivalent ebenfalls nicht

Eine Änderung des Typs der Indent Strategy hat Auswirkungen in:

  • MatlabConfiguration.autoEditStrategy
  • MatlabConfiguration.getAutoEditStrategies(...)
  • MatlabConfiguration.resetIndentPrefixes()
  • MatlabEditor.indentStrategy
  • MatlabEditor.MatlabEditor()
  • MatlabEditor.resetForceTabs()

- ist mir ein bissi viel - meiner Meinung nach braucht nur die MatlabConfiguration was von der Indent Strategy zu wissen --Osiris 13:45, 1 December 2005 (CET)


Neue Strukuren

Ersetzte deprecated Klassen

  • Indent Strategy
    • IAutoIndentStrategy ist durch IAutoEditStrategy zu ersetzen
    • damit auch die Funktion getAutoIndentStrategy(...) durch getAutoEditStrategies(...)
    • und weiters kann dann MatlabAutoIndentStrategy() nicht mehr von DefaultAutoIndentStrategy, sondern von DefaultIndentLineAutoEditStrategy abgeleitet werden.
      • funktioniert, ist aber nicht gut, da von letzterer nicht abgeleitet werden soll.
    • oder man kann statt MatlabAutoIndentStrategy() gleich DefaultIndentLineAutoEditStrategy verwenden, wofür diese Klasse eigentlich gedacht ist.
      • geht aber nicht direkt, da Funktionen von MatlabAutoIndentStrategy() an diversen Stellen verwendet werden :-(

Partitionierung

  • Schön wäre es, wenn auch Regular Expressions für die Partitionierung verwendet werden könnten. Damit könnten z.B. Variablen erkannt werden, weiters ist es besonders praktisch, dass die RegEx bereits entwickelt sind.
    • Leider gibt es als Futter für den RuleBasedScanner nur die Klassen:
      1. NumberRule
      2. PatternRule, davon abgeleitet:
        • MultiLineRule
        • SingleLineRule
      3. WhitespaceRule
      4. WordRule
    • Idee: Eine Klasse für RegEx schreiben, die IRule oder IPredicateRule implementiert.

Diese Klasse gibt es schon fertig implementiert: RegExRule
Eine Möglichkeit wäre es vielleicht teilweise auch, die vorgegebenen Rules für dieses Unterfangen zu verwenden, z.B.

WordRule wordRule = new WordRule(new MatlabWordDetector(), def); 

wobei MatlabWordDetector wie folgt implementiert wird:

import java.util.regex.Pattern;
import org.eclipse.jface.text.rules.IWordDetector;
public class MatlabWordDetector implements IWordDetector {
public boolean isWordStart(char c) {return Pattern.matches("Regular Expression für WordStart", String.valueOf(c));}
public boolean isWordPart(char c) {return Pattern.matches("Regular Expression für WordPart", String.valueOf(c));}

--Camhy 09:10, 14 November 2005 (CET)


ToDos

Partitionierung

Es ist das Problem des ' Zeichens zu lösen. Wird dieses als Operator zwei Mal in einer Zeile verwendet, so wird der dazwischenliegende Teil als String interpretiert.

  • Idee: Es gibt eine Regular Expression für Strings mit 'bla', mit der eine RegExRule statt der SinglelineRule verwendet wird. Diese regex müsste dahingehend erweitert werden, dass nur "gültige" Strings als solche erkannt werden
    • Lösung dafür: Lookback. Allerdings kann damit nur auf Ausdrücke bekannter Länge geprüft werden (also nicht ob z.B. ein beliebiger Variablenname vor dem ' Zeichen steht). Man könnte aber sagen, dass das letzte Zeichen vor dem Kommentar kein Buchstabe, keine Zahl und keine schließende Klammer sein darf.
      • Problem: Lookback ist von Java-Regex unterstützt, funktioniert aber nicht
        • An java.util.regex.Pattern liegt's eher nicht, da eine andere Library (JRegex) sich gleich verhält
        • Die RegExRule funktioniert prinzipiell, da Ausdrücke ohne Lookback erkannt werden.
        • Ich glaube eher, dass das prinzipielle Vorgehen bei der Partitionierung nicht geeignet für Lookbacks ist (zumindest ohne grobe Umbauten). --Osiris 15:10, 3 January 2006 (CET)
    • Workaround: vor dem öffnenden ' muss ein (Regex-)Whitespace stehen. Damit werden zwar nicht alle gültigen Strings erkannt, aber dafür sicher kein "ungültiger"
  • weitere Idee: der Scanner bietet die Funktion unread() an, mit der (hoffentlich) um ein Zeichen zurückgesprungen werden kann. Dieses wird wieder eingelesen und darauf überprüft, ob es vor einem String stehen darf.
    • unread() funktioniert!
      • Die RegExRule wurde dahingehend erweitert, dass man eine weitere Regex für einen Lookback angeben kann, welcher mit Hilfe von unread() vor dem Check der eigentlichen Regex durchgeführt wird.

Automatisierte Erstellung der Wortlisten für die Funktionen

  • Idee: Eigenes Tool das die Matlab-Verzeichnisstruktur durchsucht und die gefundenen Funktionen in einem File speichert.
    Dieses File ist die Basis der Wortliste, die beim Eclipse-Start erstellt wird.
    • Ausgangsverzeichnis: afs/itp.tugraz.at/opt/matlab/R14.sp3/toolbox/matlab/ für die Matlab-Funktionen (6337 Files in 420 Ordnern!)
    • Es existiert in den Unterverzeichnisen oft ein File Content.m
      • Gibt es weitere Files ohne Funktionsinhalt?
      • Können alle Files, die mit Großbuchstaben beginnen ignoriert werden?
    • Nicht alle enthaltenen Files sind Matlab-Funktionen, da auch die Keywords vorkommen. Deshalb muss
      1. entweder eine Liste der Keywords dem Tool bekannt sein, sodass wirklich nur Funktionen im File enthalten sind, oder
      2. erst beim ML Tutor - Start (der muss ja auf jeden Fall die Keywords kennen) die "falschen" Funktionen ignoriert werden.
      • Die zweite Variante ist eleganter (bessere Aufgabentrennung) dafür inperformant, wohingegen bei der ersten Inkonsistenzen erzeugt werden können - es muss sichergestellt werden, dass die selbe Liste der Keywords (wieder File) von allen Parteien verwendet wird. Bei der ersten Möglichkeit wird jedoch ein File erstellt, welches wirklich nur die Funktionenen enthält, was auch sein hübsches hat.
      • Die Keywordliste selbst kann leicht mit dem Befehl iskeyword erzeugt und dann exportiert werden.

Hilfesystem

Anforderung

Es soll möglich sein, für eine ausgewählte Funktion (z.B. Textcursor im Funktionsnamen) die Matlab-Hilfe aufzurufen.

Umsetzung

  • Öffnen eines Browserfensters, Name der Funktion ist Teil der URL
    • Problem: Nicht immer passt der Name (z.B. Operatoren und die zu ihnen äquivalenten Funktionen müssen auf die selbe Hilfeseite verweisen)
      • Lösungsidee: Ausnahmen werden in einer Map gespeichert (Key: Funktionsname, Value: passender Text für die Hilfeseite)
      • Als Hilfestellung kann beim Erzeugen des Files, welches die Matlab-Funktionen enthält, auch ein weiteres File erzeugt werden, in dem all jene Funktionen angeführt sind, zu denen es kein Hilfefile gibt.
        Zur Information: von den 1675 functions gibt es 618 ohne direkt korrespondierendes helpfile.
      • weitere Möglichkeit: wenn auch keine Ausnahme in der Map definiert ist, dann könnte in der helpfile - Datenbank gesucht werden. Dabei müsste aber dem User entweder vom MLTutor eine Auswahlmöglichkeit (mehrere Suchresultate!) zur Verfügung gestellt werden, oder es wird eine Page mit Suchfunktionen aufgerufen, wobei letzteres sicher die einfachere Variante wäre.

Anstehende Refactorings / Verbesserungen

  • MatlabSourceViewer
    • ist von ProjectionViewer abgeleitet, von der aber nicht abgeleitet werden soll
    • macht außer Unnötigem fast nichts mehr als ProjectionViewer
      • die Ausnahme: in der Funktion canDoOperation(...) wird MatlabEditor.CORRECTIONASSIST_PROPOSALS behandelt, was aber sonst nirgends verwendet wird.
  • Für MatlabenginePrefsPage und MatlabengineExportPrefsPage
    abstrakte Basisklasse einführen, die gemeinsamen Code kapselt.
  • Activator
    • die get???Dir() - Funktionen besser organisieren

Fragen

Erledigte

  • Wie wichtig ist eine korrekte Partitionierung des Dokuments? => evt. sollten die beiden Scanner zusammengelegt werden.
Wäre wesentlich schöner und ausbaufähiger wenn es nur einen Scanner gibt
=> werden zusammengelegt. --Osiris 11:34, 24 November 2005 (CET)
  • Deprecated Klassen wegkriegen?
Wäre vielleicht nicht schlecht, unter Eclipse 3.2 solltens aber noch funktionieren, wenn das ähnlich wie beim aktuellen RC läuft. --Camhy 09:18, 14 November 2005 (CET)
Unbedingt notwendig, da man sich typischerweise besser auskennt, wenn man gerade daran arbeitet. Sonst kann sich jemand in relativer zeitlicher Nähe wieder damit bechäftigen. Das heisst insgesamt sollte man bei solchen Projekten eher auf Zukunftssicherheit setzen.--Winny 11:42, 14 November 2005 (CET)
Hätt ich auch gedacht, v.a. da der ML-Tutor einige Eclipse-Upgrades miterleben dürfte. Ich würde sagen, dass das als erstes zu erledigen wär, damit wir gleich auf den "neueren" Klassen aufbauen. --Osiris 11:54, 14 November 2005 (CET)