diff options
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.java | 25 |
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 { |