blob: a323eb37bfb3f4b77002815780ccb5c5f02f5986 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2011 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.fx.xtext.sample.editor.java.text;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.rules.ICharacterScanner;
import org.eclipse.jface.text.rules.IRule;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.IWordDetector;
import org.eclipse.jface.text.rules.MultiLineRule;
import org.eclipse.jface.text.rules.SingleLineRule;
import org.eclipse.jface.text.rules.Token;
import org.eclipse.jface.text.rules.WhitespaceRule;
import org.eclipse.jface.text.rules.WordRule;
public class JavaDocScanner extends JavaCommentScanner {
private static String[] fgTokenProperties= {
IJavaColorConstants.JAVADOC_KEYWORD,
IJavaColorConstants.JAVADOC_TAG,
IJavaColorConstants.JAVADOC_LINK,
IJavaColorConstants.JAVADOC_DEFAULT,
TASK_TAG
};
public JavaDocScanner() {
super(IJavaColorConstants.JAVADOC_DEFAULT, fgTokenProperties);
}
public IDocument getDocument() {
return fDocument;
}
@Override
protected List<IRule> createRules() {
List<IRule> list= new ArrayList<IRule>();
// Add rule for tags
Token token= getToken(IJavaColorConstants.JAVADOC_TAG);
list.add(new TagRule(token));
// Add rule for HTML comments
WordRule wordRule= new WordRule(new HTMLCommentDetector(), token);
wordRule.addWord("<!--", token); //$NON-NLS-1$
wordRule.addWord("--!>", token); //$NON-NLS-1$
list.add(wordRule);
// Add rules for links
token= getToken(IJavaColorConstants.JAVADOC_LINK);
list.add(new MultiLineRule("{@link", "}", token)); //$NON-NLS-2$ //$NON-NLS-1$
list.add(new MultiLineRule("{@value", "}", token)); //$NON-NLS-2$ //$NON-NLS-1$
list.add(new MultiLineRule("{@inheritDoc", "}", token)); //$NON-NLS-2$ //$NON-NLS-1$
// Add rules for @code and @literals
token= getToken(IJavaColorConstants.JAVADOC_DEFAULT);
list.add(new MultiLineRule("{@code", "}", token)); //$NON-NLS-2$ //$NON-NLS-1$
list.add(new MultiLineRule("{@literal", "}", token)); //$NON-NLS-2$ //$NON-NLS-1$
// Add generic whitespace rule
token= getToken(IJavaColorConstants.JAVADOC_DEFAULT);
list.add(new WhitespaceRule(new JavaWhitespaceDetector(), token));
list.addAll(super.createRules());
return list;
}
class TagRule extends SingleLineRule {
/*
* @see SingleLineRule
*/
public TagRule(IToken token) {
super("<", ">", token, (char) 0); //$NON-NLS-2$ //$NON-NLS-1$
}
/*
* @see SingleLineRule
*/
public TagRule(IToken token, char escapeCharacter) {
super("<", ">", token, escapeCharacter); //$NON-NLS-2$ //$NON-NLS-1$
}
private IToken evaluateToken() {
try {
final String token= getDocument().get(getTokenOffset(), getTokenLength()) + "."; //$NON-NLS-1$
int offset= 0;
char character= token.charAt(++offset);
if (character == '/')
character= token.charAt(++offset);
while (Character.isWhitespace(character))
character= token.charAt(++offset);
while (Character.isLetterOrDigit(character))
character= token.charAt(++offset);
while (Character.isWhitespace(character))
character= token.charAt(++offset);
if (offset >= 2 && token.charAt(offset) == fEndSequence[0])
return fToken;
} catch (BadLocationException exception) {
// Do nothing
}
return getToken(IJavaColorConstants.JAVADOC_DEFAULT);
}
/*
* @see PatternRule#evaluate(ICharacterScanner)
*/
@Override
public IToken evaluate(ICharacterScanner scanner) {
IToken result= super.evaluate(scanner);
if (result == fToken)
return evaluateToken();
return result;
}
}
static class HTMLCommentDetector implements IWordDetector {
/**
* @see IWordDetector#isWordStart(char)
*/
public boolean isWordStart(char c) {
return (c == '<' || c == '-');
}
/**
* @see IWordDetector#isWordPart(char)
*/
public boolean isWordPart(char c) {
return (c == '-' || c == '!' || c == '>');
}
}
}