package com.google.dart.engine.services.completion; import com.google.dart.engine.ast.SimpleIdentifier; import com.google.dart.engine.element.Element; import com.google.dart.engine.utilities.translation.DartBlockBody; import java.util.Iterator; import java.util.List; import java.util.regex.Pattern; class Filter { String prefix; String originalPrefix; Pattern pattern; Filter(SimpleIdentifier ident, int loc) { this(ident.getName(), ident.getOffset(), loc); } Filter(String name, int pos, int loc) { int len = loc - pos; if (len > 0) { if (len <= name.length()) { prefix = name.substring(0, len); } else { prefix = name; } } else { prefix = ""; } originalPrefix = prefix; prefix = prefix.toLowerCase(); } /** * @return {@code true} if the given name starts with the same prefix as used for filter. */ boolean isSameCasePrefix(String name) { return name.startsWith(originalPrefix); } @DartBlockBody({"// TODO(scheglov) translate it", "return null;"}) String makePattern() { String source = originalPrefix; if (source == null || source.length() < 2) { return "*"; } int index = 0; StringBuffer regex = new StringBuffer(); StringBuffer pattern = new StringBuffer(); regex.append(source.charAt(index)); pattern.append(source.charAt(index++)); while (index < source.length()) { char ch = source.charAt(index++); if (Character.isUpperCase(ch)) { pattern.append('*'); regex.append("\\p{javaLowerCase}*"); } pattern.append(ch); regex.append(ch); } pattern.append('*'); regex.append("\\p{javaLowerCase}*"); String result = pattern.toString(); this.pattern = Pattern.compile(regex.toString(), 0); return result; } boolean match(Element elem) { return match(elem.getDisplayName()); } boolean match(String name) { // Return true if the filter passes. if (name.toLowerCase().startsWith(prefix)) { return true; } return matchPattern(name); } void removeNotMatching(List<Element> elements) { for (Iterator<Element> I = elements.iterator(); I.hasNext();) { Element element = I.next(); if (!match(element)) { I.remove(); } } } @DartBlockBody({"// TODO(scheglov) translate it", "return false;"}) private boolean matchPattern(String name) { return pattern != null && pattern.matcher(name).matches(); } }