Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Schindl2016-03-19 09:04:29 +0000
committerTom Schindl2016-03-19 09:04:29 +0000
commit40c7d039108ba3a697287e5691fb18eff613c88c (patch)
tree61177aaf64321955f921376797997f624d0517bf /bundles/code/org.eclipse.fx.text/src/org/eclipse/fx
parent3b56b4b2efe17a2a580ddc336c42f069343c3c18 (diff)
downloadorg.eclipse.efxclipse-40c7d039108ba3a697287e5691fb18eff613c88c.tar.gz
org.eclipse.efxclipse-40c7d039108ba3a697287e5691fb18eff613c88c.tar.xz
org.eclipse.efxclipse-40c7d039108ba3a697287e5691fb18eff613c88c.zip
rewrote rule impl
Diffstat (limited to 'bundles/code/org.eclipse.fx.text/src/org/eclipse/fx')
-rw-r--r--bundles/code/org.eclipse.fx.text/src/org/eclipse/fx/text/rules/CheckPointScanner.java6
-rw-r--r--bundles/code/org.eclipse.fx.text/src/org/eclipse/fx/text/rules/DynamicEndRule.java60
2 files changed, 38 insertions, 28 deletions
diff --git a/bundles/code/org.eclipse.fx.text/src/org/eclipse/fx/text/rules/CheckPointScanner.java b/bundles/code/org.eclipse.fx.text/src/org/eclipse/fx/text/rules/CheckPointScanner.java
index 829691822..4ee573cab 100644
--- a/bundles/code/org.eclipse.fx.text/src/org/eclipse/fx/text/rules/CheckPointScanner.java
+++ b/bundles/code/org.eclipse.fx.text/src/org/eclipse/fx/text/rules/CheckPointScanner.java
@@ -5,7 +5,7 @@ import org.eclipse.jface.text.rules.ICharacterScanner;
@SuppressWarnings("restriction")
public class CheckPointScanner implements ICharacterScanner {
private final ICharacterScanner realScanner;
- private int charCount;
+ int charCount;
public CheckPointScanner(ICharacterScanner realScanner) {
this.realScanner = realScanner;
@@ -24,13 +24,13 @@ public class CheckPointScanner implements ICharacterScanner {
@Override
public int read() {
this.charCount++;
- return this.read();
+ return this.realScanner.read();
}
@Override
public void unread() {
this.charCount--;
- this.unread();
+ this.realScanner.unread();
}
public void setCheckpoint() {
diff --git a/bundles/code/org.eclipse.fx.text/src/org/eclipse/fx/text/rules/DynamicEndRule.java b/bundles/code/org.eclipse.fx.text/src/org/eclipse/fx/text/rules/DynamicEndRule.java
index f7055acd6..af6e7dc53 100644
--- a/bundles/code/org.eclipse.fx.text/src/org/eclipse/fx/text/rules/DynamicEndRule.java
+++ b/bundles/code/org.eclipse.fx.text/src/org/eclipse/fx/text/rules/DynamicEndRule.java
@@ -49,12 +49,13 @@ import org.eclipse.jface.text.rules.IToken;
*
* <pre>
* {@code
- * new DynamicEndRule( "[", Pattern.compile("(=*)\\["), "]{0}]" );
+ * new DynamicEndRule( "[", Pattern.compile("(=*)"), "[", "]{0}]" );
* }
* </pre>
*/
@SuppressWarnings("restriction")
public class DynamicEndRule extends ExtendedPatternRule {
+ private final char[] beginSuffix;
private final Pattern beginPattern;
private final String endTemplate;
@@ -67,13 +68,16 @@ public class DynamicEndRule extends ExtendedPatternRule {
* the prefix for the start must be at least one char
* @param beginPattern
* the pattern with groups to find the end of the start-sequence
+ * @param beginSuffix
+ * the suffix might be empty
* @param endTemplate
* the end template who can references groups from the start
* sequence using {index} like in {@link MessageFormat}
*/
- public DynamicEndRule(IToken token, String beginPrefix, Pattern beginPattern, String endTemplate) {
- super(beginPrefix, "", token, '\\', false, true);
+ public DynamicEndRule(IToken token, String beginPrefix, Pattern beginPattern, String beginSuffix, String endTemplate) {
+ super(beginPrefix, "", token, '\\', false, false);
this.beginPattern = beginPattern;
+ this.beginSuffix = beginSuffix == null ? new char[0] : beginSuffix.toCharArray();
this.endTemplate = endTemplate;
}
@@ -87,36 +91,42 @@ public class DynamicEndRule extends ExtendedPatternRule {
@Override
protected boolean sequenceStartDetected(ICharacterScanner scanner, char[] sequence, boolean eofAllowed) {
- boolean rv = super.sequenceStartDetected(scanner, sequence, eofAllowed);
-
+ CheckPointScanner cs = new CheckPointScanner(scanner);
+ cs.setCheckpoint();
+ boolean rv = super.sequenceStartDetected(cs, sequence, eofAllowed);
if (rv) {
- CheckPointScanner checkPointScanner = new CheckPointScanner(scanner);
- checkPointScanner.setCheckpoint();
-
- StringBuilder b = new StringBuilder();
- int c;
- boolean hasOneMatch = false;
- while ((c = scanner.read()) != ICharacterScanner.EOF) {
- b.append(c);
- if (!beginPattern.matcher(b).matches()) {
- if (hasOneMatch) {
- Matcher matcher = beginPattern.matcher(b.subSequence(0, b.length() - 1));
- Object[] g = new String[matcher.groupCount()];
- for (int i = 0; i < matcher.groupCount(); i++) {
- g[i] = matcher.group(i + 1);
+ if( beginSuffix.length > 0 ) {
+ StringBuilder b = new StringBuilder();
+ int c;
+ while ((c = scanner.read()) != ICharacterScanner.EOF) {
+ if( c == beginSuffix[0] ) {
+ rv = super.sequenceDetected(cs, beginSuffix, false);
+ if( rv ) {
+ Matcher matcher = beginPattern.matcher(b);
+ rv = matcher.matches();
+ if( rv ) {
+ Object[] g = new String[matcher.groupCount()];
+ for (int i = 0; i < matcher.groupCount(); i++) {
+ System.err.println("G: " + matcher.group(i + 1));
+ g[i] = matcher.group(i + 1);
+ }
+ fEndSequence = MessageFormat.format(endTemplate, g).toCharArray();
+ break;
+ }
}
- fEndSequence = MessageFormat.format(endTemplate, g).toCharArray();
- return true;
} else {
- checkPointScanner.rollbackToCheckPoint();
- return false;
+ b.append((char)c);
}
- } else {
- hasOneMatch = true;
}
+ } else {
+ throw new UnsupportedOperationException();
}
}
+ if( ! rv ) {
+ cs.rollbackToCheckPoint();
+ }
+
return rv;
}
} \ No newline at end of file

Back to the top