blob: d167b040e2dd371d5f473f54e65730657b278aa8 [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2008, 2019 Stephan Wahlbrink and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
# which is available at https://www.apache.org/licenses/LICENSE-2.0.
#
# SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
#
# Contributors:
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
package org.eclipse.statet.r.ui.text.r;
import java.util.List;
import org.eclipse.jface.text.rules.ICharacterScanner;
import org.eclipse.jface.text.rules.IPredicateRule;
import org.eclipse.jface.text.rules.IRule;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.Token;
import org.eclipse.statet.ecommons.preferences.core.PreferenceAccess;
import org.eclipse.statet.ecommons.text.ui.settings.TextStyleManager;
import org.eclipse.statet.base.ext.ui.text.CommentScanner;
/**
* Scanner for Roxygen comments.
*/
public class RoxygenScanner extends CommentScanner {
private static class RoxygenTagRule implements IPredicateRule {
private final IToken fTagToken;
private final IToken fDefaultToken;
public RoxygenTagRule(final IToken tagToken, final IToken defaultToken) {
fTagToken = tagToken;
fDefaultToken = defaultToken;
}
@Override
public IToken getSuccessToken() {
return fTagToken;
}
@Override
public IToken evaluate(final ICharacterScanner scanner) {
return evaluate(scanner, false);
}
@Override
public IToken evaluate(final ICharacterScanner scanner, final boolean resume) {
int c;
if (!resume) {
final int c0 = scanner.read();
if (c0 != '@') {
if (c0 != ICharacterScanner.EOF) {
scanner.unread();
}
return Token.UNDEFINED;
}
c = scanner.read();
if (c == '@') {
return fDefaultToken;
}
}
else {
c = scanner.read();
}
while (c != ICharacterScanner.EOF) {
if (c == '@' || !isRoxygenTagChar(c)) {
scanner.unread();
break;
}
c = scanner.read();
}
return fTagToken;
}
private boolean isRoxygenTagChar(final int c) {
if ((c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A)) {
return true;
}
final int type = Character.getType(c);
return (type > 0) && (type < 12 || type > 19);
}
}
public RoxygenScanner(final TextStyleManager textStyles, final PreferenceAccess corePrefs) {
super(textStyles, IRTextTokens.ROXYGEN_KEY, IRTextTokens.TASK_TAG_KEY, corePrefs);
}
@Override
protected void createRules(final List<IRule> rules) {
super.createRules(rules);
rules.add(new RoxygenTagRule(getToken(IRTextTokens.ROXYGEN_TAG_KEY), fDefaultReturnToken));
}
}