2015-12-21 4 views
0

Я разрабатываю плагин eclipse с настраиваемым текстовым редактором, для которого я хочу предоставить подсветку синтаксиса. Поэтому я внедрил свой собственный RuleBasedPartitionScanner и соответствующий SourceViewerConfiguration.
Все работает нормально, когда я не вмешиваюсь в defaultReturnToken PartitionScanner, но когда я пытаюсь установить значение по умолчанию, значение по умолчаниюReturnToken подсветка синтаксиса исчезает.setDefaultReturnToken messes up подсветка синтаксиса

Мой PartitionScanner:

public class SQFPartitionScanner extends RuleBasedPartitionScanner { 

    public static final String SQF_COMMENT = "__sqf_Comment"; 
    public static final String SQF_CODE = "__sqf_Code"; 

    public SQFPartitionScanner() { 
     IToken comment = new Token(SQF_COMMENT); 
     IToken code = new Token(SQF_CODE); 

     IPredicateRule[] rules = { 
       //rule for multiLine comments 
       new MultiLineRule("/*", "*/", comment), 
       //rule for singleLine comments 
       new EndOfLineRule("//", comment) 
     }; 

     this.setPredicateRules(rules); 

     this.setDefaultReturnToken(code); 
    } 

} 

Как вырабатываемой знак это уже не из не печатаете IDocument.DEFAULT_CONTENT_TYPE но вместо типа SQFPartitioScanner.CODE я изменил мой SourceViewerConfiguration как следует (я только изменил getPresentationReconciler() -метод):

public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) { 
     PresentationReconciler reconciler = new PresentationReconciler(); 

     DefaultDamagerRepairer dr = new DefaultDamagerRepairer(this.getKeywordScanner()); 
//  reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); 
//  reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE); 
     reconciler.setDamager(dr, SQFPartitionScanner.SQF_CODE); 
     reconciler.setRepairer(dr, SQFPartitionScanner.SQF_CODE); 

     return reconciler; 
    } 

Есть ли что-то еще, что мне нужно изменить для подсветки синтаксиса для работы с defaultReturnToken, установленным на SQFPartitionScanner.SQF_CODE?

EDIT:
Когда я раскомментировать строки

//  reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); 
//  reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE); 

и комментировать

reconciler.setDamager(dr, SQFPartitionScanner.SQF_CODE); 
reconciler.setRepairer(dr, SQFPartitionScanner.SQF_CODE); 

Я до сих пор не получают подсветку синтаксиса.
Из-за того, что я подозреваю, что маркер по умолчанию не правильно создан, потому что, очевидно, это не относится к типу IDocument.DEFAULT_CONTENT_TYPE больше, но это не типа SQFPartitionScanner.SQF_CODE ни

ответ

0

EDIT:

Я думаю, что проблема может быть, что вы необходимо добавить два новых типа контента в метод getConfiguredContentTypes в новой SourceViewerConfiguration. Я думаю, что вам нужно изменить SQFPartitionScanner иметь следующие строки: в верхней части

public static final IToken SQF_Comment_Type = new Token(SQF_COMMENT); 
public static final IToken SQF_Code_Type = new Token(SQF_CODE); 

Измените getConfigurationContentTypes на:

public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) { 
    return new String[] { IDocument.DEFAULT_CONTENT_TYPE, 
     SQFPartitionScanner.SQF_Comment_Type, SQFPartitionScanner.SQF_Code_type }; 
} 

А также удалить comment и code переменные и заменить их окончательного статики в SQFPartitionScanner, поэтому вы всегда ссылаетесь на одни и те же экземпляры.

--------------------------------------------- -----------

Кажется, что некоторые вещи по умолчанию не соответствуют IDocument.DEFAULT_CONTENT_TYPE и многим зависимостям от contentType. Например, в PresentationReconciler он получает повреждение и примирители, используя тип содержимого раздела. Повреждения хранятся в соответствии с типом contentType, который вы установили вместе с ремонтом. Они извлекаются в соответствии с типом, что в докладе разделов, и при некоторых обстоятельствах по умолчанию в IDocument.DEFAULT_CONTENT_TYPE:

if (document instanceof IDocumentExtension3) { 
    IDocumentExtension3 extension3= (IDocumentExtension3) document; 
    try { 
     return extension3.getPartition(partitioning, offset, preferOpenPartitions); 
    } catch (BadPartitioningException x) { 
    return new TypedRegion(0, document.getLength(), IDocument.DEFAULT_CONTENT_TYPE); 
    } 
} 

Так что я подозреваю, что если вы собираетесь иметь свой собственный тип контента, который вы должны работать через всей системы.Я думаю, что у вас может быть некоторая несогласованность, когда часть контента считает, что это тип по умолчанию.

Одним из способов увидеть, что происходит, является добавление исходных банок для соответствующих плагинов затмения в вашу среду и переход к ним и просмотр того, что происходит в PresentationReconciler относительно типов контента во время выполнения.

Другой подход временно раскомментируйте следующие строки сверху:

//  reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); 
//  reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE); 

Таким образом, вы имеете Др зарегистрированную для обоих типов и посмотреть, если подсветка возвращается. Если это так, это подтверждает, что проблема связана с типом contentType, возвращающимся из документа.

+0

Когда я раскомментирую эти строки, повторного появления подсветки синтаксиса еще нет ... даже если я прокомментирую две строки, где я установил причину и ремонт для типа 'SQFPartitionScanner.SQF_CODE' – Raven

+0

Так что мои предположения были неправильными (опять же) , Вы убедились, что вы изменили 'getConfiguredContentTypes()' в 'SourceViewerConfiguration' на типы, которые вы добавили? –

+0

@Raven, я отредактировал свой ответ с новым предложением. –