Skip to content

Commit

Permalink
Fixed issue #51 - paren Literal chars breaking matching pairs
Browse files Browse the repository at this point in the history
  • Loading branch information
laurentpetit committed Jan 13, 2010
1 parent eaa1664 commit 6902993
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 1 deletion.
Expand Up @@ -87,6 +87,7 @@ public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
assistant.setDocumentPartitioning(ClojurePartitionScanner.CLOJURE_PARTITIONING);
assistant.setContentAssistProcessor(new ClojureProposalProcessor(editor, assistant), IDocument.DEFAULT_CONTENT_TYPE);
assistant.setContentAssistProcessor(new ClojureProposalProcessor(editor, assistant), ClojurePartitionScanner.CLOJURE_COMMENT);
assistant.setContentAssistProcessor(new ClojureProposalProcessor(editor, assistant), ClojurePartitionScanner.CLOJURE_CHAR);
assistant.setContentAssistProcessor(new ClojureProposalProcessor(editor, assistant), ClojurePartitionScanner.CLOJURE_STRING);

assistant.enableAutoActivation(false);
Expand Down
71 changes: 70 additions & 1 deletion ccw.core/src/ccw/editors/rulesbased/ClojurePartitionScanner.java
Expand Up @@ -15,31 +15,100 @@
import java.util.List;

import org.eclipse.jface.text.rules.EndOfLineRule;
import org.eclipse.jface.text.rules.ICharacterScanner;
import org.eclipse.jface.text.rules.IPredicateRule;
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.RuleBasedPartitionScanner;
import org.eclipse.jface.text.rules.Token;
import org.eclipse.jface.text.rules.WordPatternRule;

public class ClojurePartitionScanner extends RuleBasedPartitionScanner {
public static final String CLOJURE_PARTITIONING = "__clojure_partitioning";

public final static String CLOJURE_COMMENT = "__clojure_comment"; //$NON-NLS-1$
public final static String CLOJURE_STRING = "__clojure_string"; //$NON-NLS-1$
public final static String CLOJURE_CHAR = "__clojure_char"; //$NON-NLS-1$

public final static String[] CLOJURE_CONTENT_TYPES=
new String[] { CLOJURE_COMMENT, CLOJURE_STRING };
new String[] { CLOJURE_COMMENT, CLOJURE_STRING, CLOJURE_CHAR };

public ClojurePartitionScanner() {
IToken comment = new Token(CLOJURE_COMMENT);

IToken string = new Token(CLOJURE_STRING);

IToken cljChar = new Token(CLOJURE_CHAR);

List<IPredicateRule> rules = new ArrayList<IPredicateRule>();
rules.add(new EndOfLineRule(";", comment));
rules.add(new MultiLineRule("\"", "\"", string, '\\'));
rules.add(new ClojureCharRule(cljChar));

setPredicateRules(rules.toArray(new IPredicateRule[rules.size()]));
}

public static class ClojureCharRule implements IPredicateRule {
private final IToken tokenToReturn;
public ClojureCharRule(IToken tokenToReturn) {
this.tokenToReturn = tokenToReturn;
}

public IToken evaluate(ICharacterScanner scanner, boolean resume) {
if (resume == true) {
throw new IllegalArgumentException("unhandled case when resume = true");
} else {
return evaluate(scanner);
}
}

public IToken getSuccessToken() {
return tokenToReturn;
}

public IToken evaluate(ICharacterScanner scanner) {
int firstChar = scanner.read();
if ((char)firstChar != '\\') {
scanner.unread();
return Token.UNDEFINED;
} else {
int next = scanner.read();
if (Character.isWhitespace(next)) {
scanner.unread();
return Token.UNDEFINED;
}
// if ((char)next == 'n') {
// int second = scanner.read();
// if ((char)second != 'e') {
// scanner.unread();
// return getSuccessToken();
// } else {
//
// }
// }
// if ((char)next == 's') {
// int second = scanner.read();
// if ((char)second != 'p') {
// scanner.unread();
// return getSuccessToken();
// } else {
//
// }
// }
// if ((char)next == 't') {
// int second = scanner.read();
// if ((char)second != 'a') {
// scanner.unread();
// return getSuccessToken();
// } else {
//
// }
// }
return getSuccessToken();
}
}

}

}

0 comments on commit 6902993

Please sign in to comment.