summaryrefslogtreecommitdiff
path: root/platform/lang-impl/src/com/intellij/lang/parser/GeneratedParserUtilBase.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/lang-impl/src/com/intellij/lang/parser/GeneratedParserUtilBase.java')
-rw-r--r--platform/lang-impl/src/com/intellij/lang/parser/GeneratedParserUtilBase.java25
1 files changed, 20 insertions, 5 deletions
diff --git a/platform/lang-impl/src/com/intellij/lang/parser/GeneratedParserUtilBase.java b/platform/lang-impl/src/com/intellij/lang/parser/GeneratedParserUtilBase.java
index ecda31db8355..ad322c232fa0 100644
--- a/platform/lang-impl/src/com/intellij/lang/parser/GeneratedParserUtilBase.java
+++ b/platform/lang-impl/src/com/intellij/lang/parser/GeneratedParserUtilBase.java
@@ -2,6 +2,7 @@
// Do not modify or refactor without complete investigation and/or review.
package com.intellij.lang.parser;
+import com.intellij.codeInsight.completion.impl.CamelHumpMatcher;
import com.intellij.lang.*;
import com.intellij.lang.impl.PsiBuilderAdapter;
import com.intellij.lang.impl.PsiBuilderImpl;
@@ -337,18 +338,18 @@ public class GeneratedParserUtilBase {
}
else if (diff > 0 && diff <= length) {
CharSequence fragment = builder_.getOriginalText().subSequence(offset, completionState.offset);
- add = StringUtil.startsWithIgnoreCase(text, fragment.toString());
+ add = completionState.prefixMatches(fragment.toString(), text);
}
else if (diff < 0) {
for (int i=-1; ; i--) {
IElementType type = builder_.rawLookup(i);
int tokenStart = builder_.rawTokenTypeStart(i);
- if (((PsiBuilderImpl)((Builder)builder_).getDelegate()).whitespaceOrComment(type)) {
+ if (isWhitespaceOrComment(builder_, type)) {
diff = completionState.offset - tokenStart;
}
else if (type != null && tokenStart < completionState.offset) {
CharSequence fragment = builder_.getOriginalText().subSequence(tokenStart, completionState.offset);
- if (StringUtil.startsWithIgnoreCase(text, fragment.toString())) {
+ if (completionState.prefixMatches(fragment.toString(), text)) {
diff = completionState.offset - tokenStart;
}
break;
@@ -364,6 +365,10 @@ public class GeneratedParserUtilBase {
}
}
+ public static boolean isWhitespaceOrComment(@NotNull PsiBuilder builder_, @Nullable IElementType type) {
+ return ((PsiBuilderImpl)((Builder)builder_).getDelegate()).whitespaceOrComment(type);
+ }
+
// here's the new section API for compact parsers & less IntelliJ platform API exposure
public static final int _NONE_ = 0x0;
public static final int _COLLAPSE_ = 0x1;
@@ -514,7 +519,9 @@ public class GeneratedParserUtilBase {
}
// propagate errorReportedAt up the stack to avoid duplicate reporting
Frame prevFrame = willFail && eatMore == null ? null : state.frameStack.peekLast();
- if (prevFrame != null && prevFrame.errorReportedAt < frame.errorReportedAt) prevFrame.errorReportedAt = frame.errorReportedAt;
+ if (prevFrame != null && prevFrame.errorReportedAt < frame.errorReportedAt) {
+ prevFrame.errorReportedAt = frame.errorReportedAt;
+ }
state.FRAMES.recycle(frame);
}
@@ -657,9 +664,17 @@ public class GeneratedParserUtilBase {
return o.toString();
}
- public void addItem(PsiBuilder builder, String text) {
+ public void addItem(@NotNull PsiBuilder builder, @NotNull String text) {
items.add(text);
}
+
+ public boolean prefixMatches(@NotNull String prefix, @NotNull String variant) {
+ boolean matches = new CamelHumpMatcher(prefix, false).prefixMatches(variant.replace(' ', '_'));
+ if (matches && StringUtil.isWhiteSpace(prefix.charAt(prefix.length() - 1))) {
+ return StringUtil.startsWithIgnoreCase(variant, prefix);
+ }
+ return matches;
+ }
}
public static class Builder extends PsiBuilderAdapter {